Commit 6bc6ce05 authored by Gregory Dymarek's avatar Gregory Dymarek

Merging with upstream

parents 20096639 332ee70b

Too many changes to show.

To preserve performance only 1000 of 1000+ files are displayed.

......@@ -7,10 +7,10 @@ environment:
matrix:
# - BUILD: 'Debug'
# CONFIG: debug
# SHADOW_BUILD_DIR: $(APPVEYOR_BUILD_FOLDER)\build_windows_debug
# SHADOW_BUILD_DIR: C:\projects\qgroundcontrol\build_windows_debug
- BUILD: 'Release'
CONFIG: installer
SHADOW_BUILD_DIR: $(APPVEYOR_BUILD_FOLDER)\build_windows_install
SHADOW_BUILD_DIR: C:\projects\qgroundcontrol\build_windows_install
install:
- git submodule update --init --recursive
......@@ -25,20 +25,48 @@ install:
Write-Host "Installing..."
cmd /c start /wait $exePath /S
Write-Host "Installed" -ForegroundColor Green
- ps: |
Write-Host "Installing GStreamer..." -ForegroundColor Cyan
$msiPath = "$($env:USERPROFILE)\gstreamer-1.0-x86-1.5.2.msi"
Write-Host "Downloading..."
(New-Object Net.WebClient).DownloadFile('https://s3-us-west-2.amazonaws.com/qgroundcontrol/dependencies/gstreamer-1.0-x86-1.5.2.msi', $msiPath)
Write-Host "Installing..."
cmd /c start /wait msiexec /package $msiPath /passive ADDLOCAL=ALL
Write-Host "Installed" -ForegroundColor Green
- ps: |
Write-Host "Installing GStreamer dev..." -ForegroundColor Cyan
$msiPath = "$($env:USERPROFILE)\gstreamer-1.0-devel-x86-1.5.2.msi"
Write-Host "Downloading..."
(New-Object Net.WebClient).DownloadFile('https://s3-us-west-2.amazonaws.com/qgroundcontrol/dependencies/gstreamer-1.0-devel-x86-1.5.2.msi', $msiPath)
Write-Host "Installing..."
cmd /c start /wait msiexec /package $msiPath /passive ADDLOCAL=ALL
Write-Host "Installed" -ForegroundColor Green
build_script:
- mkdir %SHADOW_BUILD_DIR% && cd %SHADOW_BUILD_DIR% && C:\Qt\5.5\msvc2013\bin\qmake -r CONFIG-=debug_and_release CONFIG+=%CONFIG% CONFIG+=WarningsAsErrorsOn %APPVEYOR_BUILD_FOLDER%\qgroundcontrol.pro
- cd %SHADOW_BUILD_DIR% && jom
- if "%CONFIG%" EQU "installer" ( copy %SHADOW_BUILD_DIR%\release\qgroundcontrol-installer.exe %APPVEYOR_BUILD_FOLDER%\qgroundcontrol-installer.exe )
- if "%CONFIG%" EQU "installer" ( copy %SHADOW_BUILD_DIR%\release\QGroundControl-installer.exe %APPVEYOR_BUILD_FOLDER%\QGroundControl-installer.exe )
# Generate the source server information to embed in the PDB
- '"C:\Program Files (x86)\Windows Kits\8.1\Debuggers\x64\srcsrv\srctool.exe" -r -u "%SHADOW_BUILD_DIR%\release\qgroundcontrol.pdb" | grep qgroundcontrol | grep -v moc_ | grep -v libs\\mavlink | grep -v build_windows_install | python %APPVEYOR_BUILD_FOLDER%\deploy\genPDBsrcsrv.py > %SHADOW_BUILD_DIR%\release\qgroundcontrol.pdb.srcsrv'
# write the source server info
- '"C:\Program Files (x86)\Windows Kits\8.1\Debuggers\x64\srcsrv\pdbstr.exe" -w -i:%SHADOW_BUILD_DIR%\release\qgroundcontrol.pdb.srcsrv -p:%SHADOW_BUILD_DIR%\release\qgroundcontrol.pdb -s:srcsrv'
# build the symbol / PE store
- 'cd %APPVEYOR_BUILD_FOLDER% && "C:\Program Files (x86)\Windows Kits\8.1\Debuggers\x64\symstore.exe" add /compress /s symbols /f %SHADOW_BUILD_DIR%\release\qgroundcontrol.pdb /t qgroundcontrol'
- 'cd %APPVEYOR_BUILD_FOLDER% && "C:\Program Files (x86)\Windows Kits\8.1\Debuggers\x64\symstore.exe" add /compress /s symbols /f %SHADOW_BUILD_DIR%\release\qgroundcontrol.exe /t qgroundcontrol'
- ps: 'cd $env:appveyor_build_folder; .\deploy\lowercaseify_symbolstore.ps1'
test_script:
- if "%CONFIG%" EQU "debug" ( %SHADOW_BUILD_DIR%\debug\qgroundcontrol --unittest )
artifacts:
- path: qgroundcontrol-installer.exe
- path: QGroundControl-installer.exe
name: qgcinstaller
- path: symbols\**\*.*_
name: symbols
deploy:
# deploy continuous builds to s3
- provider: S3
access_key_id:
secure: IGAojLMqokL+76DbdulmWDA3MTsxEBBi3ReVVSqTy9c=
......@@ -46,10 +74,40 @@ deploy:
secure: RiYqaR+3T2PMNz2j5ur8LCA6H/Zfd4jTX33CZE5iBxm+zaz4QLs25p0B7prpaoNN
bucket: qgroundcontrol
set_public: true
folder: $(APPVEYOR_REPO_BRANCH)
folder: builds/$(APPVEYOR_REPO_BRANCH)
artifact: qgcinstaller
on:
CONFIG: installer
# deploy daily build symbols to s3
- provider: S3
access_key_id:
secure: IGAojLMqokL+76DbdulmWDA3MTsxEBBi3ReVVSqTy9c=
secret_access_key:
secure: RiYqaR+3T2PMNz2j5ur8LCA6H/Zfd4jTX33CZE5iBxm+zaz4QLs25p0B7prpaoNN
bucket: qgroundcontrol
set_public: true
folder: cisyms
artifact: symbols
on:
CONFIG: installer
appveyor_repo_tag: false
# deploy release symbols to s3
- provider: S3
access_key_id:
secure: IGAojLMqokL+76DbdulmWDA3MTsxEBBi3ReVVSqTy9c=
secret_access_key:
secure: RiYqaR+3T2PMNz2j5ur8LCA6H/Zfd4jTX33CZE5iBxm+zaz4QLs25p0B7prpaoNN
bucket: qgroundcontrol
set_public: true
folder: releasesyms
artifact: symbols
on:
CONFIG: installer
appveyor_repo_tag: true
# deploy tagged releases to Github releases
- provider: GitHub
auth_token:
secure: dzWLqd0eTKjrAWC5LgqVnwLemmrNdddGA2ZZn/OthAP37mwCLkP2C1zil7ivmEE8
......@@ -59,3 +117,31 @@ deploy:
on:
CONFIG: installer
appveyor_repo_tag: true
# deploy tagged releases to s3 version folder
- provider: S3
access_key_id:
secure: IGAojLMqokL+76DbdulmWDA3MTsxEBBi3ReVVSqTy9c=
secret_access_key:
secure: RiYqaR+3T2PMNz2j5ur8LCA6H/Zfd4jTX33CZE5iBxm+zaz4QLs25p0B7prpaoNN
bucket: qgroundcontrol
set_public: true
folder: $(APPVEYOR_REPO_TAG_NAME)
artifact: qgcinstaller
on:
CONFIG: installer
appveyor_repo_tag: true
# deploy tagged releases to s3 latest folder
- provider: S3
access_key_id:
secure: IGAojLMqokL+76DbdulmWDA3MTsxEBBi3ReVVSqTy9c=
secret_access_key:
secure: RiYqaR+3T2PMNz2j5ur8LCA6H/Zfd4jTX33CZE5iBxm+zaz4QLs25p0B7prpaoNN
bucket: qgroundcontrol
set_public: true
folder: latest
artifact: qgcinstaller
on:
CONFIG: installer
appveyor_repo_tag: true
......@@ -60,6 +60,9 @@ gstreamer-1.0-android*
*.autosave
.settings/
# iOS Generated files
ios/iOSForAppStore-Info.plist
# Generated files
moc_*
ui_*
......
[submodule "libs/mavlink/include/mavlink/v1.0"]
path = libs/mavlink/include/mavlink/v1.0
url = https://github.com/mavlink/c_library.git
url = https://github.com/mavlink/c_library_v1.git
[submodule "src/GPS/Drivers"]
path = src/GPS/Drivers
url = https://github.com/PX4/GpsDrivers.git
[submodule "libs/mavlink/include/mavlink/v2.0"]
path = libs/mavlink/include/mavlink/v2.0
url = git://github.com/mavlink/c_library_v2.git
This diff is collapsed.
configs:
dev:
'qt_deps_tarball': '/vagrant/Qt5.5.1-linux.tar.bz2'
'qt_deps_tarball': 'Qt5.5.1-linux.tar.bz2'
'qt_deps_unpack_parent_dir': '/tmp'
'qt_deps_unpack_dir': '/tmp/Qt'
......@@ -9,6 +9,8 @@ configs:
'qt_deps_plugins_unpack_dir': '/tmp/Qt/5.5/gcc_64/plugins'
'qt_deps_qml_unpack_dir': '/tmp/Qt/5.5/gcc_64/qml'
'project_root_dir': '/vagrant'
'qt_deps_dir': '/vagrant/shadow-build/release/Qt'
'qt_deps_bin_dir': '/vagrant/shadow-build/release/Qt/bin'
'qt_deps_lib_dir': '/vagrant/shadow-build/release/Qt/libs'
......@@ -18,4 +20,4 @@ configs:
'spec': 'linux-g++-64'
'shadow_build_dir': '/vagrant/shadow-build'
'pro': '/vagrant/qgroundcontrol.pro'
'deps_url': 'https://s3-us-west-2.amazonaws.com/qgroundcontrol/dependencies'
'deps_url': 'https://s3-us-west-2.amazonaws.com/qgroundcontrol/dependencies/Qt5.5.1-linux.tar.bz2'
# QGroundControl License
QGroundControl (QGC) is dual-licensed as Apache 2.0 and GPLv3. All contributions have to be made under both licenses (see [CONTRIBUTING](CONTRIBUTING.md)).
## Apache 2.0 License
The [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0) License is a permissive license which allows QGC to be built and used in any environment, including proprietary applications. It allows QGC to be built for mobile app stores. When building with Apache 2.0 a commercial Qt license is required.
## GPL v3 License
The [GPL v3 License](http://www.gnu.org/licenses/gpl-3.0.en.html) is a strong copyleft license. When building QGC under this license the open source version of Qt can be used. Our licensing grants the permission to use a later version of the license, however, contributions have to be made under 3.0.
## Contact
If you have questions regarding the licensing, please contact the maintainer Lorenz Meier, [lm@groundcontrol.org].
/*=====================================================================
QGroundControl Open Source Ground Control Station
(c) 2009 - 2015 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
This file is part of the QGROUNDCONTROL project
QGROUNDCONTROL 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.
QGROUNDCONTROL 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 QGROUNDCONTROL. If not, see <http://www.gnu.org/licenses/>.
======================================================================*/
/****************************************************************************
*
* (c) 2009-2016 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
*
* QGroundControl is licensed according to the terms in the file
* COPYING.md in the root of the source code directory.
*
****************************************************************************/
// This is an example class c++ file which is used to describe the QGroundControl
// coding style. In general almost everything in here has some coding style meaning.
......@@ -33,7 +19,7 @@
#include <math.h>
// Note how the Qt headers and the QGroundControl headers above are kept seperate
// Note how the Qt headers and the QGroundControl headers above are kept separate
Q_LOGGING_CATEGORY(CodingStyleLog, "CodingStyleLog")
......
/*=====================================================================
QGroundControl Open Source Ground Control Station
(c) 2009 - 2015 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
This file is part of the QGROUNDCONTROL project
QGROUNDCONTROL 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.
QGROUNDCONTROL 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 QGROUNDCONTROL. If not, see <http://www.gnu.org/licenses/>.
======================================================================*/
/****************************************************************************
*
* (c) 2009-2016 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
*
* QGroundControl is licensed according to the terms in the file
* COPYING.md in the root of the source code directory.
*
****************************************************************************/
// This is an example class header file which is used to describe the QGroundControl
// coding style. In general almost everything in here has some coding style meaning.
......@@ -38,7 +24,7 @@
#include "Fact.h"
#include "UASInterface.h"
// Note how the Qt headers, System, headers and the QGroundControl headers above are kept in seperate groups
// Note how the Qt headers, System, headers and the QGroundControl headers above are kept in separate groups
// If you are going to use a logging category for a class it should have the same name as the class
// with a suffix of Log.
......
/*=====================================================================
/****************************************************************************
*
* (c) 2009-2016 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
*
* QGroundControl is licensed according to the terms in the file
* COPYING.md in the root of the source code directory.
*
****************************************************************************/
QGroundControl Open Source Ground Control Station
(c) 2009, 2015 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
This file is part of the QGROUNDCONTROL project
QGROUNDCONTROL 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.
QGROUNDCONTROL 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 QGROUNDCONTROL. If not, see <http://www.gnu.org/licenses/>.
======================================================================*/
import QtQuick 2.5
import QtQuick.Controls 1.3
......
......@@ -4,17 +4,7 @@
# Maintainer:
# Lorenz Meier <lm@inf.ethz.ch>
# (c) 2009-2014 QGroundControl Developers
# This file is part of the open groundstation project
# QGroundControl 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.
# QGroundControl 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 QGroundControl. If not, see <http://www.gnu.org/licenses/>.
# License terms set in COPYING.md
# -------------------------------------------------
#
......@@ -31,21 +21,28 @@ linux {
message("Linux build")
CONFIG += LinuxBuild
DEFINES += __STDC_LIMIT_MACROS
linux-clang {
message("Linux clang")
QMAKE_CXXFLAGS += -Qunused-arguments -fcolor-diagnostics
}
linux-clang {
message("Linux clang")
QMAKE_CXXFLAGS += -Qunused-arguments -fcolor-diagnostics
}
} else : linux-rasp-pi2-g++ {
message("Linux R-Pi2 build")
CONFIG += LinuxBuild
DEFINES += __STDC_LIMIT_MACROS __rasp_pi2__
} else : android-g++ {
message("Android build")
CONFIG += AndroidBuild MobileBuild
DEFINES += __android__
DEFINES += __STDC_LIMIT_MACROS
DEFINES += QGC_ENABLE_BLUETOOTH
target.path = $$DESTDIR
equals(ANDROID_TARGET_ARCH, x86) {
CONFIG += Androidx86Build
DEFINES += __androidx86__
DEFINES += QGC_DISABLE_UVC
message("Android x86 build")
} else {
message("Android Arm build")
}
} else {
error("Unsuported Linux toolchain, only GCC 32- or 64-bit is supported")
}
......@@ -64,12 +61,13 @@ linux {
DEFINES += __macos__
CONFIG += x86_64
CONFIG -= x86
equals(QT_MAJOR_VERSION, 5) | greaterThan(QT_MINOR_VERSION, 5) {
QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.7
} else {
QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.6
}
QMAKE_MAC_SDK = macosx10.11
equals(QT_MAJOR_VERSION, 5) | greaterThan(QT_MINOR_VERSION, 5) {
QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.7
} else {
QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.6
}
#-- Not forcing anything. Let qmake find the latest, installed SDK.
#QMAKE_MAC_SDK = macosx10.12
QMAKE_CXXFLAGS += -fvisibility=hidden
} else {
error("Unsupported Mac toolchain, only 64-bit LLVM+clang is supported")
......@@ -81,6 +79,7 @@ equals(QT_MAJOR_VERSION, 5) | greaterThan(QT_MINOR_VERSION, 5) {
message("iOS build")
CONFIG += iOSBuild MobileBuild app_bundle
DEFINES += __ios__
DEFINES += QGC_NO_GOOGLE_MAPS
QMAKE_IOS_DEPLOYMENT_TARGET = 8.0
QMAKE_IOS_TARGETED_DEVICE_FAMILY = 1,2 # Universal
QMAKE_LFLAGS += -Wl,-no_pie
......@@ -88,6 +87,20 @@ equals(QT_MAJOR_VERSION, 5) | greaterThan(QT_MINOR_VERSION, 5) {
error("Unsupported build platform, only Linux, Windows, Android and Mac (Mac OS and iOS) are supported")
}
# Enable ccache where we can
linux|macx|ios {
system(which ccache) {
message("Found ccache, enabling")
!ios {
QMAKE_CXX = ccache $$QMAKE_CXX
QMAKE_CC = ccache $$QMAKE_CC
} else {
QMAKE_CXX = $$PWD/tools/iosccachecc.sh
QMAKE_CC = $$PWD/tools/iosccachecxx.sh
}
}
}
MobileBuild {
DEFINES += __mobile__
}
......@@ -96,27 +109,38 @@ MobileBuild {
exists ($$PWD/.git) {
GIT_DESCRIBE = $$system(git --git-dir $$PWD/.git --work-tree $$PWD describe --always --tags)
GIT_HASH = $$system(git rev-parse HEAD)
GIT_BRANCH = $$system(git --git-dir $$PWD/.git --work-tree $$PWD rev-parse --abbrev-ref HEAD)
GIT_HASH = $$system(git --git-dir $$PWD/.git --work-tree $$PWD rev-parse --short HEAD)
GIT_TIME = $$system(git --git-dir $$PWD/.git --work-tree $$PWD show --oneline --format=\"%ci\" -s HEAD)
# determine if we're on a tag matching vX.Y.Z (stable release)
contains(GIT_DESCRIBE, v[0-9].[0-9].[0-9]) {
# release version "vX.Y.Z"
GIT_VERSION = $${GIT_DESCRIBE}
} else {
# development version "Development branch:sha date"
GIT_VERSION = "Development $${GIT_BRANCH}:$${GIT_HASH} $${GIT_TIME}"
}
VERSION = $$replace(GIT_DESCRIBE, "v", "")
VERSION = $$replace(VERSION, "-", ".")
VERSION = $$section(VERSION, ".", 0, 3)
MacBuild {
MAC_VERSION = $$section(VERSION, ".", 0, 2)
MAC_BUILD = $$section(VERSION, ".", 3, 3)
message(QGroundControl version $${MAC_VERSION} build $${MAC_BUILD} describe $${GIT_DESCRIBE} hash $${GIT_HASH})
message(QGroundControl version $${MAC_VERSION} build $${MAC_BUILD} describe $${GIT_VERSION})
} else {
message(QGroundControl version $${VERSION} describe $${GIT_DESCRIBE} hash $${GIT_HASH})
message(QGroundControl $${GIT_VERSION})
}
} else {
GIT_DESCRIBE = None
GIT_HASH = None
GIT_VERSION = None
VERSION = 0.0.0 # Marker to indicate out-of-tree build
MAC_VERSION = 0.0.0
MAC_BUILD = 0
}
DEFINES += GIT_TAG=\"\\\"$$GIT_DESCRIBE\\\"\"
DEFINES += GIT_HASH=\"\\\"$$GIT_HASH\\\"\"
DEFINES += GIT_VERSION=\"\\\"$$GIT_VERSION\\\"\"
DEFINES += EIGEN_MPL2_ONLY
# Installer configuration
......@@ -178,11 +202,15 @@ MacBuild | LinuxBuild {
}
WindowsBuild {
QMAKE_CFLAGS_RELEASE -= -Zc:strictStrings
QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO -= -Zc:strictStrings
QMAKE_CXXFLAGS_RELEASE -= -Zc:strictStrings
QMAKE_CXXFLAGS_RELEASE_WITH_DEBUGINFO -= -Zc:strictStrings
QMAKE_CXXFLAGS_WARN_ON += /W3 \
/wd4996 \ # silence warnings about deprecated strcpy and whatnot
/wd4005 \ # silence warnings about macro redefinition
/wd4290 \ # ignore exception specifications
/Zc:strictStrings- # work around win 8.1 sdk sapi.h problem
/wd4290 # ignore exception specifications
WarningsAsErrorsOn {
QMAKE_CXXFLAGS_WARN_ON += /WX
}
......@@ -194,14 +222,21 @@ WindowsBuild {
ReleaseBuild {
DEFINES += QT_NO_DEBUG
WindowsBuild {
# Use link time code generation for better optimization (I believe this is supported in MSVC Express, but not 100% sure)
QMAKE_LFLAGS_LTCG = /LTCG
QMAKE_CFLAGS_LTCG = -GL
CONFIG += force_debug_info # Enable debugging symbols on release builds
!iOSBuild {
CONFIG += ltcg # Turn on link time code generation
}
# Turn on debugging information so we can collect good crash dumps from release builds
QMAKE_CXXFLAGS_RELEASE += /Zi
QMAKE_LFLAGS_RELEASE += /DEBUG
WindowsBuild {
# Enable function level linking and enhanced optimized debugging
QMAKE_CFLAGS_RELEASE += /Gy /Zo
QMAKE_CXXFLAGS_RELEASE += /Gy /Zo
QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += /Gy /Zo
QMAKE_CXXFLAGS_RELEASE_WITH_DEBUGINFO += /Gy /Zo
# Eliminate duplicate COMDATs
QMAKE_LFLAGS_RELEASE += /OPT:ICF
QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO += /OPT:ICF
}
}
......
......@@ -9,7 +9,7 @@ WindowsBuild {
# [REQUIRED] Add support for the MAVLink communications protocol.
# Mavlink dialect is hardwired to arudpilotmega for now. The reason being
# the current codebase supports both PX4 and APM flight stack. PX4 flight stack
# only usese common mavlink specifications, wherease APM flight stack uses custom
# only usese common mavlink specifications, whereas APM flight stack uses custom
# mavlink specifications which add to common. So by using the adupilotmega dialect
# QGC can support both in the same codebase.
#
......@@ -17,7 +17,7 @@ WindowsBuild {
# a single compiled codebase this hardwiring of dialect can go away. But until then
# this "workaround" is needed.
MAVLINKPATH_REL = libs/mavlink/include/mavlink/v1.0
MAVLINKPATH_REL = libs/mavlink/include/mavlink/v2.0
MAVLINKPATH = $$BASEDIR/$$MAVLINKPATH_REL
MAVLINK_CONF = ardupilotmega
DEFINES += MAVLINK_NO_DATA
......@@ -169,21 +169,21 @@ contains(DEFINES, DISABLE_RTLAB) {
#
MacBuild {
INCLUDEPATH += \
$$BASEDIR/libs/lib/Frameworks/SDL.framework/Headers
$$BASEDIR/libs/lib/Frameworks/SDL2.framework/Headers
LIBS += \
-F$$BASEDIR/libs/lib/Frameworks \
-framework SDL
-framework SDL2
} else:LinuxBuild {
PKGCONFIG = sdl
PKGCONFIG = sdl2
} else:WindowsBuild {
INCLUDEPATH += \
$$BASEDIR/libs/lib/sdl/msvc/include \
$$BASEDIR/libs/lib/sdl2/msvc/include \
LIBS += \
-L$$BASEDIR/libs/lib/sdl/msvc/lib \
-lSDLmain \
-lSDL
-L$$BASEDIR/libs/lib/sdl2/msvc/lib/x86 \
-lSDL2main \
-lSDL2
}
##
......
......@@ -4,17 +4,7 @@
# Maintainer:
# Lorenz Meier <lm@inf.ethz.ch>
# (c) 2009-2014 QGroundControl Developers
# This file is part of the open groundstation project
# QGroundControl 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.
# QGroundControl 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 QGroundControl. If not, see <http://www.gnu.org/licenses/>.
# License terms set in COPYING.md
# -------------------------------------------------
installer {
......@@ -37,16 +27,16 @@ installer {
# qgroundcontrol.app file. If you specify a path to the .app file the symbolic
# links to plugins will not be created correctly.
QMAKE_POST_LINK += && mkdir -p $${DESTDIR}/package
QMAKE_POST_LINK += && cd $${DESTDIR} && $$dirname(QMAKE_QMAKE)/macdeployqt qgroundcontrol.app -appstore-compliant -verbose=2 -qmldir=$${BASEDIR}/src
QMAKE_POST_LINK += && cd $${DESTDIR} && $$dirname(QMAKE_QMAKE)/macdeployqt QGroundControl.app -appstore-compliant -verbose=2 -qmldir=$${BASEDIR}/src
QMAKE_POST_LINK += && cd $${OUT_PWD}
QMAKE_POST_LINK += && hdiutil create -layout SPUD -srcfolder $${DESTDIR}/qgroundcontrol.app -volname QGroundControl $${DESTDIR}/package/qgroundcontrol.dmg
QMAKE_POST_LINK += && hdiutil create -verbose -stretch 2g -layout SPUD -srcfolder $${DESTDIR}/QGroundControl.app -volname QGroundControl $${DESTDIR}/package/QGroundControl.dmg
}
WindowsBuild {
# The pdb moving command are commented out for now since we are including the .pdb in the installer. This makes it much
# easier to debug user crashes.
#QMAKE_POST_LINK += $$escape_expand(\\n) $$QMAKE_COPY $${DESTDIR_WIN}\\qgroundcontrol.pdb
#QMAKE_POST_LINK += $$escape_expand(\\n) del $${DESTDIR_WIN}\\qgroundcontrol.pdb
QMAKE_POST_LINK += $$escape_expand(\\n) cd $$BASEDIR_WIN && $$quote("\"C:\\Program Files \(x86\)\\NSIS\\makensis.exe\"" /NOCD "\"/XOutFile $${DESTDIR_WIN}\\qgroundcontrol-installer.exe\"" "$$BASEDIR_WIN\\deploy\\qgroundcontrol_installer.nsi")
QMAKE_POST_LINK += $$escape_expand(\\n) cd $$BASEDIR_WIN && $$quote("\"C:\\Program Files \(x86\)\\NSIS\\makensis.exe\"" /NOCD "\"/XOutFile $${DESTDIR_WIN}\\QGroundControl-installer.exe\"" "$$BASEDIR_WIN\\deploy\\qgroundcontrol_installer.nsi")
#QMAKE_POST_LINK += $$escape_expand(\\n) $$QMAKE_COPY qgroundcontrol.pdb $${DESTDIR_WIN}
#QMAKE_POST_LINK += $$escape_expand(\\n) del qgroundcontrol.pdb
OTHER_FILES += deploy/qgroundcontrol_installer.nsi
......@@ -54,13 +44,13 @@ installer {
LinuxBuild {
#-- TODO: This uses hardcoded paths. It should use $${DESTDIR}
QMAKE_POST_LINK += && mkdir -p release/package
QMAKE_POST_LINK += && tar -cjf release/package/qgroundcontrol.tar.bz2 release --exclude='package' --transform 's/release/qgroundcontrol/'
QMAKE_POST_LINK += && tar -cjf release/package/QGroundControl.tar.bz2 release --exclude='package' --transform 's/release/qgroundcontrol/'
}
AndroidBuild {
#-- TODO: This uses hardcoded paths. It should use $${DESTDIR}
QMAKE_POST_LINK += && mkdir -p $${DESTDIR}/package
QMAKE_POST_LINK += && make install INSTALL_ROOT=$${DESTDIR}/android-build/
QMAKE_POST_LINK += && androiddeployqt --input android-libqgroundcontrol.so-deployment-settings.json --output $${DESTDIR}/android-build --deployment bundled --gradle --sign $${BASEDIR}/android/android_release.keystore dagar --storepass $$(ANDROID_STOREPASS)
QMAKE_POST_LINK += && cp $${DESTDIR}/android-build/build/outputs/apk/android-build-release-signed.apk $${DESTDIR}/package/qgroundcontrol.apk
QMAKE_POST_LINK += && androiddeployqt --input android-libQGroundControl.so-deployment-settings.json --output $${DESTDIR}/android-build --deployment bundled --gradle --sign $${BASEDIR}/android/android_release.keystore dagar --storepass $$(ANDROID_STOREPASS)
QMAKE_POST_LINK += && cp $${DESTDIR}/android-build/build/outputs/apk/android-build-release-signed.apk $${DESTDIR}/package/QGroundControl.apk
}
}
......@@ -4,17 +4,7 @@
# Maintainer:
# Lorenz Meier <lm@inf.ethz.ch>
# (c) 2009-2011 QGroundControl Developers
# This file is part of the open groundstation project
# QGroundControl 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.
# QGroundControl 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 QGroundControl. If not, see <http://www.gnu.org/licenses/>.
# License terms set in COPYING.md
# -------------------------------------------------
QMAKE_POST_LINK += echo "Copying files"
......@@ -38,11 +28,11 @@ WindowsBuild {
# Make sure to keep both side of this if using the same set of directories
DESTDIR_COPY_RESOURCE_LIST = $$replace(DESTDIR,"/","\\")
BASEDIR_COPY_RESOURCE_LIST = $$replace(BASEDIR,"/","\\")
QMAKE_POST_LINK += $$escape_expand(\\n) $$QMAKE_COPY_DIR \"$$BASEDIR_COPY_RESOURCE_LIST\\flightgear\" \"$$DESTDIR_COPY_RESOURCE_LIST\\flightgear\"
QMAKE_POST_LINK += $$escape_expand(\\n) $$QMAKE_COPY_DIR \"$$BASEDIR_COPY_RESOURCE_LIST\\resources\\flightgear\" \"$$DESTDIR_COPY_RESOURCE_LIST\\flightgear\"
} else {
!MobileBuild {
# Make sure to keep both sides of this if using the same set of directories
QMAKE_POST_LINK += && $$QMAKE_COPY_DIR $$BASEDIR/flightgear $$DESTDIR_COPY_RESOURCE_LIST
QMAKE_POST_LINK += && $$QMAKE_COPY_DIR $$BASEDIR/resources/flightgear $$DESTDIR_COPY_RESOURCE_LIST
}
}
......@@ -59,8 +49,8 @@ iOSBuild | MacBuild {
MacBuild {
# Copy non-standard frameworks into app package
QMAKE_POST_LINK += && rsync -a --delete $$BASEDIR/libs/lib/Frameworks $$DESTDIR/$${TARGET}.app/Contents/
# SDL Framework
QMAKE_POST_LINK += && install_name_tool -change "@rpath/SDL.framework/Versions/A/SDL" "@executable_path/../Frameworks/SDL.framework/Versions/A/SDL" $$DESTDIR/$${TARGET}.app/Contents/MacOS/$${TARGET}
# SDL2 Framework
QMAKE_POST_LINK += && install_name_tool -change "@rpath/SDL2.framework/Versions/A/SDL2" "@executable_path/../Frameworks/SDL2.framework/Versions/A/SDL2" $$DESTDIR/$${TARGET}.app/Contents/MacOS/$${TARGET}
}
WindowsBuild {
......@@ -72,8 +62,9 @@ WindowsBuild {
DebugBuild: DLL_QT_DEBUGCHAR = "d"
ReleaseBuild: DLL_QT_DEBUGCHAR = ""
COPY_FILE_LIST = \
$$BASEDIR\\libs\\lib\\sdl\\win32\\SDL.dll \
$$BASEDIR\\libs\\thirdParty\\libxbee\\lib\\libxbee.dll
$$BASEDIR\\libs\\lib\\sdl2\\msvc\\lib\\x86\\SDL2.dll \
$$BASEDIR\\libs\\thirdParty\\libxbee\\lib\\libxbee.dll \
$$BASEDIR\\deploy\\libeay32.dll
for(COPY_FILE, COPY_FILE_LIST) {
QMAKE_POST_LINK += $$escape_expand(\\n) $$QMAKE_COPY \"$$COPY_FILE\" \"$$DESTDIR_WIN\"
......@@ -114,6 +105,8 @@ LinuxBuild {
libQt5DBus.so.5 \
libQt5Gui.so.5 \
libQt5Location.so.5 \
libQt5Multimedia.so.5 \
libQt5MultimediaQuick_p.so.5 \
libQt5Network.so.5 \
libQt5OpenGL.so.5 \
libQt5Positioning.so.5 \
......@@ -164,6 +157,8 @@ LinuxBuild {
# QGroundControl start script
QMAKE_POST_LINK += && $$QMAKE_COPY $$BASEDIR/deploy/qgroundcontrol-start.sh $$DESTDIR
QMAKE_POST_LINK += && $$QMAKE_COPY $$BASEDIR/deploy/qgroundcontrol.desktop $$DESTDIR
QMAKE_POST_LINK += && $$QMAKE_COPY $$BASEDIR/resources/icons/qgroundcontrol.png $$DESTDIR
}
}
# QGroundControl
# QGroundControl Ground Control Station
## Open Source Micro Air Vehicle Ground Control Station
[![Releases](https://img.shields.io/github/release/mavlink/QGroundControl.svg)](https://github.com/mavlink/QGroundControl/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)
[![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/mavlink/qgroundcontrol?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
The license terms are set in the COPYING.md file.
* Project:
<http://qgroundcontrol.org>
......@@ -24,52 +26,68 @@ git clone --recursive https://github.com/mavlink/qgroundcontrol.git
```
Each time you pull new source to your repository you should run `git submodule update` to get the latest submodules as well. Since QGroundControl uses submodules, using the zip file for source download will not work. You must use git.
### User Manual
https://donlakeflyer.gitbooks.io/qgroundcontrol-user-guide/content/
### Supported Builds
#### Native Builds
QGroundControl builds are supported for OSX, Linux, Windows and Android. QGroundControl uses [Qt](http://www.qt.io) as it's cross-platform support library and uses [QtCreator](http://doc.qt.io/qtcreator/index.html) as it's default build environment.
* OSX: OSX 10.7 or higher, 64 bit, clang compiler
QGroundControl builds are supported for OSX, Linux, Windows, iOS and Android. QGroundControl uses [Qt](http://www.qt.io) as its cross-platform support library and uses [QtCreator](http://doc.qt.io/qtcreator/index.html) as its default build environment.
* OSX: OSX 10.7 or higher, 64 bit, clang compiler (IMPORTANT: XCode 8 not supported due to Qt bug. Currently only workaround is to use XCode 7.3.1)
* Ubuntu: 64 bit, gcc compiler
* Windows: Vista or higher, 32 bit, [Visual Studio 2013 compiler](http://www.visualstudio.com/downloads/download-visual-studio-vs#d-express-windows-desktop)
* iOS: 8.0 and higher
* Android: Jelly Bean (4.1) and higher
* Qt version: 5.5.1 (or higher)
* Qt version: 5.5.1 ONLY
###### Install QT
You need to install Qt like this instead of using packages from say a Linux distribution because QGroundControl needs access to private Qt headers.
You need to install Qt as described below instead of using pre-built packages from say, a Linux distribution because QGroundControl needs access to private Qt headers.
* Download the [Qt installer](http://www.qt.io/download-open-source)
* Make sure to install Qt version **5.5.1** NOT 5.4.x, 5.6.x, 5.7.x, etc.
* Ubuntu: Set the downloaded file to executable using:`chmod +x`. Install to default location for use with ./qgroundcontrol-start.sh. If you install Qt to a non-default location you will need to modify qgroundcontrol-start.sh in order to run downloaded builds.
* Windows: Default installer not quite correct, use [this](http://download.qt.io/official_releases/qt/5.5/5.5.1/qt-opensource-windows-x86-msvc2013-5.5.1.exe) instead
###### Install additional packages:
* Ubuntu: sudo apt-get install espeak libespeak-dev libudev-dev libsdl1.2-dev
* Fedora: sudo dnf install espeak espeak-devel SDL-devel SDL-static systemd-devel
* Ubuntu: sudo apt-get install espeak libespeak-dev libudev-dev libsdl2-dev
* Fedora: sudo dnf install espeak espeak-devel SDL2-devel SDL2 systemd-devel
* Arch Linux: pacman -Sy espeak
* Windows: [USB Driver](http://www.pixhawk.org/firmware/downloads) to connect to Pixhawk/PX4Flow/3DR Radio
* Android: [Qt Android Setup](http://doc.qt.io/qt-5/androidgs.html)
###### Building using Qt Creator
* Launch Qt Creator and open the `qgroundcontrol.pro` project.
* Select the appropriate kit for your needs:
* OSX: Desktop Qt 5.5.1 clang 64 bit
* Ubuntu: Desktop Qt 5.5.1 GCC bit
* Windows: Desktop Qt 5.5.1 MSVC2013 32bit
* Android: Android for armeabi-v7a (GCC 4.9, Qt 5.5.1)
* Note: iOS builds must be built using xCode: http://doc.qt.io/qt-5/ios-support.html. Use Qt Creator to generate the XCode project (*Run Qmake* from the context menu).
###### Special case for Xcode 8 and Qt 5.5.1
Xcode 8 broke the Qt 5.5.1 build system (qmake). As this is the version of Qt we're using for the moment, you will need to patch your Qt installation to make the build work. This is for both Mac OS X and iOS.
Under the tools directory, you will find a script used by the CI build to patch Qt (`patch_qt_for_xcode8.sh`). You can use this script as a starting point. You will need to edit a few variables it expects to run:
```
IOSDIR=/<your_qt_path>/Qt/5.5/ios
OSXDIR=/<your_qt_path>/Qt/5.5/clang_64
TRAVIS_BUILD_DIR=/<your_github_repo>/qgroundcontrol
```
#### Vagrant
A Vagrantfile is provided to build QGroundControl using the [Vagrant](https://www.vagrantup.com/) system. This will produce a native Linux build which can be run in the Vagrant Virtual Machine or on the host machine if it is compatible.
A Vagrantfile is provided to build QGroundControl using the [Vagrant](https://www.vagrantup.com/) system. This will produce a native Linux build which can be run in the Vagrant Virtual Machine or on the host machine if it is compatible.
* [Download](https://www.vagrantup.com/downloads.html) Vagrant
* [Install](https://www.vagrantup.com/docs/getting-started/) Vagrant
* From the root directory of the QGroundControl repository run "vagrant up"
#### Additional build notes for all supported OS
* Warnings as Errors: Specifying `CONFIG+=WarningsAsErrorsOn` will turn all warnings into errors which break the build. If you are working on a pull request you plan to submit to github for consideration, you should always run with this settings turned on, since it is required for all pull requests. NOTE: Putting this line into a file called "user_config.pri" in the top-level directory will set this flag on all builds without interfering with the GIT history.
* Parallel builds: You can use the '-j#' option to run parellel builds.
* Warnings as Errors: Specifying `CONFIG+=WarningsAsErrorsOn` will turn all warnings into errors which breaks the build. If you are working on a pull request you plan to submit to github for consideration, you should always run with this setting turned on, since it is required for all pull requests. NOTE: Putting this line into a file called "user_config.pri" in the top-level directory (same directory as `qgroundcontrol.pro`) will set this flag on all builds without interfering with the GIT history.
* Parallel builds: For non Windows builds, you can use the '-j#' option to run parellel builds.
* Location of built files: Individual build file results can be found in the `build_debug` or `build_release` directories. The built executable can be found in the `debug` or `release` directory.
* If you get this error when running qgroundcontrol: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version 'GLIBCXX_3.4.20' not found. You need to either update to the latest gcc, or install the latest libstdc++.6 using: sudo apt-get install libstdc++6.
......@@ -83,3 +101,6 @@ Integration with Opal-RT's RT-LAB simulator can be enabled on Windows by install
QGroundControl can talk to XBee wireless devices using their proprietary protocol directly on Windows and Linux platforms. This support is not necessary if you're not using XBee devices or aren't using their proprietary protocol. On Windows, the necessary dependencies are included in this repository and no additional steps are required. For Linux, change to the `libs/thirdParty/libxbee` folder and run `make;sudo make install` to install libxbee on your system (uninstalling can be done with a `sudo make uninstall`). `qmake` will automatically detect the library on Linux, so no other work is necessary.
To disable XBee support you may add `DEFINES+=DISABLE_XBEE` to qmake.
### Video Streaming
Check the [Video Streaming](https://github.com/mavlink/qgroundcontrol/tree/master/src/VideoStreaming) directory for further instructions.
<RCC>
<qresource prefix="/json/unittest">
<file alias="MavCmdInfoCommon.json">src/MissionManager/UnitTest/MavCmdInfoCommon.json</file>
<file alias="MavCmdInfoFixedWing.json">src/MissionManager/UnitTest/MavCmdInfoFixedWing.json</file>
<file alias="MavCmdInfoMultiRotor.json">src/MissionManager/UnitTest/MavCmdInfoMultiRotor.json</file>
<file alias="MavCmdInfoRover.json">src/MissionManager/UnitTest/MavCmdInfoRover.json</file>
<file alias="MavCmdInfoSub.json">src/MissionManager/UnitTest/MavCmdInfoSub.json</file>
<file alias="MavCmdInfoVTOL.json">src/MissionManager/UnitTest/MavCmdInfoVTOL.json</file>
</qresource>
</RCC>
# -*- 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__))
......@@ -17,21 +19,25 @@ Vagrant.configure(2) do |config|
# the "dev configuration puts the build products and a suitable
# environment into the /vagrant directory. This allows you to run
# qgroundcontrol on the host machine with:
# "cd shadow-build/release; ../../deploy/qgroundcontrol-start.sh"
# "cd shadow-build/release; ./qgroundcontrol-start.sh"
$config_shell = <<-'SHELL'
sudo apt-get update -y
sudo apt-get dist-upgrade -y
sudo apt-get install -y git build-essential
sudo apt-get install -y espeak libespeak-dev libudev-dev libsdl1.2-dev
sudo apt-get install -y doxygen
sudo apt-get install -y doxygen
sudo apt-get install -y gstreamer1.0* libgstreamer1.0*
# taken from travis.yml
su - vagrant -c 'wget --continue -q %{deps_url}/%{qt_deps_tarball}'
echo 'Initialising submodules'
su - vagrant -c 'cd %{project_root_dir}; git submodule init && git submodule update'
echo 'Saving %{qt_deps_tarball} from %{deps_url} to %{project_root_dir}'
su - vagrant -c 'wget --continue -q %{deps_url} -P %{project_root_dir}'
su - vagrant -c 'rm -rf %{qt_deps_unpack_dir}'
su - vagrant -c 'mkdir -p %{qt_deps_unpack_parent_dir}'
su - vagrant -c 'tar jxf "%{qt_deps_tarball}" -C %{qt_deps_unpack_parent_dir}'
su - vagrant -c 'cd %{project_root_dir}; tar jxf "%{qt_deps_tarball}" -C %{qt_deps_unpack_parent_dir}'
su - vagrant -c 'rm -rf %{shadow_build_dir}'
su - vagrant -c 'mkdir -p %{shadow_build_dir}'
su - vagrant -c "cd %{shadow_build_dir}; LD_LIBRARY_PATH=%{qt_deps_lib_unpack_dir} PATH=%{qt_deps_bin_unpack_dir}:\$PATH qmake -r %{pro} -spec %{spec}"
......@@ -52,6 +58,7 @@ Vagrant.configure(2) do |config|
:spec => yaml_config['spec'],
:deps_url => yaml_config['deps_url'],
:project_root_dir => yaml_config['project_root_dir'],
:qt_deps_unpack_parent_dir => yaml_config['qt_deps_unpack_parent_dir'],
:qt_deps_unpack_dir => yaml_config['qt_deps_unpack_dir'],
:qt_deps_bin_unpack_dir => yaml_config['qt_deps_bin_unpack_dir'],
......
<?xml version="1.0"?>
<manifest package="org.mavlink.qgroundcontrol" xmlns:android="http://schemas.android.com/apk/res/android" android:versionName="2.9.4-184-gda30c6b" android:versionCode="2506" android:installLocation="auto">
<manifest package="org.mavlink.qgroundcontrol" xmlns:android="http://schemas.android.com/apk/res/android" android:versionName="3.0.0-243-gd759437" android:versionCode="300243" android:installLocation="auto">
<application android:hardwareAccelerated="true" android:name="org.qtproject.qt5.android.bindings.QtApplication" android:label="-- %%INSERT_APP_NAME%% --" android:icon="@drawable/icon">
<activity android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|locale|fontScale|keyboard|keyboardHidden|navigation" android:name="org.qgroundcontrol.qgchelper.UsbDeviceJNI" android:label="-- %%INSERT_APP_NAME%% --" android:screenOrientation="sensorLandscape" android:launchMode="singleTask" android:keepScreenOn="true">
<intent-filter>
......
android/res/drawable-hdpi/icon.png

20.5 KB | W: | H:

android/res/drawable-hdpi/icon.png

21.6 KB | W: | H:

android/res/drawable-hdpi/icon.png
android/res/drawable-hdpi/icon.png
android/res/drawable-hdpi/icon.png
android/res/drawable-hdpi/icon.png
  • 2-up
  • Swipe
  • Onion skin
android/res/drawable-ldpi/icon.png

19.2 KB | W: | H:

android/res/drawable-ldpi/icon.png

20 KB | W: | H:

android/res/drawable-ldpi/icon.png
android/res/drawable-ldpi/icon.png
android/res/drawable-ldpi/icon.png
android/res/drawable-ldpi/icon.png
  • 2-up
  • Swipe
  • Onion skin
android/res/drawable-mdpi/icon.png

19.2 KB | W: | H:

android/res/drawable-mdpi/icon.png

20 KB | W: | H:

android/res/drawable-mdpi/icon.png
android/res/drawable-mdpi/icon.png
android/res/drawable-mdpi/icon.png
android/res/drawable-mdpi/icon.png
  • 2-up
  • Swipe
  • Onion skin
android/res/drawable-xhdpi/icon.png

22 KB | W: | H:

android/res/drawable-xhdpi/icon.png

23.3 KB | W: | H:

android/res/drawable-xhdpi/icon.png
android/res/drawable-xhdpi/icon.png
android/res/drawable-xhdpi/icon.png
android/res/drawable-xhdpi/icon.png
  • 2-up
  • Swipe
  • Onion skin
android/res/drawable-xxhdpi/icon.png

25.2 KB | W: | H:

android/res/drawable-xxhdpi/icon.png

27 KB | W: | H:

android/res/drawable-xxhdpi/icon.png
android/res/drawable-xxhdpi/icon.png
android/res/drawable-xxhdpi/icon.png
android/res/drawable-xxhdpi/icon.png
  • 2-up
  • Swipe
  • Onion skin
......@@ -47,31 +47,75 @@ public class CdcAcmSerialDriver extends CommonUsbSerialDriver {
@Override
public void open() throws IOException {
Log.d(TAG, "claiming interfaces, count=" + mDevice.getInterfaceCount());
Log.d(TAG, "device " + mDevice);
mControlInterface = null;
mDataInterface = null;
mWriteEndpoint = null;
mReadEndpoint = null;
// locate all needed interfaces
for(int i = 0; i < mDevice.getInterfaceCount();i++){
UsbInterface iface = mDevice.getInterface(i);
switch(iface.getInterfaceClass()){
case UsbConstants.USB_CLASS_COMM:
mControlInterface = iface;
Log.d(TAG, "control iface=" + iface);
break;
case UsbConstants.USB_CLASS_CDC_DATA:
mDataInterface = iface;
Log.d(TAG, "data iface=" + iface);
break;
default:
Log.d(TAG, "skipping iface=" + iface);
break;
}
}
Log.d(TAG, "Claiming control interface.");
mControlInterface = mDevice.getInterface(0);
Log.d(TAG, "Control iface=" + mControlInterface);
// class should be USB_CLASS_COMM
// failback to the old way
if(mControlInterface == null) {
mControlInterface = mDevice.getInterface(0);
Log.d(TAG, "Failback: Control iface=" + mControlInterface);
}
if (!mConnection.claimInterface(mControlInterface, true)) {
throw new IOException("Could not claim control interface.");
}
mControlEndpoint = mControlInterface.getEndpoint(0);
Log.d(TAG, "Control endpoint direction: " + mControlEndpoint.getDirection());
Log.d(TAG, "Control endpoint: " + mControlEndpoint);
Log.d(TAG, "Claiming data interface.");
mDataInterface = mDevice.getInterface(1);
Log.d(TAG, "data iface=" + mDataInterface);
// class should be USB_CLASS_CDC_DATA
if(mDataInterface == null) {
mDataInterface = mDevice.getInterface(1);
Log.d(TAG, "Failback: data iface=" + mDataInterface);
}
if (!mConnection.claimInterface(mDataInterface, true)) {
throw new IOException("Could not claim data interface.");
}
mReadEndpoint = mDataInterface.getEndpoint(1);
Log.d(TAG, "Read endpoint direction: " + mReadEndpoint.getDirection());
mWriteEndpoint = mDataInterface.getEndpoint(0);
Log.d(TAG, "Write endpoint direction: " + mWriteEndpoint.getDirection());
for(int i = 0; i < mDataInterface.getEndpointCount(); i++) {
UsbEndpoint endpoint = mDataInterface.getEndpoint(i);
switch (endpoint.getDirection()) {
case UsbConstants.USB_DIR_OUT:
mWriteEndpoint = endpoint;
Log.d(TAG, "Write endpoint: " + mWriteEndpoint);
break;
case UsbConstants.USB_DIR_IN:
mReadEndpoint = endpoint;
Log.d(TAG, "Read endpoint: " + mReadEndpoint);
break;
}
}
if(mReadEndpoint == null || mWriteEndpoint == null){
// failback to the old method
mReadEndpoint = mDataInterface.getEndpoint(0);
Log.d(TAG, "Read endpoint direction: " + mReadEndpoint.getDirection());
mWriteEndpoint = mDataInterface.getEndpoint(1);
Log.d(TAG, "Write endpoint direction: " + mWriteEndpoint.getDirection());
}
}
private int sendAcmControlMessage(int request, int value, byte[] buf) {
......@@ -253,6 +297,13 @@ public class CdcAcmSerialDriver extends CommonUsbSerialDriver {
UsbId.DEVICE_UBLOX_7,
UsbId.DEVICE_UBLOX_8,
});
supportedDevices.put(Integer.valueOf(UsbId.VENDOR_OPENPILOT),
new int[] {
UsbId.DEVICE_CC3D,
UsbId.DEVICE_REVOLUTION,
UsbId.DEVICE_SPARKY2,
UsbId.DEVICE_OPLINK,
});
return supportedDevices;
}
......
......@@ -217,7 +217,7 @@ public class ProlificSerialDriver extends CommonUsbSerialDriver {
}
}
/* throw and clear an exception which occured in the status read thread */
/* throw and clear an exception which occurred in the status read thread */
IOException readStatusException = mReadStatusException;
if (mReadStatusException != null) {
mReadStatusException = null;
......@@ -288,7 +288,7 @@ public class ProlificSerialDriver extends CommonUsbSerialDriver {
+ "available! Assuming that it is a HX device");
mDeviceType = DEVICE_TYPE_HX;
} catch (Exception e) {
Log.e(TAG, "An unexpected exception occured while trying "
Log.e(TAG, "An unexpected exception occurred while trying "
+ "to detect PL2303 subtype", e);
}
}
......@@ -318,7 +318,7 @@ public class ProlificSerialDriver extends CommonUsbSerialDriver {
try {
mReadStatusThread.join();
} catch (Exception e) {
Log.w(TAG, "An error occured while waiting for status read thread", e);
Log.w(TAG, "An error occurred while waiting for status read thread", e);
}
}
}
......
......@@ -68,6 +68,12 @@ public final class UsbId {
public static final int DEVICE_UBLOX_7 = 0x01a7;
public static final int DEVICE_UBLOX_8 = 0x01a8;
public static final int VENDOR_OPENPILOT = 0x20A0;
public static final int DEVICE_REVOLUTION = 0x415E;
public static final int DEVICE_OPLINK = 0x415C;
public static final int DEVICE_SPARKY2 = 0x41D0;
public static final int DEVICE_CC3D = 0x415D;
private UsbId() {
throw new IllegalAccessError("Non-instantiable class.");
}
......
......@@ -347,7 +347,7 @@ public class UsbDeviceJNI extends QtActivity implements TextToSpeech.OnInitListe
Log.e(TAG, "UsbIoManager instance is null");
m_ioManager.put(idL, managerL);
m_Executor.submit(managerL);
Log.i(TAG, "Port open successfull");
Log.i(TAG, "Port open successful");
return idL;
}
}
......
......@@ -25,5 +25,5 @@ export ANDROID_NDK_TOOLS_PREFIX=arm-linux-androideabi
# cd android_build
# >~/local/Qt/5.4/android_armv7/bin/qmake -r -spec android-g++ CONFIG+=debug ../qgroundcontrol/qgroundcontrol.pro
# >make -j24 install INSTALL_ROOT=./android-build/
# >~/local/Qt/5.4/android_armv7/bin/androiddeployqt --input ./android-libqgroundcontrol.so-deployment-settings.json --output ./android-build --deployment bundled --android-platform android-22 --jdk /System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home --verbose --ant /usr/local/bin/ant
# >~/local/Qt/5.4/android_armv7/bin/androiddeployqt --input ./android-libQGroundControl.so-deployment-settings.json --output ./android-build --deployment bundled --android-platform android-22 --jdk /System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home --verbose --ant /usr/local/bin/ant
#
#!/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=/Applications/Qt/5.5/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/qgroundcontrol
#-- 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
#-- 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
qgroundcontrol (2.4-0ubuntu1) trusty; urgency=low
* Initial release (Closes: #nnnn) <nnnn is the bug number of your ITP>
-- Daniel Agar <daniel@agar.ca> Sat, 04 Apr 2015 17:14:10 -0400
......@@ -2,14 +2,12 @@ Source: qgroundcontrol
Section: electronics
Priority: optional
Maintainer: Daniel Agar <daniel@agar.ca>
Build-Depends: debhelper (>= 9), qt54tools, qt54base, qt54declarative, qt54serialport, qt54svg, qt54webkit, qt54quickcontrols, qt54xmlpatterns, qt54x11extras, qt54websockets, qt54sensors, qt54script, qt54quick1, qt54qbs, qt54multimedia, qt54location, qt54imageformats, qt54graphicaleffects, qt54creator, qt54connectivity, libsdl1.2-dev, libudev-dev
Build-Depends: debhelper (>= 9), qt55tools, qt55base, qt55declarative, qt55serialport, qt55svg, qt55webkit, qt55quickcontrols, qt55xmlpatterns, qt55x11extras, qt55websockets, qt55sensors, qt55script, qt55quick1, qt55qbs, qt55multimedia, qt55location, qt55imageformats, qt55graphicaleffects, qt55creator, qt55connectivity, espeak, libespeak-dev, libudev-dev, libsdl1.2-dev
Standards-Version: 3.9.5
Homepage: https://github.com/mavlink/qgroundcontrol
Vcs-Git: git://github.com/mavlink/qgroundcontrol.git
#Vcs-Browser: http://git.debian.org/?p=collab-maint/qgroundcontrol.git;a=summary
Package: qgroundcontrol
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}, qt54tools, qt54base, qt54declarative, qt54serialport, qt54svg, qt54webkit, qt54quickcontrols, qt54xmlpatterns, qt54x11extras, qt54websockets, qt54sensors, qt54script, qt54quick1, qt54multimedia, qt54location, qt54imageformats, qt54graphicaleffects, qt54connectivity
Depends: ${shlibs:Depends}, ${misc:Depends}, espeak, libsdl1.2debian
Description: Open Source Micro Air Vehicle Ground Control Station
<insert long description, indented with spaces>
......@@ -9,4 +9,4 @@ export DH_VERBOSE=1
dh $@
override_dh_auto_configure:
/opt/qt54/bin/qmake qgroundcontrol.pro
/opt/qt55/bin/qmake -r qgroundcontrol.pro CONFIG+=installer CONFIG+=WarningsAsErrorsOn
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -2,28 +2,66 @@
set +e
if [[ $# -eq 0 ]]; then
echo 'create_linux_appimage.sh QGC_SRC_DIR QGC_RELEASE_DIR'
exit 1
fi
QGC_SRC=$1
if [ ! -f ${QGC_SRC}/qgroundcontrol.pro ]; then
echo 'please specify path to qgroundcontrol source as the 1st argument'
exit 1
fi
QGC_RELEASE_DIR=$2
if [ ! -f ${QGC_RELEASE_DIR}/QGroundControl ]; then
echo 'please specify path to QGroundControl release as the 2nd argument'
exit 1
fi
OUTPUT_DIR=${3-`pwd`}
echo "Output directory:" ${OUTPUT_DIR}
# Generate AppImage using the binaries currently provided by the project.
# These require at least GLIBC 2.14, which older distributions might not have.
# On the other hand, 2.14 is not that recent so maybe we can just live with it.
APP=qgroundcontrol
mkdir -p /tmp/$APP/$APP.AppDir
cd /tmp/$APP/
tar xf ${SHADOW_BUILD_DIR}/release/package/qgroundcontrol.tar.bz2
APP=QGroundControl
wget -c http://ftp.us.debian.org/debian/pool/main/u/udev/udev_175-7.2_amd64.deb
wget -c http://ftp.us.debian.org/debian/pool/main/e/espeak/espeak_1.46.02-2_amd64.deb
wget -c http://ftp.us.debian.org/debian/pool/main/libs/libsdl1.2/libsdl1.2debian_1.2.15-5_amd64.deb
TMPDIR=`mktemp -d`
APPDIR=${TMPDIR}/$APP".AppDir"
mkdir -p ${APPDIR}
cd $APP.AppDir/
cd ${TMPDIR}
wget -c --quiet http://ftp.us.debian.org/debian/pool/main/u/udev/udev_175-7.2_amd64.deb
wget -c --quiet http://ftp.us.debian.org/debian/pool/main/e/espeak/espeak_1.46.02-2_amd64.deb
wget -c --quiet http://ftp.us.debian.org/debian/pool/main/libs/libsdl1.2/libsdl1.2debian_1.2.15-5_amd64.deb
mv ../qgroundcontrol/* .
mv qgroundcontrol-start.sh AppRun
cd ${APPDIR}
find ../ -name *.deb -exec dpkg -x {} . \;
# Get icon
cp ${TRAVIS_BUILD_DIR}/resources/icons/qgroundcontrol.png .
# copy libdirectfb-1.2.so.9
cd ${TMPDIR}
wget -c --quiet http://ftp.us.debian.org/debian/pool/main/d/directfb/libdirectfb-1.2-9_1.2.10.0-5.1_amd64.deb
mkdir libdirectfb
dpkg -x libdirectfb-1.2-9_1.2.10.0-5.1_amd64.deb libdirectfb
cp -L libdirectfb/usr/lib/x86_64-linux-gnu/libdirectfb-1.2.so.9 ${APPDIR}/usr/lib/x86_64-linux-gnu/
cp -L libdirectfb/usr/lib/x86_64-linux-gnu/libfusion-1.2.so.9 ${APPDIR}/usr/lib/x86_64-linux-gnu/
cp -L libdirectfb/usr/lib/x86_64-linux-gnu/libdirect-1.2.so.9 ${APPDIR}/usr/lib/x86_64-linux-gnu/
# copy libts-0.0-0
wget -c --quiet http://ftp.us.debian.org/debian/pool/main/t/tslib/libts-0.0-0_1.0-11_amd64.deb
mkdir libts
dpkg -x libts-0.0-0_1.0-11_amd64.deb libts
cp -L libts/usr/lib/x86_64-linux-gnu/libts-0.0.so.0 ${APPDIR}/usr/lib/x86_64-linux-gnu/
# copy QGroundControl release into appimage
cp -r ${QGC_RELEASE_DIR}/* ${APPDIR}/
rm -rf ${APPDIR}/package
mv ${APPDIR}/qgroundcontrol-start.sh ${APPDIR}/AppRun
# copy icon
cp ${QGC_SRC}/resources/icons/qgroundcontrol.png ${APPDIR}/
cat > ./qgroundcontrol.desktop <<\EOF
[Desktop Entry]
......@@ -31,24 +69,22 @@ Type=Application
Name=QGroundControl
GenericName=Ground Control Station
Comment=UAS ground control station
Icon=qgroundcontrol.png
Icon=qgroundcontrol
Exec=AppRun
Terminal=false
Categories=Utility;
Keywords=computer;
EOF
VERSION=$(strings qgroundcontrol | grep v[0-9*]\.[0-9*]\.[0-9*]-[0-9*] | head -n 1)
VERSION=$(strings ${APPDIR}/qgroundcontrol | grep '^v[0-9*]\.[0-9*].[0-9*]' | head -n 1)
echo QGC Version: ${VERSION}
# Go out of AppImage
cd ..
wget -c "https://github.com/probonopd/AppImageKit/releases/download/5/AppImageAssistant" # (64-bit)
cd ${TMPDIR}
wget -c --quiet "https://github.com/probonopd/AppImageKit/releases/download/5/AppImageAssistant" # (64-bit)
chmod a+x ./AppImageAssistant
mkdir -p ../out
rm ../out/$APP".AppImage" || true
./AppImageAssistant ./$APP.AppDir/ ../out/$APP".AppImage"
# s3 deploys everything in release/package
cp ../out/$APP".AppImage" ${SHADOW_BUILD_DIR}/release/package/$APP".AppImage"
./AppImageAssistant ./$APP.AppDir/ ${TMPDIR}/$APP".AppImage"
cp ${TMPDIR}/$APP".AppImage" ${OUTPUT_DIR}/$APP".AppImage"
import fileinput
import sys
import os
import glob
def get_actual_filename(name):
dirs = name.split('\\')
# disk letter
test_name = [dirs[0].upper()]
for d in dirs[1:]:
test_name += ["%s[%s]" % (d[:-1], d[-1])]
res = glob.glob('\\'.join(test_name))
if not res:
#File not found
return None
return res[0]
filelist = [get_actual_filename(x.rstrip()) for x in fileinput.input(['-'])]
prefix_len = len(os.path.commonprefix(filelist))
print("""SRCSRV: ini ------------------------------------------------
VERSION=2
SRCSRV: variables ------------------------------------------
SRCSRVVERCTRL=https
SRCSRVTRG=https://raw.github.com/mavlink/qgroundcontrol/%s/%%var2%%
SRCSRV: source files ---------------------------------------""" % os.environ['APPVEYOR_REPO_COMMIT'])
for line in filelist:
if line is not None:
print('%s*%s' % (line, line[prefix_len:].replace('\\','/')))
print("SRCSRV: end ------------------------------------------------")
\ No newline at end of file
Add-Type -TypeDefinition @'
using System;
using System.Runtime.InteropServices;
public class NativeMethods
{
[DllImport("kernel32.dll", EntryPoint="MoveFileW", SetLastError=true,
CharSet=CharSet.Unicode, ExactSpelling=true,
CallingConvention=CallingConvention.StdCall)]
public static extern bool MoveFile(string lpExistingFileName, string lpNewFileName);
}
'@
Get-ChildItem ".\symbols" -recurse | ForEach-Object {[NativeMethods]::MoveFile($_.FullName,[io.path]::combine((Split-Path $_.FullName -Parent),$_.Name.ToLower()))}
\ No newline at end of file
......@@ -3,4 +3,8 @@ HERE="$(dirname "$(readlink -f "${0}")")"
export LD_LIBRARY_PATH="${HERE}/usr/lib/x86_64-linux-gnu":"${HERE}/Qt/libs":$LD_LIBRARY_PATH
export QML2_IMPORT_PATH="${HERE}/Qt/qml"
export QT_PLUGIN_PATH="${HERE}/Qt/plugins"
"${HERE}/qgroundcontrol" "$@"
# hack until icon issue with AppImage is resolved
mkdir -p ~/.icons && cp ${HERE}/qgroundcontrol.png ~/.icons
"${HERE}/QGroundControl" "$@"
[Desktop Entry]
Type=Application
Name=qgroundcontrol
Name=QGroundControl
GenericName=Ground Control Station
Comment=UAS ground control station
Icon=qgroundcontrol
Exec=qgroundcontrol
Exec=qgroundcontrol-start.sh
Terminal=false
Categories=Utility;
Keywords=computer;
......@@ -44,7 +44,6 @@ InstallDir $PROGRAMFILES\qgroundcontrol
!define MUI_HEADERIMAGE
!define MUI_HEADERIMAGE_BITMAP "installheader.bmp";
!insertmacro MUI_PAGE_LICENSE "license.txt"
!insertmacro MUI_PAGE_STARTMENU Application $StartMenuFolder
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
......@@ -67,7 +66,7 @@ Section
doinstall:
SetOutPath $INSTDIR
File /r build_windows_install\release\*.*
File /r /x qgroundcontrol.pdb /x qgroundcontrol.lib /x qgroundcontrol.exp build_windows_install\release\*.*
File deploy\px4driver.msi
WriteUninstaller $INSTDIR\QGroundControl_uninstall.exe
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\QGroundControl" "DisplayName" "QGroundControl"
......
......@@ -8,21 +8,18 @@ version=${long_version:1}
dir_version=${short_version:1}
echo $version
debchange -v ${version} --distribution trusty
debchange -v ${version} --distribution trusty --package qgroundcontrol --create --empty
qmake -r qgroundcontrol.pro
make git_ver
rsync -av --delete --exclude={.git,build-release,release,Makefile\*} . ${tmpdir}/qgroundcontrol-${dir_version}/
rsync -a --delete --exclude={build-release,release,Makefile\*} . ${tmpdir}/qgroundcontrol-${dir_version}/
cd ${tmpdir}
tar pczf qgroundcontrol_${dir_version}.orig.tar.gz qgroundcontrol-${dir_version}
cd ${tmpdir}/qgroundcontrol-${dir_version}/
debuild -S
dput ppa:qgroundcontrol/ppa ${tmpdir}/qgroundcontrol_${version}_source.changes
debuild -S -uc -us
# build locally
debuild --prepend-path=/usr/lib/ccache -uc -us -sa -B -i -I -j4
# test building the source deb locally
#debuild --prepend-path=/usr/lib/ccache -sa
# upload to launchpad
#dput -f ppa:qgroundcontrol/ppa ${tmpdir}/qgroundcontrol_${version}_source.changes
......@@ -216,7 +216,7 @@ OPTIMIZE_OUTPUT_VHDL = NO
# .inc files as Fortran files (default is PHP), and .f files as C (default is Fortran),
# use: inc=Fortran f=C. Note that for custom extensions you also need to set FILE_PATTERNS otherwise the files are not read by doxygen.
EXTENSION_MAPPING =
EXTENSION_MAPPING = qml=C++
# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
# to include (a tag file for) the STL sources as input, then you should
......@@ -281,7 +281,7 @@ TYPEDEF_HIDES_STRUCT = NO
# causing a significant performance penality.
# If the system has enough physical memory increasing the cache will improve the
# performance by keeping more symbols in memory. Note that the value works on
# a logarithmic scale so increasing the size by one will rougly double the
# a logarithmic scale so increasing the size by one will roughly double the
# memory usage. The cache size is given by this formula:
# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0,
# corresponding to a cache size of 2^16 = 65536 symbols
......@@ -585,7 +585,7 @@ INPUT_ENCODING = UTF-8
# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx
# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90
FILE_PATTERNS = *.c *.h *.hpp *.hxx *.cc *.cpp *.cxx *.dox
FILE_PATTERNS = *.c *.h *.hpp *.hxx *.cc *.cpp *.cxx *.dox *.qml
#FILE_PATTERNS =
# The RECURSIVE tag can be used to turn specify whether or not subdirectories
......@@ -598,9 +598,7 @@ RECURSIVE = YES
# excluded from the INPUT source files. This way you can easily exclude a
# subdirectory from a directory tree whose root is specified with the INPUT tag.
EXCLUDE = ../src/lib/ \
lib/ \
../src/libs/
EXCLUDE =
# The EXCLUDE_SYMLINKS tag can be used select whether or not files or
# directories that are symbolic links (a Unix filesystem feature) are excluded
......@@ -670,7 +668,7 @@ INPUT_FILTER =
# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER
# is applied to all files.
FILTER_PATTERNS =
FILTER_PATTERNS = *.qml=/usr/local/bin/doxyqml
# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
# INPUT_FILTER) will be used to filter the input files when producing source
......@@ -687,7 +685,7 @@ FILTER_SOURCE_FILES = NO
# Note: To get rid of all source code in the generated output, make sure also
# VERBATIM_HEADERS is set to NO.
SOURCE_BROWSER = NO
SOURCE_BROWSER = YES
# Setting the INLINE_SOURCES tag to YES will include the body
# of functions and classes directly in the documentation.
......
<?xml version="1.0"?>
<!--
************************************************************************
Rascal 110 R/C airplane config. This files ties together all the components
used by FGFS to represent the Rascal 110 (by Sig Mfg) including the flight
dynamics model, and external 3D model.
************************************************************************
-->
<PropertyList>
<sim>
<description>Easy Star (R/C)</description>
<author>Ken Northup, 3d model </author>
<author>Ron Jensen, 3d model, FDM</author>
<aircraft-version>0.0</aircraft-version>
<flight-model>jsb</flight-model>
<aero>easystar</aero>
<!--
<systems>
<autopilot>
<path>Aircraft/Malolo1/Systems/110-autopilot.xml</path>
</autopilot>
<electrical>
<path>Aircraft/Malolo1/Systems/electrical.xml</path>
</electrical>
</systems> -->
<sound>
<path>Aircraft/Generic/generic-sound.xml</path>
</sound>
<panel>
<visibility archive="n">false</visibility>
</panel>
<model>
<path archive="y">Aircraft/EasyStar/Models/easystar.xml</path>
</model>
<view>
<internal archive="y">true</internal>
<config>
<x-offset-m archive="y">0.0</x-offset-m>
<y-offset-m archive="y">0.15</y-offset-m>
<z-offset-m archive="y">0.40</z-offset-m>
<pitch-offset-deg>0</pitch-offset-deg>
</config>
</view>
<view n="101">
<name>News Camera</name>
<type>lookat</type>
<internal type="bool">true</internal>
<config>
<eye-lat-deg-path>/position/latitude-deg</eye-lat-deg-path>
<eye-lon-deg-path>/position/longitude-deg</eye-lon-deg-path>
<eye-alt-ft-path>/position/altitude-ft</eye-alt-ft-path>
<eye-heading-deg-path>/orientation/heading-deg</eye-heading-deg-path>
<target-lat-deg-path>/sim/tower/latitude-deg</target-lat-deg-path>
<target-lon-deg-path>/sim/tower/longitude-deg</target-lon-deg-path>
<target-alt-ft-path>/sim/tower/altitude-ft</target-alt-ft-path>
<!--
<target-heading-deg-path></target-heading-deg-path>
<target-pitch-deg-path></target-pitch-deg-path>
<target-roll-deg-path></target-roll-deg-path>
-->
</config>
</view>
<chase-distance-m archive="y" type="double">-7.5</chase-distance-m>
<help>
<title>Easy Star R/C</title>
<line>Cruise speed: mph</line>
<line>Never-exceed (Vne): mph</line>
<line>Best Glide (Vglide): mph</line>
<line>Maneuvering (Va): mph</line>
<line>Approach speed: mph</line>
<line>Stall speed (Vs): mph</line>
</help>
</sim>
<controls>
<flight>
<elevator-trim>0.00</elevator-trim> <!-- controllable -->
</flight>
</controls>
</PropertyList>
<?xml version="1.0"?>
<!-- Calculated from http://brantuas.com/ezcalc/dma1.asp using a Speed 400 motor, 5.5x4.5 prop and 8 KAN 950 cells -->
<electric_engine name="ElecMot400">
<power unit="WATTS"> 70.0 </power>
</electric_engine>
<?xml version="1.0"?>
<!-- Generated by Javaprop
-->
<propeller name="prop">
<ixx> 1e-4 </ixx>
<diameter unit="IN"> 5.5 </diameter>
<numblades> 2 </numblades>
<gearratio>1.0 </gearratio>
<ct_factor>1.0 </ct_factor>
<cp_factor>1.0 </cp_factor>
<table name="C_THRUST" type="internal">
<tableData>
0.00 0.088784
0.05 0.091205
0.10 0.090752
0.15 0.089925
0.20 0.088593
0.25 0.086674
0.30 0.084053
0.35 0.080709
0.40 0.076332
0.45 0.070568
0.50 0.063187
0.55 0.055458
0.60 0.047475
0.65 0.039233
0.70 0.030741
0.71 0.029014
0.72 0.027279
0.73 0.025533
0.74 0.023780
0.75 0.022018
0.76 0.020248
0.77 0.018470
0.78 0.016683
0.79 0.014887
0.80 0.013086
0.81 0.011274
0.82 0.009459
0.83 0.007626
0.84 0.005791
0.85 0.003949
0.86 0.002076
0.87 0.000208
0.88 -0.001676
0.89 -0.003521
0.90 -0.005448
0.91 -0.007298
0.92 -0.009234
</tableData>
</table>
<table name="C_POWER" type="internal">
<tableData>
0.00 0.048163
0.05 0.047685
0.10 0.047684
0.15 0.047603
0.20 0.048065
0.25 0.048509
0.30 0.049003
0.35 0.049322
0.40 0.049003
0.45 0.047900
0.50 0.045619
0.55 0.042672
0.60 0.039115
0.65 0.034900
0.70 0.029989
0.71 0.028920
0.72 0.027823
0.73 0.026695
0.74 0.025539
0.75 0.024353
0.76 0.023136
0.77 0.021891
0.78 0.020614
0.79 0.019306
0.80 0.017969
0.81 0.016598
0.82 0.015201
0.83 0.013764
0.84 0.012300
0.85 0.010804
0.86 0.009257
0.87 0.007688
0.88 0.006079
0.89 0.004477
0.90 0.002777
0.91 0.001121
0.92 -0.000641
</tableData>
</table>
</propeller>
This diff is collapsed.
This diff is collapsed.
<?xml version="1.0"?>
<PropertyList>
<path>easystar.ac</path>
</PropertyList>
This diff is collapsed.
Origional readme:
************************************************************************
* MULTIPLEX Modellsport GmbH & Co. KG *
* Neuer Weg 2, D-75223 Niefern, Germany *
************************************************************************
Wir haben die Flugeigenschaften so genau wie mglich
dem realen Modell angenhert. In extremen Flugsituationen sind jedoch Ab-
weichungen mglich.
This Model was created for FMS and now modified by Ken Northup using AC3D and is freely distributed. Please feel free to modify as you wish using AC3D. If you modify and make a better paint scheme, feel free to contact me via email, as I would love to see different versions created for Clearview RC Simulator. To Install, simply extract the file and put the folder under the models in the Clearview RC Simulator. The next time you run Clearview, it will appear under the Airplane selections.
Ken Northup
Helos360@bellsouth.net
\ No newline at end of file
The EasyStar model is from http://gitorious.org/ron-s-hanger/easystar-rc (fork at https://gitorious.org/~thomasgubler/ron-s-hanger/thomasgublers-easystar-rc)
I slightly adapted some files in order to make the model work when it's not located in the default flightgear aircraft folder.
-Thomas Gubler
<?xml version="1.0"?>
<initialize name="reset00">
<!--
This file sets up the aircraft to start off
from the runway in preparation for takeoff.
-->
<ubody> 0.0 </ubody>
<vbody> 0.0 </vbody>
<wbody> 0.0 </wbody>
<latitude> 47.0 </latitude>
<longitude> 122.0 </longitude>
<phi> 0.0 </phi>
<theta> 0.0 </theta>
<psi> 150.0 </psi>
<altitude> 4.7 </altitude>
</initialize>
<?xml version="1.0"?>
<initialize name="reset01">
<!--
This file drops the aircraft from 1000 ft to see what happens.
-->
<ubody> 0.0 </ubody>
<vbody> 0.0 </vbody>
<wbody> 0.0 </wbody>
<latitude> 47.0 </latitude>
<longitude> 122.0 </longitude>
<phi> 0.0 </phi>
<theta> 0.0 </theta>
<psi> 150.0 </psi>
<altitude> 1000.7 </altitude>
</initialize>
<?xml version="1.0"?>
<!--
************************************************************************
Rascal 110 R/C airplane config. This files ties together all the components
used by FGFS to represent the Rascal 110 (by Sig Mfg) including the flight
dynamics model, and external 3D model.
************************************************************************
-->
<PropertyList>
<sim>
<description>Malolo1(R/C)</description>
<author>Innis Cunningham, Josh Wilson</author>
<aircraft-version>0.0</aircraft-version>
<startup>
<splash-texture>Aircraft/Malolo1/Malolo1-splash.rgb</splash-texture>
</startup>
<flight-model>jsb</flight-model>
<aero>Malolo1</aero>
<fuel-fraction>0.8</fuel-fraction>
<!--
<systems>
<autopilot>
<path>Aircraft/Malolo1/Systems/110-autopilot.xml</path>
</autopilot>
<electrical>
<path>Aircraft/Malolo1/Systems/electrical.xml</path>
</electrical>
</systems> -->
<sound>
<path>Aircraft/Generic/generic-sound.xml</path>
</sound>
<panel>
<visibility archive="n">false</visibility>
</panel>
<model>
<path archive="y">Aircraft/Malolo1/Models/Malolo1.xml</path>
</model>
<view>
<internal archive="y">true</internal>
<config>
<x-offset-m archive="y">0.0</x-offset-m>
<y-offset-m archive="y">0.26</y-offset-m>
<z-offset-m archive="y">0.34</z-offset-m>
<pitch-offset-deg>-8</pitch-offset-deg>
</config>
</view>
<chase-distance-m archive="y" type="double">-15.0</chase-distance-m>
<help>
<title>YardStik 110 (Sig Mfg)</title>
<line>Cruise speed: 60 mph</line>
<line>Never-exceed (Vne): 85 mph</line>
<line>Best Glide (Vglide): 20 mph</line>
<line>Maneuvering (Va): 50 mph</line>
<line>Approach speed: 15-25 mph</line>
<line>Stall speed (Vs): 10 mph</line>
</help>
</sim>
<controls>
<flight>
<aileron-trim>-0.01</aileron-trim> <!-- fixed -->
<elevator-trim>0.00</elevator-trim> <!-- controllable -->
<rudder-trim>0.00</rudder-trim> <!-- fixed -->
</flight>
<engines>
<engine n="0">
<magnetos>3</magnetos>
</engine>
</engines>
<door>1.0</door>
</controls>
<engines>
<engine>
<rpm type="double">700</rpm>
</engine>
</engines>
<!-- An autopilot on a Cub??? -->
<autopilot>
<config>
<min-climb-speed-kt type="float">48.0</min-climb-speed-kt>
<best-climb-speed-kt type="float">56.0</best-climb-speed-kt>
<target-climb-rate-fpm type="float">400.0</target-climb-rate-fpm>
<target-descent-rate-fpm type="float">1000.0</target-descent-rate-fpm>
<elevator-adj-factor type="float">6000.0</elevator-adj-factor>
<integral-contribution type="float">0.008</integral-contribution>
<zero-pitch-throttle type="float">0.35</zero-pitch-throttle>
<zero-pitch-trim-full-throttle type="float">0.001</zero-pitch-trim-full-throttle>
</config>
</autopilot>
</PropertyList>
This diff is collapsed.
<?xml version="1.0"?>
<!-- Generated by Aero-Matic v 0.7
Inputs:
horsepower: 3.8
pitch: fixed
Outputs:
linear-blade-inches: 10.331602005498
-->
<propeller name="Rascal Propeller">
<ixx> 0.00085 </ixx>
<diameter unit="IN"> 18.0 </diameter>
<numblades> 2 </numblades>
<minpitch> 30 </minpitch>
<maxpitch> 30 </maxpitch>
<table name="C_THRUST" type="internal">
<tableData>
0.0 0.0776
0.1 0.0744
0.2 0.0712
0.3 0.0655
0.4 0.0588
0.5 0.0518
0.6 0.0419
0.7 0.0318
0.8 0.0172
1.0 -0.0058
1.4 -0.0549
</tableData>
</table>
<table name="C_POWER" type = "internal">
<tableData>
0.0 0.0902
0.1 0.0893
0.2 0.0880
0.3 0.0860
0.4 0.0810
0.5 0.0742
0.6 0.0681
0.7 0.0572
0.8 0.0467
1.0 0.0167
1.4 -0.0803
</tableData>
</table>
</propeller>
<?xml version="1.0"?>
<!-- Zenoah G-26A -->
<!-- 2.96 hp engine -->
<!-- one horsepower equals 745.69987 Watts -->
<electric_engine name="electric_1mw">
<power unit="WATTS"> 2207.27 </power>
</electric_engine>
<?xml version="1.0"?>
<!--
************************************************************************
Rascal 110 R/C airplane config. This files ties together all the components
used by FGFS to represent the Rascal 110 (by Sig Mfg) including the flight
dynamics model, and external 3D model.
************************************************************************
-->
<PropertyList>
<sim>
<description>Malolo1(R/C)</description>
<author>Innis Cunningham, Josh Wilson</author>
<aircraft-version>0.0</aircraft-version>
<startup>
<splash-texture>Aircraft/Malolo1/Malolo1-splash.rgb</splash-texture>
</startup>
<flight-model>jsb</flight-model>
<aero>Malolo1</aero>
<fuel-fraction>0.8</fuel-fraction>
<!--
<systems>
<autopilot>
<path>Aircraft/Malolo1/Systems/110-autopilot.xml</path>
</autopilot>
<electrical>
<path>Aircraft/Malolo1/Systems/electrical.xml</path>
</electrical>
</systems> -->
<sound>
<path>Aircraft/Generic/generic-sound.xml</path>
</sound>
<panel>
<visibility archive="n">false</visibility>
</panel>
<model>
<path archive="y">Aircraft/Malolo1/Models/Malolo1.xml</path>
</model>
<view>
<internal archive="y">true</internal>
<config>
<x-offset-m archive="y">0.0</x-offset-m>
<y-offset-m archive="y">0.26</y-offset-m>
<z-offset-m archive="y">0.34</z-offset-m>
<pitch-offset-deg>-8</pitch-offset-deg>
</config>
</view>
<chase-distance-m archive="y" type="double">-15.0</chase-distance-m>
<help>
<title>YardStik 110 (Sig Mfg)</title>
<line>Cruise speed: 60 mph</line>
<line>Never-exceed (Vne): 85 mph</line>
<line>Best Glide (Vglide): 20 mph</line>
<line>Maneuvering (Va): 50 mph</line>
<line>Approach speed: 15-25 mph</line>
<line>Stall speed (Vs): 10 mph</line>
</help>
<menubar>
<default>
<menu n="10">
<label>Malolo</label>
<enabled type="bool">true</enabled>
<item>
<label>Operate catapult</label>
<binding>
<command>nasal</command>
<script>
malolo1.launchCatapult();
</script>
</binding>
</item>
</menu>
</default>
</menubar>
</sim>
<nasal>
<malolo1>
<file>Aircraft/Malolo1/Nasal/catapult.nas</file>
</malolo1>
</nasal>
<controls>
<flight>
<aileron-trim>-0.01</aileron-trim> <!-- fixed -->
<elevator-trim>0.00</elevator-trim> <!-- controllable -->
<rudder-trim>0.00</rudder-trim> <!-- fixed -->
</flight>
<engines>
<engine n="0">
<magnetos>3</magnetos>
</engine>
</engines>
<door>1.0</door>
</controls>
<engines>
<engine>
<rpm type="double">700</rpm>
</engine>
</engines>
<!-- An autopilot on a Cub??? -->
<autopilot>
<config>
<min-climb-speed-kt type="float">48.0</min-climb-speed-kt>
<best-climb-speed-kt type="float">56.0</best-climb-speed-kt>
<target-climb-rate-fpm type="float">400.0</target-climb-rate-fpm>
<target-descent-rate-fpm type="float">1000.0</target-descent-rate-fpm>
<elevator-adj-factor type="float">6000.0</elevator-adj-factor>
<integral-contribution type="float">0.008</integral-contribution>
<zero-pitch-throttle type="float">0.35</zero-pitch-throttle>
<zero-pitch-trim-full-throttle type="float">0.001</zero-pitch-trim-full-throttle>
</config>
</autopilot>
</PropertyList>
This diff is collapsed.
This diff is collapsed.
<?xml version="1.0"?>
<PropertyList>
<path>Malolo1.ac</path>
<offsets>
<z-m>-0.01</z-m>
<pitch-deg>0.2</pitch-deg>
</offsets>
<animation>
<type>rotate</type>
<object-name>rhelevon</object-name>
<property>controls/flight/elevator</property>
<factor>15</factor>
<offset-deg>0</offset-deg>
<center>
<x-m>0.65</x-m>
<y-m>1.4</y-m>
<z-m>0.07</z-m>
</center>
<axis>
<x>0.215</x>
<y>1</y>
<z>0.056</z>
</axis>
</animation>
<animation>
<type>rotate</type>
<object-name>rhelevon</object-name>
<property>controls/flight/aileron</property>
<factor>-15</factor>
<offset-deg>0</offset-deg>
<center>
<x-m>0.65</x-m>
<y-m>1.4</y-m>
<z-m>0.07</z-m>
</center>
<axis>
<x>0.215</x>
<y>1</y>
<z>0.056</z>
</axis>
</animation>
<animation>
<type>rotate</type>
<object-name>lhelevon</object-name>
<property>controls/flight/elevator</property>
<factor>15</factor>
<offset-deg>0</offset-deg>
<center>
<x-m>0.65</x-m>
<y-m>-1.4</y-m>
<z-m>0.07</z-m>
</center>
<axis>
<x>-0.215</x>
<y>1</y>
<z>-0.056</z>
</axis>
</animation>
<animation>
<type>rotate</type>
<object-name>lhelevon</object-name>
<property>controls/flight/aileron</property>
<factor>15</factor>
<offset-deg>0</offset-deg>
<center>
<x-m>0.65</x-m>
<y-m>-1.4</y-m>
<z-m>0.07</z-m>
</center>
<axis>
<x>-0.215</x>
<y>1</y>
<z>-0.056</z>
</axis>
</animation>
<animation>
<type>spin</type>
<object-name>prop2</object-name>
<property>engines/engine/rpm</property>
<factor>-0.2</factor>
<center>
<x-m>0</x-m>
<y-m>0</y-m>
<z-m>0.0156</z-m>
</center>
<axis>
<x>1</x>
<y>0</y>
<z>0</z>
</axis>
</animation>
</PropertyList>
var launchCatapult = func {
# time on catapult = 1/10 sec
# speed when leaving catapult = 50 km/h ?
var countdownRunning = 1;
var count = 3;
var countdown = func {
if (countdownRunning) {
if (count != 0) {
setprop("/sim/screen/white",count);
count = count - 1;
settimer(countdown, 1);
}
else {
countdownRunning = 0;
setprop("/sim/screen/yellow","Go!");
launch();
}
}
}
countdown();
var launchRunning = 1;
var magnitude = 230; # lbs, unrealisticly high, because the FDM is wrong
var launch = func {
if (launchRunning) {
if (magnitude == 0){
launchRunning = 0;
# remove launcher contact points
setprop("/fdm/jsbsim/contact/unit[6]/pos-norm",0);
setprop("/fdm/jsbsim/contact/unit[7]/pos-norm",0);
setprop("/fdm/jsbsim/contact/unit[8]/pos-norm",0);
}
setprop("/fdm/jsbsim/external_reactions/catapult/magnitude",magnitude);
print (magnitude);
magnitude = 0;
settimer(launch, 0.1);
}
}
}
This is the original Malolo1 model with added catapult functionality. The catapult is from https://gitorious.org/mavlab/x100/
-Thomas Gubler
<?xml version="1.0"?>
<PropertyList>
<name>rascal-config</name>
<layout>vbox</layout>
<x>40</x>
<y>40</y>
<group>
<layout>hbox</layout>
<empty><stretch>true</stretch></empty>
<text>
<label>Rascal Configuration</label>
</text>
<empty><stretch>true</stretch></empty>
<button>
<pref-width>16</pref-width>
<pref-height>16</pref-height>
<legend></legend>
<default>1</default>
<keynum>27</keynum>
<border>2</border>
<binding>
<command>nasal</command>
<script>rascal.dialog.close()</script>
</binding>
</button>
</group>
<hrule/>
<group>
<layout>table</layout>
<!-- row zero -->
<checkbox>
<row>0</row> <col>0</col>
<halign>left</halign>
<label>External Autopilot Enable</label>
<property>/ugear/settings/ap-enable</property>
<live>true</live>
<binding>
<command>dialog-apply</command>
</binding>
</checkbox>
<!-- row one -->
<checkbox>
<row>1</row> <col>0</col>
<halign>left</halign>
<label>External Turret Control Enable</label>
<property>/ugear/settings/turret-enable</property>
<live>true</live>
<binding>
<command>dialog-apply</command>
</binding>
</checkbox>
<!-- row two -->
<checkbox>
<row>2</row> <col>0</col>
<halign>left</halign>
<label>Smoke</label>
<property>/sim/multiplay/generic/int[0]</property>
<live>true</live>
<binding>
<command>dialog-apply</command>
</binding>
</checkbox>
<!-- row three -->
<checkbox>
<row>3</row> <col>0</col>
<halign>left</halign>
<label>Trajectory Markers</label>
<property>/sim/multiplay/generic/int[1]</property>
<live>true</live>
<binding>
<command>dialog-apply</command>
</binding>
</checkbox>
</group>
<hrule/>
</PropertyList>
<?xml version="1.0"?>
<!-- Generated by Aero-Matic v 0.7
Inputs:
horsepower: 3.8
pitch: fixed
Outputs:
linear-blade-inches: 10.331602005498
-->
<propeller name="Rascal Propeller">
<ixx> 0.00085 </ixx>
<diameter unit="IN"> 18.0 </diameter>
<numblades> 2 </numblades>
<minpitch> 30 </minpitch>
<maxpitch> 30 </maxpitch>
<table name="C_THRUST" type="internal">
<tableData>
0.0 0.0776
0.1 0.0744
0.2 0.0712
0.3 0.0655
0.4 0.0588
0.5 0.0518
0.6 0.0419
0.7 0.0318
0.8 0.0172
1.0 -0.0058
1.4 -0.0549
</tableData>
</table>
<table name="C_POWER" type = "internal">
<tableData>
0.0 0.0902
0.1 0.0893
0.2 0.0880
0.3 0.0860
0.4 0.0810
0.5 0.0742
0.6 0.0681
0.7 0.0572
0.8 0.0467
1.0 0.0167
1.4 -0.0803
</tableData>
</table>
</propeller>
<?xml version="1.0"?>
<!-- Zenoah G-26A -->
<!-- 2.96 hp engine -->
<!-- one horsepower equals 745.69987 Watts -->
<electric_engine name="electric_1mw">
<power unit="WATTS"> 2207.27 </power>
</electric_engine>
This diff is collapsed.
<?xml version="1.0"?>
<PropertyList>
<path>Rascal110-000-013.ac</path>
<model>
<path>Aircraft/Rascal/Models/smokeW.xml</path>
<offsets>
<x-m> 2.0</x-m>
<y-m> 0.0</y-m>
<z-m> 0.0</z-m>
<roll-deg> 0</roll-deg>
<pitch-deg> 0</pitch-deg>
<heading-deg>0</heading-deg>
</offsets>
</model>
<animation>
<type>rotate</type>
<object-name>L_Aileron</object-name>
<property>/surface-positions/left-aileron-pos-norm</property>
<factor>20.0</factor> <!-- fixme -->
<center>
<x-m>0.735</x-m>
<y-m>-0.450</y-m>
<z-m>0.139</z-m>
</center>
<axis>
<x>0.037</x>
<y>1.0</y>
<z>-0.029</z>
</axis>
</animation>
<animation>
<type>rotate</type>
<object-name>R_Aileron</object-name>
<property>/surface-positions/right-aileron-pos-norm</property>
<factor>20.0</factor> <!-- fixme -->
<center>
<x-m>0.735</x-m>
<y-m>0.450</y-m>
<z-m>0.139</z-m>
</center>
<axis>
<x>-0.037</x>
<y>1.0</y>
<z>0.029</z>
</axis>
</animation>
<animation>
<type>rotate</type>
<object-name>Elevator</object-name>
<property>/surface-positions/elevator-pos-norm</property>
<factor>35.0</factor> <!-- fixme -->
<center>
<x-m>1.752</x-m>
<y-m>0.0</y-m>
<z-m>0.051</z-m>
</center>
<axis>
<x>0.0</x>
<y>1.0</y>
<z>0.0</z>
</axis>
</animation>
<animation>
<type>rotate</type>
<object-name>Rudder</object-name>
<property>/surface-positions/rudder-pos-norm</property>
<factor>35.0</factor> <!-- fixme -->
<center>
<x-m>1.752</x-m>
<y-m>0.0</y-m>
<z-m>0.0</z-m>
</center>
<axis>
<x>0.0</x>
<y>0.0</y>
<z>1.0</z>
</axis>
</animation>
</PropertyList>
AC3Db
MATERIAL "ac3dmat9" rgb 0 0 1 amb 0 0 1 emis 0 0 1 spec 0 0 1 shi 0 trans 0
MATERIAL "ac3dmat3" rgb 1 0 0 amb 1 0 0 emis 1 0 0 spec 1 0 0 shi 0 trans 0
OBJECT world
kids 2
OBJECT poly
name "line"
loc 0 0.5 0
numvert 2
0 0.5 0
0 -0.5 0
numsurf 1
SURF 0x22
mat 0
refs 2
0 0 1
1 0 0
kids 0
OBJECT poly
name "line"
numvert 2
0 0 -3
0 0 3
numsurf 1
SURF 0x22
mat 1
refs 2
0 0 1
1 0 0
kids 0
<?xml version="1.0"?>
<!-- Trajectory Marker config file - Lee Elliott -->
<PropertyList>
<path>Trajectory-Marker.ac</path>
</PropertyList>
#! /bin/sh
for f in "$@" ; do
sed -i.before-color-change 's,\(MATERIAL.*\)rgb\(.*\)amb\(.*\)emis\(.*\)spec\(.*\)shi\(.*\)trans\(.*\)$,\1rgb\2amb\2emis\4spec\5shi\6trans\7,1' "$f"
if ! cmp "${f}" "${f}.before-color-change" > /dev/null 2>&1 ; then
echo "$f has changed colors!"
fi
done
<?xml version="1.0" encoding="UTF-8"?>
<!-- New version May, 07, 2009 by 102nd-YU-Nitro -->
<PropertyList>
<!-- OSG Particles -->
<particlesystem>
<name>smoke</name>
<offsets>
<x-m> 0.000 </x-m>
<y-m> 0.000 </y-m>
<z-m> -0.000 </z-m>
<roll-deg> 0.000 </roll-deg>
<pitch-deg> 0.000 </pitch-deg>
<heading-deg> 0.000 </heading-deg>
</offsets>
<texture>smoke.png</texture>
<condition>
<property>sim/multiplay/generic/int[0]</property>
</condition>
<emissive>false</emissive>
<lighting>false</lighting>
<align>billboard</align> <!-- billboard / fixed -->
<attach>world</attach> <!-- world / local-->
<placer>
<type>point</type> <!-- sector / segments / point -->
</placer>
<shooter>
<theta-min-deg>10</theta-min-deg>
<theta-max-deg>86</theta-max-deg>
<phi-min-deg>-1.5</phi-min-deg>
<phi-max-deg>8</phi-max-deg>
<speed-mps>
<value>10</value>
<spread>2.5</spread>
</speed-mps>
<rotation-speed>
<x-min-deg-sec>5</x-min-deg-sec>
<y-min-deg-sec>5</y-min-deg-sec>
<z-min-deg-sec>5</z-min-deg-sec>
<x-max-deg-sec>60</x-max-deg-sec>
<y-max-deg-sec>60</y-max-deg-sec>
<z-max-deg-sec>60</z-max-deg-sec>
</rotation-speed>
</shooter>
<counter>
<particles-per-sec>
<value>100</value>
<spread>1</spread>
</particles-per-sec>
</counter>
<particle>
<start>
<color>
<red><value> 0.9 </value></red>
<green><value> 0.9 </value></green>
<blue><value> 0.9 </value></blue>
<alpha><value> 0.3 </value></alpha>
</color>
<size>
<value>0.3</value>
</size>
</start>
<end>
<color>
<red><value> 0.900 </value></red>
<green><value> 0.900 </value></green>
<blue><value> 0.900 </value></blue>
<alpha><value> 0.001 </value></alpha>
</color>
<size>
<value>10.0</value>
</size>
</end>
<life-sec>
<value>60</value>
</life-sec>
<mass-kg>0.001</mass-kg>
<radius-m>1.0</radius-m>
</particle>
<program>
<fluid>air</fluid> <!-- air / water -->
<gravity>false</gravity>
<wind>true</wind>
</program>
</particlesystem>
</PropertyList>
This information has not been updated for the Rascal, please ignore, we
are still at pre-pre-pre-alpha with this model!
PIPER J3 CUB PERFORMANCE DATA
=============================
[This information is copied from the 1946 J3C-65 owner's handbook.]
FLYING HINTS
The Piper Cub Special represents more than 15 years of diligent
aircraft engineering and manufacturing experience. Its simplicity of
design and construction, its low operating and maintenance costs, its
inherent stability, ruggedness, and its outstanding safety and ease of
flying, have made it the most popular airplane in aviation history.
The Piper Cub Special is the time-tested product of millions of hours
of flying under all conceivable conditions both in the military and in
peace time.
There are hints on starting, flying, stopping, and other related
topics that are important to the owner who wants to conserve his
airplane -- keep it in maximum airworthy condition -- and enjoy a full
measure of flying satisfaction.
First, each pilot should become familiar enough with his Piper Cub
Special that he can accomplish a satisfactory pre-flight inspection.
This check is simple and requires only a few minutes. See Section IX
for check list. Daily check of airplane prior to flight should be the
first in a number of safe flying habits the pilot should acquire.
A. BEFORE STARTING ENGINE
(1) Make routine check of gasoline supply. Visible fuel gauge is
integral part of gas tank cap; it will not show number of gallons but
will show proportion of fuel in tank by length of rod which extends
upward from cap. A full tank of 12 U.S. gallons will be indicated by
11 inches of rod extending beyond cap. Keep gas gauge rod clean and
smooth with crocus cloth for accuracy and freedom of movement.
(2) Check oil level in engine sump by removing oil cap and gauge. Oil
stick should indicate oil level up to index mark of 4 quarts.
(3) Check freedom of movement of flight and engine controls.
B. STARTING ENGINE
(1) Chock wheels, or have occupant who is familiar with controls set
brakes in cabin.
(2) Ignition switch OFF. Verify.
(3) Set throttle approximately 1/10 open.
(4) Push fuel shut-off ON.
(5) Turn propeller through several times.
(6) Turn ignition switch ON.
(7) Start engine by pulling propeller through with a snap.
CAUTION -- Always handle propeller as if switch were "ON." Stand as
far in front of propeller as possible. Use both hands and grasp one
blad approximately midway from tip. Do not overgrasp blade. Do not
wear long, loose clothing. Make sure footing is sure to preclude
possibility of feet slipping.
(8) If engine does not start, turn switch OFF. Turn primer knob to
unlock, pull out, pump three or four times, then reseat primer and
lock by turning in opposite direction. In extremely cold weather a
few strokes of the primer as the engine starts will enable it to keep
running. NOTE -- Avoid excessive priming as it causes raw gasoline to
wash lubricating oil from engine cylinder walls. Do not prime warm
engine.
(9) Repeat starting procedures 6, 7.
(10) If engine loads up and refuses to start, turn ignition switch
"OFF,", open throttle wide and turn propeller through backwards
several times to unload excessive gas mixture in cylinders. Then
close throttle and repeat starting procedure.
C. ENGINE WARM-UP
(1) As soon as engine starts, advance throttle slightly to idle at 700
R.P.M. Check engine instruments. If oil pressure gauge does not
indicate pressure within 30 seconds, stop engine immediately, check
and correct trouble before any further operation. Oil temperature
during operating should not rise above 200° F. and oil pressure should
not fall below 30 pounds. With engine warm, idling speed should be
550-600 R.P.M.
(2) Rev engine up to 2100 R.P.M. on both magnetos. Switch to LEFT and
RIGHT magnetos. R.P.M. drop should not be over 75 R.P.M. CAUTION
--Do not operate engine on either single magneto for more than 30
seconds at a time, as this tends to foul the non-operating spark plugs
in the ignition circuit of the magneto that is switched off.
D. STOPPING ENGINE
(1) Never cut switch immediately after landing as this causes engine
to cool too rapidly.
(2) Idle engine, especially in high temperature operating conditions,
for several minutes. It is advisable to switch to each magneto for 30
second intervals to allow gradual cooling of engine. This helps to
prevent overheating of spark plug insulators and will lessen tendency
for "after-firing."
(3) Check for carburetor heat OFF during idling.
E. TAXIING
(1) Open throttle to start airplane in motion; then close throttle to
a setting sufficient to keep airplane rolling. Do not keep throttle
advanced so that it is necessary to control taxi speed of airplane
with brakes. This causes unnecessary wear and tear on brakes and
tires.
(2) Taxi slowly (speed of a fast walk) controlling direction with
rudder which is connected to a steerable tail wheel. Use brakes only
for positive, precision ground control when necessary.
(3) Taxi upwind with stick back; downwind with stick foreward. When
ground winds are in excess of 15 M.P.H., turn into wind using ailerons
in direction of turn; apply ailerons away from the turn when turning
downwind. This procedure helps to prevent the wind "picking up" a
wing during windy, gusty conditions. Always make ground turns slowly.
F. GENERAL FLYING
(1) For takeoff use full throttle, heading into wind. Airplane loaded
will become airborne at approximately 39 M.P.H. Best climb speed is
an indicated 55 M.P.H.
(2) Indicated R.P.M. for cruising speed of 73 M.P.H. is 2150.
Take-off R.P.M. is 2300. Do not fly at full throttle over 3 minutes.
(3) Use CARBURETOR AIR HEAT when engine runs "rough" and tachometer
shows drop in R.P.M. which may be due to ice forming in carburetor.
Tachometer should recover to within 50 R.P.M. below normal when using
carburetor heat. Push heater to "OFF" position, and if icing
condition has been cleared, R.P.M. should return to normal. Continued
use of carburetor heat will only cause increased fuel consumption and
loss of power.
(4) Maximum permissible diving speed is 122 M.P.H.
G. APPROACH AND LANDING
(1) Push carburetor heat ON prior to throttling back for glide, or for
any other flight maneuver.
(2) Glide between 50-60 M.P.H. depending upon loading of airplane and
gust conditions.
NOTE -- "Clear" engine by opening throttle gently, every 200-250 feet
of descent during a long glide so that engine temperature will be
maintained.
Throttle action on the part of the pilot should be smooth and gentle
at all times.
H. PARKING AND MOORING
(1) After termination of flight, enter flying time in aircraft and
engine log books.
(2) Turn ignition and fuel OFF.
(3) Chcok the wheels of airplane.
(4) If airplane is not to be flown for some time, it should be
hangared or tied down. Use good quality 1/2" - 5/8" diameter rope.
Secure to lift assist handle at aft end of fuselage; also at upper end
of both front wing lift struts where they attach to wing. Make sure
that rope passes between aileron cable and lift strut. Mooring ropes,
when airplane is tied down, should have no slack.
(5) Lock aileron and elevator controls by wrapping front seat belt
completely around rear control stick, tighten and buckle.
(6) Under excessively wind conditions, airplane should be tailed into
wind for mooring.
[Here is my older information.]
These are the only numbers I could find. They are for a J3 Cub with
an 85HP engine rather than 65 hp, so some adjustments may be
necessary. The source is
http://www.evergreenfs.com/planedata.htm
Speeds
------
Best rate of climb (Vy): 65 mph (57 kt)
Best angle of climb (Vx): 55 mph (48 kt)
Cruise: 70 mph (61 kt)
Never-exceed (Vne): 122 mph (106 kt)
Best Glide (Vglide): 60 mph (52 kt)
Stall (Vs): 38 mph (33 kt)
Maneuvering (Va): 70 mph (61 kt)
Approach: 50-60 mph (44-52 kt)
Power
-----
Take off: full
Climb: 50 rpm below full
Cruise: 2300 rpm
Approach: 1200 rpm
Practice stalls: 1200 rpm
Distances
---------
Take-off: 450-800 ft
Landing: 200-800 ft
Fuel
----
Total fuel: 12 gal US
Usable fuel: 12 gal US
Grade: 80/87
GPH: 5 gal US/hr
<?xml version="1.0" encoding="UTF-8"?>
<PropertyList>
<key n="9">
<name>Ctrl-I</name>
<desc>Show configuration dialog</desc>
<binding>
<command>nasal</command>
<script>rascal.dialog.toggle()</script>
</binding>
</key>
<key n="83">
<name>S</name>
<desc>Toggle smoke</desc>
<binding>
<command>property-toggle</command>
<property>sim/multiplay/generic/int[0]</property>
</binding>
</key>
</PropertyList>
<?xml version="1.0"?>
<PropertyList>
<submodel>
<name>trajectory marker</name>
<model>Aircraft/Rascal/Models/Trajectory-Marker.xml</model>
<trigger>/sim/multiplay/generic/int[1]</trigger>
<speed>0</speed>
<repeat>true</repeat>
<delay>0.75</delay>
<count>-1</count>
<x-offset>-0.5</x-offset>
<y-offset>0.0</y-offset>
<z-offset>-0.08</z-offset>
<yaw-offset>0.0</yaw-offset>
<pitch-offset>0.0</pitch-offset>
<eda>1000000000.00</eda>
<life>600</life>
<buoyancy>32</buoyancy>
<wind>false</wind>
<aero-stabilised>false</aero-stabilised>
</submodel>
</PropertyList>
<?xml version="1.0"?>
<!--
************************************************************************
Rascal 110 R/C airplane config. This files ties together all the components
used by FGFS to represent the Rascal 110 (by Sig Mfg) including the flight
dynamics model, and external 3D model.
************************************************************************
-->
<PropertyList>
<sim>
<description>Rascal 110 (R/C)</description>
<author>Lee Elliot (3D) Dave Culp (JSBsim dynamics) and Curt Olson</author>
<aircraft-version>0.1</aircraft-version>
<startup>
<splash-texture>Aircraft/Rascal/Rascal110-splash.rgb</splash-texture>
</startup>
<flight-model>jsb</flight-model>
<aero>Rascal110-JSBSim</aero>
<fuel-fraction>0.8</fuel-fraction>
<systems>
<autopilot>
<path>Aircraft/Rascal/Systems/110-autopilot.xml</path>
</autopilot>
<electrical>
<path>Aircraft/Rascal/Systems/electrical.xml</path>
</electrical>
</systems>
<sound>
<path>Aircraft/Generic/generic-sound.xml</path>
</sound>
<panel>
<visibility archive="n">false</visibility>
</panel>
<model>
<path archive="y">Aircraft/Rascal/Models/Rascal110.xml</path>
</model>
<hud>
<path n="1">Huds/NTPS.xml</path>
<visibility n="1">true</visibility>
<color>
<transparent type="bool">true</transparent>
<antialiased type="bool">true</antialiased>
<brightness type="float">0.85</brightness>
<alpha type="float">0.85</alpha>
</color>
<palette>
<color n="0">
<red type="float">0.38</red>
<green type="float">1.0</green>
<blue type="float">0.22</blue>
</color>
<color n="1">
<red type="float">1.0</red>
<green type="float">0.0</green>
<blue type="float">0.0</blue>
</color>
</palette>
</hud>
<view>
<internal archive="y">true</internal>
<config>
<x-offset-m archive="y">0.0</x-offset-m>
<y-offset-m archive="y">-0.15</y-offset-m>
<z-offset-m archive="y">0.9</z-offset-m>
<pitch-offset-deg>-8</pitch-offset-deg>
</config>
</view>
<submodels>
<serviceable type="bool">1</serviceable>
<path>Aircraft/Rascal/Rascal-submodels.xml</path>
</submodels>
<view n="1">
<config>
<target-z-offset-m archive="y" type="double">0.5</target-z-offset-m>
</config>
</view>
<view n="2">
<config>
<target-z-offset-m archive="y" type="double">0.5</target-z-offset-m>
</config>
</view>
<view n="3">
<config>
<target-z-offset-m archive="y" type="double">0.5</target-z-offset-m>
</config>
</view>
<view n="4">
<config>
<target-z-offset-m archive="y" type="double">0.5</target-z-offset-m>
</config>
</view>
<view n="5">
<config>
<target-z-offset-m archive="y" type="double">0.5</target-z-offset-m>
</config>
</view>
<view n="6">
<config>
<target-z-offset-m archive="y" type="double">0.5</target-z-offset-m>
</config>
</view>
<view n="101">
<name>News Camera</name>
<type>lookat</type>
<internal type="bool">true</internal>
<config>
<eye-lat-deg-path>/position/latitude-deg</eye-lat-deg-path>
<eye-lon-deg-path>/position/longitude-deg</eye-lon-deg-path>
<eye-alt-ft-path>/position/altitude-ft</eye-alt-ft-path>
<eye-heading-deg-path>/orientation/heading-deg</eye-heading-deg-path>
<eye-pitch-deg-path>/orientation/pitch-deg</eye-pitch-deg-path>
<eye-roll-deg-path>/orientation/roll-deg</eye-roll-deg-path>
<x-offset-m>0.0</x-offset-m>
<y-offset-m>-0.35</y-offset-m>
<z-offset-m>-0.4</z-offset-m>
<target-lat-deg-path>/sim/input/click/latitude-deg</target-lat-deg-path>
<target-lon-deg-path>/sim/input/click/longitude-deg</target-lon-deg-path>
<target-alt-ft-path>/sim/input/click/elevation-ft</target-alt-ft-path>
</config>
</view>
<view n="102">
<name>Camera View</name>
<enabled type="bool" userarchive="y">true</enabled>
<type>lookfrom</type>
<internal type="bool">false</internal>
<config>
<from-model type="bool">true</from-model>
<from-model-idx type="int">0</from-model-idx>
<ground-level-nearplane-m type="double">0.5f</ground-level-nearplane-m>
<default-field-of-view-deg type="double">55.0</default-field-of-view-deg>
</config>
</view>
<multiplay>
<chat_display>1</chat_display>
<generic>
<int type="bool">0</int> <!-- smoke -->
<int type="bool">0</int> <!-- trajectory markers -->
</generic>
</multiplay>
<help>
<title>Rascal 110 (Sig Mfg)</title>
<line>Cruise speed: 60 kts</line>
<line>Never-exceed (Vne): 85 kts</line>
<line>Best Glide (Vglide): 20 kts</line>
<line>Maneuvering (Va): 50 kts</line>
<line>Approach speed: 20-25 kts</line>
<line>Stall speed (Vs): 15 kts</line>
</help>
</sim>
<nasal>
<rascal>
<file>Aircraft/Rascal/Systems/main.nas</file>
<file>Aircraft/Rascal/Systems/airdata.nas</file>
<file>Aircraft/Rascal/Systems/ugear.nas</file>
</rascal>
</nasal>
<yasim>
<Rascal110>
<pilot-lb>2</pilot-lb>
</Rascal110>
</yasim>
<input>
<keyboard include="Rascal-keyboard.xml"/>
</input>
<controls>
<flight>
<aileron-trim>-0.01</aileron-trim> <!-- fixed -->
<elevator-trim>0.00</elevator-trim> <!-- controllable -->
<rudder-trim>0.00</rudder-trim> <!-- fixed -->
</flight>
<engines>
<engine n="0">
<magnetos>3</magnetos>
</engine>
</engines>
<smoke alias="/sim/multiplay/generic/int[0]"/>
<trajectory-markers alias="/sim/multiplay/generic/int[1]"/>
</controls>
<engines>
<engine>
<rpm type="double">700</rpm>
</engine>
</engines>
</PropertyList>
This diff is collapsed.
<?xml version="1.0"?>
<!--
************************************************************************
Rascal 110 R/C airplane config. This files ties together all the components
used by FGFS to represent the Rascal 110 (by Sig Mfg) including the flight
dynamics model, and external 3D model.
************************************************************************
-->
<PropertyList>
<sim>
<description>Rascal 110 (R/C)</description>
<author>Lee Elliot (3D) Dave Culp (JSBsim dynamics) and Curt Olson</author>
<aircraft-version>0.1</aircraft-version>
<startup>
<splash-texture>Aircraft/Rascal/Rascal110-splash.rgb</splash-texture>
</startup>
<flight-model>yasim</flight-model>
<aero>Rascal110-YASim</aero>
<fuel-fraction>0.8</fuel-fraction>
<systems>
<autopilot>
<path>Aircraft/Rascal/Systems/110-autopilot.xml</path>
</autopilot>
<electrical>
<path>Aircraft/Rascal/Systems/electrical.xml</path>
</electrical>
</systems>
<sound>
<path>Aircraft/Generic/generic-sound.xml</path>
</sound>
<panel>
<visibility archive="n">false</visibility>
</panel>
<model>
<path archive="y">Aircraft/Rascal/Models/Rascal110.xml</path>
</model>
<view>
<internal archive="y">true</internal>
<config>
<x-offset-m archive="y">0.0</x-offset-m>
<y-offset-m archive="y">-0.3</y-offset-m>
<z-offset-m archive="y">0.9</z-offset-m>
<pitch-offset-deg>-8</pitch-offset-deg>
</config>
</view>
<help>
<title>Rascal 110 (Sig Mfg)</title>
<line>Cruise speed: 60 mph</line>
<line>Never-exceed (Vne): 85 mph</line>
<line>Best Glide (Vglide): 20 mph</line>
<line>Maneuvering (Va): 50 mph</line>
<line>Approach speed: 15-25 mph</line>
<line>Stall speed (Vs): 10 mph</line>
</help>
</sim>
<yasim>
<Rascal110>
<pilot-lb>2</pilot-lb>
</Rascal110>
</yasim>
<controls>
<flight>
<aileron-trim>-0.01</aileron-trim> <!-- fixed -->
<elevator-trim>0.00</elevator-trim> <!-- controllable -->
<rudder-trim>0.00</rudder-trim> <!-- fixed -->
</flight>
<engines>
<engine n="0">
<magnetos>3</magnetos>
</engine>
</engines>
<door>1.0</door>
</controls>
<engines>
<engine>
<rpm type="double">700</rpm>
</engine>
</engines>
<!-- An autopilot on a Cub??? -->
<autopilot>
<config>
<min-climb-speed-kt type="float">48.0</min-climb-speed-kt>
<best-climb-speed-kt type="float">56.0</best-climb-speed-kt>
<target-climb-rate-fpm type="float">400.0</target-climb-rate-fpm>
<target-descent-rate-fpm type="float">1000.0</target-descent-rate-fpm>
<elevator-adj-factor type="float">6000.0</elevator-adj-factor>
<integral-contribution type="float">0.008</integral-contribution>
<zero-pitch-throttle type="float">0.35</zero-pitch-throttle>
<zero-pitch-trim-full-throttle type="float">0.001</zero-pitch-trim-full-throttle>
</config>
</autopilot>
</PropertyList>
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
var dialog = gui.Dialog.new("/sim/gui/dialogs/rascal/config/dialog",
"Aircraft/Rascal/Dialogs/config.xml");
var last_time = 0.0;
var main_loop = func {
var time = getprop("/sim/time/elapsed-sec");
var dt = time - last_time;
last_time = time;
update_airdata( dt );
update_ugear( dt );
settimer(main_loop, 0);
}
setlistener("/sim/signals/fdm-initialized",
func {
main_loop();
});
This diff is collapsed.
<?xml version="1.0"?>
<initialize name="reset00">
<ubody unit="FT/SEC"> 110.783 </ubody>
<vbody unit="FT/SEC"> 5.03584 </vbody>
<wbody unit="FT/SEC"> -0.226825 </wbody>
<phi unit="DEG"> -2.16197 </phi>
<theta unit="DEG"> -1.06069 </theta>
<psi unit="DEG"> 2.95853 </psi>
<longitude unit="DEG"> 0 </longitude>
<latitude unit="DEG"> 0 </latitude>
<altitude unit="FT"> -0.401227 </altitude>
</initialize>
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment