74 Commits
Author SHA1 Message Date
Kilian 396aa8d807 Initial start on Recorder 2022-10-04 01:24:15 +02:00
Kilian eafe0b18f6 Namespaces and formatting 2022-10-03 23:52:38 +02:00
Kilian 42acea35bb Fix Analyzer error 2022-10-03 02:59:19 +02:00
Kilian 150031c11d Analyzer the Second 2022-10-03 02:41:15 +02:00
Kilian 064474a312 Analysis Commands 2022-10-03 02:34:52 +02:00
Kilian 4b679cec71 Header name change 2022-10-03 02:15:20 +02:00
Kilian 18257e987e ToDo 2022-10-03 02:12:50 +02:00
Kilian 23db85c2a5 Start on SimConnect 2022-10-03 02:05:06 +02:00
Kilian 997586b8aa Initial WIN32 Impl 2022-10-02 02:00:52 +02:00
Kilian bbb0c220e1 More Logbook PHP 2022-09-29 00:33:29 +02:00
Kilian afd63f92ad Primary Logbook PHP 2022-09-28 00:38:15 +02:00
Kilian 174c20bd8f Update XPLM for ARM64 2022-09-27 15:34:46 +02:00
Kilian 40067a606d Include ARM64 2022-09-27 15:13:08 +02:00
Kilian 52da1262b0 Logbokk fligth type 2022-09-25 22:31:05 +02:00
Kilian a50d89f4aa Adjust Header to be non Nul Terminated 2022-09-25 22:16:33 +02:00
Kilian 6e27fc27fb Better PHP Docstring 2022-09-25 01:28:37 +02:00
Kilian f344ffb727 Runway Contains
Logbook Flags
2022-09-25 01:10:01 +02:00
Kilian e677a345e0 Begining of contains 2022-09-25 00:17:17 +02:00
Kilian 46214e9dc3 Header only File Lib 2022-09-24 13:39:26 +02:00
Kilian 9deae93fdd Impl FSUIPC Quad contains 2022-09-24 13:21:07 +02:00
Kilian ace71d7670 Header only SImDatabase 2022-09-24 00:54:34 +02:00
Kilian 488fcb87cc Revert Radians sinec FSUIPC uses Degrees 2022-09-23 22:53:58 +02:00
Kilian 115e4d9265 Migrate to radians instead of degrees to lessen conversion errors 2022-09-23 00:16:52 +02:00
Kilian 07487e9e51 Format 2022-09-11 23:26:28 +02:00
Kilian 46a0607b55 Fix Linux 2022-09-11 21:45:09 +02:00
Kilian de8b282ab1 Fix merge errors 2022-09-11 21:34:26 +02:00
Kilian 6027095c38 Merge branch 'develop' of https://git.hofmannnet.myhome-server.de/GermanAirlines/GermanAirlinesVA-GAConnector into develop 2022-09-11 21:20:13 +02:00
Kilian 2cf03d2933 Refactor SimDatabase 2022-09-11 21:14:46 +02:00
Kilian 161941ac1b REfactor SimDatabase PRODUCES CRASH ON EXIT 2022-09-11 04:31:01 +02:00
Kilian 4445f1f12a Refactor Config 2022-09-10 22:55:04 +02:00
Kilian d6d3c0b4d9 Recording now uses new write 2022-09-10 02:05:38 +02:00
Kilian 94fbc1f558 Runways and Gates now with new read/write 2022-09-10 01:07:00 +02:00
Kilian 2fc2170763 Future proofed file read/write 2022-09-09 23:28:25 +02:00
Kilian 699e2a4784 Consts and references 2022-09-09 20:10:38 +02:00
Kilian b050c23577 Initial Logbook read and write 2022-09-09 02:05:57 +02:00
Kilian a5e23f4b43 Fix linux 2022-09-08 19:10:55 +02:00
Kilian 7d45ca71ba Adjust for new Platform Requirements 2022-09-08 02:20:55 +02:00
Kilian 8b9f5d0406 Start on Logbook 2022-09-08 02:02:09 +02:00
Kilian 2bda541bce PHP Namespacing und Test 2022-09-07 20:32:14 +02:00
Kilian 25c4d8474d Refactor 2022-09-07 03:04:26 +02:00
Kilian 910afad3b5 Fix Recording file format 2022-09-07 02:49:42 +02:00
Kilian 2aa658c15e Refactor 2022-09-06 22:12:32 +02:00
Kilian 3559b124a7 Namespacing and Lib for files 2022-09-06 21:15:01 +02:00
Kilian 2510f4968c Version
Global AP
2022-09-06 16:41:34 +02:00
Kilian 752646c744 Fix linux 2022-09-06 01:16:36 +02:00
Kilian b22a60c85e Namespaces
Better File handling
2022-09-06 00:29:19 +02:00
Kilian 9dcca746ed Reimpl send prot 2022-09-05 17:52:52 +02:00
Kilian 0612afb37b adjust protocoll 2022-09-05 17:45:18 +02:00
Kilian ff179ee3a4 Specify 32 bit SSL 2022-09-05 16:19:59 +02:00
Kilian cd022c8063 System openSSL for linux 2022-09-05 16:04:25 +02:00
Kilian a536a9c918 Remove tlsOptions 2022-09-05 15:33:31 +02:00
Kilian 3dce2ca488 Mutate libs to use default system certs file 2022-09-05 14:59:08 +02:00
Kilian b695f4cb6c Allow non standard cert dir 2022-09-05 14:32:08 +02:00
Kilian 2914e1fa59 SSL Cert dir 2022-09-05 12:27:38 +02:00
Kilian 71656e4a66 Reimplementd IX with OpenSSL 2022-09-05 01:41:09 +02:00
Kilian 5e80c41538 Platform openSSL 2022-09-04 22:15:36 +02:00
Kilian c6ad412df9 Remove bug test 2022-09-04 18:56:48 +02:00
Kilian 0fe7335987 Style, Analyze 2022-09-04 03:06:09 +02:00
Kilian 3b2f146679 Move MakeRwys to own lib 2022-09-04 01:19:50 +02:00
Kilian a820f7456a Remove ixWebSocket 2022-09-04 00:50:49 +02:00
Kilian fbee417594 IX own module 2022-09-02 19:41:26 +02:00
Kilian 7439747876 merge branch 2022-09-02 17:42:48 +02:00
Kilian 27edf28f42 Merge branch 'develop' of https://git.hofmannnet.myhome-server.de/GermanAirlines/GermanAirlinesVA-GAConnector into develop 2022-09-02 17:40:27 +02:00
Kilian ca5aab1344 @rpath in plugin 2022-09-02 17:40:14 +02:00
Kilian d7b765fba5 More recording 2022-01-03 21:37:00 +01:00
Kilian 3ec41a1a19 Begin path recording trials 2022-01-03 18:18:00 +01:00
Kilian 107ae2d6c9 Naming 2022-01-03 17:17:35 +01:00
Kilian 50ea28b78e Total Airports logged 2022-01-03 15:53:32 +01:00
Kilian 0a4e95cd30 Fix windows 2022-01-03 05:16:47 +01:00
Kilian 4b893ca726 Simulator database for X-Plane 2022-01-03 04:56:27 +01:00
Kilian eca1efdf83 Duplicated directory removed 2022-01-02 00:19:41 +01:00
Kilian 61b98ce4e5 Jenkins 2022-01-02 00:06:26 +01:00
Kilian 7a1ac45e29 Ignore 2022-01-01 23:59:25 +01:00
Kilian 0adf122d1d Real Name 2022-01-01 23:50:23 +01:00
424 changed files with 135347 additions and 5 deletions

No files matched your search

+55
View File
@@ -0,0 +1,55 @@
Language: Cpp
AccessModifierOffset: -4
AlignEscapedNewlinesLeft: false
AlignOperands: true
AlignTrailingComments: true
AllowAllArgumentsOnNextLine: false
AllowAllParametersOfDeclarationOnNextLine: false
AlignAfterOpenBracket: Align
AllowShortFunctionsOnASingleLine: true
AllowShortIfStatementsOnASingleLine: false
AllowShortLoopsOnASingleLine: false
AlwaysBreakBeforeMultilineStrings: false
AlwaysBreakTemplateDeclarations: false
BinPackArguments: false
BinPackParameters: false
BreakBeforeBinaryOperators: false
BreakBeforeBraces: Linux
BreakBeforeTernaryOperators: true
BreakConstructorInitializersBeforeComma: false
ColumnLimit: 80
CommentPragmas: "^ IWYU pragma:"
ConstructorInitializerAllOnOneLineOrOnePerLine: false
ConstructorInitializerIndentWidth: 4
ContinuationIndentWidth: 4
Cpp11BracedListStyle: true
DerivePointerBinding: false
ExperimentalAutoDetectBinPacking: false
IndentAccessModifiers: true
IndentCaseLabels: true
IndentFunctionDeclarationAfterType: true
IndentWidth: 2
MaxEmptyLinesToKeep: 2
NamespaceIndentation: Inner
ObjCSpaceAfterProperty: true
ObjCSpaceBeforeProtocolList: true
ObjCBlockIndentWidth: 4
PenaltyBreakBeforeFirstCallParameter: 19
PenaltyBreakComment: 300
PenaltyBreakFirstLessLess: 120
PenaltyBreakString: 1000
PenaltyExcessCharacter: 100000
PenaltyReturnTypeOnItsOwnLine: 60
PointerBindsToType: false
SpaceBeforeAssignmentOperators: true
SpaceBeforeParens: ControlStatements
SpaceInEmptyParentheses: false
SpacesBeforeTrailingComments: 1
SpacesInAngles: false
SpacesInContainerLiterals: true
SpacesInCStyleCastParentheses: false
SpacesInParentheses: false
Standard: c++14
SortIncludes: true
TabWidth: 2
UseTab: Never
+63
View File
@@ -0,0 +1,63 @@
###############################################################################
# Set default behavior to automatically normalize line endings.
###############################################################################
* text=auto
###############################################################################
# Set default behavior for command prompt diff.
#
# This is need for earlier builds of msysgit that does not have it on by
# default for csharp files.
# Note: This is only used by command line
###############################################################################
#*.cs diff=csharp
###############################################################################
# Set the merge driver for project and solution files
#
# Merging from the command prompt will add diff markers to the files if there
# are conflicts (Merging from VS is not affected by the settings below, in VS
# the diff markers are never inserted). Diff markers may cause the following
# file extensions to fail to load in VS. An alternative would be to treat
# these files as binary and thus will always conflict and require user
# intervention with every merge. To do so, just uncomment the entries below
###############################################################################
#*.sln merge=binary
#*.csproj merge=binary
#*.vbproj merge=binary
#*.vcxproj merge=binary
#*.vcproj merge=binary
#*.dbproj merge=binary
#*.fsproj merge=binary
#*.lsproj merge=binary
#*.wixproj merge=binary
#*.modelproj merge=binary
#*.sqlproj merge=binary
#*.wwaproj merge=binary
###############################################################################
# behavior for image files
#
# image files are treated as binary by default.
###############################################################################
#*.jpg binary
#*.png binary
#*.gif binary
###############################################################################
# diff behavior for common document formats
#
# Convert binary document formats to text before diffing them. This feature
# is only available from the command line. Turn it on by uncommenting the
# entries below.
###############################################################################
#*.doc diff=astextplain
#*.DOC diff=astextplain
#*.docx diff=astextplain
#*.DOCX diff=astextplain
#*.dot diff=astextplain
#*.DOT diff=astextplain
#*.pdf diff=astextplain
#*.PDF diff=astextplain
#*.rtf diff=astextplain
#*.RTF diff=astextplain
+366
View File
@@ -0,0 +1,366 @@
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
# User-specific files
*.rsuser
*.suo
*.user
*.userosscache
*.sln.docstates
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Mono auto generated files
mono_crash.*
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
[Ww][Ii][Nn]32/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
[Bb]in/
[Oo]bj/
[Oo]ut/
[Ll]og/
[Ll]ogs/
# Visual Studio 2015/2017 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# Visual Studio 2017 auto generated files
Generated\ Files/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# NUnit
*.VisualState.xml
TestResult.xml
nunit-*.xml
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
# Benchmark Results
BenchmarkDotNet.Artifacts/
# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/
# ASP.NET Scaffolding
ScaffoldingReadMe.txt
# StyleCop
StyleCopReport.xml
# Files built by Visual Studio
*_i.c
*_p.c
*_h.h
*.ilk
*.meta
*.obj
*.iobj
*.pch
*.pdb
*.ipdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*_wpftmp.csproj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap
# Visual Studio Trace Files
*.e2e
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# AxoCover is a Code Coverage Tool
.axoCover/*
!.axoCover/settings.json
# Coverlet is a free, cross platform Code Coverage Tool
coverage*.json
coverage*.xml
coverage*.info
# Visual Studio code coverage results
*.coverage
*.coveragexml
# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj
# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/
# NuGet Packages
*.nupkg
# NuGet Symbol Packages
*.snupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets
# Microsoft Azure Build Output
csx/
*.build.csdef
# Microsoft Azure Emulator
ecf/
rcf/
# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
*.appxbundle
*.appxupload
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!?*.[Cc]ache/
# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs
# Including strong name files can present a security risk
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
#*.snk
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
ServiceFabricBackup/
*.rptproj.bak
# SQL Server files
*.mdf
*.ldf
*.ndf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
*- [Bb]ackup.rdl
*- [Bb]ackup ([0-9]).rdl
*- [Bb]ackup ([0-9][0-9]).rdl
# Microsoft Fakes
FakesAssemblies/
# GhostDoc plugin setting file
*.GhostDoc.xml
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions
# Paket dependency manager
.paket/paket.exe
paket-files/
# FAKE - F# Make
.fake/
# CodeRush personal settings
.cr/personal
# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc
# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config
# Tabs Studio
*.tss
# Telerik's JustMock configuration file
*.jmconfig
# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs
# OpenCover UI analysis results
OpenCover/
# Azure Stream Analytics local run output
ASALocalRun/
# MSBuild Binary and Structured Log
*.binlog
# NVidia Nsight GPU debugger configuration file
*.nvuser
# MFractors (Xamarin productivity tool) working folder
.mfractor/
# Local History for Visual Studio
.localhistory/
# BeatPulse healthcheck temp database
healthchecksdb
# Backup folder for Package Reference Convert tool in Visual Studio 2017
MigrationBackup/
# Ionide (cross platform F# VS Code tools) working folder
.ionide/
# Fody - auto-generated XML schema
FodyWeavers.xsd
# Cmake
build*/
+81
View File
@@ -0,0 +1,81 @@
{
"configurations": [{
"name": "Linux",
"includePath": [
"${workspaceFolder}/**"
],
"defines": [
"LIN",
"XP",
"XPLM200",
"XPLM210"
],
"compilerPath": "/opt/llvm-mingw/bin/clang",
"cStandard": "c11",
"cppStandard": "c++14",
"intelliSenseMode": "linux-clang-x64"
},
{
"name": "Windows",
"includePath": [
"${workspaceFolder}/**"
],
"defines": [
"IBM",
"XP",
"XPLM200",
"XPLM210"
],
"compilerPath": "/opt/llvm-mingw/bin/x86_64-w64-mingw32-clang",
"cStandard": "c11",
"cppStandard": "c++14",
"intelliSenseMode": "windows-clang-x64"
},
{
"name": "Windows ESP 32",
"includePath": [
"${workspaceFolder}/**"
],
"defines": [
"BIT=\"32\"",
"IBM"
],
"compilerPath": "/opt/llvm-mingw/bin/x86_64-w64-mingw32-clang",
"cStandard": "c11",
"cppStandard": "c++14",
"intelliSenseMode": "windows-clang-x64"
},
{
"name": "Windows ESP 64",
"includePath": [
"${workspaceFolder}/**"
],
"defines": [
"BIT=\"64\"",
"IBM",
"MSFS"
],
"compilerPath": "/opt/llvm-mingw/bin/x86_64-w64-mingw32-clang",
"cStandard": "c11",
"cppStandard": "c++14",
"intelliSenseMode": "windows-clang-x64"
},
{
"name": "Mac",
"includePath": [
"${workspaceFolder}/**"
],
"defines": [
"APL",
"XP",
"XPLM200",
"XPLM210"
],
"compilerPath": "/opt/osxcross/target/bin/o64-clang",
"cStandard": "c11",
"cppStandard": "c++14",
"intelliSenseMode": "macos-clang-x64"
}
],
"version": 4
}
+17
View File
@@ -0,0 +1,17 @@
[{
"name": "Clang 13.0.0 Mac",
"toolchainFile": "${workspaceFolder}/toolchain-mac.cmake"
},
{
"name": "Clang 13.0.0 Linux",
"toolchainFile": "${workspaceFolder}/toolchain-lin.cmake"
},
{
"name": "Clang 13.0.0 Windows 32",
"toolchainFile": "${workspaceFolder}/toolchain-win-32.cmake"
},
{
"name": "Clang 13.0.0 Windows 64",
"toolchainFile": "${workspaceFolder}/toolchain-win-64.cmake"
}
]
+91
View File
@@ -0,0 +1,91 @@
{
"cmake.generator": "Unix Makefiles",
"files.associations": {
"algorithm": "cpp",
"array": "cpp",
"atomic": "cpp",
"bit": "cpp",
"*.tcc": "cpp",
"bitset": "cpp",
"cctype": "cpp",
"chrono": "cpp",
"clocale": "cpp",
"cmath": "cpp",
"codecvt": "cpp",
"condition_variable": "cpp",
"cstdarg": "cpp",
"cstddef": "cpp",
"cstdint": "cpp",
"cstdio": "cpp",
"cstdlib": "cpp",
"cstring": "cpp",
"ctime": "cpp",
"cwchar": "cpp",
"cwctype": "cpp",
"deque": "cpp",
"forward_list": "cpp",
"list": "cpp",
"map": "cpp",
"set": "cpp",
"unordered_map": "cpp",
"vector": "cpp",
"exception": "cpp",
"functional": "cpp",
"iterator": "cpp",
"memory": "cpp",
"memory_resource": "cpp",
"numeric": "cpp",
"optional": "cpp",
"random": "cpp",
"ratio": "cpp",
"regex": "cpp",
"string": "cpp",
"string_view": "cpp",
"system_error": "cpp",
"tuple": "cpp",
"type_traits": "cpp",
"utility": "cpp",
"fstream": "cpp",
"future": "cpp",
"initializer_list": "cpp",
"iomanip": "cpp",
"iosfwd": "cpp",
"iostream": "cpp",
"istream": "cpp",
"limits": "cpp",
"mutex": "cpp",
"new": "cpp",
"ostream": "cpp",
"shared_mutex": "cpp",
"sstream": "cpp",
"stdexcept": "cpp",
"streambuf": "cpp",
"thread": "cpp",
"cinttypes": "cpp",
"typeinfo": "cpp",
"valarray": "cpp",
"__threading_support": "cpp",
"__config": "cpp",
"__undef_macros": "cpp",
"ios": "cpp",
"__bit_reference": "cpp",
"__bits": "cpp",
"__debug": "cpp",
"__errc": "cpp",
"__hash_table": "cpp",
"__locale": "cpp",
"__mutex_base": "cpp",
"__node_handle": "cpp",
"__nullptr": "cpp",
"__split_buffer": "cpp",
"__string": "cpp",
"__tree": "cpp",
"__tuple": "cpp",
"compare": "cpp",
"concepts": "cpp",
"locale": "cpp",
"queue": "cpp",
"stack": "cpp",
"variant": "cpp"
},
}
+30
View File
@@ -0,0 +1,30 @@
cmake_minimum_required(VERSION 3.8)
cmake_policy(SET CMP0068 NEW)
project(GermanAirlinesVA_GAConnector C CXX)
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
set(CMAKE_BUILD_WITH_INSTALL_NAME_DIR TRUE)
set(CMAKE_EXPORT_COMPILE_COMMANDS TRUE)
set(PLUGIN_NAME GAConnector)
option(DEBUG "Debug symbols" OFF)
option(XP "X-Plane" OFF)
option(BIT "Bitnes" 64)
option(MSFS "MSFS" OFF)
add_subdirectory(
ixwebsocket
)
if(XP)
add_subdirectory(
xplugin
)
else()
add_subdirectory(
esp
)
endif()
Vendored
+77
View File
@@ -0,0 +1,77 @@
pipeline {
agent any
stages {
stage('Build Windows Debug') {
when {
branch 'develop'
beforeAgent true
}
agent {
docker {
image 'llvm-mingw:latest'
reuseNode true
}
}
environment {
DEBUG = 1
}
steps {
sh 'bash ./build.sh win32'
sh 'analyze-build --verbose --use-analyzer /opt/llvm-mingw/bin/i686-w64-mingw32-clang++ --cdb build/compile_commands.json --output build/Analysis/win32'
sh 'bash ./build.sh win64-ESP'
sh 'analyze-build --verbose --use-analyzer /opt/llvm-mingw/bin/x86_64-w64-mingw32-clang++ --cdb build/compile_commands.json --output build/Analysis/win64-ESP'
sh 'bash ./build.sh win64'
sh 'analyze-build --verbose --use-analyzer /opt/llvm-mingw/bin/x86_64-w64-mingw32-clang++ --cdb build/compile_commands.json --output build/Analysis/win64'
}
}
stage('Build Linux Debug') {
when {
branch 'develop'
beforeAgent true
}
agent {
docker {
image 'llvm:latest'
reuseNode true
}
}
environment {
DEBUG = 1
}
steps {
sh 'bash ./build.sh lin'
sh 'analyze-build --verbose --cdb build/compile_commands.json --output build/Analysis/lin'
}
}
stage('Build MacOSX Debug') {
when {
branch 'develop'
beforeAgent true
}
agent {
docker {
image 'osxcross:latest'
reuseNode true
}
}
environment {
DEBUG = 1
}
steps {
sh 'bash ./build.sh mac'
sh 'analyze-build --verbose --use-analyzer /opt/osxcross/target/bin/o64-clang++ --cdb build/compile_commands.json --output build/Analysis/mac'
}
}
stage('Archive Debug') {
when {
branch 'develop'
}
steps {
zip zipFile: 'X-Plane Debug.zip', archive: true, dir: 'build/X-Plane'
zip zipFile: 'ESP Debug.zip', archive: true, dir: 'build/ESP'
zip zipFile: 'Analysis.zip', archive: true, dir: 'build/Analysis'
sh 'rm -rf build'
}
}
}
}
+8 -5
View File
@@ -1,11 +1,14 @@
### Develop Status
[![Build Status](https://jenkins.hofmannnet.myhome-server.de/job/WebSocketTest/job/develop/badge/icon)](https://jenkins.hofmannnet.myhome-server.de/job/WebSocketTest/job/develop)
[![Build Status](https://jenkins.hofmannnet.myhome-server.de/job/GermanAirlinesVA-GAConnector/job/develop/badge/icon)](https://jenkins.hofmannnet.myhome-server.de/job/GermanAirlinesVA-GAConnector/job/develop)
### Stage Status
[![Build Status](https://jenkins.hofmannnet.myhome-server.de/job/GermanAirlinesVA-GAConnector/job/stage/badge/icon)](https://jenkins.hofmannnet.myhome-server.de/job/GermanAirlinesVA-GAConnector/job/stage)
### Prod Status
[![Build Status](https://jenkins.hofmannnet.myhome-server.de/job/WebSocketTest/job/prod/badge/icon)](https://jenkins.hofmannnet.myhome-server.de/job/WebSocketTest/job/prod)
### Master Status
[![Build Status](https://jenkins.hofmannnet.myhome-server.de/job/WebSocketTest/job/master/badge/icon)](https://jenkins.hofmannnet.myhome-server.de/job/WebSocketTest/job/master)
[![Build Status](https://jenkins.hofmannnet.myhome-server.de/job/GermanAirlinesVA-GAConnector/job/master/badge/icon)](https://jenkins.hofmannnet.myhome-server.de/job/GermanAirlinesVA-GAConnector/job/master)
X-Plane Plugin for all supported platforms.
Demo of WebSocket capabilities
Requirements:
- openSSL 1.1.x
Binary file not shown.
Binary file not shown.
+746
View File
@@ -0,0 +1,746 @@
//-----------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All Rights Reserved.
//
//-----------------------------------------------------------------------------
#ifndef _SIMCONNECT_H_
#define _SIMCONNECT_H_
#pragma once
#ifndef SIMCONNECT_H_NOMANIFEST
#if _MSC_FULL_VER >= 140040130
#ifdef _M_IX86
#pragma comment(linker,"/manifestdependency:\"type='win32' " \
"name='" "Microsoft.FlightSimulator.SimConnect" "' " \
"version='" "10.0.61259.0" "' " \
"processorArchitecture='x86' " \
"publicKeyToken='" "67c7c14424d61b5b" "'\"")
#endif
#endif
#endif //SIMCONNECT_H_NOMANIFEST
#ifndef DWORD_MAX
#define DWORD_MAX 0xFFFFFFFF
#endif
#include <float.h>
typedef DWORD SIMCONNECT_OBJECT_ID;
//----------------------------------------------------------------------------
// Constants
//----------------------------------------------------------------------------
static const DWORD SIMCONNECT_UNUSED = DWORD_MAX; // special value to indicate unused event, ID
static const DWORD SIMCONNECT_OBJECT_ID_USER = 0; // proxy value for User vehicle ObjectID
static const float SIMCONNECT_CAMERA_IGNORE_FIELD = FLT_MAX; //Used to tell the Camera API to NOT modify the value in this part of the argument.
static const DWORD SIMCONNECT_CLIENTDATA_MAX_SIZE = 8192; // maximum value for SimConnect_CreateClientData dwSize parameter
// Notification Group priority values
static const DWORD SIMCONNECT_GROUP_PRIORITY_HIGHEST = 1; // highest priority
static const DWORD SIMCONNECT_GROUP_PRIORITY_HIGHEST_MASKABLE = 10000000; // highest priority that allows events to be masked
static const DWORD SIMCONNECT_GROUP_PRIORITY_STANDARD = 1900000000; // standard priority
static const DWORD SIMCONNECT_GROUP_PRIORITY_DEFAULT = 2000000000; // default priority
static const DWORD SIMCONNECT_GROUP_PRIORITY_LOWEST = 4000000000; // priorities lower than this will be ignored
//Weather observations Metar strings
static const DWORD MAX_METAR_LENGTH = 2000;
// Maximum thermal size is 100 km.
static const float MAX_THERMAL_SIZE = 100000;
static const float MAX_THERMAL_RATE = 1000;
// SIMCONNECT_DATA_INITPOSITION.Airspeed
static const DWORD INITPOSITION_AIRSPEED_CRUISE = -1; // aircraft's cruise airspeed
static const DWORD INITPOSITION_AIRSPEED_KEEP = -2; // keep current airspeed
// AddToClientDataDefinition dwSizeOrType parameter type values
static const DWORD SIMCONNECT_CLIENTDATATYPE_INT8 = -1; // 8-bit integer number
static const DWORD SIMCONNECT_CLIENTDATATYPE_INT16 = -2; // 16-bit integer number
static const DWORD SIMCONNECT_CLIENTDATATYPE_INT32 = -3; // 32-bit integer number
static const DWORD SIMCONNECT_CLIENTDATATYPE_INT64 = -4; // 64-bit integer number
static const DWORD SIMCONNECT_CLIENTDATATYPE_FLOAT32 = -5; // 32-bit floating-point number (float)
static const DWORD SIMCONNECT_CLIENTDATATYPE_FLOAT64 = -6; // 64-bit floating-point number (double)
// AddToClientDataDefinition dwOffset parameter special values
static const DWORD SIMCONNECT_CLIENTDATAOFFSET_AUTO = -1; // automatically compute offset of the ClientData variable
// Open ConfigIndex parameter special value
static const DWORD SIMCONNECT_OPEN_CONFIGINDEX_LOCAL = -1; // ignore SimConnect.cfg settings, and force local connection
//----------------------------------------------------------------------------
// Enum definitions
//----------------------------------------------------------------------------
// Receive data types
enum SIMCONNECT_RECV_ID {
SIMCONNECT_RECV_ID_NULL,
SIMCONNECT_RECV_ID_EXCEPTION,
SIMCONNECT_RECV_ID_OPEN,
SIMCONNECT_RECV_ID_QUIT,
SIMCONNECT_RECV_ID_EVENT,
SIMCONNECT_RECV_ID_EVENT_OBJECT_ADDREMOVE,
SIMCONNECT_RECV_ID_EVENT_FILENAME,
SIMCONNECT_RECV_ID_EVENT_FRAME,
SIMCONNECT_RECV_ID_SIMOBJECT_DATA,
SIMCONNECT_RECV_ID_SIMOBJECT_DATA_BYTYPE,
SIMCONNECT_RECV_ID_WEATHER_OBSERVATION,
SIMCONNECT_RECV_ID_CLOUD_STATE,
SIMCONNECT_RECV_ID_ASSIGNED_OBJECT_ID,
SIMCONNECT_RECV_ID_RESERVED_KEY,
SIMCONNECT_RECV_ID_CUSTOM_ACTION,
SIMCONNECT_RECV_ID_SYSTEM_STATE,
SIMCONNECT_RECV_ID_CLIENT_DATA,
SIMCONNECT_RECV_ID_EVENT_WEATHER_MODE,
SIMCONNECT_RECV_ID_AIRPORT_LIST,
SIMCONNECT_RECV_ID_VOR_LIST,
SIMCONNECT_RECV_ID_NDB_LIST,
SIMCONNECT_RECV_ID_WAYPOINT_LIST,
SIMCONNECT_RECV_ID_EVENT_MULTIPLAYER_SERVER_STARTED,
SIMCONNECT_RECV_ID_EVENT_MULTIPLAYER_CLIENT_STARTED,
SIMCONNECT_RECV_ID_EVENT_MULTIPLAYER_SESSION_ENDED,
SIMCONNECT_RECV_ID_EVENT_RACE_END,
SIMCONNECT_RECV_ID_EVENT_RACE_LAP,
};
// Data data types
enum SIMCONNECT_DATATYPE {
SIMCONNECT_DATATYPE_INVALID, // invalid data type
SIMCONNECT_DATATYPE_INT32, // 32-bit integer number
SIMCONNECT_DATATYPE_INT64, // 64-bit integer number
SIMCONNECT_DATATYPE_FLOAT32, // 32-bit floating-point number (float)
SIMCONNECT_DATATYPE_FLOAT64, // 64-bit floating-point number (double)
SIMCONNECT_DATATYPE_STRING8, // 8-byte string
SIMCONNECT_DATATYPE_STRING32, // 32-byte string
SIMCONNECT_DATATYPE_STRING64, // 64-byte string
SIMCONNECT_DATATYPE_STRING128, // 128-byte string
SIMCONNECT_DATATYPE_STRING256, // 256-byte string
SIMCONNECT_DATATYPE_STRING260, // 260-byte string
SIMCONNECT_DATATYPE_STRINGV, // variable-length string
SIMCONNECT_DATATYPE_INITPOSITION, // see SIMCONNECT_DATA_INITPOSITION
SIMCONNECT_DATATYPE_MARKERSTATE, // see SIMCONNECT_DATA_MARKERSTATE
SIMCONNECT_DATATYPE_WAYPOINT, // see SIMCONNECT_DATA_WAYPOINT
SIMCONNECT_DATATYPE_LATLONALT, // see SIMCONNECT_DATA_LATLONALT
SIMCONNECT_DATATYPE_XYZ, // see SIMCONNECT_DATA_XYZ
SIMCONNECT_DATATYPE_MAX // enum limit
};
// Exception error types
enum SIMCONNECT_EXCEPTION {
SIMCONNECT_EXCEPTION_NONE,
SIMCONNECT_EXCEPTION_ERROR,
SIMCONNECT_EXCEPTION_SIZE_MISMATCH,
SIMCONNECT_EXCEPTION_UNRECOGNIZED_ID,
SIMCONNECT_EXCEPTION_UNOPENED,
SIMCONNECT_EXCEPTION_VERSION_MISMATCH,
SIMCONNECT_EXCEPTION_TOO_MANY_GROUPS,
SIMCONNECT_EXCEPTION_NAME_UNRECOGNIZED,
SIMCONNECT_EXCEPTION_TOO_MANY_EVENT_NAMES,
SIMCONNECT_EXCEPTION_EVENT_ID_DUPLICATE,
SIMCONNECT_EXCEPTION_TOO_MANY_MAPS,
SIMCONNECT_EXCEPTION_TOO_MANY_OBJECTS,
SIMCONNECT_EXCEPTION_TOO_MANY_REQUESTS,
SIMCONNECT_EXCEPTION_WEATHER_INVALID_PORT,
SIMCONNECT_EXCEPTION_WEATHER_INVALID_METAR,
SIMCONNECT_EXCEPTION_WEATHER_UNABLE_TO_GET_OBSERVATION,
SIMCONNECT_EXCEPTION_WEATHER_UNABLE_TO_CREATE_STATION,
SIMCONNECT_EXCEPTION_WEATHER_UNABLE_TO_REMOVE_STATION,
SIMCONNECT_EXCEPTION_INVALID_DATA_TYPE,
SIMCONNECT_EXCEPTION_INVALID_DATA_SIZE,
SIMCONNECT_EXCEPTION_DATA_ERROR,
SIMCONNECT_EXCEPTION_INVALID_ARRAY,
SIMCONNECT_EXCEPTION_CREATE_OBJECT_FAILED,
SIMCONNECT_EXCEPTION_LOAD_FLIGHTPLAN_FAILED,
SIMCONNECT_EXCEPTION_OPERATION_INVALID_FOR_OBJECT_TYPE,
SIMCONNECT_EXCEPTION_ILLEGAL_OPERATION,
SIMCONNECT_EXCEPTION_ALREADY_SUBSCRIBED,
SIMCONNECT_EXCEPTION_INVALID_ENUM,
SIMCONNECT_EXCEPTION_DEFINITION_ERROR,
SIMCONNECT_EXCEPTION_DUPLICATE_ID,
SIMCONNECT_EXCEPTION_DATUM_ID,
SIMCONNECT_EXCEPTION_OUT_OF_BOUNDS,
SIMCONNECT_EXCEPTION_ALREADY_CREATED,
SIMCONNECT_EXCEPTION_OBJECT_OUTSIDE_REALITY_BUBBLE,
SIMCONNECT_EXCEPTION_OBJECT_CONTAINER,
SIMCONNECT_EXCEPTION_OBJECT_AI,
SIMCONNECT_EXCEPTION_OBJECT_ATC,
SIMCONNECT_EXCEPTION_OBJECT_SCHEDULE,
};
// Object types
enum SIMCONNECT_SIMOBJECT_TYPE {
SIMCONNECT_SIMOBJECT_TYPE_USER,
SIMCONNECT_SIMOBJECT_TYPE_ALL,
SIMCONNECT_SIMOBJECT_TYPE_AIRCRAFT,
SIMCONNECT_SIMOBJECT_TYPE_HELICOPTER,
SIMCONNECT_SIMOBJECT_TYPE_BOAT,
SIMCONNECT_SIMOBJECT_TYPE_GROUND,
};
// EventState values
enum SIMCONNECT_STATE {
SIMCONNECT_STATE_OFF,
SIMCONNECT_STATE_ON,
};
// Object Data Request Period values
enum SIMCONNECT_PERIOD {
SIMCONNECT_PERIOD_NEVER,
SIMCONNECT_PERIOD_ONCE,
SIMCONNECT_PERIOD_VISUAL_FRAME,
SIMCONNECT_PERIOD_SIM_FRAME,
SIMCONNECT_PERIOD_SECOND,
};
enum SIMCONNECT_MISSION_END {
SIMCONNECT_MISSION_FAILED,
SIMCONNECT_MISSION_CRASHED,
SIMCONNECT_MISSION_SUCCEEDED
};
// ClientData Request Period values
enum SIMCONNECT_CLIENT_DATA_PERIOD {
SIMCONNECT_CLIENT_DATA_PERIOD_NEVER,
SIMCONNECT_CLIENT_DATA_PERIOD_ONCE,
SIMCONNECT_CLIENT_DATA_PERIOD_VISUAL_FRAME,
SIMCONNECT_CLIENT_DATA_PERIOD_ON_SET,
SIMCONNECT_CLIENT_DATA_PERIOD_SECOND,
};
enum SIMCONNECT_TEXT_TYPE {
SIMCONNECT_TEXT_TYPE_SCROLL_BLACK,
SIMCONNECT_TEXT_TYPE_SCROLL_WHITE,
SIMCONNECT_TEXT_TYPE_SCROLL_RED,
SIMCONNECT_TEXT_TYPE_SCROLL_GREEN,
SIMCONNECT_TEXT_TYPE_SCROLL_BLUE,
SIMCONNECT_TEXT_TYPE_SCROLL_YELLOW,
SIMCONNECT_TEXT_TYPE_SCROLL_MAGENTA,
SIMCONNECT_TEXT_TYPE_SCROLL_CYAN,
SIMCONNECT_TEXT_TYPE_PRINT_BLACK=0x0100,
SIMCONNECT_TEXT_TYPE_PRINT_WHITE,
SIMCONNECT_TEXT_TYPE_PRINT_RED,
SIMCONNECT_TEXT_TYPE_PRINT_GREEN,
SIMCONNECT_TEXT_TYPE_PRINT_BLUE,
SIMCONNECT_TEXT_TYPE_PRINT_YELLOW,
SIMCONNECT_TEXT_TYPE_PRINT_MAGENTA,
SIMCONNECT_TEXT_TYPE_PRINT_CYAN,
SIMCONNECT_TEXT_TYPE_MENU=0x0200,
};
enum SIMCONNECT_TEXT_RESULT {
SIMCONNECT_TEXT_RESULT_MENU_SELECT_1,
SIMCONNECT_TEXT_RESULT_MENU_SELECT_2,
SIMCONNECT_TEXT_RESULT_MENU_SELECT_3,
SIMCONNECT_TEXT_RESULT_MENU_SELECT_4,
SIMCONNECT_TEXT_RESULT_MENU_SELECT_5,
SIMCONNECT_TEXT_RESULT_MENU_SELECT_6,
SIMCONNECT_TEXT_RESULT_MENU_SELECT_7,
SIMCONNECT_TEXT_RESULT_MENU_SELECT_8,
SIMCONNECT_TEXT_RESULT_MENU_SELECT_9,
SIMCONNECT_TEXT_RESULT_MENU_SELECT_10,
SIMCONNECT_TEXT_RESULT_DISPLAYED = 0x00010000,
SIMCONNECT_TEXT_RESULT_QUEUED,
SIMCONNECT_TEXT_RESULT_REMOVED,
SIMCONNECT_TEXT_RESULT_REPLACED,
SIMCONNECT_TEXT_RESULT_TIMEOUT,
};
enum SIMCONNECT_WEATHER_MODE {
SIMCONNECT_WEATHER_MODE_THEME,
SIMCONNECT_WEATHER_MODE_RWW,
SIMCONNECT_WEATHER_MODE_CUSTOM,
SIMCONNECT_WEATHER_MODE_GLOBAL,
};
enum SIMCONNECT_FACILITY_LIST_TYPE {
SIMCONNECT_FACILITY_LIST_TYPE_AIRPORT,
SIMCONNECT_FACILITY_LIST_TYPE_WAYPOINT,
SIMCONNECT_FACILITY_LIST_TYPE_NDB,
SIMCONNECT_FACILITY_LIST_TYPE_VOR,
SIMCONNECT_FACILITY_LIST_TYPE_COUNT // invalid
};
typedef DWORD SIMCONNECT_VOR_FLAGS; // flags for SIMCONNECT_RECV_ID_VOR_LIST
static const DWORD SIMCONNECT_RECV_ID_VOR_LIST_HAS_NAV_SIGNAL = 0x00000001; // Has Nav signal
static const DWORD SIMCONNECT_RECV_ID_VOR_LIST_HAS_LOCALIZER = 0x00000002; // Has localizer
static const DWORD SIMCONNECT_RECV_ID_VOR_LIST_HAS_GLIDE_SLOPE = 0x00000004; // Has Nav signal
static const DWORD SIMCONNECT_RECV_ID_VOR_LIST_HAS_DME = 0x00000008; // Station has DME
// bits for the Waypoint Flags field: may be combined
typedef DWORD SIMCONNECT_WAYPOINT_FLAGS;
static const DWORD SIMCONNECT_WAYPOINT_NONE = 0x00;
static const DWORD SIMCONNECT_WAYPOINT_SPEED_REQUESTED = 0x04; // requested speed at waypoint is valid
static const DWORD SIMCONNECT_WAYPOINT_THROTTLE_REQUESTED = 0x08; // request a specific throttle percentage
static const DWORD SIMCONNECT_WAYPOINT_COMPUTE_VERTICAL_SPEED = 0x10; // compute vertical to speed to reach waypoint altitude when crossing the waypoint
static const DWORD SIMCONNECT_WAYPOINT_ALTITUDE_IS_AGL = 0x20; // AltitudeIsAGL
static const DWORD SIMCONNECT_WAYPOINT_ON_GROUND = 0x00100000; // place this waypoint on the ground
static const DWORD SIMCONNECT_WAYPOINT_REVERSE = 0x00200000; // Back up to this waypoint. Only valid on first waypoint
static const DWORD SIMCONNECT_WAYPOINT_WRAP_TO_FIRST = 0x00400000; // Wrap around back to first waypoint. Only valid on last waypoint.
typedef DWORD SIMCONNECT_EVENT_FLAG;
static const DWORD SIMCONNECT_EVENT_FLAG_DEFAULT = 0x00000000;
static const DWORD SIMCONNECT_EVENT_FLAG_FAST_REPEAT_TIMER = 0x00000001; // set event repeat timer to simulate fast repeat
static const DWORD SIMCONNECT_EVENT_FLAG_SLOW_REPEAT_TIMER = 0x00000002; // set event repeat timer to simulate slow repeat
static const DWORD SIMCONNECT_EVENT_FLAG_GROUPID_IS_PRIORITY = 0x00000010; // interpret GroupID parameter as priority value
typedef DWORD SIMCONNECT_DATA_REQUEST_FLAG;
static const DWORD SIMCONNECT_DATA_REQUEST_FLAG_DEFAULT = 0x00000000;
static const DWORD SIMCONNECT_DATA_REQUEST_FLAG_CHANGED = 0x00000001; // send requested data when value(s) change
static const DWORD SIMCONNECT_DATA_REQUEST_FLAG_TAGGED = 0x00000002; // send requested data in tagged format
typedef DWORD SIMCONNECT_DATA_SET_FLAG;
static const DWORD SIMCONNECT_DATA_SET_FLAG_DEFAULT = 0x00000000;
static const DWORD SIMCONNECT_DATA_SET_FLAG_TAGGED = 0x00000001; // data is in tagged format
typedef DWORD SIMCONNECT_CREATE_CLIENT_DATA_FLAG;
static const DWORD SIMCONNECT_CREATE_CLIENT_DATA_FLAG_DEFAULT = 0x00000000;
static const DWORD SIMCONNECT_CREATE_CLIENT_DATA_FLAG_READ_ONLY = 0x00000001; // permit only ClientData creator to write into ClientData
typedef DWORD SIMCONNECT_CLIENT_DATA_REQUEST_FLAG;
static const DWORD SIMCONNECT_CLIENT_DATA_REQUEST_FLAG_DEFAULT = 0x00000000;
static const DWORD SIMCONNECT_CLIENT_DATA_REQUEST_FLAG_CHANGED = 0x00000001; // send requested ClientData when value(s) change
static const DWORD SIMCONNECT_CLIENT_DATA_REQUEST_FLAG_TAGGED = 0x00000002; // send requested ClientData in tagged format
typedef DWORD SIMCONNECT_CLIENT_DATA_SET_FLAG;
static const DWORD SIMCONNECT_CLIENT_DATA_SET_FLAG_DEFAULT = 0x00000000;
static const DWORD SIMCONNECT_CLIENT_DATA_SET_FLAG_TAGGED = 0x00000001; // data is in tagged format
typedef DWORD SIMCONNECT_VIEW_SYSTEM_EVENT_DATA; // dwData contains these flags for the "View" System Event
static const DWORD SIMCONNECT_VIEW_SYSTEM_EVENT_DATA_COCKPIT_2D = 0x00000001; // 2D Panels in cockpit view
static const DWORD SIMCONNECT_VIEW_SYSTEM_EVENT_DATA_COCKPIT_VIRTUAL = 0x00000002; // Virtual (3D) panels in cockpit view
static const DWORD SIMCONNECT_VIEW_SYSTEM_EVENT_DATA_ORTHOGONAL = 0x00000004; // Orthogonal (Map) view
typedef DWORD SIMCONNECT_SOUND_SYSTEM_EVENT_DATA; // dwData contains these flags for the "Sound" System Event
static const DWORD SIMCONNECT_SOUND_SYSTEM_EVENT_DATA_MASTER = 0x00000001; // Sound Master
//----------------------------------------------------------------------------
// User-defined enums
//----------------------------------------------------------------------------
typedef DWORD SIMCONNECT_NOTIFICATION_GROUP_ID; //client-defined notification group ID
typedef DWORD SIMCONNECT_INPUT_GROUP_ID; //client-defined input group ID
typedef DWORD SIMCONNECT_DATA_DEFINITION_ID; //client-defined data definition ID
typedef DWORD SIMCONNECT_DATA_REQUEST_ID; //client-defined request data ID
typedef DWORD SIMCONNECT_CLIENT_EVENT_ID; //client-defined client event ID
typedef DWORD SIMCONNECT_CLIENT_DATA_ID; //client-defined client data ID
typedef DWORD SIMCONNECT_CLIENT_DATA_DEFINITION_ID; //client-defined client data definition ID
//----------------------------------------------------------------------------
// Struct definitions
//----------------------------------------------------------------------------
#pragma pack(push, 1)
struct SIMCONNECT_RECV
{
DWORD dwSize; // record size
DWORD dwVersion; // interface version
DWORD dwID; // see SIMCONNECT_RECV_ID
};
struct SIMCONNECT_RECV_EXCEPTION : public SIMCONNECT_RECV // when dwID == SIMCONNECT_RECV_ID_EXCEPTION
{
DWORD dwException; // see SIMCONNECT_EXCEPTION
static const DWORD UNKNOWN_SENDID = 0;
DWORD dwSendID; // see SimConnect_GetLastSentPacketID
static const DWORD UNKNOWN_INDEX = DWORD_MAX;
DWORD dwIndex; // index of parameter that was source of error
};
struct SIMCONNECT_RECV_OPEN : public SIMCONNECT_RECV // when dwID == SIMCONNECT_RECV_ID_OPEN
{
char szApplicationName[256];
DWORD dwApplicationVersionMajor;
DWORD dwApplicationVersionMinor;
DWORD dwApplicationBuildMajor;
DWORD dwApplicationBuildMinor;
DWORD dwSimConnectVersionMajor;
DWORD dwSimConnectVersionMinor;
DWORD dwSimConnectBuildMajor;
DWORD dwSimConnectBuildMinor;
DWORD dwReserved1;
DWORD dwReserved2;
};
struct SIMCONNECT_RECV_QUIT : public SIMCONNECT_RECV // when dwID == SIMCONNECT_RECV_ID_QUIT
{
};
struct SIMCONNECT_RECV_EVENT : public SIMCONNECT_RECV // when dwID == SIMCONNECT_RECV_ID_EVENT
{
static const DWORD UNKNOWN_GROUP = DWORD_MAX;
DWORD uGroupID;
DWORD uEventID;
DWORD dwData; // uEventID-dependent context
};
struct SIMCONNECT_RECV_EVENT_FILENAME : public SIMCONNECT_RECV_EVENT // when dwID == SIMCONNECT_RECV_ID_EVENT_FILENAME
{
char szFileName[MAX_PATH]; // uEventID-dependent context
DWORD dwFlags;
};
struct SIMCONNECT_RECV_EVENT_OBJECT_ADDREMOVE : public SIMCONNECT_RECV_EVENT // when dwID == SIMCONNECT_RECV_ID_EVENT_FILENAME
{
SIMCONNECT_SIMOBJECT_TYPE eObjType;
};
struct SIMCONNECT_RECV_EVENT_FRAME : public SIMCONNECT_RECV_EVENT // when dwID == SIMCONNECT_RECV_ID_EVENT_FRAME
{
float fFrameRate;
float fSimSpeed;
};
struct SIMCONNECT_RECV_EVENT_MULTIPLAYER_SERVER_STARTED : public SIMCONNECT_RECV_EVENT // when dwID == SIMCONNECT_RECV_ID_EVENT_MULTIPLAYER_SERVER_STARTED
{
// No event specific data, for now
};
struct SIMCONNECT_RECV_EVENT_MULTIPLAYER_CLIENT_STARTED : public SIMCONNECT_RECV_EVENT // when dwID == SIMCONNECT_RECV_ID_EVENT_MULTIPLAYER_CLIENT_STARTED
{
// No event specific data, for now
};
struct SIMCONNECT_RECV_EVENT_MULTIPLAYER_SESSION_ENDED : public SIMCONNECT_RECV_EVENT // when dwID == SIMCONNECT_RECV_ID_EVENT_MULTIPLAYER_SESSION_ENDED
{
// No event specific data, for now
};
// SIMCONNECT_DATA_RACE_RESULT
struct SIMCONNECT_DATA_RACE_RESULT
{
DWORD dwNumberOfRacers; // The total number of racers
GUID MissionGUID; // The name of the mission to execute, NULL if no mission
char szPlayerName[MAX_PATH]; // The name of the player
char szSessionType[MAX_PATH]; // The type of the multiplayer session: "LAN", "GAMESPY")
char szAircraft[MAX_PATH]; // The aircraft type
char szPlayerRole[MAX_PATH]; // The player role in the mission
double fTotalTime; // Total time in seconds, 0 means DNF
double fPenaltyTime; // Total penalty time in seconds
DWORD dwIsDisqualified; // non 0 - disqualified, 0 - not disqualified
};
struct SIMCONNECT_RECV_EVENT_RACE_END : public SIMCONNECT_RECV_EVENT // when dwID == SIMCONNECT_RECV_ID_EVENT_RACE_END
{
DWORD dwRacerNumber; // The index of the racer the results are for
SIMCONNECT_DATA_RACE_RESULT RacerData;
};
struct SIMCONNECT_RECV_EVENT_RACE_LAP : public SIMCONNECT_RECV_EVENT // when dwID == SIMCONNECT_RECV_ID_EVENT_RACE_LAP
{
DWORD dwLapIndex; // The index of the lap the results are for
SIMCONNECT_DATA_RACE_RESULT RacerData;
};
struct SIMCONNECT_RECV_SIMOBJECT_DATA : public SIMCONNECT_RECV // when dwID == SIMCONNECT_RECV_ID_SIMOBJECT_DATA
{
DWORD dwRequestID;
DWORD dwObjectID;
DWORD dwDefineID;
DWORD dwFlags; // SIMCONNECT_DATA_REQUEST_FLAG
DWORD dwentrynumber; // if multiple objects returned, this is number <entrynumber> out of <outof>.
DWORD dwoutof; // note: starts with 1, not 0.
DWORD dwDefineCount; // data count (number of datums, *not* byte count)
DWORD dwData; // data begins here, dwDefineCount data items
};
struct SIMCONNECT_RECV_SIMOBJECT_DATA_BYTYPE : public SIMCONNECT_RECV_SIMOBJECT_DATA // when dwID == SIMCONNECT_RECV_ID_SIMOBJECT_DATA_BYTYPE
{
};
struct SIMCONNECT_RECV_CLIENT_DATA : public SIMCONNECT_RECV_SIMOBJECT_DATA // when dwID == SIMCONNECT_RECV_ID_CLIENT_DATA
{
};
struct SIMCONNECT_RECV_WEATHER_OBSERVATION : public SIMCONNECT_RECV // when dwID == SIMCONNECT_RECV_ID_WEATHER_OBSERVATION
{
DWORD dwRequestID;
char szMetar[1]; // Variable length string whose maximum size is MAX_METAR_LENGTH
};
static const int SIMCONNECT_CLOUD_STATE_ARRAY_WIDTH = 64;
static const int SIMCONNECT_CLOUD_STATE_ARRAY_SIZE = SIMCONNECT_CLOUD_STATE_ARRAY_WIDTH*SIMCONNECT_CLOUD_STATE_ARRAY_WIDTH;
struct SIMCONNECT_RECV_CLOUD_STATE : public SIMCONNECT_RECV // when dwID == SIMCONNECT_RECV_ID_CLOUD_STATE
{
DWORD dwRequestID;
DWORD dwArraySize;
BYTE rgbData[1];
};
struct SIMCONNECT_RECV_ASSIGNED_OBJECT_ID : public SIMCONNECT_RECV // when dwID == SIMCONNECT_RECV_ID_ASSIGNED_OBJECT_ID
{
DWORD dwRequestID;
DWORD dwObjectID;
};
struct SIMCONNECT_RECV_RESERVED_KEY : public SIMCONNECT_RECV // when dwID == SIMCONNECT_RECV_ID_RESERVED_KEY
{
char szChoiceReserved[30];
char szReservedKey[50];
};
struct SIMCONNECT_RECV_SYSTEM_STATE : public SIMCONNECT_RECV // when dwID == SIMCONNECT_RECV_ID_SYSTEM_STATE
{
DWORD dwRequestID;
DWORD dwInteger;
float fFloat;
char szString[MAX_PATH];
};
struct SIMCONNECT_RECV_CUSTOM_ACTION : public SIMCONNECT_RECV_EVENT
{
GUID guidInstanceId; // Instance id of the action that executed
DWORD dwWaitForCompletion; // Wait for completion flag on the action
char szPayLoad[1]; // Variable length string payload associated with the mission action.
};
struct SIMCONNECT_RECV_EVENT_WEATHER_MODE : public SIMCONNECT_RECV_EVENT
{
// No event specific data - the new weather mode is in the base structure dwData member.
};
// SIMCONNECT_RECV_FACILITIES_LIST
struct SIMCONNECT_RECV_FACILITIES_LIST : public SIMCONNECT_RECV
{
DWORD dwRequestID;
DWORD dwArraySize;
DWORD dwEntryNumber; // when the array of items is too big for one send, which send this is (0..dwOutOf-1)
DWORD dwOutOf; // total number of transmissions the list is chopped into
};
// SIMCONNECT_DATA_FACILITY_AIRPORT
struct SIMCONNECT_DATA_FACILITY_AIRPORT
{
char Icao[9]; // ICAO of the object
double Latitude; // degrees
double Longitude; // degrees
double Altitude; // meters
};
// SIMCONNECT_RECV_AIRPORT_LIST
struct SIMCONNECT_RECV_AIRPORT_LIST : public SIMCONNECT_RECV_FACILITIES_LIST
{
SIMCONNECT_DATA_FACILITY_AIRPORT rgData[1];
};
// SIMCONNECT_DATA_FACILITY_WAYPOINT
struct SIMCONNECT_DATA_FACILITY_WAYPOINT : public SIMCONNECT_DATA_FACILITY_AIRPORT
{
float fMagVar; // Magvar in degrees
};
// SIMCONNECT_RECV_WAYPOINT_LIST
struct SIMCONNECT_RECV_WAYPOINT_LIST : public SIMCONNECT_RECV_FACILITIES_LIST
{
SIMCONNECT_DATA_FACILITY_WAYPOINT rgData[1];
};
// SIMCONNECT_DATA_FACILITY_NDB
struct SIMCONNECT_DATA_FACILITY_NDB : public SIMCONNECT_DATA_FACILITY_WAYPOINT
{
DWORD fFrequency; // frequency in Hz
};
// SIMCONNECT_RECV_NDB_LIST
struct SIMCONNECT_RECV_NDB_LIST : public SIMCONNECT_RECV_FACILITIES_LIST
{
SIMCONNECT_DATA_FACILITY_NDB rgData[1];
};
// SIMCONNECT_DATA_FACILITY_VOR
struct SIMCONNECT_DATA_FACILITY_VOR : public SIMCONNECT_DATA_FACILITY_NDB
{
DWORD Flags; // SIMCONNECT_VOR_FLAGS
float fLocalizer; // Localizer in degrees
double GlideLat; // Glide Slope Location (deg, deg, meters)
double GlideLon;
double GlideAlt;
float fGlideSlopeAngle; // Glide Slope in degrees
};
// SIMCONNECT_RECV_VOR_LIST
struct SIMCONNECT_RECV_VOR_LIST : public SIMCONNECT_RECV_FACILITIES_LIST
{
SIMCONNECT_DATA_FACILITY_VOR rgData[1];
};
// SIMCONNECT_DATATYPE_INITPOSITION
struct SIMCONNECT_DATA_INITPOSITION
{
double Latitude; // degrees
double Longitude; // degrees
double Altitude; // feet
double Pitch; // degrees
double Bank; // degrees
double Heading; // degrees
DWORD OnGround; // 1=force to be on the ground
DWORD Airspeed; // knots
};
// SIMCONNECT_DATATYPE_MARKERSTATE
struct SIMCONNECT_DATA_MARKERSTATE
{
char szMarkerName[64];
DWORD dwMarkerState;
};
// SIMCONNECT_DATATYPE_WAYPOINT
struct SIMCONNECT_DATA_WAYPOINT
{
double Latitude; // degrees
double Longitude; // degrees
double Altitude; // feet
unsigned long Flags;
double ktsSpeed; // knots
double percentThrottle;
};
// SIMCONNECT_DATA_LATLONALT
struct SIMCONNECT_DATA_LATLONALT
{
double Latitude;
double Longitude;
double Altitude;
};
// SIMCONNECT_DATA_XYZ
struct SIMCONNECT_DATA_XYZ
{
double x;
double y;
double z;
};
#pragma pack(pop)
//----------------------------------------------------------------------------
// End of Struct definitions
//----------------------------------------------------------------------------
#if !defined(SIMCONNECTAPI)
#define SIMCONNECTAPI extern "C" HRESULT __stdcall
#endif
typedef void (CALLBACK *DispatchProc)(SIMCONNECT_RECV* pData, DWORD cbData, void* pContext);
SIMCONNECTAPI SimConnect_MapClientEventToSimEvent(HANDLE hSimConnect, SIMCONNECT_CLIENT_EVENT_ID EventID, const char * EventName = "");
SIMCONNECTAPI SimConnect_TransmitClientEvent(HANDLE hSimConnect, SIMCONNECT_OBJECT_ID ObjectID, SIMCONNECT_CLIENT_EVENT_ID EventID, DWORD dwData, SIMCONNECT_NOTIFICATION_GROUP_ID GroupID, SIMCONNECT_EVENT_FLAG Flags);
SIMCONNECTAPI SimConnect_SetSystemEventState(HANDLE hSimConnect, SIMCONNECT_CLIENT_EVENT_ID EventID, SIMCONNECT_STATE dwState);
SIMCONNECTAPI SimConnect_AddClientEventToNotificationGroup(HANDLE hSimConnect, SIMCONNECT_NOTIFICATION_GROUP_ID GroupID, SIMCONNECT_CLIENT_EVENT_ID EventID, BOOL bMaskable = FALSE);
SIMCONNECTAPI SimConnect_RemoveClientEvent(HANDLE hSimConnect, SIMCONNECT_NOTIFICATION_GROUP_ID GroupID, SIMCONNECT_CLIENT_EVENT_ID EventID);
SIMCONNECTAPI SimConnect_SetNotificationGroupPriority(HANDLE hSimConnect, SIMCONNECT_NOTIFICATION_GROUP_ID GroupID, DWORD uPriority);
SIMCONNECTAPI SimConnect_ClearNotificationGroup(HANDLE hSimConnect, SIMCONNECT_NOTIFICATION_GROUP_ID GroupID);
SIMCONNECTAPI SimConnect_RequestNotificationGroup(HANDLE hSimConnect, SIMCONNECT_NOTIFICATION_GROUP_ID GroupID, DWORD dwReserved = 0, DWORD Flags = 0);
SIMCONNECTAPI SimConnect_AddToDataDefinition(HANDLE hSimConnect, SIMCONNECT_DATA_DEFINITION_ID DefineID, const char * DatumName, const char * UnitsName, SIMCONNECT_DATATYPE DatumType = SIMCONNECT_DATATYPE_FLOAT64, float fEpsilon = 0, DWORD DatumID = SIMCONNECT_UNUSED);
SIMCONNECTAPI SimConnect_ClearDataDefinition(HANDLE hSimConnect, SIMCONNECT_DATA_DEFINITION_ID DefineID);
SIMCONNECTAPI SimConnect_RequestDataOnSimObject(HANDLE hSimConnect, SIMCONNECT_DATA_REQUEST_ID RequestID, SIMCONNECT_DATA_DEFINITION_ID DefineID, SIMCONNECT_OBJECT_ID ObjectID, SIMCONNECT_PERIOD Period, SIMCONNECT_DATA_REQUEST_FLAG Flags = 0, DWORD origin = 0, DWORD interval = 0, DWORD limit = 0);
SIMCONNECTAPI SimConnect_RequestDataOnSimObjectType(HANDLE hSimConnect, SIMCONNECT_DATA_REQUEST_ID RequestID, SIMCONNECT_DATA_DEFINITION_ID DefineID, DWORD dwRadiusMeters, SIMCONNECT_SIMOBJECT_TYPE type);
SIMCONNECTAPI SimConnect_SetDataOnSimObject(HANDLE hSimConnect, SIMCONNECT_DATA_DEFINITION_ID DefineID, SIMCONNECT_OBJECT_ID ObjectID, SIMCONNECT_DATA_SET_FLAG Flags, DWORD ArrayCount, DWORD cbUnitSize, void * pDataSet);
SIMCONNECTAPI SimConnect_MapInputEventToClientEvent(HANDLE hSimConnect, SIMCONNECT_INPUT_GROUP_ID GroupID, const char * szInputDefinition, SIMCONNECT_CLIENT_EVENT_ID DownEventID, DWORD DownValue = 0, SIMCONNECT_CLIENT_EVENT_ID UpEventID = (SIMCONNECT_CLIENT_EVENT_ID)SIMCONNECT_UNUSED, DWORD UpValue = 0, BOOL bMaskable = FALSE);
SIMCONNECTAPI SimConnect_SetInputGroupPriority(HANDLE hSimConnect, SIMCONNECT_INPUT_GROUP_ID GroupID, DWORD uPriority);
SIMCONNECTAPI SimConnect_RemoveInputEvent(HANDLE hSimConnect, SIMCONNECT_INPUT_GROUP_ID GroupID, const char * szInputDefinition);
SIMCONNECTAPI SimConnect_ClearInputGroup(HANDLE hSimConnect, SIMCONNECT_INPUT_GROUP_ID GroupID);
SIMCONNECTAPI SimConnect_SetInputGroupState(HANDLE hSimConnect, SIMCONNECT_INPUT_GROUP_ID GroupID, DWORD dwState);
SIMCONNECTAPI SimConnect_RequestReservedKey(HANDLE hSimConnect, SIMCONNECT_CLIENT_EVENT_ID EventID, const char * szKeyChoice1 = "", const char * szKeyChoice2 = "", const char * szKeyChoice3 = "");
SIMCONNECTAPI SimConnect_SubscribeToSystemEvent(HANDLE hSimConnect, SIMCONNECT_CLIENT_EVENT_ID EventID, const char * SystemEventName);
SIMCONNECTAPI SimConnect_UnsubscribeFromSystemEvent(HANDLE hSimConnect, SIMCONNECT_CLIENT_EVENT_ID EventID);
SIMCONNECTAPI SimConnect_WeatherRequestInterpolatedObservation(HANDLE hSimConnect, SIMCONNECT_DATA_REQUEST_ID RequestID, float lat, float lon, float alt);
SIMCONNECTAPI SimConnect_WeatherRequestObservationAtStation(HANDLE hSimConnect, SIMCONNECT_DATA_REQUEST_ID RequestID, const char * szICAO);
SIMCONNECTAPI SimConnect_WeatherRequestObservationAtNearestStation(HANDLE hSimConnect, SIMCONNECT_DATA_REQUEST_ID RequestID, float lat, float lon);
SIMCONNECTAPI SimConnect_WeatherCreateStation(HANDLE hSimConnect, SIMCONNECT_DATA_REQUEST_ID RequestID, const char * szICAO, const char * szName, float lat, float lon, float alt);
SIMCONNECTAPI SimConnect_WeatherRemoveStation(HANDLE hSimConnect, SIMCONNECT_DATA_REQUEST_ID RequestID, const char * szICAO);
SIMCONNECTAPI SimConnect_WeatherSetObservation(HANDLE hSimConnect, DWORD Seconds, const char * szMETAR);
SIMCONNECTAPI SimConnect_WeatherSetModeServer(HANDLE hSimConnect, DWORD dwPort, DWORD dwSeconds);
SIMCONNECTAPI SimConnect_WeatherSetModeTheme(HANDLE hSimConnect, const char * szThemeName);
SIMCONNECTAPI SimConnect_WeatherSetModeGlobal(HANDLE hSimConnect);
SIMCONNECTAPI SimConnect_WeatherSetModeCustom(HANDLE hSimConnect);
SIMCONNECTAPI SimConnect_WeatherSetDynamicUpdateRate(HANDLE hSimConnect, DWORD dwRate);
SIMCONNECTAPI SimConnect_WeatherRequestCloudState(HANDLE hSimConnect, SIMCONNECT_DATA_REQUEST_ID RequestID, float minLat, float minLon, float minAlt, float maxLat, float maxLon, float maxAlt, DWORD dwFlags = 0);
SIMCONNECTAPI SimConnect_WeatherCreateThermal(HANDLE hSimConnect, SIMCONNECT_DATA_REQUEST_ID RequestID, float lat, float lon, float alt, float radius, float height, float coreRate = 3.0f, float coreTurbulence = 0.05f, float sinkRate = 3.0f, float sinkTurbulence = 0.2f, float coreSize = 0.4f, float coreTransitionSize = 0.1f, float sinkLayerSize = 0.4f, float sinkTransitionSize = 0.1f);
SIMCONNECTAPI SimConnect_WeatherRemoveThermal(HANDLE hSimConnect, SIMCONNECT_OBJECT_ID ObjectID);
SIMCONNECTAPI SimConnect_AICreateParkedATCAircraft(HANDLE hSimConnect, const char * szContainerTitle, const char * szTailNumber, const char * szAirportID, SIMCONNECT_DATA_REQUEST_ID RequestID);
SIMCONNECTAPI SimConnect_AICreateEnrouteATCAircraft(HANDLE hSimConnect, const char * szContainerTitle, const char * szTailNumber, int iFlightNumber, const char * szFlightPlanPath, double dFlightPlanPosition, BOOL bTouchAndGo, SIMCONNECT_DATA_REQUEST_ID RequestID);
SIMCONNECTAPI SimConnect_AICreateNonATCAircraft(HANDLE hSimConnect, const char * szContainerTitle, const char * szTailNumber, SIMCONNECT_DATA_INITPOSITION InitPos, SIMCONNECT_DATA_REQUEST_ID RequestID);
SIMCONNECTAPI SimConnect_AICreateSimulatedObject(HANDLE hSimConnect, const char * szContainerTitle, SIMCONNECT_DATA_INITPOSITION InitPos, SIMCONNECT_DATA_REQUEST_ID RequestID);
SIMCONNECTAPI SimConnect_AIReleaseControl(HANDLE hSimConnect, SIMCONNECT_OBJECT_ID ObjectID, SIMCONNECT_DATA_REQUEST_ID RequestID);
SIMCONNECTAPI SimConnect_AIRemoveObject(HANDLE hSimConnect, SIMCONNECT_OBJECT_ID ObjectID, SIMCONNECT_DATA_REQUEST_ID RequestID);
SIMCONNECTAPI SimConnect_AISetAircraftFlightPlan(HANDLE hSimConnect, SIMCONNECT_OBJECT_ID ObjectID, const char * szFlightPlanPath, SIMCONNECT_DATA_REQUEST_ID RequestID);
SIMCONNECTAPI SimConnect_ExecuteMissionAction(HANDLE hSimConnect, const GUID guidInstanceId);
SIMCONNECTAPI SimConnect_CompleteCustomMissionAction(HANDLE hSimConnect, const GUID guidInstanceId);
SIMCONNECTAPI SimConnect_Close(HANDLE hSimConnect);
SIMCONNECTAPI SimConnect_RetrieveString(SIMCONNECT_RECV * pData, DWORD cbData, void * pStringV, char ** pszString, DWORD * pcbString);
SIMCONNECTAPI SimConnect_GetLastSentPacketID(HANDLE hSimConnect, DWORD * pdwError);
SIMCONNECTAPI SimConnect_Open(HANDLE * phSimConnect, LPCSTR szName, HWND hWnd, DWORD UserEventWin32, HANDLE hEventHandle, DWORD ConfigIndex);
SIMCONNECTAPI SimConnect_CallDispatch(HANDLE hSimConnect, DispatchProc pfcnDispatch, void * pContext);
SIMCONNECTAPI SimConnect_GetNextDispatch(HANDLE hSimConnect, SIMCONNECT_RECV ** ppData, DWORD * pcbData);
SIMCONNECTAPI SimConnect_RequestResponseTimes(HANDLE hSimConnect, DWORD nCount, float * fElapsedSeconds);
SIMCONNECTAPI SimConnect_InsertString(char * pDest, DWORD cbDest, void ** ppEnd, DWORD * pcbStringV, const char * pSource);
SIMCONNECTAPI SimConnect_CameraSetRelative6DOF(HANDLE hSimConnect, float fDeltaX, float fDeltaY, float fDeltaZ, float fPitchDeg, float fBankDeg, float fHeadingDeg);
SIMCONNECTAPI SimConnect_MenuAddItem(HANDLE hSimConnect, const char * szMenuItem, SIMCONNECT_CLIENT_EVENT_ID MenuEventID, DWORD dwData);
SIMCONNECTAPI SimConnect_MenuDeleteItem(HANDLE hSimConnect, SIMCONNECT_CLIENT_EVENT_ID MenuEventID);
SIMCONNECTAPI SimConnect_MenuAddSubItem(HANDLE hSimConnect, SIMCONNECT_CLIENT_EVENT_ID MenuEventID, const char * szMenuItem, SIMCONNECT_CLIENT_EVENT_ID SubMenuEventID, DWORD dwData);
SIMCONNECTAPI SimConnect_MenuDeleteSubItem(HANDLE hSimConnect, SIMCONNECT_CLIENT_EVENT_ID MenuEventID, const SIMCONNECT_CLIENT_EVENT_ID SubMenuEventID);
SIMCONNECTAPI SimConnect_RequestSystemState(HANDLE hSimConnect, SIMCONNECT_DATA_REQUEST_ID RequestID, const char * szState);
SIMCONNECTAPI SimConnect_SetSystemState(HANDLE hSimConnect, const char * szState, DWORD dwInteger, float fFloat, const char * szString);
SIMCONNECTAPI SimConnect_MapClientDataNameToID(HANDLE hSimConnect, const char * szClientDataName, SIMCONNECT_CLIENT_DATA_ID ClientDataID);
SIMCONNECTAPI SimConnect_CreateClientData(HANDLE hSimConnect, SIMCONNECT_CLIENT_DATA_ID ClientDataID, DWORD dwSize, SIMCONNECT_CREATE_CLIENT_DATA_FLAG Flags);
SIMCONNECTAPI SimConnect_AddToClientDataDefinition(HANDLE hSimConnect, SIMCONNECT_CLIENT_DATA_DEFINITION_ID DefineID, DWORD dwOffset, DWORD dwSizeOrType, float fEpsilon = 0, DWORD DatumID = SIMCONNECT_UNUSED);
SIMCONNECTAPI SimConnect_ClearClientDataDefinition(HANDLE hSimConnect, SIMCONNECT_CLIENT_DATA_DEFINITION_ID DefineID);
SIMCONNECTAPI SimConnect_RequestClientData(HANDLE hSimConnect, SIMCONNECT_CLIENT_DATA_ID ClientDataID, SIMCONNECT_DATA_REQUEST_ID RequestID, SIMCONNECT_CLIENT_DATA_DEFINITION_ID DefineID, SIMCONNECT_CLIENT_DATA_PERIOD Period = SIMCONNECT_CLIENT_DATA_PERIOD_ONCE, SIMCONNECT_CLIENT_DATA_REQUEST_FLAG Flags = 0, DWORD origin = 0, DWORD interval = 0, DWORD limit = 0);
SIMCONNECTAPI SimConnect_SetClientData(HANDLE hSimConnect, SIMCONNECT_CLIENT_DATA_ID ClientDataID, SIMCONNECT_CLIENT_DATA_DEFINITION_ID DefineID, SIMCONNECT_CLIENT_DATA_SET_FLAG Flags, DWORD dwReserved, DWORD cbUnitSize, void * pDataSet);
SIMCONNECTAPI SimConnect_FlightLoad(HANDLE hSimConnect, const char * szFileName);
SIMCONNECTAPI SimConnect_FlightSave(HANDLE hSimConnect, const char * szFileName, const char * szTitle, const char * szDescription, DWORD Flags);
SIMCONNECTAPI SimConnect_FlightPlanLoad(HANDLE hSimConnect, const char * szFileName);
SIMCONNECTAPI SimConnect_Text(HANDLE hSimConnect, SIMCONNECT_TEXT_TYPE type, float fTimeSeconds, SIMCONNECT_CLIENT_EVENT_ID EventID, DWORD cbUnitSize, void * pDataSet);
SIMCONNECTAPI SimConnect_SubscribeToFacilities(HANDLE hSimConnect, SIMCONNECT_FACILITY_LIST_TYPE type, SIMCONNECT_DATA_REQUEST_ID RequestID);
SIMCONNECTAPI SimConnect_UnsubscribeToFacilities(HANDLE hSimConnect, SIMCONNECT_FACILITY_LIST_TYPE type);
SIMCONNECTAPI SimConnect_RequestFacilitiesList(HANDLE hSimConnect, SIMCONNECT_FACILITY_LIST_TYPE type, SIMCONNECT_DATA_REQUEST_ID RequestID);
#endif // _SIMCONNECT_H_
Binary file not shown.
Binary file not shown.
+847
View File
@@ -0,0 +1,847 @@
//-----------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All Rights Reserved.
//
//-----------------------------------------------------------------------------
#ifndef _SIMCONNECT_H_
#define _SIMCONNECT_H_
#pragma once
// <ASOBO-MOD - GM - now in 64 bit
#ifndef SIMCONNECT_H_NOMANIFEST
#if _MSC_FULL_VER >= 140040130
#if defined(_M_IX86) || defined(_M_X64)
//#pragma comment(linker,"/manifestdependency:\"type='win32' " \
// "name='" "Microsoft..SimConnect" "' " \
// "version='" "" "' " \
// "processorArchitecture='amd64' " \
// "publicKeyToken='" "" "'\"")
#endif // #if defined(_M_IX86) || defined(_M_X64)
#endif // #if _MSC_FULL_VER >= 140040130
#endif // #ifndef SIMCONNECT_H_NOMANIFEST
// ASOBO-MOD/>
#ifndef DWORD_MAX
#define DWORD_MAX 0xFFFFFFFF
#endif
#include <float.h>
typedef DWORD SIMCONNECT_OBJECT_ID;
//----------------------------------------------------------------------------
// Constants
//----------------------------------------------------------------------------
static const DWORD SIMCONNECT_UNUSED = DWORD_MAX; // special value to indicate unused event, ID
static const DWORD SIMCONNECT_OBJECT_ID_USER = 0; // proxy value for User vehicle ObjectID
static const float SIMCONNECT_CAMERA_IGNORE_FIELD = FLT_MAX; //Used to tell the Camera API to NOT modify the value in this part of the argument.
static const DWORD SIMCONNECT_CLIENTDATA_MAX_SIZE = 8192; // maximum value for SimConnect_CreateClientData dwSize parameter
// Notification Group priority values
static const DWORD SIMCONNECT_GROUP_PRIORITY_HIGHEST = 1; // highest priority
static const DWORD SIMCONNECT_GROUP_PRIORITY_HIGHEST_MASKABLE = 10000000; // highest priority that allows events to be masked
static const DWORD SIMCONNECT_GROUP_PRIORITY_STANDARD = 1900000000; // standard priority
static const DWORD SIMCONNECT_GROUP_PRIORITY_DEFAULT = 2000000000; // default priority
static const DWORD SIMCONNECT_GROUP_PRIORITY_LOWEST = 4000000000; // priorities lower than this will be ignored
//Weather observations Metar strings
static const DWORD MAX_METAR_LENGTH = 2000;
// Maximum thermal size is 100 km.
static const float MAX_THERMAL_SIZE = 100000;
static const float MAX_THERMAL_RATE = 1000;
// SIMCONNECT_DATA_INITPOSITION.Airspeed
static const DWORD INITPOSITION_AIRSPEED_CRUISE = -1; // aircraft's cruise airspeed
static const DWORD INITPOSITION_AIRSPEED_KEEP = -2; // keep current airspeed
// AddToClientDataDefinition dwSizeOrType parameter type values
static const DWORD SIMCONNECT_CLIENTDATATYPE_INT8 = -1; // 8-bit integer number
static const DWORD SIMCONNECT_CLIENTDATATYPE_INT16 = -2; // 16-bit integer number
static const DWORD SIMCONNECT_CLIENTDATATYPE_INT32 = -3; // 32-bit integer number
static const DWORD SIMCONNECT_CLIENTDATATYPE_INT64 = -4; // 64-bit integer number
static const DWORD SIMCONNECT_CLIENTDATATYPE_FLOAT32 = -5; // 32-bit floating-point number (float)
static const DWORD SIMCONNECT_CLIENTDATATYPE_FLOAT64 = -6; // 64-bit floating-point number (double)
// AddToClientDataDefinition dwOffset parameter special values
static const DWORD SIMCONNECT_CLIENTDATAOFFSET_AUTO = -1; // automatically compute offset of the ClientData variable
// Open ConfigIndex parameter special value
static const DWORD SIMCONNECT_OPEN_CONFIGINDEX_LOCAL = -1; // ignore SimConnect.cfg settings, and force local connection
//----------------------------------------------------------------------------
// Enum definitions
//----------------------------------------------------------------------------
//these came from substituteMacros
#define SIMCONNECT_REFSTRUCT struct
#define SIMCONNECT_STRUCT struct
#define SIMCONNECT_STRING(name, size) char name[size]
#define SIMCONNECT_GUID GUID
#define SIMCONNECT_STRINGV(name) char name[1]
#define SIMCONNECT_DATAV(name, id, count) DWORD name
#define SIMCONNECT_FIXEDTYPE_DATAV(type, name, count, cliMarshalAs, cliType) type name[1]
#define SIMCONNECT_GUID GUID
#define SIMCONNECT_ENUM enum
#define SIMCONNECT_ENUM_FLAGS typedef DWORD
#define SIMCONNECT_USER_ENUM typedef DWORD
// Receive data types
SIMCONNECT_ENUM SIMCONNECT_RECV_ID {
SIMCONNECT_RECV_ID_NULL,
SIMCONNECT_RECV_ID_EXCEPTION,
SIMCONNECT_RECV_ID_OPEN,
SIMCONNECT_RECV_ID_QUIT,
SIMCONNECT_RECV_ID_EVENT,
SIMCONNECT_RECV_ID_EVENT_OBJECT_ADDREMOVE,
SIMCONNECT_RECV_ID_EVENT_FILENAME,
SIMCONNECT_RECV_ID_EVENT_FRAME,
SIMCONNECT_RECV_ID_SIMOBJECT_DATA,
SIMCONNECT_RECV_ID_SIMOBJECT_DATA_BYTYPE,
SIMCONNECT_RECV_ID_WEATHER_OBSERVATION,
SIMCONNECT_RECV_ID_CLOUD_STATE,
SIMCONNECT_RECV_ID_ASSIGNED_OBJECT_ID,
SIMCONNECT_RECV_ID_RESERVED_KEY,
SIMCONNECT_RECV_ID_CUSTOM_ACTION,
SIMCONNECT_RECV_ID_SYSTEM_STATE,
SIMCONNECT_RECV_ID_CLIENT_DATA,
SIMCONNECT_RECV_ID_EVENT_WEATHER_MODE,
SIMCONNECT_RECV_ID_AIRPORT_LIST,
SIMCONNECT_RECV_ID_VOR_LIST,
SIMCONNECT_RECV_ID_NDB_LIST,
SIMCONNECT_RECV_ID_WAYPOINT_LIST,
SIMCONNECT_RECV_ID_EVENT_MULTIPLAYER_SERVER_STARTED,
SIMCONNECT_RECV_ID_EVENT_MULTIPLAYER_CLIENT_STARTED,
SIMCONNECT_RECV_ID_EVENT_MULTIPLAYER_SESSION_ENDED,
SIMCONNECT_RECV_ID_EVENT_RACE_END,
SIMCONNECT_RECV_ID_EVENT_RACE_LAP,
#ifdef ENABLE_SIMCONNECT_EXPERIMENTAL
SIMCONNECT_RECV_ID_PICK,
#endif //ENABLE_SIMCONNECT_EXPERIMENTAL
SIMCONNECT_RECV_ID_EVENT_EX1,
SIMCONNECT_RECV_ID_FACILITY_DATA,
SIMCONNECT_RECV_ID_FACILITY_DATA_END,
};
// Data data types
SIMCONNECT_ENUM SIMCONNECT_DATATYPE {
SIMCONNECT_DATATYPE_INVALID, // invalid data type
SIMCONNECT_DATATYPE_INT32, // 32-bit integer number
SIMCONNECT_DATATYPE_INT64, // 64-bit integer number
SIMCONNECT_DATATYPE_FLOAT32, // 32-bit floating-point number (float)
SIMCONNECT_DATATYPE_FLOAT64, // 64-bit floating-point number (double)
SIMCONNECT_DATATYPE_STRING8, // 8-byte string
SIMCONNECT_DATATYPE_STRING32, // 32-byte string
SIMCONNECT_DATATYPE_STRING64, // 64-byte string
SIMCONNECT_DATATYPE_STRING128, // 128-byte string
SIMCONNECT_DATATYPE_STRING256, // 256-byte string
SIMCONNECT_DATATYPE_STRING260, // 260-byte string
SIMCONNECT_DATATYPE_STRINGV, // variable-length string
SIMCONNECT_DATATYPE_INITPOSITION, // see SIMCONNECT_DATA_INITPOSITION
SIMCONNECT_DATATYPE_MARKERSTATE, // see SIMCONNECT_DATA_MARKERSTATE
SIMCONNECT_DATATYPE_WAYPOINT, // see SIMCONNECT_DATA_WAYPOINT
SIMCONNECT_DATATYPE_LATLONALT, // see SIMCONNECT_DATA_LATLONALT
SIMCONNECT_DATATYPE_XYZ, // see SIMCONNECT_DATA_XYZ
SIMCONNECT_DATATYPE_MAX // enum limit
};
// Exception error types
SIMCONNECT_ENUM SIMCONNECT_EXCEPTION {
SIMCONNECT_EXCEPTION_NONE,
SIMCONNECT_EXCEPTION_ERROR,
SIMCONNECT_EXCEPTION_SIZE_MISMATCH,
SIMCONNECT_EXCEPTION_UNRECOGNIZED_ID,
SIMCONNECT_EXCEPTION_UNOPENED,
SIMCONNECT_EXCEPTION_VERSION_MISMATCH,
SIMCONNECT_EXCEPTION_TOO_MANY_GROUPS,
SIMCONNECT_EXCEPTION_NAME_UNRECOGNIZED,
SIMCONNECT_EXCEPTION_TOO_MANY_EVENT_NAMES,
SIMCONNECT_EXCEPTION_EVENT_ID_DUPLICATE,
SIMCONNECT_EXCEPTION_TOO_MANY_MAPS,
SIMCONNECT_EXCEPTION_TOO_MANY_OBJECTS,
SIMCONNECT_EXCEPTION_TOO_MANY_REQUESTS,
SIMCONNECT_EXCEPTION_WEATHER_INVALID_PORT,
SIMCONNECT_EXCEPTION_WEATHER_INVALID_METAR,
SIMCONNECT_EXCEPTION_WEATHER_UNABLE_TO_GET_OBSERVATION,
SIMCONNECT_EXCEPTION_WEATHER_UNABLE_TO_CREATE_STATION,
SIMCONNECT_EXCEPTION_WEATHER_UNABLE_TO_REMOVE_STATION,
SIMCONNECT_EXCEPTION_INVALID_DATA_TYPE,
SIMCONNECT_EXCEPTION_INVALID_DATA_SIZE,
SIMCONNECT_EXCEPTION_DATA_ERROR,
SIMCONNECT_EXCEPTION_INVALID_ARRAY,
SIMCONNECT_EXCEPTION_CREATE_OBJECT_FAILED,
SIMCONNECT_EXCEPTION_LOAD_FLIGHTPLAN_FAILED,
SIMCONNECT_EXCEPTION_OPERATION_INVALID_FOR_OBJECT_TYPE,
SIMCONNECT_EXCEPTION_ILLEGAL_OPERATION,
SIMCONNECT_EXCEPTION_ALREADY_SUBSCRIBED,
SIMCONNECT_EXCEPTION_INVALID_ENUM,
SIMCONNECT_EXCEPTION_DEFINITION_ERROR,
SIMCONNECT_EXCEPTION_DUPLICATE_ID,
SIMCONNECT_EXCEPTION_DATUM_ID,
SIMCONNECT_EXCEPTION_OUT_OF_BOUNDS,
SIMCONNECT_EXCEPTION_ALREADY_CREATED,
SIMCONNECT_EXCEPTION_OBJECT_OUTSIDE_REALITY_BUBBLE,
SIMCONNECT_EXCEPTION_OBJECT_CONTAINER,
SIMCONNECT_EXCEPTION_OBJECT_AI,
SIMCONNECT_EXCEPTION_OBJECT_ATC,
SIMCONNECT_EXCEPTION_OBJECT_SCHEDULE,
};
// Object types
SIMCONNECT_ENUM SIMCONNECT_SIMOBJECT_TYPE {
SIMCONNECT_SIMOBJECT_TYPE_USER,
SIMCONNECT_SIMOBJECT_TYPE_ALL,
SIMCONNECT_SIMOBJECT_TYPE_AIRCRAFT,
SIMCONNECT_SIMOBJECT_TYPE_HELICOPTER,
SIMCONNECT_SIMOBJECT_TYPE_BOAT,
SIMCONNECT_SIMOBJECT_TYPE_GROUND,
};
// EventState values
SIMCONNECT_ENUM SIMCONNECT_STATE {
SIMCONNECT_STATE_OFF,
SIMCONNECT_STATE_ON,
};
// Object Data Request Period values
SIMCONNECT_ENUM SIMCONNECT_PERIOD {
SIMCONNECT_PERIOD_NEVER,
SIMCONNECT_PERIOD_ONCE,
SIMCONNECT_PERIOD_VISUAL_FRAME,
SIMCONNECT_PERIOD_SIM_FRAME,
SIMCONNECT_PERIOD_SECOND,
};
SIMCONNECT_ENUM SIMCONNECT_MISSION_END {
SIMCONNECT_MISSION_FAILED,
SIMCONNECT_MISSION_CRASHED,
SIMCONNECT_MISSION_SUCCEEDED
};
// ClientData Request Period values
SIMCONNECT_ENUM SIMCONNECT_CLIENT_DATA_PERIOD {
SIMCONNECT_CLIENT_DATA_PERIOD_NEVER,
SIMCONNECT_CLIENT_DATA_PERIOD_ONCE,
SIMCONNECT_CLIENT_DATA_PERIOD_VISUAL_FRAME,
SIMCONNECT_CLIENT_DATA_PERIOD_ON_SET,
SIMCONNECT_CLIENT_DATA_PERIOD_SECOND,
};
SIMCONNECT_ENUM SIMCONNECT_TEXT_TYPE {
SIMCONNECT_TEXT_TYPE_SCROLL_BLACK,
SIMCONNECT_TEXT_TYPE_SCROLL_WHITE,
SIMCONNECT_TEXT_TYPE_SCROLL_RED,
SIMCONNECT_TEXT_TYPE_SCROLL_GREEN,
SIMCONNECT_TEXT_TYPE_SCROLL_BLUE,
SIMCONNECT_TEXT_TYPE_SCROLL_YELLOW,
SIMCONNECT_TEXT_TYPE_SCROLL_MAGENTA,
SIMCONNECT_TEXT_TYPE_SCROLL_CYAN,
SIMCONNECT_TEXT_TYPE_PRINT_BLACK=0x0100,
SIMCONNECT_TEXT_TYPE_PRINT_WHITE,
SIMCONNECT_TEXT_TYPE_PRINT_RED,
SIMCONNECT_TEXT_TYPE_PRINT_GREEN,
SIMCONNECT_TEXT_TYPE_PRINT_BLUE,
SIMCONNECT_TEXT_TYPE_PRINT_YELLOW,
SIMCONNECT_TEXT_TYPE_PRINT_MAGENTA,
SIMCONNECT_TEXT_TYPE_PRINT_CYAN,
SIMCONNECT_TEXT_TYPE_MENU=0x0200,
};
SIMCONNECT_ENUM SIMCONNECT_TEXT_RESULT {
SIMCONNECT_TEXT_RESULT_MENU_SELECT_1,
SIMCONNECT_TEXT_RESULT_MENU_SELECT_2,
SIMCONNECT_TEXT_RESULT_MENU_SELECT_3,
SIMCONNECT_TEXT_RESULT_MENU_SELECT_4,
SIMCONNECT_TEXT_RESULT_MENU_SELECT_5,
SIMCONNECT_TEXT_RESULT_MENU_SELECT_6,
SIMCONNECT_TEXT_RESULT_MENU_SELECT_7,
SIMCONNECT_TEXT_RESULT_MENU_SELECT_8,
SIMCONNECT_TEXT_RESULT_MENU_SELECT_9,
SIMCONNECT_TEXT_RESULT_MENU_SELECT_10,
SIMCONNECT_TEXT_RESULT_DISPLAYED = 0x00010000,
SIMCONNECT_TEXT_RESULT_QUEUED,
SIMCONNECT_TEXT_RESULT_REMOVED,
SIMCONNECT_TEXT_RESULT_REPLACED,
SIMCONNECT_TEXT_RESULT_TIMEOUT,
};
SIMCONNECT_ENUM SIMCONNECT_WEATHER_MODE {
SIMCONNECT_WEATHER_MODE_THEME,
SIMCONNECT_WEATHER_MODE_RWW,
SIMCONNECT_WEATHER_MODE_CUSTOM,
SIMCONNECT_WEATHER_MODE_GLOBAL,
};
SIMCONNECT_ENUM SIMCONNECT_FACILITY_LIST_TYPE {
SIMCONNECT_FACILITY_LIST_TYPE_AIRPORT,
SIMCONNECT_FACILITY_LIST_TYPE_WAYPOINT,
SIMCONNECT_FACILITY_LIST_TYPE_NDB,
SIMCONNECT_FACILITY_LIST_TYPE_VOR,
SIMCONNECT_FACILITY_LIST_TYPE_COUNT // invalid
};
SIMCONNECT_ENUM SIMCONNECT_FACILITY_DATA_TYPE
{
SIMCONNECT_FACILITY_DATA_AIRPORT,
SIMCONNECT_FACILITY_DATA_RUNWAY,
SIMCONNECT_FACILITY_DATA_START,
SIMCONNECT_FACILITY_DATA_FREQUENCY,
SIMCONNECT_FACILITY_DATA_HELIPAD,
SIMCONNECT_FACILITY_DATA_APPROACH,
SIMCONNECT_FACILITY_DATA_APPROACH_TRANSITION,
SIMCONNECT_FACILITY_DATA_APPROACH_LEG,
SIMCONNECT_FACILITY_DATA_FINAL_APPROACH_LEG,
SIMCONNECT_FACILITY_DATA_MISSED_APPROACH_LEG,
SIMCONNECT_FACILITY_DATA_DEPARTURE,
SIMCONNECT_FACILITY_DATA_ARRIVAL,
SIMCONNECT_FACILITY_DATA_RUNWAY_TRANSITION,
SIMCONNECT_FACILITY_DATA_ENROUTE_TRANSITION,
SIMCONNECT_FACILITY_DATA_TAXI_POINT,
SIMCONNECT_FACILITY_DATA_TAXI_PARKING,
SIMCONNECT_FACILITY_DATA_TAXI_PATH,
SIMCONNECT_FACILITY_DATA_TAXI_NAME,
SIMCONNECT_FACILITY_DATA_JETWAY,
SIMCONNECT_FACILITY_DATA_VOR,
SIMCONNECT_FACILITY_DATA_NDB,
SIMCONNECT_FACILITY_DATA_WAYPOINT,
SIMCONNECT_FACILITY_DATA_ROUTE,
};
SIMCONNECT_ENUM_FLAGS SIMCONNECT_VOR_FLAGS; // flags for SIMCONNECT_RECV_ID_VOR_LIST
static const DWORD SIMCONNECT_RECV_ID_VOR_LIST_HAS_NAV_SIGNAL = 0x00000001; // Has Nav signal
static const DWORD SIMCONNECT_RECV_ID_VOR_LIST_HAS_LOCALIZER = 0x00000002; // Has localizer
static const DWORD SIMCONNECT_RECV_ID_VOR_LIST_HAS_GLIDE_SLOPE = 0x00000004; // Has Nav signal
static const DWORD SIMCONNECT_RECV_ID_VOR_LIST_HAS_DME = 0x00000008; // Station has DME
// bits for the Waypoint Flags field: may be combined
SIMCONNECT_ENUM_FLAGS SIMCONNECT_WAYPOINT_FLAGS;
static const DWORD SIMCONNECT_WAYPOINT_NONE = 0x00;
static const DWORD SIMCONNECT_WAYPOINT_SPEED_REQUESTED = 0x04; // requested speed at waypoint is valid
static const DWORD SIMCONNECT_WAYPOINT_THROTTLE_REQUESTED = 0x08; // request a specific throttle percentage
static const DWORD SIMCONNECT_WAYPOINT_COMPUTE_VERTICAL_SPEED = 0x10; // compute vertical to speed to reach waypoint altitude when crossing the waypoint
static const DWORD SIMCONNECT_WAYPOINT_ALTITUDE_IS_AGL = 0x20; // AltitudeIsAGL
static const DWORD SIMCONNECT_WAYPOINT_ON_GROUND = 0x00100000; // place this waypoint on the ground
static const DWORD SIMCONNECT_WAYPOINT_REVERSE = 0x00200000; // Back up to this waypoint. Only valid on first waypoint
static const DWORD SIMCONNECT_WAYPOINT_WRAP_TO_FIRST = 0x00400000; // Wrap around back to first waypoint. Only valid on last waypoint.
static const DWORD SIMCONNECT_WAYPOINT_ALWAYS_BACKUP = 0x00800000; // Go from first waypoint to last one moving only backwards
static const DWORD SIMCONNECT_WAYPOINT_KEEP_LAST_HEADING = 0x01000000; // Object doesn't only go from waypoint to waypoint using position but it will also keep the same heading computed on the last 2 waypoints
static const DWORD SIMCONNECT_WAYPOINT_YIELD_TO_USER = 0x02000000; // Object will never be too close of the player. If waypoints pass too close of the player, the object will stop and wait
static const DWORD SIMCONNECT_WAYPOINT_CAN_REVERSE = 0x04000000; // This flags handle the behaviour of the object if it can't reach a waypoint. By default, it will take a other way and try to reach this point again. With this flag, object will try some stuff to reach this waypoint in a better condition (moving backwards...)
SIMCONNECT_ENUM_FLAGS SIMCONNECT_EVENT_FLAG;
static const DWORD SIMCONNECT_EVENT_FLAG_DEFAULT = 0x00000000;
static const DWORD SIMCONNECT_EVENT_FLAG_FAST_REPEAT_TIMER = 0x00000001; // set event repeat timer to simulate fast repeat
static const DWORD SIMCONNECT_EVENT_FLAG_SLOW_REPEAT_TIMER = 0x00000002; // set event repeat timer to simulate slow repeat
static const DWORD SIMCONNECT_EVENT_FLAG_GROUPID_IS_PRIORITY = 0x00000010; // interpret GroupID parameter as priority value
SIMCONNECT_ENUM_FLAGS SIMCONNECT_DATA_REQUEST_FLAG;
static const DWORD SIMCONNECT_DATA_REQUEST_FLAG_DEFAULT = 0x00000000;
static const DWORD SIMCONNECT_DATA_REQUEST_FLAG_CHANGED = 0x00000001; // send requested data when value(s) change
static const DWORD SIMCONNECT_DATA_REQUEST_FLAG_TAGGED = 0x00000002; // send requested data in tagged format
SIMCONNECT_ENUM_FLAGS SIMCONNECT_DATA_SET_FLAG;
static const DWORD SIMCONNECT_DATA_SET_FLAG_DEFAULT = 0x00000000;
static const DWORD SIMCONNECT_DATA_SET_FLAG_TAGGED = 0x00000001; // data is in tagged format
SIMCONNECT_ENUM_FLAGS SIMCONNECT_CREATE_CLIENT_DATA_FLAG;
static const DWORD SIMCONNECT_CREATE_CLIENT_DATA_FLAG_DEFAULT = 0x00000000;
static const DWORD SIMCONNECT_CREATE_CLIENT_DATA_FLAG_READ_ONLY = 0x00000001; // permit only ClientData creator to write into ClientData
SIMCONNECT_ENUM_FLAGS SIMCONNECT_CLIENT_DATA_REQUEST_FLAG;
static const DWORD SIMCONNECT_CLIENT_DATA_REQUEST_FLAG_DEFAULT = 0x00000000;
static const DWORD SIMCONNECT_CLIENT_DATA_REQUEST_FLAG_CHANGED = 0x00000001; // send requested ClientData when value(s) change
static const DWORD SIMCONNECT_CLIENT_DATA_REQUEST_FLAG_TAGGED = 0x00000002; // send requested ClientData in tagged format
SIMCONNECT_ENUM_FLAGS SIMCONNECT_CLIENT_DATA_SET_FLAG;
static const DWORD SIMCONNECT_CLIENT_DATA_SET_FLAG_DEFAULT = 0x00000000;
static const DWORD SIMCONNECT_CLIENT_DATA_SET_FLAG_TAGGED = 0x00000001; // data is in tagged format
SIMCONNECT_ENUM_FLAGS SIMCONNECT_VIEW_SYSTEM_EVENT_DATA; // dwData contains these flags for the "View" System Event
static const DWORD SIMCONNECT_VIEW_SYSTEM_EVENT_DATA_COCKPIT_2D = 0x00000001; // 2D Panels in cockpit view
static const DWORD SIMCONNECT_VIEW_SYSTEM_EVENT_DATA_COCKPIT_VIRTUAL = 0x00000002; // Virtual (3D) panels in cockpit view
static const DWORD SIMCONNECT_VIEW_SYSTEM_EVENT_DATA_ORTHOGONAL = 0x00000004; // Orthogonal (Map) view
SIMCONNECT_ENUM_FLAGS SIMCONNECT_SOUND_SYSTEM_EVENT_DATA; // dwData contains these flags for the "Sound" System Event
static const DWORD SIMCONNECT_SOUND_SYSTEM_EVENT_DATA_MASTER = 0x00000001; // Sound Master
#ifdef ENABLE_SIMCONNECT_EXPERIMENTAL
SIMCONNECT_ENUM_FLAGS SIMCONNECT_PICK_FLAGS
{
SIMCONNECT_PICK_GROUND = 0x01, // pick ground/ pick result item is ground location
SIMCONNECT_PICK_AI = 0x02, // pick AI / pick result item is AI, (dwSimObjectID is valid)
SIMCONNECT_PICK_SCENERY = 0x04, // pick scenery/ pick result item is scenery object (hSceneryObject is valid)
SIMCONNECT_PICK_ALL = SIMCONNECT_PICK_SCENERY | SIMCONNECT_PICK_AI | SIMCONNECT_PICK_GROUND, // pick all / (not valid on pick result item)
SIMCONNECT_PICK_COORDSASPIXELS = 0x08,
};
#endif //ENABLE_SIMCONNECT_EXPERIMENTAL
//----------------------------------------------------------------------------
// User-defined enums
//----------------------------------------------------------------------------
SIMCONNECT_USER_ENUM SIMCONNECT_NOTIFICATION_GROUP_ID; //client-defined notification group ID
SIMCONNECT_USER_ENUM SIMCONNECT_INPUT_GROUP_ID; //client-defined input group ID
SIMCONNECT_USER_ENUM SIMCONNECT_DATA_DEFINITION_ID; //client-defined data definition ID
SIMCONNECT_USER_ENUM SIMCONNECT_DATA_REQUEST_ID; //client-defined request data ID
SIMCONNECT_USER_ENUM SIMCONNECT_CLIENT_EVENT_ID; //client-defined client event ID
SIMCONNECT_USER_ENUM SIMCONNECT_CLIENT_DATA_ID; //client-defined client data ID
SIMCONNECT_USER_ENUM SIMCONNECT_CLIENT_DATA_DEFINITION_ID; //client-defined client data definition ID
//----------------------------------------------------------------------------
// Struct definitions
//----------------------------------------------------------------------------
#pragma pack(push, 1)
SIMCONNECT_REFSTRUCT SIMCONNECT_RECV
{
DWORD dwSize; // record size
DWORD dwVersion; // interface version
DWORD dwID; // see SIMCONNECT_RECV_ID
};
SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_EXCEPTION : public SIMCONNECT_RECV // when dwID == SIMCONNECT_RECV_ID_EXCEPTION
{
DWORD dwException; // see SIMCONNECT_EXCEPTION
static const DWORD UNKNOWN_SENDID = 0;
DWORD dwSendID; // see SimConnect_GetLastSentPacketID
static const DWORD UNKNOWN_INDEX = DWORD_MAX;
DWORD dwIndex; // index of parameter that was source of error
};
SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_OPEN : public SIMCONNECT_RECV // when dwID == SIMCONNECT_RECV_ID_OPEN
{
SIMCONNECT_STRING( szApplicationName, 256);
DWORD dwApplicationVersionMajor;
DWORD dwApplicationVersionMinor;
DWORD dwApplicationBuildMajor;
DWORD dwApplicationBuildMinor;
DWORD dwSimConnectVersionMajor;
DWORD dwSimConnectVersionMinor;
DWORD dwSimConnectBuildMajor;
DWORD dwSimConnectBuildMinor;
DWORD dwReserved1;
DWORD dwReserved2;
};
SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_QUIT : public SIMCONNECT_RECV // when dwID == SIMCONNECT_RECV_ID_QUIT
{
};
SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_EVENT : public SIMCONNECT_RECV // when dwID == SIMCONNECT_RECV_ID_EVENT
{
static const DWORD UNKNOWN_GROUP = DWORD_MAX;
DWORD uGroupID;
DWORD uEventID;
DWORD dwData; // uEventID-dependent context
};
SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_EVENT_FILENAME : public SIMCONNECT_RECV_EVENT // when dwID == SIMCONNECT_RECV_ID_EVENT_FILENAME
{
SIMCONNECT_STRING( szFileName, MAX_PATH); // uEventID-dependent context
DWORD dwFlags;
};
SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_EVENT_OBJECT_ADDREMOVE : public SIMCONNECT_RECV_EVENT // when dwID == SIMCONNECT_RECV_ID_EVENT_FILENAME
{
SIMCONNECT_SIMOBJECT_TYPE eObjType;
};
SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_EVENT_FRAME : public SIMCONNECT_RECV_EVENT // when dwID == SIMCONNECT_RECV_ID_EVENT_FRAME
{
float fFrameRate;
float fSimSpeed;
};
SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_EVENT_MULTIPLAYER_SERVER_STARTED : public SIMCONNECT_RECV_EVENT // when dwID == SIMCONNECT_RECV_ID_EVENT_MULTIPLAYER_SERVER_STARTED
{
// No event specific data, for now
};
SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_EVENT_MULTIPLAYER_CLIENT_STARTED : public SIMCONNECT_RECV_EVENT // when dwID == SIMCONNECT_RECV_ID_EVENT_MULTIPLAYER_CLIENT_STARTED
{
// No event specific data, for now
};
SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_EVENT_MULTIPLAYER_SESSION_ENDED : public SIMCONNECT_RECV_EVENT // when dwID == SIMCONNECT_RECV_ID_EVENT_MULTIPLAYER_SESSION_ENDED
{
// No event specific data, for now
};
SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_EVENT_EX1 : public SIMCONNECT_RECV // when dwID == SIMCONNECT_RECV_ID_EVENT_EX1
{
static const DWORD UNKNOWN_GROUP = DWORD_MAX;
DWORD uGroupID;
DWORD uEventID;
// Doesn t support array so, let s list
DWORD dwData0;
DWORD dwData1;
DWORD dwData2;
DWORD dwData3;
DWORD dwData4;
};
// SIMCONNECT_DATA_RACE_RESULT
SIMCONNECT_STRUCT SIMCONNECT_DATA_RACE_RESULT
{
DWORD dwNumberOfRacers; // The total number of racers
SIMCONNECT_GUID MissionGUID; // The name of the mission to execute, NULL if no mission
SIMCONNECT_STRING( szPlayerName, MAX_PATH); // The name of the player
SIMCONNECT_STRING( szSessionType, MAX_PATH); // The type of the multiplayer session: "LAN", "GAMESPY")
SIMCONNECT_STRING( szAircraft, MAX_PATH); // The aircraft type
SIMCONNECT_STRING( szPlayerRole, MAX_PATH); // The player role in the mission
double fTotalTime; // Total time in seconds, 0 means DNF
double fPenaltyTime; // Total penalty time in seconds
DWORD dwIsDisqualified; // non 0 - disqualified, 0 - not disqualified
};
SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_EVENT_RACE_END : public SIMCONNECT_RECV_EVENT // when dwID == SIMCONNECT_RECV_ID_EVENT_RACE_END
{
DWORD dwRacerNumber; // The index of the racer the results are for
SIMCONNECT_DATA_RACE_RESULT RacerData;
};
SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_EVENT_RACE_LAP : public SIMCONNECT_RECV_EVENT // when dwID == SIMCONNECT_RECV_ID_EVENT_RACE_LAP
{
DWORD dwLapIndex; // The index of the lap the results are for
SIMCONNECT_DATA_RACE_RESULT RacerData;
};
SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_SIMOBJECT_DATA : public SIMCONNECT_RECV // when dwID == SIMCONNECT_RECV_ID_SIMOBJECT_DATA
{
DWORD dwRequestID;
DWORD dwObjectID;
DWORD dwDefineID;
DWORD dwFlags; // SIMCONNECT_DATA_REQUEST_FLAG
DWORD dwentrynumber; // if multiple objects returned, this is number <entrynumber> out of <outof>.
DWORD dwoutof; // note: starts with 1, not 0.
DWORD dwDefineCount; // data count (number of datums, *not* byte count)
SIMCONNECT_DATAV( dwData, dwDefineID, ); // data begins here, dwDefineCount data items
};
SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_SIMOBJECT_DATA_BYTYPE : public SIMCONNECT_RECV_SIMOBJECT_DATA // when dwID == SIMCONNECT_RECV_ID_SIMOBJECT_DATA_BYTYPE
{
};
SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_CLIENT_DATA : public SIMCONNECT_RECV_SIMOBJECT_DATA // when dwID == SIMCONNECT_RECV_ID_CLIENT_DATA
{
};
SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_WEATHER_OBSERVATION : public SIMCONNECT_RECV // when dwID == SIMCONNECT_RECV_ID_WEATHER_OBSERVATION
{
DWORD dwRequestID;
SIMCONNECT_STRINGV( szMetar); // Variable length string whose maximum size is MAX_METAR_LENGTH
};
static const int SIMCONNECT_CLOUD_STATE_ARRAY_WIDTH = 64;
static const int SIMCONNECT_CLOUD_STATE_ARRAY_SIZE = SIMCONNECT_CLOUD_STATE_ARRAY_WIDTH*SIMCONNECT_CLOUD_STATE_ARRAY_WIDTH;
SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_CLOUD_STATE : public SIMCONNECT_RECV // when dwID == SIMCONNECT_RECV_ID_CLOUD_STATE
{
DWORD dwRequestID;
DWORD dwArraySize;
SIMCONNECT_FIXEDTYPE_DATAV(BYTE, rgbData, dwArraySize, U1 /*member of UnmanagedType enum*/ , System::Byte /*cli type*/);
};
SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_ASSIGNED_OBJECT_ID : public SIMCONNECT_RECV // when dwID == SIMCONNECT_RECV_ID_ASSIGNED_OBJECT_ID
{
DWORD dwRequestID;
DWORD dwObjectID;
};
SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_RESERVED_KEY : public SIMCONNECT_RECV // when dwID == SIMCONNECT_RECV_ID_RESERVED_KEY
{
SIMCONNECT_STRING( szChoiceReserved, 30);
SIMCONNECT_STRING( szReservedKey, 50);
};
SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_SYSTEM_STATE : public SIMCONNECT_RECV // when dwID == SIMCONNECT_RECV_ID_SYSTEM_STATE
{
DWORD dwRequestID;
DWORD dwInteger;
float fFloat;
SIMCONNECT_STRING( szString, MAX_PATH);
};
SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_CUSTOM_ACTION : public SIMCONNECT_RECV_EVENT
{
SIMCONNECT_GUID guidInstanceId; // Instance id of the action that executed
DWORD dwWaitForCompletion; // Wait for completion flag on the action
SIMCONNECT_STRINGV( szPayLoad); // Variable length string payload associated with the mission action.
};
SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_EVENT_WEATHER_MODE : public SIMCONNECT_RECV_EVENT
{
// No event specific data - the new weather mode is in the base structure dwData member.
};
// SIMCONNECT_RECV_FACILITIES_LIST
SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_FACILITIES_LIST : public SIMCONNECT_RECV
{
DWORD dwRequestID;
DWORD dwArraySize;
DWORD dwEntryNumber; // when the array of items is too big for one send, which send this is (0..dwOutOf-1)
DWORD dwOutOf; // total number of transmissions the list is chopped into
};
// SIMCONNECT_DATA_FACILITY_AIRPORT
SIMCONNECT_REFSTRUCT SIMCONNECT_DATA_FACILITY_AIRPORT
{
SIMCONNECT_STRING(Icao, 9); // ICAO of the object
double Latitude; // degrees
double Longitude; // degrees
double Altitude; // meters
};
// SIMCONNECT_RECV_AIRPORT_LIST
SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_AIRPORT_LIST : public SIMCONNECT_RECV_FACILITIES_LIST
{
SIMCONNECT_FIXEDTYPE_DATAV(SIMCONNECT_DATA_FACILITY_AIRPORT, rgData, dwArraySize, U1 /*member of UnmanagedType enum*/, SIMCONNECT_DATA_FACILITY_AIRPORT /*cli type*/);
};
// SIMCONNECT_DATA_FACILITY_WAYPOINT
SIMCONNECT_REFSTRUCT SIMCONNECT_DATA_FACILITY_WAYPOINT : public SIMCONNECT_DATA_FACILITY_AIRPORT
{
float fMagVar; // Magvar in degrees
};
// SIMCONNECT_RECV_WAYPOINT_LIST
SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_WAYPOINT_LIST : public SIMCONNECT_RECV_FACILITIES_LIST
{
SIMCONNECT_FIXEDTYPE_DATAV(SIMCONNECT_DATA_FACILITY_WAYPOINT, rgData, dwArraySize, U1 /*member of UnmanagedType enum*/, SIMCONNECT_DATA_FACILITY_WAYPOINT /*cli type*/);
};
// SIMCONNECT_DATA_FACILITY_NDB
SIMCONNECT_REFSTRUCT SIMCONNECT_DATA_FACILITY_NDB : public SIMCONNECT_DATA_FACILITY_WAYPOINT
{
DWORD fFrequency; // frequency in Hz
};
// SIMCONNECT_RECV_NDB_LIST
SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_NDB_LIST : public SIMCONNECT_RECV_FACILITIES_LIST
{
SIMCONNECT_FIXEDTYPE_DATAV(SIMCONNECT_DATA_FACILITY_NDB, rgData, dwArraySize, U1 /*member of UnmanagedType enum*/, SIMCONNECT_DATA_FACILITY_NDB /*cli type*/);
};
// SIMCONNECT_DATA_FACILITY_VOR
SIMCONNECT_REFSTRUCT SIMCONNECT_DATA_FACILITY_VOR : public SIMCONNECT_DATA_FACILITY_NDB
{
DWORD Flags; // SIMCONNECT_VOR_FLAGS
float fLocalizer; // Localizer in degrees
double GlideLat; // Glide Slope Location (deg, deg, meters)
double GlideLon;
double GlideAlt;
float fGlideSlopeAngle; // Glide Slope in degrees
};
// SIMCONNECT_RECV_VOR_LIST
SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_VOR_LIST : public SIMCONNECT_RECV_FACILITIES_LIST
{
SIMCONNECT_FIXEDTYPE_DATAV(SIMCONNECT_DATA_FACILITY_VOR, rgData, dwArraySize, U1 /*member of UnmanagedType enum*/, SIMCONNECT_DATA_FACILITY_VOR /*cli type*/);
};
SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_FACILITY_DATA : public SIMCONNECT_RECV
{
DWORD UserRequestId;
DWORD UniqueRequestId;
DWORD ParentUniqueRequestId;
DWORD Type;
DWORD IsListItem;
DWORD ItemIndex;
DWORD ListSize;
SIMCONNECT_DATAV(Data, Type, );
};
SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_FACILITY_DATA_END : public SIMCONNECT_RECV
{
DWORD RequestId;
};
#ifdef ENABLE_SIMCONNECT_EXPERIMENTAL
SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_PICK : public SIMCONNECT_RECV // when dwID == SIMCONNECT_RECV_ID_RESERVED_KEY
{
HANDLE hContext;
DWORD dwFlags; //
double Latitude; // degrees
double Longitude; // degrees
double Altitude; // feet
int xPos; //reserved
int yPos; //reserved;
DWORD dwSimObjectID;
HANDLE hSceneryObject;
DWORD dwentrynumber; // if multiple objects returned, this is number <entrynumber> out of <outof>.
DWORD dwoutof; // note: starts with 1, not 0.
};
#endif //ENABLE_SIMCONNECT_EXPERIMENTAL
// SIMCONNECT_DATATYPE_INITPOSITION
SIMCONNECT_STRUCT SIMCONNECT_DATA_INITPOSITION
{
double Latitude; // degrees
double Longitude; // degrees
double Altitude; // feet
double Pitch; // degrees
double Bank; // degrees
double Heading; // degrees
DWORD OnGround; // 1=force to be on the ground
DWORD Airspeed; // knots
};
// SIMCONNECT_DATATYPE_MARKERSTATE
SIMCONNECT_STRUCT SIMCONNECT_DATA_MARKERSTATE
{
SIMCONNECT_STRING( szMarkerName, 64);
DWORD dwMarkerState;
};
// SIMCONNECT_DATATYPE_WAYPOINT
SIMCONNECT_STRUCT SIMCONNECT_DATA_WAYPOINT
{
double Latitude; // degrees
double Longitude; // degrees
double Altitude; // feet
unsigned long Flags;
double ktsSpeed; // knots
double percentThrottle;
};
// SIMCONNECT_DATA_LATLONALT
SIMCONNECT_STRUCT SIMCONNECT_DATA_LATLONALT
{
double Latitude;
double Longitude;
double Altitude;
};
// SIMCONNECT_DATA_XYZ
SIMCONNECT_STRUCT SIMCONNECT_DATA_XYZ
{
double x;
double y;
double z;
};
#pragma pack(pop)
//----------------------------------------------------------------------------
// End of Struct definitions
//----------------------------------------------------------------------------
#if !defined(SIMCONNECTAPI)
#define SIMCONNECTAPI extern "C" HRESULT __stdcall
#endif
typedef void (CALLBACK *DispatchProc)(SIMCONNECT_RECV* pData, DWORD cbData, void* pContext);
SIMCONNECTAPI SimConnect_MapClientEventToSimEvent(HANDLE hSimConnect, SIMCONNECT_CLIENT_EVENT_ID EventID, const char * EventName = "");
SIMCONNECTAPI SimConnect_TransmitClientEvent(HANDLE hSimConnect, SIMCONNECT_OBJECT_ID ObjectID, SIMCONNECT_CLIENT_EVENT_ID EventID, DWORD dwData, SIMCONNECT_NOTIFICATION_GROUP_ID GroupID, SIMCONNECT_EVENT_FLAG Flags);
SIMCONNECTAPI SimConnect_SetSystemEventState(HANDLE hSimConnect, SIMCONNECT_CLIENT_EVENT_ID EventID, SIMCONNECT_STATE dwState);
SIMCONNECTAPI SimConnect_AddClientEventToNotificationGroup(HANDLE hSimConnect, SIMCONNECT_NOTIFICATION_GROUP_ID GroupID, SIMCONNECT_CLIENT_EVENT_ID EventID, BOOL bMaskable = FALSE);
SIMCONNECTAPI SimConnect_RemoveClientEvent(HANDLE hSimConnect, SIMCONNECT_NOTIFICATION_GROUP_ID GroupID, SIMCONNECT_CLIENT_EVENT_ID EventID);
SIMCONNECTAPI SimConnect_SetNotificationGroupPriority(HANDLE hSimConnect, SIMCONNECT_NOTIFICATION_GROUP_ID GroupID, DWORD uPriority);
SIMCONNECTAPI SimConnect_ClearNotificationGroup(HANDLE hSimConnect, SIMCONNECT_NOTIFICATION_GROUP_ID GroupID);
SIMCONNECTAPI SimConnect_RequestNotificationGroup(HANDLE hSimConnect, SIMCONNECT_NOTIFICATION_GROUP_ID GroupID, DWORD dwReserved = 0, DWORD Flags = 0);
SIMCONNECTAPI SimConnect_AddToDataDefinition(HANDLE hSimConnect, SIMCONNECT_DATA_DEFINITION_ID DefineID, const char * DatumName, const char * UnitsName, SIMCONNECT_DATATYPE DatumType = SIMCONNECT_DATATYPE_FLOAT64, float fEpsilon = 0, DWORD DatumID = SIMCONNECT_UNUSED);
SIMCONNECTAPI SimConnect_ClearDataDefinition(HANDLE hSimConnect, SIMCONNECT_DATA_DEFINITION_ID DefineID);
SIMCONNECTAPI SimConnect_RequestDataOnSimObject(HANDLE hSimConnect, SIMCONNECT_DATA_REQUEST_ID RequestID, SIMCONNECT_DATA_DEFINITION_ID DefineID, SIMCONNECT_OBJECT_ID ObjectID, SIMCONNECT_PERIOD Period, SIMCONNECT_DATA_REQUEST_FLAG Flags = 0, DWORD origin = 0, DWORD interval = 0, DWORD limit = 0);
SIMCONNECTAPI SimConnect_RequestDataOnSimObjectType(HANDLE hSimConnect, SIMCONNECT_DATA_REQUEST_ID RequestID, SIMCONNECT_DATA_DEFINITION_ID DefineID, DWORD dwRadiusMeters, SIMCONNECT_SIMOBJECT_TYPE type);
SIMCONNECTAPI SimConnect_SetDataOnSimObject(HANDLE hSimConnect, SIMCONNECT_DATA_DEFINITION_ID DefineID, SIMCONNECT_OBJECT_ID ObjectID, SIMCONNECT_DATA_SET_FLAG Flags, DWORD ArrayCount, DWORD cbUnitSize, void * pDataSet);
SIMCONNECTAPI SimConnect_MapInputEventToClientEvent(HANDLE hSimConnect, SIMCONNECT_INPUT_GROUP_ID GroupID, const char * szInputDefinition, SIMCONNECT_CLIENT_EVENT_ID DownEventID, DWORD DownValue = 0, SIMCONNECT_CLIENT_EVENT_ID UpEventID = (SIMCONNECT_CLIENT_EVENT_ID)SIMCONNECT_UNUSED, DWORD UpValue = 0, BOOL bMaskable = FALSE);
SIMCONNECTAPI SimConnect_SetInputGroupPriority(HANDLE hSimConnect, SIMCONNECT_INPUT_GROUP_ID GroupID, DWORD uPriority);
SIMCONNECTAPI SimConnect_RemoveInputEvent(HANDLE hSimConnect, SIMCONNECT_INPUT_GROUP_ID GroupID, const char * szInputDefinition);
SIMCONNECTAPI SimConnect_ClearInputGroup(HANDLE hSimConnect, SIMCONNECT_INPUT_GROUP_ID GroupID);
SIMCONNECTAPI SimConnect_SetInputGroupState(HANDLE hSimConnect, SIMCONNECT_INPUT_GROUP_ID GroupID, DWORD dwState);
SIMCONNECTAPI SimConnect_RequestReservedKey(HANDLE hSimConnect, SIMCONNECT_CLIENT_EVENT_ID EventID, const char * szKeyChoice1 = "", const char * szKeyChoice2 = "", const char * szKeyChoice3 = "");
SIMCONNECTAPI SimConnect_SubscribeToSystemEvent(HANDLE hSimConnect, SIMCONNECT_CLIENT_EVENT_ID EventID, const char * SystemEventName);
SIMCONNECTAPI SimConnect_UnsubscribeFromSystemEvent(HANDLE hSimConnect, SIMCONNECT_CLIENT_EVENT_ID EventID);
SIMCONNECTAPI SimConnect_WeatherRequestInterpolatedObservation(HANDLE hSimConnect, SIMCONNECT_DATA_REQUEST_ID RequestID, float lat, float lon, float alt);
SIMCONNECTAPI SimConnect_WeatherRequestObservationAtStation(HANDLE hSimConnect, SIMCONNECT_DATA_REQUEST_ID RequestID, const char * szICAO);
SIMCONNECTAPI SimConnect_WeatherRequestObservationAtNearestStation(HANDLE hSimConnect, SIMCONNECT_DATA_REQUEST_ID RequestID, float lat, float lon);
SIMCONNECTAPI SimConnect_WeatherCreateStation(HANDLE hSimConnect, SIMCONNECT_DATA_REQUEST_ID RequestID, const char * szICAO, const char * szName, float lat, float lon, float alt);
SIMCONNECTAPI SimConnect_WeatherRemoveStation(HANDLE hSimConnect, SIMCONNECT_DATA_REQUEST_ID RequestID, const char * szICAO);
SIMCONNECTAPI SimConnect_WeatherSetObservation(HANDLE hSimConnect, DWORD Seconds, const char * szMETAR);
SIMCONNECTAPI SimConnect_WeatherSetModeServer(HANDLE hSimConnect, DWORD dwPort, DWORD dwSeconds);
SIMCONNECTAPI SimConnect_WeatherSetModeTheme(HANDLE hSimConnect, const char * szThemeName);
SIMCONNECTAPI SimConnect_WeatherSetModeGlobal(HANDLE hSimConnect);
SIMCONNECTAPI SimConnect_WeatherSetModeCustom(HANDLE hSimConnect);
SIMCONNECTAPI SimConnect_WeatherSetDynamicUpdateRate(HANDLE hSimConnect, DWORD dwRate);
SIMCONNECTAPI SimConnect_WeatherRequestCloudState(HANDLE hSimConnect, SIMCONNECT_DATA_REQUEST_ID RequestID, float minLat, float minLon, float minAlt, float maxLat, float maxLon, float maxAlt, DWORD dwFlags = 0);
SIMCONNECTAPI SimConnect_WeatherCreateThermal(HANDLE hSimConnect, SIMCONNECT_DATA_REQUEST_ID RequestID, float lat, float lon, float alt, float radius, float height, float coreRate = 3.0f, float coreTurbulence = 0.05f, float sinkRate = 3.0f, float sinkTurbulence = 0.2f, float coreSize = 0.4f, float coreTransitionSize = 0.1f, float sinkLayerSize = 0.4f, float sinkTransitionSize = 0.1f);
SIMCONNECTAPI SimConnect_WeatherRemoveThermal(HANDLE hSimConnect, SIMCONNECT_OBJECT_ID ObjectID);
SIMCONNECTAPI SimConnect_AICreateParkedATCAircraft(HANDLE hSimConnect, const char * szContainerTitle, const char * szTailNumber, const char * szAirportID, SIMCONNECT_DATA_REQUEST_ID RequestID);
SIMCONNECTAPI SimConnect_AICreateEnrouteATCAircraft(HANDLE hSimConnect, const char * szContainerTitle, const char * szTailNumber, int iFlightNumber, const char * szFlightPlanPath, double dFlightPlanPosition, BOOL bTouchAndGo, SIMCONNECT_DATA_REQUEST_ID RequestID);
SIMCONNECTAPI SimConnect_AICreateNonATCAircraft(HANDLE hSimConnect, const char * szContainerTitle, const char * szTailNumber, SIMCONNECT_DATA_INITPOSITION InitPos, SIMCONNECT_DATA_REQUEST_ID RequestID);
SIMCONNECTAPI SimConnect_AICreateSimulatedObject(HANDLE hSimConnect, const char * szContainerTitle, SIMCONNECT_DATA_INITPOSITION InitPos, SIMCONNECT_DATA_REQUEST_ID RequestID);
SIMCONNECTAPI SimConnect_AIReleaseControl(HANDLE hSimConnect, SIMCONNECT_OBJECT_ID ObjectID, SIMCONNECT_DATA_REQUEST_ID RequestID);
SIMCONNECTAPI SimConnect_AIRemoveObject(HANDLE hSimConnect, SIMCONNECT_OBJECT_ID ObjectID, SIMCONNECT_DATA_REQUEST_ID RequestID);
SIMCONNECTAPI SimConnect_AISetAircraftFlightPlan(HANDLE hSimConnect, SIMCONNECT_OBJECT_ID ObjectID, const char * szFlightPlanPath, SIMCONNECT_DATA_REQUEST_ID RequestID);
SIMCONNECTAPI SimConnect_ExecuteMissionAction(HANDLE hSimConnect, const GUID guidInstanceId);
SIMCONNECTAPI SimConnect_CompleteCustomMissionAction(HANDLE hSimConnect, const GUID guidInstanceId);
SIMCONNECTAPI SimConnect_Close(HANDLE hSimConnect);
SIMCONNECTAPI SimConnect_RetrieveString(SIMCONNECT_RECV * pData, DWORD cbData, void * pStringV, char ** pszString, DWORD * pcbString);
SIMCONNECTAPI SimConnect_GetLastSentPacketID(HANDLE hSimConnect, DWORD * pdwError);
SIMCONNECTAPI SimConnect_Open(HANDLE * phSimConnect, LPCSTR szName, HWND hWnd, DWORD UserEventWin32, HANDLE hEventHandle, DWORD ConfigIndex);
SIMCONNECTAPI SimConnect_CallDispatch(HANDLE hSimConnect, DispatchProc pfcnDispatch, void * pContext);
SIMCONNECTAPI SimConnect_GetNextDispatch(HANDLE hSimConnect, SIMCONNECT_RECV ** ppData, DWORD * pcbData);
SIMCONNECTAPI SimConnect_RequestResponseTimes(HANDLE hSimConnect, DWORD nCount, float * fElapsedSeconds);
SIMCONNECTAPI SimConnect_InsertString(char * pDest, DWORD cbDest, void ** ppEnd, DWORD * pcbStringV, const char * pSource);
SIMCONNECTAPI SimConnect_CameraSetRelative6DOF(HANDLE hSimConnect, float fDeltaX, float fDeltaY, float fDeltaZ, float fPitchDeg, float fBankDeg, float fHeadingDeg);
SIMCONNECTAPI SimConnect_MenuAddItem(HANDLE hSimConnect, const char * szMenuItem, SIMCONNECT_CLIENT_EVENT_ID MenuEventID, DWORD dwData);
SIMCONNECTAPI SimConnect_MenuDeleteItem(HANDLE hSimConnect, SIMCONNECT_CLIENT_EVENT_ID MenuEventID);
SIMCONNECTAPI SimConnect_MenuAddSubItem(HANDLE hSimConnect, SIMCONNECT_CLIENT_EVENT_ID MenuEventID, const char * szMenuItem, SIMCONNECT_CLIENT_EVENT_ID SubMenuEventID, DWORD dwData);
SIMCONNECTAPI SimConnect_MenuDeleteSubItem(HANDLE hSimConnect, SIMCONNECT_CLIENT_EVENT_ID MenuEventID, const SIMCONNECT_CLIENT_EVENT_ID SubMenuEventID);
SIMCONNECTAPI SimConnect_RequestSystemState(HANDLE hSimConnect, SIMCONNECT_DATA_REQUEST_ID RequestID, const char * szState);
SIMCONNECTAPI SimConnect_SetSystemState(HANDLE hSimConnect, const char * szState, DWORD dwInteger, float fFloat, const char * szString);
SIMCONNECTAPI SimConnect_MapClientDataNameToID(HANDLE hSimConnect, const char * szClientDataName, SIMCONNECT_CLIENT_DATA_ID ClientDataID);
SIMCONNECTAPI SimConnect_CreateClientData(HANDLE hSimConnect, SIMCONNECT_CLIENT_DATA_ID ClientDataID, DWORD dwSize, SIMCONNECT_CREATE_CLIENT_DATA_FLAG Flags);
SIMCONNECTAPI SimConnect_AddToClientDataDefinition(HANDLE hSimConnect, SIMCONNECT_CLIENT_DATA_DEFINITION_ID DefineID, DWORD dwOffset, DWORD dwSizeOrType, float fEpsilon = 0, DWORD DatumID = SIMCONNECT_UNUSED);
SIMCONNECTAPI SimConnect_ClearClientDataDefinition(HANDLE hSimConnect, SIMCONNECT_CLIENT_DATA_DEFINITION_ID DefineID);
SIMCONNECTAPI SimConnect_RequestClientData(HANDLE hSimConnect, SIMCONNECT_CLIENT_DATA_ID ClientDataID, SIMCONNECT_DATA_REQUEST_ID RequestID, SIMCONNECT_CLIENT_DATA_DEFINITION_ID DefineID, SIMCONNECT_CLIENT_DATA_PERIOD Period = SIMCONNECT_CLIENT_DATA_PERIOD_ONCE, SIMCONNECT_CLIENT_DATA_REQUEST_FLAG Flags = 0, DWORD origin = 0, DWORD interval = 0, DWORD limit = 0);
SIMCONNECTAPI SimConnect_SetClientData(HANDLE hSimConnect, SIMCONNECT_CLIENT_DATA_ID ClientDataID, SIMCONNECT_CLIENT_DATA_DEFINITION_ID DefineID, SIMCONNECT_CLIENT_DATA_SET_FLAG Flags, DWORD dwReserved, DWORD cbUnitSize, void * pDataSet);
SIMCONNECTAPI SimConnect_FlightLoad(HANDLE hSimConnect, const char * szFileName);
SIMCONNECTAPI SimConnect_FlightSave(HANDLE hSimConnect, const char * szFileName, const char * szTitle, const char * szDescription, DWORD Flags);
SIMCONNECTAPI SimConnect_FlightPlanLoad(HANDLE hSimConnect, const char * szFileName);
SIMCONNECTAPI SimConnect_Text(HANDLE hSimConnect, SIMCONNECT_TEXT_TYPE type, float fTimeSeconds, SIMCONNECT_CLIENT_EVENT_ID EventID, DWORD cbUnitSize, void * pDataSet);
SIMCONNECTAPI SimConnect_SubscribeToFacilities(HANDLE hSimConnect, SIMCONNECT_FACILITY_LIST_TYPE type, SIMCONNECT_DATA_REQUEST_ID RequestID);
SIMCONNECTAPI SimConnect_UnsubscribeToFacilities(HANDLE hSimConnect, SIMCONNECT_FACILITY_LIST_TYPE type);
SIMCONNECTAPI SimConnect_RequestFacilitiesList(HANDLE hSimConnect, SIMCONNECT_FACILITY_LIST_TYPE type, SIMCONNECT_DATA_REQUEST_ID RequestID);
SIMCONNECTAPI SimConnect_TransmitClientEvent_EX1(HANDLE hSimConnect, SIMCONNECT_OBJECT_ID ObjectID, SIMCONNECT_CLIENT_EVENT_ID EventID, SIMCONNECT_NOTIFICATION_GROUP_ID GroupID, SIMCONNECT_EVENT_FLAG Flags, DWORD dwData0, DWORD dwData1 = 0, DWORD dwData2 = 0, DWORD dwData3 = 0, DWORD dwData4 = 0);
SIMCONNECTAPI SimConnect_AddToFacilityDefinition(HANDLE hSimConnect, SIMCONNECT_DATA_DEFINITION_ID DefineID, const char * FieldName);
SIMCONNECTAPI SimConnect_RequestFacilityData(HANDLE hSimConnect, SIMCONNECT_DATA_DEFINITION_ID DefineID, SIMCONNECT_DATA_REQUEST_ID RequestID, const char * ICAO, const char * Region = "");
SIMCONNECTAPI SimConnect_SubscribeToFacilities_EX1(HANDLE hSimConnect, SIMCONNECT_FACILITY_LIST_TYPE type, SIMCONNECT_DATA_REQUEST_ID newElemInRangeRequestID, SIMCONNECT_DATA_REQUEST_ID oldElemOutRangeRequestID);
SIMCONNECTAPI SimConnect_UnsubscribeToFacilities_EX1(HANDLE hSimConnect, SIMCONNECT_FACILITY_LIST_TYPE type, bool bUnsubscribeNewInRange, bool bUnsubscribeOldOutRange);
SIMCONNECTAPI SimConnect_RequestFacilitiesList_EX1(HANDLE hSimConnect, SIMCONNECT_FACILITY_LIST_TYPE type, SIMCONNECT_DATA_REQUEST_ID RequestID);
#endif // _SIMCONNECT_H_
+24
View File
@@ -0,0 +1,24 @@
- SimDatabase
- Call to MakeRwys
- SimConnect
- New Facillity API for 64Bit
- Recording Class
- Bundle all threads, databAse, config, websocket
- Handle SimConnect DB load based on connected Version
- Use SimConnect NavData API for MSFS
- Handle 32 Bit to not allow MSFS
- Websocket
- Increase sent data
- path: Path to ACF/AIR/Whatever on MSFS
- hash: Hash of file at path
- Requires mapping akin to C#
- Try to be fast
- Define Protocoll
- Login Master Slave
- Commands
- Text
- Port
- Time
+556
View File
@@ -0,0 +1,556 @@
#ifndef _XPStandardWidgets_h_
#define _XPStandardWidgets_h_
/*
* Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See
* license.txt for usage. X-Plane SDK Version: 2.1.1
*
*/
/***************************************************************************
* XPStandardWidgets
***************************************************************************/
/*
* ## THEORY OF OPERATION
*
* The standard widgets are widgets built into the widgets library. While you
* can gain access to the widget function that drives them, you generally use
* them by calling XPCreateWidget and then listening for special messages,
* etc.
*
* The standard widgets often send mesages to themselves when the user
* performs an event; these messages are sent up the widget hierarchy until
* they are handled. So you can add a widget proc directly to a push button
* (for example) to intercept the message when it is clicked, or you can put
* one widget proc on a window for all of the push buttons in the window. Most
* of these messages contain the original widget ID as a parameter so you can
* know which widget is messaging no matter who it is sent to.
*
*/
#include "XPWidgetDefs.h"
#ifdef __cplusplus
extern "C" {
#endif
/***************************************************************************
* MAIN WINDOW
***************************************************************************/
/*
* The main window widget class provides a "window" as the user knows it.
* These windows are dragable and can be selected. Use them to create floating
* windows and non-modal dialogs.
*
*/
#define xpWidgetClass_MainWindow 1
/*
* Main Window Type Values
*
* These type values are used to control the appearance of a main window.
*
*/
enum {
/* The standard main window; pin stripes on XP7, metal frame on XP 6. */
xpMainWindowStyle_MainWindow = 0,
/* A translucent dark gray window, like the one ATC messages appear in. */
xpMainWindowStyle_Translucent = 1,
};
/*
* Main Window Properties
*
*/
enum {
/* This property specifies the type of window. Set to one of the main window *
* types above. */
xpProperty_MainWindowType = 1100,
/* This property specifies whether the main window has close boxes in its *
* corners. */
xpProperty_MainWindowHasCloseBoxes = 1200,
};
/*
* MainWindow Messages
*
*/
enum {
/* This message is sent when the close buttons are pressed for your window. */
xpMessage_CloseButtonPushed = 1200,
};
/***************************************************************************
* SUB WINDOW
***************************************************************************/
/*
* X-Plane dialogs are divided into separate areas; the sub window widgets
* allow you to make these areas. Create one main window and place several
* subwindows inside it. Then place your controls inside the subwindows.
*
*/
#define xpWidgetClass_SubWindow 2
/*
* SubWindow Type Values
*
* These values control the appearance of the subwindow.
*
*/
enum {
/* A panel that sits inside a main window. */
xpSubWindowStyle_SubWindow = 0,
/* A screen that sits inside a panel for showing text information. */
xpSubWindowStyle_Screen = 2,
/* A list view for scrolling lists. */
xpSubWindowStyle_ListView = 3,
};
/*
* SubWindow Properties
*
*/
enum {
/* This property specifies the type of window. Set to one of the subwindow *
* types above. */
xpProperty_SubWindowType = 1200,
};
/***************************************************************************
* BUTTON
***************************************************************************/
/*
* The button class provides a number of different button styles and
* behaviors, including push buttons, radio buttons, check boxes, etc. The
* button label appears on or next to the button depending on the button's
* appearance, or type.
*
* The button's behavior is a separate property that dictates who it hilights
* and what kinds of messages it sends. Since behavior and type are different,
* you can do strange things like make check boxes that act as push buttons or
* push buttons with radio button behavior.
*
* In X-Plane 6 there were no check box graphics. The result is the following
* behavior: in X-Plane
* 6 all check box and radio buttons are round (radio-button style) buttons;
* in X-Plane 7 they are all square (check-box style) buttons. In a future
* version of X-Plane, the xpButtonBehavior enums will provide the correct
* graphic (check box or radio button) giving the expected result.
*
*/
#define xpWidgetClass_Button 3
/*
* Button Types
*
* These define the visual appearance of buttons but not how they respond to
* the mouse.
*
*/
enum {
/* This is a standard push button, like an 'OK' or 'Cancel' button in a dialog*
* box. */
xpPushButton = 0,
/* A check box or radio button. Use this and the button behaviors below to *
* get the desired behavior. */
xpRadioButton = 1,
/* A window close box. */
xpWindowCloseBox = 3,
/* A small down arrow. */
xpLittleDownArrow = 5,
/* A small up arrow. */
xpLittleUpArrow = 6,
};
/*
* Button Behavior Values
*
* These define how the button responds to mouse clicks.
*
*/
enum {
/* Standard push button behavior. The button hilites while the mouse is *
* clicked over it and unhilites when the mouse is moved outside of it or *
* released. If the mouse is released over the button, the *
* xpMsg_PushButtonPressed message is sent. */
xpButtonBehaviorPushButton = 0,
/* Check box behavior. The button immediately toggles its value when the mouse*
* is clicked and sends out a xpMsg_ButtonStateChanged message. */
xpButtonBehaviorCheckBox = 1,
/* Radio button behavior. The button immediately sets its state to one and *
* sends out a xpMsg_ButtonStateChanged message if it was not already set to *
* one. You must turn off other radio buttons in a group in your code. */
xpButtonBehaviorRadioButton = 2,
};
/*
* Button Properties
*
*/
enum {
/* This property sets the visual type of button. Use one of the button types *
* above. */
xpProperty_ButtonType = 1300,
/* This property sets the button's behavior. Use one of the button behaviors *
* above. */
xpProperty_ButtonBehavior = 1301,
/* This property tells whether a check box or radio button is "checked" or *
* not. Not used for push buttons. */
xpProperty_ButtonState = 1302,
};
/*
* Button Messages
*
* These messages are sent by the button to itself and then up the widget
* chain when the button is clicked. (You may intercept them by providing a
* widget handler for the button itself or by providing a handler in a parent
* widget.)
*
*/
enum {
/* This message is sent when the user completes a click and release in a *
* button with push button behavior. Parameter one of the message is the *
* widget ID of the button. This message is dispatched up the widget *
* hierarchy. */
xpMsg_PushButtonPressed = 1300,
/* This message is sent when a button is clicked that has radio button or *
* check box behavior and its value changes. (Note that if the value changes *
* by setting a property you do not receive this message!) Parameter one is *
* the widget ID of the button, parameter 2 is the new state value, either *
* zero or one. This message is dispatched up the widget hierarchy. */
xpMsg_ButtonStateChanged = 1301,
};
/***************************************************************************
* TEXT FIELD
***************************************************************************/
/*
* The text field widget provides an editable text field including mouse
* selection and keyboard navigation. The contents of the text field are its
* descriptor. (The descriptor changes as the user types.)
*
* The text field can have a number of types, that effect the visual layout of
* the text field. The text field sends messages to itself so you may control
* its behavior.
*
* If you need to filter keystrokes, add a new handler and intercept the key
* press message. Since key presses are passed by pointer, you can modify the
* keystroke and pass it through to the text field widget.
*
* WARNING: in X-Plane before 7.10 (including 6.70) null characters could
* crash X-Plane. To prevent this, wrap this object with a filter function
* (more instructions can be found on the SDK website).
*
*/
#define xpWidgetClass_TextField 4
/*
* Text Field Type Values
*
* These control the look of the text field.
*
*/
enum {
/* A field for text entry. */
xpTextEntryField = 0,
/* A transparent text field. The user can type and the text is drawn, but no *
* background is drawn. You can draw your own background by adding a widget *
* handler and prehandling the draw message. */
xpTextTransparent = 3,
/* A translucent edit field, dark gray. */
xpTextTranslucent = 4,
};
/*
* Text Field Properties
*
*/
enum {
/* This is the character position the selection starts at, zero based. If it *
* is the same as the end insertion point, the insertion point is not a *
* selection. */
xpProperty_EditFieldSelStart = 1400,
/* This is the character position of the end of the selection. */
xpProperty_EditFieldSelEnd = 1401,
/* This is the character position a drag was started at if the user is *
* dragging to select text, or -1 if a drag is not in progress. */
xpProperty_EditFieldSelDragStart = 1402,
/* This is the type of text field to display, from the above list. */
xpProperty_TextFieldType = 1403,
/* Set this property to 1 to password protect the field. Characters will be *
* drawn as *s even though the descriptor will contain plain-text. */
xpProperty_PasswordMode = 1404,
/* The max number of characters you can enter, if limited. Zero means *
* unlimited. */
xpProperty_MaxCharacters = 1405,
/* The first visible character on the left. This effectively scrolls the text*
* field. */
xpProperty_ScrollPosition = 1406,
/* The font to draw the field's text with. (An XPLMFontID.) */
xpProperty_Font = 1407,
/* This is the active side of the insert selection. (Internal) */
xpProperty_ActiveEditSide = 1408,
};
/*
* Text Field Messages
*
*/
enum {
/* The text field sends this message to itself when its text changes. It sends*
* the message up the call chain; param1 is the text field's widget ID. */
xpMsg_TextFieldChanged = 1400,
};
/***************************************************************************
* SCROLL BAR
***************************************************************************/
/*
* A standard scroll bar or slider control. The scroll bar has a minimum,
* maximum and current value that is updated when the user drags it. The
* scroll bar sends continuous messages as it is dragged.
*
*/
#define xpWidgetClass_ScrollBar 5
/*
* Scroll Bar Type Values
*
* This defines how the scroll bar looks.
*
*/
enum {
/* A standard X-Plane scroll bar (with arrows on the ends). */
xpScrollBarTypeScrollBar = 0,
/* A slider, no arrows. */
xpScrollBarTypeSlider = 1,
};
/*
* Scroll Bar Properties
*
*/
enum {
/* The current position of the thumb (in between the min and max, inclusive) */
xpProperty_ScrollBarSliderPosition = 1500,
/* The value the scroll bar has when the thumb is in the lowest position. */
xpProperty_ScrollBarMin = 1501,
/* The value the scroll bar has when the thumb is in the highest position. */
xpProperty_ScrollBarMax = 1502,
/* How many units to move the scroll bar when clicking next to the thumb. The *
* scroll bar always moves one unit when the arrows are clicked. */
xpProperty_ScrollBarPageAmount = 1503,
/* The type of scrollbar from the enums above. */
xpProperty_ScrollBarType = 1504,
/* Used internally. */
xpProperty_ScrollBarSlop = 1505,
};
/*
* Scroll Bar Messages
*
*/
enum {
/* The scroll bar sends this message when the slider position changes. It *
* sends the message up the call chain; param1 is the Scroll Bar widget ID. */
xpMsg_ScrollBarSliderPositionChanged = 1500,
};
/***************************************************************************
* CAPTION
***************************************************************************/
/*
* A caption is a simple widget that shows its descriptor as a string, useful
* for labeling parts of a window. It always shows its descriptor as its
* string and is otherwise transparent.
*
*/
#define xpWidgetClass_Caption 6
/*
* Caption Properties
*
*/
enum {
/* This property specifies whether the caption is lit; use lit captions *
* against screens. */
xpProperty_CaptionLit = 1600,
};
/***************************************************************************
* GENERAL GRAPHICS
***************************************************************************/
/*
* The general graphics widget can show one of many icons available from
* X-Plane.
*
*/
#define xpWidgetClass_GeneralGraphics 7
/*
* General Graphics Types Values
*
* These define the icon for the general graphics.
*
*/
enum {
xpShip = 4,
xpILSGlideScope = 5,
xpMarkerLeft = 6,
xp_Airport = 7,
xpNDB = 8,
xpVOR = 9,
xpRadioTower = 10,
xpAircraftCarrier = 11,
xpFire = 12,
xpMarkerRight = 13,
xpCustomObject = 14,
xpCoolingTower = 15,
xpSmokeStack = 16,
xpBuilding = 17,
xpPowerLine = 18,
xpVORWithCompassRose = 19,
xpOilPlatform = 21,
xpOilPlatformSmall = 22,
xpWayPoint = 23,
};
/*
* General Graphics Properties
*
*/
enum {
/* This property controls the type of icon that is drawn. */
xpProperty_GeneralGraphicsType = 1700,
};
/***************************************************************************
* PROGRESS INDICATOR
***************************************************************************/
/*
* This widget implements a progress indicator as seen when X-Plane starts up.
*
*/
#define xpWidgetClass_Progress 8
/*
* Progress Indicator Properties
*
*/
enum {
/* This is the current value of the progress indicator. */
xpProperty_ProgressPosition = 1800,
/* This is the minimum value, equivalent to 0% filled. */
xpProperty_ProgressMin = 1801,
/* This is the maximum value, equivalent to 100% filled. */
xpProperty_ProgressMax = 1802,
};
#ifdef __cplusplus
}
#endif
#endif
+354
View File
@@ -0,0 +1,354 @@
#ifndef _XPUIGraphics_h_
#define _XPUIGraphics_h_
/*
* Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See
* license.txt for usage. X-Plane SDK Version: 2.1.1
*
*/
/***************************************************************************
* XPUIGraphics
***************************************************************************/
#include "XPWidgetDefs.h"
#ifdef __cplusplus
extern "C" {
#endif
/***************************************************************************
* UI GRAPHICS
***************************************************************************/
/*
* XPWindowStyle
*
* There are a few built-in window styles in X-Plane that you can use.
*
* Note that X-Plane 6 does not offer real shadow-compositing; you must make
* sure to put a window on top of another window of the right style to the
* shadows work, etc. This applies to elements with insets and shadows. The
* rules are:
*
* Sub windows must go on top of main windows, and screens and list views on
* top of subwindows. Only help and main windows can be over the main screen.
*
* With X-Plane 7 any window or element may be placed over any other element.
*
* Some windows are scaled by stretching, some by repeating. The drawing
* routines know which scaling method to use. The list view cannot be rescaled
* in X-Plane 6 because it has both a repeating pattern and a gradient in one
* element. All other elements can be rescaled.
*
*/
enum {
/* An LCD screen that shows help. */
xpWindow_Help = 0,
/* A dialog box window. */
xpWindow_MainWindow = 1,
/* A panel or frame within a dialog box window. */
xpWindow_SubWindow = 2,
/* An LCD screen within a panel to hold text displays. */
xpWindow_Screen = 4,
/* A list view within a panel for scrolling file names, etc. */
xpWindow_ListView = 5,
};
typedef int XPWindowStyle;
/*
* XPDrawWindow
*
* This routine draws a window of the given dimensions at the given offset on
* the virtual screen in a given style. The window is automatically scaled as
* appropriate using a bitmap scaling technique (scaling or repeating) as
* appropriate to the style.
*
*/
WIDGET_API void XPDrawWindow(
int inX1,
int inY1,
int inX2,
int inY2,
XPWindowStyle inStyle);
/*
* XPGetWindowDefaultDimensions
*
* This routine returns the default dimensions for a window. Output is either
* a minimum or fixed value depending on whether the window is scalable.
*
*/
WIDGET_API void XPGetWindowDefaultDimensions(
XPWindowStyle inStyle,
int * outWidth, /* Can be NULL */
int * outHeight); /* Can be NULL */
/*
* XPElementStyle
*
* Elements are individually drawable UI things like push buttons, etc. The
* style defines what kind of element you are drawing. Elements can be
* stretched in one or two dimensions (depending on the element). Some
* elements can be lit.
*
* In X-Plane 6 some elements must be drawn over metal. Some are scalable and
* some are not. Any element can be drawn anywhere in X-Plane 7.
*
* Scalable Axis Required Background
*
*/
enum {
/* x metal */
xpElement_TextField = 6,
/* none metal */
xpElement_CheckBox = 9,
/* none metal */
xpElement_CheckBoxLit = 10,
/* none window header */
xpElement_WindowCloseBox = 14,
/* none window header */
xpElement_WindowCloseBoxPressed = 15,
/* x metal */
xpElement_PushButton = 16,
/* x metal */
xpElement_PushButtonLit = 17,
/* none any */
xpElement_OilPlatform = 24,
/* none any */
xpElement_OilPlatformSmall = 25,
/* none any */
xpElement_Ship = 26,
/* none any */
xpElement_ILSGlideScope = 27,
/* none any */
xpElement_MarkerLeft = 28,
/* none any */
xpElement_Airport = 29,
/* none any */
xpElement_Waypoint = 30,
/* none any */
xpElement_NDB = 31,
/* none any */
xpElement_VOR = 32,
/* none any */
xpElement_RadioTower = 33,
/* none any */
xpElement_AircraftCarrier = 34,
/* none any */
xpElement_Fire = 35,
/* none any */
xpElement_MarkerRight = 36,
/* none any */
xpElement_CustomObject = 37,
/* none any */
xpElement_CoolingTower = 38,
/* none any */
xpElement_SmokeStack = 39,
/* none any */
xpElement_Building = 40,
/* none any */
xpElement_PowerLine = 41,
/* none metal */
xpElement_CopyButtons = 45,
/* none metal */
xpElement_CopyButtonsWithEditingGrid = 46,
/* x, y metal */
xpElement_EditingGrid = 47,
/* THIS CAN PROBABLY BE REMOVED */
xpElement_ScrollBar = 48,
/* none any */
xpElement_VORWithCompassRose = 49,
/* none metal */
xpElement_Zoomer = 51,
/* x, y metal */
xpElement_TextFieldMiddle = 52,
/* none metal */
xpElement_LittleDownArrow = 53,
/* none metal */
xpElement_LittleUpArrow = 54,
/* none metal */
xpElement_WindowDragBar = 61,
/* none metal */
xpElement_WindowDragBarSmooth = 62,
};
typedef int XPElementStyle;
/*
* XPDrawElement
*
* XPDrawElement draws a given element at an offset on the virtual screen in
* set dimensions.
* *Even* if the element is not scalable, it will be scaled if the width and
* height do not match the preferred dimensions; it'll just look ugly. Pass
* inLit to see the lit version of the element; if the element cannot be lit
* this is ignored.
*
*/
WIDGET_API void XPDrawElement(
int inX1,
int inY1,
int inX2,
int inY2,
XPElementStyle inStyle,
int inLit);
/*
* XPGetElementDefaultDimensions
*
* This routine returns the recommended or minimum dimensions of a given UI
* element. outCanBeLit tells whether the element has both a lit and unlit
* state. Pass `NULL` to not receive any of these parameters.
*
*/
WIDGET_API void XPGetElementDefaultDimensions(
XPElementStyle inStyle,
int * outWidth, /* Can be NULL */
int * outHeight, /* Can be NULL */
int * outCanBeLit); /* Can be NULL */
/*
* XPTrackStyle
*
* A track is a UI element that displays a value vertically or horizontally.
* X-Plane has three kinds of tracks: scroll bars, sliders, and progress bars.
* Tracks can be displayed either horizontally or vertically; tracks will
* choose their own layout based on the larger dimension of their dimensions
* (e.g. they know if they are tall or wide). Sliders may be lit or unlit
* (showing the user manipulating them).
*
* - ScrollBar: this is a standard scroll bar with arrows and a thumb to drag.
* - Slider: this is a simple track with a ball in the middle that can be
* slid.
* - Progress: this is a progress indicator showing how a long task is going.
*
*/
enum {
/* not over metal can be lit can be rotated */
xpTrack_ScrollBar = 0,
/* over metal can be lit can be rotated */
xpTrack_Slider = 1,
/* over metal cannot be lit cannot be rotated */
xpTrack_Progress = 2,
};
typedef int XPTrackStyle;
/*
* XPDrawTrack
*
* This routine draws a track. You pass in the track dimensions and size; the
* track picks the optimal orientation for these dimensions. Pass in the
* track's minimum current and maximum values; the indicator will be
* positioned appropriately. You can also specify whether the track is lit or
* not.
*
*/
WIDGET_API void XPDrawTrack(
int inX1,
int inY1,
int inX2,
int inY2,
int inMin,
int inMax,
int inValue,
XPTrackStyle inTrackStyle,
int inLit);
/*
* XPGetTrackDefaultDimensions
*
* This routine returns a track's default smaller dimension; all tracks are
* scalable in the larger dimension. It also returns whether a track can be
* lit.
*
*/
WIDGET_API void XPGetTrackDefaultDimensions(
XPTrackStyle inStyle,
int * outWidth,
int * outCanBeLit);
/*
* XPGetTrackMetrics
*
* This routine returns the metrics of a track. If you want to write UI code
* to manipulate a track, this routine helps you know where the mouse
* locations are. For most other elements, the rectangle the element is drawn
* in is enough information. However, the scrollbar drawing routine does some
* automatic placement; this routine lets you know where things ended up. You
* pass almost everything you would pass to the draw routine. You get out the
* orientation, and other useful stuff.
*
* Besides orientation, you get five dimensions for the five parts of a
* scrollbar, which are the down button, down area (area before the thumb),
* the thumb, and the up area and button. For horizontal scrollers, the left
* button decreases; for vertical scrollers, the top button decreases.
*
*/
WIDGET_API void XPGetTrackMetrics(
int inX1,
int inY1,
int inX2,
int inY2,
int inMin,
int inMax,
int inValue,
XPTrackStyle inTrackStyle,
int * outIsVertical,
int * outDownBtnSize,
int * outDownPageSize,
int * outThumbSize,
int * outUpPageSize,
int * outUpBtnSize);
#ifdef __cplusplus
}
#endif
#endif
+472
View File
@@ -0,0 +1,472 @@
#ifndef _XPWidgetDefs_h_
#define _XPWidgetDefs_h_
/*
* Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See
* license.txt for usage. X-Plane SDK Version: 2.1.1
*
*/
/***************************************************************************
* XPWidgetDefs
***************************************************************************/
#include "XPLMDefs.h"
#ifdef __cplusplus
extern "C" {
#endif
#if APL
#if XPWIDGETS
#if __GNUC__ >= 4
#define WIDGET_API __attribute__((visibility("default")))
#elif __MACH__
#define WIDGET_API
#else
#define WIDGET_API __declspec(dllexport)
#endif
#else
#define WIDGET_API
#endif
#elif IBM
#if XPWIDGETS
#define WIDGET_API __declspec(dllexport)
#else
#define WIDGET_API __declspec(dllimport)
#endif
#elif LIN
#if XPWIDGETS
#if __GNUC__ >= 4
#define WIDGET_API __attribute__((visibility("default")))
#else
#define WIDGET_API
#endif
#else
#define WIDGET_API
#endif
#else
#pragma error "Platform not defined!"
#endif
/***************************************************************************
* WIDGET DEFINITIONS
***************************************************************************/
/*
* A widget is a call-back driven screen entity like a push-button, window,
* text entry field, etc.
*
* Use the widget API to create widgets of various classes. You can nest them
* into trees of widgets to create complex user interfaces.
*
*/
/*
* XPWidgetID
*
* A Widget ID is an opaque unique non-zero handle identifying your widget.
* Use 0 to specify "no widget". This type is defined as wide enough to hold a
* pointer. You receive a widget ID when you create a new widget and then use
* that widget ID to further refer to the widget.
*
*/
typedef void * XPWidgetID;
/*
* XPWidgetPropertyID
*
* Properties are values attached to instances of your widgets. A property is
* identified by a 32-bit ID and its value is the width of a pointer.
*
* Each widget instance may have a property or not have it. When you set a
* property on a widget for the first time, the property is added to the
* widget; it then stays there for the life of the widget.
*
* Some property IDs are predefined by the widget package; you can make up
* your own property IDs as well.
*
*/
enum {
/* A window's refcon is an opaque value used by client code to find other data*
* based on it. */
xpProperty_Refcon = 0,
/* These properties are used by the utlities to implement dragging. */
xpProperty_Dragging = 1,
xpProperty_DragXOff = 2,
xpProperty_DragYOff = 3,
/* Is the widget hilited? (For widgets that support this kind of thing.) */
xpProperty_Hilited = 4,
/* Is there a C++ object attached to this widget? */
xpProperty_Object = 5,
/* If this property is 1, the widget package will use OpenGL to restrict *
* drawing to the Wiget's exposed rectangle. */
xpProperty_Clip = 6,
/* Is this widget enabled (for those that have a disabled state too)? */
xpProperty_Enabled = 7,
/* NOTE: Property IDs 1 - 999 are reserved for the widgets library. *
* *
* NOTE: Property IDs 1000 - 9999 are allocated to the standard widget classes*
* provided with the library. *
* *
* Properties 1000 - 1099 are for widget class 0, 1100 - 1199 for widget class*
* 1, etc. */
xpProperty_UserStart = 10000,
};
typedef int XPWidgetPropertyID;
/*
* XPMouseState_t
*
* When the mouse is clicked or dragged, a pointer to this structure is passed
* to your widget function.
*
*/
typedef struct {
int x;
int y;
/* Mouse Button number, left = 0 (right button not yet supported. */
int button;
#if defined(XPLM200)
/* Scroll wheel delta (button in this case would be the wheel axis number). */
int delta;
#endif /* XPLM200 */
} XPMouseState_t;
/*
* XPKeyState_t
*
* When a key is pressed, a pointer to this struct is passed to your widget
* function.
*
*/
typedef struct {
/* The ASCII key that was pressed. WARNING: this may be 0 for some non-ASCII *
* key sequences. */
char key;
/* The flags. Make sure to check this if you only want key-downs! */
XPLMKeyFlags flags;
/* The virtual key code for the key */
char vkey;
} XPKeyState_t;
/*
* XPWidgetGeometryChange_t
*
* This structure contains the deltas for your widget's geometry when it
* changes.
*
*/
typedef struct {
int dx;
/* +Y = the widget moved up */
int dy;
int dwidth;
int dheight;
} XPWidgetGeometryChange_t;
/*
* XPDispatchMode
*
* The dispatching modes describe how the widgets library sends out messages.
* Currently there are three modes:
*
*/
enum {
/* The message will only be sent to the target widget. */
xpMode_Direct = 0,
/* The message is sent to the target widget, then up the chain of parents *
* until the message is handled or a parentless widget is reached. */
xpMode_UpChain = 1,
/* The message is sent to the target widget and then all of its children *
* recursively depth-first. */
xpMode_Recursive = 2,
/* The message is snet just to the target, but goes to every callback, even if*
* it is handled. */
xpMode_DirectAllCallbacks = 3,
/* The message is only sent to the very first handler even if it is not *
* accepted. (This is really only useful for some internal widget library *
* functions.) */
xpMode_Once = 4,
};
typedef int XPDispatchMode;
/*
* XPWidgetClass
*
* Widget classes define predefined widget types. A widget class basically
* specifies from a library the widget function to be used for the widget.
* Most widgets can be made right from classes.
*
*/
typedef int XPWidgetClass;
/* An unspecified widget class. Other widget classes are in *
* XPStandardWidgets.h */
#define xpWidgetClass_None 0
/***************************************************************************
* WIDGET MESSAGES
***************************************************************************/
/*
* XPWidgetMessage
*
* Widgets receive 32-bit messages indicating what action is to be taken or
* notifications of events. The list of messages may be expanded.
*
*/
enum {
/* No message, should not be sent. */
xpMsg_None = 0,
/* The create message is sent once per widget that is created with your widget*
* function and once for any widget that has your widget function attached. *
* *
* Dispatching: Direct *
* *
* Param 1: 1 if you are being added as a subclass, 0 if the widget is first *
* being created. */
xpMsg_Create = 1,
/* The destroy message is sent once for each message that is destroyed that *
* has your widget function. *
* *
* Dispatching: Direct for all *
* *
* Param 1: 1 if being deleted by a recursive delete to the parent, 0 for *
* explicit deletion. */
xpMsg_Destroy = 2,
/* The paint message is sent to your widget to draw itself. The paint message *
* is the bare-bones message; in response you must draw yourself, draw your *
* children, set up clipping and culling, check for visibility, etc. If you *
* don't want to do all of this, ignore the paint message and a draw message *
* (see below) will be sent to you. *
* *
* Dispatching: Direct */
xpMsg_Paint = 3,
/* The draw message is sent to your widget when it is time to draw yourself. *
* OpenGL will be set up to draw in 2-d global screen coordinates, but you *
* should use the XPLM to set up OpenGL state. *
* *
* Dispatching: Direct */
xpMsg_Draw = 4,
/* The key press message is sent once per key that is pressed. The first *
* parameter is the type of key code (integer or char) and the second is the *
* code itself. By handling this event, you consume the key stroke. *
* *
* Handling this message 'consumes' the keystroke; not handling it passes it *
* to your parent widget. *
* *
* Dispatching: Up Chain *
* *
* Param 1: A pointer to an XPKeyState_t structure with the keystroke. */
xpMsg_KeyPress = 5,
/* Keyboard focus is being given to you. By handling this message you accept *
* keyboard focus. The first parameter will be one if a child of yours gave up*
* focus to you, 0 if someone set focus on you explicitly. *
* *
* Handling this message accepts focus; not handling refuses focus. *
* *
* Dispatching: direct *
* *
* Param 1: 1 if you are gaining focus because your child is giving it up, 0 *
* if someone is explicitly giving you focus. */
xpMsg_KeyTakeFocus = 6,
/* Keyboard focus is being taken away from you. The first parameter will be *
* one if you are losing focus because another widget is taking it, or 0 if *
* someone called the API to make you lose focus explicitly. *
* *
* Dispatching: Direct *
* *
* Param 1: 1 if focus is being taken by another widget, 0 if code requested *
* to remove focus. */
xpMsg_KeyLoseFocus = 7,
/* You receive one mousedown event per click with a mouse-state structure *
* pointed to by parameter 1, by accepting this you eat the click, otherwise *
* your parent gets it. You will not receive drag and mouse up messages if you*
* do not accept the down message. *
* *
* Handling this message consumes the mouse click, not handling it passes it *
* to the next widget. You can act 'transparent' as a window by never handling*
* moues clicks to certain areas. *
* *
* Dispatching: Up chain NOTE: Technically this is direct dispatched, but the *
* widgets library will shop it to each widget until one consumes the click, *
* making it effectively "up chain". *
* *
* Param 1: A pointer to an XPMouseState_t containing the mouse status. */
xpMsg_MouseDown = 8,
/* You receive a series of mouse drag messages (typically one per frame in the*
* sim) as the mouse is moved once you have accepted a mouse down message. *
* Parameter one points to a mouse-state structure describing the mouse *
* location. You will continue to receive these until the mouse button is *
* released. You may receive multiple mouse state messages with the same mouse*
* position. You will receive mouse drag events even if the mouse is dragged *
* out of your current or original bounds at the time of the mouse down. *
* *
* Dispatching: Direct *
* *
* Param 1: A pointer to an XPMouseState_t containing the mouse status. */
xpMsg_MouseDrag = 9,
/* The mouseup event is sent once when the mouse button is released after a *
* drag or click. You only receive this message if you accept the mouseDown *
* message. Parameter one points to a mouse state structure. *
* *
* Dispatching: Direct *
* *
* Param 1: A pointer to an XPMouseState_t containing the mouse status. */
xpMsg_MouseUp = 10,
/* Your geometry or a child's geometry is being changed. *
* *
* Dispatching: Up chain *
* *
* Param 1: The widget ID of the original reshaped target. *
* *
* Param 2: A pointer to a XPWidgetGeometryChange_t struct describing the *
* change. */
xpMsg_Reshape = 11,
/* Your exposed area has changed. *
* *
* Dispatching: Direct */
xpMsg_ExposedChanged = 12,
/* A child has been added to you. The child's ID is passed in parameter one. *
* *
* Dispatching: Direct *
* *
* Param 1: The Widget ID of the child being added. */
xpMsg_AcceptChild = 13,
/* A child has been removed from to you. The child's ID is passed in parameter*
* one. *
* *
* Dispatching: Direct *
* *
* Param 1: The Widget ID of the child being removed. */
xpMsg_LoseChild = 14,
/* You now have a new parent, or have no parent. The parent's ID is passed in,*
* or 0 for no parent. *
* *
* Dispatching: Direct *
* *
* Param 1: The Widget ID of your parent */
xpMsg_AcceptParent = 15,
/* You or a child has been shown. Note that this does not include you being *
* shown because your parent was shown, you were put in a new parent, your *
* root was shown, etc. *
* *
* Dispatching: Up chain *
* *
* Param 1: The widget ID of the shown widget. */
xpMsg_Shown = 16,
/* You have been hidden. See limitations above. *
* *
* Dispatching: Up chain *
* *
* Param 1: The widget ID of the hidden widget. */
xpMsg_Hidden = 17,
/* Your descriptor has changed. *
* *
* Dispatching: Direct */
xpMsg_DescriptorChanged = 18,
/* A property has changed. Param 1 contains the property ID. *
* *
* Dispatching: Direct *
* *
* Param 1: The Property ID being changed. *
* *
* Param 2: The new property value */
xpMsg_PropertyChanged = 19,
#if defined(XPLM200)
/* The mouse wheel has moved. *
* *
* Return 1 to consume the mouse wheel move, or 0 to pass the message to a *
* parent. Dispatching: Up chain *
* *
* Param 1: A pointer to an XPMouseState_t containing the mouse status. */
xpMsg_MouseWheel = 20,
#endif /* XPLM200 */
#if defined(XPLM200)
/* The cursor is over your widget. If you consume this message, change the *
* XPLMCursorStatus value to indicate the desired result, with the same rules *
* as in XPLMDisplay.h. *
* *
* Return 1 to consume this message, 0 to pass it on. *
* *
* Dispatching: Up chain Param 1: A pointer to an XPMouseState_t struct *
* containing the mouse status. *
* *
* Param 2: A pointer to a XPLMCursorStatus - set this to the cursor result *
* you desire. */
xpMsg_CursorAdjust = 21,
#endif /* XPLM200 */
/* NOTE: Message IDs 1000 - 9999 are allocated to the standard widget classes *
* provided with the library with 1000 - 1099 for widget class 0, 1100 - 1199 *
* for widget class 1, etc. Message IDs 10,000 and beyond are for plugin use. */
xpMsg_UserStart = 10000,
};
typedef int XPWidgetMessage;
/***************************************************************************
* WIDGET CALLBACK FUNCTION
***************************************************************************/
/*
* XPWidgetFunc_t
*
* This function defines your custom widget's behavior. It will be called by
* the widgets library to send messages to your widget. The message and widget
* ID are passed in, as well as two ptr-width signed parameters whose meaning
* varies with the message. Return 1 to indicate that you have processed the
* message, 0 to indicate that you have not. For any message that is not
* understood, return 0.
*
*/
typedef int (* XPWidgetFunc_t)(
XPWidgetMessage inMessage,
XPWidgetID inWidget,
intptr_t inParam1,
intptr_t inParam2);
#ifdef __cplusplus
}
#endif
#endif
+232
View File
@@ -0,0 +1,232 @@
#ifndef _XPWidgetUtils_h_
#define _XPWidgetUtils_h_
/*
* Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See
* license.txt for usage. X-Plane SDK Version: 2.1.1
*
*/
/***************************************************************************
* XPWidgetUtils
***************************************************************************/
/*
* ## USAGE NOTES
*
* The XPWidgetUtils library contains useful functions that make writing and
* using widgets less of a pain.
*
* One set of functions are the widget behavior functions. These functions
* each add specific useful behaviors to widgets. They can be used in two
* manners:
*
* 1. You can add a widget behavior function to a widget as a callback proc
* using the XPAddWidgetCallback function. The widget will gain that
* behavior. Remember that the last function you add has highest priority.
* You can use this to change or augment the behavior of an existing
* finished widget.
* 2. You can call a widget function from inside your own widget function.
* This allows you to include useful behaviors in custom-built widgets. A
* number of the standard widgets get their behavior from this library. To
* do this, call the behavior function from your function first. If it
* returns 1, that means it handled the event and you don't need to; simply
* return 1.
*
*/
#include "XPWidgetDefs.h"
#ifdef __cplusplus
extern "C" {
#endif
/***************************************************************************
* GENERAL UTILITIES
***************************************************************************/
/*
* Convenience accessors
*
* It can be clumsy accessing the variables passed in by pointer to a struct
* for mouse and reshape messages; these accessors let you simply pass in the param
* right from the arguments of your widget proc and get back the value you want.
*
*/
#define MOUSE_X(param) (((XPMouseState_t *) (param))->x)
#define MOUSE_Y(param) (((XPMouseState_t *) (param))->y)
#define DELTA_X(param) (((XPWidgetGeometryChange_t *) (param))->dx)
#define DELTA_Y(param) (((XPWidgetGeometryChange_t *) (param))->dy)
#define DELTA_W(param) (((XPWidgetGeometryChange_t *) (param))->dwidth)
#define DELTA_H(param) (((XPWidgetGeometryChange_t *) (param))->dheight)
#define KEY_CHAR(param) (((XPKeyState_t *) (param))->key)
#define KEY_FLAGS(param) (((XPKeyState_t *) (param))->flags)
#define KEY_VKEY(param) (((XPKeyState_t *) (param))->vkey)
#define IN_RECT(x, y, l, t, r, b) \
(((x) >= (l)) && ((x) <= (r)) && ((y) >= (b)) && ((y) <= (t)))
/*
* XPWidgetCreate_t
*
* This structure contains all of the parameters needed to create a wiget. It
* is used with XPUCreateWidgets to create widgets in bulk from an array. All
* parameters correspond to those of XPCreateWidget except for the container
* index.
*
* If the container index is equal to the index of a widget in the array, the
* widget in the array passed to XPUCreateWidgets is used as the parent of
* this widget. Note that if you pass an index greater than your own position
* in the array, the parent you are requesting will not exist yet.
*
* If the container index is NO_PARENT, the parent widget is specified as
* NULL. If the container index is PARAM_PARENT, the widget passed into
* XPUCreateWidgets is used.
*
*/
typedef struct {
int left;
int top;
int right;
int bottom;
int visible;
const char * descriptor;
/* Whether ethis widget is a root wiget */
int isRoot;
/* The index of the widget to contain within, or a constant */
int containerIndex;
XPWidgetClass widgetClass;
} XPWidgetCreate_t;
#define NO_PARENT -1
#define PARAM_PARENT -2
#define WIDGET_COUNT(x) ((sizeof(x) / sizeof(XPWidgetCreate_t)))
/*
* XPUCreateWidgets
*
* This function creates a series of widgets from a table (see
* XPCreateWidget_t above). Pass in an array of widget creation structures and
* an array of widget IDs that will receive each widget.
*
* Widget parents are specified by index into the created widget table,
* allowing you to create nested widget structures. You can create multiple
* widget trees in one table. Generally you should create widget trees from
* the top down.
*
* You can also pass in a widget ID that will be used when the widget's parent
* is listed as PARAM_PARENT; this allows you to embed widgets created with
* XPUCreateWidgets in a widget created previously.
*
*/
WIDGET_API void XPUCreateWidgets(
const XPWidgetCreate_t * inWidgetDefs,
int inCount,
XPWidgetID inParamParent,
XPWidgetID * ioWidgets);
/*
* XPUMoveWidgetBy
*
* Simply moves a widget by an amount, +x = right, +y=up, without resizing the
* widget.
*
*/
WIDGET_API void XPUMoveWidgetBy(
XPWidgetID inWidget,
int inDeltaX,
int inDeltaY);
/***************************************************************************
* LAYOUT MANAGERS
***************************************************************************/
/*
* The layout managers are widget behavior functions for handling where
* widgets move. Layout managers can be called from a widget function or
* attached to a widget later.
*
*/
/*
* XPUFixedLayout
*
* This function causes the widget to maintain its children in fixed position
* relative to itself as it is resized. Use this on the top level 'window'
* widget for your window.
*
*/
WIDGET_API int XPUFixedLayout(
XPWidgetMessage inMessage,
XPWidgetID inWidget,
intptr_t inParam1,
intptr_t inParam2);
/***************************************************************************
* WIDGET PROC BEHAVIORS
***************************************************************************/
/*
* These widget behavior functions add other useful behaviors to widgets.
* These functions cannot be attached to a widget; they must be called from
* your widget function.
*
*/
/*
* XPUSelectIfNeeded
*
* This causes the widget to bring its window to the foreground if it is not
* already. inEatClick specifies whether clicks in the background should be
* consumed by bringin the window to the foreground.
*
*/
WIDGET_API int XPUSelectIfNeeded(
XPWidgetMessage inMessage,
XPWidgetID inWidget,
intptr_t inParam1,
intptr_t inParam2,
int inEatClick);
/*
* XPUDefocusKeyboard
*
* This causes a click in the widget to send keyboard focus back to X-Plane.
* This stops editing of any text fields, etc.
*
*/
WIDGET_API int XPUDefocusKeyboard(
XPWidgetMessage inMessage,
XPWidgetID inWidget,
intptr_t inParam1,
intptr_t inParam2,
int inEatClick);
/*
* XPUDragWidget
*
* XPUDragWidget drags the widget in response to mouse clicks. Pass in not
* only the event, but the global coordinates of the drag region, which might
* be a sub-region of your widget (for example, a title bar).
*
*/
WIDGET_API int XPUDragWidget(
XPWidgetMessage inMessage,
XPWidgetID inWidget,
intptr_t inParam1,
intptr_t inParam2,
int inLeft,
int inTop,
int inRight,
int inBottom);
#ifdef __cplusplus
}
#endif
#endif
+538
View File
@@ -0,0 +1,538 @@
#ifndef _XPWidgets_h_
#define _XPWidgets_h_
/*
* Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See
* license.txt for usage. X-Plane SDK Version: 2.1.1
*
*/
/***************************************************************************
* XPWidgets
***************************************************************************/
/*
* ## THEORY OF OPERATION AND NOTES
*
* Widgets are persistent view 'objects' for X-Plane. A widget is an object
* referenced by its opaque handle (widget ID) and the APIs in this file. You
* cannot access the widget's guts directly. Every Widget has the following
* intrinsic data:
*
* - A bounding box defined in global screen coordinates with 0,0 in the
* bottom left and +y = up, +x = right.
* - A visible box, which is the intersection of the bounding box with the
* widget's parents visible box.
* - Zero or one parent widgets. (Always zero if the widget is a root widget.
* - Zero or more child widgets.
* - Whether the widget is a root. Root widgets are the top level plugin
* windows.
* - Whether the widget is visible.
* - A text string descriptor, whose meaning varies from widget to widget.
* - An arbitrary set of 32 bit integral properties defined by 32-bit integral
* keys. This is how specific widgets store specific data.
* - A list of widget callbacks proc that implements the widgets behaviors.
*
* The Widgets library sends messages to widgets to request specific behaviors
* or notify the widget of things.
*
* Widgets may have more than one callback function, in which case messages
* are sent to the most recently added callback function until the message is
* handled. Messages may also be sent to parents or children; see the
* XPWidgetDefs.h header file for the different widget message dispatching
* functions. By adding a callback function to a window you can 'subclass' its
* behavior.
*
* A set of standard widgets are provided that serve common UI purposes. You
* can also customize or implement entirely custom widgets.
*
* Widgets are different than other view hierarchies (most notably Win32,
* which they bear a striking resemblance to) in the following ways:
*
* - Not all behavior can be patched. State that is managed by the XPWidgets
* DLL and not by individual widgets cannot be customized.
* - All coordinates are in global screen coordinates. Coordinates are not
* relative to an enclosing widget, nor are they relative to a display
* window.
* - Widget messages are always dispatched synchronously, and there is no
* concept of scheduling an update or a dirty region. Messages originate
* from X-Plane as the sim cycle goes by. Since X-Plane is constantly
* redrawing, so are widgets; there is no need to mark a part of a widget as
* 'needing redrawing' because redrawing happens frequently whether the
* widget needs it or not.
* - Any widget may be a 'root' widget, causing it to be drawn; there is no
* relationship between widget class and rootness. Root widgets are
* imlemented as XPLMDisply windows.
*
*/
#include "XPWidgetDefs.h"
#include "XPLMDisplay.h"
#ifdef __cplusplus
extern "C" {
#endif
/***************************************************************************
* WIDGET CREATION AND MANAGEMENT
***************************************************************************/
/*
* XPCreateWidget
*
* This function creates a new widget and returns the new widget's ID to you.
* If the widget creation fails for some reason, it returns NULL. Widget
* creation will fail either if you pass a bad class ID or if there is not
* adequate memory.
*
* Input Parameters:
*
* - Top, left, bottom, and right in global screen coordinates defining the
* widget's location on the screen.
* - inVisible is 1 if the widget should be drawn, 0 to start the widget as
* hidden.
* - inDescriptor is a null terminated string that will become the widget's
* descriptor.
* - inIsRoot is 1 if this is going to be a root widget, 0 if it will not be.
* - inContainer is the ID of this widget's container. It must be 0 for a root
* widget. for a non-root widget, pass the widget ID of the widget to place
* this widget within. If this widget is not going to start inside another
* widget, pass 0; this new widget will then just be floating off in space
* (and will not be drawn until it is placed in a widget.
* - inClass is the class of the widget to draw. Use one of the predefined
* class-IDs to create a standard widget.
*
* A note on widget embedding: a widget is only called (and will be drawn,
* etc.) if it is placed within a widget that will be called. Root widgets are
* always called. So it is possible to have whole chains of widgets that are
* simply not called. You can preconstruct widget trees and then place them
* into root widgets later to activate them if you wish.
*
*/
WIDGET_API XPWidgetID XPCreateWidget(
int inLeft,
int inTop,
int inRight,
int inBottom,
int inVisible,
const char * inDescriptor,
int inIsRoot,
XPWidgetID inContainer,
XPWidgetClass inClass);
/*
* XPCreateCustomWidget
*
* This function is the same as XPCreateWidget except that instead of passing
* a class ID, you pass your widget callback function pointer defining the
* widget. Use this function to define a custom widget. All parameters are the
* same as XPCreateWidget, except that the widget class has been replaced with
* the widget function.
*
*/
WIDGET_API XPWidgetID XPCreateCustomWidget(
int inLeft,
int inTop,
int inRight,
int inBottom,
int inVisible,
const char * inDescriptor,
int inIsRoot,
XPWidgetID inContainer,
XPWidgetFunc_t inCallback);
/*
* XPDestroyWidget
*
* This class destroys a widget. Pass in the ID of the widget to kill. If you
* pass 1 for inDestroyChilren, the widget's children will be destroyed first,
* then this widget will be destroyed. (Furthermore, the widget's children
* will be destroyed with the inDestroyChildren flag set to 1, so the
* destruction will recurse down the widget tree.) If you pass 0 for this
* flag, the child widgets will simply end up with their parent set to 0.
*
*/
WIDGET_API void XPDestroyWidget(
XPWidgetID inWidget,
int inDestroyChildren);
/*
* XPSendMessageToWidget
*
* This sends any message to a widget. You should probably not go around
* simulating the predefined messages that the widgets library defines for
* you. You may however define custom messages for your widgets and send them
* with this method.
*
* This method supports several dispatching patterns; see XPDispatchMode for
* more info. The function returns 1 if the message was handled, 0 if it was
* not.
*
* For each widget that receives the message (see the dispatching modes), each
* widget function from the most recently installed to the oldest one receives
* the message in order until it is handled.
*
*/
WIDGET_API int XPSendMessageToWidget(
XPWidgetID inWidget,
XPWidgetMessage inMessage,
XPDispatchMode inMode,
intptr_t inParam1,
intptr_t inParam2);
/***************************************************************************
* WIDGET POSITIONING AND VISIBILITY
***************************************************************************/
/*
* XPPlaceWidgetWithin
*
* This function changes which container a widget resides in. You may NOT use
* this function on a root widget! inSubWidget is the widget that will be
* moved. Pass a widget ID in inContainer to make inSubWidget be a child of
* inContainer. It will become the last/closest widget in the container. Pass
* 0 to remove the widget from any container. Any call to this other than
* passing the widget ID of the old parent of the affected widget will cause
* the widget to be removed from its old parent. Placing a widget within its
* own parent simply makes it the last widget.
*
* NOTE: this routine does not reposition the sub widget in global
* coordinates. If the container has layout management code, it will
* reposition the subwidget for you, otherwise you must do it with
* SetWidgetGeometry.
*
*/
WIDGET_API void XPPlaceWidgetWithin(
XPWidgetID inSubWidget,
XPWidgetID inContainer);
/*
* XPCountChildWidgets
*
* This routine returns the number of widgets another widget contains.
*
*/
WIDGET_API int XPCountChildWidgets(
XPWidgetID inWidget);
/*
* XPGetNthChildWidget
*
* This routine returns the widget ID of a child widget by index. Indexes are
* 0 based, from 0 to one minus the number of widgets in the parent,
* inclusive. If the index is invalid, 0 is returned.
*
*/
WIDGET_API XPWidgetID XPGetNthChildWidget(
XPWidgetID inWidget,
int inIndex);
/*
* XPGetParentWidget
*
* Returns the parent of a widget, or 0 if the widget has no parent. Root
* widgets never have parents and therefore always return 0.
*
*/
WIDGET_API XPWidgetID XPGetParentWidget(
XPWidgetID inWidget);
/*
* XPShowWidget
*
* This routine makes a widget visible if it is not already. Note that if a
* widget is not in a rooted widget hierarchy or one of its parents is not
* visible, it will still not be visible to the user.
*
*/
WIDGET_API void XPShowWidget(
XPWidgetID inWidget);
/*
* XPHideWidget
*
* Makes a widget invisible. See XPShowWidget for considerations of when a
* widget might not be visible despite its own visibility state.
*
*/
WIDGET_API void XPHideWidget(
XPWidgetID inWidget);
/*
* XPIsWidgetVisible
*
* This returns 1 if a widget is visible, 0 if it is not. Note that this
* routine takes into consideration whether a parent is invisible. Use this
* routine to tell if the user can see the widget.
*
*/
WIDGET_API int XPIsWidgetVisible(
XPWidgetID inWidget);
/*
* XPFindRootWidget
*
* Returns the Widget ID of the root widget that contains the passed in widget
* or NULL if the passed in widget is not in a rooted hierarchy.
*
*/
WIDGET_API XPWidgetID XPFindRootWidget(
XPWidgetID inWidget);
/*
* XPBringRootWidgetToFront
*
* This routine makes the specified widget be in the front most widget
* hierarchy. If this widget is a root widget, its widget hierarchy comes to
* front, otherwise the widget's root is brought to the front. If this widget
* is not in an active widget hiearchy (e.g. there is no root widget at the
* top of the tree), this routine does nothing.
*
*/
WIDGET_API void XPBringRootWidgetToFront(
XPWidgetID inWidget);
/*
* XPIsWidgetInFront
*
* This routine returns true if this widget's hierarchy is the front most
* hierarchy. It returns false if the widget's hierarchy is not in front, or
* if the widget is not in a rooted hierarchy.
*
*/
WIDGET_API int XPIsWidgetInFront(
XPWidgetID inWidget);
/*
* XPGetWidgetGeometry
*
* This routine returns the bounding box of a widget in global coordinates.
* Pass NULL for any parameter you are not interested in.
*
*/
WIDGET_API void XPGetWidgetGeometry(
XPWidgetID inWidget,
int * outLeft, /* Can be NULL */
int * outTop, /* Can be NULL */
int * outRight, /* Can be NULL */
int * outBottom); /* Can be NULL */
/*
* XPSetWidgetGeometry
*
* This function changes the bounding box of a widget.
*
*/
WIDGET_API void XPSetWidgetGeometry(
XPWidgetID inWidget,
int inLeft,
int inTop,
int inRight,
int inBottom);
/*
* XPGetWidgetForLocation
*
* Given a widget and a location, this routine returns the widget ID of the
* child of that widget that owns that location. If inRecursive is true then
* this will return a child of a child of a widget as it tries to find the
* deepest widget at that location. If inVisibleOnly is true, then only
* visible widgets are considered, otherwise all widgets are considered. The
* widget ID passed for inContainer will be returned if the location is in
* that widget but not in a child widget. 0 is returned if the location is not
* in the container.
*
* NOTE: if a widget's geometry extends outside its parents geometry, it will
* not be returned by this call for mouse locations outside the parent
* geometry. The parent geometry limits the child's eligibility for mouse
* location.
*
*/
WIDGET_API XPWidgetID XPGetWidgetForLocation(
XPWidgetID inContainer,
int inXOffset,
int inYOffset,
int inRecursive,
int inVisibleOnly);
/*
* XPGetWidgetExposedGeometry
*
* This routine returns the bounds of the area of a widget that is completely
* within its parent widgets. Since a widget's bounding box can be outside its
* parent, part of its area will not be elligible for mouse clicks and should
* not draw. Use XPGetWidgetGeometry to find out what area defines your
* widget's shape, but use this routine to find out what area to actually draw
* into. Note that the widget library does not use OpenGL clipping to keep
* frame rates up, although you could use it internally.
*
*/
WIDGET_API void XPGetWidgetExposedGeometry(
XPWidgetID inWidgetID,
int * outLeft, /* Can be NULL */
int * outTop, /* Can be NULL */
int * outRight, /* Can be NULL */
int * outBottom); /* Can be NULL */
/***************************************************************************
* ACCESSING WIDGET DATA
***************************************************************************/
/*
* XPSetWidgetDescriptor
*
* Every widget has a descriptor, which is a text string. What the text string
* is used for varies from widget to widget; for example, a push button's text
* is its descriptor, a caption shows its descriptor, and a text field's
* descriptor is the text being edited. In other words, the usage for the text
* varies from widget to widget, but this API provides a universal and
* convenient way to get at it. While not all UI widgets need their
* descriptor, many do.
*
*/
WIDGET_API void XPSetWidgetDescriptor(
XPWidgetID inWidget,
const char * inDescriptor);
/*
* XPGetWidgetDescriptor
*
* This routine returns the widget's descriptor. Pass in the length of the
* buffer you are going to receive the descriptor in. The descriptor will be
* null terminated for you. This routine returns the length of the actual
* descriptor; if you pass NULL for outDescriptor, you can get the
* descriptor's length without getting its text. If the length of the
* descriptor exceeds your buffer length, the buffer will not be null
* terminated (this routine has 'strncpy' semantics).
*
*/
WIDGET_API int XPGetWidgetDescriptor(
XPWidgetID inWidget,
char * outDescriptor,
int inMaxDescLength);
/*
* XPGetWidgetUnderlyingWindow
*
* Returns the window (from the XPLMDisplay API) that backs your widget
* window. If you have opted in to modern windows, via a call to
* XPLMEnableFeature("XPLM_USE_NATIVE_WIDGET_WINDOWS", 1), you can use the
* returned window ID for display APIs like XPLMSetWindowPositioningMode(),
* allowing you to pop the widget window out into a real OS window, or move it
* into VR.
*
*/
WIDGET_API XPLMWindowID XPGetWidgetUnderlyingWindow(
XPWidgetID inWidget);
/*
* XPSetWidgetProperty
*
* This function sets a widget's property. Properties are arbitrary values
* associated by a widget by ID.
*
*/
WIDGET_API void XPSetWidgetProperty(
XPWidgetID inWidget,
XPWidgetPropertyID inProperty,
intptr_t inValue);
/*
* XPGetWidgetProperty
*
* This routine returns the value of a widget's property, or 0 if the property
* is not defined. If you need to know whether the property is defined, pass a
* pointer to an int for inExists; the existence of that property will be
* returned in the int. Pass NULL for inExists if you do not need this
* information.
*
*/
WIDGET_API intptr_t XPGetWidgetProperty(
XPWidgetID inWidget,
XPWidgetPropertyID inProperty,
int * inExists); /* Can be NULL */
/***************************************************************************
* KEYBOARD MANAGEMENT
***************************************************************************/
/*
* XPSetKeyboardFocus
*
* Controls which widget will receive keystrokes. Pass the widget ID of the
* widget to get the keys. Note that if the widget does not care about
* keystrokes, they will go to the parent widget, and if no widget cares about
* them, they go to X-Plane.
*
* If you set the keyboard focus to widget ID 0, X-Plane gets keyboard focus.
*
* This routine returns the widget ID that ended up with keyboard focus, or 0
* for X-Plane.
*
* Keyboard focus is not changed if the new widget will not accept it. For
* setting to X-Plane, keyboard focus is always accepted.
*
*/
WIDGET_API XPWidgetID XPSetKeyboardFocus(
XPWidgetID inWidget);
/*
* XPLoseKeyboardFocus
*
* This causes the specified widget to lose focus; focus is passed to its
* parent, or the next parent that will accept it. This routine does nothing
* if this widget does not have focus.
*
*/
WIDGET_API void XPLoseKeyboardFocus(
XPWidgetID inWidget);
/*
* XPGetWidgetWithFocus
*
* This routine returns the widget that has keyboard focus, or 0 if X-Plane
* has keyboard focus or some other plugin window that does not have widgets
* has focus.
*
*/
WIDGET_API XPWidgetID XPGetWidgetWithFocus(void);
/***************************************************************************
* CREATING CUSTOM WIDGETS
***************************************************************************/
/*
* XPAddWidgetCallback
*
* This function adds a new widget callback to a widget. This widget callback
* supercedes any existing ones and will receive messages first; if it does
* not handle messages they will go on to be handled by pre-existing widgets.
*
* The widget function will remain on the widget for the life of the widget.
* The creation message will be sent to the new callback immediately with the
* widget ID, and the destruction message will be sent before the other widget
* function receives a destruction message.
*
* This provides a way to 'subclass' an existing widget. By providing a second
* hook that only handles certain widget messages, you can customize or extend
* widget behavior.
*
*/
WIDGET_API void XPAddWidgetCallback(
XPWidgetID inWidget,
XPWidgetFunc_t inNewCallback);
/*
* XPGetWidgetClassFunc
*
* Given a widget class, this function returns the callbacks that power that
* widget class.
*
*/
WIDGET_API XPWidgetFunc_t XPGetWidgetClassFunc(
XPWidgetClass inWidgetClass);
#ifdef __cplusplus
}
#endif
#endif
@@ -0,0 +1,56 @@
#include "XPCBroadcaster.h"
#include "XPCListener.h"
XPCBroadcaster::XPCBroadcaster() :
mIterator(NULL)
{
}
XPCBroadcaster::~XPCBroadcaster()
{
ListenerVector::iterator iter;
mIterator = &iter;
for (iter = mListeners.begin(); iter != mListeners.end(); ++iter)
{
(*iter)->BroadcasterRemoved(this);
}
}
void XPCBroadcaster::AddListener(
XPCListener * inListener)
{
mListeners.push_back(inListener);
inListener->BroadcasterAdded(this);
}
void XPCBroadcaster::RemoveListener(
XPCListener * inListener)
{
ListenerVector::iterator iter = std::find
(mListeners.begin(), mListeners.end(), inListener);
if (iter == mListeners.end())
return;
if (mIterator != NULL)
{
if (*mIterator >= iter)
(*mIterator)--;
}
mListeners.erase(iter);
inListener->BroadcasterRemoved(this);
}
void XPCBroadcaster::BroadcastMessage(
int inMessage,
void * inParam)
{
ListenerVector::iterator iter;
mIterator = &iter;
for (iter = mListeners.begin(); iter != mListeners.end(); ++iter)
{
(*iter)->ListenToMessage(inMessage, inParam);
}
mIterator = NULL;
}
+38
View File
@@ -0,0 +1,38 @@
#ifndef _XPCBroadcaster_h_
#define _XPCBroadcaster_h_
#include <vector>
#include <algorithm>
class XPCListener;
class XPCBroadcaster {
public:
XPCBroadcaster();
virtual ~XPCBroadcaster();
void AddListener(
XPCListener * inListener);
void RemoveListener(
XPCListener * inListener);
protected:
void BroadcastMessage(
int inMessage,
void * inParam=0);
private:
typedef std::vector<XPCListener *> ListenerVector;
ListenerVector mListeners;
// Reentrancy support
ListenerVector::iterator * mIterator;
};
#endif
+104
View File
@@ -0,0 +1,104 @@
#include "XPCDisplay.h"
XPCKeySniffer::XPCKeySniffer(int inBeforeWindows) : mBeforeWindows(inBeforeWindows)
{
XPLMRegisterKeySniffer(KeySnifferCB, mBeforeWindows, reinterpret_cast<void *>(this));
}
XPCKeySniffer::~XPCKeySniffer()
{
XPLMUnregisterKeySniffer(KeySnifferCB, mBeforeWindows, reinterpret_cast<void *>(this));
}
int XPCKeySniffer::KeySnifferCB(
char inCharKey,
XPLMKeyFlags inFlags,
char inVirtualKey,
void * inRefCon)
{
XPCKeySniffer * me = reinterpret_cast<XPCKeySniffer *>(inRefCon);
return me->HandleKeyStroke(inCharKey, inFlags, inVirtualKey);
}
XPCWindow::XPCWindow(
int inLeft,
int inTop,
int inRight,
int inBottom,
int inIsVisible)
{
mWindow = XPLMCreateWindow(inLeft, inTop, inRight, inBottom, inIsVisible,
DrawCB, HandleKeyCB, MouseClickCB,
reinterpret_cast<void *>(this));
}
XPCWindow::~XPCWindow()
{
XPLMDestroyWindow(mWindow);
}
void XPCWindow::GetWindowGeometry(
int * outLeft,
int * outTop,
int * outRight,
int * outBottom)
{
XPLMGetWindowGeometry(mWindow, outLeft, outTop, outRight, outBottom);
}
void XPCWindow::SetWindowGeometry(
int inLeft,
int inTop,
int inRight,
int inBottom)
{
XPLMSetWindowGeometry(mWindow, inLeft, inTop, inRight, inBottom);
}
int XPCWindow::GetWindowIsVisible(void)
{
return XPLMGetWindowIsVisible(mWindow);
}
void XPCWindow::SetWindowIsVisible(
int inIsVisible)
{
XPLMSetWindowIsVisible(mWindow, inIsVisible);
}
void XPCWindow::TakeKeyboardFocus(void)
{
XPLMTakeKeyboardFocus(mWindow);
}
void XPCWindow::BringWindowToFront(void)
{
XPLMBringWindowToFront(mWindow);
}
int XPCWindow::IsWindowInFront(void)
{
return XPLMIsWindowInFront(mWindow);
}
void XPCWindow::DrawCB(XPLMWindowID inWindowID, void * inRefcon)
{
XPCWindow * me = reinterpret_cast<XPCWindow *>(inRefcon);
me->DoDraw();
}
void XPCWindow::HandleKeyCB(XPLMWindowID inWindowID, char inKey, XPLMKeyFlags inFlags, char inVirtualKey, void * inRefcon, int losingFocus)
{
XPCWindow * me = reinterpret_cast<XPCWindow *>(inRefcon);
if (losingFocus)
me->LoseFocus();
else
me->HandleKey(inKey, inFlags, inVirtualKey);
}
int XPCWindow::MouseClickCB(XPLMWindowID inWindowID, int x, int y, XPLMMouseStatus inMouse, void * inRefcon)
{
XPCWindow * me = reinterpret_cast<XPCWindow *>(inRefcon);
return me->HandleClick(x, y, inMouse);
}
+73
View File
@@ -0,0 +1,73 @@
#ifndef _XPCDisplay_h_
#define _XPCDisplay_h_
#include "XPLMDisplay.h"
class XPCKeySniffer {
public:
XPCKeySniffer(int inBeforeWindows);
virtual ~XPCKeySniffer();
virtual int HandleKeyStroke(
char inCharKey,
XPLMKeyFlags inFlags,
char inVirtualKey)=0;
private:
int mBeforeWindows;
static int KeySnifferCB(
char inCharKey,
XPLMKeyFlags inFlags,
char inVirtualKey,
void * inRefCon);
};
class XPCWindow {
public:
XPCWindow(
int inLeft,
int inTop,
int inRight,
int inBottom,
int inIsVisible);
virtual ~XPCWindow();
virtual void DoDraw(void)=0;
virtual void HandleKey(char inKey, XPLMKeyFlags inFlags, char inVirtualKey)=0;
virtual void LoseFocus(void)=0;
virtual int HandleClick(int x, int y, XPLMMouseStatus inMouse)=0;
void GetWindowGeometry(
int * outLeft,
int * outTop,
int * outRight,
int * outBottom);
void SetWindowGeometry(
int inLeft,
int inTop,
int inRight,
int inBottom);
int GetWindowIsVisible(void);
void SetWindowIsVisible(
int inIsVisible);
void TakeKeyboardFocus(void);
void BringWindowToFront(void);
int IsWindowInFront(void);
private:
XPLMWindowID mWindow;
static void DrawCB(XPLMWindowID inWindowID, void * inRefcon);
static void HandleKeyCB(XPLMWindowID inWindowID, char inKey, XPLMKeyFlags inFlags, char inVirtualKey, void * inRefcon, int losingFocus);
static int MouseClickCB(XPLMWindowID inWindowID, int x, int y, XPLMMouseStatus inMouse, void * inRefcon);
};
#endif
+27
View File
@@ -0,0 +1,27 @@
#include "XPCListener.h"
#include "XPCBroadcaster.h"
XPCListener::XPCListener()
{
}
XPCListener::~XPCListener()
{
while (!mBroadcasters.empty())
mBroadcasters.front()->RemoveListener(this);
}
void XPCListener::BroadcasterAdded(
XPCBroadcaster * inBroadcaster)
{
mBroadcasters.push_back(inBroadcaster);
}
void XPCListener::BroadcasterRemoved(
XPCBroadcaster * inBroadcaster)
{
BroadcastVector::iterator iter = std::find(mBroadcasters.begin(),
mBroadcasters.end(), inBroadcaster);
if (iter != mBroadcasters.end())
mBroadcasters.erase(iter);
}
+36
View File
@@ -0,0 +1,36 @@
#ifndef _XPCListener_h_
#define _XPCListener_h_
#include <vector>
#include <algorithm>
class XPCBroadcaster;
class XPCListener {
public:
XPCListener();
virtual ~XPCListener();
virtual void ListenToMessage(
int inMessage,
void * inParam)=0;
private:
typedef std::vector<XPCBroadcaster *> BroadcastVector;
BroadcastVector mBroadcasters;
friend class XPCBroadcaster;
void BroadcasterAdded(
XPCBroadcaster * inBroadcaster);
void BroadcasterRemoved(
XPCBroadcaster * inBroadcaster);
};
#endif
+52
View File
@@ -0,0 +1,52 @@
#include "XPCProcessing.h"
#include "XPLMUtilities.h"
XPCProcess::XPCProcess() :
mInCallback(false),
mCallbackTime(0)
{
XPLMRegisterFlightLoopCallback(FlightLoopCB, 0, reinterpret_cast<void *>(this));
}
XPCProcess::~XPCProcess()
{
XPLMUnregisterFlightLoopCallback(FlightLoopCB, reinterpret_cast<void *>(this));
}
void XPCProcess::StartProcessTime(float inSeconds)
{
mCallbackTime = inSeconds;
if (!mInCallback)
XPLMSetFlightLoopCallbackInterval(
FlightLoopCB, mCallbackTime, 1/*relative to now*/, reinterpret_cast<void *>(this));
}
void XPCProcess::StartProcessCycles(int inCycles)
{
mCallbackTime = -inCycles;
if (!mInCallback)
XPLMSetFlightLoopCallbackInterval(
FlightLoopCB, mCallbackTime, 1/*relative to now*/, reinterpret_cast<void *>(this));
}
void XPCProcess::StopProcess(void)
{
mCallbackTime = 0;
if (!mInCallback)
XPLMSetFlightLoopCallbackInterval(
FlightLoopCB, mCallbackTime, 1/*relative to now*/, reinterpret_cast<void *>(this));
}
float XPCProcess::FlightLoopCB(
float inElapsedSinceLastCall,
float inElapsedTimeSinceLastFlightLoop,
int inCounter,
void * inRefcon)
{
XPCProcess * me = reinterpret_cast<XPCProcess *>(inRefcon);
me->mInCallback = true;
me->DoProcessing(inElapsedSinceLastCall, inElapsedTimeSinceLastFlightLoop, inCounter);
me->mInCallback = false;
return me->mCallbackTime;
}
+37
View File
@@ -0,0 +1,37 @@
#ifndef _XPCProcessing_h_
#define _XPCProcessing_h_
#include "XPLMProcessing.h"
class XPCProcess {
public:
XPCProcess();
virtual ~XPCProcess();
void StartProcessTime(float inSeconds);
void StartProcessCycles(int inCycles);
void StopProcess(void);
virtual void DoProcessing(
float inElapsedSinceLastCall,
float inElapsedTimeSinceLastFlightLoop,
int inCounter)=0;
private:
static float FlightLoopCB(
float inElapsedSinceLastCall,
float inElapsedTimeSinceLastFlightLoop,
int inCounter,
void * inRefcon);
bool mInCallback;
float mCallbackTime;
XPCProcess(const XPCProcess&);
XPCProcess& operator=(const XPCProcess&);
};
#endif
+123
View File
@@ -0,0 +1,123 @@
#include "XPCWidget.h"
XPCWidget::XPCWidget(
int inLeft,
int inTop,
int inRight,
int inBottom,
bool inVisible,
const char * inDescriptor,
bool inIsRoot,
XPWidgetID inParent,
XPWidgetClass inClass) :
mWidget(NULL),
mOwnsChildren(false),
mOwnsWidget(true)
{
mWidget = XPCreateWidget(
inLeft, inTop, inRight, inBottom,
inVisible ? 1 : 0,
inDescriptor,
inIsRoot ? 1 : 0,
inIsRoot ? NULL : inParent,
inClass);
XPSetWidgetProperty(mWidget, xpProperty_Object, reinterpret_cast<intptr_t>(this));
XPAddWidgetCallback(mWidget, WidgetCallback);
}
XPCWidget::XPCWidget(
XPWidgetID inWidget,
bool inOwnsWidget) :
mWidget(inWidget),
mOwnsChildren(false),
mOwnsWidget(inOwnsWidget)
{
XPSetWidgetProperty(mWidget, xpProperty_Object, reinterpret_cast<intptr_t>(this));
XPAddWidgetCallback(mWidget, WidgetCallback);
}
XPCWidget::~XPCWidget()
{
if (mOwnsWidget)
XPDestroyWidget(mWidget, mOwnsChildren ? 1 : 0);
}
void XPCWidget::SetOwnsWidget(
bool inOwnsWidget)
{
mOwnsWidget = inOwnsWidget;
}
void XPCWidget::SetOwnsChildren(
bool inOwnsChildren)
{
mOwnsChildren = inOwnsChildren;
}
XPCWidget::operator XPWidgetID () const
{
return mWidget;
}
XPWidgetID XPCWidget::Get(void) const
{
return mWidget;
}
void XPCWidget::AddAttachment(
XPCWidgetAttachment * inAttachment,
bool inOwnsAttachment,
bool inPrefilter)
{
if (inPrefilter)
{
mAttachments.insert(mAttachments.begin(), AttachmentInfo(inAttachment, inOwnsAttachment));
} else {
mAttachments.push_back(AttachmentInfo(inAttachment, inOwnsAttachment));
}
}
void XPCWidget::RemoveAttachment(
XPCWidgetAttachment * inAttachment)
{
for (AttachmentVector::iterator iter = mAttachments.begin();
iter != mAttachments.end(); ++iter)
{
if (iter->first == inAttachment)
{
mAttachments.erase(iter);
return;
}
}
}
int XPCWidget::HandleWidgetMessage(
XPWidgetMessage inMessage,
XPWidgetID inWidget,
intptr_t inParam1,
intptr_t inParam2)
{
return 0;
}
int XPCWidget::WidgetCallback(
XPWidgetMessage inMessage,
XPWidgetID inWidget,
intptr_t inParam1,
intptr_t inParam2)
{
XPCWidget * me = reinterpret_cast<XPCWidget *>(XPGetWidgetProperty(inWidget, xpProperty_Object, NULL));
if (me == NULL)
return 0;
for (AttachmentVector::iterator iter = me->mAttachments.begin(); iter !=
me->mAttachments.end(); ++iter)
{
int result = iter->first->HandleWidgetMessage(me, inMessage, inWidget, inParam1, inParam2);
if (result != 0)
return result;
}
return me->HandleWidgetMessage(inMessage, inWidget, inParam1, inParam2);
}
+84
View File
@@ -0,0 +1,84 @@
#ifndef _XPCWidget_h_
#define _XPCWidget_h_
#include <vector>
#include <algorithm>
#include "XPWidgets.h"
class XPCWidget;
class XPCWidgetAttachment {
public:
virtual int HandleWidgetMessage(
XPCWidget * inObject,
XPWidgetMessage inMessage,
XPWidgetID inWidget,
intptr_t inParam1,
intptr_t inParam2)=0;
};
class XPCWidget {
public:
XPCWidget(
int inLeft,
int inTop,
int inRight,
int inBottom,
bool inVisible,
const char * inDescriptor,
bool inIsRoot,
XPWidgetID inParent,
XPWidgetClass inClass);
XPCWidget(
XPWidgetID inWidget,
bool inOwnsWidget);
virtual ~XPCWidget();
void SetOwnsWidget(
bool inOwnsWidget);
void SetOwnsChildren(
bool inOwnsChildren);
operator XPWidgetID () const;
XPWidgetID Get(void) const;
void AddAttachment(
XPCWidgetAttachment * inAttachment,
bool inOwnsAttachment,
bool inPrefilter);
void RemoveAttachment(
XPCWidgetAttachment * inAttachment);
virtual int HandleWidgetMessage(
XPWidgetMessage inMessage,
XPWidgetID inWidget,
intptr_t inParam1,
intptr_t inParam2);
private:
static int WidgetCallback(
XPWidgetMessage inMessage,
XPWidgetID inWidget,
intptr_t inParam1,
intptr_t inParam2);
typedef std::pair<XPCWidgetAttachment *, bool> AttachmentInfo;
typedef std::vector<AttachmentInfo> AttachmentVector;
AttachmentVector mAttachments;
XPWidgetID mWidget;
bool mOwnsChildren;
bool mOwnsWidget;
XPCWidget();
XPCWidget(const XPCWidget&);
XPCWidget& operator=(const XPCWidget&);
};
#endif
@@ -0,0 +1,267 @@
#include "XPCWidgetAttachments.h"
#include "XPStandardWidgets.h"
#include "XPWidgetUtils.h"
static void XPCGetOrderedSubWidgets(
XPWidgetID inWidget,
std::vector<XPWidgetID>& outChildren);
XPCKeyFilterAttachment::XPCKeyFilterAttachment(
const char * inValidKeys,
const char * outValidKeys) :
mInput(inValidKeys),
mOutput(outValidKeys)
{
}
XPCKeyFilterAttachment::~XPCKeyFilterAttachment()
{
}
int XPCKeyFilterAttachment::HandleWidgetMessage(
XPCWidget * inObject,
XPWidgetMessage inMessage,
XPWidgetID inWidget,
intptr_t inParam1,
intptr_t inParam2)
{
if (inMessage == xpMsg_KeyPress)
{
char& theKey = KEY_CHAR(inParam1);
std::string::size_type pos = mInput.find(theKey);
if (pos == std::string::npos)
return 1; // Not found; eat the key!
else {
theKey = mOutput[pos];
return 0;
} // Let it live.
}
return 0;
}
XPCKeyMessageAttachment::XPCKeyMessageAttachment(
char inKey,
int inMessage,
void * inParam,
bool inConsume,
bool inVkey,
XPCListener * inListener) :
mKey(inKey), mMsg(inMessage), mParam(inParam), mConsume(inConsume),
mVkey(inVkey)
{
if (inListener != NULL)
this->AddListener(inListener);
}
XPCKeyMessageAttachment::~XPCKeyMessageAttachment()
{
}
int XPCKeyMessageAttachment::HandleWidgetMessage(
XPCWidget * inObject,
XPWidgetMessage inMessage,
XPWidgetID inWidget,
intptr_t inParam1,
intptr_t inParam2)
{
if (inMessage == xpMsg_KeyPress)
{
char theKey = mVkey ? KEY_VKEY(inParam1) : KEY_CHAR(inParam1);
if (theKey != mKey)
return 0;
if (!(KEY_FLAGS(inParam1) & xplm_DownFlag))
return 0;
BroadcastMessage(mMsg, mParam);
return mConsume ? 1 : 0;
}
return 0;
}
XPCPushButtonMessageAttachment::XPCPushButtonMessageAttachment(
XPWidgetID inWidget,
int inMessage,
void * inParam,
XPCListener * inListener) :
mMsg(inMessage), mParam(inParam), mWidget(inWidget)
{
if (inListener != NULL)
this->AddListener(inListener);
}
XPCPushButtonMessageAttachment::~XPCPushButtonMessageAttachment()
{
}
int XPCPushButtonMessageAttachment::HandleWidgetMessage(
XPCWidget * inObject,
XPWidgetMessage inMessage,
XPWidgetID inWidget,
intptr_t inParam1,
intptr_t inParam2)
{
if ((inMessage == xpMsg_PushButtonPressed) && ((XPWidgetID) inParam1 == mWidget))
{
BroadcastMessage(mMsg, mParam);
return 1;
}
if ((inMessage == xpMsg_ButtonStateChanged) && ((XPWidgetID) inParam1 == mWidget))
{
BroadcastMessage(mMsg, mParam);
return 1;
}
return 0;
}
XPCSliderMessageAttachment::XPCSliderMessageAttachment(
XPWidgetID inWidget,
int inMessage,
void * inParam,
XPCListener * inListener) :
mMsg(inMessage), mParam(inParam), mWidget(inWidget)
{
if (inListener != NULL)
this->AddListener(inListener);
}
XPCSliderMessageAttachment::~XPCSliderMessageAttachment()
{
}
int XPCSliderMessageAttachment::HandleWidgetMessage(
XPCWidget * inObject,
XPWidgetMessage inMessage,
XPWidgetID inWidget,
intptr_t inParam1,
intptr_t inParam2)
{
if ((inMessage == xpMsg_ScrollBarSliderPositionChanged) && ((XPWidgetID) inParam1 == mWidget))
{
BroadcastMessage(mMsg, mParam);
return 1;
}
return 0;
}
XPCCloseButtonMessageAttachment::XPCCloseButtonMessageAttachment(
XPWidgetID inWidget,
int inMessage,
void * inParam,
XPCListener * inListener) :
mMsg(inMessage), mParam(inParam), mWidget(inWidget)
{
if (inListener != NULL)
this->AddListener(inListener);
}
XPCCloseButtonMessageAttachment::~XPCCloseButtonMessageAttachment()
{
}
int XPCCloseButtonMessageAttachment::HandleWidgetMessage(
XPCWidget * inObject,
XPWidgetMessage inMessage,
XPWidgetID inWidget,
intptr_t inParam1,
intptr_t inParam2)
{
if ((inMessage == xpMessage_CloseButtonPushed) && ((XPWidgetID) inParam1 == mWidget))
{
BroadcastMessage(mMsg, mParam);
return 1;
}
return 0;
}
XPCTabGroupAttachment::XPCTabGroupAttachment()
{
}
XPCTabGroupAttachment::~XPCTabGroupAttachment()
{
}
int XPCTabGroupAttachment::HandleWidgetMessage(
XPCWidget * inObject,
XPWidgetMessage inMessage,
XPWidgetID inWidget,
intptr_t inParam1,
intptr_t inParam2)
{
if ((inMessage == xpMsg_KeyPress) && (KEY_CHAR(inParam1) == XPLM_KEY_TAB) &&
((KEY_FLAGS(inParam1) & xplm_UpFlag) == 0))
{
bool backwards = (KEY_FLAGS(inParam1) & xplm_ShiftFlag) != 0;
std::vector<XPWidgetID> widgets;
XPCGetOrderedSubWidgets(inWidget, widgets);
int n, index = 0;
XPWidgetID focusWidget = XPGetWidgetWithFocus();
std::vector<XPWidgetID>::iterator iter = std::find(widgets.begin(), widgets.end(), focusWidget);
if (iter != widgets.end())
{
index = std::distance(widgets.begin(), iter);
if (backwards)
index--;
else
index++;
if (index < 0)
index = widgets.size() - 1;
if (index >= widgets.size())
index = 0;
}
if (backwards)
{
for (n = index; n >= 0; --n)
{
if (XPGetWidgetProperty(widgets[n], xpProperty_Enabled, NULL))
if (XPSetKeyboardFocus(widgets[n]) != NULL)
return 1;
}
for (n = widgets.size() - 1; n > index; --n)
{
if (XPGetWidgetProperty(widgets[n], xpProperty_Enabled, NULL))
if (XPSetKeyboardFocus(widgets[n]) != NULL)
return 1;
}
} else {
for (n = index; n < widgets.size(); ++n)
{
if (XPGetWidgetProperty(widgets[n], xpProperty_Enabled, NULL))
if (XPSetKeyboardFocus(widgets[n]) != NULL)
return 1;
}
for (n = 0; n < index; ++n)
{
if (XPGetWidgetProperty(widgets[n], xpProperty_Enabled, NULL))
if (XPSetKeyboardFocus(widgets[n]) != NULL)
return 1;
}
}
}
return 0;
}
static void XPCGetOrderedSubWidgets(
XPWidgetID inWidget,
std::vector<XPWidgetID>& outChildren)
{
outChildren.clear();
int count = XPCountChildWidgets(inWidget);
for (int n = 0; n < count; ++n)
{
XPWidgetID child = XPGetNthChildWidget(inWidget, n);
outChildren.push_back(child);
std::vector<XPWidgetID> grandChildren;
XPCGetOrderedSubWidgets(child, grandChildren);
outChildren.insert(outChildren.end(), grandChildren.begin(), grandChildren.end());
}
}
@@ -0,0 +1,146 @@
#ifndef _XPCWidgetAttachments_h_
#define _XPCWidgetAttachments_h_
#include <string>
#include "XPCWidget.h"
#include "XPCBroadcaster.h"
class XPCKeyFilterAttachment : public XPCWidgetAttachment {
public:
XPCKeyFilterAttachment(
const char * inValidKeys,
const char * outValidKeys);
virtual ~XPCKeyFilterAttachment();
virtual int HandleWidgetMessage(
XPCWidget * inObject,
XPWidgetMessage inMessage,
XPWidgetID inWidget,
intptr_t inParam1,
intptr_t inParam2);
private:
std::string mInput;
std::string mOutput;
};
class XPCKeyMessageAttachment : public XPCWidgetAttachment, public XPCBroadcaster {
public:
XPCKeyMessageAttachment(
char inKey,
int inMessage,
void * inParam,
bool inConsume,
bool inVkey,
XPCListener * inListener);
virtual ~XPCKeyMessageAttachment();
virtual int HandleWidgetMessage(
XPCWidget * inObject,
XPWidgetMessage inMessage,
XPWidgetID inWidget,
intptr_t inParam1,
intptr_t inParam2);
private:
char mKey;
bool mVkey;
int mMsg;
void * mParam;
bool mConsume;
};
class XPCPushButtonMessageAttachment : public XPCWidgetAttachment, XPCBroadcaster {
public:
XPCPushButtonMessageAttachment(
XPWidgetID inWidget,
int inMessage,
void * inParam,
XPCListener * inListener);
virtual ~XPCPushButtonMessageAttachment();
virtual int HandleWidgetMessage(
XPCWidget * inObject,
XPWidgetMessage inMessage,
XPWidgetID inWidget,
intptr_t inParam1,
intptr_t inParam2);
private:
XPWidgetID mWidget;
int mMsg;
void * mParam;
};
class XPCSliderMessageAttachment : public XPCWidgetAttachment, XPCBroadcaster {
public:
XPCSliderMessageAttachment(
XPWidgetID inWidget,
int inMessage,
void * inParam,
XPCListener * inListener);
virtual ~XPCSliderMessageAttachment();
virtual int HandleWidgetMessage(
XPCWidget * inObject,
XPWidgetMessage inMessage,
XPWidgetID inWidget,
intptr_t inParam1,
intptr_t inParam2);
private:
XPWidgetID mWidget;
int mMsg;
void * mParam;
};
class XPCCloseButtonMessageAttachment : public XPCWidgetAttachment, XPCBroadcaster {
public:
XPCCloseButtonMessageAttachment(
XPWidgetID inWidget,
int inMessage,
void * inParam,
XPCListener * inListener);
virtual ~XPCCloseButtonMessageAttachment();
virtual int HandleWidgetMessage(
XPCWidget * inObject,
XPWidgetMessage inMessage,
XPWidgetID inWidget,
intptr_t inParam1,
intptr_t inParam2);
private:
XPWidgetID mWidget;
int mMsg;
void * mParam;
};
class XPCTabGroupAttachment : public XPCWidgetAttachment {
public:
XPCTabGroupAttachment();
virtual ~XPCTabGroupAttachment();
virtual int HandleWidgetMessage(
XPCWidget * inObject,
XPWidgetMessage inMessage,
XPWidgetID inWidget,
intptr_t inParam1,
intptr_t inParam2);
};
#endif
+167
View File
@@ -0,0 +1,167 @@
#ifndef _XPLMCamera_h_
#define _XPLMCamera_h_
/*
* Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See
* license.txt for usage. X-Plane SDK Version: 2.1.1
*
*/
/***************************************************************************
* XPLMCamera
***************************************************************************/
/*
* The XPLMCamera APIs allow plug-ins to control the camera angle in X-Plane.
* This has a number of applications, including but not limited to:
*
* - Creating new views (including dynamic/user-controllable views) for the
* user.
* - Creating applications that use X-Plane as a renderer of scenery,
* aircrafts, or both.
*
* The camera is controlled via six parameters: a location in OpenGL
* coordinates and pitch, roll and yaw, similar to an airplane's position.
* OpenGL coordinate info is described in detail in the XPLMGraphics
* documentation; generally you should use the XPLMGraphics routines to
* convert from world to local coordinates. The camera's orientation starts
* facing level with the ground directly up the negative-Z axis (approximately
* north) with the horizon horizontal. It is then rotated clockwise for yaw,
* pitched up for positive pitch, and rolled clockwise around the vector it is
* looking along for roll.
*
* You control the camera either either until the user selects a new view or
* permanently (the later being similar to how UDP camera control works). You
* control the camera by registering a callback per frame from which you
* calculate the new camera positions. This guarantees smooth camera motion.
*
* Use the XPLMDataAccess APIs to get information like the position of the
* aircraft, etc. for complex camera positioning.
*
* Note: if your goal is to move the virtual pilot in the cockpit, this API is
* not needed; simply update the datarefs for the pilot's head position.
*
* For custom exterior cameras, set the camera's mode to an external view
* first to get correct sound and 2-d panel behavior.
*
*/
#include "XPLMDefs.h"
#ifdef __cplusplus
extern "C" {
#endif
/***************************************************************************
* CAMERA CONTROL
***************************************************************************/
/*
* XPLMCameraControlDuration
*
* This enumeration states how long you want to retain control of the camera.
* You can retain it indefinitely or until the user selects a new view.
*
*/
enum {
/* Control the camera until the user picks a new view. */
xplm_ControlCameraUntilViewChanges = 1,
/* Control the camera until your plugin is disabled or another plugin forcably*
* takes control. */
xplm_ControlCameraForever = 2,
};
typedef int XPLMCameraControlDuration;
/*
* XPLMCameraPosition_t
*
* This structure contains a full specification of the camera. X, Y, and Z are
* the camera's position in OpenGL coordiantes; pitch, roll, and yaw are
* rotations from a camera facing flat north in degrees. Positive pitch means
* nose up, positive roll means roll right, and positive yaw means yaw right,
* all in degrees. Zoom is a zoom factor, with 1.0 meaning normal zoom and 2.0
* magnifying by 2x (objects appear larger).
*
*/
typedef struct {
float x;
float y;
float z;
float pitch;
float heading;
float roll;
float zoom;
} XPLMCameraPosition_t;
/*
* XPLMCameraControl_f
*
* You use an XPLMCameraControl function to provide continuous control over
* the camera. You are passed in a structure in which to put the new camera
* position; modify it and return 1 to reposition the camera. Return 0 to
* surrender control of the camera; camera control will be handled by X-Plane
* on this draw loop. The contents of the structure as you are called are
* undefined.
*
* If X-Plane is taking camera control away from you, this function will be
* called with inIsLosingControl set to 1 and ioCameraPosition NULL.
*
*/
typedef int (* XPLMCameraControl_f)(
XPLMCameraPosition_t * outCameraPosition, /* Can be NULL */
int inIsLosingControl,
void * inRefcon);
/*
* XPLMControlCamera
*
* This function repositions the camera on the next drawing cycle. You must
* pass a non-null control function. Specify in inHowLong how long you'd like
* control (indefinitely or until a new view mode is set by the user).
*
*/
XPLM_API void XPLMControlCamera(
XPLMCameraControlDuration inHowLong,
XPLMCameraControl_f inControlFunc,
void * inRefcon);
/*
* XPLMDontControlCamera
*
* This function stops you from controlling the camera. If you have a camera
* control function, it will not be called with an inIsLosingControl flag.
* X-Plane will control the camera on the next cycle.
*
* For maximum compatibility you should not use this routine unless you are in
* posession of the camera.
*
*/
XPLM_API void XPLMDontControlCamera(void);
/*
* XPLMIsCameraBeingControlled
*
* This routine returns 1 if the camera is being controlled, zero if it is
* not. If it is and you pass in a pointer to a camera control duration, the
* current control duration will be returned.
*
*/
XPLM_API int XPLMIsCameraBeingControlled(
XPLMCameraControlDuration * outCameraControlDuration); /* Can be NULL */
/*
* XPLMReadCameraPosition
*
* This function reads the current camera position.
*
*/
XPLM_API void XPLMReadCameraPosition(
XPLMCameraPosition_t * outCameraPosition);
#ifdef __cplusplus
}
#endif
#endif
+716
View File
@@ -0,0 +1,716 @@
#ifndef _XPLMDataAccess_h_
#define _XPLMDataAccess_h_
/*
* Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See
* license.txt for usage. X-Plane SDK Version: 2.1.1
*
*/
/***************************************************************************
* XPLMDataAccess
***************************************************************************/
/*
* The data access API gives you a generic, flexible, high performance way to
* read and write data to and from X-Plane and other plug-ins. For example,
* this API allows you to read and set the nav radios, get the plane location,
* determine the current effective graphics frame rate, etc.
*
* The data access APIs are the way that you read and write data from the sim
* as well as other plugins.
*
* The API works using opaque data references. A data reference is a source of
* data; you do not know where it comes from, but once you have it you can
* read the data quickly and possibly write it.
*
* Dataref Lookup
* --------------
*
* Data references are identified by verbose, permanent string names; by
* convention these names use path separates to form a hierarchy of datarefs,
* e.g. (sim/cockpit/radios/nav1_freq_hz). The actual opaque numeric value of
* the data reference, as returned by the XPLM API, is implementation defined
* and changes each time X-Plane is launched; therefore you need to look up
* the dataref by path every time your plugin runs.
*
* The task of looking up a data reference is relatively expensive; look up
* your data references once based on the verbose path strings, and save the
* opaque data reference value for the duration of your plugin's operation.
* Reading and writing data references is relatively fast (the cost is
* equivalent to two function calls through function pointers).
*
* X-Plane publishes over 4000 datarefs; a complete list may be found in the
* reference section of the SDK online documentation (from the SDK home page,
* choose Documentation).
*
* Dataref Types
* -------------
*
* A note on typing: you must know the correct data type to read and write.
* APIs are provided for reading and writing data in a number of ways. You can
* also double check the data type for a data ref. Automatic type conversion
* is not done for you.
*
* Dataref types are a set, e.g. a dataref can be more than one type. When
* this happens, you can choose which API you want to use to read. For
* example, it is not uncommon for a dataref to be of type float and double.
* This means you can use either XPLMGetDatad or XPLMGetDataf to read it.
*
* Creating New Datarefs
* ---------------------
*
* X-Plane provides datarefs that come with the sim, but plugins can also
* create their own datarefs. A plugin creates a dataref by registering
* function callbacks to read and write the dataref. The XPLM will call your
* plugin each time some other plugin (or X-Plane) tries to read or write the
* dataref. You must provide a read (and optional write) callback for each
* data type you support.
*
* A note for plugins sharing data with other plugins: the load order of
* plugins is not guaranteed. To make sure that every plugin publishing data
* has published their data references before other plugins try to subscribe,
* publish your data references in your start routine but resolve them the
* first time your 'enable' routine is called, or the first time they are
* needed in code.
*
* When a plugin that created a dataref is unloaded, it becomes "orphaned".
* The dataref handle continues to be usable, but the dataref is not writable,
* and reading it will always return 0 (or 0 items for arrays). If the plugin
* is reloaded and re-registers the dataref, the handle becomes un-orphaned
* and works again.
*
*/
#include "XPLMDefs.h"
#ifdef __cplusplus
extern "C" {
#endif
/***************************************************************************
* READING AND WRITING DATA
***************************************************************************/
/*
* These routines allow you to access data from within X-Plane and sometimes
* modify it.
*
*/
/*
* XPLMDataRef
*
* A data ref is an opaque handle to data provided by the simulator or another
* plugin. It uniquely identifies one variable (or array of variables) over
* the lifetime of your plugin. You never hard code these values; you always
* get them from XPLMFindDataRef.
*
*/
typedef void * XPLMDataRef;
/*
* XPLMDataTypeID
*
* This is an enumeration that defines the type of the data behind a data
* reference. This allows you to sanity check that the data type matches what
* you expect. But for the most part, you will know the type of data you are
* expecting from the online documentation.
*
* Data types each take a bit field; it is legal to have a single dataref be
* more than one type of data. Whe this happens, you can pick any matching
* get/set API.
*
*/
enum {
/* Data of a type the current XPLM doesn't do. */
xplmType_Unknown = 0,
/* A single 4-byte integer, native endian. */
xplmType_Int = 1,
/* A single 4-byte float, native endian. */
xplmType_Float = 2,
/* A single 8-byte double, native endian. */
xplmType_Double = 4,
/* An array of 4-byte floats, native endian. */
xplmType_FloatArray = 8,
/* An array of 4-byte integers, native endian. */
xplmType_IntArray = 16,
/* A variable block of data. */
xplmType_Data = 32,
};
typedef int XPLMDataTypeID;
/*
* XPLMFindDataRef
*
* Given a c-style string that names the data ref, this routine looks up the
* actual opaque XPLMDataRef that you use to read and write the data. The
* string names for datarefs are published on the X-Plane SDK web site.
*
* This function returns NULL if the data ref cannot be found.
*
* NOTE: this function is relatively expensive; save the XPLMDataRef this
* function returns for future use. Do not look up your data ref by string
* every time you need to read or write it.
*
*/
XPLM_API XPLMDataRef XPLMFindDataRef(
const char * inDataRefName);
/*
* XPLMCanWriteDataRef
*
* Given a data ref, this routine returns true if you can successfully set the
* data, false otherwise. Some datarefs are read-only.
*
* NOTE: even if a dataref is marked writable, it may not act writable. This
* can happen for datarefs that X-Plane writes to on every frame of
* simulation. In some cases, the dataref is writable but you have to set a
* separate "override" dataref to 1 to stop X-Plane from writing it.
*
*/
XPLM_API int XPLMCanWriteDataRef(
XPLMDataRef inDataRef);
/*
* XPLMIsDataRefGood
*
* This function returns true if the passed in handle is a valid dataref that
* is not orphaned.
*
* Note: there is normally no need to call this function; datarefs returned by
* XPLMFindDataRef remain valid (but possibly orphaned) unless there is a
* complete plugin reload (in which case your plugin is reloaded anyway).
* Orphaned datarefs can be safely read and return 0. Therefore you never need
* to call XPLMIsDataRefGood to 'check' the safety of a dataref.
* (XPLMIsDatarefGood performs some slow checking of the handle validity, so
* it has a perormance cost.)
*
*/
XPLM_API int XPLMIsDataRefGood(
XPLMDataRef inDataRef);
/*
* XPLMGetDataRefTypes
*
* This routine returns the types of the data ref for accessor use. If a data
* ref is available in multiple data types, the bit-wise OR of these types
* will be returned.
*
*/
XPLM_API XPLMDataTypeID XPLMGetDataRefTypes(
XPLMDataRef inDataRef);
/***************************************************************************
* DATA ACCESSORS
***************************************************************************/
/*
* These routines read and write the data references. For each supported data
* type there is a reader and a writer.
*
* If the data ref is orphaned or the plugin that provides it is disabled or
* there is a type mismatch, the functions that read data will return 0 as a
* default value or not modify the passed in memory. The plugins that write
* data will not write under these circumstances or if the data ref is
* read-only.
*
* NOTE: to keep the overhead of reading datarefs low, these routines do not
* do full validation of a dataref; passing a junk value for a dataref can
* result in crashing the sim. The get/set APIs do check for NULL.
*
* For array-style datarefs, you specify the number of items to read/write and
* the offset into the array; the actual number of items read or written is
* returned. This may be less to prevent an array-out-of-bounds error.
*
*/
/*
* XPLMGetDatai
*
* Read an integer data ref and return its value. The return value is the
* dataref value or 0 if the dataref is NULL or the plugin is disabled.
*
*/
XPLM_API int XPLMGetDatai(
XPLMDataRef inDataRef);
/*
* XPLMSetDatai
*
* Write a new value to an integer data ref. This routine is a no-op if the
* plugin publishing the dataref is disabled, the dataref is NULL, or the
* dataref is not writable.
*
*/
XPLM_API void XPLMSetDatai(
XPLMDataRef inDataRef,
int inValue);
/*
* XPLMGetDataf
*
* Read a single precision floating point dataref and return its value. The
* return value is the dataref value or 0.0 if the dataref is NULL or the
* plugin is disabled.
*
*/
XPLM_API float XPLMGetDataf(
XPLMDataRef inDataRef);
/*
* XPLMSetDataf
*
* Write a new value to a single precision floating point data ref. This
* routine is a no-op if the plugin publishing the dataref is disabled, the
* dataref is NULL, or the dataref is not writable.
*
*/
XPLM_API void XPLMSetDataf(
XPLMDataRef inDataRef,
float inValue);
/*
* XPLMGetDatad
*
* Read a double precision floating point dataref and return its value. The
* return value is the dataref value or 0.0 if the dataref is NULL or the
* plugin is disabled.
*
*/
XPLM_API double XPLMGetDatad(
XPLMDataRef inDataRef);
/*
* XPLMSetDatad
*
* Write a new value to a double precision floating point data ref. This
* routine is a no-op if the plugin publishing the dataref is disabled, the
* dataref is NULL, or the dataref is not writable.
*
*/
XPLM_API void XPLMSetDatad(
XPLMDataRef inDataRef,
double inValue);
/*
* XPLMGetDatavi
*
* Read a part of an integer array dataref. If you pass NULL for outValues,
* the routine will return the size of the array, ignoring inOffset and inMax.
*
* If outValues is not NULL, then up to inMax values are copied from the
* dataref into outValues, starting at inOffset in the dataref. If inMax +
* inOffset is larger than the size of the dataref, less than inMax values
* will be copied. The number of values copied is returned.
*
* Note: the semantics of array datarefs are entirely implemented by the
* plugin (or X-Plane) that provides the dataref, not the SDK itself; the
* above description is how these datarefs are intended to work, but a rogue
* plugin may have different behavior.
*
*/
XPLM_API int XPLMGetDatavi(
XPLMDataRef inDataRef,
int * outValues, /* Can be NULL */
int inOffset,
int inMax);
/*
* XPLMSetDatavi
*
* Write part or all of an integer array dataref. The values passed by
* inValues are written into the dataref starting at inOffset. Up to inCount
* values are written; however if the values would write "off the end" of the
* dataref array, then fewer values are written.
*
* Note: the semantics of array datarefs are entirely implemented by the
* plugin (or X-Plane) that provides the dataref, not the SDK itself; the
* above description is how these datarefs are intended to work, but a rogue
* plugin may have different behavior.
*
*/
XPLM_API void XPLMSetDatavi(
XPLMDataRef inDataRef,
int * inValues,
int inoffset,
int inCount);
/*
* XPLMGetDatavf
*
* Read a part of a single precision floating point array dataref. If you pass
* NULL for outVaules, the routine will return the size of the array, ignoring
* inOffset and inMax.
*
* If outValues is not NULL, then up to inMax values are copied from the
* dataref into outValues, starting at inOffset in the dataref. If inMax +
* inOffset is larger than the size of the dataref, less than inMax values
* will be copied. The number of values copied is returned.
*
* Note: the semantics of array datarefs are entirely implemented by the
* plugin (or X-Plane) that provides the dataref, not the SDK itself; the
* above description is how these datarefs are intended to work, but a rogue
* plugin may have different behavior.
*
*/
XPLM_API int XPLMGetDatavf(
XPLMDataRef inDataRef,
float * outValues, /* Can be NULL */
int inOffset,
int inMax);
/*
* XPLMSetDatavf
*
* Write part or all of a single precision floating point array dataref. The
* values passed by inValues are written into the dataref starting at
* inOffset. Up to inCount values are written; however if the values would
* write "off the end" of the dataref array, then fewer values are written.
*
* Note: the semantics of array datarefs are entirely implemented by the
* plugin (or X-Plane) that provides the dataref, not the SDK itself; the
* above description is how these datarefs are intended to work, but a rogue
* plugin may have different behavior.
*
*/
XPLM_API void XPLMSetDatavf(
XPLMDataRef inDataRef,
float * inValues,
int inoffset,
int inCount);
/*
* XPLMGetDatab
*
* Read a part of a byte array dataref. If you pass NULL for outVaules, the
* routine will return the size of the array, ignoring inOffset and inMax.
*
* If outValues is not NULL, then up to inMax values are copied from the
* dataref into outValues, starting at inOffset in the dataref. If inMax +
* inOffset is larger than the size of the dataref, less than inMax values
* will be copied. The number of values copied is returned.
*
* Note: the semantics of array datarefs are entirely implemented by the
* plugin (or X-Plane) that provides the dataref, not the SDK itself; the
* above description is how these datarefs are intended to work, but a rogue
* plugin may have different behavior.
*
*/
XPLM_API int XPLMGetDatab(
XPLMDataRef inDataRef,
void * outValue, /* Can be NULL */
int inOffset,
int inMaxBytes);
/*
* XPLMSetDatab
*
* Write part or all of a byte array dataref. The values passed by inValues
* are written into the dataref starting at inOffset. Up to inCount values are
* written; however if the values would write "off the end" of the dataref
* array, then fewer values are written.
*
* Note: the semantics of array datarefs are entirely implemented by the
* plugin (or X-Plane) that provides the dataref, not the SDK itself; the
* above description is how these datarefs are intended to work, but a rogue
* plugin may have different behavior.
*
*/
XPLM_API void XPLMSetDatab(
XPLMDataRef inDataRef,
void * inValue,
int inOffset,
int inLength);
/***************************************************************************
* PUBLISHING YOUR PLUGIN'S DATA
***************************************************************************/
/*
* These functions allow you to create data references that other plug-ins and
* X-Plane can access via the above data access APIs. Data references
* published by other plugins operate the same as ones published by X-Plane in
* all manners except that your data reference will not be available to other
* plugins if/when your plugin is disabled.
*
* You share data by registering data provider callback functions. When a
* plug-in requests your data, these callbacks are then called. You provide
* one callback to return the value when a plugin 'reads' it and another to
* change the value when a plugin 'writes' it.
*
* Important: you must pick a prefix for your datarefs other than "sim/" -
* this prefix is reserved for X-Plane. The X-Plane SDK website contains a
* registry where authors can select a unique first word for dataref names, to
* prevent dataref collisions between plugins.
*
*/
/*
* XPLMGetDatai_f
*
* Data provider function pointers.
*
* These define the function pointers you provide to get or set data. Note
* that you are passed a generic pointer for each one. This is the same
* pointer you pass in your register routine; you can use it to locate plugin
* variables, etc.
*
* The semantics of your callbacks are the same as the dataref accessor above
* - basically routines like XPLMGetDatai are just pass-throughs from a caller
* to your plugin. Be particularly mindful in implementing array dataref
* read-write accessors; you are responsible for avoiding overruns, supporting
* offset read/writes, and handling a read with a NULL buffer.
*
*/
typedef int (* XPLMGetDatai_f)(
void * inRefcon);
/*
* XPLMSetDatai_f
*
*/
typedef void (* XPLMSetDatai_f)(
void * inRefcon,
int inValue);
/*
* XPLMGetDataf_f
*
*/
typedef float (* XPLMGetDataf_f)(
void * inRefcon);
/*
* XPLMSetDataf_f
*
*/
typedef void (* XPLMSetDataf_f)(
void * inRefcon,
float inValue);
/*
* XPLMGetDatad_f
*
*/
typedef double (* XPLMGetDatad_f)(
void * inRefcon);
/*
* XPLMSetDatad_f
*
*/
typedef void (* XPLMSetDatad_f)(
void * inRefcon,
double inValue);
/*
* XPLMGetDatavi_f
*
*/
typedef int (* XPLMGetDatavi_f)(
void * inRefcon,
int * outValues, /* Can be NULL */
int inOffset,
int inMax);
/*
* XPLMSetDatavi_f
*
*/
typedef void (* XPLMSetDatavi_f)(
void * inRefcon,
int * inValues,
int inOffset,
int inCount);
/*
* XPLMGetDatavf_f
*
*/
typedef int (* XPLMGetDatavf_f)(
void * inRefcon,
float * outValues, /* Can be NULL */
int inOffset,
int inMax);
/*
* XPLMSetDatavf_f
*
*/
typedef void (* XPLMSetDatavf_f)(
void * inRefcon,
float * inValues,
int inOffset,
int inCount);
/*
* XPLMGetDatab_f
*
*/
typedef int (* XPLMGetDatab_f)(
void * inRefcon,
void * outValue, /* Can be NULL */
int inOffset,
int inMaxLength);
/*
* XPLMSetDatab_f
*
*/
typedef void (* XPLMSetDatab_f)(
void * inRefcon,
void * inValue,
int inOffset,
int inLength);
/*
* XPLMRegisterDataAccessor
*
* This routine creates a new item of data that can be read and written. Pass
* in the data's full name for searching, the type(s) of the data for
* accessing, and whether the data can be written to. For each data type you
* support, pass in a read accessor function and a write accessor function if
* necessary. Pass NULL for data types you do not support or write accessors
* if you are read-only.
*
* You are returned a data ref for the new item of data created. You can use
* this data ref to unregister your data later or read or write from it.
*
*/
XPLM_API XPLMDataRef XPLMRegisterDataAccessor(
const char * inDataName,
XPLMDataTypeID inDataType,
int inIsWritable,
XPLMGetDatai_f inReadInt,
XPLMSetDatai_f inWriteInt,
XPLMGetDataf_f inReadFloat,
XPLMSetDataf_f inWriteFloat,
XPLMGetDatad_f inReadDouble,
XPLMSetDatad_f inWriteDouble,
XPLMGetDatavi_f inReadIntArray,
XPLMSetDatavi_f inWriteIntArray,
XPLMGetDatavf_f inReadFloatArray,
XPLMSetDatavf_f inWriteFloatArray,
XPLMGetDatab_f inReadData,
XPLMSetDatab_f inWriteData,
void * inReadRefcon,
void * inWriteRefcon);
/*
* XPLMUnregisterDataAccessor
*
* Use this routine to unregister any data accessors you may have registered.
* You unregister a data ref by the XPLMDataRef you get back from
* registration. Once you unregister a data ref, your function pointer will
* not be called anymore.
*
*/
XPLM_API void XPLMUnregisterDataAccessor(
XPLMDataRef inDataRef);
/***************************************************************************
* SHARING DATA BETWEEN MULTIPLE PLUGINS
***************************************************************************/
/*
* The data reference registration APIs from the previous section allow a
* plugin to publish data in a one-owner manner; the plugin that publishes the
* data reference owns the real memory that the data ref uses. This is
* satisfactory for most cases, but there are also cases where plugnis need to
* share actual data.
*
* With a shared data reference, no one plugin owns the actual memory for the
* data reference; the plugin SDK allocates that for you. When the first
* plugin asks to 'share' the data, the memory is allocated. When the data is
* changed, every plugin that is sharing the data is notified.
*
* Shared data references differ from the 'owned' data references from the
* previous section in a few ways:
*
* * With shared data references, any plugin can create the data reference;
* with owned plugins one plugin must create the data reference and others
* subscribe. (This can be a problem if you don't know which set of plugins
* will be present).
*
* * With shared data references, every plugin that is sharing the data is
* notified when the data is changed. With owned data references, only the
* one owner is notified when the data is changed.
*
* * With shared data references, you cannot access the physical memory of the
* data reference; you must use the XPLMGet... and XPLMSet... APIs. With an
* owned data reference, the one owning data reference can manipulate the
* data reference's memory in any way it sees fit.
*
* Shared data references solve two problems: if you need to have a data
* reference used by several plugins but do not know which plugins will be
* installed, or if all plugins sharing data need to be notified when that
* data is changed, use shared data references.
*
*/
/*
* XPLMDataChanged_f
*
* An XPLMDataChanged_f is a callback that the XPLM calls whenever any other
* plug-in modifies shared data. A refcon you provide is passed back to help
* identify which data is being changed. In response, you may want to call one
* of the XPLMGetDataxxx routines to find the new value of the data.
*
*/
typedef void (* XPLMDataChanged_f)(
void * inRefcon);
/*
* XPLMShareData
*
* This routine connects a plug-in to shared data, creating the shared data if
* necessary. inDataName is a standard path for the data ref, and inDataType
* specifies the type. This function will create the data if it does not
* exist. If the data already exists but the type does not match, an error is
* returned, so it is important that plug-in authors collaborate to establish
* public standards for shared data.
*
* If a notificationFunc is passed in and is not NULL, that notification
* function will be called whenever the data is modified. The notification
* refcon will be passed to it. This allows your plug-in to know which shared
* data was changed if multiple shared data are handled by one callback, or if
* the plug-in does not use global variables.
*
* A one is returned for successfully creating or finding the shared data; a
* zero if the data already exists but is of the wrong type.
*
*/
XPLM_API int XPLMShareData(
const char * inDataName,
XPLMDataTypeID inDataType,
XPLMDataChanged_f inNotificationFunc,
void * inNotificationRefcon);
/*
* XPLMUnshareData
*
* This routine removes your notification function for shared data. Call it
* when done with the data to stop receiving change notifications. Arguments
* must match XPLMShareData. The actual memory will not necessarily be freed,
* since other plug-ins could be using it.
*
*/
XPLM_API int XPLMUnshareData(
const char * inDataName,
XPLMDataTypeID inDataType,
XPLMDataChanged_f inNotificationFunc,
void * inNotificationRefcon);
#ifdef __cplusplus
}
#endif
#endif
+514
View File
@@ -0,0 +1,514 @@
#ifndef _XPLMDefs_h_
#define _XPLMDefs_h_
/*
* Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See
* license.txt for usage. X-Plane SDK Version: 2.1.1
*
*/
/***************************************************************************
* XPLMDefs
***************************************************************************/
/*
* This file is contains the cross-platform and basic definitions for the
* X-Plane SDK.
*
* The preprocessor macros APL and IBM must be defined to specify the
* compilation target; define APL to 1 and IBM 0 to compile on Macintosh and
* APL to 0 and IBM to 1 for Windows. You must specify these macro definitions
* before including XPLMDefs.h or any other XPLM headers. You can do this
* using the -D command line option or a preprocessor header.
*
*/
#ifdef __cplusplus
extern "C" {
#endif
#if IBM
#include <windows.h>
#else
#include <stdint.h>
#endif
/***************************************************************************
* DLL Definitions
***************************************************************************/
/*
* These definitions control the importing and exporting of functions within
* the DLL.
*
* You can prefix your five required callbacks with the PLUGIN_API macro to
* declare them as exported C functions. The XPLM_API macro identifies
* functions that are provided to you via the plugin SDK. (Link against
* XPLM.lib to use these functions.)
*
*/
#ifdef __cplusplus
#if APL
#if __GNUC__ >= 4
#define PLUGIN_API extern "C" __attribute__((visibility("default")))
#elif __MACH__
#define PLUGIN_API extern "C"
#else
#define PLUGIN_API extern "C" __declspec(dllexport)
#endif
#elif IBM
#define PLUGIN_API extern "C" __declspec(dllexport)
#elif LIN
#if __GNUC__ >= 4
#define PLUGIN_API extern "C" __attribute__((visibility("default")))
#else
#define PLUGIN_API extern "C"
#endif
#else
#error "Platform not defined!"
#endif
#else
#if APL
#if __GNUC__ >= 4
#define PLUGIN_API __attribute__((visibility("default")))
#elif __MACH__
#define PLUGIN_API
#else
#define PLUGIN_API __declspec(dllexport)
#endif
#elif IBM
#define PLUGIN_API __declspec(dllexport)
#elif LIN
#if __GNUC__ >= 4
#define PLUGIN_API __attribute__((visibility("default")))
#else
#define PLUGIN_API
#endif
#else
#error "Platform not defined!"
#endif
#endif
#if APL
#if XPLM
#if __GNUC__ >= 4
#define XPLM_API __attribute__((visibility("default")))
#elif __MACH__
#define XPLM_API
#else
#define XPLM_API __declspec(dllexport)
#endif
#else
#define XPLM_API
#endif
#elif IBM
#if XPLM
#define XPLM_API __declspec(dllexport)
#else
#define XPLM_API __declspec(dllimport)
#endif
#elif LIN
#if XPLM
#if __GNUC__ >= 4
#define XPLM_API __attribute__((visibility("default")))
#else
#define XPLM_API
#endif
#else
#define XPLM_API
#endif
#else
#error "Platform not defined!"
#endif
/***************************************************************************
* GLOBAL DEFINITIONS
***************************************************************************/
/*
* These definitions are used in all parts of the SDK.
*
*/
/*
* XPLMPluginID
*
* Each plug-in is identified by a unique integer ID. This ID can be used to
* disable or enable a plug-in, or discover what plug-in is 'running' at the
* time. A plug-in ID is unique within the currently running instance of
* X-Plane unless plug-ins are reloaded. Plug-ins may receive a different
* unique ID each time they are loaded. This includes the unloading and
* reloading of plugins that are part of the user's aircraft.
*
* For persistent identification of plug-ins, use XPLMFindPluginBySignature in
* XPLMUtiltiies.h
*
* -1 indicates no plug-in.
*
*/
typedef int XPLMPluginID;
/* No plugin. */
#define XPLM_NO_PLUGIN_ID (-1)
/* X-Plane itself */
#define XPLM_PLUGIN_XPLANE (0)
/* The current XPLM revision is 4.00 (400). */
#define kXPLM_Version (400)
/*
* XPLMKeyFlags
*
* These bitfields define modifier keys in a platform independent way. When a
* key is pressed, a series of messages are sent to your plugin. The down
* flag is set in the first of these messages, and the up flag in the last.
* While the key is held down, messages are sent with neither to indicate that
* the key is being held down as a repeated character.
*
* The control flag is mapped to the control flag on Macintosh and PC.
* Generally X-Plane uses the control key and not the command key on
* Macintosh, providing a consistent interface across platforms that does not
* necessarily match the Macintosh user interface guidelines. There is not
* yet a way for plugins to access the Macintosh control keys without using
* #ifdefed code.
*
*/
enum {
/* The shift key is down */
xplm_ShiftFlag = 1,
/* The option or alt key is down */
xplm_OptionAltFlag = 2,
/* The control key is down* */
xplm_ControlFlag = 4,
/* The key is being pressed down */
xplm_DownFlag = 8,
/* The key is being released */
xplm_UpFlag = 16,
};
typedef int XPLMKeyFlags;
/***************************************************************************
* ASCII CONTROL KEY CODES
***************************************************************************/
/*
* These definitions define how various control keys are mapped to ASCII key
* codes. Not all key presses generate an ASCII value, so plugin code should
* be prepared to see null characters come from the keyboard...this usually
* represents a key stroke that has no equivalent ASCII, like a page-down
* press. Use virtual key codes to find these key strokes.
*
* ASCII key codes take into account modifier keys; shift keys will affect
* capitals and punctuation; control key combinations may have no vaild ASCII
* and produce NULL. To detect control-key combinations, use virtual key
* codes, not ASCII keys.
*
*/
#define XPLM_KEY_RETURN 13
#define XPLM_KEY_ESCAPE 27
#define XPLM_KEY_TAB 9
#define XPLM_KEY_DELETE 8
#define XPLM_KEY_LEFT 28
#define XPLM_KEY_RIGHT 29
#define XPLM_KEY_UP 30
#define XPLM_KEY_DOWN 31
#define XPLM_KEY_0 48
#define XPLM_KEY_1 49
#define XPLM_KEY_2 50
#define XPLM_KEY_3 51
#define XPLM_KEY_4 52
#define XPLM_KEY_5 53
#define XPLM_KEY_6 54
#define XPLM_KEY_7 55
#define XPLM_KEY_8 56
#define XPLM_KEY_9 57
#define XPLM_KEY_DECIMAL 46
/***************************************************************************
* VIRTUAL KEY CODES
***************************************************************************/
/*
* These are cross-platform defines for every distinct keyboard press on the
* computer. Every physical key on the keyboard has a virtual key code. So
* the "two" key on the top row of the main keyboard has a different code from
* the "two" key on the numeric key pad. But the 'w' and 'W' character are
* indistinguishable by virtual key code because they are the same physical
* key (one with and one without the shift key).
*
* Use virtual key codes to detect keystrokes that do not have ASCII
* equivalents, allow the user to map the numeric keypad separately from the
* main keyboard, and detect control key and other modifier-key combinations
* that generate ASCII control key sequences (many of which are not available
* directly via character keys in the SDK).
*
* To assign virtual key codes we started with the Microsoft set but made some
* additions and changes. A few differences:
*
* 1. Modifier keys are not available as virtual key codes. You cannot get
* distinct modifier press and release messages. Please do not try to use
* modifier keys as regular keys; doing so will almost certainly interfere
* with users' abilities to use the native X-Plane key bindings.
* 2. Some keys that do not exist on both Mac and PC keyboards are removed.
* 3. Do not assume that the values of these keystrokes are interchangeable
* with MS v-keys.
*
*/
#define XPLM_VK_BACK 0x08
#define XPLM_VK_TAB 0x09
#define XPLM_VK_CLEAR 0x0C
#define XPLM_VK_RETURN 0x0D
#define XPLM_VK_ESCAPE 0x1B
#define XPLM_VK_SPACE 0x20
#define XPLM_VK_PRIOR 0x21
#define XPLM_VK_NEXT 0x22
#define XPLM_VK_END 0x23
#define XPLM_VK_HOME 0x24
#define XPLM_VK_LEFT 0x25
#define XPLM_VK_UP 0x26
#define XPLM_VK_RIGHT 0x27
#define XPLM_VK_DOWN 0x28
#define XPLM_VK_SELECT 0x29
#define XPLM_VK_PRINT 0x2A
#define XPLM_VK_EXECUTE 0x2B
#define XPLM_VK_SNAPSHOT 0x2C
#define XPLM_VK_INSERT 0x2D
#define XPLM_VK_DELETE 0x2E
#define XPLM_VK_HELP 0x2F
/* XPLM_VK_0 thru XPLM_VK_9 are the same as ASCII '0' thru '9' (0x30 - 0x39) */
#define XPLM_VK_0 0x30
#define XPLM_VK_1 0x31
#define XPLM_VK_2 0x32
#define XPLM_VK_3 0x33
#define XPLM_VK_4 0x34
#define XPLM_VK_5 0x35
#define XPLM_VK_6 0x36
#define XPLM_VK_7 0x37
#define XPLM_VK_8 0x38
#define XPLM_VK_9 0x39
/* XPLM_VK_A thru XPLM_VK_Z are the same as ASCII 'A' thru 'Z' (0x41 - 0x5A) */
#define XPLM_VK_A 0x41
#define XPLM_VK_B 0x42
#define XPLM_VK_C 0x43
#define XPLM_VK_D 0x44
#define XPLM_VK_E 0x45
#define XPLM_VK_F 0x46
#define XPLM_VK_G 0x47
#define XPLM_VK_H 0x48
#define XPLM_VK_I 0x49
#define XPLM_VK_J 0x4A
#define XPLM_VK_K 0x4B
#define XPLM_VK_L 0x4C
#define XPLM_VK_M 0x4D
#define XPLM_VK_N 0x4E
#define XPLM_VK_O 0x4F
#define XPLM_VK_P 0x50
#define XPLM_VK_Q 0x51
#define XPLM_VK_R 0x52
#define XPLM_VK_S 0x53
#define XPLM_VK_T 0x54
#define XPLM_VK_U 0x55
#define XPLM_VK_V 0x56
#define XPLM_VK_W 0x57
#define XPLM_VK_X 0x58
#define XPLM_VK_Y 0x59
#define XPLM_VK_Z 0x5A
#define XPLM_VK_NUMPAD0 0x60
#define XPLM_VK_NUMPAD1 0x61
#define XPLM_VK_NUMPAD2 0x62
#define XPLM_VK_NUMPAD3 0x63
#define XPLM_VK_NUMPAD4 0x64
#define XPLM_VK_NUMPAD5 0x65
#define XPLM_VK_NUMPAD6 0x66
#define XPLM_VK_NUMPAD7 0x67
#define XPLM_VK_NUMPAD8 0x68
#define XPLM_VK_NUMPAD9 0x69
#define XPLM_VK_MULTIPLY 0x6A
#define XPLM_VK_ADD 0x6B
#define XPLM_VK_SEPARATOR 0x6C
#define XPLM_VK_SUBTRACT 0x6D
#define XPLM_VK_DECIMAL 0x6E
#define XPLM_VK_DIVIDE 0x6F
#define XPLM_VK_F1 0x70
#define XPLM_VK_F2 0x71
#define XPLM_VK_F3 0x72
#define XPLM_VK_F4 0x73
#define XPLM_VK_F5 0x74
#define XPLM_VK_F6 0x75
#define XPLM_VK_F7 0x76
#define XPLM_VK_F8 0x77
#define XPLM_VK_F9 0x78
#define XPLM_VK_F10 0x79
#define XPLM_VK_F11 0x7A
#define XPLM_VK_F12 0x7B
#define XPLM_VK_F13 0x7C
#define XPLM_VK_F14 0x7D
#define XPLM_VK_F15 0x7E
#define XPLM_VK_F16 0x7F
#define XPLM_VK_F17 0x80
#define XPLM_VK_F18 0x81
#define XPLM_VK_F19 0x82
#define XPLM_VK_F20 0x83
#define XPLM_VK_F21 0x84
#define XPLM_VK_F22 0x85
#define XPLM_VK_F23 0x86
#define XPLM_VK_F24 0x87
/* The following definitions are extended and are not based on the Microsoft *
* key set. */
#define XPLM_VK_EQUAL 0xB0
#define XPLM_VK_MINUS 0xB1
#define XPLM_VK_RBRACE 0xB2
#define XPLM_VK_LBRACE 0xB3
#define XPLM_VK_QUOTE 0xB4
#define XPLM_VK_SEMICOLON 0xB5
#define XPLM_VK_BACKSLASH 0xB6
#define XPLM_VK_COMMA 0xB7
#define XPLM_VK_SLASH 0xB8
#define XPLM_VK_PERIOD 0xB9
#define XPLM_VK_BACKQUOTE 0xBA
#define XPLM_VK_ENTER 0xBB
#define XPLM_VK_NUMPAD_ENT 0xBC
#define XPLM_VK_NUMPAD_EQ 0xBD
#ifdef __cplusplus
}
#endif
#endif
File diff suppressed because it is too large. Load diff
+437
View File
@@ -0,0 +1,437 @@
#ifndef _XPLMGraphics_h_
#define _XPLMGraphics_h_
/*
* Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See
* license.txt for usage. X-Plane SDK Version: 2.1.1
*
*/
/***************************************************************************
* XPLMGraphics
***************************************************************************/
/*
* A few notes on coordinate systems:
*
* X-Plane uses three kinds of coordinates. Global coordinates are specified
* as latitude, longitude and elevation. This coordinate system never changes
* but is not very precise.
*
* OpenGL (or 'local') coordinates are cartesian and shift with the plane.
* They offer more precision and are used for 3-d OpenGL drawing. The X axis
* is aligned east-west with positive X meaning east. The Y axis is aligned
* straight up and down at the point 0,0,0 (but since the earth is round it is
* not truly straight up and down at other points). The Z axis is aligned
* north-south at 0, 0, 0 with positive Z pointing south (but since the earth
* is round it isn't exactly north-south as you move east or west of 0, 0, 0).
* One unit is one meter and the point 0,0,0 is on the surface of the earth at
* sea level for some latitude and longitude picked by the sim such that the
* user's aircraft is reasonably nearby.
*
* 2-d Panel coordinates are 2d, with the X axis horizontal and the Y axis
* vertical. The point 0,0 is the bottom left and 1024,768 is the upper
* right of the screen. This is true no matter what resolution the user's
* monitor is in; when running in higher resolution, graphics will be
* scaled.
*
* Use X-Plane's routines to convert between global and local coordinates. Do
* not attempt to do this conversion yourself; the precise 'roundness' of
* X-Plane's physics model may not match your own, and (to make things
* weirder) the user can potentially customize the physics of the current
* planet.
*
*/
#include "XPLMDefs.h"
#ifdef __cplusplus
extern "C" {
#endif
/***************************************************************************
* X-PLANE GRAPHICS
***************************************************************************/
/*
* These routines allow you to use OpenGL with X-Plane.
*
*/
/*
* XPLMTextureID
*
* XPLM Texture IDs name well-known textures in the sim for you to use. This
* allows you to recycle textures from X-Plane, saving VRAM.
*
* *Warning*: do not use these enums. The only remaining use they have is to
* access the legacy compatibility v10 UI texture; if you need this, get it
* via the Widgets library.
*
*/
enum {
/* The bitmap that contains window outlines, button outlines, fonts, etc. */
xplm_Tex_GeneralInterface = 0,
#if defined(XPLM_DEPRECATED)
/* The exterior paint for the user's aircraft (daytime). */
xplm_Tex_AircraftPaint = 1,
#endif /* XPLM_DEPRECATED */
#if defined(XPLM_DEPRECATED)
/* The exterior light map for the user's aircraft. */
xplm_Tex_AircraftLiteMap = 2,
#endif /* XPLM_DEPRECATED */
};
typedef int XPLMTextureID;
/*
* XPLMSetGraphicsState
*
* XPLMSetGraphicsState changes OpenGL's fixed function pipeline state. You
* are not responsible for restoring any state that is accessed via
* XPLMSetGraphicsState, but you are responsible for not accessing this state
* directly.
*
* - inEnableFog - enables or disables fog, equivalent to: glEnable(GL_FOG);
* - inNumberTexUnits - enables or disables a number of multitexturing units.
* If the number is 0, 2d texturing is disabled entirely, as in
* glDisable(GL_TEXTURE_2D); Otherwise, 2d texturing is enabled, and a
* number of multitexturing units are enabled sequentially, starting with
* unit 0, e.g. glActiveTextureARB(GL_TEXTURE0_ARB); glEnable
* (GL_TEXTURE_2D);
* - inEnableLighting - enables or disables OpenGL lighting, e.g.
* glEnable(GL_LIGHTING); glEnable(GL_LIGHT0);
* - inEnableAlphaTesting - enables or disables the alpha test per pixel, e.g.
* glEnable(GL_ALPHA_TEST);
* - inEnableAlphaBlending - enables or disables alpha blending per pixel,
* e.g. glEnable(GL_BLEND);
* - inEnableDepthTesting - enables per pixel depth testing, as in
* glEnable(GL_DEPTH_TEST);
* - inEnableDepthWriting - enables writing back of depth information to the
* depth bufffer, as in glDepthMask(GL_TRUE);
*
* The purpose of this function is to change OpenGL state while keeping
* X-Plane aware of the state changes; this keeps X-Plane from getting
* surprised by OGL state changes, and prevents X-Plane and plug-ins from
* having to set all state before all draws; XPLMSetGraphicsState internally
* skips calls to change state that is already properly enabled.
*
* X-Plane does not have a 'default' OGL state for plug-ins with respect to
* the above state vector; plug-ins should totally set OGL state using this
* API before drawing. Use XPLMSetGraphicsState instead of any of the above
* OpenGL calls.
*
* WARNING: Any routine that performs drawing (e.g. XPLMDrawString or widget
* code) may change X-Plane's state. Always set state before drawing after
* unknown code has executed.
*
* *Deprecation Warnings*: X-Plane's lighting and fog environemnt is
* significantly more complex than the fixed function pipeline can express;
* do not assume that lighting and fog state is a good approximation for 3-d
* drawing. Prefer to use XPLMInstancing to draw objects. All calls to
* XPLMSetGraphicsState should have no fog or lighting.
*
*/
XPLM_API void XPLMSetGraphicsState(
int inEnableFog,
int inNumberTexUnits,
int inEnableLighting,
int inEnableAlphaTesting,
int inEnableAlphaBlending,
int inEnableDepthTesting,
int inEnableDepthWriting);
/*
* XPLMBindTexture2d
*
* XPLMBindTexture2d changes what texture is bound to the 2d texturing
* target. This routine caches the current 2d texture across all texturing
* units in the sim and plug-ins, preventing extraneous binding. For
* example, consider several plug-ins running in series; if they all use the
* 'general interface' bitmap to do UI, calling this function will skip the
* rebinding of the general interface texture on all but the first plug-in,
* which can provide better frame rate son some graphics cards.
*
* inTextureID is the ID of the texture object to bind; inTextureUnit is a
* zero-based texture unit (e.g. 0 for the first one), up to a maximum of 4
* units. (This number may increase in future versions of X-Plane.)
*
* Use this routine instead of glBindTexture(GL_TEXTURE_2D, ....);
*
*/
XPLM_API void XPLMBindTexture2d(
int inTextureNum,
int inTextureUnit);
/*
* XPLMGenerateTextureNumbers
*
* Use this routine instead of glGenTextures to generate new texture object
* IDs. This routine historically ensured that plugins don't use texure IDs
* that X-Plane is reserving for its own use.
*
*/
XPLM_API void XPLMGenerateTextureNumbers(
int * outTextureIDs,
int inCount);
#if defined(XPLM_DEPRECATED)
/*
* XPLMGetTexture
*
* XPLMGetTexture returns the OpenGL texture ID of an X-Plane texture based on
* a generic identifying code. For example, you can get the texture for
* X-Plane's UI bitmaps.
*
*/
XPLM_API int XPLMGetTexture(
XPLMTextureID inTexture);
#endif /* XPLM_DEPRECATED */
/*
* XPLMWorldToLocal
*
* This routine translates coordinates from latitude, longitude, and altitude
* to local scene coordinates. Latitude and longitude are in decimal degrees,
* and altitude is in meters MSL (mean sea level). The XYZ coordinates are in
* meters in the local OpenGL coordinate system.
*
*/
XPLM_API void XPLMWorldToLocal(
double inLatitude,
double inLongitude,
double inAltitude,
double * outX,
double * outY,
double * outZ);
/*
* XPLMLocalToWorld
*
* This routine translates a local coordinate triplet back into latitude,
* longitude, and altitude. Latitude and longitude are in decimal degrees,
* and altitude is in meters MSL (mean sea level). The XYZ coordinates are in
* meters in the local OpenGL coordinate system.
*
* NOTE: world coordinates are less precise than local coordinates; you should
* try to avoid round tripping from local to world and back.
*
*/
XPLM_API void XPLMLocalToWorld(
double inX,
double inY,
double inZ,
double * outLatitude,
double * outLongitude,
double * outAltitude);
/*
* XPLMDrawTranslucentDarkBox
*
* This routine draws a translucent dark box, partially obscuring parts of the
* screen but making text easy to read. This is the same graphics primitive
* used by X-Plane to show text files and ATC info.
*
*/
XPLM_API void XPLMDrawTranslucentDarkBox(
int inLeft,
int inTop,
int inRight,
int inBottom);
/***************************************************************************
* X-PLANE TEXT
***************************************************************************/
/*
* XPLMFontID
*
* X-Plane features some fixed-character fonts. Each font may have its own
* metrics.
*
* WARNING: Some of these fonts are no longer supported or may have changed
* geometries. For maximum copmatibility, see the comments below.
*
* Note: X-Plane 7 supports proportional-spaced fonts. Since no measuring
* routine is available yet, the SDK will normally draw using a fixed-width
* font. You can use a dataref to enable proportional font drawing on XP7 if
* you want to.
*
*/
enum {
/* Mono-spaced font for user interface. Available in all versions of the SDK.*/
xplmFont_Basic = 0,
#if defined(XPLM_DEPRECATED)
/* Deprecated, do not use. */
xplmFont_Menus = 1,
#endif /* XPLM_DEPRECATED */
#if defined(XPLM_DEPRECATED)
/* Deprecated, do not use. */
xplmFont_Metal = 2,
#endif /* XPLM_DEPRECATED */
#if defined(XPLM_DEPRECATED)
/* Deprecated, do not use. */
xplmFont_Led = 3,
#endif /* XPLM_DEPRECATED */
#if defined(XPLM_DEPRECATED)
/* Deprecated, do not use. */
xplmFont_LedWide = 4,
#endif /* XPLM_DEPRECATED */
#if defined(XPLM_DEPRECATED)
/* Deprecated, do not use. */
xplmFont_PanelHUD = 5,
#endif /* XPLM_DEPRECATED */
#if defined(XPLM_DEPRECATED)
/* Deprecated, do not use. */
xplmFont_PanelEFIS = 6,
#endif /* XPLM_DEPRECATED */
#if defined(XPLM_DEPRECATED)
/* Deprecated, do not use. */
xplmFont_PanelGPS = 7,
#endif /* XPLM_DEPRECATED */
#if defined(XPLM_DEPRECATED)
/* Deprecated, do not use. */
xplmFont_RadiosGA = 8,
#endif /* XPLM_DEPRECATED */
#if defined(XPLM_DEPRECATED)
/* Deprecated, do not use. */
xplmFont_RadiosBC = 9,
#endif /* XPLM_DEPRECATED */
#if defined(XPLM_DEPRECATED)
/* Deprecated, do not use. */
xplmFont_RadiosHM = 10,
#endif /* XPLM_DEPRECATED */
#if defined(XPLM_DEPRECATED)
/* Deprecated, do not use. */
xplmFont_RadiosGANarrow = 11,
#endif /* XPLM_DEPRECATED */
#if defined(XPLM_DEPRECATED)
/* Deprecated, do not use. */
xplmFont_RadiosBCNarrow = 12,
#endif /* XPLM_DEPRECATED */
#if defined(XPLM_DEPRECATED)
/* Deprecated, do not use. */
xplmFont_RadiosHMNarrow = 13,
#endif /* XPLM_DEPRECATED */
#if defined(XPLM_DEPRECATED)
/* Deprecated, do not use. */
xplmFont_Timer = 14,
#endif /* XPLM_DEPRECATED */
#if defined(XPLM_DEPRECATED)
/* Deprecated, do not use. */
xplmFont_FullRound = 15,
#endif /* XPLM_DEPRECATED */
#if defined(XPLM_DEPRECATED)
/* Deprecated, do not use. */
xplmFont_SmallRound = 16,
#endif /* XPLM_DEPRECATED */
#if defined(XPLM_DEPRECATED)
/* Deprecated, do not use. */
xplmFont_Menus_Localized = 17,
#endif /* XPLM_DEPRECATED */
#if defined(XPLM200)
/* Proportional UI font. */
xplmFont_Proportional = 18,
#endif /* XPLM200 */
};
typedef int XPLMFontID;
/*
* XPLMDrawString
*
* This routine draws a NULL termianted string in a given font. Pass in the
* lower left pixel that the character is to be drawn onto. Also pass the
* character and font ID. This function returns the x offset plus the width of
* all drawn characters. The color to draw in is specified as a pointer to an
* array of three floating point colors, representing RGB intensities from 0.0
* to 1.0.
*
*/
XPLM_API void XPLMDrawString(
float * inColorRGB,
int inXOffset,
int inYOffset,
char * inChar,
int * inWordWrapWidth, /* Can be NULL */
XPLMFontID inFontID);
/*
* XPLMDrawNumber
*
* This routine draws a number similar to the digit editing fields in
* PlaneMaker and data output display in X-Plane. Pass in a color, a
* position, a floating point value, and formatting info. Specify how many
* integer and how many decimal digits to show and whether to show a sign, as
* well as a character set. This routine returns the xOffset plus width of the
* string drawn.
*
*/
XPLM_API void XPLMDrawNumber(
float * inColorRGB,
int inXOffset,
int inYOffset,
double inValue,
int inDigits,
int inDecimals,
int inShowSign,
XPLMFontID inFontID);
/*
* XPLMGetFontDimensions
*
* This routine returns the width and height of a character in a given font.
* It also tells you if the font only supports numeric digits. Pass NULL if
* you don't need a given field. Note that for a proportional font the width
* will be an arbitrary, hopefully average width.
*
*/
XPLM_API void XPLMGetFontDimensions(
XPLMFontID inFontID,
int * outCharWidth, /* Can be NULL */
int * outCharHeight, /* Can be NULL */
int * outDigitsOnly); /* Can be NULL */
#if defined(XPLM200)
/*
* XPLMMeasureString
*
* This routine returns the width in pixels of a string using a given font.
* The string is passed as a pointer plus length (and does not need to be null
* terminated); this is used to allow for measuring substrings. The return
* value is floating point; it is possible that future font drawing may allow
* for fractional pixels.
*
*/
XPLM_API float XPLMMeasureString(
XPLMFontID inFontID,
const char * inChar,
int inNumChars);
#endif /* XPLM200 */
#ifdef __cplusplus
}
#endif
#endif
+136
View File
@@ -0,0 +1,136 @@
#ifndef _XPLMInstance_h_
#define _XPLMInstance_h_
/*
* Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See
* license.txt for usage. X-Plane SDK Version: 2.1.1
*
*/
/***************************************************************************
* XPLMInstance
***************************************************************************/
/*
* This API provides instanced drawing of X-Plane objects (.obj files). In
* contrast to old drawing APIs, which required you to draw your own objects
* per-frame, the instancing API allows you to simply register an OBJ for
* drawing, then move or manipulate it later (as needed).
*
* This provides one tremendous benefit: it keeps all dataref operations for
* your object in one place. Because datarefs are main thread only, allowing
* dataref access anywhere is a serious performance bottleneck for the
* simulator---the whole simulator has to pause and wait for each dataref
* access. This performance penalty will only grow worse as X-Plane moves
* toward an ever more heavily multithreaded engine.
*
* The instancing API allows X-Plane to isolate all dataref manipulations for
* all plugin object drawing to one place, potentially providing huge
* performance gains.
*
* Here's how it works:
*
* When an instance is created, it provides a list of all datarefs you want to
* manipulate in for the OBJ in the future. This list of datarefs replaces the
* ad-hoc collections of dataref objects previously used by art assets. Then,
* per-frame, you can manipulate the instance by passing in a "block" of
* packed floats representing the current values of the datarefs for your
* instance. (Note that the ordering of this set of packed floats must exactly
* match the ordering of the datarefs when you created your instance.)
*
*/
#include "XPLMDefs.h"
#include "XPLMScenery.h"
#ifdef __cplusplus
extern "C" {
#endif
/***************************************************************************
* Instance Creation and Destruction
***************************************************************************/
/*
* Registers and unregisters instances.
*
*/
/*
* XPLMInstanceRef
*
* An opaque handle to an instance.
*
*/
typedef void * XPLMInstanceRef;
/*
* XPLMCreateInstance
*
* XPLMCreateInstance creates a new instance, managed by your plug-in, and
* returns a handle to the instance. A few important requirements:
*
* * The object passed in must be fully loaded and returned from the XPLM
* before you can create your instance; you cannot pass a null obj ref, nor
* can you change the ref later.
*
* * If you use any custom datarefs in your object, they must be registered
* before the object is loaded. This is true even if their data will be
* provided via the instance dataref list.
*
* * The instance dataref array must be a valid ptr to an array of at least
* one item that is null terminated. That is, if you do not want any
* datarefs, you must passa ptr to an array with a null item. You cannot
* pass null for this.
*
*/
XPLM_API XPLMInstanceRef XPLMCreateInstance(
XPLMObjectRef obj,
const char ** datarefs);
/*
* XPLMDestroyInstance
*
* XPLMDestroyInstance destroys and deallocates your instance; once called,
* you are still responsible for releasing the OBJ ref.
*
* Tip: you can release your OBJ ref after you call XPLMCreateInstance as long
* as you never use it again; the instance will maintain its own reference to
* the OBJ and the object OBJ be deallocated when the instance is destroyed.
*
*/
XPLM_API void XPLMDestroyInstance(
XPLMInstanceRef instance);
/***************************************************************************
* Instance Manipulation
***************************************************************************/
/*
* XPLMInstanceSetPosition
*
* Updates both the position of the instance and all datarefs you registered
* for it. Call this from a flight loop callback or UI callback.
*
* __DO NOT__ call XPLMInstanceSetPosition from a drawing callback; the whole
* point of instancing is that you do not need any drawing callbacks. Setting
* instance data from a drawing callback may have undefined consequences, and
* the drawing callback hurts FPS unnecessarily.
*
* The memory pointed to by the data pointer must be large enough to hold one
* float for every data ref you have registered, and must contain valid
* floating point data.
*
* BUG: before X-Plane 11.50, if you have no dataref registered, you must
* still pass a valid pointer for data and not null.
*
*/
XPLM_API void XPLMInstanceSetPosition(
XPLMInstanceRef instance,
const XPLMDrawInfo_t * new_position,
const float * data);
#ifdef __cplusplus
}
#endif
#endif
+628
View File
@@ -0,0 +1,628 @@
#ifndef _XPLMMap_h_
#define _XPLMMap_h_
/*
* Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See
* license.txt for usage. X-Plane SDK Version: 2.1.1
*
*/
/***************************************************************************
* XPLMMap
***************************************************************************/
/*
* This API allows you to create new layers within X-Plane maps. Your layers
* can draw arbitrary OpenGL, but they conveniently also have access to
* X-Plane's built-in icon and label drawing functions.
*
* As of X-Plane 11, map drawing happens in three stages:
*
* 1. backgrounds and "fill,"
* 2. icons, and
* 3. labels.
*
* Thus, all background drawing gets layered beneath all icons, which likewise
* get layered beneath all labels. Within each stage, the map obeys a
* consistent layer ordering, such that "fill" layers (layers that cover a
* large amount of map area, like the terrain and clouds) appear beneath
* "markings" layers (like airport icons). This ensures that layers with fine
* details don't get obscured by layers with larger details.
*
* The XPLM map API reflects both aspects of this draw layering: you can
* register a layer as providing either markings or fill, and X-Plane will
* draw your fill layers beneath your markings layers (regardless of
* registration order). Likewise, you are guaranteed that your layer's icons
* (added from within an icon callback) will go above your layer's OpenGL
* drawing, and your labels will go above your icons.
*
* The XPLM guarantees that all plugin-created fill layers go on top of all
* native X-Plane fill layers, and all plugin-created markings layers go on
* top of all X-Plane markings layers (with the exception of the aircraft
* icons). It also guarantees that the draw order of your own plugin's layers
* will be consistent. But, for layers created by different plugins, the only
* guarantee is that we will draw all of one plugin's layers of each type
* (fill, then markings), then all of the others'; we don't guarantee which
* plugin's fill and markings layers go on top of the other's.
*
* As of X-Plane 11, maps use true cartographic projections for their drawing,
* and different maps may use different projections. For that reason, all
* drawing calls include an opaque handle for the projection you should use to
* do the drawing. Any time you would draw at a particular latitude/longitude,
* you'll need to ask the projection to translate that position into "map
* coordinates." (Note that the projection is guaranteed not to change between
* calls to your prepare-cache hook, so if you cache your map coordinates
* ahead of time, there's no need to re-project them when you actually draw.)
*
* In addition to mapping normal latitude/longitude locations into map
* coordinates, the projection APIs also let you know the current heading for
* north. (Since X-Plane 11 maps can rotate to match the heading of the user's
* aircraft, it's not safe to assume that north is at zero degrees rotation.)
*
*/
#include "XPLMDefs.h"
#ifdef __cplusplus
extern "C" {
#endif
#if defined(XPLM300)
/***************************************************************************
* DRAWING CALLBACKS
***************************************************************************/
/*
* When you create a new map layer (using XPLMCreateMapLayer), you can provide
* any or all of these callbacks. They allow you to insert your own OpenGL
* drawing, text labels, and icons into the X-Plane map at the appropriate
* places, allowing your layer to behave as similarly to X-Plane's built-in
* layers as possible.
*
*/
/*
* XPLMMapLayerID
*
* This is an opaque handle for a plugin-created map layer. Pass it to the map
* drawing APIs from an appropriate callback to draw in the layer you created.
*
*/
typedef void * XPLMMapLayerID;
/*
* XPLMMapProjectionID
*
* This is an opaque handle for a map projection. Pass it to the projection
* APIs to translate between map coordinates and latitude/longitudes.
*
*/
typedef void * XPLMMapProjectionID;
/*
* XPLMMapStyle
*
* Indicates the visual style being drawn by the map. In X-Plane, the user can
* choose between a number of map types, and different map types may have use
* a different visual representation for the same elements (for instance, the
* visual style of the terrain layer changes drastically between the VFR and
* IFR layers), or certain layers may be disabled entirely in some map types
* (e.g., localizers are only visible in the IFR low-enroute style).
*
*/
enum {
xplm_MapStyle_VFR_Sectional = 0,
xplm_MapStyle_IFR_LowEnroute = 1,
xplm_MapStyle_IFR_HighEnroute = 2,
};
typedef int XPLMMapStyle;
/*
* XPLMMapDrawingCallback_f
*
* This is the OpenGL map drawing callback for plugin-created map layers. You
* can perform arbitrary OpenGL drawing from this callback, with one
* exception: changes to the Z-buffer are not permitted, and will result in
* map drawing errors.
*
* All drawing done from within this callback appears beneath all built-in
* X-Plane icons and labels, but above the built-in "fill" layers (layers
* providing major details, like terrain and water). Note, however, that the
* relative ordering between the drawing callbacks of different plugins is not
* guaranteed.
*
*/
typedef void (* XPLMMapDrawingCallback_f)(
XPLMMapLayerID inLayer,
const float * inMapBoundsLeftTopRightBottom,
float zoomRatio,
float mapUnitsPerUserInterfaceUnit,
XPLMMapStyle mapStyle,
XPLMMapProjectionID projection,
void * inRefcon);
/*
* XPLMMapIconDrawingCallback_f
*
* This is the icon drawing callback that enables plugin-created map layers to
* draw icons using X-Plane's built-in icon drawing functionality. You can
* request an arbitrary number of PNG icons to be drawn via
* XPLMDrawMapIconFromSheet() from within this callback, but you may not
* perform any OpenGL drawing here.
*
* Icons enqueued by this function will appear above all OpenGL drawing
* (performed by your optional XPLMMapDrawingCallback_f), and above all
* built-in X-Plane map icons of the same layer type ("fill" or "markings," as
* determined by the XPLMMapLayerType in your XPLMCreateMapLayer_t). Note,
* however, that the relative ordering between the drawing callbacks of
* different plugins is not guaranteed.
*
*/
typedef void (* XPLMMapIconDrawingCallback_f)(
XPLMMapLayerID inLayer,
const float * inMapBoundsLeftTopRightBottom,
float zoomRatio,
float mapUnitsPerUserInterfaceUnit,
XPLMMapStyle mapStyle,
XPLMMapProjectionID projection,
void * inRefcon);
/*
* XPLMMapLabelDrawingCallback_f
*
* This is the label drawing callback that enables plugin-created map layers
* to draw text labels using X-Plane's built-in labeling functionality. You
* can request an arbitrary number of text labels to be drawn via
* XPLMDrawMapLabel() from within this callback, but you may not perform any
* OpenGL drawing here.
*
* Labels enqueued by this function will appear above all OpenGL drawing
* (performed by your optional XPLMMapDrawingCallback_f), and above all
* built-in map icons and labels of the same layer type ("fill" or "markings,"
* as determined by the XPLMMapLayerType in your XPLMCreateMapLayer_t). Note,
* however, that the relative ordering between the drawing callbacks of
* different plugins is not guaranteed.
*
*/
typedef void (* XPLMMapLabelDrawingCallback_f)(
XPLMMapLayerID inLayer,
const float * inMapBoundsLeftTopRightBottom,
float zoomRatio,
float mapUnitsPerUserInterfaceUnit,
XPLMMapStyle mapStyle,
XPLMMapProjectionID projection,
void * inRefcon);
#endif /* XPLM300 */
#if defined(XPLM300)
/***************************************************************************
* LAYER MANAGEMENT CALLBACKS
***************************************************************************/
/*
* These are various "bookkeeping" callbacks that your map layer can receive
* (if you provide the callback in your XPLMCreateMapLayer_t). They allow you
* to manage the lifecycle of your layer, as well as cache any
* computationally-intensive preparation you might need for drawing.
*
*/
/*
* XPLMMapPrepareCacheCallback_f
*
* A callback used to allow you to cache whatever information your layer needs
* to draw in the current map area.
*
* This is called each time the map's total bounds change. This is typically
* triggered by new DSFs being loaded, such that X-Plane discards old,
* now-distant DSFs and pulls in new ones. At that point, the available bounds
* of the map also change to match the new DSF area.
*
* By caching just the information you need to draw in this area, your future
* draw calls can be made faster, since you'll be able to simply "splat" your
* precomputed information each frame.
*
* We guarantee that the map projection will not change between successive
* prepare cache calls, nor will any draw call give you bounds outside these
* total map bounds. So, if you cache the projected map coordinates of all the
* items you might want to draw in the total map area, you can be guaranteed
* that no draw call will be asked to do any new work.
*
*/
typedef void (* XPLMMapPrepareCacheCallback_f)(
XPLMMapLayerID inLayer,
const float * inTotalMapBoundsLeftTopRightBottom,
XPLMMapProjectionID projection,
void * inRefcon);
/*
* XPLMMapWillBeDeletedCallback_f
*
* Called just before your map layer gets deleted. Because SDK-created map
* layers have the same lifetime as the X-Plane map that contains them, if the
* map gets unloaded from memory, your layer will too.
*
*/
typedef void (* XPLMMapWillBeDeletedCallback_f)(
XPLMMapLayerID inLayer,
void * inRefcon);
#endif /* XPLM300 */
#if defined(XPLM300)
/***************************************************************************
* MAP LAYER CREATION AND DESTRUCTION
***************************************************************************/
/*
* Enables the creation of new map layers. Layers are created for a particular
* instance of the X-Plane map. For instance, if you want your layer to appear
* in both the normal map interface and the Instructor Operator Station (IOS),
* you would need two separate calls to XPLMCreateMapLayer(), with two
* different values for your XPLMCreateMapLayer_t::layer_name.
*
* Your layer's lifetime will be determined by the lifetime of the map it is
* created in. If the map is destroyed (on the X-Plane side), your layer will
* be too, and you'll receive a callback to your
* XPLMMapWillBeDeletedCallback_f.
*
*/
/*
* XPLMMapLayerType
*
* Indicates the type of map layer you are creating. Fill layers will always
* be drawn beneath markings layers.
*
*/
enum {
/* A layer that draws "fill" graphics, like weather patterns, terrain, etc. *
* Fill layers frequently cover a large portion of the visible map area. */
xplm_MapLayer_Fill = 0,
/* A layer that provides markings for particular map features, like NAVAIDs, *
* airports, etc. Even dense markings layers cover a small portion of the *
* total map area. */
xplm_MapLayer_Markings = 1,
};
typedef int XPLMMapLayerType;
/* Globally unique identifier for X-Plane's Map window, used as the *
* mapToCreateLayerIn parameter in XPLMCreateMapLayer_t */
#define XPLM_MAP_USER_INTERFACE "XPLM_MAP_USER_INTERFACE"
/* Globally unique identifier for X-Plane's Instructor Operator Station *
* window, used as the mapToCreateLayerIn parameter in XPLMCreateMapLayer_t */
#define XPLM_MAP_IOS "XPLM_MAP_IOS"
/*
* XPLMCreateMapLayer_t
*
* This structure defines all of the parameters used to create a map layer
* using XPLMCreateMapLayer. The structure will be expanded in future SDK APIs
* to include more features. Always set the structSize member to the size of
* your struct in bytes!
*
* Each layer must be associated with exactly one map instance in X-Plane.
* That map, and that map alone, will call your callbacks. Likewise, when that
* map is deleted, your layer will be as well.
*
*/
typedef struct {
/* Used to inform XPLMCreateMapLayer() of the SDK version you compiled *
* against; should always be set to sizeof(XPLMCreateMapLayer_t) */
int structSize;
/* Globally unique string identifying the map you want this layer to appear *
* in. As of XPLM300, this is limited to one of XPLM_MAP_USER_INTERFACE or *
* XPLM_MAP_IOS */
const char * mapToCreateLayerIn;
/* The type of layer you are creating, used to determine draw order (all *
* plugin-created markings layers are drawn above all plugin-created fill *
* layers) */
XPLMMapLayerType layerType;
/* Optional callback to inform you this layer is being deleted (due to its *
* owning map being destroyed) */
XPLMMapWillBeDeletedCallback_f willBeDeletedCallback;
/* Optional callback you want to use to prepare your draw cache when the map *
* bounds change (set to NULL if you don't want this callback) */
XPLMMapPrepareCacheCallback_f prepCacheCallback;
/* Optional callback you want to use for arbitrary OpenGL drawing, which goes *
* beneath all icons in the map's layering system (set to NULL if you don't *
* want this callback) */
XPLMMapDrawingCallback_f drawCallback;
/* Optional callback you want to use for drawing icons, which go above all *
* built-in X-Plane icons (except the aircraft) in the map's layering system *
* (set to NULL if you don't want this callback) */
XPLMMapIconDrawingCallback_f iconCallback;
/* Optional callback you want to use for drawing map labels, which go above *
* all built-in X-Plane icons and labels (except those of aircraft) in the *
* map's layering system (set to NULL if you don't want this callback) */
XPLMMapLabelDrawingCallback_f labelCallback;
/* True if you want a checkbox to be created in the map UI to toggle this *
* layer on and off; false if the layer should simply always be enabled */
int showUiToggle;
/* Short label to use for this layer in the user interface */
const char * layerName;
/* A reference to arbitrary data that will be passed to your callbacks */
void * refcon;
} XPLMCreateMapLayer_t;
/*
* XPLMCreateMapLayer
*
* This routine creates a new map layer. You pass in an XPLMCreateMapLayer_t
* structure with all of the fields set in. You must set the structSize of
* the structure to the size of the actual structure you used.
*
* Returns NULL if the layer creation failed. This happens most frequently
* because the map you specified in your
* XPLMCreateMapLayer_t::mapToCreateLayerIn field doesn't exist (that is, if
* XPLMMapExists() returns 0 for the specified map). You can use
* XPLMRegisterMapCreationHook() to get a notification each time a new map is
* opened in X-Plane, at which time you can create layers in it.
*
*/
XPLM_API XPLMMapLayerID XPLMCreateMapLayer(
XPLMCreateMapLayer_t * inParams);
/*
* XPLMDestroyMapLayer
*
* Destroys a map layer you created (calling your
* XPLMMapWillBeDeletedCallback_f if applicable). Returns true if a deletion
* took place.
*
*/
XPLM_API int XPLMDestroyMapLayer(
XPLMMapLayerID inLayer);
/*
* XPLMMapCreatedCallback_f
*
* A callback to notify your plugin that a new map has been created in
* X-Plane. This is the best time to add a custom map layer using
* XPLMCreateMapLayer().
*
* No OpenGL drawing is permitted within this callback.
*
*/
typedef void (* XPLMMapCreatedCallback_f)(
const char * mapIdentifier,
void * refcon);
/*
* XPLMRegisterMapCreationHook
*
* Registers your callback to receive a notification each time a new map is
* constructed in X-Plane. This callback is the best time to add your custom
* map layer using XPLMCreateMapLayer().
*
* Note that you will not be notified about any maps that already exist---you
* can use XPLMMapExists() to check for maps that were created previously.
*
*/
XPLM_API void XPLMRegisterMapCreationHook(
XPLMMapCreatedCallback_f callback,
void * refcon);
/*
* XPLMMapExists
*
* Returns 1 if the map with the specified identifier already exists in
* X-Plane. In that case, you can safely call XPLMCreateMapLayer() specifying
* that your layer should be added to that map.
*
*/
XPLM_API int XPLMMapExists(
const char * mapIdentifier);
#endif /* XPLM300 */
#if defined(XPLM300)
/***************************************************************************
* MAP DRAWING
***************************************************************************/
/*
* These APIs are only valid from within a map drawing callback (one of
* XPLMIconDrawingCallback_t or XPLMMapLabelDrawingCallback_f). Your drawing
* callbacks are registered when you create a new map layer as part of your
* XPLMCreateMapLayer_t. The functions here hook into X-Plane's built-in map
* drawing functionality for icons and labels, so that you get a consistent
* style with the rest of the X-Plane map.
*
* Note that the X-Plane 11 map introduces a strict ordering: layers of type
* xplm_MapLayer_Fill get drawn beneath all xplm_MapLayer_Markings layers.
* Likewise, all OpenGL drawing (performed in your layer's
* XPLMMapDrawingCallback_f) will appear beneath any icons and labels you
* draw.
*
*/
/*
* XPLMMapOrientation
*
* Indicates whether a map element should be match its rotation to the map
* itself, or to the user interface. For instance, the map itself may be
* rotated such that "up" matches the user's aircraft, but you may want to
* draw a text label such that it is always rotated zero degrees relative to
* the user's perspective. In that case, you would have it draw with UI
* orientation.
*
*/
enum {
/* Orient such that a 0 degree rotation matches the map's north */
xplm_MapOrientation_Map = 0,
/* Orient such that a 0 degree rotation is "up" relative to the user interface*/
xplm_MapOrientation_UI = 1,
};
typedef int XPLMMapOrientation;
/*
* XPLMDrawMapIconFromSheet
*
* Enables plugin-created map layers to draw PNG icons using X-Plane's
* built-in icon drawing functionality. Only valid from within an
* XPLMIconDrawingCallback_t (but you can request an arbitrary number of icons
* to be drawn from within your callback).
*
* X-Plane will automatically manage the memory for your texture so that it
* only has to be loaded from disk once as long as you continue drawing it
* per-frame. (When you stop drawing it, the memory may purged in a "garbage
* collection" pass, require a load from disk in the future.)
*
* Instead of having X-Plane draw a full PNG, this method allows you to use UV
* coordinates to request a portion of the image to be drawn. This allows you
* to use a single texture load (of an icon sheet, for example) to draw many
* icons. Doing so is much more efficient than drawing a dozen different small
* PNGs.
*
* The UV coordinates used here treat the texture you load as being comprised
* of a number of identically sized "cells." You specify the width and height
* in cells (ds and dt, respectively), as well as the coordinates within the
* cell grid for the sub-image you'd like to draw.
*
* Note that you can use different ds and dt values in subsequent calls with
* the same texture sheet. This enables you to use icons of different sizes in
* the same sheet if you arrange them properly in the PNG.
*
* This function is only valid from within an XPLMIconDrawingCallback_t (but
* you can request an arbitrary number of icons to be drawn from within your
* callback).
*
*/
XPLM_API void XPLMDrawMapIconFromSheet(
XPLMMapLayerID layer,
const char * inPngPath,
int s,
int t,
int ds,
int dt,
float mapX,
float mapY,
XPLMMapOrientation orientation,
float rotationDegrees,
float mapWidth);
/*
* XPLMDrawMapLabel
*
* Enables plugin-created map layers to draw text labels using X-Plane's
* built-in labeling functionality. Only valid from within an
* XPLMMapLabelDrawingCallback_f (but you can request an arbitrary number of
* text labels to be drawn from within your callback).
*
*/
XPLM_API void XPLMDrawMapLabel(
XPLMMapLayerID layer,
const char * inText,
float mapX,
float mapY,
XPLMMapOrientation orientation,
float rotationDegrees);
#endif /* XPLM300 */
#if defined(XPLM300)
/***************************************************************************
* MAP PROJECTIONS
***************************************************************************/
/*
* As of X-Plane 11, the map draws using true cartographic projections, and
* different maps may use different projections. Thus, to draw at a particular
* latitude and longitude, you must first transform your real-world
* coordinates into map coordinates.
*
* The map projection is also responsible for giving you the current scale of
* the map. That is, the projection can tell you how many map units correspond
* to 1 meter at a given point.
*
* Finally, the map projection can give you the current rotation of the map.
* Since X-Plane 11 maps can rotate to match the heading of the aircraft, the
* map's rotation can potentially change every frame.
*
*/
/*
* XPLMMapProject
*
* Projects a latitude/longitude into map coordinates. This is the inverse of
* XPLMMapUnproject().
*
* Only valid from within a map layer callback (one of
* XPLMMapPrepareCacheCallback_f, XPLMMapDrawingCallback_f,
* XPLMMapIconDrawingCallback_f, or XPLMMapLabelDrawingCallback_f.)
*
*/
XPLM_API void XPLMMapProject(
XPLMMapProjectionID projection,
double latitude,
double longitude,
float * outX,
float * outY);
/*
* XPLMMapUnproject
*
* Transforms map coordinates back into a latitude and longitude. This is the
* inverse of XPLMMapProject().
*
* Only valid from within a map layer callback (one of
* XPLMMapPrepareCacheCallback_f, XPLMMapDrawingCallback_f,
* XPLMMapIconDrawingCallback_f, or XPLMMapLabelDrawingCallback_f.)
*
*/
XPLM_API void XPLMMapUnproject(
XPLMMapProjectionID projection,
float mapX,
float mapY,
double * outLatitude,
double * outLongitude);
/*
* XPLMMapScaleMeter
*
* Returns the number of map units that correspond to a distance of one meter
* at a given set of map coordinates.
*
* Only valid from within a map layer callback (one of
* XPLMMapPrepareCacheCallback_f, XPLMMapDrawingCallback_f,
* XPLMMapIconDrawingCallback_f, or XPLMMapLabelDrawingCallback_f.)
*
*/
XPLM_API float XPLMMapScaleMeter(
XPLMMapProjectionID projection,
float mapX,
float mapY);
/*
* XPLMMapGetNorthHeading
*
* Returns the heading (in degrees clockwise) from the positive Y axis in the
* cartesian mapping coordinate system to true north at the point passed in.
* You can use it as a clockwise rotational offset to align icons and other
* 2-d drawing with true north on the map, compensating for rotations in the
* map due to projection.
*
* Only valid from within a map layer callback (one of
* XPLMMapPrepareCacheCallback_f, XPLMMapDrawingCallback_f,
* XPLMMapIconDrawingCallback_f, or XPLMMapLabelDrawingCallback_f.)
*
*/
XPLM_API float XPLMMapGetNorthHeading(
XPLMMapProjectionID projection,
float mapX,
float mapY);
#endif /* XPLM300 */
#ifdef __cplusplus
}
#endif
#endif
+290
View File
@@ -0,0 +1,290 @@
#ifndef _XPLMMenus_h_
#define _XPLMMenus_h_
/*
* Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See
* license.txt for usage. X-Plane SDK Version: 2.1.1
*
*/
/***************************************************************************
* XPLMMenus
***************************************************************************/
/*
* Plug-ins can create menus in the menu bar of X-Plane. This is done by
* creating a menu and then creating items. Menus are referred to by an
* opaque ID. Items are referred to by (zero-based) index number.
*
* Menus are "sandboxed" between plugins---no plugin can access the menus of
* any other plugin. Furthermore, all menu indices are relative to your
* plugin's menus only; if your plugin creates two sub-menus in the Plugins
* menu at different times, it doesn't matter how many other plugins also
* create sub-menus of Plugins in the intervening time: your sub-menus will be
* given menu indices 0 and 1. (The SDK does some work in the back-end to
* filter out menus that are irrelevant to your plugin in order to deliver
* this consistency for each plugin.)
*
* When you create a menu item, you specify how we should handle clicks on
* that menu item. You can either have the XPLM trigger a callback (the
* XPLMMenuHandler_f associated with the menu that contains the item), or you
* can simply have a command be triggered (with no associated call to your
* menu handler). The advantage of the latter method is that X-Plane will
* display any keyboard shortcuts associated with the command. (In contrast,
* there are no keyboard shortcuts associated with menu handler callbacks with
* specific parameters.)
*
* Menu text in X-Plane is UTF8; X-Plane's character set covers latin, greek
* and cyrillic characters, Katakana, as well as some Japanese symbols. Some
* APIs have a inDeprecatedAndIgnored parameter that used to select a
* character set; since X-Plane 9 all localization is done via UTF-8 only.
*
*/
#include "XPLMDefs.h"
#include "XPLMUtilities.h"
#ifdef __cplusplus
extern "C" {
#endif
/***************************************************************************
* XPLM MENUS
***************************************************************************/
/*
* XPLMMenuCheck
*
* These enumerations define the various 'check' states for an X-Plane menu.
* 'checking' in X-Plane actually appears as a light which may or may not be
* lit. So there are three possible states.
*
*/
enum {
/* there is no symbol to the left of the menu item. */
xplm_Menu_NoCheck = 0,
/* the menu has a mark next to it that is unmarked (not lit). */
xplm_Menu_Unchecked = 1,
/* the menu has a mark next to it that is checked (lit). */
xplm_Menu_Checked = 2,
};
typedef int XPLMMenuCheck;
/*
* XPLMMenuID
*
* This is a unique ID for each menu you create.
*
*/
typedef void * XPLMMenuID;
/*
* XPLMMenuHandler_f
*
* A menu handler function takes two reference pointers, one for the menu
* (specified when the menu was created) and one for the item (specified when
* the item was created).
*
*/
typedef void (* XPLMMenuHandler_f)(
void * inMenuRef,
void * inItemRef);
/*
* XPLMFindPluginsMenu
*
* This function returns the ID of the plug-ins menu, which is created for you
* at startup.
*
*/
XPLM_API XPLMMenuID XPLMFindPluginsMenu(void);
#if defined(XPLM300)
/*
* XPLMFindAircraftMenu
*
* This function returns the ID of the menu for the currently-loaded aircraft,
* used for showing aircraft-specific commands.
*
* The aircraft menu is created by X-Plane at startup, but it remains hidden
* until it is populated via XPLMAppendMenuItem() or
* XPLMAppendMenuItemWithCommand().
*
* Only plugins loaded with the user's current aircraft are allowed to access
* the aircraft menu. For all other plugins, this will return NULL, and any
* attempts to add menu items to it will fail.
*
*/
XPLM_API XPLMMenuID XPLMFindAircraftMenu(void);
#endif /* XPLM300 */
/*
* XPLMCreateMenu
*
* This function creates a new menu and returns its ID. It returns NULL if
* the menu cannot be created. Pass in a parent menu ID and an item index to
* create a submenu, or NULL for the parent menu to put the menu in the menu
* bar. The menu's name is only used if the menu is in the menubar. You also
* pass a handler function and a menu reference value. Pass NULL for the
* handler if you do not need callbacks from the menu (for example, if it only
* contains submenus).
*
* Important: you must pass a valid, non-empty menu title even if the menu is
* a submenu where the title is not visible.
*
*/
XPLM_API XPLMMenuID XPLMCreateMenu(
const char * inName,
XPLMMenuID inParentMenu,
int inParentItem,
XPLMMenuHandler_f inHandler,
void * inMenuRef);
/*
* XPLMDestroyMenu
*
* This function destroys a menu that you have created. Use this to remove a
* submenu if necessary. (Normally this function will not be necessary.)
*
*/
XPLM_API void XPLMDestroyMenu(
XPLMMenuID inMenuID);
/*
* XPLMClearAllMenuItems
*
* This function removes all menu items from a menu, allowing you to rebuild
* it. Use this function if you need to change the number of items on a menu.
*
*/
XPLM_API void XPLMClearAllMenuItems(
XPLMMenuID inMenuID);
/*
* XPLMAppendMenuItem
*
* This routine appends a new menu item to the bottom of a menu and returns
* its index. Pass in the menu to add the item to, the items name, and a void
* * ref for this item.
*
* Returns a negative index if the append failed (due to an invalid parent
* menu argument).
*
* Note that all menu indices returned are relative to your plugin's menus
* only; if your plugin creates two sub-menus in the Plugins menu at different
* times, it doesn't matter how many other plugins also create sub-menus of
* Plugins in the intervening time: your sub-menus will be given menu indices
* 0 and 1. (The SDK does some work in the back-end to filter out menus that
* are irrelevant to your plugin in order to deliver this consistency for each
* plugin.)
*
*/
XPLM_API int XPLMAppendMenuItem(
XPLMMenuID inMenu,
const char * inItemName,
void * inItemRef,
int inDeprecatedAndIgnored);
#if defined(XPLM300)
/*
* XPLMAppendMenuItemWithCommand
*
* Like XPLMAppendMenuItem(), but instead of the new menu item triggering the
* XPLMMenuHandler_f of the containiner menu, it will simply execute the
* command you pass in. Using a command for your menu item allows the user to
* bind a keyboard shortcut to the command and see that shortcut represented
* in the menu.
*
* Returns a negative index if the append failed (due to an invalid parent
* menu argument).
*
* Like XPLMAppendMenuItem(), all menu indices are relative to your plugin's
* menus only.
*
*/
XPLM_API int XPLMAppendMenuItemWithCommand(
XPLMMenuID inMenu,
const char * inItemName,
XPLMCommandRef inCommandToExecute);
#endif /* XPLM300 */
/*
* XPLMAppendMenuSeparator
*
* This routine adds a separator to the end of a menu.
*
* Returns a negative index if the append failed (due to an invalid parent
* menu argument).
*
*/
XPLM_API void XPLMAppendMenuSeparator(
XPLMMenuID inMenu);
/*
* XPLMSetMenuItemName
*
* This routine changes the name of an existing menu item. Pass in the menu
* ID and the index of the menu item.
*
*/
XPLM_API void XPLMSetMenuItemName(
XPLMMenuID inMenu,
int inIndex,
const char * inItemName,
int inDeprecatedAndIgnored);
/*
* XPLMCheckMenuItem
*
* Set whether a menu item is checked. Pass in the menu ID and item index.
*
*/
XPLM_API void XPLMCheckMenuItem(
XPLMMenuID inMenu,
int index,
XPLMMenuCheck inCheck);
/*
* XPLMCheckMenuItemState
*
* This routine returns whether a menu item is checked or not. A menu item's
* check mark may be on or off, or a menu may not have an icon at all.
*
*/
XPLM_API void XPLMCheckMenuItemState(
XPLMMenuID inMenu,
int index,
XPLMMenuCheck * outCheck);
/*
* XPLMEnableMenuItem
*
* Sets whether this menu item is enabled. Items start out enabled.
*
*/
XPLM_API void XPLMEnableMenuItem(
XPLMMenuID inMenu,
int index,
int enabled);
#if defined(XPLM210)
/*
* XPLMRemoveMenuItem
*
* Removes one item from a menu. Note that all menu items below are moved up
* one; your plugin must track the change in index numbers.
*
*/
XPLM_API void XPLMRemoveMenuItem(
XPLMMenuID inMenu,
int inIndex);
#endif /* XPLM210 */
#ifdef __cplusplus
}
#endif
#endif
+362
View File
@@ -0,0 +1,362 @@
#ifndef _XPLMNavigation_h_
#define _XPLMNavigation_h_
/*
* Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See
* license.txt for usage. X-Plane SDK Version: 2.1.1
*
*/
/***************************************************************************
* XPLMNavigation
***************************************************************************/
/*
* The XPLM Navigation APIs give you some access to the navigation databases
* inside X-Plane. X-Plane stores all navigation information in RAM, so by
* using these APIs you can gain access to most information without having to
* go to disk or parse the files yourself.
*
* You can also use this API to program the FMS. You must use the navigation
* APIs to find the nav-aids you want to program into the FMS, since the FMS
* is powered internally by X-Plane's navigation database.
*
*/
#include "XPLMDefs.h"
#ifdef __cplusplus
extern "C" {
#endif
/***************************************************************************
* NAVIGATION DATABASE ACCESS
***************************************************************************/
/*
* XPLMNavType
*
* These enumerations define the different types of navaids. They are each
* defined with a separate bit so that they may be bit-wise added together to
* form sets of nav-aid types.
*
* NOTE: xplm_Nav_LatLon is a specific lat-lon coordinate entered into the
* FMS. It will not exist in the database, and cannot be programmed into the
* FMS. Querying the FMS for navaids will return it. Use
* XPLMSetFMSEntryLatLon to set a lat/lon waypoint.
*
*/
enum {
xplm_Nav_Unknown = 0,
xplm_Nav_Airport = 1,
xplm_Nav_NDB = 2,
xplm_Nav_VOR = 4,
xplm_Nav_ILS = 8,
xplm_Nav_Localizer = 16,
xplm_Nav_GlideSlope = 32,
xplm_Nav_OuterMarker = 64,
xplm_Nav_MiddleMarker = 128,
xplm_Nav_InnerMarker = 256,
xplm_Nav_Fix = 512,
xplm_Nav_DME = 1024,
xplm_Nav_LatLon = 2048,
};
typedef int XPLMNavType;
/*
* XPLMNavRef
*
* XPLMNavRef is an iterator into the navigation database. The navigation
* database is essentially an array, but it is not necessarily densely
* populated. The only assumption you can safely make is that like-typed
* nav-aids are grouped together.
*
* Use XPLMNavRef to refer to a nav-aid.
*
* XPLM_NAV_NOT_FOUND is returned by functions that return an XPLMNavRef when
* the iterator must be invalid.
*
*/
typedef int XPLMNavRef;
#define XPLM_NAV_NOT_FOUND -1
/*
* XPLMGetFirstNavAid
*
* This returns the very first navaid in the database. Use this to traverse
* the entire database. Returns XPLM_NAV_NOT_FOUND if the nav database is
* empty.
*
*/
XPLM_API XPLMNavRef XPLMGetFirstNavAid(void);
/*
* XPLMGetNextNavAid
*
* Given a valid nav aid ref, this routine returns the next navaid. It
* returns XPLM_NAV_NOT_FOUND if the nav aid passed in was invalid or if the
* navaid passed in was the last one in the database. Use this routine to
* iterate across all like-typed navaids or the entire database.
*
*/
XPLM_API XPLMNavRef XPLMGetNextNavAid(
XPLMNavRef inNavAidRef);
/*
* XPLMFindFirstNavAidOfType
*
* This routine returns the ref of the first navaid of the given type in the
* database or XPLM_NAV_NOT_FOUND if there are no navaids of that type in the
* database. You must pass exactly one nav aid type to this routine.
*
*/
XPLM_API XPLMNavRef XPLMFindFirstNavAidOfType(
XPLMNavType inType);
/*
* XPLMFindLastNavAidOfType
*
* This routine returns the ref of the last navaid of the given type in the
* database or XPLM_NAV_NOT_FOUND if there are no navaids of that type in the
* database. You must pass exactly one nav aid type to this routine.
*
*/
XPLM_API XPLMNavRef XPLMFindLastNavAidOfType(
XPLMNavType inType);
/*
* XPLMFindNavAid
*
* This routine provides a number of searching capabilities for the nav
* database. XPLMFindNavAid will search through every nav aid whose type is
* within inType (multiple types may be added together) and return any
* nav-aids found based on the following rules:
*
* * If inLat and inLon are not NULL, the navaid nearest to that lat/lon will
* be returned, otherwise the last navaid found will be returned.
*
* * If inFrequency is not NULL, then any navaids considered must match this
* frequency. Note that this will screen out radio beacons that do not have
* frequency data published (like inner markers) but not fixes and airports.
*
* * If inNameFragment is not NULL, only navaids that contain the fragment in
* their name will be returned.
*
* * If inIDFragment is not NULL, only navaids that contain the fragment in
* their IDs will be returned.
*
* This routine provides a simple way to do a number of useful searches:
* * Find the nearest navaid on this frequency.
* * Find the nearest airport.
* * Find the VOR whose ID is "KBOS".
* * Find the nearest airport whose name contains "Chicago".
*
*/
XPLM_API XPLMNavRef XPLMFindNavAid(
const char * inNameFragment, /* Can be NULL */
const char * inIDFragment, /* Can be NULL */
float * inLat, /* Can be NULL */
float * inLon, /* Can be NULL */
int * inFrequency, /* Can be NULL */
XPLMNavType inType);
/*
* XPLMGetNavAidInfo
*
* This routine returns information about a navaid. Any non-null field is
* filled out with information if it is available.
*
* Frequencies are in the nav.dat convention as described in the X-Plane nav
* database FAQ: NDB frequencies are exact, all others are multiplied by 100.
*
* The buffer for IDs should be at least 6 chars and the buffer for names
* should be at least 41 chars, but since these values are likely to go up, I
* recommend passing at least 32 chars for IDs and 256 chars for names when
* possible.
*
* The outReg parameter tells if the navaid is within the local "region" of
* loaded DSFs. (This information may not be particularly useful to plugins.)
* The parameter is a single byte value 1 for true or 0 for false, not a C
* string.
*
*/
XPLM_API void XPLMGetNavAidInfo(
XPLMNavRef inRef,
XPLMNavType * outType, /* Can be NULL */
float * outLatitude, /* Can be NULL */
float * outLongitude, /* Can be NULL */
float * outHeight, /* Can be NULL */
int * outFrequency, /* Can be NULL */
float * outHeading, /* Can be NULL */
char * outID, /* Can be NULL */
char * outName, /* Can be NULL */
char * outReg); /* Can be NULL */
/***************************************************************************
* FLIGHT MANAGEMENT COMPUTER
***************************************************************************/
/*
* Note: the FMS works based on an array of entries. Indices into the array
* are zero-based. Each entry is a nav-aid plus an altitude. The FMS tracks
* the currently displayed entry and the entry that it is flying to.
*
* The FMS must be programmed with contiguous entries, so clearing an entry at
* the end shortens the effective flight plan. There is a max of 100
* waypoints in the flight plan.
*
*/
/*
* XPLMCountFMSEntries
*
* This routine returns the number of entries in the FMS.
*
*/
XPLM_API int XPLMCountFMSEntries(void);
/*
* XPLMGetDisplayedFMSEntry
*
* This routine returns the index of the entry the pilot is viewing.
*
*/
XPLM_API int XPLMGetDisplayedFMSEntry(void);
/*
* XPLMGetDestinationFMSEntry
*
* This routine returns the index of the entry the FMS is flying to.
*
*/
XPLM_API int XPLMGetDestinationFMSEntry(void);
/*
* XPLMSetDisplayedFMSEntry
*
* This routine changes which entry the FMS is showing to the index specified.
*
*/
XPLM_API void XPLMSetDisplayedFMSEntry(
int inIndex);
/*
* XPLMSetDestinationFMSEntry
*
* This routine changes which entry the FMS is flying the aircraft toward.
*
*/
XPLM_API void XPLMSetDestinationFMSEntry(
int inIndex);
/*
* XPLMGetFMSEntryInfo
*
* This routine returns information about a given FMS entry. If the entry is
* an airport or navaid, a reference to a nav entry can be returned allowing
* you to find additional information (such as a frequency, ILS heading, name,
* etc.). Note that this reference can be XPLM_NAV_NOT_FOUND until the
* information has been looked up asynchronously, so after flightplan changes,
* it might take up to a second for this field to become populated. The other
* information is available immediately. For a lat/lon entry, the lat/lon is
* returned by this routine but the navaid cannot be looked up (and the
* reference will be XPLM_NAV_NOT_FOUND). FMS name entry buffers should be at
* least 256 chars in length.
*
* WARNING: Due to a bug in X-Plane prior to 11.31, the navaid reference will
* not be set to XPLM_NAV_NOT_FOUND while no data is available, and instead
* just remain the value of the variable that you passed the pointer to.
* Therefore, always initialize the variable to XPLM_NAV_NOT_FOUND before
* passing the pointer to this function.
*
*/
XPLM_API void XPLMGetFMSEntryInfo(
int inIndex,
XPLMNavType * outType, /* Can be NULL */
char * outID, /* Can be NULL */
XPLMNavRef * outRef, /* Can be NULL */
int * outAltitude, /* Can be NULL */
float * outLat, /* Can be NULL */
float * outLon); /* Can be NULL */
/*
* XPLMSetFMSEntryInfo
*
* This routine changes an entry in the FMS to have the destination navaid
* passed in and the altitude specified. Use this only for airports, fixes,
* and radio-beacon navaids. Currently of radio beacons, the FMS can only
* support VORs and NDBs. Use the routines below to clear or fly to a lat/lon.
*
*/
XPLM_API void XPLMSetFMSEntryInfo(
int inIndex,
XPLMNavRef inRef,
int inAltitude);
/*
* XPLMSetFMSEntryLatLon
*
* This routine changes the entry in the FMS to a lat/lon entry with the given
* coordinates.
*
*/
XPLM_API void XPLMSetFMSEntryLatLon(
int inIndex,
float inLat,
float inLon,
int inAltitude);
/*
* XPLMClearFMSEntry
*
* This routine clears the given entry, potentially shortening the flight
* plan.
*
*/
XPLM_API void XPLMClearFMSEntry(
int inIndex);
/***************************************************************************
* GPS RECEIVER
***************************************************************************/
/*
* These APIs let you read data from the GPS unit.
*
*/
/*
* XPLMGetGPSDestinationType
*
* This routine returns the type of the currently selected GPS destination,
* one of fix, airport, VOR or NDB.
*
*/
XPLM_API XPLMNavType XPLMGetGPSDestinationType(void);
/*
* XPLMGetGPSDestination
*
* This routine returns the current GPS destination.
*
*/
XPLM_API XPLMNavRef XPLMGetGPSDestination(void);
#ifdef __cplusplus
}
#endif
#endif
+287
View File
@@ -0,0 +1,287 @@
#ifndef _XPLMPlanes_h_
#define _XPLMPlanes_h_
/*
* Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See
* license.txt for usage. X-Plane SDK Version: 2.1.1
*
*/
/***************************************************************************
* XPLMPlanes
***************************************************************************/
/*
* The XPLMPlanes APIs allow you to control the various aircraft in X-Plane,
* both the user's and the sim's.
*
* *Note*: unlike almost all other APIs in the SDK, aircraft paths are _full_
* file system paths for historical reasons. You'll need to prefix all
* relative paths with the X-Plane path as accessed via XPLMGetSystemPath.
*
*/
#include "XPLMDefs.h"
#ifdef __cplusplus
extern "C" {
#endif
/***************************************************************************
* USER AIRCRAFT ACCESS
***************************************************************************/
/*
* XPLMSetUsersAircraft
*
* This routine changes the user's aircraft. Note that this will reinitialize
* the user to be on the nearest airport's first runway. Pass in a full path
* (hard drive and everything including the .acf extension) to the .acf file.
*
*/
XPLM_API void XPLMSetUsersAircraft(
const char * inAircraftPath);
/*
* XPLMPlaceUserAtAirport
*
* This routine places the user at a given airport. Specify the airport by
* its X-Plane airport ID (e.g. 'KBOS').
*
*/
XPLM_API void XPLMPlaceUserAtAirport(
const char * inAirportCode);
#if defined(XPLM300)
/*
* XPLMPlaceUserAtLocation
*
* Places the user at a specific location after performing any necessary
* scenery loads.
*
* As with in-air starts initiated from the X-Plane user interface, the
* aircraft will always start with its engines running, regardless of the
* user's preferences (i.e., regardless of what the dataref
* `sim/operation/prefs/startup_running` says).
*
*/
XPLM_API void XPLMPlaceUserAtLocation(
double latitudeDegrees,
double longitudeDegrees,
float elevationMetersMSL,
float headingDegreesTrue,
float speedMetersPerSecond);
#endif /* XPLM300 */
/***************************************************************************
* GLOBAL AIRCRAFT ACCESS
***************************************************************************/
/* The user's aircraft is always index 0. */
#define XPLM_USER_AIRCRAFT 0
#if defined(XPLM_DEPRECATED)
/*
* XPLMPlaneDrawState_t
*
* This structure contains additional plane parameter info to be passed to
* draw plane. Make sure to fill in the size of the structure field with
* sizeof(XPLMDrawPlaneState_t) so that the XPLM can tell how many fields you
* knew about when compiling your plugin (since more fields may be added
* later).
*
* Most of these fields are ratios from 0 to 1 for control input. X-Plane
* calculates what the actual controls look like based on the .acf file for
* that airplane. Note for the yoke inputs, this is what the pilot of the
* plane has commanded (post artificial stability system if there were one)
* and affects aelerons, rudder, etc. It is not necessarily related to the
* actual position of the plane!
*
*/
typedef struct {
/* The size of the draw state struct. */
int structSize;
/* A ratio from [0..1] describing how far the landing gear is extended. */
float gearPosition;
/* Ratio of flap deployment, 0 = up, 1 = full deploy. */
float flapRatio;
/* Ratio of spoiler deployment, 0 = none, 1 = full deploy. */
float spoilerRatio;
/* Ratio of speed brake deployment, 0 = none, 1 = full deploy. */
float speedBrakeRatio;
/* Ratio of slat deployment, 0 = none, 1 = full deploy. */
float slatRatio;
/* Wing sweep ratio, 0 = forward, 1 = swept. */
float wingSweep;
/* Thrust power, 0 = none, 1 = full fwd, -1 = full reverse. */
float thrust;
/* Total pitch input for this plane. */
float yokePitch;
/* Total Heading input for this plane. */
float yokeHeading;
/* Total Roll input for this plane. */
float yokeRoll;
} XPLMPlaneDrawState_t;
#endif /* XPLM_DEPRECATED */
/*
* XPLMCountAircraft
*
* This function returns the number of aircraft X-Plane is capable of having,
* as well as the number of aircraft that are currently active. These numbers
* count the user's aircraft. It can also return the plugin that is currently
* controlling aircraft. In X-Plane 7, this routine reflects the number of
* aircraft the user has enabled in the rendering options window.
*
*/
XPLM_API void XPLMCountAircraft(
int * outTotalAircraft,
int * outActiveAircraft,
XPLMPluginID * outController);
/*
* XPLMGetNthAircraftModel
*
* This function returns the aircraft model for the Nth aircraft. Indices are
* zero based, with zero being the user's aircraft. The file name should be
* at least 256 chars in length; the path should be at least 512 chars in
* length.
*
*/
XPLM_API void XPLMGetNthAircraftModel(
int inIndex,
char * outFileName,
char * outPath);
/***************************************************************************
* EXCLUSIVE AIRCRAFT ACCESS
***************************************************************************/
/*
* The following routines require exclusive access to the airplane APIs. Only
* one plugin may have this access at a time.
*
*/
/*
* XPLMPlanesAvailable_f
*
* Your airplanes available callback is called when another plugin gives up
* access to the multiplayer planes. Use this to wait for access to
* multiplayer.
*
*/
typedef void (* XPLMPlanesAvailable_f)(
void * inRefcon);
/*
* XPLMAcquirePlanes
*
* XPLMAcquirePlanes grants your plugin exclusive access to the aircraft. It
* returns 1 if you gain access, 0 if you do not.
*
* inAircraft - pass in an array of pointers to strings specifying the planes
* you want loaded. For any plane index you do not want loaded, pass a
* 0-length string. Other strings should be full paths with the .acf
* extension. NULL terminates this array, or pass NULL if there are no planes
* you want loaded.
*
* If you pass in a callback and do not receive access to the planes your
* callback will be called when the airplanes are available. If you do receive
* airplane access, your callback will not be called.
*
*/
XPLM_API int XPLMAcquirePlanes(
char ** inAircraft, /* Can be NULL */
XPLMPlanesAvailable_f inCallback,
void * inRefcon);
/*
* XPLMReleasePlanes
*
* Call this function to release access to the planes. Note that if you are
* disabled, access to planes is released for you and you must reacquire it.
*
*/
XPLM_API void XPLMReleasePlanes(void);
/*
* XPLMSetActiveAircraftCount
*
* This routine sets the number of active planes. If you pass in a number
* higher than the total number of planes availables, only the total number of
* planes available is actually used.
*
*/
XPLM_API void XPLMSetActiveAircraftCount(
int inCount);
/*
* XPLMSetAircraftModel
*
* This routine loads an aircraft model. It may only be called if you have
* exclusive access to the airplane APIs. Pass in the path of the model with
* the .acf extension. The index is zero based, but you may not pass in 0
* (use XPLMSetUsersAircraft to load the user's aircracft).
*
*/
XPLM_API void XPLMSetAircraftModel(
int inIndex,
const char * inAircraftPath);
/*
* XPLMDisableAIForPlane
*
* This routine turns off X-Plane's AI for a given plane. The plane will
* continue to draw and be a real plane in X-Plane, but will not move itself.
*
*/
XPLM_API void XPLMDisableAIForPlane(
int inPlaneIndex);
#if defined(XPLM_DEPRECATED)
/*
* XPLMDrawAircraft
*
* WARNING: Aircraft drawing via this API is deprecated and will not work in
* future versions of X-Plane. Use XPLMInstance for 3-d drawing of custom
* aircraft models.
*
* This routine draws an aircraft. It can only be called from a 3-d drawing
* callback. Pass in the position of the plane in OpenGL local coordinates
* and the orientation of the plane. A 1 for full drawing indicates that the
* whole plane must be drawn; a 0 indicates you only need the nav lights
* drawn. (This saves rendering time when planes are far away.)
*
*/
XPLM_API void XPLMDrawAircraft(
int inPlaneIndex,
float inX,
float inY,
float inZ,
float inPitch,
float inRoll,
float inYaw,
int inFullDraw,
XPLMPlaneDrawState_t * inDrawStateInfo);
#endif /* XPLM_DEPRECATED */
#if defined(XPLM_DEPRECATED)
/*
* XPLMReinitUsersPlane
*
* WARNING: DO NOT USE. Use XPLMPlaceUserAtAirport or
* XPLMPlaceUserAtLocation.
*
* This function recomputes the derived flight model data from the aircraft
* structure in memory. If you have used the data access layer to modify the
* aircraft structure, use this routine to resynchronize X-Plane; since
* X-Plane works at least partly from derived values, the sim will not behave
* properly until this is called.
*
* WARNING: this routine does not necessarily place the airplane at the
* airport; use XPLMSetUsersAircraft to be compatible. This routine is
* provided to do special experimentation with flight models without resetting
* flight.
*
*/
XPLM_API void XPLMReinitUsersPlane(void);
#endif /* XPLM_DEPRECATED */
#ifdef __cplusplus
}
#endif
#endif
+422
View File
@@ -0,0 +1,422 @@
#ifndef _XPLMPlugin_h_
#define _XPLMPlugin_h_
/*
* Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See
* license.txt for usage. X-Plane SDK Version: 2.1.1
*
*/
/***************************************************************************
* XPLMPlugin
***************************************************************************/
/*
* These APIs provide facilities to find and work with other plugins and
* manage other plugins.
*
*/
#include "XPLMDefs.h"
#ifdef __cplusplus
extern "C" {
#endif
/***************************************************************************
* FINDING PLUGINS
***************************************************************************/
/*
* These APIs allow you to find another plugin or yourself, or iterate across
* all plugins. For example, if you wrote an FMS plugin that needed to talk
* to an autopilot plugin, you could use these APIs to locate the autopilot
* plugin.
*
*/
/*
* XPLMGetMyID
*
* This routine returns the plugin ID of the calling plug-in. Call this to
* get your own ID.
*
*/
XPLM_API XPLMPluginID XPLMGetMyID(void);
/*
* XPLMCountPlugins
*
* This routine returns the total number of plug-ins that are loaded, both
* disabled and enabled.
*
*/
XPLM_API int XPLMCountPlugins(void);
/*
* XPLMGetNthPlugin
*
* This routine returns the ID of a plug-in by index. Index is 0 based from 0
* to XPLMCountPlugins-1, inclusive. Plugins may be returned in any arbitrary
* order.
*
*/
XPLM_API XPLMPluginID XPLMGetNthPlugin(
int inIndex);
/*
* XPLMFindPluginByPath
*
* This routine returns the plug-in ID of the plug-in whose file exists at the
* passed in absolute file system path. XPLM_NO_PLUGIN_ID is returned if the
* path does not point to a currently loaded plug-in.
*
*/
XPLM_API XPLMPluginID XPLMFindPluginByPath(
const char * inPath);
/*
* XPLMFindPluginBySignature
*
* This routine returns the plug-in ID of the plug-in whose signature matches
* what is passed in or XPLM_NO_PLUGIN_ID if no running plug-in has this
* signature. Signatures are the best way to identify another plug-in as they
* are independent of the file system path of a plug-in or the human-readable
* plug-in name, and should be unique for all plug-ins. Use this routine to
* locate another plugin that your plugin interoperates with
*
*/
XPLM_API XPLMPluginID XPLMFindPluginBySignature(
const char * inSignature);
/*
* XPLMGetPluginInfo
*
* This routine returns information about a plug-in. Each parameter should be
* a pointer to a buffer of at least
* 256 characters, or NULL to not receive the information.
*
* outName - the human-readable name of the plug-in. outFilePath - the
* absolute file path to the file that contains this plug-in. outSignature - a
* unique string that identifies this plug-in. outDescription - a
* human-readable description of this plug-in.
*
*/
XPLM_API void XPLMGetPluginInfo(
XPLMPluginID inPlugin,
char * outName, /* Can be NULL */
char * outFilePath, /* Can be NULL */
char * outSignature, /* Can be NULL */
char * outDescription); /* Can be NULL */
/***************************************************************************
* ENABLING/DISABLING PLUG-INS
***************************************************************************/
/*
* These routines are used to work with plug-ins and manage them. Most
* plugins will not need to use these APIs.
*
*/
/*
* XPLMIsPluginEnabled
*
* Returns whether the specified plug-in is enabled for running.
*
*/
XPLM_API int XPLMIsPluginEnabled(
XPLMPluginID inPluginID);
/*
* XPLMEnablePlugin
*
* This routine enables a plug-in if it is not already enabled. It returns 1
* if the plugin was enabled or successfully enables itself, 0 if it does not.
* Plugins may fail to enable (for example, if resources cannot be acquired)
* by returning 0 from their XPluginEnable callback.
*
*/
XPLM_API int XPLMEnablePlugin(
XPLMPluginID inPluginID);
/*
* XPLMDisablePlugin
*
* This routine disableds an enabled plug-in.
*
*/
XPLM_API void XPLMDisablePlugin(
XPLMPluginID inPluginID);
/*
* XPLMReloadPlugins
*
* This routine reloads all plug-ins. Once this routine is called and you
* return from the callback you were within (e.g. a menu select callback) you
* will receive your XPluginDisable and XPluginStop callbacks and your DLL
* will be unloaded, then the start process happens as if the sim was starting
* up.
*
*/
XPLM_API void XPLMReloadPlugins(void);
/***************************************************************************
* INTERPLUGIN MESSAGING
***************************************************************************/
/*
* Plugin messages are defined as 32-bit integers. Messages below 0x00FFFFFF
* are reserved for X-Plane and the plugin SDK.
*
* Messages come with a pointer parameter; the meaning of this pointer depends
* on the message itself. In some messages, the pointer parameter contains an
* actual typed pointer to data that can be inspected in the plugin; in these
* cases the documentation will state that the parameter "points to"
* information.
*
* in other cases, the value of the pointer is actually an integral number
* stuffed into the pointer's storage. In these second cases, the pointer
* parameter needs to be cast, not dereferenced. In these caess, the
* documentation will state that the parameter "contains" a value, which will
* always be an integral type.
*
* Some messages don't use the pointer parameter - in this case your plugin
* should ignore it.
*
* Messages have two conceptual uses: notifications and commands. Commands
* are sent from one plugin to another to induce behavior; notifications are
* sent from one plugin to all others for informational purposes. It is
* important that commands and notifications not have the same values because
* this could cause a notification sent by one plugin to accidentally induce a
* command in another.
*
* By convention, plugin-defined notifications should have the high bit set
* (e.g. be greater or equal to unsigned 0x8000000) while commands should have
* this bit be cleared.
*
* The following messages are sent to your plugin by X-Plane.
*
*/
/* This message is sent to your plugin whenever the user's plane crashes. The *
* parameter is ignored. */
#define XPLM_MSG_PLANE_CRASHED 101
/* This message is sent to your plugin whenever a new plane is loaded. The *
* parameter contains the index number of the plane being loaded; 0 indicates *
* the user's plane. */
#define XPLM_MSG_PLANE_LOADED 102
/* This messages is sent whenever the user's plane is positioned at a new *
* airport. The parameter is ignored. */
#define XPLM_MSG_AIRPORT_LOADED 103
/* This message is sent whenever new scenery is loaded. Use datarefs to *
* determine the new scenery files that were loaded. The parameter is ignored.*/
#define XPLM_MSG_SCENERY_LOADED 104
/* This message is sent whenever the user adjusts the number of X-Plane *
* aircraft models. You must use XPLMCountPlanes to find out how many planes *
* are now available. This message will only be sent in XP7 and higher *
* because in XP6 the number of aircraft is not user-adjustable. The parameter*
* is ignored. */
#define XPLM_MSG_AIRPLANE_COUNT_CHANGED 105
#if defined(XPLM200)
/* This message is sent to your plugin whenever a plane is unloaded. The *
* parameter contains the index number of the plane being unloaded; 0 *
* indicates the user's plane. The parameter is of type int, passed as the *
* value of the pointer. (That is: the parameter is an int, not a pointer to *
* an int.) */
#define XPLM_MSG_PLANE_UNLOADED 106
#endif /* XPLM200 */
#if defined(XPLM210)
/* This message is sent to your plugin right before X-Plane writes its *
* preferences file. You can use this for two purposes: to write your own *
* preferences, and to modify any datarefs to influence preferences output. *
* For example, if your plugin temporarily modifies saved preferences, you can*
* put them back to their default values here to avoid having the tweaks be *
* persisted if your plugin is not loaded on the next invocation of X-Plane. *
* The parameter is ignored. */
#define XPLM_MSG_WILL_WRITE_PREFS 107
#endif /* XPLM210 */
#if defined(XPLM210)
/* This message is sent to your plugin right after a livery is loaded for an *
* airplane. You can use this to check the new livery (via datarefs) and *
* react accordingly. The parameter contains the index number of the aircraft*
* whose livery is changing. */
#define XPLM_MSG_LIVERY_LOADED 108
#endif /* XPLM210 */
#if defined(XPLM301)
/* Sent to your plugin right before X-Plane enters virtual reality mode (at *
* which time any windows that are not positioned in VR mode will no longer be*
* visible to the user). The parameter is unused and should be ignored. */
#define XPLM_MSG_ENTERED_VR 109
#endif /* XPLM301 */
#if defined(XPLM301)
/* Sent to your plugin right before X-Plane leaves virtual reality mode (at *
* which time you may want to clean up windows that are positioned in VR *
* mode). The parameter is unused and should be ignored. */
#define XPLM_MSG_EXITING_VR 110
#endif /* XPLM301 */
#if defined(XPLM303)
/* Sent to your plugin if another plugin wants to take over AI planes. If you *
* are a synthetic traffic provider, that probably means a plugin for an *
* online network has connected and wants to supply aircraft flown by real *
* humans and you should cease to provide synthetic traffic. If however you *
* are providing online traffic from real humans, you probably don't want to *
* disconnect, in which case you just ignore this message. The sender is the *
* plugin ID of the plugin asking for control of the planes now. You can use *
* it to find out who is requesting and whether you should yield to them. *
* Synthetic traffic providers should always yield to online networks. The *
* parameter is unused and should be ignored. */
#define XPLM_MSG_RELEASE_PLANES 111
#endif /* XPLM303 */
/*
* XPLMSendMessageToPlugin
*
* This function sends a message to another plug-in or X-Plane. Pass
* XPLM_NO_PLUGIN_ID to broadcast to all plug-ins. Only enabled plug-ins with
* a message receive function receive the message.
*
*/
XPLM_API void XPLMSendMessageToPlugin(
XPLMPluginID inPlugin,
int inMessage,
void * inParam);
#if defined(XPLM200)
/***************************************************************************
* Plugin Features API
***************************************************************************/
/*
* The plugin features API allows your plugin to "sign up" for additional
* capabilities and plugin system features that are normally disabled for
* backward compatibility. This allows advanced plugins to "opt-in" to new
* behavior.
*
* Each feature is defined by a permanent string name. The feature string
* names will vary with the particular installation of X-Plane, so plugins
* should not expect a feature to be guaranteed present.
*
* XPLM_WANTS_REFLECTIONS
* ----------------------
*
* Available in the SDK 2.0 and later for X-Plane 9, enabling this capability
* causes your plugin to receive drawing hook callbacks when X-Plane builds
* its off-screen reflection and shadow rendering passes. Plugins should
* enable this and examine the dataref sim/graphics/view/plane_render_type to
* determine whether the drawing callback is for a reflection, shadow
* calculation, or the main screen. Rendering can be simlified or omitted for
* reflections, and non-solid drawing should be skipped for shadow
* calculations.
*
* **Note**: direct drawing via draw callbacks is not recommended; use the
* XPLMInstance API to create object models instead.
*
* XPLM_USE_NATIVE_PATHS
* ---------------------
*
* available in the SDK 2.1 and later for X-Plane 10, this modifies the plugin
* system to use Unix-style paths on all operating systems. With this enabled:
*
* * OS X paths will match the native OS X Unix.
* * Windows will use forward slashes but preserve C:\ or another drive letter
* when using complete file paths.
* * Linux uses its native file system path scheme.
*
* Without this enabled:
*
* * OS X will use CFM file paths separated by a colon.
* * Windows will use back-slashes and conventional DOS paths.
* * Linux uses its native file system path scheme.
*
* All plugins should enable this feature on OS X to access the native file
* system.
*
* XPLM_USE_NATIVE_WIDGET_WINDOWS
* ------------------------------
*
* Available in the SDK 3.0.2 SDK, this capability tells the widgets library
* to use new, modern X-Plane backed XPLMDisplay windows to anchor all widget
* trees. Without it, widgets will always use legacy windows.
*
* Plugins should enable this to allow their widget hierarchies to respond to
* the user's UI size settings and to map widget-based windwos to a VR HMD.
*
* Before enabling this, make sure any custom widget code in your plugin is
* prepared to cope with the UI coordinate system not being th same as the
* OpenGL window coordinate system.
*
*/
/*
* XPLMFeatureEnumerator_f
*
* You pass an XPLMFeatureEnumerator_f to get a list of all features supported
* by a given version running version of X-Plane. This routine is called once
* for each feature.
*
*/
typedef void (* XPLMFeatureEnumerator_f)(
const char * inFeature,
void * inRef);
/*
* XPLMHasFeature
*
* This returns 1 if the given installation of X-Plane supports a feature, or
* 0 if it does not.
*
*/
XPLM_API int XPLMHasFeature(
const char * inFeature);
/*
* XPLMIsFeatureEnabled
*
* This returns 1 if a feature is currently enabled for your plugin, or 0 if
* it is not enabled. It is an error to call this routine with an unsupported
* feature.
*
*/
XPLM_API int XPLMIsFeatureEnabled(
const char * inFeature);
/*
* XPLMEnableFeature
*
* This routine enables or disables a feature for your plugin. This will
* change the running behavior of X-Plane and your plugin in some way,
* depending on the feature.
*
*/
XPLM_API void XPLMEnableFeature(
const char * inFeature,
int inEnable);
/*
* XPLMEnumerateFeatures
*
* This routine calls your enumerator callback once for each feature that this
* running version of X-Plane supports. Use this routine to determine all of
* the features that X-Plane can support.
*
*/
XPLM_API void XPLMEnumerateFeatures(
XPLMFeatureEnumerator_f inEnumerator,
void * inRef);
#endif /* XPLM200 */
#ifdef __cplusplus
}
#endif
#endif
+264
View File
@@ -0,0 +1,264 @@
#ifndef _XPLMProcessing_h_
#define _XPLMProcessing_h_
/*
* Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See
* license.txt for usage. X-Plane SDK Version: 2.1.1
*
*/
/***************************************************************************
* XPLMProcessing
***************************************************************************/
/*
* This API allows you to get regular callbacks during the flight loop, the
* part of X-Plane where the plane's position calculates the physics of
* flight, etc. Use these APIs to accomplish periodic tasks like logging data
* and performing I/O.
*
* You can receive a callback either just before or just after the per-frame
* physics calculations happen - you can use post-FM callbacks to "patch" the
* flight model after it has run.
*
* If the user has set the number of flight model iterations per frame greater
* than one your plugin will _not_ see this; these integrations run on the
* sub-section of the flight model where iterations improve responsiveness
* (e.g. physical integration, not simple systems tracking) and are thus
* opaque to plugins.
*
* Flight loop scheduling, when scheduled by time, is scheduled by a "first
* callback after the deadline" schedule, e.g. your callbacks will always be
* slightly late to ensure that we don't run faster than your deadline.
*
* WARNING: Do NOT use these callbacks to draw! You cannot draw during flight
* loop callbacks. Use the drawing callbacks (see XPLMDisplay for more info)
* for graphics. (One exception: you can use a post-flight loop callback to
* update your own off-screen FBOs.)
*
*/
#include "XPLMDefs.h"
#ifdef __cplusplus
extern "C" {
#endif
/***************************************************************************
* FLIGHT LOOP CALLBACKS
***************************************************************************/
#if defined(XPLM210)
/*
* XPLMFlightLoopPhaseType
*
* You can register a flight loop callback to run either before or after the
* flight model is integrated by X-Plane.
*
*/
enum {
/* Your callback runs before X-Plane integrates the flight model. */
xplm_FlightLoop_Phase_BeforeFlightModel = 0,
/* Your callback runs after X-Plane integrates the flight model. */
xplm_FlightLoop_Phase_AfterFlightModel = 1,
};
typedef int XPLMFlightLoopPhaseType;
#endif /* XPLM210 */
#if defined(XPLM210)
/*
* XPLMFlightLoopID
*
* This is an opaque identifier for a flight loop callback. You can use this
* identifier to easily track and remove your callbacks, or to use the new
* flight loop APIs.
*
*/
typedef void * XPLMFlightLoopID;
#endif /* XPLM210 */
/*
* XPLMFlightLoop_f
*
* This is your flight loop callback. Each time the flight loop is iterated
* through, you receive this call at the end.
*
* Flight loop callbacks receive a number of input timing parameters. These
* input timing parameters are not particularly useful; you may need to track
* your own timing data (e.g. by reading datarefs). The input parameters are:
*
* - inElapsedSinceLastCall: the wall time since your last callback.
* - inElapsedTimeSinceLastFlightLoop: the wall time since any flight loop was
* dispatched.
* - inCounter: a monotonically increasing counter, bumped once per flight
* loop dispatch from the sim.
* - inRefcon: your own ptr constant from when you regitered yor callback.
*
* Your return value controls when you will next be called.
*
* - Return 0 to stop receiving callbacks.
* - Pass a positive number to specify how many seconds until the next
* callback. (You will be called at or after this time, not before.)
* - Pass a negative number to specify how many loops must go by until you
* are called. For example, -1.0 means call me the very next loop.
*
* Try to run your flight loop as infrequently as is practical, and suspend it
* (using return value 0) when you do not need it; lots of flight loop
* callbacks that do nothing lowers X-Plane's frame rate.
*
* Your callback will NOT be unregistered if you return 0; it will merely be
* inactive.
*
*/
typedef float (* XPLMFlightLoop_f)(
float inElapsedSinceLastCall,
float inElapsedTimeSinceLastFlightLoop,
int inCounter,
void * inRefcon);
#if defined(XPLM210)
/*
* XPLMCreateFlightLoop_t
*
* XPLMCreateFlightLoop_t contains the parameters to create a new flight loop
* callback. The strsucture can be expanded in future SDKs - always set
* structSize to the size of your structure in bytes.
*
*/
typedef struct {
int structSize;
XPLMFlightLoopPhaseType phase;
XPLMFlightLoop_f callbackFunc;
void * refcon;
} XPLMCreateFlightLoop_t;
#endif /* XPLM210 */
/*
* XPLMGetElapsedTime
*
* This routine returns the elapsed time since the sim started up in decimal
* seconds. This is a wall timer; it keeps counting upward even if the sim is
* pasued.
*
* __WARNING__: XPLMGetElapsedTime is not a very good timer! It lacks
* precision in both its data type and its source. Do not attempt to use it
* for timing critical applications like network multiplayer.
*
*/
XPLM_API float XPLMGetElapsedTime(void);
/*
* XPLMGetCycleNumber
*
* This routine returns a counter starting at zero for each sim cycle
* computed/video frame rendered.
*
*/
XPLM_API int XPLMGetCycleNumber(void);
/*
* XPLMRegisterFlightLoopCallback
*
* This routine registers your flight loop callback. Pass in a pointer to a
* flight loop function and a refcon. inInterval defines when you will be
* called. Pass in a positive number to specify seconds from registration time
* to the next callback. Pass in a negative number to indicate when you will
* be called (e.g. pass -1 to be called at the next cylcle). Pass 0 to not be
* called; your callback will be inactive.
*
* (This legacy function only installs pre-flight-loop callbacks; use
* XPLMCreateFlightLoop for more control.)
*
*/
XPLM_API void XPLMRegisterFlightLoopCallback(
XPLMFlightLoop_f inFlightLoop,
float inInterval,
void * inRefcon);
/*
* XPLMUnregisterFlightLoopCallback
*
* This routine unregisters your flight loop callback. Do NOT call it from
* your flight loop callback. Once your flight loop callback is unregistered,
* it will not be called again.
*
* Only use this on flight loops registered via
* XPLMRegisterFlightLoopCallback.
*
*/
XPLM_API void XPLMUnregisterFlightLoopCallback(
XPLMFlightLoop_f inFlightLoop,
void * inRefcon);
/*
* XPLMSetFlightLoopCallbackInterval
*
* This routine sets when a callback will be called. Do NOT call it from your
* callback; use the return value of the callback to change your callback
* interval from inside your callback.
*
* inInterval is formatted the same way as in XPLMRegisterFlightLoopCallback;
* positive for seconds, negative for cycles, and 0 for deactivating the
* callback. If inRelativeToNow is 1, times are from the time of this call;
* otherwise they are from the time the callback was last called (or the time
* it was registered if it has never been called.
*
*/
XPLM_API void XPLMSetFlightLoopCallbackInterval(
XPLMFlightLoop_f inFlightLoop,
float inInterval,
int inRelativeToNow,
void * inRefcon);
#if defined(XPLM210)
/*
* XPLMCreateFlightLoop
*
* This routine creates a flight loop callback and returns its ID. The flight
* loop callback is created using the input param struct, and is inited to be
* unscheduled.
*
*/
XPLM_API XPLMFlightLoopID XPLMCreateFlightLoop(
XPLMCreateFlightLoop_t * inParams);
#endif /* XPLM210 */
#if defined(XPLM210)
/*
* XPLMDestroyFlightLoop
*
* This routine destroys a flight loop callback by ID. Only call it on flight
* loops created with the newer XPLMCreateFlightLoop API.
*
*/
XPLM_API void XPLMDestroyFlightLoop(
XPLMFlightLoopID inFlightLoopID);
#endif /* XPLM210 */
#if defined(XPLM210)
/*
* XPLMScheduleFlightLoop
*
* This routine schedules a flight loop callback for future execution. If
* inInterval is negative, it is run in a certain number of frames based on
* the absolute value of the input. If the interval is positive, it is a
* duration in seconds.
*
* If inRelativeToNow is true, ties are interpretted relative to the time this
* routine is called; otherwise they are relative to the last call time or the
* time the flight loop was registered (if never called).
*
*/
XPLM_API void XPLMScheduleFlightLoop(
XPLMFlightLoopID inFlightLoopID,
float inInterval,
int inRelativeToNow);
#endif /* XPLM210 */
#ifdef __cplusplus
}
#endif
#endif
+450
View File
@@ -0,0 +1,450 @@
#ifndef _XPLMScenery_h_
#define _XPLMScenery_h_
/*
* Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See
* license.txt for usage. X-Plane SDK Version: 2.1.1
*
*/
/***************************************************************************
* XPLMScenery
***************************************************************************/
/*
* This package contains APIs to interact with X-Plane's scenery system.
*
*/
#include "XPLMDefs.h"
#ifdef __cplusplus
extern "C" {
#endif
#if defined(XPLM200)
/***************************************************************************
* Terrain Y-Testing
***************************************************************************/
/*
* The Y-testing API allows you to locate the physical scenery mesh. This
* would be used to place dynamic graphics on top of the ground in a plausible
* way or do physics interactions.
*
* The Y-test API works via probe objects, which are allocated by your plugin
* and used to query terrain. Probe objects exist both to capture which
* algorithm you have requested (see probe types) and also to cache query
* information.
*
* Performance Guidelines
* ----------------------
*
* It is generally faster to use the same probe for nearby points and
* different probes for different points. Try not to allocate more than
* "hundreds" of probes at most. Share probes if you need more. Generally,
* probing operations are expensive, and should be avoided via caching when
* possible.
*
* Y testing returns a location on the terrain, a normal vectory, and a
* velocity vector. The normal vector tells you the slope of the terrain at
* that point. The velocity vector tells you if that terrain is moving (and is
* in meters/second). For example, if your Y test hits the aircraft carrier
* deck, this tells you the velocity of that point on the deck.
*
* Note: the Y-testing API is limited to probing the loaded scenery area,
* which is approximately 300x300 km in X-Plane 9. Probes outside this area
* will return the height of a 0 MSL sphere.
*
*/
/*
* XPLMProbeType
*
* XPLMProbeType defines the type of terrain probe - each probe has a
* different algorithm. (Only one type of probe is provided right now, but
* future APIs will expose more flexible or poewrful or useful probes.
*
*/
enum {
/* The Y probe gives you the location of the tallest physical scenery along *
* the Y axis going through the queried point. */
xplm_ProbeY = 0,
};
typedef int XPLMProbeType;
/*
* XPLMProbeResult
*
* Probe results - possible results from a probe query.
*
*/
enum {
/* The probe hit terrain and returned valid values. */
xplm_ProbeHitTerrain = 0,
/* An error in the API call. Either the probe struct size is bad, or the *
* probe is invalid or the type is mismatched for the specific query call. */
xplm_ProbeError = 1,
/* The probe call succeeded but there is no terrain under this point (perhaps *
* it is off the side of the planet?) */
xplm_ProbeMissed = 2,
};
typedef int XPLMProbeResult;
/*
* XPLMProbeRef
*
* An XPLMProbeRef is an opaque handle to a probe, used for querying the
* terrain.
*
*/
typedef void * XPLMProbeRef;
/*
* XPLMProbeInfo_t
*
* XPLMProbeInfo_t contains the results of a probe call. Make sure to set
* structSize to the size of the struct before using it.
*
*/
typedef struct {
/* Size of structure in bytes - always set this before calling the XPLM. */
int structSize;
/* Resulting X location of the terrain point we hit, in local OpenGL *
* coordinates. */
float locationX;
/* Resulting Y location of the terrain point we hit, in local OpenGL *
* coordinates. */
float locationY;
/* Resulting Z location of the terrain point we hit, in local OpenGL *
* coordinates. */
float locationZ;
/* X component of the normal vector to the terrain we found. */
float normalX;
/* Y component of the normal vector to the terrain we found. */
float normalY;
/* Z component of the normal vector to the terrain we found. */
float normalZ;
/* X component of the velocity vector of the terrain we found. */
float velocityX;
/* Y component of the velocity vector of the terrain we found. */
float velocityY;
/* Z component of the velocity vector of the terrain we found. */
float velocityZ;
/* Tells if the surface we hit is water (otherwise it is land). */
int is_wet;
} XPLMProbeInfo_t;
/*
* XPLMCreateProbe
*
* Creates a new probe object of a given type and returns.
*
*/
XPLM_API XPLMProbeRef XPLMCreateProbe(
XPLMProbeType inProbeType);
/*
* XPLMDestroyProbe
*
* Deallocates an existing probe object.
*
*/
XPLM_API void XPLMDestroyProbe(
XPLMProbeRef inProbe);
/*
* XPLMProbeTerrainXYZ
*
* Probes the terrain. Pass in the XYZ coordinate of the probe point, a probe
* object, and an XPLMProbeInfo_t struct that has its structSize member set
* properly. Other fields are filled in if we hit terrain, and a probe result
* is returned.
*
*/
XPLM_API XPLMProbeResult XPLMProbeTerrainXYZ(
XPLMProbeRef inProbe,
float inX,
float inY,
float inZ,
XPLMProbeInfo_t * outInfo);
#endif /* XPLM200 */
#if defined(XPLM300)
/***************************************************************************
* Magnetic Variation
***************************************************************************/
/*
* Use the magnetic variation (more properly, the "magnetic declination") API
* to find the offset of magnetic north from true north at a given latitude
* and longitude within the simulator.
*
* In the real world, the Earth's magnetic field is irregular, such that true
* north (the direction along a meridian toward the north pole) does not
* necessarily match what a magnetic compass shows as north.
*
* Using this API ensures that you present the same offsets to users as
* X-Plane's built-in instruments.
*
*/
/*
* XPLMGetMagneticVariation
*
* Returns X-Plane's simulated magnetic variation (declination) at the
* indication latitude and longitude.
*
*/
XPLM_API float XPLMGetMagneticVariation(
double latitude,
double longitude);
/*
* XPLMDegTrueToDegMagnetic
*
* Converts a heading in degrees relative to true north into a value relative
* to magnetic north at the user's current location.
*
*/
XPLM_API float XPLMDegTrueToDegMagnetic(
float headingDegreesTrue);
/*
* XPLMDegMagneticToDegTrue
*
* Converts a heading in degrees relative to magnetic north at the user's
* current location into a value relative to true north.
*
*/
XPLM_API float XPLMDegMagneticToDegTrue(
float headingDegreesMagnetic);
#endif /* XPLM300 */
/***************************************************************************
* Object Drawing
***************************************************************************/
/*
* The object drawing routines let you load and draw X-Plane OBJ files.
* Objects are loaded by file path and managed via an opaque handle. X-Plane
* naturally reference counts objects, so it is important that you balance
* every successful call to XPLMLoadObject with a call to XPLMUnloadObject!
*
*/
#if defined(XPLM200)
/*
* XPLMObjectRef
*
* An XPLMObjectRef is a opaque handle to an .obj file that has been loaded
* into memory.
*
*/
typedef void * XPLMObjectRef;
#endif /* XPLM200 */
#if defined(XPLM200)
/*
* XPLMDrawInfo_t
*
* The XPLMDrawInfo_t structure contains positioning info for one object that
* is to be drawn. Be sure to set structSize to the size of the structure for
* future expansion.
*
*/
typedef struct {
/* Set this to the size of this structure! */
int structSize;
/* X location of the object in local coordinates. */
float x;
/* Y location of the object in local coordinates. */
float y;
/* Z location of the object in local coordinates. */
float z;
/* Pitch in degres to rotate the object, positive is up. */
float pitch;
/* Heading in local coordinates to rotate the object, clockwise. */
float heading;
/* Roll to rotate the object. */
float roll;
} XPLMDrawInfo_t;
#endif /* XPLM200 */
#if defined(XPLM210)
/*
* XPLMObjectLoaded_f
*
* You provide this callback when loading an object asynchronously; it will be
* called once the object is loaded. Your refcon is passed back. The object
* ref passed in is the newly loaded object (ready for use) or NULL if an
* error occured.
*
* If your plugin is disabled, this callback will be delivered as soon as the
* plugin is re-enabled. If your plugin is unloaded before this callback is
* ever called, the SDK will release the object handle for you.
*
*/
typedef void (* XPLMObjectLoaded_f)(
XPLMObjectRef inObject,
void * inRefcon);
#endif /* XPLM210 */
#if defined(XPLM200)
/*
* XPLMLoadObject
*
* This routine loads an OBJ file and returns a handle to it. If X-Plane has
* already loaded the object, the handle to the existing object is returned.
* Do not assume you will get the same handle back twice, but do make sure to
* call unload once for every load to avoid "leaking" objects. The object will
* be purged from memory when no plugins and no scenery are using it.
*
* The path for the object must be relative to the X-System base folder. If
* the path is in the root of the X-System folder you may need to prepend ./
* to it; loading objects in the root of the X-System folder is STRONGLY
* discouraged - your plugin should not dump art resources in the root folder!
*
* XPLMLoadObject will return NULL if the object cannot be loaded (either
* because it is not found or the file is misformatted). This routine will
* load any object that can be used in the X-Plane scenery system.
*
* It is important that the datarefs an object uses for animation already be
* loaded before you load the object. For this reason it may be necessary to
* defer object loading until the sim has fully started.
*
*/
XPLM_API XPLMObjectRef XPLMLoadObject(
const char * inPath);
#endif /* XPLM200 */
#if defined(XPLM210)
/*
* XPLMLoadObjectAsync
*
* This routine loads an object asynchronously; control is returned to you
* immediately while X-Plane loads the object. The sim will not stop flying
* while the object loads. For large objects, it may be several seconds before
* the load finishes.
*
* You provide a callback function that is called once the load has completed.
* Note that if the object cannot be loaded, you will not find out until the
* callback function is called with a NULL object handle.
*
* There is no way to cancel an asynchronous object load; you must wait for
* the load to complete and then release the object if it is no longer
* desired.
*
*/
XPLM_API void XPLMLoadObjectAsync(
const char * inPath,
XPLMObjectLoaded_f inCallback,
void * inRefcon);
#endif /* XPLM210 */
#if defined(XPLM_DEPRECATED)
/*
* XPLMDrawObjects
*
* __Deprecation Warning__: use XPLMInstancing to draw 3-d objects by creating
* instances, rather than these APIs from draw callbacks.
*
* XPLMDrawObjects draws an object from an OBJ file one or more times. You
* pass in the object and an array of XPLMDrawInfo_t structs, one for each
* place you would like the object to be drawn.
*
* X-Plane will attempt to cull the objects based on LOD and visibility, and
* will pick the appropriate LOD.
*
* Lighting is a boolean; pass 1 to show the night version of object with
* night-only lights lit up. Pass 0 to show the daytime version of the object.
*
* earth_relative controls the coordinate system. If this is 1, the rotations
* you specify are applied to the object after its coordinate system is
* transformed from local to earth-relative coordinates -- that is, an object
* with no rotations will point toward true north and the Y axis will be up
* against gravity. If this is 0, the object is drawn with your rotations from
* local coordanates -- that is, an object with no rotations is drawn pointing
* down the -Z axis and the Y axis of the object matches the local coordinate
* Y axis.
*
*/
XPLM_API void XPLMDrawObjects(
XPLMObjectRef inObject,
int inCount,
XPLMDrawInfo_t * inLocations,
int lighting,
int earth_relative);
#endif /* XPLM_DEPRECATED */
#if defined(XPLM200)
/*
* XPLMUnloadObject
*
* This routine marks an object as no longer being used by your plugin.
* Objects are reference counted: once no plugins are using an object, it is
* purged from memory. Make sure to call XPLMUnloadObject once for each
* successful call to XPLMLoadObject.
*
*/
XPLM_API void XPLMUnloadObject(
XPLMObjectRef inObject);
#endif /* XPLM200 */
#if defined(XPLM200)
/***************************************************************************
* Library Access
***************************************************************************/
/*
* The library access routines allow you to locate scenery objects via the
* X-Plane library system. Right now library access is only provided for
* objects, allowing plugin-drawn objects to be extended using the library
* system.
*
*/
/*
* XPLMLibraryEnumerator_f
*
* An XPLMLibraryEnumerator_f is a callback you provide that is called once
* for each library element that is located. The returned paths will be
* relative to the X-System folder.
*
*/
typedef void (* XPLMLibraryEnumerator_f)(
const char * inFilePath,
void * inRef);
/*
* XPLMLookupObjects
*
* This routine looks up a virtual path in the library system and returns all
* matching elements. You provide a callback - one virtual path may match many
* objects in the library. XPLMLookupObjects returns the number of objects
* found.
*
* The latitude and longitude parameters specify the location the object will
* be used. The library system allows for scenery packages to only provide
* objects to certain local locations. Only objects that are allowed at the
* latitude/longitude you provide will be returned.
*
*/
XPLM_API int XPLMLookupObjects(
const char * inPath,
float inLatitude,
float inLongitude,
XPLMLibraryEnumerator_f enumerator,
void * ref);
#endif /* XPLM200 */
#ifdef __cplusplus
}
#endif
#endif
+970
View File
@@ -0,0 +1,970 @@
#ifndef _XPLMUtilities_h_
#define _XPLMUtilities_h_
/*
* Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See
* license.txt for usage. X-Plane SDK Version: 2.1.1
*
*/
/***************************************************************************
* XPLMUtilities
***************************************************************************/
#include "XPLMDefs.h"
#ifdef __cplusplus
extern "C" {
#endif
/***************************************************************************
* FILE UTILITIES
***************************************************************************/
/*
* The XPLMUtilities file APIs provide some basic file and path functions for
* use with X-Plane.
*
* Directory Separators
* --------------------
*
* The XPLM has two modes it can work in:
*
* * X-Plane native paths: all paths are UTF8 strings, using the unix forward
* slash (/) as the directory separating character. In native path mode,
* you use the same path format for all three operating systems.
*
* * Legacy OS paths: the directroy separator is \ for Windows, : for OS X,
* and / for Linux; OS paths are encoded in MacRoman for OS X using legacy
* HFS conventions, use the application code page for multi-byte encoding
* on Unix using DOS path conventions, and use UTF-8 for Linux.
*
* While legacy OS paths are the default, we strongly encourage you to opt in
* to native paths using the XPLMEnableFeature API.
*
* * All OS X plugins should enable native paths all of the time; if you do
* not do this, you will have to convert all paths back from HFS to Unix
* (and deal with MacRoman) - code written using native paths and the C
* file APIs "just works" on OS X.
*
* * For Linux plugins, there is no difference between the two encodings.
*
* * Windows plugins will need to convert the UTF8 file paths to UTF16 for
* use with the "wide" APIs. While it might seem tempting to stick with
* legacy OS paths (and just use the "ANSI" Windows APIs), X-Plane is fully
* unicode-capable, and will often be installed in paths where the user's
* directories have no ACP encoding.
*
* Full and Relative Paths
* -----------------------
*
* Some of these APIs use full paths, but others use paths relative to the
* user's X-Plane installation. This is documented on a per-API basis.
*
*/
#if defined(XPLM200)
/*
* XPLMDataFileType
*
* These enums define types of data files you can load or unload using the
* SDK.
*
*/
enum {
/* A situation (.sit) file, which starts off a flight in a given *
* configuration. */
xplm_DataFile_Situation = 1,
/* A situation movie (.smo) file, which replays a past flight. */
xplm_DataFile_ReplayMovie = 2,
};
typedef int XPLMDataFileType;
#endif /* XPLM200 */
/*
* XPLMGetSystemPath
*
* This function returns the full path to the X-System folder. Note that this
* is a directory path, so it ends in a trailing : or /.
*
* The buffer you pass should be at least 512 characters long. The path is
* returned using the current native or OS path conventions.
*
*/
XPLM_API void XPLMGetSystemPath(
char * outSystemPath);
/*
* XPLMGetPrefsPath
*
* This routine returns a full path to a file that is within X-Plane's
* preferences directory. (You should remove the file name back to the last
* directory separator to get the preferences directory using
* XPLMExtractFileAndPath.)
*
* The buffer you pass should be at least 512 characters long. The path is
* returned using the current native or OS path conventions.
*
*/
XPLM_API void XPLMGetPrefsPath(
char * outPrefsPath);
/*
* XPLMGetDirectorySeparator
*
* This routine returns a string with one char and a null terminator that is
* the directory separator for the current platform. This allows you to write
* code that concatinates directory paths without having to #ifdef for
* platform. The character returned will reflect the current file path mode.
*
*/
XPLM_API const char * XPLMGetDirectorySeparator(void);
/*
* XPLMExtractFileAndPath
*
* Given a full path to a file, this routine separates the path from the file.
* If the path is a partial directory (e.g. ends in : or \) the trailing
* directory separator is removed. This routine works in-place; a pointer to
* the file part of the buffer is returned; the original buffer still starts
* with the path and is null terminated with no trailing separator.
*
*/
XPLM_API char * XPLMExtractFileAndPath(
char * inFullPath);
/*
* XPLMGetDirectoryContents
*
* This routine returns a list of files in a directory (specified by a full
* path, no trailing : or \). The output is returned as a list of NULL
* terminated strings. An index array (if specified) is filled with pointers
* into the strings. The last file is indicated by a zero-length string (and
* NULL in the indices). This routine will return 1 if you had capacity for
* all files or 0 if you did not. You can also skip a given number of files.
*
* * inDirectoryPath - a null terminated C string containing the full path to
* the directory with no trailing directory char.
*
* * inFirstReturn - the zero-based index of the first file in the directory
* to return. (Usually zero to fetch all in one pass.)
*
* * outFileNames - a buffer to receive a series of sequential null
* terminated C-string file names. A zero-length C string will be appended
* to the very end.
*
* * inFileNameBufSize - the size of the file name buffer in bytes.
*
* * outIndices - a pointer to an array of character pointers that will
* become an index into the directory. The last file will be followed by a
* NULL value. Pass NULL if you do not want indexing information.
*
* * inIndexCount - the max size of the index in entries.
*
* * outTotalFiles - if not NULL, this is filled in with the number of files
* in the directory.
*
* * outReturnedFiles - if not NULL, the number of files returned by this
* iteration.
*
* Return value: 1 if all info could be returned, 0 if there was a buffer
* overrun.
*
* WARNING: Before X-Plane 7 this routine did not properly iterate through
* directories. If X-Plane
* 6 compatibility is needed, use your own code to iterate directories.
*
*/
XPLM_API int XPLMGetDirectoryContents(
const char * inDirectoryPath,
int inFirstReturn,
char * outFileNames,
int inFileNameBufSize,
char ** outIndices, /* Can be NULL */
int inIndexCount,
int * outTotalFiles, /* Can be NULL */
int * outReturnedFiles); /* Can be NULL */
#if defined(XPLM200)
/*
* XPLMLoadDataFile
*
* Loads a data file of a given type. Paths must be relative to the X-System
* folder. To clear the replay, pass a NULL file name (this is only valid with
* replay movies, not sit files).
*
*/
XPLM_API int XPLMLoadDataFile(
XPLMDataFileType inFileType,
const char * inFilePath); /* Can be NULL */
#endif /* XPLM200 */
#if defined(XPLM200)
/*
* XPLMSaveDataFile
*
* Saves the current situation or replay; paths are relative to the X-System
* folder.
*
*/
XPLM_API int XPLMSaveDataFile(
XPLMDataFileType inFileType,
const char * inFilePath);
#endif /* XPLM200 */
/***************************************************************************
* X-PLANE MISC
***************************************************************************/
/*
* XPLMHostApplicationID
*
* While the plug-in SDK is only accessible to plugins running inside X-Plane,
* the original authors considered extending the API to other applications
* that shared basic infrastructure with X-Plane. These enumerations are
* hold-overs from that original roadmap; all values other than X-Plane are
* deprecated. Your plugin should never need this enumeration.
*
*/
enum {
xplm_Host_Unknown = 0,
xplm_Host_XPlane = 1,
#if defined(XPLM_DEPRECATED)
xplm_Host_PlaneMaker = 2,
#endif /* XPLM_DEPRECATED */
#if defined(XPLM_DEPRECATED)
xplm_Host_WorldMaker = 3,
#endif /* XPLM_DEPRECATED */
#if defined(XPLM_DEPRECATED)
xplm_Host_Briefer = 4,
#endif /* XPLM_DEPRECATED */
#if defined(XPLM_DEPRECATED)
xplm_Host_PartMaker = 5,
#endif /* XPLM_DEPRECATED */
#if defined(XPLM_DEPRECATED)
xplm_Host_YoungsMod = 6,
#endif /* XPLM_DEPRECATED */
#if defined(XPLM_DEPRECATED)
xplm_Host_XAuto = 7,
#endif /* XPLM_DEPRECATED */
};
typedef int XPLMHostApplicationID;
/*
* XPLMLanguageCode
*
* These enums define what language the sim is running in. These enumerations
* do not imply that the sim can or does run in all of these languages; they
* simply provide a known encoding in the event that a given sim version is
* localized to a certain language.
*
*/
enum {
xplm_Language_Unknown = 0,
xplm_Language_English = 1,
xplm_Language_French = 2,
xplm_Language_German = 3,
xplm_Language_Italian = 4,
xplm_Language_Spanish = 5,
xplm_Language_Korean = 6,
#if defined(XPLM200)
xplm_Language_Russian = 7,
#endif /* XPLM200 */
#if defined(XPLM200)
xplm_Language_Greek = 8,
#endif /* XPLM200 */
#if defined(XPLM200)
xplm_Language_Japanese = 9,
#endif /* XPLM200 */
#if defined(XPLM300)
xplm_Language_Chinese = 10,
#endif /* XPLM300 */
};
typedef int XPLMLanguageCode;
#if defined(XPLM200)
/*
* XPLMError_f
*
* An XPLM error callback is a function that you provide to receive debugging
* information from the plugin SDK. See XPLMSetErrorCallback for more
* information. NOTE: for the sake of debugging, your error callback will be
* called even if your plugin is not enabled, allowing you to receive debug
* info in your XPluginStart and XPluginStop callbacks. To avoid causing logic
* errors in the management code, do not call any other plugin routines from
* your error callback - it is only meant for catching errors in the
* debugging.
*
*/
typedef void (* XPLMError_f)(
const char * inMessage);
#endif /* XPLM200 */
#if defined(XPLM_DEPRECATED)
/*
* XPLMInitialized
*
* Deprecated: This function returns 1 if X-Plane has properly initialized the
* plug-in system. If this routine returns 0, many XPLM functions will not
* work.
*
* NOTE: because plugins are always called from within the XPLM, there is no
* need to check for initialization; it will always return 1. This routine is
* deprecated - you do not need to check it before continuing within your
* plugin.
*
*/
XPLM_API int XPLMInitialized(void);
#endif /* XPLM_DEPRECATED */
/*
* XPLMGetVersions
*
* This routine returns the revision of both X-Plane and the XPLM DLL. All
* versions are three-digit decimal numbers (e.g. 606 for version 6.06 of
* X-Plane); the current revision of the XPLM is 200 (2.00). This routine also
* returns the host ID of the app running us.
*
* The most common use of this routine is to special-case around X-Plane
* version-specific behavior.
*
*/
XPLM_API void XPLMGetVersions(
int * outXPlaneVersion,
int * outXPLMVersion,
XPLMHostApplicationID * outHostID);
/*
* XPLMGetLanguage
*
* This routine returns the langauge the sim is running in.
*
*/
XPLM_API XPLMLanguageCode XPLMGetLanguage(void);
#if defined(XPLM200)
/*
* XPLMFindSymbol
*
* This routine will attempt to find the symbol passed in the inString
* parameter. If the symbol is found a pointer the function is returned,
* othewise the function will return NULL.
*
* You can use XPLMFindSymbol to utilize newer SDK API features without
* requiring newer versions of the SDK (and X-Plane) as your minimum X-Plane
* version as follows:
*
* * Define the XPLMnnn macro to the minimum required XPLM version you will
* ship with (e.g. XPLM210 for X-Plane 10 compatibility).
*
* * Use XPLMGetVersions and XPLMFindSymbol to detect that the host sim is
* new enough to use new functions and resolve function pointers.
*
* * Conditionally use the new functions if and only if XPLMFindSymbol only
* returns a non- NULL pointer.
*
* Warning: you should always check the XPLM API version as well as the
* results of XPLMFindSymbol to determine if funtionality is safe to use.
*
* To use functionality via XPLMFindSymbol you will need to copy your own
* definitions of the X-Plane API prototypes and cast the returned pointer to
* the correct type.
*
*/
XPLM_API void * XPLMFindSymbol(
const char * inString);
#endif /* XPLM200 */
#if defined(XPLM200)
/*
* XPLMSetErrorCallback
*
* XPLMSetErrorCallback installs an error-reporting callback for your plugin.
* Normally the plugin system performs minimum diagnostics to maximize
* performance. When you install an error callback, you will receive calls due
* to certain plugin errors, such as passing bad parameters or incorrect data.
*
* Important: the error callback determines *programming* errors, e.g. bad API
* parameters. Every error that is returned by the error callback represents a
* mistake in your plugin that you should fix. Error callbacks are not used to
* report expected run-time problems (e.g. disk I/O errors).
*
* The intention is for you to install the error callback during debug
* sections and put a break-point inside your callback. This will cause you to
* break into the debugger from within the SDK at the point in your plugin
* where you made an illegal call.
*
* Installing an error callback may activate error checking code that would
* not normally run, and this may adversely affect performance, so do not
* leave error callbacks installed in shipping plugins. Since the only useful
* response to an error is to change code, error callbacks are not useful "in
* the field".
*
*/
XPLM_API void XPLMSetErrorCallback(
XPLMError_f inCallback);
#endif /* XPLM200 */
/*
* XPLMDebugString
*
* This routine outputs a C-style string to the Log.txt file. The file is
* immediately flushed so you will not lose data. (This does cause a
* performance penalty.)
*
* Please do *not* leave routine diagnostic logging enabled in your shipping
* plugin. The X-Plane Log file is shared by X-Plane and every plugin in the
* system, and plugins that (when functioning normally) print verbose log
* output make it difficult for developers to find error conditions from other
* parts of the system.
*
*/
XPLM_API void XPLMDebugString(
const char * inString);
/*
* XPLMSpeakString
*
* This function displays the string in a translucent overlay over the current
* display and also speaks the string if text-to-speech is enabled. The string
* is spoken asynchronously, this function returns immediately. This function
* may not speak or print depending on user preferences.
*
*/
XPLM_API void XPLMSpeakString(
const char * inString);
/*
* XPLMGetVirtualKeyDescription
*
* Given a virtual key code (as defined in XPLMDefs.h) this routine returns a
* human-readable string describing the character. This routine is provided
* for showing users what keyboard mappings they have set up. The string may
* read 'unknown' or be a blank or NULL string if the virtual key is unknown.
*
*/
XPLM_API const char * XPLMGetVirtualKeyDescription(
char inVirtualKey);
/*
* XPLMReloadScenery
*
* XPLMReloadScenery reloads the current set of scenery. You can use this
* function in two typical ways: simply call it to reload the scenery, picking
* up any new installed scenery, .env files, etc. from disk. Or, change the
* lat/ref and lon/ref data refs and then call this function to shift the
* scenery environment. This routine is equivalent to picking "reload
* scenery" from the developer menu.
*
*/
XPLM_API void XPLMReloadScenery(void);
#if defined(XPLM200)
/***************************************************************************
* X-PLANE COMMAND MANAGEMENT
***************************************************************************/
/*
* The command management APIs let plugins interact with the command-system in
* X-Plane, the abstraction behind keyboard presses and joystick buttons. This
* API lets you create new commands and modify the behavior (or get
* notification) of existing ones.
*
* X-Plane Command Phases
* ----------------------
*
* X-Plane commands are not instantaneous; they operate over a duration.
* (Think of a joystick button press - you can press, hold down, and then
* release the joystick button; X-Plane commands model this entire process.)
*
* An X-Plane command consists of three phases: a beginning, continuous
* repetition, and an ending. The command may be repeated zero times in its
* duration, followed by one command ending. Command begin and end messges are
* balanced, but a command may be bound to more than one event source (e.g. a
* keyboard key and a joystick button), in which case you may receive a second
* begin during before any end).
*
* When you issue commands in the plugin system, you *must* balance every call
* to XPLMCommandBegin with a call to XPLMCommandEnd with the same command
* reference.
*
* Command Behavior Modification
* -----------------------------
*
* You can register a callback to handle a command either before or after
* X-Plane does; if you receive the command before X-Plane you have the option
* to either let X-Plane handle the command or hide the command from X-Plane.
* This lets plugins both augment commands and replace them.
*
* If you register for an existing command, be sure that you are *consistent*
* in letting X-Plane handle or not handle the command; you are responsible
* for passing a *balanced* number of begin and end messages to X-Plane. (E.g.
* it is not legal to pass all the begin messages to X-Plane but hide all the
* end messages).
*
*/
/*
* XPLMCommandPhase
*
* The phases of a command.
*
*/
enum {
/* The command is being started. */
xplm_CommandBegin = 0,
/* The command is continuing to execute. */
xplm_CommandContinue = 1,
/* The command has ended. */
xplm_CommandEnd = 2,
};
typedef int XPLMCommandPhase;
/*
* XPLMCommandRef
*
* A command ref is an opaque identifier for an X-Plane command. Command
* references stay the same for the life of your plugin but not between
* executions of X-Plane. Command refs are used to execute commands, create
* commands, and create callbacks for particular commands.
*
* Note that a command is not "owned" by a particular plugin. Since many
* plugins may participate in a command's execution, the command does not go
* away if the plugin that created it is unloaded.
*
*/
typedef void * XPLMCommandRef;
/*
* XPLMCommandCallback_f
*
* A command callback is a function in your plugin that is called when a
* command is pressed. Your callback receives the command reference for the
* particular command, the phase of the command that is executing, and a
* reference pointer that you specify when registering the callback.
*
* Your command handler should return 1 to let processing of the command
* continue to other plugins and X-Plane, or 0 to halt processing, potentially
* bypassing X-Plane code.
*
*/
typedef int (* XPLMCommandCallback_f)(
XPLMCommandRef inCommand,
XPLMCommandPhase inPhase,
void * inRefcon);
/*
* XPLMFindCommand
*
* XPLMFindCommand looks up a command by name, and returns its command
* reference or NULL if the command does not exist.
*
*/
XPLM_API XPLMCommandRef XPLMFindCommand(
const char * inName);
/*
* XPLMCommandBegin
*
* XPLMCommandBegin starts the execution of a command, specified by its
* command reference. The command is "held down" until XPLMCommandEnd is
* called. You must balance each XPLMCommandBegin call with an XPLMCommandEnd
* call.
*
*/
XPLM_API void XPLMCommandBegin(
XPLMCommandRef inCommand);
/*
* XPLMCommandEnd
*
* XPLMCommandEnd ends the execution of a given command that was started with
* XPLMCommandBegin. You must not issue XPLMCommandEnd for a command you did
* not begin.
*
*/
XPLM_API void XPLMCommandEnd(
XPLMCommandRef inCommand);
/*
* XPLMCommandOnce
*
* This executes a given command momentarily, that is, the command begins and
* ends immediately. This is the equivalent of calling XPLMCommandBegin() and
* XPLMCommandEnd() back ot back.
*
*/
XPLM_API void XPLMCommandOnce(
XPLMCommandRef inCommand);
/*
* XPLMCreateCommand
*
* XPLMCreateCommand creates a new command for a given string. If the command
* already exists, the existing command reference is returned. The description
* may appear in user interface contexts, such as the joystick configuration
* screen.
*
*/
XPLM_API XPLMCommandRef XPLMCreateCommand(
const char * inName,
const char * inDescription);
/*
* XPLMRegisterCommandHandler
*
* XPLMRegisterCommandHandler registers a callback to be called when a command
* is executed. You provide a callback with a reference pointer.
*
* If inBefore is true, your command handler callback will be executed before
* X-Plane executes the command, and returning 0 from your callback will
* disable X-Plane's processing of the command. If inBefore is false, your
* callback will run after X-Plane. (You can register a single callback both
* before and after a command.)
*
*/
XPLM_API void XPLMRegisterCommandHandler(
XPLMCommandRef inComand,
XPLMCommandCallback_f inHandler,
int inBefore,
void * inRefcon);
/*
* XPLMUnregisterCommandHandler
*
* XPLMUnregisterCommandHandler removes a command callback registered with
* XPLMRegisterCommandHandler.
*
*/
XPLM_API void XPLMUnregisterCommandHandler(
XPLMCommandRef inComand,
XPLMCommandCallback_f inHandler,
int inBefore,
void * inRefcon);
#endif /* XPLM200 */
#if defined(XPLM_DEPRECATED)
/***************************************************************************
* X-PLANE USER INTERACTION
***************************************************************************/
/*
* WARNING: The legacy user interaction API is deprecated; while it was the
* only way to run commands in X-Plane 6,7 and 8, it is obsolete, and was
* replaced by the command system API in X-Plane 9. You should not use this
* API; replace any of the calls below with XPLMCommand invocations based on
* persistent command strings. The documentation that follows is for historic
* reference only.
*
* The legacy user interaction APIs let you simulate commands the user can do
* with a joystick, keyboard etc. Note that it is generally safer for future
* compatibility to use one of these commands than to manipulate the
* underlying sim data.
*
*/
/*
* XPLMCommandKeyID
*
* These enums represent all the keystrokes available within X-Plane. They can
* be sent to X-Plane directly. For example, you can reverse thrust using
* these enumerations.
*
*/
enum {
xplm_key_pause=0,
xplm_key_revthrust,
xplm_key_jettison,
xplm_key_brakesreg,
xplm_key_brakesmax,
xplm_key_gear,
xplm_key_timedn,
xplm_key_timeup,
xplm_key_fadec,
xplm_key_otto_dis,
xplm_key_otto_atr,
xplm_key_otto_asi,
xplm_key_otto_hdg,
xplm_key_otto_gps,
xplm_key_otto_lev,
xplm_key_otto_hnav,
xplm_key_otto_alt,
xplm_key_otto_vvi,
xplm_key_otto_vnav,
xplm_key_otto_nav1,
xplm_key_otto_nav2,
xplm_key_targ_dn,
xplm_key_targ_up,
xplm_key_hdgdn,
xplm_key_hdgup,
xplm_key_barodn,
xplm_key_baroup,
xplm_key_obs1dn,
xplm_key_obs1up,
xplm_key_obs2dn,
xplm_key_obs2up,
xplm_key_com1_1,
xplm_key_com1_2,
xplm_key_com1_3,
xplm_key_com1_4,
xplm_key_nav1_1,
xplm_key_nav1_2,
xplm_key_nav1_3,
xplm_key_nav1_4,
xplm_key_com2_1,
xplm_key_com2_2,
xplm_key_com2_3,
xplm_key_com2_4,
xplm_key_nav2_1,
xplm_key_nav2_2,
xplm_key_nav2_3,
xplm_key_nav2_4,
xplm_key_adf_1,
xplm_key_adf_2,
xplm_key_adf_3,
xplm_key_adf_4,
xplm_key_adf_5,
xplm_key_adf_6,
xplm_key_transpon_1,
xplm_key_transpon_2,
xplm_key_transpon_3,
xplm_key_transpon_4,
xplm_key_transpon_5,
xplm_key_transpon_6,
xplm_key_transpon_7,
xplm_key_transpon_8,
xplm_key_flapsup,
xplm_key_flapsdn,
xplm_key_cheatoff,
xplm_key_cheaton,
xplm_key_sbrkoff,
xplm_key_sbrkon,
xplm_key_ailtrimL,
xplm_key_ailtrimR,
xplm_key_rudtrimL,
xplm_key_rudtrimR,
xplm_key_elvtrimD,
xplm_key_elvtrimU,
xplm_key_forward,
xplm_key_down,
xplm_key_left,
xplm_key_right,
xplm_key_back,
xplm_key_tower,
xplm_key_runway,
xplm_key_chase,
xplm_key_free1,
xplm_key_free2,
xplm_key_spot,
xplm_key_fullscrn1,
xplm_key_fullscrn2,
xplm_key_tanspan,
xplm_key_smoke,
xplm_key_map,
xplm_key_zoomin,
xplm_key_zoomout,
xplm_key_cycledump,
xplm_key_replay,
xplm_key_tranID,
xplm_key_max
};
typedef int XPLMCommandKeyID;
/*
* XPLMCommandButtonID
*
* These are enumerations for all of the things you can do with a joystick
* button in X-Plane. They currently match the buttons menu in the equipment
* setup dialog, but these enums will be stable even if they change in
* X-Plane.
*
*/
enum {
xplm_joy_nothing=0,
xplm_joy_start_all,
xplm_joy_start_0,
xplm_joy_start_1,
xplm_joy_start_2,
xplm_joy_start_3,
xplm_joy_start_4,
xplm_joy_start_5,
xplm_joy_start_6,
xplm_joy_start_7,
xplm_joy_throt_up,
xplm_joy_throt_dn,
xplm_joy_prop_up,
xplm_joy_prop_dn,
xplm_joy_mixt_up,
xplm_joy_mixt_dn,
xplm_joy_carb_tog,
xplm_joy_carb_on,
xplm_joy_carb_off,
xplm_joy_trev,
xplm_joy_trm_up,
xplm_joy_trm_dn,
xplm_joy_rot_trm_up,
xplm_joy_rot_trm_dn,
xplm_joy_rud_lft,
xplm_joy_rud_cntr,
xplm_joy_rud_rgt,
xplm_joy_ail_lft,
xplm_joy_ail_cntr,
xplm_joy_ail_rgt,
xplm_joy_B_rud_lft,
xplm_joy_B_rud_rgt,
xplm_joy_look_up,
xplm_joy_look_dn,
xplm_joy_look_lft,
xplm_joy_look_rgt,
xplm_joy_glance_l,
xplm_joy_glance_r,
xplm_joy_v_fnh,
xplm_joy_v_fwh,
xplm_joy_v_tra,
xplm_joy_v_twr,
xplm_joy_v_run,
xplm_joy_v_cha,
xplm_joy_v_fr1,
xplm_joy_v_fr2,
xplm_joy_v_spo,
xplm_joy_flapsup,
xplm_joy_flapsdn,
xplm_joy_vctswpfwd,
xplm_joy_vctswpaft,
xplm_joy_gear_tog,
xplm_joy_gear_up,
xplm_joy_gear_down,
xplm_joy_lft_brake,
xplm_joy_rgt_brake,
xplm_joy_brakesREG,
xplm_joy_brakesMAX,
xplm_joy_speedbrake,
xplm_joy_ott_dis,
xplm_joy_ott_atr,
xplm_joy_ott_asi,
xplm_joy_ott_hdg,
xplm_joy_ott_alt,
xplm_joy_ott_vvi,
xplm_joy_tim_start,
xplm_joy_tim_reset,
xplm_joy_ecam_up,
xplm_joy_ecam_dn,
xplm_joy_fadec,
xplm_joy_yaw_damp,
xplm_joy_art_stab,
xplm_joy_chute,
xplm_joy_JATO,
xplm_joy_arrest,
xplm_joy_jettison,
xplm_joy_fuel_dump,
xplm_joy_puffsmoke,
xplm_joy_prerotate,
xplm_joy_UL_prerot,
xplm_joy_UL_collec,
xplm_joy_TOGA,
xplm_joy_shutdown,
xplm_joy_con_atc,
xplm_joy_fail_now,
xplm_joy_pause,
xplm_joy_rock_up,
xplm_joy_rock_dn,
xplm_joy_rock_lft,
xplm_joy_rock_rgt,
xplm_joy_rock_for,
xplm_joy_rock_aft,
xplm_joy_idle_hilo,
xplm_joy_lanlights,
xplm_joy_max
};
typedef int XPLMCommandButtonID;
/*
* XPLMSimulateKeyPress
*
* This function simulates a key being pressed for X-Plane. The keystroke goes
* directly to X-Plane; it is never sent to any plug-ins. However, since this
* is a raw key stroke it may be mapped by the keys file or enter text into a
* field.
*
* Deprecated: use XPLMCommandOnce
*
*/
XPLM_API void XPLMSimulateKeyPress(
int inKeyType,
int inKey);
/*
* XPLMCommandKeyStroke
*
* This routine simulates a command-key stroke. However, the keys are done by
* function, not by actual letter, so this function works even if the user has
* remapped their keyboard. Examples of things you might do with this include
* pausing the simulator.
*
* Deprecated: use XPLMCommandOnce
*
*/
XPLM_API void XPLMCommandKeyStroke(
XPLMCommandKeyID inKey);
/*
* XPLMCommandButtonPress
*
* This function simulates any of the actions that might be taken by pressing
* a joystick button. However, this lets you call the command directly rather
* than have to know which button is mapped where. Important: you must release
* each button you press. The APIs are separate so that you can 'hold down' a
* button for a fixed amount of time.
*
* Deprecated: use XPLMCommandBegin.
*
*/
XPLM_API void XPLMCommandButtonPress(
XPLMCommandButtonID inButton);
/*
* XPLMCommandButtonRelease
*
* This function simulates any of the actions that might be taken by pressing
* a joystick button. See XPLMCommandButtonPress.
*
* Deprecated: use XPLMCommandEnd.
*
*/
XPLM_API void XPLMCommandButtonRelease(
XPLMCommandButtonID inButton);
#endif /* XPLM_DEPRECATED */
#ifdef __cplusplus
}
#endif
#endif
+470
View File
@@ -0,0 +1,470 @@
{
Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See
license.txt for usage. X-Plane SDK Version: 2.1.1
}
UNIT XPStandardWidgets;
INTERFACE
{
## THEORY OF OPERATION
The standard widgets are widgets built into the widgets library. While you
can gain access to the widget function that drives them, you generally use
them by calling XPCreateWidget and then listening for special messages,
etc.
The standard widgets often send mesages to themselves when the user
performs an event; these messages are sent up the widget hierarchy until
they are handled. So you can add a widget proc directly to a push button
(for example) to intercept the message when it is clicked, or you can put
one widget proc on a window for all of the push buttons in the window. Most
of these messages contain the original widget ID as a parameter so you can
know which widget is messaging no matter who it is sent to.
}
USES
XPWidgetDefs;
{$A4}
{___________________________________________________________________________
* MAIN WINDOW
___________________________________________________________________________}
{
The main window widget class provides a "window" as the user knows it.
These windows are dragable and can be selected. Use them to create floating
windows and non-modal dialogs.
}
CONST
xpWidgetClass_MainWindow = 1;
{
Main Window Type Values
These type values are used to control the appearance of a main window.
}
{ The standard main window; pin stripes on XP7, metal frame on XP 6. }
xpMainWindowStyle_MainWindow = 0
;
{ A translucent dark gray window, like the one ATC messages appear in. }
xpMainWindowStyle_Translucent = 1
;
{
Main Window Properties
}
{ This property specifies the type of window. Set to one of the main window }
{ types above. }
xpProperty_MainWindowType = 1100
;
{ This property specifies whether the main window has close boxes in its }
{ corners. }
xpProperty_MainWindowHasCloseBoxes = 1200
;
{
MainWindow Messages
}
{ This message is sent when the close buttons are pressed for your window. }
xpMessage_CloseButtonPushed = 1200
;
{___________________________________________________________________________
* SUB WINDOW
___________________________________________________________________________}
{
X-Plane dialogs are divided into separate areas; the sub window widgets
allow you to make these areas. Create one main window and place several
subwindows inside it. Then place your controls inside the subwindows.
}
CONST
xpWidgetClass_SubWindow = 2;
{
SubWindow Type Values
These values control the appearance of the subwindow.
}
{ A panel that sits inside a main window. }
xpSubWindowStyle_SubWindow = 0
;
{ A screen that sits inside a panel for showing text information. }
xpSubWindowStyle_Screen = 2
;
{ A list view for scrolling lists. }
xpSubWindowStyle_ListView = 3
;
{
SubWindow Properties
}
{ This property specifies the type of window. Set to one of the subwindow }
{ types above. }
xpProperty_SubWindowType = 1200
;
{___________________________________________________________________________
* BUTTON
___________________________________________________________________________}
{
The button class provides a number of different button styles and
behaviors, including push buttons, radio buttons, check boxes, etc. The
button label appears on or next to the button depending on the button's
appearance, or type.
The button's behavior is a separate property that dictates who it hilights
and what kinds of messages it sends. Since behavior and type are different,
you can do strange things like make check boxes that act as push buttons or
push buttons with radio button behavior.
In X-Plane 6 there were no check box graphics. The result is the following
behavior: in X-Plane
6 all check box and radio buttons are round (radio-button style) buttons;
in X-Plane 7 they are all square (check-box style) buttons. In a future
version of X-Plane, the xpButtonBehavior enums will provide the correct
graphic (check box or radio button) giving the expected result.
}
CONST
xpWidgetClass_Button = 3;
{
Button Types
These define the visual appearance of buttons but not how they respond to
the mouse.
}
{ This is a standard push button, like an 'OK' or 'Cancel' button in a dialog}
{ box. }
xpPushButton = 0
;
{ A check box or radio button. Use this and the button behaviors below to }
{ get the desired behavior. }
xpRadioButton = 1
;
{ A window close box. }
xpWindowCloseBox = 3
;
{ A small down arrow. }
xpLittleDownArrow = 5
;
{ A small up arrow. }
xpLittleUpArrow = 6
;
{
Button Behavior Values
These define how the button responds to mouse clicks.
}
{ Standard push button behavior. The button hilites while the mouse is }
{ clicked over it and unhilites when the mouse is moved outside of it or }
{ released. If the mouse is released over the button, the }
{ xpMsg_PushButtonPressed message is sent. }
xpButtonBehaviorPushButton = 0
;
{ Check box behavior. The button immediately toggles its value when the mouse}
{ is clicked and sends out a xpMsg_ButtonStateChanged message. }
xpButtonBehaviorCheckBox = 1
;
{ Radio button behavior. The button immediately sets its state to one and }
{ sends out a xpMsg_ButtonStateChanged message if it was not already set to }
{ one. You must turn off other radio buttons in a group in your code. }
xpButtonBehaviorRadioButton = 2
;
{
Button Properties
}
{ This property sets the visual type of button. Use one of the button types }
{ above. }
xpProperty_ButtonType = 1300
;
{ This property sets the button's behavior. Use one of the button behaviors }
{ above. }
xpProperty_ButtonBehavior = 1301
;
{ This property tells whether a check box or radio button is "checked" or }
{ not. Not used for push buttons. }
xpProperty_ButtonState = 1302
;
{
Button Messages
These messages are sent by the button to itself and then up the widget
chain when the button is clicked. (You may intercept them by providing a
widget handler for the button itself or by providing a handler in a parent
widget.)
}
{ This message is sent when the user completes a click and release in a }
{ button with push button behavior. Parameter one of the message is the }
{ widget ID of the button. This message is dispatched up the widget }
{ hierarchy. }
xpMsg_PushButtonPressed = 1300
;
{ This message is sent when a button is clicked that has radio button or }
{ check box behavior and its value changes. (Note that if the value changes }
{ by setting a property you do not receive this message!) Parameter one is }
{ the widget ID of the button, parameter 2 is the new state value, either }
{ zero or one. This message is dispatched up the widget hierarchy. }
xpMsg_ButtonStateChanged = 1301
;
{___________________________________________________________________________
* TEXT FIELD
___________________________________________________________________________}
{
The text field widget provides an editable text field including mouse
selection and keyboard navigation. The contents of the text field are its
descriptor. (The descriptor changes as the user types.)
The text field can have a number of types, that effect the visual layout of
the text field. The text field sends messages to itself so you may control
its behavior.
If you need to filter keystrokes, add a new handler and intercept the key
press message. Since key presses are passed by pointer, you can modify the
keystroke and pass it through to the text field widget.
WARNING: in X-Plane before 7.10 (including 6.70) null characters could
crash X-Plane. To prevent this, wrap this object with a filter function
(more instructions can be found on the SDK website).
}
CONST
xpWidgetClass_TextField = 4;
{
Text Field Type Values
These control the look of the text field.
}
{ A field for text entry. }
xpTextEntryField = 0
;
{ A transparent text field. The user can type and the text is drawn, but no }
{ background is drawn. You can draw your own background by adding a widget }
{ handler and prehandling the draw message. }
xpTextTransparent = 3
;
{ A translucent edit field, dark gray. }
xpTextTranslucent = 4
;
{
Text Field Properties
}
{ This is the character position the selection starts at, zero based. If it }
{ is the same as the end insertion point, the insertion point is not a }
{ selection. }
xpProperty_EditFieldSelStart = 1400
;
{ This is the character position of the end of the selection. }
xpProperty_EditFieldSelEnd = 1401
;
{ This is the character position a drag was started at if the user is }
{ dragging to select text, or -1 if a drag is not in progress. }
xpProperty_EditFieldSelDragStart = 1402
;
{ This is the type of text field to display, from the above list. }
xpProperty_TextFieldType = 1403
;
{ Set this property to 1 to password protect the field. Characters will be }
{ drawn as *s even though the descriptor will contain plain-text. }
xpProperty_PasswordMode = 1404
;
{ The max number of characters you can enter, if limited. Zero means }
{ unlimited. }
xpProperty_MaxCharacters = 1405
;
{ The first visible character on the left. This effectively scrolls the text}
{ field. }
xpProperty_ScrollPosition = 1406
;
{ The font to draw the field's text with. (An XPLMFontID.) }
xpProperty_Font = 1407
;
{ This is the active side of the insert selection. (Internal) }
xpProperty_ActiveEditSide = 1408
;
{
Text Field Messages
}
{ The text field sends this message to itself when its text changes. It sends}
{ the message up the call chain; param1 is the text field's widget ID. }
xpMsg_TextFieldChanged = 1400
;
{___________________________________________________________________________
* SCROLL BAR
___________________________________________________________________________}
{
A standard scroll bar or slider control. The scroll bar has a minimum,
maximum and current value that is updated when the user drags it. The
scroll bar sends continuous messages as it is dragged.
}
CONST
xpWidgetClass_ScrollBar = 5;
{
Scroll Bar Type Values
This defines how the scroll bar looks.
}
{ A standard X-Plane scroll bar (with arrows on the ends). }
xpScrollBarTypeScrollBar = 0
;
{ A slider, no arrows. }
xpScrollBarTypeSlider = 1
;
{
Scroll Bar Properties
}
{ The current position of the thumb (in between the min and max, inclusive) }
xpProperty_ScrollBarSliderPosition = 1500
;
{ The value the scroll bar has when the thumb is in the lowest position. }
xpProperty_ScrollBarMin = 1501
;
{ The value the scroll bar has when the thumb is in the highest position. }
xpProperty_ScrollBarMax = 1502
;
{ How many units to move the scroll bar when clicking next to the thumb. The }
{ scroll bar always moves one unit when the arrows are clicked. }
xpProperty_ScrollBarPageAmount = 1503
;
{ The type of scrollbar from the enums above. }
xpProperty_ScrollBarType = 1504
;
{ Used internally. }
xpProperty_ScrollBarSlop = 1505
;
{
Scroll Bar Messages
}
{ The scroll bar sends this message when the slider position changes. It }
{ sends the message up the call chain; param1 is the Scroll Bar widget ID. }
xpMsg_ScrollBarSliderPositionChanged = 1500
;
{___________________________________________________________________________
* CAPTION
___________________________________________________________________________}
{
A caption is a simple widget that shows its descriptor as a string, useful
for labeling parts of a window. It always shows its descriptor as its
string and is otherwise transparent.
}
CONST
xpWidgetClass_Caption = 6;
{
Caption Properties
}
{ This property specifies whether the caption is lit; use lit captions }
{ against screens. }
xpProperty_CaptionLit = 1600
;
{___________________________________________________________________________
* GENERAL GRAPHICS
___________________________________________________________________________}
{
The general graphics widget can show one of many icons available from
X-Plane.
}
CONST
xpWidgetClass_GeneralGraphics = 7;
{
General Graphics Types Values
These define the icon for the general graphics.
}
xpShip = 4
;
xpILSGlideScope = 5
;
xpMarkerLeft = 6
;
xp_Airport = 7
;
xpNDB = 8
;
xpVOR = 9
;
xpRadioTower = 10
;
xpAircraftCarrier = 11
;
xpFire = 12
;
xpMarkerRight = 13
;
xpCustomObject = 14
;
xpCoolingTower = 15
;
xpSmokeStack = 16
;
xpBuilding = 17
;
xpPowerLine = 18
;
xpVORWithCompassRose = 19
;
xpOilPlatform = 21
;
xpOilPlatformSmall = 22
;
xpWayPoint = 23
;
{
General Graphics Properties
}
{ This property controls the type of icon that is drawn. }
xpProperty_GeneralGraphicsType = 1700
;
{___________________________________________________________________________
* PROGRESS INDICATOR
___________________________________________________________________________}
{
This widget implements a progress indicator as seen when X-Plane starts up.
}
CONST
xpWidgetClass_Progress = 8;
{
Progress Indicator Properties
}
{ This is the current value of the progress indicator. }
xpProperty_ProgressPosition = 1800
;
{ This is the minimum value, equivalent to 0% filled. }
xpProperty_ProgressMin = 1801
;
{ This is the maximum value, equivalent to 100% filled. }
xpProperty_ProgressMax = 1802
;
IMPLEMENTATION
END.
+342
View File
@@ -0,0 +1,342 @@
{
Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See
license.txt for usage. X-Plane SDK Version: 2.1.1
}
UNIT XPUIGraphics;
INTERFACE
USES
XPWidgetDefs;
{$A4}
{___________________________________________________________________________
* UI GRAPHICS
___________________________________________________________________________}
{
XPWindowStyle
There are a few built-in window styles in X-Plane that you can use.
Note that X-Plane 6 does not offer real shadow-compositing; you must make
sure to put a window on top of another window of the right style to the
shadows work, etc. This applies to elements with insets and shadows. The
rules are:
Sub windows must go on top of main windows, and screens and list views on
top of subwindows. Only help and main windows can be over the main screen.
With X-Plane 7 any window or element may be placed over any other element.
Some windows are scaled by stretching, some by repeating. The drawing
routines know which scaling method to use. The list view cannot be rescaled
in X-Plane 6 because it has both a repeating pattern and a gradient in one
element. All other elements can be rescaled.
}
TYPE
XPWindowStyle = (
{ An LCD screen that shows help. }
xpWindow_Help = 0
{ A dialog box window. }
,xpWindow_MainWindow = 1
{ A panel or frame within a dialog box window. }
,xpWindow_SubWindow = 2
{ An LCD screen within a panel to hold text displays. }
,xpWindow_Screen = 4
{ A list view within a panel for scrolling file names, etc. }
,xpWindow_ListView = 5
);
PXPWindowStyle = ^XPWindowStyle;
{
XPDrawWindow
This routine draws a window of the given dimensions at the given offset on
the virtual screen in a given style. The window is automatically scaled as
appropriate using a bitmap scaling technique (scaling or repeating) as
appropriate to the style.
}
PROCEDURE XPDrawWindow(
inX1 : Integer;
inY1 : Integer;
inX2 : Integer;
inY2 : Integer;
inStyle : XPWindowStyle);
cdecl; external XPWIDGETS.DLL;
{
XPGetWindowDefaultDimensions
This routine returns the default dimensions for a window. Output is either
a minimum or fixed value depending on whether the window is scalable.
}
PROCEDURE XPGetWindowDefaultDimensions(
inStyle : XPWindowStyle;
outWidth : PInteger; { Can be nil }
outHeight : PInteger); { Can be nil }
cdecl; external XPWIDGETS.DLL;
{
XPElementStyle
Elements are individually drawable UI things like push buttons, etc. The
style defines what kind of element you are drawing. Elements can be
stretched in one or two dimensions (depending on the element). Some
elements can be lit.
In X-Plane 6 some elements must be drawn over metal. Some are scalable and
some are not. Any element can be drawn anywhere in X-Plane 7.
Scalable Axis Required Background
}
TYPE
XPElementStyle = (
{ x metal }
xpElement_TextField = 6
{ none metal }
,xpElement_CheckBox = 9
{ none metal }
,xpElement_CheckBoxLit = 10
{ none window header }
,xpElement_WindowCloseBox = 14
{ none window header }
,xpElement_WindowCloseBoxPressed = 15
{ x metal }
,xpElement_PushButton = 16
{ x metal }
,xpElement_PushButtonLit = 17
{ none any }
,xpElement_OilPlatform = 24
{ none any }
,xpElement_OilPlatformSmall = 25
{ none any }
,xpElement_Ship = 26
{ none any }
,xpElement_ILSGlideScope = 27
{ none any }
,xpElement_MarkerLeft = 28
{ none any }
,xpElement_Airport = 29
{ none any }
,xpElement_Waypoint = 30
{ none any }
,xpElement_NDB = 31
{ none any }
,xpElement_VOR = 32
{ none any }
,xpElement_RadioTower = 33
{ none any }
,xpElement_AircraftCarrier = 34
{ none any }
,xpElement_Fire = 35
{ none any }
,xpElement_MarkerRight = 36
{ none any }
,xpElement_CustomObject = 37
{ none any }
,xpElement_CoolingTower = 38
{ none any }
,xpElement_SmokeStack = 39
{ none any }
,xpElement_Building = 40
{ none any }
,xpElement_PowerLine = 41
{ none metal }
,xpElement_CopyButtons = 45
{ none metal }
,xpElement_CopyButtonsWithEditingGrid = 46
{ x, y metal }
,xpElement_EditingGrid = 47
{ THIS CAN PROBABLY BE REMOVED }
,xpElement_ScrollBar = 48
{ none any }
,xpElement_VORWithCompassRose = 49
{ none metal }
,xpElement_Zoomer = 51
{ x, y metal }
,xpElement_TextFieldMiddle = 52
{ none metal }
,xpElement_LittleDownArrow = 53
{ none metal }
,xpElement_LittleUpArrow = 54
{ none metal }
,xpElement_WindowDragBar = 61
{ none metal }
,xpElement_WindowDragBarSmooth = 62
);
PXPElementStyle = ^XPElementStyle;
{
XPDrawElement
XPDrawElement draws a given element at an offset on the virtual screen in
set dimensions.
*Even* if the element is not scalable, it will be scaled if the width and
height do not match the preferred dimensions; it'll just look ugly. Pass
inLit to see the lit version of the element; if the element cannot be lit
this is ignored.
}
PROCEDURE XPDrawElement(
inX1 : Integer;
inY1 : Integer;
inX2 : Integer;
inY2 : Integer;
inStyle : XPElementStyle;
inLit : Integer);
cdecl; external XPWIDGETS.DLL;
{
XPGetElementDefaultDimensions
This routine returns the recommended or minimum dimensions of a given UI
element. outCanBeLit tells whether the element has both a lit and unlit
state. Pass `NULL` to not receive any of these parameters.
}
PROCEDURE XPGetElementDefaultDimensions(
inStyle : XPElementStyle;
outWidth : PInteger; { Can be nil }
outHeight : PInteger; { Can be nil }
outCanBeLit : PInteger); { Can be nil }
cdecl; external XPWIDGETS.DLL;
{
XPTrackStyle
A track is a UI element that displays a value vertically or horizontally.
X-Plane has three kinds of tracks: scroll bars, sliders, and progress bars.
Tracks can be displayed either horizontally or vertically; tracks will
choose their own layout based on the larger dimension of their dimensions
(e.g. they know if they are tall or wide). Sliders may be lit or unlit
(showing the user manipulating them).
- ScrollBar: this is a standard scroll bar with arrows and a thumb to drag.
- Slider: this is a simple track with a ball in the middle that can be
slid.
- Progress: this is a progress indicator showing how a long task is going.
}
TYPE
XPTrackStyle = (
{ not over metal can be lit can be rotated }
xpTrack_ScrollBar = 0
{ over metal can be lit can be rotated }
,xpTrack_Slider = 1
{ over metal cannot be lit cannot be rotated }
,xpTrack_Progress = 2
);
PXPTrackStyle = ^XPTrackStyle;
{
XPDrawTrack
This routine draws a track. You pass in the track dimensions and size; the
track picks the optimal orientation for these dimensions. Pass in the
track's minimum current and maximum values; the indicator will be
positioned appropriately. You can also specify whether the track is lit or
not.
}
PROCEDURE XPDrawTrack(
inX1 : Integer;
inY1 : Integer;
inX2 : Integer;
inY2 : Integer;
inMin : Integer;
inMax : Integer;
inValue : Integer;
inTrackStyle : XPTrackStyle;
inLit : Integer);
cdecl; external XPWIDGETS.DLL;
{
XPGetTrackDefaultDimensions
This routine returns a track's default smaller dimension; all tracks are
scalable in the larger dimension. It also returns whether a track can be
lit.
}
PROCEDURE XPGetTrackDefaultDimensions(
inStyle : XPTrackStyle;
outWidth : PInteger;
outCanBeLit : PInteger);
cdecl; external XPWIDGETS.DLL;
{
XPGetTrackMetrics
This routine returns the metrics of a track. If you want to write UI code
to manipulate a track, this routine helps you know where the mouse
locations are. For most other elements, the rectangle the element is drawn
in is enough information. However, the scrollbar drawing routine does some
automatic placement; this routine lets you know where things ended up. You
pass almost everything you would pass to the draw routine. You get out the
orientation, and other useful stuff.
Besides orientation, you get five dimensions for the five parts of a
scrollbar, which are the down button, down area (area before the thumb),
the thumb, and the up area and button. For horizontal scrollers, the left
button decreases; for vertical scrollers, the top button decreases.
}
PROCEDURE XPGetTrackMetrics(
inX1 : Integer;
inY1 : Integer;
inX2 : Integer;
inY2 : Integer;
inMin : Integer;
inMax : Integer;
inValue : Integer;
inTrackStyle : XPTrackStyle;
outIsVertical : PInteger;
outDownBtnSize : PInteger;
outDownPageSize : PInteger;
outThumbSize : PInteger;
outUpPageSize : PInteger;
outUpBtnSize : PInteger);
cdecl; external XPWIDGETS.DLL;
IMPLEMENTATION
END.
+427
View File
@@ -0,0 +1,427 @@
{
Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See
license.txt for usage. X-Plane SDK Version: 2.1.1
}
UNIT XPWidgetDefs;
INTERFACE
USES
XPLMDefs;
{$A4}
{___________________________________________________________________________
* WIDGET DEFINITIONS
___________________________________________________________________________}
{
A widget is a call-back driven screen entity like a push-button, window,
text entry field, etc.
Use the widget API to create widgets of various classes. You can nest them
into trees of widgets to create complex user interfaces.
}
TYPE
{
XPWidgetID
A Widget ID is an opaque unique non-zero handle identifying your widget.
Use 0 to specify "no widget". This type is defined as wide enough to hold a
pointer. You receive a widget ID when you create a new widget and then use
that widget ID to further refer to the widget.
}
XPWidgetID = pointer;
PXPWidgetID = ^XPWidgetID;
{
XPWidgetPropertyID
Properties are values attached to instances of your widgets. A property is
identified by a 32-bit ID and its value is the width of a pointer.
Each widget instance may have a property or not have it. When you set a
property on a widget for the first time, the property is added to the
widget; it then stays there for the life of the widget.
Some property IDs are predefined by the widget package; you can make up
your own property IDs as well.
}
XPWidgetPropertyID = (
{ A window's refcon is an opaque value used by client code to find other data}
{ based on it. }
xpProperty_Refcon = 0
{ These properties are used by the utlities to implement dragging. }
,xpProperty_Dragging = 1
,xpProperty_DragXOff = 2
,xpProperty_DragYOff = 3
{ Is the widget hilited? (For widgets that support this kind of thing.) }
,xpProperty_Hilited = 4
{ Is there a C++ object attached to this widget? }
,xpProperty_Object = 5
{ If this property is 1, the widget package will use OpenGL to restrict }
{ drawing to the Wiget's exposed rectangle. }
,xpProperty_Clip = 6
{ Is this widget enabled (for those that have a disabled state too)? }
,xpProperty_Enabled = 7
{ NOTE: Property IDs 1 - 999 are reserved for the widgets library. }
{ }
{ NOTE: Property IDs 1000 - 9999 are allocated to the standard widget classes}
{ provided with the library. }
{ }
{ Properties 1000 - 1099 are for widget class 0, 1100 - 1199 for widget class}
{ 1, etc. }
,xpProperty_UserStart = 10000
);
PXPWidgetPropertyID = ^XPWidgetPropertyID;
{
XPMouseState_t
When the mouse is clicked or dragged, a pointer to this structure is passed
to your widget function.
}
XPMouseState_t = RECORD
x : Integer;
y : Integer;
{ Mouse Button number, left = 0 (right button not yet supported. }
button : Integer;
{$IFDEF XPLM200}
{ Scroll wheel delta (button in this case would be the wheel axis number). }
delta : Integer;
{$ENDIF XPLM200}
END;
PXPMouseState_t = ^XPMouseState_t;
{
XPKeyState_t
When a key is pressed, a pointer to this struct is passed to your widget
function.
}
XPKeyState_t = RECORD
{ The ASCII key that was pressed. WARNING: this may be 0 for some non-ASCII }
{ key sequences. }
key : XPLMChar;
{ The flags. Make sure to check this if you only want key-downs! }
flags : XPLMKeyFlags;
{ The virtual key code for the key }
vkey : XPLMChar;
END;
PXPKeyState_t = ^XPKeyState_t;
{
XPWidgetGeometryChange_t
This structure contains the deltas for your widget's geometry when it
changes.
}
XPWidgetGeometryChange_t = RECORD
dx : Integer;
{ +Y = the widget moved up }
dy : Integer;
dwidth : Integer;
dheight : Integer;
END;
PXPWidgetGeometryChange_t = ^XPWidgetGeometryChange_t;
{
XPDispatchMode
The dispatching modes describe how the widgets library sends out messages.
Currently there are three modes:
}
XPDispatchMode = (
{ The message will only be sent to the target widget. }
xpMode_Direct = 0
{ The message is sent to the target widget, then up the chain of parents }
{ until the message is handled or a parentless widget is reached. }
,xpMode_UpChain = 1
{ The message is sent to the target widget and then all of its children }
{ recursively depth-first. }
,xpMode_Recursive = 2
{ The message is snet just to the target, but goes to every callback, even if}
{ it is handled. }
,xpMode_DirectAllCallbacks = 3
{ The message is only sent to the very first handler even if it is not }
{ accepted. (This is really only useful for some internal widget library }
{ functions.) }
,xpMode_Once = 4
);
PXPDispatchMode = ^XPDispatchMode;
{
XPWidgetClass
Widget classes define predefined widget types. A widget class basically
specifies from a library the widget function to be used for the widget.
Most widgets can be made right from classes.
}
XPWidgetClass = Integer;
PXPWidgetClass = ^XPWidgetClass;
CONST
{ An unspecified widget class. Other widget classes are in }
{ XPStandardWidgets.h }
xpWidgetClass_None = 0;
{___________________________________________________________________________
* WIDGET MESSAGES
___________________________________________________________________________}
{
XPWidgetMessage
Widgets receive 32-bit messages indicating what action is to be taken or
notifications of events. The list of messages may be expanded.
}
TYPE
XPWidgetMessage = (
{ No message, should not be sent. }
xpMsg_None = 0
{ The create message is sent once per widget that is created with your widget}
{ function and once for any widget that has your widget function attached. }
{ }
{ Dispatching: Direct }
{ }
{ Param 1: 1 if you are being added as a subclass, 0 if the widget is first }
{ being created. }
,xpMsg_Create = 1
{ The destroy message is sent once for each message that is destroyed that }
{ has your widget function. }
{ }
{ Dispatching: Direct for all }
{ }
{ Param 1: 1 if being deleted by a recursive delete to the parent, 0 for }
{ explicit deletion. }
,xpMsg_Destroy = 2
{ The paint message is sent to your widget to draw itself. The paint message }
{ is the bare-bones message; in response you must draw yourself, draw your }
{ children, set up clipping and culling, check for visibility, etc. If you }
{ don't want to do all of this, ignore the paint message and a draw message }
{ (see below) will be sent to you. }
{ }
{ Dispatching: Direct }
,xpMsg_Paint = 3
{ The draw message is sent to your widget when it is time to draw yourself. }
{ OpenGL will be set up to draw in 2-d global screen coordinates, but you }
{ should use the XPLM to set up OpenGL state. }
{ }
{ Dispatching: Direct }
,xpMsg_Draw = 4
{ The key press message is sent once per key that is pressed. The first }
{ parameter is the type of key code (integer or char) and the second is the }
{ code itself. By handling this event, you consume the key stroke. }
{ }
{ Handling this message 'consumes' the keystroke; not handling it passes it }
{ to your parent widget. }
{ }
{ Dispatching: Up Chain }
{ }
{ Param 1: A pointer to an XPKeyState_t structure with the keystroke. }
,xpMsg_KeyPress = 5
{ Keyboard focus is being given to you. By handling this message you accept }
{ keyboard focus. The first parameter will be one if a child of yours gave up}
{ focus to you, 0 if someone set focus on you explicitly. }
{ }
{ Handling this message accepts focus; not handling refuses focus. }
{ }
{ Dispatching: direct }
{ }
{ Param 1: 1 if you are gaining focus because your child is giving it up, 0 }
{ if someone is explicitly giving you focus. }
,xpMsg_KeyTakeFocus = 6
{ Keyboard focus is being taken away from you. The first parameter will be }
{ one if you are losing focus because another widget is taking it, or 0 if }
{ someone called the API to make you lose focus explicitly. }
{ }
{ Dispatching: Direct }
{ }
{ Param 1: 1 if focus is being taken by another widget, 0 if code requested }
{ to remove focus. }
,xpMsg_KeyLoseFocus = 7
{ You receive one mousedown event per click with a mouse-state structure }
{ pointed to by parameter 1, by accepting this you eat the click, otherwise }
{ your parent gets it. You will not receive drag and mouse up messages if you}
{ do not accept the down message. }
{ }
{ Handling this message consumes the mouse click, not handling it passes it }
{ to the next widget. You can act 'transparent' as a window by never handling}
{ moues clicks to certain areas. }
{ }
{ Dispatching: Up chain NOTE: Technically this is direct dispatched, but the }
{ widgets library will shop it to each widget until one consumes the click, }
{ making it effectively "up chain". }
{ }
{ Param 1: A pointer to an XPMouseState_t containing the mouse status. }
,xpMsg_MouseDown = 8
{ You receive a series of mouse drag messages (typically one per frame in the}
{ sim) as the mouse is moved once you have accepted a mouse down message. }
{ Parameter one points to a mouse-state structure describing the mouse }
{ location. You will continue to receive these until the mouse button is }
{ released. You may receive multiple mouse state messages with the same mouse}
{ position. You will receive mouse drag events even if the mouse is dragged }
{ out of your current or original bounds at the time of the mouse down. }
{ }
{ Dispatching: Direct }
{ }
{ Param 1: A pointer to an XPMouseState_t containing the mouse status. }
,xpMsg_MouseDrag = 9
{ The mouseup event is sent once when the mouse button is released after a }
{ drag or click. You only receive this message if you accept the mouseDown }
{ message. Parameter one points to a mouse state structure. }
{ }
{ Dispatching: Direct }
{ }
{ Param 1: A pointer to an XPMouseState_t containing the mouse status. }
,xpMsg_MouseUp = 10
{ Your geometry or a child's geometry is being changed. }
{ }
{ Dispatching: Up chain }
{ }
{ Param 1: The widget ID of the original reshaped target. }
{ }
{ Param 2: A pointer to a XPWidgetGeometryChange_t struct describing the }
{ change. }
,xpMsg_Reshape = 11
{ Your exposed area has changed. }
{ }
{ Dispatching: Direct }
,xpMsg_ExposedChanged = 12
{ A child has been added to you. The child's ID is passed in parameter one. }
{ }
{ Dispatching: Direct }
{ }
{ Param 1: The Widget ID of the child being added. }
,xpMsg_AcceptChild = 13
{ A child has been removed from to you. The child's ID is passed in parameter}
{ one. }
{ }
{ Dispatching: Direct }
{ }
{ Param 1: The Widget ID of the child being removed. }
,xpMsg_LoseChild = 14
{ You now have a new parent, or have no parent. The parent's ID is passed in,}
{ or 0 for no parent. }
{ }
{ Dispatching: Direct }
{ }
{ Param 1: The Widget ID of your parent }
,xpMsg_AcceptParent = 15
{ You or a child has been shown. Note that this does not include you being }
{ shown because your parent was shown, you were put in a new parent, your }
{ root was shown, etc. }
{ }
{ Dispatching: Up chain }
{ }
{ Param 1: The widget ID of the shown widget. }
,xpMsg_Shown = 16
{ You have been hidden. See limitations above. }
{ }
{ Dispatching: Up chain }
{ }
{ Param 1: The widget ID of the hidden widget. }
,xpMsg_Hidden = 17
{ Your descriptor has changed. }
{ }
{ Dispatching: Direct }
,xpMsg_DescriptorChanged = 18
{ A property has changed. Param 1 contains the property ID. }
{ }
{ Dispatching: Direct }
{ }
{ Param 1: The Property ID being changed. }
{ }
{ Param 2: The new property value }
,xpMsg_PropertyChanged = 19
{$IFDEF XPLM200}
{ The mouse wheel has moved. }
{ }
{ Return 1 to consume the mouse wheel move, or 0 to pass the message to a }
{ parent. Dispatching: Up chain }
{ }
{ Param 1: A pointer to an XPMouseState_t containing the mouse status. }
,xpMsg_MouseWheel = 20
{$ENDIF XPLM200}
{$IFDEF XPLM200}
{ The cursor is over your widget. If you consume this message, change the }
{ XPLMCursorStatus value to indicate the desired result, with the same rules }
{ as in XPLMDisplay.h. }
{ }
{ Return 1 to consume this message, 0 to pass it on. }
{ }
{ Dispatching: Up chain Param 1: A pointer to an XPMouseState_t struct }
{ containing the mouse status. }
{ }
{ Param 2: A pointer to a XPLMCursorStatus - set this to the cursor result }
{ you desire. }
,xpMsg_CursorAdjust = 21
{$ENDIF XPLM200}
{ NOTE: Message IDs 1000 - 9999 are allocated to the standard widget classes }
{ provided with the library with 1000 - 1099 for widget class 0, 1100 - 1199 }
{ for widget class 1, etc. Message IDs 10,000 and beyond are for plugin use. }
,xpMsg_UserStart = 10000
);
PXPWidgetMessage = ^XPWidgetMessage;
{___________________________________________________________________________
* WIDGET CALLBACK FUNCTION
___________________________________________________________________________}
{
XPWidgetFunc_t
This function defines your custom widget's behavior. It will be called by
the widgets library to send messages to your widget. The message and widget
ID are passed in, as well as two ptr-width signed parameters whose meaning
varies with the message. Return 1 to indicate that you have processed the
message, 0 to indicate that you have not. For any message that is not
understood, return 0.
}
TYPE
XPWidgetFunc_t = FUNCTION(
inMessage : XPWidgetMessage;
inWidget : XPWidgetID;
inParam1 : intptr_t;
inParam2 : intptr_t) : Integer; cdecl;
IMPLEMENTATION
END.
+197
View File
@@ -0,0 +1,197 @@
{
Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See
license.txt for usage. X-Plane SDK Version: 2.1.1
}
UNIT XPWidgetUtils;
INTERFACE
{
## USAGE NOTES
The XPWidgetUtils library contains useful functions that make writing and
using widgets less of a pain.
One set of functions are the widget behavior functions. These functions
each add specific useful behaviors to widgets. They can be used in two
manners:
1. You can add a widget behavior function to a widget as a callback proc
using the XPAddWidgetCallback function. The widget will gain that
behavior. Remember that the last function you add has highest priority.
You can use this to change or augment the behavior of an existing
finished widget.
2. You can call a widget function from inside your own widget function.
This allows you to include useful behaviors in custom-built widgets. A
number of the standard widgets get their behavior from this library. To
do this, call the behavior function from your function first. If it
returns 1, that means it handled the event and you don't need to; simply
return 1.
}
USES
XPWidgetDefs;
{$A4}
{___________________________________________________________________________
* GENERAL UTILITIES
___________________________________________________________________________}
{
XPWidgetCreate_t
This structure contains all of the parameters needed to create a wiget. It
is used with XPUCreateWidgets to create widgets in bulk from an array. All
parameters correspond to those of XPCreateWidget except for the container
index.
If the container index is equal to the index of a widget in the array, the
widget in the array passed to XPUCreateWidgets is used as the parent of
this widget. Note that if you pass an index greater than your own position
in the array, the parent you are requesting will not exist yet.
If the container index is NO_PARENT, the parent widget is specified as
NULL. If the container index is PARAM_PARENT, the widget passed into
XPUCreateWidgets is used.
}
TYPE
XPWidgetCreate_t = RECORD
left : Integer;
top : Integer;
right : Integer;
bottom : Integer;
visible : Integer;
descriptor : XPLMString;
{ Whether ethis widget is a root wiget }
isRoot : Integer;
{ The index of the widget to contain within, or a constant }
containerIndex : Integer;
widgetClass : XPWidgetClass;
END;
PXPWidgetCreate_t = ^XPWidgetCreate_t;
CONST
NO_PARENT = -1;
PARAM_PARENT = -2;
{
XPUCreateWidgets
This function creates a series of widgets from a table (see
XPCreateWidget_t above). Pass in an array of widget creation structures and
an array of widget IDs that will receive each widget.
Widget parents are specified by index into the created widget table,
allowing you to create nested widget structures. You can create multiple
widget trees in one table. Generally you should create widget trees from
the top down.
You can also pass in a widget ID that will be used when the widget's parent
is listed as PARAM_PARENT; this allows you to embed widgets created with
XPUCreateWidgets in a widget created previously.
}
PROCEDURE XPUCreateWidgets(
inWidgetDefs : PXPWidgetCreate_t;
inCount : Integer;
inParamParent : XPWidgetID;
ioWidgets : PXPWidgetID);
cdecl; external XPWIDGETS.DLL;
{
XPUMoveWidgetBy
Simply moves a widget by an amount, +x = right, +y=up, without resizing the
widget.
}
PROCEDURE XPUMoveWidgetBy(
inWidget : XPWidgetID;
inDeltaX : Integer;
inDeltaY : Integer);
cdecl; external XPWIDGETS.DLL;
{___________________________________________________________________________
* LAYOUT MANAGERS
___________________________________________________________________________}
{
The layout managers are widget behavior functions for handling where
widgets move. Layout managers can be called from a widget function or
attached to a widget later.
}
{
XPUFixedLayout
This function causes the widget to maintain its children in fixed position
relative to itself as it is resized. Use this on the top level 'window'
widget for your window.
}
FUNCTION XPUFixedLayout(
inMessage : XPWidgetMessage;
inWidget : XPWidgetID;
inParam1 : intptr_t;
inParam2 : intptr_t) : Integer;
cdecl; external XPWIDGETS.DLL;
{___________________________________________________________________________
* WIDGET PROC BEHAVIORS
___________________________________________________________________________}
{
These widget behavior functions add other useful behaviors to widgets.
These functions cannot be attached to a widget; they must be called from
your widget function.
}
{
XPUSelectIfNeeded
This causes the widget to bring its window to the foreground if it is not
already. inEatClick specifies whether clicks in the background should be
consumed by bringin the window to the foreground.
}
FUNCTION XPUSelectIfNeeded(
inMessage : XPWidgetMessage;
inWidget : XPWidgetID;
inParam1 : intptr_t;
inParam2 : intptr_t;
inEatClick : Integer) : Integer;
cdecl; external XPWIDGETS.DLL;
{
XPUDefocusKeyboard
This causes a click in the widget to send keyboard focus back to X-Plane.
This stops editing of any text fields, etc.
}
FUNCTION XPUDefocusKeyboard(
inMessage : XPWidgetMessage;
inWidget : XPWidgetID;
inParam1 : intptr_t;
inParam2 : intptr_t;
inEatClick : Integer) : Integer;
cdecl; external XPWIDGETS.DLL;
{
XPUDragWidget
XPUDragWidget drags the widget in response to mouse clicks. Pass in not
only the event, but the global coordinates of the drag region, which might
be a sub-region of your widget (for example, a title bar).
}
FUNCTION XPUDragWidget(
inMessage : XPWidgetMessage;
inWidget : XPWidgetID;
inParam1 : intptr_t;
inParam2 : intptr_t;
inLeft : Integer;
inTop : Integer;
inRight : Integer;
inBottom : Integer) : Integer;
cdecl; external XPWIDGETS.DLL;
IMPLEMENTATION
END.
+527
View File
@@ -0,0 +1,527 @@
{
Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See
license.txt for usage. X-Plane SDK Version: 2.1.1
}
UNIT XPWidgets;
INTERFACE
{
## THEORY OF OPERATION AND NOTES
Widgets are persistent view 'objects' for X-Plane. A widget is an object
referenced by its opaque handle (widget ID) and the APIs in this file. You
cannot access the widget's guts directly. Every Widget has the following
intrinsic data:
- A bounding box defined in global screen coordinates with 0,0 in the
bottom left and +y = up, +x = right.
- A visible box, which is the intersection of the bounding box with the
widget's parents visible box.
- Zero or one parent widgets. (Always zero if the widget is a root widget.
- Zero or more child widgets.
- Whether the widget is a root. Root widgets are the top level plugin
windows.
- Whether the widget is visible.
- A text string descriptor, whose meaning varies from widget to widget.
- An arbitrary set of 32 bit integral properties defined by 32-bit integral
keys. This is how specific widgets store specific data.
- A list of widget callbacks proc that implements the widgets behaviors.
The Widgets library sends messages to widgets to request specific behaviors
or notify the widget of things.
Widgets may have more than one callback function, in which case messages
are sent to the most recently added callback function until the message is
handled. Messages may also be sent to parents or children; see the
XPWidgetDefs.h header file for the different widget message dispatching
functions. By adding a callback function to a window you can 'subclass' its
behavior.
A set of standard widgets are provided that serve common UI purposes. You
can also customize or implement entirely custom widgets.
Widgets are different than other view hierarchies (most notably Win32,
which they bear a striking resemblance to) in the following ways:
- Not all behavior can be patched. State that is managed by the XPWidgets
DLL and not by individual widgets cannot be customized.
- All coordinates are in global screen coordinates. Coordinates are not
relative to an enclosing widget, nor are they relative to a display
window.
- Widget messages are always dispatched synchronously, and there is no
concept of scheduling an update or a dirty region. Messages originate
from X-Plane as the sim cycle goes by. Since X-Plane is constantly
redrawing, so are widgets; there is no need to mark a part of a widget as
'needing redrawing' because redrawing happens frequently whether the
widget needs it or not.
- Any widget may be a 'root' widget, causing it to be drawn; there is no
relationship between widget class and rootness. Root widgets are
imlemented as XPLMDisply windows.
}
USES
XPWidgetDefs, XPLMDisplay;
{$A4}
{___________________________________________________________________________
* WIDGET CREATION AND MANAGEMENT
___________________________________________________________________________}
{
XPCreateWidget
This function creates a new widget and returns the new widget's ID to you.
If the widget creation fails for some reason, it returns NULL. Widget
creation will fail either if you pass a bad class ID or if there is not
adequate memory.
Input Parameters:
- Top, left, bottom, and right in global screen coordinates defining the
widget's location on the screen.
- inVisible is 1 if the widget should be drawn, 0 to start the widget as
hidden.
- inDescriptor is a null terminated string that will become the widget's
descriptor.
- inIsRoot is 1 if this is going to be a root widget, 0 if it will not be.
- inContainer is the ID of this widget's container. It must be 0 for a root
widget. for a non-root widget, pass the widget ID of the widget to place
this widget within. If this widget is not going to start inside another
widget, pass 0; this new widget will then just be floating off in space
(and will not be drawn until it is placed in a widget.
- inClass is the class of the widget to draw. Use one of the predefined
class-IDs to create a standard widget.
A note on widget embedding: a widget is only called (and will be drawn,
etc.) if it is placed within a widget that will be called. Root widgets are
always called. So it is possible to have whole chains of widgets that are
simply not called. You can preconstruct widget trees and then place them
into root widgets later to activate them if you wish.
}
FUNCTION XPCreateWidget(
inLeft : Integer;
inTop : Integer;
inRight : Integer;
inBottom : Integer;
inVisible : Integer;
inDescriptor : XPLMString;
inIsRoot : Integer;
inContainer : XPWidgetID;
inClass : XPWidgetClass) : XPWidgetID;
cdecl; external XPWIDGETS.DLL;
{
XPCreateCustomWidget
This function is the same as XPCreateWidget except that instead of passing
a class ID, you pass your widget callback function pointer defining the
widget. Use this function to define a custom widget. All parameters are the
same as XPCreateWidget, except that the widget class has been replaced with
the widget function.
}
FUNCTION XPCreateCustomWidget(
inLeft : Integer;
inTop : Integer;
inRight : Integer;
inBottom : Integer;
inVisible : Integer;
inDescriptor : XPLMString;
inIsRoot : Integer;
inContainer : XPWidgetID;
inCallback : XPWidgetFunc_t) : XPWidgetID;
cdecl; external XPWIDGETS.DLL;
{
XPDestroyWidget
This class destroys a widget. Pass in the ID of the widget to kill. If you
pass 1 for inDestroyChilren, the widget's children will be destroyed first,
then this widget will be destroyed. (Furthermore, the widget's children
will be destroyed with the inDestroyChildren flag set to 1, so the
destruction will recurse down the widget tree.) If you pass 0 for this
flag, the child widgets will simply end up with their parent set to 0.
}
PROCEDURE XPDestroyWidget(
inWidget : XPWidgetID;
inDestroyChildren : Integer);
cdecl; external XPWIDGETS.DLL;
{
XPSendMessageToWidget
This sends any message to a widget. You should probably not go around
simulating the predefined messages that the widgets library defines for
you. You may however define custom messages for your widgets and send them
with this method.
This method supports several dispatching patterns; see XPDispatchMode for
more info. The function returns 1 if the message was handled, 0 if it was
not.
For each widget that receives the message (see the dispatching modes), each
widget function from the most recently installed to the oldest one receives
the message in order until it is handled.
}
FUNCTION XPSendMessageToWidget(
inWidget : XPWidgetID;
inMessage : XPWidgetMessage;
inMode : XPDispatchMode;
inParam1 : intptr_t;
inParam2 : intptr_t) : Integer;
cdecl; external XPWIDGETS.DLL;
{___________________________________________________________________________
* WIDGET POSITIONING AND VISIBILITY
___________________________________________________________________________}
{
XPPlaceWidgetWithin
This function changes which container a widget resides in. You may NOT use
this function on a root widget! inSubWidget is the widget that will be
moved. Pass a widget ID in inContainer to make inSubWidget be a child of
inContainer. It will become the last/closest widget in the container. Pass
0 to remove the widget from any container. Any call to this other than
passing the widget ID of the old parent of the affected widget will cause
the widget to be removed from its old parent. Placing a widget within its
own parent simply makes it the last widget.
NOTE: this routine does not reposition the sub widget in global
coordinates. If the container has layout management code, it will
reposition the subwidget for you, otherwise you must do it with
SetWidgetGeometry.
}
PROCEDURE XPPlaceWidgetWithin(
inSubWidget : XPWidgetID;
inContainer : XPWidgetID);
cdecl; external XPWIDGETS.DLL;
{
XPCountChildWidgets
This routine returns the number of widgets another widget contains.
}
FUNCTION XPCountChildWidgets(
inWidget : XPWidgetID) : Integer;
cdecl; external XPWIDGETS.DLL;
{
XPGetNthChildWidget
This routine returns the widget ID of a child widget by index. Indexes are
0 based, from 0 to one minus the number of widgets in the parent,
inclusive. If the index is invalid, 0 is returned.
}
FUNCTION XPGetNthChildWidget(
inWidget : XPWidgetID;
inIndex : Integer) : XPWidgetID;
cdecl; external XPWIDGETS.DLL;
{
XPGetParentWidget
Returns the parent of a widget, or 0 if the widget has no parent. Root
widgets never have parents and therefore always return 0.
}
FUNCTION XPGetParentWidget(
inWidget : XPWidgetID) : XPWidgetID;
cdecl; external XPWIDGETS.DLL;
{
XPShowWidget
This routine makes a widget visible if it is not already. Note that if a
widget is not in a rooted widget hierarchy or one of its parents is not
visible, it will still not be visible to the user.
}
PROCEDURE XPShowWidget(
inWidget : XPWidgetID);
cdecl; external XPWIDGETS.DLL;
{
XPHideWidget
Makes a widget invisible. See XPShowWidget for considerations of when a
widget might not be visible despite its own visibility state.
}
PROCEDURE XPHideWidget(
inWidget : XPWidgetID);
cdecl; external XPWIDGETS.DLL;
{
XPIsWidgetVisible
This returns 1 if a widget is visible, 0 if it is not. Note that this
routine takes into consideration whether a parent is invisible. Use this
routine to tell if the user can see the widget.
}
FUNCTION XPIsWidgetVisible(
inWidget : XPWidgetID) : Integer;
cdecl; external XPWIDGETS.DLL;
{
XPFindRootWidget
Returns the Widget ID of the root widget that contains the passed in widget
or NULL if the passed in widget is not in a rooted hierarchy.
}
FUNCTION XPFindRootWidget(
inWidget : XPWidgetID) : XPWidgetID;
cdecl; external XPWIDGETS.DLL;
{
XPBringRootWidgetToFront
This routine makes the specified widget be in the front most widget
hierarchy. If this widget is a root widget, its widget hierarchy comes to
front, otherwise the widget's root is brought to the front. If this widget
is not in an active widget hiearchy (e.g. there is no root widget at the
top of the tree), this routine does nothing.
}
PROCEDURE XPBringRootWidgetToFront(
inWidget : XPWidgetID);
cdecl; external XPWIDGETS.DLL;
{
XPIsWidgetInFront
This routine returns true if this widget's hierarchy is the front most
hierarchy. It returns false if the widget's hierarchy is not in front, or
if the widget is not in a rooted hierarchy.
}
FUNCTION XPIsWidgetInFront(
inWidget : XPWidgetID) : Integer;
cdecl; external XPWIDGETS.DLL;
{
XPGetWidgetGeometry
This routine returns the bounding box of a widget in global coordinates.
Pass NULL for any parameter you are not interested in.
}
PROCEDURE XPGetWidgetGeometry(
inWidget : XPWidgetID;
outLeft : PInteger; { Can be nil }
outTop : PInteger; { Can be nil }
outRight : PInteger; { Can be nil }
outBottom : PInteger); { Can be nil }
cdecl; external XPWIDGETS.DLL;
{
XPSetWidgetGeometry
This function changes the bounding box of a widget.
}
PROCEDURE XPSetWidgetGeometry(
inWidget : XPWidgetID;
inLeft : Integer;
inTop : Integer;
inRight : Integer;
inBottom : Integer);
cdecl; external XPWIDGETS.DLL;
{
XPGetWidgetForLocation
Given a widget and a location, this routine returns the widget ID of the
child of that widget that owns that location. If inRecursive is true then
this will return a child of a child of a widget as it tries to find the
deepest widget at that location. If inVisibleOnly is true, then only
visible widgets are considered, otherwise all widgets are considered. The
widget ID passed for inContainer will be returned if the location is in
that widget but not in a child widget. 0 is returned if the location is not
in the container.
NOTE: if a widget's geometry extends outside its parents geometry, it will
not be returned by this call for mouse locations outside the parent
geometry. The parent geometry limits the child's eligibility for mouse
location.
}
FUNCTION XPGetWidgetForLocation(
inContainer : XPWidgetID;
inXOffset : Integer;
inYOffset : Integer;
inRecursive : Integer;
inVisibleOnly : Integer) : XPWidgetID;
cdecl; external XPWIDGETS.DLL;
{
XPGetWidgetExposedGeometry
This routine returns the bounds of the area of a widget that is completely
within its parent widgets. Since a widget's bounding box can be outside its
parent, part of its area will not be elligible for mouse clicks and should
not draw. Use XPGetWidgetGeometry to find out what area defines your
widget's shape, but use this routine to find out what area to actually draw
into. Note that the widget library does not use OpenGL clipping to keep
frame rates up, although you could use it internally.
}
PROCEDURE XPGetWidgetExposedGeometry(
inWidgetID : XPWidgetID;
outLeft : PInteger; { Can be nil }
outTop : PInteger; { Can be nil }
outRight : PInteger; { Can be nil }
outBottom : PInteger); { Can be nil }
cdecl; external XPWIDGETS.DLL;
{___________________________________________________________________________
* ACCESSING WIDGET DATA
___________________________________________________________________________}
{
XPSetWidgetDescriptor
Every widget has a descriptor, which is a text string. What the text string
is used for varies from widget to widget; for example, a push button's text
is its descriptor, a caption shows its descriptor, and a text field's
descriptor is the text being edited. In other words, the usage for the text
varies from widget to widget, but this API provides a universal and
convenient way to get at it. While not all UI widgets need their
descriptor, many do.
}
PROCEDURE XPSetWidgetDescriptor(
inWidget : XPWidgetID;
inDescriptor : XPLMString);
cdecl; external XPWIDGETS.DLL;
{
XPGetWidgetDescriptor
This routine returns the widget's descriptor. Pass in the length of the
buffer you are going to receive the descriptor in. The descriptor will be
null terminated for you. This routine returns the length of the actual
descriptor; if you pass NULL for outDescriptor, you can get the
descriptor's length without getting its text. If the length of the
descriptor exceeds your buffer length, the buffer will not be null
terminated (this routine has 'strncpy' semantics).
}
FUNCTION XPGetWidgetDescriptor(
inWidget : XPWidgetID;
outDescriptor : XPLMString;
inMaxDescLength : Integer) : Integer;
cdecl; external XPWIDGETS.DLL;
{
XPGetWidgetUnderlyingWindow
Returns the window (from the XPLMDisplay API) that backs your widget
window. If you have opted in to modern windows, via a call to
XPLMEnableFeature("XPLM_USE_NATIVE_WIDGET_WINDOWS", 1), you can use the
returned window ID for display APIs like XPLMSetWindowPositioningMode(),
allowing you to pop the widget window out into a real OS window, or move it
into VR.
}
FUNCTION XPGetWidgetUnderlyingWindow(
inWidget : XPWidgetID) : XPLMWindowID;
cdecl; external XPWIDGETS.DLL;
{
XPSetWidgetProperty
This function sets a widget's property. Properties are arbitrary values
associated by a widget by ID.
}
PROCEDURE XPSetWidgetProperty(
inWidget : XPWidgetID;
inProperty : XPWidgetPropertyID;
inValue : intptr_t);
cdecl; external XPWIDGETS.DLL;
{
XPGetWidgetProperty
This routine returns the value of a widget's property, or 0 if the property
is not defined. If you need to know whether the property is defined, pass a
pointer to an int for inExists; the existence of that property will be
returned in the int. Pass NULL for inExists if you do not need this
information.
}
FUNCTION XPGetWidgetProperty(
inWidget : XPWidgetID;
inProperty : XPWidgetPropertyID;
inExists : PInteger) : intptr_t; { Can be nil }
cdecl; external XPWIDGETS.DLL;
{___________________________________________________________________________
* KEYBOARD MANAGEMENT
___________________________________________________________________________}
{
XPSetKeyboardFocus
Controls which widget will receive keystrokes. Pass the widget ID of the
widget to get the keys. Note that if the widget does not care about
keystrokes, they will go to the parent widget, and if no widget cares about
them, they go to X-Plane.
If you set the keyboard focus to widget ID 0, X-Plane gets keyboard focus.
This routine returns the widget ID that ended up with keyboard focus, or 0
for X-Plane.
Keyboard focus is not changed if the new widget will not accept it. For
setting to X-Plane, keyboard focus is always accepted.
}
FUNCTION XPSetKeyboardFocus(
inWidget : XPWidgetID) : XPWidgetID;
cdecl; external XPWIDGETS.DLL;
{
XPLoseKeyboardFocus
This causes the specified widget to lose focus; focus is passed to its
parent, or the next parent that will accept it. This routine does nothing
if this widget does not have focus.
}
PROCEDURE XPLoseKeyboardFocus(
inWidget : XPWidgetID);
cdecl; external XPWIDGETS.DLL;
{
XPGetWidgetWithFocus
This routine returns the widget that has keyboard focus, or 0 if X-Plane
has keyboard focus or some other plugin window that does not have widgets
has focus.
}
FUNCTION XPGetWidgetWithFocus: XPWidgetID;
cdecl; external XPWIDGETS.DLL;
{___________________________________________________________________________
* CREATING CUSTOM WIDGETS
___________________________________________________________________________}
{
XPAddWidgetCallback
This function adds a new widget callback to a widget. This widget callback
supercedes any existing ones and will receive messages first; if it does
not handle messages they will go on to be handled by pre-existing widgets.
The widget function will remain on the widget for the life of the widget.
The creation message will be sent to the new callback immediately with the
widget ID, and the destruction message will be sent before the other widget
function receives a destruction message.
This provides a way to 'subclass' an existing widget. By providing a second
hook that only handles certain widget messages, you can customize or extend
widget behavior.
}
PROCEDURE XPAddWidgetCallback(
inWidget : XPWidgetID;
inNewCallback : XPWidgetFunc_t);
cdecl; external XPWIDGETS.DLL;
{
XPGetWidgetClassFunc
Given a widget class, this function returns the callbacks that power that
widget class.
}
FUNCTION XPGetWidgetClassFunc(
inWidgetClass : XPWidgetClass) : XPWidgetFunc_t;
cdecl; external XPWIDGETS.DLL;
IMPLEMENTATION
END.
+155
View File
@@ -0,0 +1,155 @@
{
Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See
license.txt for usage. X-Plane SDK Version: 2.1.1
}
UNIT XPLMCamera;
INTERFACE
{
The XPLMCamera APIs allow plug-ins to control the camera angle in X-Plane.
This has a number of applications, including but not limited to:
- Creating new views (including dynamic/user-controllable views) for the
user.
- Creating applications that use X-Plane as a renderer of scenery,
aircrafts, or both.
The camera is controlled via six parameters: a location in OpenGL
coordinates and pitch, roll and yaw, similar to an airplane's position.
OpenGL coordinate info is described in detail in the XPLMGraphics
documentation; generally you should use the XPLMGraphics routines to
convert from world to local coordinates. The camera's orientation starts
facing level with the ground directly up the negative-Z axis (approximately
north) with the horizon horizontal. It is then rotated clockwise for yaw,
pitched up for positive pitch, and rolled clockwise around the vector it is
looking along for roll.
You control the camera either either until the user selects a new view or
permanently (the later being similar to how UDP camera control works). You
control the camera by registering a callback per frame from which you
calculate the new camera positions. This guarantees smooth camera motion.
Use the XPLMDataAccess APIs to get information like the position of the
aircraft, etc. for complex camera positioning.
Note: if your goal is to move the virtual pilot in the cockpit, this API is
not needed; simply update the datarefs for the pilot's head position.
For custom exterior cameras, set the camera's mode to an external view
first to get correct sound and 2-d panel behavior.
}
USES
XPLMDefs;
{$A4}
{___________________________________________________________________________
* CAMERA CONTROL
___________________________________________________________________________}
{
XPLMCameraControlDuration
This enumeration states how long you want to retain control of the camera.
You can retain it indefinitely or until the user selects a new view.
}
TYPE
XPLMCameraControlDuration = (
{ Control the camera until the user picks a new view. }
xplm_ControlCameraUntilViewChanges = 1
{ Control the camera until your plugin is disabled or another plugin forcably}
{ takes control. }
,xplm_ControlCameraForever = 2
);
PXPLMCameraControlDuration = ^XPLMCameraControlDuration;
{
XPLMCameraPosition_t
This structure contains a full specification of the camera. X, Y, and Z are
the camera's position in OpenGL coordiantes; pitch, roll, and yaw are
rotations from a camera facing flat north in degrees. Positive pitch means
nose up, positive roll means roll right, and positive yaw means yaw right,
all in degrees. Zoom is a zoom factor, with 1.0 meaning normal zoom and 2.0
magnifying by 2x (objects appear larger).
}
XPLMCameraPosition_t = RECORD
x : Single;
y : Single;
z : Single;
pitch : Single;
heading : Single;
roll : Single;
zoom : Single;
END;
PXPLMCameraPosition_t = ^XPLMCameraPosition_t;
{
XPLMCameraControl_f
You use an XPLMCameraControl function to provide continuous control over
the camera. You are passed in a structure in which to put the new camera
position; modify it and return 1 to reposition the camera. Return 0 to
surrender control of the camera; camera control will be handled by X-Plane
on this draw loop. The contents of the structure as you are called are
undefined.
If X-Plane is taking camera control away from you, this function will be
called with inIsLosingControl set to 1 and ioCameraPosition NULL.
}
XPLMCameraControl_f = FUNCTION(
outCameraPosition : PXPLMCameraPosition_t; { Can be nil }
inIsLosingControl : Integer;
inRefcon : pointer) : Integer; cdecl;
{
XPLMControlCamera
This function repositions the camera on the next drawing cycle. You must
pass a non-null control function. Specify in inHowLong how long you'd like
control (indefinitely or until a new view mode is set by the user).
}
PROCEDURE XPLMControlCamera(
inHowLong : XPLMCameraControlDuration;
inControlFunc : XPLMCameraControl_f;
inRefcon : pointer);
cdecl; external XPLM_DLL;
{
XPLMDontControlCamera
This function stops you from controlling the camera. If you have a camera
control function, it will not be called with an inIsLosingControl flag.
X-Plane will control the camera on the next cycle.
For maximum compatibility you should not use this routine unless you are in
posession of the camera.
}
PROCEDURE XPLMDontControlCamera;
cdecl; external XPLM_DLL;
{
XPLMIsCameraBeingControlled
This routine returns 1 if the camera is being controlled, zero if it is
not. If it is and you pass in a pointer to a camera control duration, the
current control duration will be returned.
}
FUNCTION XPLMIsCameraBeingControlled(
outCameraControlDuration: PXPLMCameraControlDuration) : Integer; { Can be nil }
cdecl; external XPLM_DLL;
{
XPLMReadCameraPosition
This function reads the current camera position.
}
PROCEDURE XPLMReadCameraPosition(
outCameraPosition : PXPLMCameraPosition_t);
cdecl; external XPLM_DLL;
IMPLEMENTATION
END.
+690
View File
@@ -0,0 +1,690 @@
{
Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See
license.txt for usage. X-Plane SDK Version: 2.1.1
}
UNIT XPLMDataAccess;
INTERFACE
{
The data access API gives you a generic, flexible, high performance way to
read and write data to and from X-Plane and other plug-ins. For example,
this API allows you to read and set the nav radios, get the plane location,
determine the current effective graphics frame rate, etc.
The data access APIs are the way that you read and write data from the sim
as well as other plugins.
The API works using opaque data references. A data reference is a source of
data; you do not know where it comes from, but once you have it you can
read the data quickly and possibly write it.
Dataref Lookup
--------------
Data references are identified by verbose, permanent string names; by
convention these names use path separates to form a hierarchy of datarefs,
e.g. (sim/cockpit/radios/nav1_freq_hz). The actual opaque numeric value of
the data reference, as returned by the XPLM API, is implementation defined
and changes each time X-Plane is launched; therefore you need to look up
the dataref by path every time your plugin runs.
The task of looking up a data reference is relatively expensive; look up
your data references once based on the verbose path strings, and save the
opaque data reference value for the duration of your plugin's operation.
Reading and writing data references is relatively fast (the cost is
equivalent to two function calls through function pointers).
X-Plane publishes over 4000 datarefs; a complete list may be found in the
reference section of the SDK online documentation (from the SDK home page,
choose Documentation).
Dataref Types
-------------
A note on typing: you must know the correct data type to read and write.
APIs are provided for reading and writing data in a number of ways. You can
also double check the data type for a data ref. Automatic type conversion
is not done for you.
Dataref types are a set, e.g. a dataref can be more than one type. When
this happens, you can choose which API you want to use to read. For
example, it is not uncommon for a dataref to be of type float and double.
This means you can use either XPLMGetDatad or XPLMGetDataf to read it.
Creating New Datarefs
---------------------
X-Plane provides datarefs that come with the sim, but plugins can also
create their own datarefs. A plugin creates a dataref by registering
function callbacks to read and write the dataref. The XPLM will call your
plugin each time some other plugin (or X-Plane) tries to read or write the
dataref. You must provide a read (and optional write) callback for each
data type you support.
A note for plugins sharing data with other plugins: the load order of
plugins is not guaranteed. To make sure that every plugin publishing data
has published their data references before other plugins try to subscribe,
publish your data references in your start routine but resolve them the
first time your 'enable' routine is called, or the first time they are
needed in code.
When a plugin that created a dataref is unloaded, it becomes "orphaned".
The dataref handle continues to be usable, but the dataref is not writable,
and reading it will always return 0 (or 0 items for arrays). If the plugin
is reloaded and re-registers the dataref, the handle becomes un-orphaned
and works again.
}
USES
XPLMDefs;
{$A4}
{___________________________________________________________________________
* READING AND WRITING DATA
___________________________________________________________________________}
{
These routines allow you to access data from within X-Plane and sometimes
modify it.
}
TYPE
{
XPLMDataRef
A data ref is an opaque handle to data provided by the simulator or another
plugin. It uniquely identifies one variable (or array of variables) over
the lifetime of your plugin. You never hard code these values; you always
get them from XPLMFindDataRef.
}
XPLMDataRef = pointer;
PXPLMDataRef = ^XPLMDataRef;
{
XPLMDataTypeID
This is an enumeration that defines the type of the data behind a data
reference. This allows you to sanity check that the data type matches what
you expect. But for the most part, you will know the type of data you are
expecting from the online documentation.
Data types each take a bit field; it is legal to have a single dataref be
more than one type of data. Whe this happens, you can pick any matching
get/set API.
}
XPLMDataTypeID = (
{ Data of a type the current XPLM doesn't do. }
xplmType_Unknown = 0
{ A single 4-byte integer, native endian. }
,xplmType_Int = 1
{ A single 4-byte float, native endian. }
,xplmType_Float = 2
{ A single 8-byte double, native endian. }
,xplmType_Double = 4
{ An array of 4-byte floats, native endian. }
,xplmType_FloatArray = 8
{ An array of 4-byte integers, native endian. }
,xplmType_IntArray = 16
{ A variable block of data. }
,xplmType_Data = 32
);
PXPLMDataTypeID = ^XPLMDataTypeID;
{
XPLMFindDataRef
Given a c-style string that names the data ref, this routine looks up the
actual opaque XPLMDataRef that you use to read and write the data. The
string names for datarefs are published on the X-Plane SDK web site.
This function returns NULL if the data ref cannot be found.
NOTE: this function is relatively expensive; save the XPLMDataRef this
function returns for future use. Do not look up your data ref by string
every time you need to read or write it.
}
FUNCTION XPLMFindDataRef(
inDataRefName : XPLMString) : XPLMDataRef;
cdecl; external XPLM_DLL;
{
XPLMCanWriteDataRef
Given a data ref, this routine returns true if you can successfully set the
data, false otherwise. Some datarefs are read-only.
NOTE: even if a dataref is marked writable, it may not act writable. This
can happen for datarefs that X-Plane writes to on every frame of
simulation. In some cases, the dataref is writable but you have to set a
separate "override" dataref to 1 to stop X-Plane from writing it.
}
FUNCTION XPLMCanWriteDataRef(
inDataRef : XPLMDataRef) : Integer;
cdecl; external XPLM_DLL;
{
XPLMIsDataRefGood
This function returns true if the passed in handle is a valid dataref that
is not orphaned.
Note: there is normally no need to call this function; datarefs returned by
XPLMFindDataRef remain valid (but possibly orphaned) unless there is a
complete plugin reload (in which case your plugin is reloaded anyway).
Orphaned datarefs can be safely read and return 0. Therefore you never need
to call XPLMIsDataRefGood to 'check' the safety of a dataref.
(XPLMIsDatarefGood performs some slow checking of the handle validity, so
it has a perormance cost.)
}
FUNCTION XPLMIsDataRefGood(
inDataRef : XPLMDataRef) : Integer;
cdecl; external XPLM_DLL;
{
XPLMGetDataRefTypes
This routine returns the types of the data ref for accessor use. If a data
ref is available in multiple data types, the bit-wise OR of these types
will be returned.
}
FUNCTION XPLMGetDataRefTypes(
inDataRef : XPLMDataRef) : XPLMDataTypeID;
cdecl; external XPLM_DLL;
{___________________________________________________________________________
* DATA ACCESSORS
___________________________________________________________________________}
{
These routines read and write the data references. For each supported data
type there is a reader and a writer.
If the data ref is orphaned or the plugin that provides it is disabled or
there is a type mismatch, the functions that read data will return 0 as a
default value or not modify the passed in memory. The plugins that write
data will not write under these circumstances or if the data ref is
read-only.
NOTE: to keep the overhead of reading datarefs low, these routines do not
do full validation of a dataref; passing a junk value for a dataref can
result in crashing the sim. The get/set APIs do check for NULL.
For array-style datarefs, you specify the number of items to read/write and
the offset into the array; the actual number of items read or written is
returned. This may be less to prevent an array-out-of-bounds error.
}
{
XPLMGetDatai
Read an integer data ref and return its value. The return value is the
dataref value or 0 if the dataref is NULL or the plugin is disabled.
}
FUNCTION XPLMGetDatai(
inDataRef : XPLMDataRef) : Integer;
cdecl; external XPLM_DLL;
{
XPLMSetDatai
Write a new value to an integer data ref. This routine is a no-op if the
plugin publishing the dataref is disabled, the dataref is NULL, or the
dataref is not writable.
}
PROCEDURE XPLMSetDatai(
inDataRef : XPLMDataRef;
inValue : Integer);
cdecl; external XPLM_DLL;
{
XPLMGetDataf
Read a single precision floating point dataref and return its value. The
return value is the dataref value or 0.0 if the dataref is NULL or the
plugin is disabled.
}
FUNCTION XPLMGetDataf(
inDataRef : XPLMDataRef) : Single;
cdecl; external XPLM_DLL;
{
XPLMSetDataf
Write a new value to a single precision floating point data ref. This
routine is a no-op if the plugin publishing the dataref is disabled, the
dataref is NULL, or the dataref is not writable.
}
PROCEDURE XPLMSetDataf(
inDataRef : XPLMDataRef;
inValue : Single);
cdecl; external XPLM_DLL;
{
XPLMGetDatad
Read a double precision floating point dataref and return its value. The
return value is the dataref value or 0.0 if the dataref is NULL or the
plugin is disabled.
}
FUNCTION XPLMGetDatad(
inDataRef : XPLMDataRef) : Real;
cdecl; external XPLM_DLL;
{
XPLMSetDatad
Write a new value to a double precision floating point data ref. This
routine is a no-op if the plugin publishing the dataref is disabled, the
dataref is NULL, or the dataref is not writable.
}
PROCEDURE XPLMSetDatad(
inDataRef : XPLMDataRef;
inValue : Real);
cdecl; external XPLM_DLL;
{
XPLMGetDatavi
Read a part of an integer array dataref. If you pass NULL for outValues,
the routine will return the size of the array, ignoring inOffset and inMax.
If outValues is not NULL, then up to inMax values are copied from the
dataref into outValues, starting at inOffset in the dataref. If inMax +
inOffset is larger than the size of the dataref, less than inMax values
will be copied. The number of values copied is returned.
Note: the semantics of array datarefs are entirely implemented by the
plugin (or X-Plane) that provides the dataref, not the SDK itself; the
above description is how these datarefs are intended to work, but a rogue
plugin may have different behavior.
}
FUNCTION XPLMGetDatavi(
inDataRef : XPLMDataRef;
outValues : PInteger; { Can be nil }
inOffset : Integer;
inMax : Integer) : Integer;
cdecl; external XPLM_DLL;
{
XPLMSetDatavi
Write part or all of an integer array dataref. The values passed by
inValues are written into the dataref starting at inOffset. Up to inCount
values are written; however if the values would write "off the end" of the
dataref array, then fewer values are written.
Note: the semantics of array datarefs are entirely implemented by the
plugin (or X-Plane) that provides the dataref, not the SDK itself; the
above description is how these datarefs are intended to work, but a rogue
plugin may have different behavior.
}
PROCEDURE XPLMSetDatavi(
inDataRef : XPLMDataRef;
inValues : PInteger;
inoffset : Integer;
inCount : Integer);
cdecl; external XPLM_DLL;
{
XPLMGetDatavf
Read a part of a single precision floating point array dataref. If you pass
NULL for outVaules, the routine will return the size of the array, ignoring
inOffset and inMax.
If outValues is not NULL, then up to inMax values are copied from the
dataref into outValues, starting at inOffset in the dataref. If inMax +
inOffset is larger than the size of the dataref, less than inMax values
will be copied. The number of values copied is returned.
Note: the semantics of array datarefs are entirely implemented by the
plugin (or X-Plane) that provides the dataref, not the SDK itself; the
above description is how these datarefs are intended to work, but a rogue
plugin may have different behavior.
}
FUNCTION XPLMGetDatavf(
inDataRef : XPLMDataRef;
outValues : PSingle; { Can be nil }
inOffset : Integer;
inMax : Integer) : Integer;
cdecl; external XPLM_DLL;
{
XPLMSetDatavf
Write part or all of a single precision floating point array dataref. The
values passed by inValues are written into the dataref starting at
inOffset. Up to inCount values are written; however if the values would
write "off the end" of the dataref array, then fewer values are written.
Note: the semantics of array datarefs are entirely implemented by the
plugin (or X-Plane) that provides the dataref, not the SDK itself; the
above description is how these datarefs are intended to work, but a rogue
plugin may have different behavior.
}
PROCEDURE XPLMSetDatavf(
inDataRef : XPLMDataRef;
inValues : PSingle;
inoffset : Integer;
inCount : Integer);
cdecl; external XPLM_DLL;
{
XPLMGetDatab
Read a part of a byte array dataref. If you pass NULL for outVaules, the
routine will return the size of the array, ignoring inOffset and inMax.
If outValues is not NULL, then up to inMax values are copied from the
dataref into outValues, starting at inOffset in the dataref. If inMax +
inOffset is larger than the size of the dataref, less than inMax values
will be copied. The number of values copied is returned.
Note: the semantics of array datarefs are entirely implemented by the
plugin (or X-Plane) that provides the dataref, not the SDK itself; the
above description is how these datarefs are intended to work, but a rogue
plugin may have different behavior.
}
FUNCTION XPLMGetDatab(
inDataRef : XPLMDataRef;
outValue : pointer; { Can be nil }
inOffset : Integer;
inMaxBytes : Integer) : Integer;
cdecl; external XPLM_DLL;
{
XPLMSetDatab
Write part or all of a byte array dataref. The values passed by inValues
are written into the dataref starting at inOffset. Up to inCount values are
written; however if the values would write "off the end" of the dataref
array, then fewer values are written.
Note: the semantics of array datarefs are entirely implemented by the
plugin (or X-Plane) that provides the dataref, not the SDK itself; the
above description is how these datarefs are intended to work, but a rogue
plugin may have different behavior.
}
PROCEDURE XPLMSetDatab(
inDataRef : XPLMDataRef;
inValue : pointer;
inOffset : Integer;
inLength : Integer);
cdecl; external XPLM_DLL;
{___________________________________________________________________________
* PUBLISHING YOUR PLUGIN'S DATA
___________________________________________________________________________}
{
These functions allow you to create data references that other plug-ins and
X-Plane can access via the above data access APIs. Data references
published by other plugins operate the same as ones published by X-Plane in
all manners except that your data reference will not be available to other
plugins if/when your plugin is disabled.
You share data by registering data provider callback functions. When a
plug-in requests your data, these callbacks are then called. You provide
one callback to return the value when a plugin 'reads' it and another to
change the value when a plugin 'writes' it.
Important: you must pick a prefix for your datarefs other than "sim/" -
this prefix is reserved for X-Plane. The X-Plane SDK website contains a
registry where authors can select a unique first word for dataref names, to
prevent dataref collisions between plugins.
}
{
XPLMGetDatai_f
Data provider function pointers.
These define the function pointers you provide to get or set data. Note
that you are passed a generic pointer for each one. This is the same
pointer you pass in your register routine; you can use it to locate plugin
variables, etc.
The semantics of your callbacks are the same as the dataref accessor above
- basically routines like XPLMGetDatai are just pass-throughs from a caller
to your plugin. Be particularly mindful in implementing array dataref
read-write accessors; you are responsible for avoiding overruns, supporting
offset read/writes, and handling a read with a NULL buffer.
}
TYPE
XPLMGetDatai_f = FUNCTION(
inRefcon : pointer) : Integer; cdecl;
{
XPLMSetDatai_f
}
XPLMSetDatai_f = PROCEDURE(
inRefcon : pointer;
inValue : Integer); cdecl;
{
XPLMGetDataf_f
}
XPLMGetDataf_f = FUNCTION(
inRefcon : pointer) : Single; cdecl;
{
XPLMSetDataf_f
}
XPLMSetDataf_f = PROCEDURE(
inRefcon : pointer;
inValue : Single); cdecl;
{
XPLMGetDatad_f
}
XPLMGetDatad_f = FUNCTION(
inRefcon : pointer) : Real; cdecl;
{
XPLMSetDatad_f
}
XPLMSetDatad_f = PROCEDURE(
inRefcon : pointer;
inValue : Real); cdecl;
{
XPLMGetDatavi_f
}
XPLMGetDatavi_f = FUNCTION(
inRefcon : pointer;
outValues : PInteger; { Can be nil }
inOffset : Integer;
inMax : Integer) : Integer; cdecl;
{
XPLMSetDatavi_f
}
XPLMSetDatavi_f = PROCEDURE(
inRefcon : pointer;
inValues : PInteger;
inOffset : Integer;
inCount : Integer); cdecl;
{
XPLMGetDatavf_f
}
XPLMGetDatavf_f = FUNCTION(
inRefcon : pointer;
outValues : PSingle; { Can be nil }
inOffset : Integer;
inMax : Integer) : Integer; cdecl;
{
XPLMSetDatavf_f
}
XPLMSetDatavf_f = PROCEDURE(
inRefcon : pointer;
inValues : PSingle;
inOffset : Integer;
inCount : Integer); cdecl;
{
XPLMGetDatab_f
}
XPLMGetDatab_f = FUNCTION(
inRefcon : pointer;
outValue : pointer; { Can be nil }
inOffset : Integer;
inMaxLength : Integer) : Integer; cdecl;
{
XPLMSetDatab_f
}
XPLMSetDatab_f = PROCEDURE(
inRefcon : pointer;
inValue : pointer;
inOffset : Integer;
inLength : Integer); cdecl;
{
XPLMRegisterDataAccessor
This routine creates a new item of data that can be read and written. Pass
in the data's full name for searching, the type(s) of the data for
accessing, and whether the data can be written to. For each data type you
support, pass in a read accessor function and a write accessor function if
necessary. Pass NULL for data types you do not support or write accessors
if you are read-only.
You are returned a data ref for the new item of data created. You can use
this data ref to unregister your data later or read or write from it.
}
FUNCTION XPLMRegisterDataAccessor(
inDataName : XPLMString;
inDataType : XPLMDataTypeID;
inIsWritable : Integer;
inReadInt : XPLMGetDatai_f;
inWriteInt : XPLMSetDatai_f;
inReadFloat : XPLMGetDataf_f;
inWriteFloat : XPLMSetDataf_f;
inReadDouble : XPLMGetDatad_f;
inWriteDouble : XPLMSetDatad_f;
inReadIntArray : XPLMGetDatavi_f;
inWriteIntArray : XPLMSetDatavi_f;
inReadFloatArray : XPLMGetDatavf_f;
inWriteFloatArray : XPLMSetDatavf_f;
inReadData : XPLMGetDatab_f;
inWriteData : XPLMSetDatab_f;
inReadRefcon : pointer;
inWriteRefcon : pointer) : XPLMDataRef;
cdecl; external XPLM_DLL;
{
XPLMUnregisterDataAccessor
Use this routine to unregister any data accessors you may have registered.
You unregister a data ref by the XPLMDataRef you get back from
registration. Once you unregister a data ref, your function pointer will
not be called anymore.
}
PROCEDURE XPLMUnregisterDataAccessor(
inDataRef : XPLMDataRef);
cdecl; external XPLM_DLL;
{___________________________________________________________________________
* SHARING DATA BETWEEN MULTIPLE PLUGINS
___________________________________________________________________________}
{
The data reference registration APIs from the previous section allow a
plugin to publish data in a one-owner manner; the plugin that publishes the
data reference owns the real memory that the data ref uses. This is
satisfactory for most cases, but there are also cases where plugnis need to
share actual data.
With a shared data reference, no one plugin owns the actual memory for the
data reference; the plugin SDK allocates that for you. When the first
plugin asks to 'share' the data, the memory is allocated. When the data is
changed, every plugin that is sharing the data is notified.
Shared data references differ from the 'owned' data references from the
previous section in a few ways:
* With shared data references, any plugin can create the data reference;
with owned plugins one plugin must create the data reference and others
subscribe. (This can be a problem if you don't know which set of plugins
will be present).
* With shared data references, every plugin that is sharing the data is
notified when the data is changed. With owned data references, only the
one owner is notified when the data is changed.
* With shared data references, you cannot access the physical memory of the
data reference; you must use the XPLMGet... and XPLMSet... APIs. With an
owned data reference, the one owning data reference can manipulate the
data reference's memory in any way it sees fit.
Shared data references solve two problems: if you need to have a data
reference used by several plugins but do not know which plugins will be
installed, or if all plugins sharing data need to be notified when that
data is changed, use shared data references.
}
{
XPLMDataChanged_f
An XPLMDataChanged_f is a callback that the XPLM calls whenever any other
plug-in modifies shared data. A refcon you provide is passed back to help
identify which data is being changed. In response, you may want to call one
of the XPLMGetDataxxx routines to find the new value of the data.
}
TYPE
XPLMDataChanged_f = PROCEDURE(
inRefcon : pointer); cdecl;
{
XPLMShareData
This routine connects a plug-in to shared data, creating the shared data if
necessary. inDataName is a standard path for the data ref, and inDataType
specifies the type. This function will create the data if it does not
exist. If the data already exists but the type does not match, an error is
returned, so it is important that plug-in authors collaborate to establish
public standards for shared data.
If a notificationFunc is passed in and is not NULL, that notification
function will be called whenever the data is modified. The notification
refcon will be passed to it. This allows your plug-in to know which shared
data was changed if multiple shared data are handled by one callback, or if
the plug-in does not use global variables.
A one is returned for successfully creating or finding the shared data; a
zero if the data already exists but is of the wrong type.
}
FUNCTION XPLMShareData(
inDataName : XPLMString;
inDataType : XPLMDataTypeID;
inNotificationFunc : XPLMDataChanged_f;
inNotificationRefcon: pointer) : Integer;
cdecl; external XPLM_DLL;
{
XPLMUnshareData
This routine removes your notification function for shared data. Call it
when done with the data to stop receiving change notifications. Arguments
must match XPLMShareData. The actual memory will not necessarily be freed,
since other plug-ins could be using it.
}
FUNCTION XPLMUnshareData(
inDataName : XPLMString;
inDataType : XPLMDataTypeID;
inNotificationFunc : XPLMDataChanged_f;
inNotificationRefcon: pointer) : Integer;
cdecl; external XPLM_DLL;
IMPLEMENTATION
END.
+438
View File
@@ -0,0 +1,438 @@
{
Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See
license.txt for usage. X-Plane SDK Version: 2.1.1
}
UNIT XPLMDefs;
INTERFACE
{
This file is contains the cross-platform and basic definitions for the
X-Plane SDK.
The preprocessor macros APL and IBM must be defined to specify the
compilation target; define APL to 1 and IBM 0 to compile on Macintosh and
APL to 0 and IBM to 1 for Windows. You must specify these macro definitions
before including XPLMDefs.h or any other XPLM headers. You can do this
using the -D command line option or a preprocessor header.
}
{$A4}
{$IFDEF LINUX}
{$DEFINE KYLIX}
{$ENDIF}
TYPE
{$IFNDEF DELPHI}
{$IFNDEF KYLIX}
Pchar = ^char;
Ppchar = ^Pchar;
Psingle = ^single;
Pinteger = ^integer;
{$ENDIF}
{$ENDIF}
Preal = ^real;
Plongint = ^longint;
{___________________________________________________________________________
* DLL Definitions
___________________________________________________________________________}
{
These definitions control the importing and exporting of functions within
the DLL.
You can prefix your five required callbacks with the PLUGIN_API macro to
declare them as exported C functions. The XPLM_API macro identifies
functions that are provided to you via the plugin SDK. (Link against
XPLM.lib to use these functions.)
}
{___________________________________________________________________________
* GLOBAL DEFINITIONS
___________________________________________________________________________}
{
These definitions are used in all parts of the SDK.
}
TYPE
{
XPLMPluginID
Each plug-in is identified by a unique integer ID. This ID can be used to
disable or enable a plug-in, or discover what plug-in is 'running' at the
time. A plug-in ID is unique within the currently running instance of
X-Plane unless plug-ins are reloaded. Plug-ins may receive a different
unique ID each time they are loaded. This includes the unloading and
reloading of plugins that are part of the user's aircraft.
For persistent identification of plug-ins, use XPLMFindPluginBySignature in
XPLMUtiltiies.h
-1 indicates no plug-in.
}
XPLMPluginID = Integer;
PXPLMPluginID = ^XPLMPluginID;
CONST
{ No plugin. }
XPLM_NO_PLUGIN_ID = (-1);
{ X-Plane itself }
XPLM_PLUGIN_XPLANE = (0);
{ The current XPLM revision is 4.00 (400). }
kXPLM_Version = (400);
{
XPLMKeyFlags
These bitfields define modifier keys in a platform independent way. When a
key is pressed, a series of messages are sent to your plugin. The down
flag is set in the first of these messages, and the up flag in the last.
While the key is held down, messages are sent with neither to indicate that
the key is being held down as a repeated character.
The control flag is mapped to the control flag on Macintosh and PC.
Generally X-Plane uses the control key and not the command key on
Macintosh, providing a consistent interface across platforms that does not
necessarily match the Macintosh user interface guidelines. There is not
yet a way for plugins to access the Macintosh control keys without using
#ifdefed code.
}
TYPE
XPLMKeyFlags = (
{ The shift key is down }
xplm_ShiftFlag = 1
{ The option or alt key is down }
,xplm_OptionAltFlag = 2
{ The control key is down* }
,xplm_ControlFlag = 4
{ The key is being pressed down }
,xplm_DownFlag = 8
{ The key is being released }
,xplm_UpFlag = 16
);
PXPLMKeyFlags = ^XPLMKeyFlags;
{___________________________________________________________________________
* ASCII CONTROL KEY CODES
___________________________________________________________________________}
{
These definitions define how various control keys are mapped to ASCII key
codes. Not all key presses generate an ASCII value, so plugin code should
be prepared to see null characters come from the keyboard...this usually
represents a key stroke that has no equivalent ASCII, like a page-down
press. Use virtual key codes to find these key strokes.
ASCII key codes take into account modifier keys; shift keys will affect
capitals and punctuation; control key combinations may have no vaild ASCII
and produce NULL. To detect control-key combinations, use virtual key
codes, not ASCII keys.
}
CONST
XPLM_KEY_RETURN = 13;
XPLM_KEY_ESCAPE = 27;
XPLM_KEY_TAB = 9;
XPLM_KEY_DELETE = 8;
XPLM_KEY_LEFT = 28;
XPLM_KEY_RIGHT = 29;
XPLM_KEY_UP = 30;
XPLM_KEY_DOWN = 31;
XPLM_KEY_0 = 48;
XPLM_KEY_1 = 49;
XPLM_KEY_2 = 50;
XPLM_KEY_3 = 51;
XPLM_KEY_4 = 52;
XPLM_KEY_5 = 53;
XPLM_KEY_6 = 54;
XPLM_KEY_7 = 55;
XPLM_KEY_8 = 56;
XPLM_KEY_9 = 57;
XPLM_KEY_DECIMAL = 46;
{___________________________________________________________________________
* VIRTUAL KEY CODES
___________________________________________________________________________}
{
These are cross-platform defines for every distinct keyboard press on the
computer. Every physical key on the keyboard has a virtual key code. So
the "two" key on the top row of the main keyboard has a different code from
the "two" key on the numeric key pad. But the 'w' and 'W' character are
indistinguishable by virtual key code because they are the same physical
key (one with and one without the shift key).
Use virtual key codes to detect keystrokes that do not have ASCII
equivalents, allow the user to map the numeric keypad separately from the
main keyboard, and detect control key and other modifier-key combinations
that generate ASCII control key sequences (many of which are not available
directly via character keys in the SDK).
To assign virtual key codes we started with the Microsoft set but made some
additions and changes. A few differences:
1. Modifier keys are not available as virtual key codes. You cannot get
distinct modifier press and release messages. Please do not try to use
modifier keys as regular keys; doing so will almost certainly interfere
with users' abilities to use the native X-Plane key bindings.
2. Some keys that do not exist on both Mac and PC keyboards are removed.
3. Do not assume that the values of these keystrokes are interchangeable
with MS v-keys.
}
CONST
XPLM_VK_BACK = $08;
XPLM_VK_TAB = $09;
XPLM_VK_CLEAR = $0C;
XPLM_VK_RETURN = $0D;
XPLM_VK_ESCAPE = $1B;
XPLM_VK_SPACE = $20;
XPLM_VK_PRIOR = $21;
XPLM_VK_NEXT = $22;
XPLM_VK_END = $23;
XPLM_VK_HOME = $24;
XPLM_VK_LEFT = $25;
XPLM_VK_UP = $26;
XPLM_VK_RIGHT = $27;
XPLM_VK_DOWN = $28;
XPLM_VK_SELECT = $29;
XPLM_VK_PRINT = $2A;
XPLM_VK_EXECUTE = $2B;
XPLM_VK_SNAPSHOT = $2C;
XPLM_VK_INSERT = $2D;
XPLM_VK_DELETE = $2E;
XPLM_VK_HELP = $2F;
{ XPLM_VK_0 thru XPLM_VK_9 are the same as ASCII '0' thru '9' (0x30 - 0x39) }
XPLM_VK_0 = $30;
XPLM_VK_1 = $31;
XPLM_VK_2 = $32;
XPLM_VK_3 = $33;
XPLM_VK_4 = $34;
XPLM_VK_5 = $35;
XPLM_VK_6 = $36;
XPLM_VK_7 = $37;
XPLM_VK_8 = $38;
XPLM_VK_9 = $39;
{ XPLM_VK_A thru XPLM_VK_Z are the same as ASCII 'A' thru 'Z' (0x41 - 0x5A) }
XPLM_VK_A = $41;
XPLM_VK_B = $42;
XPLM_VK_C = $43;
XPLM_VK_D = $44;
XPLM_VK_E = $45;
XPLM_VK_F = $46;
XPLM_VK_G = $47;
XPLM_VK_H = $48;
XPLM_VK_I = $49;
XPLM_VK_J = $4A;
XPLM_VK_K = $4B;
XPLM_VK_L = $4C;
XPLM_VK_M = $4D;
XPLM_VK_N = $4E;
XPLM_VK_O = $4F;
XPLM_VK_P = $50;
XPLM_VK_Q = $51;
XPLM_VK_R = $52;
XPLM_VK_S = $53;
XPLM_VK_T = $54;
XPLM_VK_U = $55;
XPLM_VK_V = $56;
XPLM_VK_W = $57;
XPLM_VK_X = $58;
XPLM_VK_Y = $59;
XPLM_VK_Z = $5A;
XPLM_VK_NUMPAD0 = $60;
XPLM_VK_NUMPAD1 = $61;
XPLM_VK_NUMPAD2 = $62;
XPLM_VK_NUMPAD3 = $63;
XPLM_VK_NUMPAD4 = $64;
XPLM_VK_NUMPAD5 = $65;
XPLM_VK_NUMPAD6 = $66;
XPLM_VK_NUMPAD7 = $67;
XPLM_VK_NUMPAD8 = $68;
XPLM_VK_NUMPAD9 = $69;
XPLM_VK_MULTIPLY = $6A;
XPLM_VK_ADD = $6B;
XPLM_VK_SEPARATOR = $6C;
XPLM_VK_SUBTRACT = $6D;
XPLM_VK_DECIMAL = $6E;
XPLM_VK_DIVIDE = $6F;
XPLM_VK_F1 = $70;
XPLM_VK_F2 = $71;
XPLM_VK_F3 = $72;
XPLM_VK_F4 = $73;
XPLM_VK_F5 = $74;
XPLM_VK_F6 = $75;
XPLM_VK_F7 = $76;
XPLM_VK_F8 = $77;
XPLM_VK_F9 = $78;
XPLM_VK_F10 = $79;
XPLM_VK_F11 = $7A;
XPLM_VK_F12 = $7B;
XPLM_VK_F13 = $7C;
XPLM_VK_F14 = $7D;
XPLM_VK_F15 = $7E;
XPLM_VK_F16 = $7F;
XPLM_VK_F17 = $80;
XPLM_VK_F18 = $81;
XPLM_VK_F19 = $82;
XPLM_VK_F20 = $83;
XPLM_VK_F21 = $84;
XPLM_VK_F22 = $85;
XPLM_VK_F23 = $86;
XPLM_VK_F24 = $87;
{ The following definitions are extended and are not based on the Microsoft }
{ key set. }
XPLM_VK_EQUAL = $B0;
XPLM_VK_MINUS = $B1;
XPLM_VK_RBRACE = $B2;
XPLM_VK_LBRACE = $B3;
XPLM_VK_QUOTE = $B4;
XPLM_VK_SEMICOLON = $B5;
XPLM_VK_BACKSLASH = $B6;
XPLM_VK_COMMA = $B7;
XPLM_VK_SLASH = $B8;
XPLM_VK_PERIOD = $B9;
XPLM_VK_BACKQUOTE = $BA;
XPLM_VK_ENTER = $BB;
XPLM_VK_NUMPAD_ENT = $BC;
XPLM_VK_NUMPAD_EQ = $BD;
IMPLEMENTATION
END.
File diff suppressed because it is too large. Load diff
+424
View File
@@ -0,0 +1,424 @@
{
Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See
license.txt for usage. X-Plane SDK Version: 2.1.1
}
UNIT XPLMGraphics;
INTERFACE
{
A few notes on coordinate systems:
X-Plane uses three kinds of coordinates. Global coordinates are specified
as latitude, longitude and elevation. This coordinate system never changes
but is not very precise.
OpenGL (or 'local') coordinates are cartesian and shift with the plane.
They offer more precision and are used for 3-d OpenGL drawing. The X axis
is aligned east-west with positive X meaning east. The Y axis is aligned
straight up and down at the point 0,0,0 (but since the earth is round it is
not truly straight up and down at other points). The Z axis is aligned
north-south at 0, 0, 0 with positive Z pointing south (but since the earth
is round it isn't exactly north-south as you move east or west of 0, 0, 0).
One unit is one meter and the point 0,0,0 is on the surface of the earth at
sea level for some latitude and longitude picked by the sim such that the
user's aircraft is reasonably nearby.
2-d Panel coordinates are 2d, with the X axis horizontal and the Y axis
vertical. The point 0,0 is the bottom left and 1024,768 is the upper
right of the screen. This is true no matter what resolution the user's
monitor is in; when running in higher resolution, graphics will be
scaled.
Use X-Plane's routines to convert between global and local coordinates. Do
not attempt to do this conversion yourself; the precise 'roundness' of
X-Plane's physics model may not match your own, and (to make things
weirder) the user can potentially customize the physics of the current
planet.
}
USES
XPLMDefs;
{$A4}
{___________________________________________________________________________
* X-PLANE GRAPHICS
___________________________________________________________________________}
{
These routines allow you to use OpenGL with X-Plane.
}
{
XPLMTextureID
XPLM Texture IDs name well-known textures in the sim for you to use. This
allows you to recycle textures from X-Plane, saving VRAM.
*Warning*: do not use these enums. The only remaining use they have is to
access the legacy compatibility v10 UI texture; if you need this, get it
via the Widgets library.
}
TYPE
XPLMTextureID = (
{ The bitmap that contains window outlines, button outlines, fonts, etc. }
xplm_Tex_GeneralInterface = 0
{$IFDEF XPLM_DEPRECATED}
{ The exterior paint for the user's aircraft (daytime). }
,xplm_Tex_AircraftPaint = 1
{$ENDIF XPLM_DEPRECATED}
{$IFDEF XPLM_DEPRECATED}
{ The exterior light map for the user's aircraft. }
,xplm_Tex_AircraftLiteMap = 2
{$ENDIF XPLM_DEPRECATED}
);
PXPLMTextureID = ^XPLMTextureID;
{
XPLMSetGraphicsState
XPLMSetGraphicsState changes OpenGL's fixed function pipeline state. You
are not responsible for restoring any state that is accessed via
XPLMSetGraphicsState, but you are responsible for not accessing this state
directly.
- inEnableFog - enables or disables fog, equivalent to: glEnable(GL_FOG);
- inNumberTexUnits - enables or disables a number of multitexturing units.
If the number is 0, 2d texturing is disabled entirely, as in
glDisable(GL_TEXTURE_2D); Otherwise, 2d texturing is enabled, and a
number of multitexturing units are enabled sequentially, starting with
unit 0, e.g. glActiveTextureARB(GL_TEXTURE0_ARB); glEnable
(GL_TEXTURE_2D);
- inEnableLighting - enables or disables OpenGL lighting, e.g.
glEnable(GL_LIGHTING); glEnable(GL_LIGHT0);
- inEnableAlphaTesting - enables or disables the alpha test per pixel, e.g.
glEnable(GL_ALPHA_TEST);
- inEnableAlphaBlending - enables or disables alpha blending per pixel,
e.g. glEnable(GL_BLEND);
- inEnableDepthTesting - enables per pixel depth testing, as in
glEnable(GL_DEPTH_TEST);
- inEnableDepthWriting - enables writing back of depth information to the
depth bufffer, as in glDepthMask(GL_TRUE);
The purpose of this function is to change OpenGL state while keeping
X-Plane aware of the state changes; this keeps X-Plane from getting
surprised by OGL state changes, and prevents X-Plane and plug-ins from
having to set all state before all draws; XPLMSetGraphicsState internally
skips calls to change state that is already properly enabled.
X-Plane does not have a 'default' OGL state for plug-ins with respect to
the above state vector; plug-ins should totally set OGL state using this
API before drawing. Use XPLMSetGraphicsState instead of any of the above
OpenGL calls.
WARNING: Any routine that performs drawing (e.g. XPLMDrawString or widget
code) may change X-Plane's state. Always set state before drawing after
unknown code has executed.
*Deprecation Warnings*: X-Plane's lighting and fog environemnt is
significantly more complex than the fixed function pipeline can express;
do not assume that lighting and fog state is a good approximation for 3-d
drawing. Prefer to use XPLMInstancing to draw objects. All calls to
XPLMSetGraphicsState should have no fog or lighting.
}
PROCEDURE XPLMSetGraphicsState(
inEnableFog : Integer;
inNumberTexUnits : Integer;
inEnableLighting : Integer;
inEnableAlphaTesting: Integer;
inEnableAlphaBlending: Integer;
inEnableDepthTesting: Integer;
inEnableDepthWriting: Integer);
cdecl; external XPLM_DLL;
{
XPLMBindTexture2d
XPLMBindTexture2d changes what texture is bound to the 2d texturing
target. This routine caches the current 2d texture across all texturing
units in the sim and plug-ins, preventing extraneous binding. For
example, consider several plug-ins running in series; if they all use the
'general interface' bitmap to do UI, calling this function will skip the
rebinding of the general interface texture on all but the first plug-in,
which can provide better frame rate son some graphics cards.
inTextureID is the ID of the texture object to bind; inTextureUnit is a
zero-based texture unit (e.g. 0 for the first one), up to a maximum of 4
units. (This number may increase in future versions of X-Plane.)
Use this routine instead of glBindTexture(GL_TEXTURE_2D, ....);
}
PROCEDURE XPLMBindTexture2d(
inTextureNum : Integer;
inTextureUnit : Integer);
cdecl; external XPLM_DLL;
{
XPLMGenerateTextureNumbers
Use this routine instead of glGenTextures to generate new texture object
IDs. This routine historically ensured that plugins don't use texure IDs
that X-Plane is reserving for its own use.
}
PROCEDURE XPLMGenerateTextureNumbers(
outTextureIDs : PInteger;
inCount : Integer);
cdecl; external XPLM_DLL;
{$IFDEF XPLM_DEPRECATED}
{
XPLMGetTexture
XPLMGetTexture returns the OpenGL texture ID of an X-Plane texture based on
a generic identifying code. For example, you can get the texture for
X-Plane's UI bitmaps.
}
FUNCTION XPLMGetTexture(
inTexture : XPLMTextureID) : Integer;
cdecl; external XPLM_DLL;
{$ENDIF XPLM_DEPRECATED}
{
XPLMWorldToLocal
This routine translates coordinates from latitude, longitude, and altitude
to local scene coordinates. Latitude and longitude are in decimal degrees,
and altitude is in meters MSL (mean sea level). The XYZ coordinates are in
meters in the local OpenGL coordinate system.
}
PROCEDURE XPLMWorldToLocal(
inLatitude : Real;
inLongitude : Real;
inAltitude : Real;
outX : PReal;
outY : PReal;
outZ : PReal);
cdecl; external XPLM_DLL;
{
XPLMLocalToWorld
This routine translates a local coordinate triplet back into latitude,
longitude, and altitude. Latitude and longitude are in decimal degrees,
and altitude is in meters MSL (mean sea level). The XYZ coordinates are in
meters in the local OpenGL coordinate system.
NOTE: world coordinates are less precise than local coordinates; you should
try to avoid round tripping from local to world and back.
}
PROCEDURE XPLMLocalToWorld(
inX : Real;
inY : Real;
inZ : Real;
outLatitude : PReal;
outLongitude : PReal;
outAltitude : PReal);
cdecl; external XPLM_DLL;
{
XPLMDrawTranslucentDarkBox
This routine draws a translucent dark box, partially obscuring parts of the
screen but making text easy to read. This is the same graphics primitive
used by X-Plane to show text files and ATC info.
}
PROCEDURE XPLMDrawTranslucentDarkBox(
inLeft : Integer;
inTop : Integer;
inRight : Integer;
inBottom : Integer);
cdecl; external XPLM_DLL;
{___________________________________________________________________________
* X-PLANE TEXT
___________________________________________________________________________}
{
XPLMFontID
X-Plane features some fixed-character fonts. Each font may have its own
metrics.
WARNING: Some of these fonts are no longer supported or may have changed
geometries. For maximum copmatibility, see the comments below.
Note: X-Plane 7 supports proportional-spaced fonts. Since no measuring
routine is available yet, the SDK will normally draw using a fixed-width
font. You can use a dataref to enable proportional font drawing on XP7 if
you want to.
}
TYPE
XPLMFontID = (
{ Mono-spaced font for user interface. Available in all versions of the SDK.}
xplmFont_Basic = 0
{$IFDEF XPLM_DEPRECATED}
{ Deprecated, do not use. }
,xplmFont_Menus = 1
{$ENDIF XPLM_DEPRECATED}
{$IFDEF XPLM_DEPRECATED}
{ Deprecated, do not use. }
,xplmFont_Metal = 2
{$ENDIF XPLM_DEPRECATED}
{$IFDEF XPLM_DEPRECATED}
{ Deprecated, do not use. }
,xplmFont_Led = 3
{$ENDIF XPLM_DEPRECATED}
{$IFDEF XPLM_DEPRECATED}
{ Deprecated, do not use. }
,xplmFont_LedWide = 4
{$ENDIF XPLM_DEPRECATED}
{$IFDEF XPLM_DEPRECATED}
{ Deprecated, do not use. }
,xplmFont_PanelHUD = 5
{$ENDIF XPLM_DEPRECATED}
{$IFDEF XPLM_DEPRECATED}
{ Deprecated, do not use. }
,xplmFont_PanelEFIS = 6
{$ENDIF XPLM_DEPRECATED}
{$IFDEF XPLM_DEPRECATED}
{ Deprecated, do not use. }
,xplmFont_PanelGPS = 7
{$ENDIF XPLM_DEPRECATED}
{$IFDEF XPLM_DEPRECATED}
{ Deprecated, do not use. }
,xplmFont_RadiosGA = 8
{$ENDIF XPLM_DEPRECATED}
{$IFDEF XPLM_DEPRECATED}
{ Deprecated, do not use. }
,xplmFont_RadiosBC = 9
{$ENDIF XPLM_DEPRECATED}
{$IFDEF XPLM_DEPRECATED}
{ Deprecated, do not use. }
,xplmFont_RadiosHM = 10
{$ENDIF XPLM_DEPRECATED}
{$IFDEF XPLM_DEPRECATED}
{ Deprecated, do not use. }
,xplmFont_RadiosGANarrow = 11
{$ENDIF XPLM_DEPRECATED}
{$IFDEF XPLM_DEPRECATED}
{ Deprecated, do not use. }
,xplmFont_RadiosBCNarrow = 12
{$ENDIF XPLM_DEPRECATED}
{$IFDEF XPLM_DEPRECATED}
{ Deprecated, do not use. }
,xplmFont_RadiosHMNarrow = 13
{$ENDIF XPLM_DEPRECATED}
{$IFDEF XPLM_DEPRECATED}
{ Deprecated, do not use. }
,xplmFont_Timer = 14
{$ENDIF XPLM_DEPRECATED}
{$IFDEF XPLM_DEPRECATED}
{ Deprecated, do not use. }
,xplmFont_FullRound = 15
{$ENDIF XPLM_DEPRECATED}
{$IFDEF XPLM_DEPRECATED}
{ Deprecated, do not use. }
,xplmFont_SmallRound = 16
{$ENDIF XPLM_DEPRECATED}
{$IFDEF XPLM_DEPRECATED}
{ Deprecated, do not use. }
,xplmFont_Menus_Localized = 17
{$ENDIF XPLM_DEPRECATED}
{$IFDEF XPLM200}
{ Proportional UI font. }
,xplmFont_Proportional = 18
{$ENDIF XPLM200}
);
PXPLMFontID = ^XPLMFontID;
{
XPLMDrawString
This routine draws a NULL termianted string in a given font. Pass in the
lower left pixel that the character is to be drawn onto. Also pass the
character and font ID. This function returns the x offset plus the width of
all drawn characters. The color to draw in is specified as a pointer to an
array of three floating point colors, representing RGB intensities from 0.0
to 1.0.
}
PROCEDURE XPLMDrawString(
inColorRGB : PSingle;
inXOffset : Integer;
inYOffset : Integer;
inChar : XPLMString;
inWordWrapWidth : PInteger; { Can be nil }
inFontID : XPLMFontID);
cdecl; external XPLM_DLL;
{
XPLMDrawNumber
This routine draws a number similar to the digit editing fields in
PlaneMaker and data output display in X-Plane. Pass in a color, a
position, a floating point value, and formatting info. Specify how many
integer and how many decimal digits to show and whether to show a sign, as
well as a character set. This routine returns the xOffset plus width of the
string drawn.
}
PROCEDURE XPLMDrawNumber(
inColorRGB : PSingle;
inXOffset : Integer;
inYOffset : Integer;
inValue : Real;
inDigits : Integer;
inDecimals : Integer;
inShowSign : Integer;
inFontID : XPLMFontID);
cdecl; external XPLM_DLL;
{
XPLMGetFontDimensions
This routine returns the width and height of a character in a given font.
It also tells you if the font only supports numeric digits. Pass NULL if
you don't need a given field. Note that for a proportional font the width
will be an arbitrary, hopefully average width.
}
PROCEDURE XPLMGetFontDimensions(
inFontID : XPLMFontID;
outCharWidth : PInteger; { Can be nil }
outCharHeight : PInteger; { Can be nil }
outDigitsOnly : PInteger); { Can be nil }
cdecl; external XPLM_DLL;
{$IFDEF XPLM200}
{
XPLMMeasureString
This routine returns the width in pixels of a string using a given font.
The string is passed as a pointer plus length (and does not need to be null
terminated); this is used to allow for measuring substrings. The return
value is floating point; it is possible that future font drawing may allow
for fractional pixels.
}
FUNCTION XPLMMeasureString(
inFontID : XPLMFontID;
inChar : XPLMString;
inNumChars : Integer) : Single;
cdecl; external XPLM_DLL;
{$ENDIF XPLM200}
IMPLEMENTATION
END.
+125
View File
@@ -0,0 +1,125 @@
{
Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See
license.txt for usage. X-Plane SDK Version: 2.1.1
}
UNIT XPLMInstance;
INTERFACE
{
This API provides instanced drawing of X-Plane objects (.obj files). In
contrast to old drawing APIs, which required you to draw your own objects
per-frame, the instancing API allows you to simply register an OBJ for
drawing, then move or manipulate it later (as needed).
This provides one tremendous benefit: it keeps all dataref operations for
your object in one place. Because datarefs are main thread only, allowing
dataref access anywhere is a serious performance bottleneck for the
simulator---the whole simulator has to pause and wait for each dataref
access. This performance penalty will only grow worse as X-Plane moves
toward an ever more heavily multithreaded engine.
The instancing API allows X-Plane to isolate all dataref manipulations for
all plugin object drawing to one place, potentially providing huge
performance gains.
Here's how it works:
When an instance is created, it provides a list of all datarefs you want to
manipulate in for the OBJ in the future. This list of datarefs replaces the
ad-hoc collections of dataref objects previously used by art assets. Then,
per-frame, you can manipulate the instance by passing in a "block" of
packed floats representing the current values of the datarefs for your
instance. (Note that the ordering of this set of packed floats must exactly
match the ordering of the datarefs when you created your instance.)
}
USES
XPLMDefs, XPLMScenery;
{$A4}
{___________________________________________________________________________
* Instance Creation and Destruction
___________________________________________________________________________}
{
Registers and unregisters instances.
}
TYPE
{
XPLMInstanceRef
An opaque handle to an instance.
}
XPLMInstanceRef = pointer;
PXPLMInstanceRef = ^XPLMInstanceRef;
{
XPLMCreateInstance
XPLMCreateInstance creates a new instance, managed by your plug-in, and
returns a handle to the instance. A few important requirements:
* The object passed in must be fully loaded and returned from the XPLM
before you can create your instance; you cannot pass a null obj ref, nor
can you change the ref later.
* If you use any custom datarefs in your object, they must be registered
before the object is loaded. This is true even if their data will be
provided via the instance dataref list.
* The instance dataref array must be a valid ptr to an array of at least
one item that is null terminated. That is, if you do not want any
datarefs, you must passa ptr to an array with a null item. You cannot
pass null for this.
}
FUNCTION XPLMCreateInstance(
obj : XPLMObjectRef;
datarefs : PXPLMString) : XPLMInstanceRef;
cdecl; external XPLM_DLL;
{
XPLMDestroyInstance
XPLMDestroyInstance destroys and deallocates your instance; once called,
you are still responsible for releasing the OBJ ref.
Tip: you can release your OBJ ref after you call XPLMCreateInstance as long
as you never use it again; the instance will maintain its own reference to
the OBJ and the object OBJ be deallocated when the instance is destroyed.
}
PROCEDURE XPLMDestroyInstance(
instance : XPLMInstanceRef);
cdecl; external XPLM_DLL;
{___________________________________________________________________________
* Instance Manipulation
___________________________________________________________________________}
{
XPLMInstanceSetPosition
Updates both the position of the instance and all datarefs you registered
for it. Call this from a flight loop callback or UI callback.
__DO NOT__ call XPLMInstanceSetPosition from a drawing callback; the whole
point of instancing is that you do not need any drawing callbacks. Setting
instance data from a drawing callback may have undefined consequences, and
the drawing callback hurts FPS unnecessarily.
The memory pointed to by the data pointer must be large enough to hold one
float for every data ref you have registered, and must contain valid
floating point data.
BUG: before X-Plane 11.50, if you have no dataref registered, you must
still pass a valid pointer for data and not null.
}
PROCEDURE XPLMInstanceSetPosition(
instance : XPLMInstanceRef;
new_position : PXPLMDrawInfo_t;
data : PSingle);
cdecl; external XPLM_DLL;
IMPLEMENTATION
END.
+608
View File
@@ -0,0 +1,608 @@
{
Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See
license.txt for usage. X-Plane SDK Version: 2.1.1
}
UNIT XPLMMap;
INTERFACE
{
This API allows you to create new layers within X-Plane maps. Your layers
can draw arbitrary OpenGL, but they conveniently also have access to
X-Plane's built-in icon and label drawing functions.
As of X-Plane 11, map drawing happens in three stages:
1. backgrounds and "fill,"
2. icons, and
3. labels.
Thus, all background drawing gets layered beneath all icons, which likewise
get layered beneath all labels. Within each stage, the map obeys a
consistent layer ordering, such that "fill" layers (layers that cover a
large amount of map area, like the terrain and clouds) appear beneath
"markings" layers (like airport icons). This ensures that layers with fine
details don't get obscured by layers with larger details.
The XPLM map API reflects both aspects of this draw layering: you can
register a layer as providing either markings or fill, and X-Plane will
draw your fill layers beneath your markings layers (regardless of
registration order). Likewise, you are guaranteed that your layer's icons
(added from within an icon callback) will go above your layer's OpenGL
drawing, and your labels will go above your icons.
The XPLM guarantees that all plugin-created fill layers go on top of all
native X-Plane fill layers, and all plugin-created markings layers go on
top of all X-Plane markings layers (with the exception of the aircraft
icons). It also guarantees that the draw order of your own plugin's layers
will be consistent. But, for layers created by different plugins, the only
guarantee is that we will draw all of one plugin's layers of each type
(fill, then markings), then all of the others'; we don't guarantee which
plugin's fill and markings layers go on top of the other's.
As of X-Plane 11, maps use true cartographic projections for their drawing,
and different maps may use different projections. For that reason, all
drawing calls include an opaque handle for the projection you should use to
do the drawing. Any time you would draw at a particular latitude/longitude,
you'll need to ask the projection to translate that position into "map
coordinates." (Note that the projection is guaranteed not to change between
calls to your prepare-cache hook, so if you cache your map coordinates
ahead of time, there's no need to re-project them when you actually draw.)
In addition to mapping normal latitude/longitude locations into map
coordinates, the projection APIs also let you know the current heading for
north. (Since X-Plane 11 maps can rotate to match the heading of the user's
aircraft, it's not safe to assume that north is at zero degrees rotation.)
}
USES
XPLMDefs;
{$A4}
{$IFDEF XPLM300}
{___________________________________________________________________________
* DRAWING CALLBACKS
___________________________________________________________________________}
{
When you create a new map layer (using XPLMCreateMapLayer), you can provide
any or all of these callbacks. They allow you to insert your own OpenGL
drawing, text labels, and icons into the X-Plane map at the appropriate
places, allowing your layer to behave as similarly to X-Plane's built-in
layers as possible.
}
TYPE
{
XPLMMapLayerID
This is an opaque handle for a plugin-created map layer. Pass it to the map
drawing APIs from an appropriate callback to draw in the layer you created.
}
XPLMMapLayerID = pointer;
PXPLMMapLayerID = ^XPLMMapLayerID;
{
XPLMMapProjectionID
This is an opaque handle for a map projection. Pass it to the projection
APIs to translate between map coordinates and latitude/longitudes.
}
XPLMMapProjectionID = pointer;
PXPLMMapProjectionID = ^XPLMMapProjectionID;
{
XPLMMapStyle
Indicates the visual style being drawn by the map. In X-Plane, the user can
choose between a number of map types, and different map types may have use
a different visual representation for the same elements (for instance, the
visual style of the terrain layer changes drastically between the VFR and
IFR layers), or certain layers may be disabled entirely in some map types
(e.g., localizers are only visible in the IFR low-enroute style).
}
XPLMMapStyle = (
xplm_MapStyle_VFR_Sectional = 0
,xplm_MapStyle_IFR_LowEnroute = 1
,xplm_MapStyle_IFR_HighEnroute = 2
);
PXPLMMapStyle = ^XPLMMapStyle;
{
XPLMMapDrawingCallback_f
This is the OpenGL map drawing callback for plugin-created map layers. You
can perform arbitrary OpenGL drawing from this callback, with one
exception: changes to the Z-buffer are not permitted, and will result in
map drawing errors.
All drawing done from within this callback appears beneath all built-in
X-Plane icons and labels, but above the built-in "fill" layers (layers
providing major details, like terrain and water). Note, however, that the
relative ordering between the drawing callbacks of different plugins is not
guaranteed.
}
XPLMMapDrawingCallback_f = PROCEDURE(
inLayer : XPLMMapLayerID;
inMapBoundsLeftTopRightBottom: PSingle;
zoomRatio : Single;
mapUnitsPerUserInterfaceUnit: Single;
mapStyle : XPLMMapStyle;
projection : XPLMMapProjectionID;
inRefcon : pointer); cdecl;
{
XPLMMapIconDrawingCallback_f
This is the icon drawing callback that enables plugin-created map layers to
draw icons using X-Plane's built-in icon drawing functionality. You can
request an arbitrary number of PNG icons to be drawn via
XPLMDrawMapIconFromSheet() from within this callback, but you may not
perform any OpenGL drawing here.
Icons enqueued by this function will appear above all OpenGL drawing
(performed by your optional XPLMMapDrawingCallback_f), and above all
built-in X-Plane map icons of the same layer type ("fill" or "markings," as
determined by the XPLMMapLayerType in your XPLMCreateMapLayer_t). Note,
however, that the relative ordering between the drawing callbacks of
different plugins is not guaranteed.
}
XPLMMapIconDrawingCallback_f = PROCEDURE(
inLayer : XPLMMapLayerID;
inMapBoundsLeftTopRightBottom: PSingle;
zoomRatio : Single;
mapUnitsPerUserInterfaceUnit: Single;
mapStyle : XPLMMapStyle;
projection : XPLMMapProjectionID;
inRefcon : pointer); cdecl;
{
XPLMMapLabelDrawingCallback_f
This is the label drawing callback that enables plugin-created map layers
to draw text labels using X-Plane's built-in labeling functionality. You
can request an arbitrary number of text labels to be drawn via
XPLMDrawMapLabel() from within this callback, but you may not perform any
OpenGL drawing here.
Labels enqueued by this function will appear above all OpenGL drawing
(performed by your optional XPLMMapDrawingCallback_f), and above all
built-in map icons and labels of the same layer type ("fill" or "markings,"
as determined by the XPLMMapLayerType in your XPLMCreateMapLayer_t). Note,
however, that the relative ordering between the drawing callbacks of
different plugins is not guaranteed.
}
XPLMMapLabelDrawingCallback_f = PROCEDURE(
inLayer : XPLMMapLayerID;
inMapBoundsLeftTopRightBottom: PSingle;
zoomRatio : Single;
mapUnitsPerUserInterfaceUnit: Single;
mapStyle : XPLMMapStyle;
projection : XPLMMapProjectionID;
inRefcon : pointer); cdecl;
{$ENDIF XPLM300}
{$IFDEF XPLM300}
{___________________________________________________________________________
* LAYER MANAGEMENT CALLBACKS
___________________________________________________________________________}
{
These are various "bookkeeping" callbacks that your map layer can receive
(if you provide the callback in your XPLMCreateMapLayer_t). They allow you
to manage the lifecycle of your layer, as well as cache any
computationally-intensive preparation you might need for drawing.
}
{
XPLMMapPrepareCacheCallback_f
A callback used to allow you to cache whatever information your layer needs
to draw in the current map area.
This is called each time the map's total bounds change. This is typically
triggered by new DSFs being loaded, such that X-Plane discards old,
now-distant DSFs and pulls in new ones. At that point, the available bounds
of the map also change to match the new DSF area.
By caching just the information you need to draw in this area, your future
draw calls can be made faster, since you'll be able to simply "splat" your
precomputed information each frame.
We guarantee that the map projection will not change between successive
prepare cache calls, nor will any draw call give you bounds outside these
total map bounds. So, if you cache the projected map coordinates of all the
items you might want to draw in the total map area, you can be guaranteed
that no draw call will be asked to do any new work.
}
TYPE
XPLMMapPrepareCacheCallback_f = PROCEDURE(
inLayer : XPLMMapLayerID;
inTotalMapBoundsLeftTopRightBottom: PSingle;
projection : XPLMMapProjectionID;
inRefcon : pointer); cdecl;
{
XPLMMapWillBeDeletedCallback_f
Called just before your map layer gets deleted. Because SDK-created map
layers have the same lifetime as the X-Plane map that contains them, if the
map gets unloaded from memory, your layer will too.
}
XPLMMapWillBeDeletedCallback_f = PROCEDURE(
inLayer : XPLMMapLayerID;
inRefcon : pointer); cdecl;
{$ENDIF XPLM300}
{$IFDEF XPLM300}
{___________________________________________________________________________
* MAP LAYER CREATION AND DESTRUCTION
___________________________________________________________________________}
{
Enables the creation of new map layers. Layers are created for a particular
instance of the X-Plane map. For instance, if you want your layer to appear
in both the normal map interface and the Instructor Operator Station (IOS),
you would need two separate calls to XPLMCreateMapLayer(), with two
different values for your XPLMCreateMapLayer_t::layer_name.
Your layer's lifetime will be determined by the lifetime of the map it is
created in. If the map is destroyed (on the X-Plane side), your layer will
be too, and you'll receive a callback to your
XPLMMapWillBeDeletedCallback_f.
}
{
XPLMMapLayerType
Indicates the type of map layer you are creating. Fill layers will always
be drawn beneath markings layers.
}
TYPE
XPLMMapLayerType = (
{ A layer that draws "fill" graphics, like weather patterns, terrain, etc. }
{ Fill layers frequently cover a large portion of the visible map area. }
xplm_MapLayer_Fill = 0
{ A layer that provides markings for particular map features, like NAVAIDs, }
{ airports, etc. Even dense markings layers cover a small portion of the }
{ total map area. }
,xplm_MapLayer_Markings = 1
);
PXPLMMapLayerType = ^XPLMMapLayerType;
CONST
{ Globally unique identifier for X-Plane's Map window, used as the }
{ mapToCreateLayerIn parameter in XPLMCreateMapLayer_t }
XPLM_MAP_USER_INTERFACE = "XPLM_MAP_USER_INTERFACE";
{ Globally unique identifier for X-Plane's Instructor Operator Station }
{ window, used as the mapToCreateLayerIn parameter in XPLMCreateMapLayer_t }
XPLM_MAP_IOS = "XPLM_MAP_IOS";
{
XPLMCreateMapLayer_t
This structure defines all of the parameters used to create a map layer
using XPLMCreateMapLayer. The structure will be expanded in future SDK APIs
to include more features. Always set the structSize member to the size of
your struct in bytes!
Each layer must be associated with exactly one map instance in X-Plane.
That map, and that map alone, will call your callbacks. Likewise, when that
map is deleted, your layer will be as well.
}
TYPE
XPLMCreateMapLayer_t = RECORD
{ Used to inform XPLMCreateMapLayer() of the SDK version you compiled }
{ against; should always be set to sizeof(XPLMCreateMapLayer_t) }
structSize : Integer;
{ Globally unique string identifying the map you want this layer to appear }
{ in. As of XPLM300, this is limited to one of XPLM_MAP_USER_INTERFACE or }
{ XPLM_MAP_IOS }
mapToCreateLayerIn : XPLMString;
{ The type of layer you are creating, used to determine draw order (all }
{ plugin-created markings layers are drawn above all plugin-created fill }
{ layers) }
layerType : XPLMMapLayerType;
{ Optional callback to inform you this layer is being deleted (due to its }
{ owning map being destroyed) }
willBeDeletedCallback : XPLMMapWillBeDeletedCallback_f;
{ Optional callback you want to use to prepare your draw cache when the map }
{ bounds change (set to NULL if you don't want this callback) }
prepCacheCallback : XPLMMapPrepareCacheCallback_f;
{ Optional callback you want to use for arbitrary OpenGL drawing, which goes }
{ beneath all icons in the map's layering system (set to NULL if you don't }
{ want this callback) }
drawCallback : XPLMMapDrawingCallback_f;
{ Optional callback you want to use for drawing icons, which go above all }
{ built-in X-Plane icons (except the aircraft) in the map's layering system }
{ (set to NULL if you don't want this callback) }
iconCallback : XPLMMapIconDrawingCallback_f;
{ Optional callback you want to use for drawing map labels, which go above }
{ all built-in X-Plane icons and labels (except those of aircraft) in the }
{ map's layering system (set to NULL if you don't want this callback) }
labelCallback : XPLMMapLabelDrawingCallback_f;
{ True if you want a checkbox to be created in the map UI to toggle this }
{ layer on and off; false if the layer should simply always be enabled }
showUiToggle : Integer;
{ Short label to use for this layer in the user interface }
layerName : XPLMString;
{ A reference to arbitrary data that will be passed to your callbacks }
refcon : pointer;
END;
PXPLMCreateMapLayer_t = ^XPLMCreateMapLayer_t;
{
XPLMCreateMapLayer
This routine creates a new map layer. You pass in an XPLMCreateMapLayer_t
structure with all of the fields set in. You must set the structSize of
the structure to the size of the actual structure you used.
Returns NULL if the layer creation failed. This happens most frequently
because the map you specified in your
XPLMCreateMapLayer_t::mapToCreateLayerIn field doesn't exist (that is, if
XPLMMapExists() returns 0 for the specified map). You can use
XPLMRegisterMapCreationHook() to get a notification each time a new map is
opened in X-Plane, at which time you can create layers in it.
}
FUNCTION XPLMCreateMapLayer(
inParams : PXPLMCreateMapLayer_t) : XPLMMapLayerID;
cdecl; external XPLM_DLL;
{
XPLMDestroyMapLayer
Destroys a map layer you created (calling your
XPLMMapWillBeDeletedCallback_f if applicable). Returns true if a deletion
took place.
}
FUNCTION XPLMDestroyMapLayer(
inLayer : XPLMMapLayerID) : Integer;
cdecl; external XPLM_DLL;
{
XPLMMapCreatedCallback_f
A callback to notify your plugin that a new map has been created in
X-Plane. This is the best time to add a custom map layer using
XPLMCreateMapLayer().
No OpenGL drawing is permitted within this callback.
}
TYPE
XPLMMapCreatedCallback_f = PROCEDURE(
mapIdentifier : XPLMString;
refcon : pointer); cdecl;
{
XPLMRegisterMapCreationHook
Registers your callback to receive a notification each time a new map is
constructed in X-Plane. This callback is the best time to add your custom
map layer using XPLMCreateMapLayer().
Note that you will not be notified about any maps that already exist---you
can use XPLMMapExists() to check for maps that were created previously.
}
PROCEDURE XPLMRegisterMapCreationHook(
callback : XPLMMapCreatedCallback_f;
refcon : pointer);
cdecl; external XPLM_DLL;
{
XPLMMapExists
Returns 1 if the map with the specified identifier already exists in
X-Plane. In that case, you can safely call XPLMCreateMapLayer() specifying
that your layer should be added to that map.
}
FUNCTION XPLMMapExists(
mapIdentifier : XPLMString) : Integer;
cdecl; external XPLM_DLL;
{$ENDIF XPLM300}
{$IFDEF XPLM300}
{___________________________________________________________________________
* MAP DRAWING
___________________________________________________________________________}
{
These APIs are only valid from within a map drawing callback (one of
XPLMIconDrawingCallback_t or XPLMMapLabelDrawingCallback_f). Your drawing
callbacks are registered when you create a new map layer as part of your
XPLMCreateMapLayer_t. The functions here hook into X-Plane's built-in map
drawing functionality for icons and labels, so that you get a consistent
style with the rest of the X-Plane map.
Note that the X-Plane 11 map introduces a strict ordering: layers of type
xplm_MapLayer_Fill get drawn beneath all xplm_MapLayer_Markings layers.
Likewise, all OpenGL drawing (performed in your layer's
XPLMMapDrawingCallback_f) will appear beneath any icons and labels you
draw.
}
{
XPLMMapOrientation
Indicates whether a map element should be match its rotation to the map
itself, or to the user interface. For instance, the map itself may be
rotated such that "up" matches the user's aircraft, but you may want to
draw a text label such that it is always rotated zero degrees relative to
the user's perspective. In that case, you would have it draw with UI
orientation.
}
TYPE
XPLMMapOrientation = (
{ Orient such that a 0 degree rotation matches the map's north }
xplm_MapOrientation_Map = 0
{ Orient such that a 0 degree rotation is "up" relative to the user interface}
,xplm_MapOrientation_UI = 1
);
PXPLMMapOrientation = ^XPLMMapOrientation;
{
XPLMDrawMapIconFromSheet
Enables plugin-created map layers to draw PNG icons using X-Plane's
built-in icon drawing functionality. Only valid from within an
XPLMIconDrawingCallback_t (but you can request an arbitrary number of icons
to be drawn from within your callback).
X-Plane will automatically manage the memory for your texture so that it
only has to be loaded from disk once as long as you continue drawing it
per-frame. (When you stop drawing it, the memory may purged in a "garbage
collection" pass, require a load from disk in the future.)
Instead of having X-Plane draw a full PNG, this method allows you to use UV
coordinates to request a portion of the image to be drawn. This allows you
to use a single texture load (of an icon sheet, for example) to draw many
icons. Doing so is much more efficient than drawing a dozen different small
PNGs.
The UV coordinates used here treat the texture you load as being comprised
of a number of identically sized "cells." You specify the width and height
in cells (ds and dt, respectively), as well as the coordinates within the
cell grid for the sub-image you'd like to draw.
Note that you can use different ds and dt values in subsequent calls with
the same texture sheet. This enables you to use icons of different sizes in
the same sheet if you arrange them properly in the PNG.
This function is only valid from within an XPLMIconDrawingCallback_t (but
you can request an arbitrary number of icons to be drawn from within your
callback).
}
PROCEDURE XPLMDrawMapIconFromSheet(
layer : XPLMMapLayerID;
inPngPath : XPLMString;
s : Integer;
t : Integer;
ds : Integer;
dt : Integer;
mapX : Single;
mapY : Single;
orientation : XPLMMapOrientation;
rotationDegrees : Single;
mapWidth : Single);
cdecl; external XPLM_DLL;
{
XPLMDrawMapLabel
Enables plugin-created map layers to draw text labels using X-Plane's
built-in labeling functionality. Only valid from within an
XPLMMapLabelDrawingCallback_f (but you can request an arbitrary number of
text labels to be drawn from within your callback).
}
PROCEDURE XPLMDrawMapLabel(
layer : XPLMMapLayerID;
inText : XPLMString;
mapX : Single;
mapY : Single;
orientation : XPLMMapOrientation;
rotationDegrees : Single);
cdecl; external XPLM_DLL;
{$ENDIF XPLM300}
{$IFDEF XPLM300}
{___________________________________________________________________________
* MAP PROJECTIONS
___________________________________________________________________________}
{
As of X-Plane 11, the map draws using true cartographic projections, and
different maps may use different projections. Thus, to draw at a particular
latitude and longitude, you must first transform your real-world
coordinates into map coordinates.
The map projection is also responsible for giving you the current scale of
the map. That is, the projection can tell you how many map units correspond
to 1 meter at a given point.
Finally, the map projection can give you the current rotation of the map.
Since X-Plane 11 maps can rotate to match the heading of the aircraft, the
map's rotation can potentially change every frame.
}
{
XPLMMapProject
Projects a latitude/longitude into map coordinates. This is the inverse of
XPLMMapUnproject().
Only valid from within a map layer callback (one of
XPLMMapPrepareCacheCallback_f, XPLMMapDrawingCallback_f,
XPLMMapIconDrawingCallback_f, or XPLMMapLabelDrawingCallback_f.)
}
PROCEDURE XPLMMapProject(
projection : XPLMMapProjectionID;
latitude : Real;
longitude : Real;
outX : PSingle;
outY : PSingle);
cdecl; external XPLM_DLL;
{
XPLMMapUnproject
Transforms map coordinates back into a latitude and longitude. This is the
inverse of XPLMMapProject().
Only valid from within a map layer callback (one of
XPLMMapPrepareCacheCallback_f, XPLMMapDrawingCallback_f,
XPLMMapIconDrawingCallback_f, or XPLMMapLabelDrawingCallback_f.)
}
PROCEDURE XPLMMapUnproject(
projection : XPLMMapProjectionID;
mapX : Single;
mapY : Single;
outLatitude : PReal;
outLongitude : PReal);
cdecl; external XPLM_DLL;
{
XPLMMapScaleMeter
Returns the number of map units that correspond to a distance of one meter
at a given set of map coordinates.
Only valid from within a map layer callback (one of
XPLMMapPrepareCacheCallback_f, XPLMMapDrawingCallback_f,
XPLMMapIconDrawingCallback_f, or XPLMMapLabelDrawingCallback_f.)
}
FUNCTION XPLMMapScaleMeter(
projection : XPLMMapProjectionID;
mapX : Single;
mapY : Single) : Single;
cdecl; external XPLM_DLL;
{
XPLMMapGetNorthHeading
Returns the heading (in degrees clockwise) from the positive Y axis in the
cartesian mapping coordinate system to true north at the point passed in.
You can use it as a clockwise rotational offset to align icons and other
2-d drawing with true north on the map, compensating for rotations in the
map due to projection.
Only valid from within a map layer callback (one of
XPLMMapPrepareCacheCallback_f, XPLMMapDrawingCallback_f,
XPLMMapIconDrawingCallback_f, or XPLMMapLabelDrawingCallback_f.)
}
FUNCTION XPLMMapGetNorthHeading(
projection : XPLMMapProjectionID;
mapX : Single;
mapY : Single) : Single;
cdecl; external XPLM_DLL;
{$ENDIF XPLM300}
IMPLEMENTATION
END.
+277
View File
@@ -0,0 +1,277 @@
{
Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See
license.txt for usage. X-Plane SDK Version: 2.1.1
}
UNIT XPLMMenus;
INTERFACE
{
Plug-ins can create menus in the menu bar of X-Plane. This is done by
creating a menu and then creating items. Menus are referred to by an
opaque ID. Items are referred to by (zero-based) index number.
Menus are "sandboxed" between plugins---no plugin can access the menus of
any other plugin. Furthermore, all menu indices are relative to your
plugin's menus only; if your plugin creates two sub-menus in the Plugins
menu at different times, it doesn't matter how many other plugins also
create sub-menus of Plugins in the intervening time: your sub-menus will be
given menu indices 0 and 1. (The SDK does some work in the back-end to
filter out menus that are irrelevant to your plugin in order to deliver
this consistency for each plugin.)
When you create a menu item, you specify how we should handle clicks on
that menu item. You can either have the XPLM trigger a callback (the
XPLMMenuHandler_f associated with the menu that contains the item), or you
can simply have a command be triggered (with no associated call to your
menu handler). The advantage of the latter method is that X-Plane will
display any keyboard shortcuts associated with the command. (In contrast,
there are no keyboard shortcuts associated with menu handler callbacks with
specific parameters.)
Menu text in X-Plane is UTF8; X-Plane's character set covers latin, greek
and cyrillic characters, Katakana, as well as some Japanese symbols. Some
APIs have a inDeprecatedAndIgnored parameter that used to select a
character set; since X-Plane 9 all localization is done via UTF-8 only.
}
USES
XPLMDefs, XPLMUtilities;
{$A4}
{___________________________________________________________________________
* XPLM MENUS
___________________________________________________________________________}
{
XPLMMenuCheck
These enumerations define the various 'check' states for an X-Plane menu.
'checking' in X-Plane actually appears as a light which may or may not be
lit. So there are three possible states.
}
TYPE
XPLMMenuCheck = (
{ there is no symbol to the left of the menu item. }
xplm_Menu_NoCheck = 0
{ the menu has a mark next to it that is unmarked (not lit). }
,xplm_Menu_Unchecked = 1
{ the menu has a mark next to it that is checked (lit). }
,xplm_Menu_Checked = 2
);
PXPLMMenuCheck = ^XPLMMenuCheck;
{
XPLMMenuID
This is a unique ID for each menu you create.
}
XPLMMenuID = pointer;
PXPLMMenuID = ^XPLMMenuID;
{
XPLMMenuHandler_f
A menu handler function takes two reference pointers, one for the menu
(specified when the menu was created) and one for the item (specified when
the item was created).
}
XPLMMenuHandler_f = PROCEDURE(
inMenuRef : pointer;
inItemRef : pointer); cdecl;
{
XPLMFindPluginsMenu
This function returns the ID of the plug-ins menu, which is created for you
at startup.
}
FUNCTION XPLMFindPluginsMenu: XPLMMenuID;
cdecl; external XPLM_DLL;
{$IFDEF XPLM300}
{
XPLMFindAircraftMenu
This function returns the ID of the menu for the currently-loaded aircraft,
used for showing aircraft-specific commands.
The aircraft menu is created by X-Plane at startup, but it remains hidden
until it is populated via XPLMAppendMenuItem() or
XPLMAppendMenuItemWithCommand().
Only plugins loaded with the user's current aircraft are allowed to access
the aircraft menu. For all other plugins, this will return NULL, and any
attempts to add menu items to it will fail.
}
FUNCTION XPLMFindAircraftMenu: XPLMMenuID;
cdecl; external XPLM_DLL;
{$ENDIF XPLM300}
{
XPLMCreateMenu
This function creates a new menu and returns its ID. It returns NULL if
the menu cannot be created. Pass in a parent menu ID and an item index to
create a submenu, or NULL for the parent menu to put the menu in the menu
bar. The menu's name is only used if the menu is in the menubar. You also
pass a handler function and a menu reference value. Pass NULL for the
handler if you do not need callbacks from the menu (for example, if it only
contains submenus).
Important: you must pass a valid, non-empty menu title even if the menu is
a submenu where the title is not visible.
}
FUNCTION XPLMCreateMenu(
inName : XPLMString;
inParentMenu : XPLMMenuID;
inParentItem : Integer;
inHandler : XPLMMenuHandler_f;
inMenuRef : pointer) : XPLMMenuID;
cdecl; external XPLM_DLL;
{
XPLMDestroyMenu
This function destroys a menu that you have created. Use this to remove a
submenu if necessary. (Normally this function will not be necessary.)
}
PROCEDURE XPLMDestroyMenu(
inMenuID : XPLMMenuID);
cdecl; external XPLM_DLL;
{
XPLMClearAllMenuItems
This function removes all menu items from a menu, allowing you to rebuild
it. Use this function if you need to change the number of items on a menu.
}
PROCEDURE XPLMClearAllMenuItems(
inMenuID : XPLMMenuID);
cdecl; external XPLM_DLL;
{
XPLMAppendMenuItem
This routine appends a new menu item to the bottom of a menu and returns
its index. Pass in the menu to add the item to, the items name, and a void
* ref for this item.
Returns a negative index if the append failed (due to an invalid parent
menu argument).
Note that all menu indices returned are relative to your plugin's menus
only; if your plugin creates two sub-menus in the Plugins menu at different
times, it doesn't matter how many other plugins also create sub-menus of
Plugins in the intervening time: your sub-menus will be given menu indices
0 and 1. (The SDK does some work in the back-end to filter out menus that
are irrelevant to your plugin in order to deliver this consistency for each
plugin.)
}
FUNCTION XPLMAppendMenuItem(
inMenu : XPLMMenuID;
inItemName : XPLMString;
inItemRef : pointer;
inDeprecatedAndIgnored: Integer) : Integer;
cdecl; external XPLM_DLL;
{$IFDEF XPLM300}
{
XPLMAppendMenuItemWithCommand
Like XPLMAppendMenuItem(), but instead of the new menu item triggering the
XPLMMenuHandler_f of the containiner menu, it will simply execute the
command you pass in. Using a command for your menu item allows the user to
bind a keyboard shortcut to the command and see that shortcut represented
in the menu.
Returns a negative index if the append failed (due to an invalid parent
menu argument).
Like XPLMAppendMenuItem(), all menu indices are relative to your plugin's
menus only.
}
FUNCTION XPLMAppendMenuItemWithCommand(
inMenu : XPLMMenuID;
inItemName : XPLMString;
inCommandToExecute : XPLMCommandRef) : Integer;
cdecl; external XPLM_DLL;
{$ENDIF XPLM300}
{
XPLMAppendMenuSeparator
This routine adds a separator to the end of a menu.
Returns a negative index if the append failed (due to an invalid parent
menu argument).
}
PROCEDURE XPLMAppendMenuSeparator(
inMenu : XPLMMenuID);
cdecl; external XPLM_DLL;
{
XPLMSetMenuItemName
This routine changes the name of an existing menu item. Pass in the menu
ID and the index of the menu item.
}
PROCEDURE XPLMSetMenuItemName(
inMenu : XPLMMenuID;
inIndex : Integer;
inItemName : XPLMString;
inDeprecatedAndIgnored: Integer);
cdecl; external XPLM_DLL;
{
XPLMCheckMenuItem
Set whether a menu item is checked. Pass in the menu ID and item index.
}
PROCEDURE XPLMCheckMenuItem(
inMenu : XPLMMenuID;
index : Integer;
inCheck : XPLMMenuCheck);
cdecl; external XPLM_DLL;
{
XPLMCheckMenuItemState
This routine returns whether a menu item is checked or not. A menu item's
check mark may be on or off, or a menu may not have an icon at all.
}
PROCEDURE XPLMCheckMenuItemState(
inMenu : XPLMMenuID;
index : Integer;
outCheck : PXPLMMenuCheck);
cdecl; external XPLM_DLL;
{
XPLMEnableMenuItem
Sets whether this menu item is enabled. Items start out enabled.
}
PROCEDURE XPLMEnableMenuItem(
inMenu : XPLMMenuID;
index : Integer;
enabled : Integer);
cdecl; external XPLM_DLL;
{$IFDEF XPLM210}
{
XPLMRemoveMenuItem
Removes one item from a menu. Note that all menu items below are moved up
one; your plugin must track the change in index numbers.
}
PROCEDURE XPLMRemoveMenuItem(
inMenu : XPLMMenuID;
inIndex : Integer);
cdecl; external XPLM_DLL;
{$ENDIF XPLM210}
IMPLEMENTATION
END.
+350
View File
@@ -0,0 +1,350 @@
{
Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See
license.txt for usage. X-Plane SDK Version: 2.1.1
}
UNIT XPLMNavigation;
INTERFACE
{
The XPLM Navigation APIs give you some access to the navigation databases
inside X-Plane. X-Plane stores all navigation information in RAM, so by
using these APIs you can gain access to most information without having to
go to disk or parse the files yourself.
You can also use this API to program the FMS. You must use the navigation
APIs to find the nav-aids you want to program into the FMS, since the FMS
is powered internally by X-Plane's navigation database.
}
USES
XPLMDefs;
{$A4}
{___________________________________________________________________________
* NAVIGATION DATABASE ACCESS
___________________________________________________________________________}
{
XPLMNavType
These enumerations define the different types of navaids. They are each
defined with a separate bit so that they may be bit-wise added together to
form sets of nav-aid types.
NOTE: xplm_Nav_LatLon is a specific lat-lon coordinate entered into the
FMS. It will not exist in the database, and cannot be programmed into the
FMS. Querying the FMS for navaids will return it. Use
XPLMSetFMSEntryLatLon to set a lat/lon waypoint.
}
TYPE
XPLMNavType = (
xplm_Nav_Unknown = 0
,xplm_Nav_Airport = 1
,xplm_Nav_NDB = 2
,xplm_Nav_VOR = 4
,xplm_Nav_ILS = 8
,xplm_Nav_Localizer = 16
,xplm_Nav_GlideSlope = 32
,xplm_Nav_OuterMarker = 64
,xplm_Nav_MiddleMarker = 128
,xplm_Nav_InnerMarker = 256
,xplm_Nav_Fix = 512
,xplm_Nav_DME = 1024
,xplm_Nav_LatLon = 2048
);
PXPLMNavType = ^XPLMNavType;
{
XPLMNavRef
XPLMNavRef is an iterator into the navigation database. The navigation
database is essentially an array, but it is not necessarily densely
populated. The only assumption you can safely make is that like-typed
nav-aids are grouped together.
Use XPLMNavRef to refer to a nav-aid.
XPLM_NAV_NOT_FOUND is returned by functions that return an XPLMNavRef when
the iterator must be invalid.
}
XPLMNavRef = Integer;
PXPLMNavRef = ^XPLMNavRef;
CONST
XPLM_NAV_NOT_FOUND = -1;
{
XPLMGetFirstNavAid
This returns the very first navaid in the database. Use this to traverse
the entire database. Returns XPLM_NAV_NOT_FOUND if the nav database is
empty.
}
FUNCTION XPLMGetFirstNavAid: XPLMNavRef;
cdecl; external XPLM_DLL;
{
XPLMGetNextNavAid
Given a valid nav aid ref, this routine returns the next navaid. It
returns XPLM_NAV_NOT_FOUND if the nav aid passed in was invalid or if the
navaid passed in was the last one in the database. Use this routine to
iterate across all like-typed navaids or the entire database.
}
FUNCTION XPLMGetNextNavAid(
inNavAidRef : XPLMNavRef) : XPLMNavRef;
cdecl; external XPLM_DLL;
{
XPLMFindFirstNavAidOfType
This routine returns the ref of the first navaid of the given type in the
database or XPLM_NAV_NOT_FOUND if there are no navaids of that type in the
database. You must pass exactly one nav aid type to this routine.
}
FUNCTION XPLMFindFirstNavAidOfType(
inType : XPLMNavType) : XPLMNavRef;
cdecl; external XPLM_DLL;
{
XPLMFindLastNavAidOfType
This routine returns the ref of the last navaid of the given type in the
database or XPLM_NAV_NOT_FOUND if there are no navaids of that type in the
database. You must pass exactly one nav aid type to this routine.
}
FUNCTION XPLMFindLastNavAidOfType(
inType : XPLMNavType) : XPLMNavRef;
cdecl; external XPLM_DLL;
{
XPLMFindNavAid
This routine provides a number of searching capabilities for the nav
database. XPLMFindNavAid will search through every nav aid whose type is
within inType (multiple types may be added together) and return any
nav-aids found based on the following rules:
* If inLat and inLon are not NULL, the navaid nearest to that lat/lon will
be returned, otherwise the last navaid found will be returned.
* If inFrequency is not NULL, then any navaids considered must match this
frequency. Note that this will screen out radio beacons that do not have
frequency data published (like inner markers) but not fixes and airports.
* If inNameFragment is not NULL, only navaids that contain the fragment in
their name will be returned.
* If inIDFragment is not NULL, only navaids that contain the fragment in
their IDs will be returned.
This routine provides a simple way to do a number of useful searches:
* Find the nearest navaid on this frequency.
* Find the nearest airport.
* Find the VOR whose ID is "KBOS".
* Find the nearest airport whose name contains "Chicago".
}
FUNCTION XPLMFindNavAid(
inNameFragment : XPLMString; { Can be nil }
inIDFragment : XPLMString; { Can be nil }
inLat : PSingle; { Can be nil }
inLon : PSingle; { Can be nil }
inFrequency : PInteger; { Can be nil }
inType : XPLMNavType) : XPLMNavRef;
cdecl; external XPLM_DLL;
{
XPLMGetNavAidInfo
This routine returns information about a navaid. Any non-null field is
filled out with information if it is available.
Frequencies are in the nav.dat convention as described in the X-Plane nav
database FAQ: NDB frequencies are exact, all others are multiplied by 100.
The buffer for IDs should be at least 6 chars and the buffer for names
should be at least 41 chars, but since these values are likely to go up, I
recommend passing at least 32 chars for IDs and 256 chars for names when
possible.
The outReg parameter tells if the navaid is within the local "region" of
loaded DSFs. (This information may not be particularly useful to plugins.)
The parameter is a single byte value 1 for true or 0 for false, not a C
string.
}
PROCEDURE XPLMGetNavAidInfo(
inRef : XPLMNavRef;
outType : PXPLMNavType; { Can be nil }
outLatitude : PSingle; { Can be nil }
outLongitude : PSingle; { Can be nil }
outHeight : PSingle; { Can be nil }
outFrequency : PInteger; { Can be nil }
outHeading : PSingle; { Can be nil }
outID : XPLMString; { Can be nil }
outName : XPLMString; { Can be nil }
outReg : XPLMString); { Can be nil }
cdecl; external XPLM_DLL;
{___________________________________________________________________________
* FLIGHT MANAGEMENT COMPUTER
___________________________________________________________________________}
{
Note: the FMS works based on an array of entries. Indices into the array
are zero-based. Each entry is a nav-aid plus an altitude. The FMS tracks
the currently displayed entry and the entry that it is flying to.
The FMS must be programmed with contiguous entries, so clearing an entry at
the end shortens the effective flight plan. There is a max of 100
waypoints in the flight plan.
}
{
XPLMCountFMSEntries
This routine returns the number of entries in the FMS.
}
FUNCTION XPLMCountFMSEntries: Integer;
cdecl; external XPLM_DLL;
{
XPLMGetDisplayedFMSEntry
This routine returns the index of the entry the pilot is viewing.
}
FUNCTION XPLMGetDisplayedFMSEntry: Integer;
cdecl; external XPLM_DLL;
{
XPLMGetDestinationFMSEntry
This routine returns the index of the entry the FMS is flying to.
}
FUNCTION XPLMGetDestinationFMSEntry: Integer;
cdecl; external XPLM_DLL;
{
XPLMSetDisplayedFMSEntry
This routine changes which entry the FMS is showing to the index specified.
}
PROCEDURE XPLMSetDisplayedFMSEntry(
inIndex : Integer);
cdecl; external XPLM_DLL;
{
XPLMSetDestinationFMSEntry
This routine changes which entry the FMS is flying the aircraft toward.
}
PROCEDURE XPLMSetDestinationFMSEntry(
inIndex : Integer);
cdecl; external XPLM_DLL;
{
XPLMGetFMSEntryInfo
This routine returns information about a given FMS entry. If the entry is
an airport or navaid, a reference to a nav entry can be returned allowing
you to find additional information (such as a frequency, ILS heading, name,
etc.). Note that this reference can be XPLM_NAV_NOT_FOUND until the
information has been looked up asynchronously, so after flightplan changes,
it might take up to a second for this field to become populated. The other
information is available immediately. For a lat/lon entry, the lat/lon is
returned by this routine but the navaid cannot be looked up (and the
reference will be XPLM_NAV_NOT_FOUND). FMS name entry buffers should be at
least 256 chars in length.
WARNING: Due to a bug in X-Plane prior to 11.31, the navaid reference will
not be set to XPLM_NAV_NOT_FOUND while no data is available, and instead
just remain the value of the variable that you passed the pointer to.
Therefore, always initialize the variable to XPLM_NAV_NOT_FOUND before
passing the pointer to this function.
}
PROCEDURE XPLMGetFMSEntryInfo(
inIndex : Integer;
outType : PXPLMNavType; { Can be nil }
outID : XPLMString; { Can be nil }
outRef : PXPLMNavRef; { Can be nil }
outAltitude : PInteger; { Can be nil }
outLat : PSingle; { Can be nil }
outLon : PSingle); { Can be nil }
cdecl; external XPLM_DLL;
{
XPLMSetFMSEntryInfo
This routine changes an entry in the FMS to have the destination navaid
passed in and the altitude specified. Use this only for airports, fixes,
and radio-beacon navaids. Currently of radio beacons, the FMS can only
support VORs and NDBs. Use the routines below to clear or fly to a lat/lon.
}
PROCEDURE XPLMSetFMSEntryInfo(
inIndex : Integer;
inRef : XPLMNavRef;
inAltitude : Integer);
cdecl; external XPLM_DLL;
{
XPLMSetFMSEntryLatLon
This routine changes the entry in the FMS to a lat/lon entry with the given
coordinates.
}
PROCEDURE XPLMSetFMSEntryLatLon(
inIndex : Integer;
inLat : Single;
inLon : Single;
inAltitude : Integer);
cdecl; external XPLM_DLL;
{
XPLMClearFMSEntry
This routine clears the given entry, potentially shortening the flight
plan.
}
PROCEDURE XPLMClearFMSEntry(
inIndex : Integer);
cdecl; external XPLM_DLL;
{___________________________________________________________________________
* GPS RECEIVER
___________________________________________________________________________}
{
These APIs let you read data from the GPS unit.
}
{
XPLMGetGPSDestinationType
This routine returns the type of the currently selected GPS destination,
one of fix, airport, VOR or NDB.
}
FUNCTION XPLMGetGPSDestinationType: XPLMNavType;
cdecl; external XPLM_DLL;
{
XPLMGetGPSDestination
This routine returns the current GPS destination.
}
FUNCTION XPLMGetGPSDestination: XPLMNavRef;
cdecl; external XPLM_DLL;
IMPLEMENTATION
END.
+278
View File
@@ -0,0 +1,278 @@
{
Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See
license.txt for usage. X-Plane SDK Version: 2.1.1
}
UNIT XPLMPlanes;
INTERFACE
{
The XPLMPlanes APIs allow you to control the various aircraft in X-Plane,
both the user's and the sim's.
*Note*: unlike almost all other APIs in the SDK, aircraft paths are _full_
file system paths for historical reasons. You'll need to prefix all
relative paths with the X-Plane path as accessed via XPLMGetSystemPath.
}
USES
XPLMDefs;
{$A4}
{___________________________________________________________________________
* USER AIRCRAFT ACCESS
___________________________________________________________________________}
{
XPLMSetUsersAircraft
This routine changes the user's aircraft. Note that this will reinitialize
the user to be on the nearest airport's first runway. Pass in a full path
(hard drive and everything including the .acf extension) to the .acf file.
}
PROCEDURE XPLMSetUsersAircraft(
inAircraftPath : XPLMString);
cdecl; external XPLM_DLL;
{
XPLMPlaceUserAtAirport
This routine places the user at a given airport. Specify the airport by
its X-Plane airport ID (e.g. 'KBOS').
}
PROCEDURE XPLMPlaceUserAtAirport(
inAirportCode : XPLMString);
cdecl; external XPLM_DLL;
{$IFDEF XPLM300}
{
XPLMPlaceUserAtLocation
Places the user at a specific location after performing any necessary
scenery loads.
As with in-air starts initiated from the X-Plane user interface, the
aircraft will always start with its engines running, regardless of the
user's preferences (i.e., regardless of what the dataref
`sim/operation/prefs/startup_running` says).
}
PROCEDURE XPLMPlaceUserAtLocation(
latitudeDegrees : Real;
longitudeDegrees : Real;
elevationMetersMSL : Single;
headingDegreesTrue : Single;
speedMetersPerSecond: Single);
cdecl; external XPLM_DLL;
{$ENDIF XPLM300}
{___________________________________________________________________________
* GLOBAL AIRCRAFT ACCESS
___________________________________________________________________________}
CONST
{ The user's aircraft is always index 0. }
XPLM_USER_AIRCRAFT = 0;
{$IFDEF XPLM_DEPRECATED}
{
XPLMPlaneDrawState_t
This structure contains additional plane parameter info to be passed to
draw plane. Make sure to fill in the size of the structure field with
sizeof(XPLMDrawPlaneState_t) so that the XPLM can tell how many fields you
knew about when compiling your plugin (since more fields may be added
later).
Most of these fields are ratios from 0 to 1 for control input. X-Plane
calculates what the actual controls look like based on the .acf file for
that airplane. Note for the yoke inputs, this is what the pilot of the
plane has commanded (post artificial stability system if there were one)
and affects aelerons, rudder, etc. It is not necessarily related to the
actual position of the plane!
}
TYPE
XPLMPlaneDrawState_t = RECORD
{ The size of the draw state struct. }
structSize : Integer;
{ A ratio from [0..1] describing how far the landing gear is extended. }
gearPosition : Single;
{ Ratio of flap deployment, 0 = up, 1 = full deploy. }
flapRatio : Single;
{ Ratio of spoiler deployment, 0 = none, 1 = full deploy. }
spoilerRatio : Single;
{ Ratio of speed brake deployment, 0 = none, 1 = full deploy. }
speedBrakeRatio : Single;
{ Ratio of slat deployment, 0 = none, 1 = full deploy. }
slatRatio : Single;
{ Wing sweep ratio, 0 = forward, 1 = swept. }
wingSweep : Single;
{ Thrust power, 0 = none, 1 = full fwd, -1 = full reverse. }
thrust : Single;
{ Total pitch input for this plane. }
yokePitch : Single;
{ Total Heading input for this plane. }
yokeHeading : Single;
{ Total Roll input for this plane. }
yokeRoll : Single;
END;
PXPLMPlaneDrawState_t = ^XPLMPlaneDrawState_t;
{$ENDIF XPLM_DEPRECATED}
{
XPLMCountAircraft
This function returns the number of aircraft X-Plane is capable of having,
as well as the number of aircraft that are currently active. These numbers
count the user's aircraft. It can also return the plugin that is currently
controlling aircraft. In X-Plane 7, this routine reflects the number of
aircraft the user has enabled in the rendering options window.
}
PROCEDURE XPLMCountAircraft(
outTotalAircraft : PInteger;
outActiveAircraft : PInteger;
outController : PXPLMPluginID);
cdecl; external XPLM_DLL;
{
XPLMGetNthAircraftModel
This function returns the aircraft model for the Nth aircraft. Indices are
zero based, with zero being the user's aircraft. The file name should be
at least 256 chars in length; the path should be at least 512 chars in
length.
}
PROCEDURE XPLMGetNthAircraftModel(
inIndex : Integer;
outFileName : XPLMString;
outPath : XPLMString);
cdecl; external XPLM_DLL;
{___________________________________________________________________________
* EXCLUSIVE AIRCRAFT ACCESS
___________________________________________________________________________}
{
The following routines require exclusive access to the airplane APIs. Only
one plugin may have this access at a time.
}
{
XPLMPlanesAvailable_f
Your airplanes available callback is called when another plugin gives up
access to the multiplayer planes. Use this to wait for access to
multiplayer.
}
TYPE
XPLMPlanesAvailable_f = PROCEDURE(
inRefcon : pointer); cdecl;
{
XPLMAcquirePlanes
XPLMAcquirePlanes grants your plugin exclusive access to the aircraft. It
returns 1 if you gain access, 0 if you do not.
inAircraft - pass in an array of pointers to strings specifying the planes
you want loaded. For any plane index you do not want loaded, pass a
0-length string. Other strings should be full paths with the .acf
extension. NULL terminates this array, or pass NULL if there are no planes
you want loaded.
If you pass in a callback and do not receive access to the planes your
callback will be called when the airplanes are available. If you do receive
airplane access, your callback will not be called.
}
FUNCTION XPLMAcquirePlanes(
inAircraft : PXPLMString; { Can be nil }
inCallback : XPLMPlanesAvailable_f;
inRefcon : pointer) : Integer;
cdecl; external XPLM_DLL;
{
XPLMReleasePlanes
Call this function to release access to the planes. Note that if you are
disabled, access to planes is released for you and you must reacquire it.
}
PROCEDURE XPLMReleasePlanes;
cdecl; external XPLM_DLL;
{
XPLMSetActiveAircraftCount
This routine sets the number of active planes. If you pass in a number
higher than the total number of planes availables, only the total number of
planes available is actually used.
}
PROCEDURE XPLMSetActiveAircraftCount(
inCount : Integer);
cdecl; external XPLM_DLL;
{
XPLMSetAircraftModel
This routine loads an aircraft model. It may only be called if you have
exclusive access to the airplane APIs. Pass in the path of the model with
the .acf extension. The index is zero based, but you may not pass in 0
(use XPLMSetUsersAircraft to load the user's aircracft).
}
PROCEDURE XPLMSetAircraftModel(
inIndex : Integer;
inAircraftPath : XPLMString);
cdecl; external XPLM_DLL;
{
XPLMDisableAIForPlane
This routine turns off X-Plane's AI for a given plane. The plane will
continue to draw and be a real plane in X-Plane, but will not move itself.
}
PROCEDURE XPLMDisableAIForPlane(
inPlaneIndex : Integer);
cdecl; external XPLM_DLL;
{$IFDEF XPLM_DEPRECATED}
{
XPLMDrawAircraft
WARNING: Aircraft drawing via this API is deprecated and will not work in
future versions of X-Plane. Use XPLMInstance for 3-d drawing of custom
aircraft models.
This routine draws an aircraft. It can only be called from a 3-d drawing
callback. Pass in the position of the plane in OpenGL local coordinates
and the orientation of the plane. A 1 for full drawing indicates that the
whole plane must be drawn; a 0 indicates you only need the nav lights
drawn. (This saves rendering time when planes are far away.)
}
PROCEDURE XPLMDrawAircraft(
inPlaneIndex : Integer;
inX : Single;
inY : Single;
inZ : Single;
inPitch : Single;
inRoll : Single;
inYaw : Single;
inFullDraw : Integer;
inDrawStateInfo : PXPLMPlaneDrawState_t);
cdecl; external XPLM_DLL;
{$ENDIF XPLM_DEPRECATED}
{$IFDEF XPLM_DEPRECATED}
{
XPLMReinitUsersPlane
WARNING: DO NOT USE. Use XPLMPlaceUserAtAirport or
XPLMPlaceUserAtLocation.
This function recomputes the derived flight model data from the aircraft
structure in memory. If you have used the data access layer to modify the
aircraft structure, use this routine to resynchronize X-Plane; since
X-Plane works at least partly from derived values, the sim will not behave
properly until this is called.
WARNING: this routine does not necessarily place the airplane at the
airport; use XPLMSetUsersAircraft to be compatible. This routine is
provided to do special experimentation with flight models without resetting
flight.
}
PROCEDURE XPLMReinitUsersPlane;
cdecl; external XPLM_DLL;
{$ENDIF XPLM_DEPRECATED}
IMPLEMENTATION
END.
+413
View File
@@ -0,0 +1,413 @@
{
Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See
license.txt for usage. X-Plane SDK Version: 2.1.1
}
UNIT XPLMPlugin;
INTERFACE
{
These APIs provide facilities to find and work with other plugins and
manage other plugins.
}
USES
XPLMDefs;
{$A4}
{___________________________________________________________________________
* FINDING PLUGINS
___________________________________________________________________________}
{
These APIs allow you to find another plugin or yourself, or iterate across
all plugins. For example, if you wrote an FMS plugin that needed to talk
to an autopilot plugin, you could use these APIs to locate the autopilot
plugin.
}
{
XPLMGetMyID
This routine returns the plugin ID of the calling plug-in. Call this to
get your own ID.
}
FUNCTION XPLMGetMyID: XPLMPluginID;
cdecl; external XPLM_DLL;
{
XPLMCountPlugins
This routine returns the total number of plug-ins that are loaded, both
disabled and enabled.
}
FUNCTION XPLMCountPlugins: Integer;
cdecl; external XPLM_DLL;
{
XPLMGetNthPlugin
This routine returns the ID of a plug-in by index. Index is 0 based from 0
to XPLMCountPlugins-1, inclusive. Plugins may be returned in any arbitrary
order.
}
FUNCTION XPLMGetNthPlugin(
inIndex : Integer) : XPLMPluginID;
cdecl; external XPLM_DLL;
{
XPLMFindPluginByPath
This routine returns the plug-in ID of the plug-in whose file exists at the
passed in absolute file system path. XPLM_NO_PLUGIN_ID is returned if the
path does not point to a currently loaded plug-in.
}
FUNCTION XPLMFindPluginByPath(
inPath : XPLMString) : XPLMPluginID;
cdecl; external XPLM_DLL;
{
XPLMFindPluginBySignature
This routine returns the plug-in ID of the plug-in whose signature matches
what is passed in or XPLM_NO_PLUGIN_ID if no running plug-in has this
signature. Signatures are the best way to identify another plug-in as they
are independent of the file system path of a plug-in or the human-readable
plug-in name, and should be unique for all plug-ins. Use this routine to
locate another plugin that your plugin interoperates with
}
FUNCTION XPLMFindPluginBySignature(
inSignature : XPLMString) : XPLMPluginID;
cdecl; external XPLM_DLL;
{
XPLMGetPluginInfo
This routine returns information about a plug-in. Each parameter should be
a pointer to a buffer of at least
256 characters, or NULL to not receive the information.
outName - the human-readable name of the plug-in. outFilePath - the
absolute file path to the file that contains this plug-in. outSignature - a
unique string that identifies this plug-in. outDescription - a
human-readable description of this plug-in.
}
PROCEDURE XPLMGetPluginInfo(
inPlugin : XPLMPluginID;
outName : XPLMString; { Can be nil }
outFilePath : XPLMString; { Can be nil }
outSignature : XPLMString; { Can be nil }
outDescription : XPLMString); { Can be nil }
cdecl; external XPLM_DLL;
{___________________________________________________________________________
* ENABLING/DISABLING PLUG-INS
___________________________________________________________________________}
{
These routines are used to work with plug-ins and manage them. Most
plugins will not need to use these APIs.
}
{
XPLMIsPluginEnabled
Returns whether the specified plug-in is enabled for running.
}
FUNCTION XPLMIsPluginEnabled(
inPluginID : XPLMPluginID) : Integer;
cdecl; external XPLM_DLL;
{
XPLMEnablePlugin
This routine enables a plug-in if it is not already enabled. It returns 1
if the plugin was enabled or successfully enables itself, 0 if it does not.
Plugins may fail to enable (for example, if resources cannot be acquired)
by returning 0 from their XPluginEnable callback.
}
FUNCTION XPLMEnablePlugin(
inPluginID : XPLMPluginID) : Integer;
cdecl; external XPLM_DLL;
{
XPLMDisablePlugin
This routine disableds an enabled plug-in.
}
PROCEDURE XPLMDisablePlugin(
inPluginID : XPLMPluginID);
cdecl; external XPLM_DLL;
{
XPLMReloadPlugins
This routine reloads all plug-ins. Once this routine is called and you
return from the callback you were within (e.g. a menu select callback) you
will receive your XPluginDisable and XPluginStop callbacks and your DLL
will be unloaded, then the start process happens as if the sim was starting
up.
}
PROCEDURE XPLMReloadPlugins;
cdecl; external XPLM_DLL;
{___________________________________________________________________________
* INTERPLUGIN MESSAGING
___________________________________________________________________________}
{
Plugin messages are defined as 32-bit integers. Messages below 0x00FFFFFF
are reserved for X-Plane and the plugin SDK.
Messages come with a pointer parameter; the meaning of this pointer depends
on the message itself. In some messages, the pointer parameter contains an
actual typed pointer to data that can be inspected in the plugin; in these
cases the documentation will state that the parameter "points to"
information.
in other cases, the value of the pointer is actually an integral number
stuffed into the pointer's storage. In these second cases, the pointer
parameter needs to be cast, not dereferenced. In these caess, the
documentation will state that the parameter "contains" a value, which will
always be an integral type.
Some messages don't use the pointer parameter - in this case your plugin
should ignore it.
Messages have two conceptual uses: notifications and commands. Commands
are sent from one plugin to another to induce behavior; notifications are
sent from one plugin to all others for informational purposes. It is
important that commands and notifications not have the same values because
this could cause a notification sent by one plugin to accidentally induce a
command in another.
By convention, plugin-defined notifications should have the high bit set
(e.g. be greater or equal to unsigned 0x8000000) while commands should have
this bit be cleared.
The following messages are sent to your plugin by X-Plane.
}
CONST
{ This message is sent to your plugin whenever the user's plane crashes. The }
{ parameter is ignored. }
XPLM_MSG_PLANE_CRASHED = 101;
{ This message is sent to your plugin whenever a new plane is loaded. The }
{ parameter contains the index number of the plane being loaded; 0 indicates }
{ the user's plane. }
XPLM_MSG_PLANE_LOADED = 102;
{ This messages is sent whenever the user's plane is positioned at a new }
{ airport. The parameter is ignored. }
XPLM_MSG_AIRPORT_LOADED = 103;
{ This message is sent whenever new scenery is loaded. Use datarefs to }
{ determine the new scenery files that were loaded. The parameter is ignored.}
XPLM_MSG_SCENERY_LOADED = 104;
{ This message is sent whenever the user adjusts the number of X-Plane }
{ aircraft models. You must use XPLMCountPlanes to find out how many planes }
{ are now available. This message will only be sent in XP7 and higher }
{ because in XP6 the number of aircraft is not user-adjustable. The parameter}
{ is ignored. }
XPLM_MSG_AIRPLANE_COUNT_CHANGED = 105;
{$IFDEF XPLM200}
CONST
{ This message is sent to your plugin whenever a plane is unloaded. The }
{ parameter contains the index number of the plane being unloaded; 0 }
{ indicates the user's plane. The parameter is of type int, passed as the }
{ value of the pointer. (That is: the parameter is an int, not a pointer to }
{ an int.) }
XPLM_MSG_PLANE_UNLOADED = 106;
{$ENDIF XPLM200}
{$IFDEF XPLM210}
CONST
{ This message is sent to your plugin right before X-Plane writes its }
{ preferences file. You can use this for two purposes: to write your own }
{ preferences, and to modify any datarefs to influence preferences output. }
{ For example, if your plugin temporarily modifies saved preferences, you can}
{ put them back to their default values here to avoid having the tweaks be }
{ persisted if your plugin is not loaded on the next invocation of X-Plane. }
{ The parameter is ignored. }
XPLM_MSG_WILL_WRITE_PREFS = 107;
{$ENDIF XPLM210}
{$IFDEF XPLM210}
{ This message is sent to your plugin right after a livery is loaded for an }
{ airplane. You can use this to check the new livery (via datarefs) and }
{ react accordingly. The parameter contains the index number of the aircraft}
{ whose livery is changing. }
XPLM_MSG_LIVERY_LOADED = 108;
{$ENDIF XPLM210}
{$IFDEF XPLM301}
CONST
{ Sent to your plugin right before X-Plane enters virtual reality mode (at }
{ which time any windows that are not positioned in VR mode will no longer be}
{ visible to the user). The parameter is unused and should be ignored. }
XPLM_MSG_ENTERED_VR = 109;
{$ENDIF XPLM301}
{$IFDEF XPLM301}
{ Sent to your plugin right before X-Plane leaves virtual reality mode (at }
{ which time you may want to clean up windows that are positioned in VR }
{ mode). The parameter is unused and should be ignored. }
XPLM_MSG_EXITING_VR = 110;
{$ENDIF XPLM301}
{$IFDEF XPLM303}
CONST
{ Sent to your plugin if another plugin wants to take over AI planes. If you }
{ are a synthetic traffic provider, that probably means a plugin for an }
{ online network has connected and wants to supply aircraft flown by real }
{ humans and you should cease to provide synthetic traffic. If however you }
{ are providing online traffic from real humans, you probably don't want to }
{ disconnect, in which case you just ignore this message. The sender is the }
{ plugin ID of the plugin asking for control of the planes now. You can use }
{ it to find out who is requesting and whether you should yield to them. }
{ Synthetic traffic providers should always yield to online networks. The }
{ parameter is unused and should be ignored. }
XPLM_MSG_RELEASE_PLANES = 111;
{$ENDIF XPLM303}
{
XPLMSendMessageToPlugin
This function sends a message to another plug-in or X-Plane. Pass
XPLM_NO_PLUGIN_ID to broadcast to all plug-ins. Only enabled plug-ins with
a message receive function receive the message.
}
PROCEDURE XPLMSendMessageToPlugin(
inPlugin : XPLMPluginID;
inMessage : Integer;
inParam : pointer);
cdecl; external XPLM_DLL;
{$IFDEF XPLM200}
{___________________________________________________________________________
* Plugin Features API
___________________________________________________________________________}
{
The plugin features API allows your plugin to "sign up" for additional
capabilities and plugin system features that are normally disabled for
backward compatibility. This allows advanced plugins to "opt-in" to new
behavior.
Each feature is defined by a permanent string name. The feature string
names will vary with the particular installation of X-Plane, so plugins
should not expect a feature to be guaranteed present.
XPLM_WANTS_REFLECTIONS
----------------------
Available in the SDK 2.0 and later for X-Plane 9, enabling this capability
causes your plugin to receive drawing hook callbacks when X-Plane builds
its off-screen reflection and shadow rendering passes. Plugins should
enable this and examine the dataref sim/graphics/view/plane_render_type to
determine whether the drawing callback is for a reflection, shadow
calculation, or the main screen. Rendering can be simlified or omitted for
reflections, and non-solid drawing should be skipped for shadow
calculations.
**Note**: direct drawing via draw callbacks is not recommended; use the
XPLMInstance API to create object models instead.
XPLM_USE_NATIVE_PATHS
---------------------
available in the SDK 2.1 and later for X-Plane 10, this modifies the plugin
system to use Unix-style paths on all operating systems. With this enabled:
* OS X paths will match the native OS X Unix.
* Windows will use forward slashes but preserve C:\ or another drive letter
when using complete file paths.
* Linux uses its native file system path scheme.
Without this enabled:
* OS X will use CFM file paths separated by a colon.
* Windows will use back-slashes and conventional DOS paths.
* Linux uses its native file system path scheme.
All plugins should enable this feature on OS X to access the native file
system.
XPLM_USE_NATIVE_WIDGET_WINDOWS
------------------------------
Available in the SDK 3.0.2 SDK, this capability tells the widgets library
to use new, modern X-Plane backed XPLMDisplay windows to anchor all widget
trees. Without it, widgets will always use legacy windows.
Plugins should enable this to allow their widget hierarchies to respond to
the user's UI size settings and to map widget-based windwos to a VR HMD.
Before enabling this, make sure any custom widget code in your plugin is
prepared to cope with the UI coordinate system not being th same as the
OpenGL window coordinate system.
}
{
XPLMFeatureEnumerator_f
You pass an XPLMFeatureEnumerator_f to get a list of all features supported
by a given version running version of X-Plane. This routine is called once
for each feature.
}
TYPE
XPLMFeatureEnumerator_f = PROCEDURE(
inFeature : XPLMString;
inRef : pointer); cdecl;
{
XPLMHasFeature
This returns 1 if the given installation of X-Plane supports a feature, or
0 if it does not.
}
FUNCTION XPLMHasFeature(
inFeature : XPLMString) : Integer;
cdecl; external XPLM_DLL;
{
XPLMIsFeatureEnabled
This returns 1 if a feature is currently enabled for your plugin, or 0 if
it is not enabled. It is an error to call this routine with an unsupported
feature.
}
FUNCTION XPLMIsFeatureEnabled(
inFeature : XPLMString) : Integer;
cdecl; external XPLM_DLL;
{
XPLMEnableFeature
This routine enables or disables a feature for your plugin. This will
change the running behavior of X-Plane and your plugin in some way,
depending on the feature.
}
PROCEDURE XPLMEnableFeature(
inFeature : XPLMString;
inEnable : Integer);
cdecl; external XPLM_DLL;
{
XPLMEnumerateFeatures
This routine calls your enumerator callback once for each feature that this
running version of X-Plane supports. Use this routine to determine all of
the features that X-Plane can support.
}
PROCEDURE XPLMEnumerateFeatures(
inEnumerator : XPLMFeatureEnumerator_f;
inRef : pointer);
cdecl; external XPLM_DLL;
{$ENDIF XPLM200}
IMPLEMENTATION
END.
+254
View File
@@ -0,0 +1,254 @@
{
Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See
license.txt for usage. X-Plane SDK Version: 2.1.1
}
UNIT XPLMProcessing;
INTERFACE
{
This API allows you to get regular callbacks during the flight loop, the
part of X-Plane where the plane's position calculates the physics of
flight, etc. Use these APIs to accomplish periodic tasks like logging data
and performing I/O.
You can receive a callback either just before or just after the per-frame
physics calculations happen - you can use post-FM callbacks to "patch" the
flight model after it has run.
If the user has set the number of flight model iterations per frame greater
than one your plugin will _not_ see this; these integrations run on the
sub-section of the flight model where iterations improve responsiveness
(e.g. physical integration, not simple systems tracking) and are thus
opaque to plugins.
Flight loop scheduling, when scheduled by time, is scheduled by a "first
callback after the deadline" schedule, e.g. your callbacks will always be
slightly late to ensure that we don't run faster than your deadline.
WARNING: Do NOT use these callbacks to draw! You cannot draw during flight
loop callbacks. Use the drawing callbacks (see XPLMDisplay for more info)
for graphics. (One exception: you can use a post-flight loop callback to
update your own off-screen FBOs.)
}
USES
XPLMDefs;
{$A4}
{___________________________________________________________________________
* FLIGHT LOOP CALLBACKS
___________________________________________________________________________}
{$IFDEF XPLM210}
{
XPLMFlightLoopPhaseType
You can register a flight loop callback to run either before or after the
flight model is integrated by X-Plane.
}
TYPE
XPLMFlightLoopPhaseType = (
{ Your callback runs before X-Plane integrates the flight model. }
xplm_FlightLoop_Phase_BeforeFlightModel = 0
{ Your callback runs after X-Plane integrates the flight model. }
,xplm_FlightLoop_Phase_AfterFlightModel = 1
);
PXPLMFlightLoopPhaseType = ^XPLMFlightLoopPhaseType;
{$ENDIF XPLM210}
{$IFDEF XPLM210}
{
XPLMFlightLoopID
This is an opaque identifier for a flight loop callback. You can use this
identifier to easily track and remove your callbacks, or to use the new
flight loop APIs.
}
XPLMFlightLoopID = pointer;
PXPLMFlightLoopID = ^XPLMFlightLoopID;
{$ENDIF XPLM210}
{
XPLMFlightLoop_f
This is your flight loop callback. Each time the flight loop is iterated
through, you receive this call at the end.
Flight loop callbacks receive a number of input timing parameters. These
input timing parameters are not particularly useful; you may need to track
your own timing data (e.g. by reading datarefs). The input parameters are:
- inElapsedSinceLastCall: the wall time since your last callback.
- inElapsedTimeSinceLastFlightLoop: the wall time since any flight loop was
dispatched.
- inCounter: a monotonically increasing counter, bumped once per flight
loop dispatch from the sim.
- inRefcon: your own ptr constant from when you regitered yor callback.
Your return value controls when you will next be called.
- Return 0 to stop receiving callbacks.
- Pass a positive number to specify how many seconds until the next
callback. (You will be called at or after this time, not before.)
- Pass a negative number to specify how many loops must go by until you
are called. For example, -1.0 means call me the very next loop.
Try to run your flight loop as infrequently as is practical, and suspend it
(using return value 0) when you do not need it; lots of flight loop
callbacks that do nothing lowers X-Plane's frame rate.
Your callback will NOT be unregistered if you return 0; it will merely be
inactive.
}
TYPE
XPLMFlightLoop_f = FUNCTION(
inElapsedSinceLastCall: Single;
inElapsedTimeSinceLastFlightLoop: Single;
inCounter : Integer;
inRefcon : pointer) : Single; cdecl;
{$IFDEF XPLM210}
{
XPLMCreateFlightLoop_t
XPLMCreateFlightLoop_t contains the parameters to create a new flight loop
callback. The strsucture can be expanded in future SDKs - always set
structSize to the size of your structure in bytes.
}
TYPE
XPLMCreateFlightLoop_t = RECORD
structSize : Integer;
phase : XPLMFlightLoopPhaseType;
callbackFunc : XPLMFlightLoop_f;
refcon : pointer;
END;
PXPLMCreateFlightLoop_t = ^XPLMCreateFlightLoop_t;
{$ENDIF XPLM210}
{
XPLMGetElapsedTime
This routine returns the elapsed time since the sim started up in decimal
seconds. This is a wall timer; it keeps counting upward even if the sim is
pasued.
__WARNING__: XPLMGetElapsedTime is not a very good timer! It lacks
precision in both its data type and its source. Do not attempt to use it
for timing critical applications like network multiplayer.
}
FUNCTION XPLMGetElapsedTime: Single;
cdecl; external XPLM_DLL;
{
XPLMGetCycleNumber
This routine returns a counter starting at zero for each sim cycle
computed/video frame rendered.
}
FUNCTION XPLMGetCycleNumber: Integer;
cdecl; external XPLM_DLL;
{
XPLMRegisterFlightLoopCallback
This routine registers your flight loop callback. Pass in a pointer to a
flight loop function and a refcon. inInterval defines when you will be
called. Pass in a positive number to specify seconds from registration time
to the next callback. Pass in a negative number to indicate when you will
be called (e.g. pass -1 to be called at the next cylcle). Pass 0 to not be
called; your callback will be inactive.
(This legacy function only installs pre-flight-loop callbacks; use
XPLMCreateFlightLoop for more control.)
}
PROCEDURE XPLMRegisterFlightLoopCallback(
inFlightLoop : XPLMFlightLoop_f;
inInterval : Single;
inRefcon : pointer);
cdecl; external XPLM_DLL;
{
XPLMUnregisterFlightLoopCallback
This routine unregisters your flight loop callback. Do NOT call it from
your flight loop callback. Once your flight loop callback is unregistered,
it will not be called again.
Only use this on flight loops registered via
XPLMRegisterFlightLoopCallback.
}
PROCEDURE XPLMUnregisterFlightLoopCallback(
inFlightLoop : XPLMFlightLoop_f;
inRefcon : pointer);
cdecl; external XPLM_DLL;
{
XPLMSetFlightLoopCallbackInterval
This routine sets when a callback will be called. Do NOT call it from your
callback; use the return value of the callback to change your callback
interval from inside your callback.
inInterval is formatted the same way as in XPLMRegisterFlightLoopCallback;
positive for seconds, negative for cycles, and 0 for deactivating the
callback. If inRelativeToNow is 1, times are from the time of this call;
otherwise they are from the time the callback was last called (or the time
it was registered if it has never been called.
}
PROCEDURE XPLMSetFlightLoopCallbackInterval(
inFlightLoop : XPLMFlightLoop_f;
inInterval : Single;
inRelativeToNow : Integer;
inRefcon : pointer);
cdecl; external XPLM_DLL;
{$IFDEF XPLM210}
{
XPLMCreateFlightLoop
This routine creates a flight loop callback and returns its ID. The flight
loop callback is created using the input param struct, and is inited to be
unscheduled.
}
FUNCTION XPLMCreateFlightLoop(
inParams : PXPLMCreateFlightLoop_t) : XPLMFlightLoopID;
cdecl; external XPLM_DLL;
{$ENDIF XPLM210}
{$IFDEF XPLM210}
{
XPLMDestroyFlightLoop
This routine destroys a flight loop callback by ID. Only call it on flight
loops created with the newer XPLMCreateFlightLoop API.
}
PROCEDURE XPLMDestroyFlightLoop(
inFlightLoopID : XPLMFlightLoopID);
cdecl; external XPLM_DLL;
{$ENDIF XPLM210}
{$IFDEF XPLM210}
{
XPLMScheduleFlightLoop
This routine schedules a flight loop callback for future execution. If
inInterval is negative, it is run in a certain number of frames based on
the absolute value of the input. If the interval is positive, it is a
duration in seconds.
If inRelativeToNow is true, ties are interpretted relative to the time this
routine is called; otherwise they are relative to the last call time or the
time the flight loop was registered (if never called).
}
PROCEDURE XPLMScheduleFlightLoop(
inFlightLoopID : XPLMFlightLoopID;
inInterval : Single;
inRelativeToNow : Integer);
cdecl; external XPLM_DLL;
{$ENDIF XPLM210}
IMPLEMENTATION
END.
+434
View File
@@ -0,0 +1,434 @@
{
Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See
license.txt for usage. X-Plane SDK Version: 2.1.1
}
UNIT XPLMScenery;
INTERFACE
{
This package contains APIs to interact with X-Plane's scenery system.
}
USES
XPLMDefs;
{$A4}
{$IFDEF XPLM200}
{___________________________________________________________________________
* Terrain Y-Testing
___________________________________________________________________________}
{
The Y-testing API allows you to locate the physical scenery mesh. This
would be used to place dynamic graphics on top of the ground in a plausible
way or do physics interactions.
The Y-test API works via probe objects, which are allocated by your plugin
and used to query terrain. Probe objects exist both to capture which
algorithm you have requested (see probe types) and also to cache query
information.
Performance Guidelines
----------------------
It is generally faster to use the same probe for nearby points and
different probes for different points. Try not to allocate more than
"hundreds" of probes at most. Share probes if you need more. Generally,
probing operations are expensive, and should be avoided via caching when
possible.
Y testing returns a location on the terrain, a normal vectory, and a
velocity vector. The normal vector tells you the slope of the terrain at
that point. The velocity vector tells you if that terrain is moving (and is
in meters/second). For example, if your Y test hits the aircraft carrier
deck, this tells you the velocity of that point on the deck.
Note: the Y-testing API is limited to probing the loaded scenery area,
which is approximately 300x300 km in X-Plane 9. Probes outside this area
will return the height of a 0 MSL sphere.
}
{
XPLMProbeType
XPLMProbeType defines the type of terrain probe - each probe has a
different algorithm. (Only one type of probe is provided right now, but
future APIs will expose more flexible or poewrful or useful probes.
}
TYPE
XPLMProbeType = (
{ The Y probe gives you the location of the tallest physical scenery along }
{ the Y axis going through the queried point. }
xplm_ProbeY = 0
);
PXPLMProbeType = ^XPLMProbeType;
{
XPLMProbeResult
Probe results - possible results from a probe query.
}
XPLMProbeResult = (
{ The probe hit terrain and returned valid values. }
xplm_ProbeHitTerrain = 0
{ An error in the API call. Either the probe struct size is bad, or the }
{ probe is invalid or the type is mismatched for the specific query call. }
,xplm_ProbeError = 1
{ The probe call succeeded but there is no terrain under this point (perhaps }
{ it is off the side of the planet?) }
,xplm_ProbeMissed = 2
);
PXPLMProbeResult = ^XPLMProbeResult;
{
XPLMProbeRef
An XPLMProbeRef is an opaque handle to a probe, used for querying the
terrain.
}
XPLMProbeRef = pointer;
PXPLMProbeRef = ^XPLMProbeRef;
{
XPLMProbeInfo_t
XPLMProbeInfo_t contains the results of a probe call. Make sure to set
structSize to the size of the struct before using it.
}
XPLMProbeInfo_t = RECORD
{ Size of structure in bytes - always set this before calling the XPLM. }
structSize : Integer;
{ Resulting X location of the terrain point we hit, in local OpenGL }
{ coordinates. }
locationX : Single;
{ Resulting Y location of the terrain point we hit, in local OpenGL }
{ coordinates. }
locationY : Single;
{ Resulting Z location of the terrain point we hit, in local OpenGL }
{ coordinates. }
locationZ : Single;
{ X component of the normal vector to the terrain we found. }
normalX : Single;
{ Y component of the normal vector to the terrain we found. }
normalY : Single;
{ Z component of the normal vector to the terrain we found. }
normalZ : Single;
{ X component of the velocity vector of the terrain we found. }
velocityX : Single;
{ Y component of the velocity vector of the terrain we found. }
velocityY : Single;
{ Z component of the velocity vector of the terrain we found. }
velocityZ : Single;
{ Tells if the surface we hit is water (otherwise it is land). }
is_wet : Integer;
END;
PXPLMProbeInfo_t = ^XPLMProbeInfo_t;
{
XPLMCreateProbe
Creates a new probe object of a given type and returns.
}
FUNCTION XPLMCreateProbe(
inProbeType : XPLMProbeType) : XPLMProbeRef;
cdecl; external XPLM_DLL;
{
XPLMDestroyProbe
Deallocates an existing probe object.
}
PROCEDURE XPLMDestroyProbe(
inProbe : XPLMProbeRef);
cdecl; external XPLM_DLL;
{
XPLMProbeTerrainXYZ
Probes the terrain. Pass in the XYZ coordinate of the probe point, a probe
object, and an XPLMProbeInfo_t struct that has its structSize member set
properly. Other fields are filled in if we hit terrain, and a probe result
is returned.
}
FUNCTION XPLMProbeTerrainXYZ(
inProbe : XPLMProbeRef;
inX : Single;
inY : Single;
inZ : Single;
outInfo : PXPLMProbeInfo_t) : XPLMProbeResult;
cdecl; external XPLM_DLL;
{$ENDIF XPLM200}
{$IFDEF XPLM300}
{___________________________________________________________________________
* Magnetic Variation
___________________________________________________________________________}
{
Use the magnetic variation (more properly, the "magnetic declination") API
to find the offset of magnetic north from true north at a given latitude
and longitude within the simulator.
In the real world, the Earth's magnetic field is irregular, such that true
north (the direction along a meridian toward the north pole) does not
necessarily match what a magnetic compass shows as north.
Using this API ensures that you present the same offsets to users as
X-Plane's built-in instruments.
}
{
XPLMGetMagneticVariation
Returns X-Plane's simulated magnetic variation (declination) at the
indication latitude and longitude.
}
FUNCTION XPLMGetMagneticVariation(
latitude : Real;
longitude : Real) : Single;
cdecl; external XPLM_DLL;
{
XPLMDegTrueToDegMagnetic
Converts a heading in degrees relative to true north into a value relative
to magnetic north at the user's current location.
}
FUNCTION XPLMDegTrueToDegMagnetic(
headingDegreesTrue : Single) : Single;
cdecl; external XPLM_DLL;
{
XPLMDegMagneticToDegTrue
Converts a heading in degrees relative to magnetic north at the user's
current location into a value relative to true north.
}
FUNCTION XPLMDegMagneticToDegTrue(
headingDegreesMagnetic: Single) : Single;
cdecl; external XPLM_DLL;
{$ENDIF XPLM300}
{___________________________________________________________________________
* Object Drawing
___________________________________________________________________________}
{
The object drawing routines let you load and draw X-Plane OBJ files.
Objects are loaded by file path and managed via an opaque handle. X-Plane
naturally reference counts objects, so it is important that you balance
every successful call to XPLMLoadObject with a call to XPLMUnloadObject!
}
{$IFDEF XPLM200}
TYPE
{
XPLMObjectRef
An XPLMObjectRef is a opaque handle to an .obj file that has been loaded
into memory.
}
XPLMObjectRef = pointer;
PXPLMObjectRef = ^XPLMObjectRef;
{$ENDIF XPLM200}
{$IFDEF XPLM200}
{
XPLMDrawInfo_t
The XPLMDrawInfo_t structure contains positioning info for one object that
is to be drawn. Be sure to set structSize to the size of the structure for
future expansion.
}
XPLMDrawInfo_t = RECORD
{ Set this to the size of this structure! }
structSize : Integer;
{ X location of the object in local coordinates. }
x : Single;
{ Y location of the object in local coordinates. }
y : Single;
{ Z location of the object in local coordinates. }
z : Single;
{ Pitch in degres to rotate the object, positive is up. }
pitch : Single;
{ Heading in local coordinates to rotate the object, clockwise. }
heading : Single;
{ Roll to rotate the object. }
roll : Single;
END;
PXPLMDrawInfo_t = ^XPLMDrawInfo_t;
{$ENDIF XPLM200}
{$IFDEF XPLM210}
{
XPLMObjectLoaded_f
You provide this callback when loading an object asynchronously; it will be
called once the object is loaded. Your refcon is passed back. The object
ref passed in is the newly loaded object (ready for use) or NULL if an
error occured.
If your plugin is disabled, this callback will be delivered as soon as the
plugin is re-enabled. If your plugin is unloaded before this callback is
ever called, the SDK will release the object handle for you.
}
TYPE
XPLMObjectLoaded_f = PROCEDURE(
inObject : XPLMObjectRef;
inRefcon : pointer); cdecl;
{$ENDIF XPLM210}
{$IFDEF XPLM200}
{
XPLMLoadObject
This routine loads an OBJ file and returns a handle to it. If X-Plane has
already loaded the object, the handle to the existing object is returned.
Do not assume you will get the same handle back twice, but do make sure to
call unload once for every load to avoid "leaking" objects. The object will
be purged from memory when no plugins and no scenery are using it.
The path for the object must be relative to the X-System base folder. If
the path is in the root of the X-System folder you may need to prepend ./
to it; loading objects in the root of the X-System folder is STRONGLY
discouraged - your plugin should not dump art resources in the root folder!
XPLMLoadObject will return NULL if the object cannot be loaded (either
because it is not found or the file is misformatted). This routine will
load any object that can be used in the X-Plane scenery system.
It is important that the datarefs an object uses for animation already be
loaded before you load the object. For this reason it may be necessary to
defer object loading until the sim has fully started.
}
FUNCTION XPLMLoadObject(
inPath : XPLMString) : XPLMObjectRef;
cdecl; external XPLM_DLL;
{$ENDIF XPLM200}
{$IFDEF XPLM210}
{
XPLMLoadObjectAsync
This routine loads an object asynchronously; control is returned to you
immediately while X-Plane loads the object. The sim will not stop flying
while the object loads. For large objects, it may be several seconds before
the load finishes.
You provide a callback function that is called once the load has completed.
Note that if the object cannot be loaded, you will not find out until the
callback function is called with a NULL object handle.
There is no way to cancel an asynchronous object load; you must wait for
the load to complete and then release the object if it is no longer
desired.
}
PROCEDURE XPLMLoadObjectAsync(
inPath : XPLMString;
inCallback : XPLMObjectLoaded_f;
inRefcon : pointer);
cdecl; external XPLM_DLL;
{$ENDIF XPLM210}
{$IFDEF XPLM_DEPRECATED}
{
XPLMDrawObjects
__Deprecation Warning__: use XPLMInstancing to draw 3-d objects by creating
instances, rather than these APIs from draw callbacks.
XPLMDrawObjects draws an object from an OBJ file one or more times. You
pass in the object and an array of XPLMDrawInfo_t structs, one for each
place you would like the object to be drawn.
X-Plane will attempt to cull the objects based on LOD and visibility, and
will pick the appropriate LOD.
Lighting is a boolean; pass 1 to show the night version of object with
night-only lights lit up. Pass 0 to show the daytime version of the object.
earth_relative controls the coordinate system. If this is 1, the rotations
you specify are applied to the object after its coordinate system is
transformed from local to earth-relative coordinates -- that is, an object
with no rotations will point toward true north and the Y axis will be up
against gravity. If this is 0, the object is drawn with your rotations from
local coordanates -- that is, an object with no rotations is drawn pointing
down the -Z axis and the Y axis of the object matches the local coordinate
Y axis.
}
PROCEDURE XPLMDrawObjects(
inObject : XPLMObjectRef;
inCount : Integer;
inLocations : PXPLMDrawInfo_t;
lighting : Integer;
earth_relative : Integer);
cdecl; external XPLM_DLL;
{$ENDIF XPLM_DEPRECATED}
{$IFDEF XPLM200}
{
XPLMUnloadObject
This routine marks an object as no longer being used by your plugin.
Objects are reference counted: once no plugins are using an object, it is
purged from memory. Make sure to call XPLMUnloadObject once for each
successful call to XPLMLoadObject.
}
PROCEDURE XPLMUnloadObject(
inObject : XPLMObjectRef);
cdecl; external XPLM_DLL;
{$ENDIF XPLM200}
{$IFDEF XPLM200}
{___________________________________________________________________________
* Library Access
___________________________________________________________________________}
{
The library access routines allow you to locate scenery objects via the
X-Plane library system. Right now library access is only provided for
objects, allowing plugin-drawn objects to be extended using the library
system.
}
{
XPLMLibraryEnumerator_f
An XPLMLibraryEnumerator_f is a callback you provide that is called once
for each library element that is located. The returned paths will be
relative to the X-System folder.
}
TYPE
XPLMLibraryEnumerator_f = PROCEDURE(
inFilePath : XPLMString;
inRef : pointer); cdecl;
{
XPLMLookupObjects
This routine looks up a virtual path in the library system and returns all
matching elements. You provide a callback - one virtual path may match many
objects in the library. XPLMLookupObjects returns the number of objects
found.
The latitude and longitude parameters specify the location the object will
be used. The library system allows for scenery packages to only provide
objects to certain local locations. Only objects that are allowed at the
latitude/longitude you provide will be returned.
}
FUNCTION XPLMLookupObjects(
inPath : XPLMString;
inLatitude : Single;
inLongitude : Single;
enumerator : XPLMLibraryEnumerator_f;
ref : pointer) : Integer;
cdecl; external XPLM_DLL;
{$ENDIF XPLM200}
IMPLEMENTATION
END.
+951
View File
@@ -0,0 +1,951 @@
{
Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See
license.txt for usage. X-Plane SDK Version: 2.1.1
}
UNIT XPLMUtilities;
INTERFACE
USES
XPLMDefs;
{$A4}
{___________________________________________________________________________
* FILE UTILITIES
___________________________________________________________________________}
{
The XPLMUtilities file APIs provide some basic file and path functions for
use with X-Plane.
Directory Separators
--------------------
The XPLM has two modes it can work in:
* X-Plane native paths: all paths are UTF8 strings, using the unix forward
slash (/) as the directory separating character. In native path mode,
you use the same path format for all three operating systems.
* Legacy OS paths: the directroy separator is \ for Windows, : for OS X,
and / for Linux; OS paths are encoded in MacRoman for OS X using legacy
HFS conventions, use the application code page for multi-byte encoding
on Unix using DOS path conventions, and use UTF-8 for Linux.
While legacy OS paths are the default, we strongly encourage you to opt in
to native paths using the XPLMEnableFeature API.
* All OS X plugins should enable native paths all of the time; if you do
not do this, you will have to convert all paths back from HFS to Unix
(and deal with MacRoman) - code written using native paths and the C
file APIs "just works" on OS X.
* For Linux plugins, there is no difference between the two encodings.
* Windows plugins will need to convert the UTF8 file paths to UTF16 for
use with the "wide" APIs. While it might seem tempting to stick with
legacy OS paths (and just use the "ANSI" Windows APIs), X-Plane is fully
unicode-capable, and will often be installed in paths where the user's
directories have no ACP encoding.
Full and Relative Paths
-----------------------
Some of these APIs use full paths, but others use paths relative to the
user's X-Plane installation. This is documented on a per-API basis.
}
{$IFDEF XPLM200}
{
XPLMDataFileType
These enums define types of data files you can load or unload using the
SDK.
}
TYPE
XPLMDataFileType = (
{ A situation (.sit) file, which starts off a flight in a given }
{ configuration. }
xplm_DataFile_Situation = 1
{ A situation movie (.smo) file, which replays a past flight. }
,xplm_DataFile_ReplayMovie = 2
);
PXPLMDataFileType = ^XPLMDataFileType;
{$ENDIF XPLM200}
{
XPLMGetSystemPath
This function returns the full path to the X-System folder. Note that this
is a directory path, so it ends in a trailing : or /.
The buffer you pass should be at least 512 characters long. The path is
returned using the current native or OS path conventions.
}
PROCEDURE XPLMGetSystemPath(
outSystemPath : XPLMString);
cdecl; external XPLM_DLL;
{
XPLMGetPrefsPath
This routine returns a full path to a file that is within X-Plane's
preferences directory. (You should remove the file name back to the last
directory separator to get the preferences directory using
XPLMExtractFileAndPath.)
The buffer you pass should be at least 512 characters long. The path is
returned using the current native or OS path conventions.
}
PROCEDURE XPLMGetPrefsPath(
outPrefsPath : XPLMString);
cdecl; external XPLM_DLL;
{
XPLMGetDirectorySeparator
This routine returns a string with one char and a null terminator that is
the directory separator for the current platform. This allows you to write
code that concatinates directory paths without having to #ifdef for
platform. The character returned will reflect the current file path mode.
}
FUNCTION XPLMGetDirectorySeparator: XPLMString;
cdecl; external XPLM_DLL;
{
XPLMExtractFileAndPath
Given a full path to a file, this routine separates the path from the file.
If the path is a partial directory (e.g. ends in : or \) the trailing
directory separator is removed. This routine works in-place; a pointer to
the file part of the buffer is returned; the original buffer still starts
with the path and is null terminated with no trailing separator.
}
FUNCTION XPLMExtractFileAndPath(
inFullPath : XPLMString) : XPLMString;
cdecl; external XPLM_DLL;
{
XPLMGetDirectoryContents
This routine returns a list of files in a directory (specified by a full
path, no trailing : or \). The output is returned as a list of NULL
terminated strings. An index array (if specified) is filled with pointers
into the strings. The last file is indicated by a zero-length string (and
NULL in the indices). This routine will return 1 if you had capacity for
all files or 0 if you did not. You can also skip a given number of files.
* inDirectoryPath - a null terminated C string containing the full path to
the directory with no trailing directory char.
* inFirstReturn - the zero-based index of the first file in the directory
to return. (Usually zero to fetch all in one pass.)
* outFileNames - a buffer to receive a series of sequential null
terminated C-string file names. A zero-length C string will be appended
to the very end.
* inFileNameBufSize - the size of the file name buffer in bytes.
* outIndices - a pointer to an array of character pointers that will
become an index into the directory. The last file will be followed by a
NULL value. Pass NULL if you do not want indexing information.
* inIndexCount - the max size of the index in entries.
* outTotalFiles - if not NULL, this is filled in with the number of files
in the directory.
* outReturnedFiles - if not NULL, the number of files returned by this
iteration.
Return value: 1 if all info could be returned, 0 if there was a buffer
overrun.
WARNING: Before X-Plane 7 this routine did not properly iterate through
directories. If X-Plane
6 compatibility is needed, use your own code to iterate directories.
}
FUNCTION XPLMGetDirectoryContents(
inDirectoryPath : XPLMString;
inFirstReturn : Integer;
outFileNames : XPLMString;
inFileNameBufSize : Integer;
outIndices : PXPLMString; { Can be nil }
inIndexCount : Integer;
outTotalFiles : PInteger; { Can be nil }
outReturnedFiles : PInteger) : Integer; { Can be nil }
cdecl; external XPLM_DLL;
{$IFDEF XPLM200}
{
XPLMLoadDataFile
Loads a data file of a given type. Paths must be relative to the X-System
folder. To clear the replay, pass a NULL file name (this is only valid with
replay movies, not sit files).
}
FUNCTION XPLMLoadDataFile(
inFileType : XPLMDataFileType;
inFilePath : XPLMString) : Integer; { Can be nil }
cdecl; external XPLM_DLL;
{$ENDIF XPLM200}
{$IFDEF XPLM200}
{
XPLMSaveDataFile
Saves the current situation or replay; paths are relative to the X-System
folder.
}
FUNCTION XPLMSaveDataFile(
inFileType : XPLMDataFileType;
inFilePath : XPLMString) : Integer;
cdecl; external XPLM_DLL;
{$ENDIF XPLM200}
{___________________________________________________________________________
* X-PLANE MISC
___________________________________________________________________________}
{
XPLMHostApplicationID
While the plug-in SDK is only accessible to plugins running inside X-Plane,
the original authors considered extending the API to other applications
that shared basic infrastructure with X-Plane. These enumerations are
hold-overs from that original roadmap; all values other than X-Plane are
deprecated. Your plugin should never need this enumeration.
}
TYPE
XPLMHostApplicationID = (
xplm_Host_Unknown = 0
,xplm_Host_XPlane = 1
{$IFDEF XPLM_DEPRECATED}
,xplm_Host_PlaneMaker = 2
{$ENDIF XPLM_DEPRECATED}
{$IFDEF XPLM_DEPRECATED}
,xplm_Host_WorldMaker = 3
{$ENDIF XPLM_DEPRECATED}
{$IFDEF XPLM_DEPRECATED}
,xplm_Host_Briefer = 4
{$ENDIF XPLM_DEPRECATED}
{$IFDEF XPLM_DEPRECATED}
,xplm_Host_PartMaker = 5
{$ENDIF XPLM_DEPRECATED}
{$IFDEF XPLM_DEPRECATED}
,xplm_Host_YoungsMod = 6
{$ENDIF XPLM_DEPRECATED}
{$IFDEF XPLM_DEPRECATED}
,xplm_Host_XAuto = 7
{$ENDIF XPLM_DEPRECATED}
);
PXPLMHostApplicationID = ^XPLMHostApplicationID;
{
XPLMLanguageCode
These enums define what language the sim is running in. These enumerations
do not imply that the sim can or does run in all of these languages; they
simply provide a known encoding in the event that a given sim version is
localized to a certain language.
}
XPLMLanguageCode = (
xplm_Language_Unknown = 0
,xplm_Language_English = 1
,xplm_Language_French = 2
,xplm_Language_German = 3
,xplm_Language_Italian = 4
,xplm_Language_Spanish = 5
,xplm_Language_Korean = 6
{$IFDEF XPLM200}
,xplm_Language_Russian = 7
{$ENDIF XPLM200}
{$IFDEF XPLM200}
,xplm_Language_Greek = 8
{$ENDIF XPLM200}
{$IFDEF XPLM200}
,xplm_Language_Japanese = 9
{$ENDIF XPLM200}
{$IFDEF XPLM300}
,xplm_Language_Chinese = 10
{$ENDIF XPLM300}
);
PXPLMLanguageCode = ^XPLMLanguageCode;
{$IFDEF XPLM200}
{
XPLMError_f
An XPLM error callback is a function that you provide to receive debugging
information from the plugin SDK. See XPLMSetErrorCallback for more
information. NOTE: for the sake of debugging, your error callback will be
called even if your plugin is not enabled, allowing you to receive debug
info in your XPluginStart and XPluginStop callbacks. To avoid causing logic
errors in the management code, do not call any other plugin routines from
your error callback - it is only meant for catching errors in the
debugging.
}
TYPE
XPLMError_f = PROCEDURE(
inMessage : XPLMString); cdecl;
{$ENDIF XPLM200}
{$IFDEF XPLM_DEPRECATED}
{
XPLMInitialized
Deprecated: This function returns 1 if X-Plane has properly initialized the
plug-in system. If this routine returns 0, many XPLM functions will not
work.
NOTE: because plugins are always called from within the XPLM, there is no
need to check for initialization; it will always return 1. This routine is
deprecated - you do not need to check it before continuing within your
plugin.
}
FUNCTION XPLMInitialized: Integer;
cdecl; external XPLM_DLL;
{$ENDIF XPLM_DEPRECATED}
{
XPLMGetVersions
This routine returns the revision of both X-Plane and the XPLM DLL. All
versions are three-digit decimal numbers (e.g. 606 for version 6.06 of
X-Plane); the current revision of the XPLM is 200 (2.00). This routine also
returns the host ID of the app running us.
The most common use of this routine is to special-case around X-Plane
version-specific behavior.
}
PROCEDURE XPLMGetVersions(
outXPlaneVersion : PInteger;
outXPLMVersion : PInteger;
outHostID : PXPLMHostApplicationID);
cdecl; external XPLM_DLL;
{
XPLMGetLanguage
This routine returns the langauge the sim is running in.
}
FUNCTION XPLMGetLanguage: XPLMLanguageCode;
cdecl; external XPLM_DLL;
{$IFDEF XPLM200}
{
XPLMFindSymbol
This routine will attempt to find the symbol passed in the inString
parameter. If the symbol is found a pointer the function is returned,
othewise the function will return NULL.
You can use XPLMFindSymbol to utilize newer SDK API features without
requiring newer versions of the SDK (and X-Plane) as your minimum X-Plane
version as follows:
* Define the XPLMnnn macro to the minimum required XPLM version you will
ship with (e.g. XPLM210 for X-Plane 10 compatibility).
* Use XPLMGetVersions and XPLMFindSymbol to detect that the host sim is
new enough to use new functions and resolve function pointers.
* Conditionally use the new functions if and only if XPLMFindSymbol only
returns a non- NULL pointer.
Warning: you should always check the XPLM API version as well as the
results of XPLMFindSymbol to determine if funtionality is safe to use.
To use functionality via XPLMFindSymbol you will need to copy your own
definitions of the X-Plane API prototypes and cast the returned pointer to
the correct type.
}
FUNCTION XPLMFindSymbol(
inString : XPLMString) : pointer;
cdecl; external XPLM_DLL;
{$ENDIF XPLM200}
{$IFDEF XPLM200}
{
XPLMSetErrorCallback
XPLMSetErrorCallback installs an error-reporting callback for your plugin.
Normally the plugin system performs minimum diagnostics to maximize
performance. When you install an error callback, you will receive calls due
to certain plugin errors, such as passing bad parameters or incorrect data.
Important: the error callback determines *programming* errors, e.g. bad API
parameters. Every error that is returned by the error callback represents a
mistake in your plugin that you should fix. Error callbacks are not used to
report expected run-time problems (e.g. disk I/O errors).
The intention is for you to install the error callback during debug
sections and put a break-point inside your callback. This will cause you to
break into the debugger from within the SDK at the point in your plugin
where you made an illegal call.
Installing an error callback may activate error checking code that would
not normally run, and this may adversely affect performance, so do not
leave error callbacks installed in shipping plugins. Since the only useful
response to an error is to change code, error callbacks are not useful "in
the field".
}
PROCEDURE XPLMSetErrorCallback(
inCallback : XPLMError_f);
cdecl; external XPLM_DLL;
{$ENDIF XPLM200}
{
XPLMDebugString
This routine outputs a C-style string to the Log.txt file. The file is
immediately flushed so you will not lose data. (This does cause a
performance penalty.)
Please do *not* leave routine diagnostic logging enabled in your shipping
plugin. The X-Plane Log file is shared by X-Plane and every plugin in the
system, and plugins that (when functioning normally) print verbose log
output make it difficult for developers to find error conditions from other
parts of the system.
}
PROCEDURE XPLMDebugString(
inString : XPLMString);
cdecl; external XPLM_DLL;
{
XPLMSpeakString
This function displays the string in a translucent overlay over the current
display and also speaks the string if text-to-speech is enabled. The string
is spoken asynchronously, this function returns immediately. This function
may not speak or print depending on user preferences.
}
PROCEDURE XPLMSpeakString(
inString : XPLMString);
cdecl; external XPLM_DLL;
{
XPLMGetVirtualKeyDescription
Given a virtual key code (as defined in XPLMDefs.h) this routine returns a
human-readable string describing the character. This routine is provided
for showing users what keyboard mappings they have set up. The string may
read 'unknown' or be a blank or NULL string if the virtual key is unknown.
}
FUNCTION XPLMGetVirtualKeyDescription(
inVirtualKey : XPLMChar) : XPLMString;
cdecl; external XPLM_DLL;
{
XPLMReloadScenery
XPLMReloadScenery reloads the current set of scenery. You can use this
function in two typical ways: simply call it to reload the scenery, picking
up any new installed scenery, .env files, etc. from disk. Or, change the
lat/ref and lon/ref data refs and then call this function to shift the
scenery environment. This routine is equivalent to picking "reload
scenery" from the developer menu.
}
PROCEDURE XPLMReloadScenery;
cdecl; external XPLM_DLL;
{$IFDEF XPLM200}
{___________________________________________________________________________
* X-PLANE COMMAND MANAGEMENT
___________________________________________________________________________}
{
The command management APIs let plugins interact with the command-system in
X-Plane, the abstraction behind keyboard presses and joystick buttons. This
API lets you create new commands and modify the behavior (or get
notification) of existing ones.
X-Plane Command Phases
----------------------
X-Plane commands are not instantaneous; they operate over a duration.
(Think of a joystick button press - you can press, hold down, and then
release the joystick button; X-Plane commands model this entire process.)
An X-Plane command consists of three phases: a beginning, continuous
repetition, and an ending. The command may be repeated zero times in its
duration, followed by one command ending. Command begin and end messges are
balanced, but a command may be bound to more than one event source (e.g. a
keyboard key and a joystick button), in which case you may receive a second
begin during before any end).
When you issue commands in the plugin system, you *must* balance every call
to XPLMCommandBegin with a call to XPLMCommandEnd with the same command
reference.
Command Behavior Modification
-----------------------------
You can register a callback to handle a command either before or after
X-Plane does; if you receive the command before X-Plane you have the option
to either let X-Plane handle the command or hide the command from X-Plane.
This lets plugins both augment commands and replace them.
If you register for an existing command, be sure that you are *consistent*
in letting X-Plane handle or not handle the command; you are responsible
for passing a *balanced* number of begin and end messages to X-Plane. (E.g.
it is not legal to pass all the begin messages to X-Plane but hide all the
end messages).
}
{
XPLMCommandPhase
The phases of a command.
}
TYPE
XPLMCommandPhase = (
{ The command is being started. }
xplm_CommandBegin = 0
{ The command is continuing to execute. }
,xplm_CommandContinue = 1
{ The command has ended. }
,xplm_CommandEnd = 2
);
PXPLMCommandPhase = ^XPLMCommandPhase;
{
XPLMCommandRef
A command ref is an opaque identifier for an X-Plane command. Command
references stay the same for the life of your plugin but not between
executions of X-Plane. Command refs are used to execute commands, create
commands, and create callbacks for particular commands.
Note that a command is not "owned" by a particular plugin. Since many
plugins may participate in a command's execution, the command does not go
away if the plugin that created it is unloaded.
}
XPLMCommandRef = pointer;
PXPLMCommandRef = ^XPLMCommandRef;
{
XPLMCommandCallback_f
A command callback is a function in your plugin that is called when a
command is pressed. Your callback receives the command reference for the
particular command, the phase of the command that is executing, and a
reference pointer that you specify when registering the callback.
Your command handler should return 1 to let processing of the command
continue to other plugins and X-Plane, or 0 to halt processing, potentially
bypassing X-Plane code.
}
XPLMCommandCallback_f = FUNCTION(
inCommand : XPLMCommandRef;
inPhase : XPLMCommandPhase;
inRefcon : pointer) : Integer; cdecl;
{
XPLMFindCommand
XPLMFindCommand looks up a command by name, and returns its command
reference or NULL if the command does not exist.
}
FUNCTION XPLMFindCommand(
inName : XPLMString) : XPLMCommandRef;
cdecl; external XPLM_DLL;
{
XPLMCommandBegin
XPLMCommandBegin starts the execution of a command, specified by its
command reference. The command is "held down" until XPLMCommandEnd is
called. You must balance each XPLMCommandBegin call with an XPLMCommandEnd
call.
}
PROCEDURE XPLMCommandBegin(
inCommand : XPLMCommandRef);
cdecl; external XPLM_DLL;
{
XPLMCommandEnd
XPLMCommandEnd ends the execution of a given command that was started with
XPLMCommandBegin. You must not issue XPLMCommandEnd for a command you did
not begin.
}
PROCEDURE XPLMCommandEnd(
inCommand : XPLMCommandRef);
cdecl; external XPLM_DLL;
{
XPLMCommandOnce
This executes a given command momentarily, that is, the command begins and
ends immediately. This is the equivalent of calling XPLMCommandBegin() and
XPLMCommandEnd() back ot back.
}
PROCEDURE XPLMCommandOnce(
inCommand : XPLMCommandRef);
cdecl; external XPLM_DLL;
{
XPLMCreateCommand
XPLMCreateCommand creates a new command for a given string. If the command
already exists, the existing command reference is returned. The description
may appear in user interface contexts, such as the joystick configuration
screen.
}
FUNCTION XPLMCreateCommand(
inName : XPLMString;
inDescription : XPLMString) : XPLMCommandRef;
cdecl; external XPLM_DLL;
{
XPLMRegisterCommandHandler
XPLMRegisterCommandHandler registers a callback to be called when a command
is executed. You provide a callback with a reference pointer.
If inBefore is true, your command handler callback will be executed before
X-Plane executes the command, and returning 0 from your callback will
disable X-Plane's processing of the command. If inBefore is false, your
callback will run after X-Plane. (You can register a single callback both
before and after a command.)
}
PROCEDURE XPLMRegisterCommandHandler(
inComand : XPLMCommandRef;
inHandler : XPLMCommandCallback_f;
inBefore : Integer;
inRefcon : pointer);
cdecl; external XPLM_DLL;
{
XPLMUnregisterCommandHandler
XPLMUnregisterCommandHandler removes a command callback registered with
XPLMRegisterCommandHandler.
}
PROCEDURE XPLMUnregisterCommandHandler(
inComand : XPLMCommandRef;
inHandler : XPLMCommandCallback_f;
inBefore : Integer;
inRefcon : pointer);
cdecl; external XPLM_DLL;
{$ENDIF XPLM200}
{$IFDEF XPLM_DEPRECATED}
{___________________________________________________________________________
* X-PLANE USER INTERACTION
___________________________________________________________________________}
{
WARNING: The legacy user interaction API is deprecated; while it was the
only way to run commands in X-Plane 6,7 and 8, it is obsolete, and was
replaced by the command system API in X-Plane 9. You should not use this
API; replace any of the calls below with XPLMCommand invocations based on
persistent command strings. The documentation that follows is for historic
reference only.
The legacy user interaction APIs let you simulate commands the user can do
with a joystick, keyboard etc. Note that it is generally safer for future
compatibility to use one of these commands than to manipulate the
underlying sim data.
}
{
XPLMCommandKeyID
These enums represent all the keystrokes available within X-Plane. They can
be sent to X-Plane directly. For example, you can reverse thrust using
these enumerations.
}
TYPE
XPLMCommandKeyID = (
xplm_key_pause=0,
xplm_key_revthrust,
xplm_key_jettison,
xplm_key_brakesreg,
xplm_key_brakesmax,
xplm_key_gear,
xplm_key_timedn,
xplm_key_timeup,
xplm_key_fadec,
xplm_key_otto_dis,
xplm_key_otto_atr,
xplm_key_otto_asi,
xplm_key_otto_hdg,
xplm_key_otto_gps,
xplm_key_otto_lev,
xplm_key_otto_hnav,
xplm_key_otto_alt,
xplm_key_otto_vvi,
xplm_key_otto_vnav,
xplm_key_otto_nav1,
xplm_key_otto_nav2,
xplm_key_targ_dn,
xplm_key_targ_up,
xplm_key_hdgdn,
xplm_key_hdgup,
xplm_key_barodn,
xplm_key_baroup,
xplm_key_obs1dn,
xplm_key_obs1up,
xplm_key_obs2dn,
xplm_key_obs2up,
xplm_key_com1_1,
xplm_key_com1_2,
xplm_key_com1_3,
xplm_key_com1_4,
xplm_key_nav1_1,
xplm_key_nav1_2,
xplm_key_nav1_3,
xplm_key_nav1_4,
xplm_key_com2_1,
xplm_key_com2_2,
xplm_key_com2_3,
xplm_key_com2_4,
xplm_key_nav2_1,
xplm_key_nav2_2,
xplm_key_nav2_3,
xplm_key_nav2_4,
xplm_key_adf_1,
xplm_key_adf_2,
xplm_key_adf_3,
xplm_key_adf_4,
xplm_key_adf_5,
xplm_key_adf_6,
xplm_key_transpon_1,
xplm_key_transpon_2,
xplm_key_transpon_3,
xplm_key_transpon_4,
xplm_key_transpon_5,
xplm_key_transpon_6,
xplm_key_transpon_7,
xplm_key_transpon_8,
xplm_key_flapsup,
xplm_key_flapsdn,
xplm_key_cheatoff,
xplm_key_cheaton,
xplm_key_sbrkoff,
xplm_key_sbrkon,
xplm_key_ailtrimL,
xplm_key_ailtrimR,
xplm_key_rudtrimL,
xplm_key_rudtrimR,
xplm_key_elvtrimD,
xplm_key_elvtrimU,
xplm_key_forward,
xplm_key_down,
xplm_key_left,
xplm_key_right,
xplm_key_back,
xplm_key_tower,
xplm_key_runway,
xplm_key_chase,
xplm_key_free1,
xplm_key_free2,
xplm_key_spot,
xplm_key_fullscrn1,
xplm_key_fullscrn2,
xplm_key_tanspan,
xplm_key_smoke,
xplm_key_map,
xplm_key_zoomin,
xplm_key_zoomout,
xplm_key_cycledump,
xplm_key_replay,
xplm_key_tranID,
xplm_key_max
);
PXPLMCommandKeyID = ^XPLMCommandKeyID;
{
XPLMCommandButtonID
These are enumerations for all of the things you can do with a joystick
button in X-Plane. They currently match the buttons menu in the equipment
setup dialog, but these enums will be stable even if they change in
X-Plane.
}
XPLMCommandButtonID = (
xplm_joy_nothing=0,
xplm_joy_start_all,
xplm_joy_start_0,
xplm_joy_start_1,
xplm_joy_start_2,
xplm_joy_start_3,
xplm_joy_start_4,
xplm_joy_start_5,
xplm_joy_start_6,
xplm_joy_start_7,
xplm_joy_throt_up,
xplm_joy_throt_dn,
xplm_joy_prop_up,
xplm_joy_prop_dn,
xplm_joy_mixt_up,
xplm_joy_mixt_dn,
xplm_joy_carb_tog,
xplm_joy_carb_on,
xplm_joy_carb_off,
xplm_joy_trev,
xplm_joy_trm_up,
xplm_joy_trm_dn,
xplm_joy_rot_trm_up,
xplm_joy_rot_trm_dn,
xplm_joy_rud_lft,
xplm_joy_rud_cntr,
xplm_joy_rud_rgt,
xplm_joy_ail_lft,
xplm_joy_ail_cntr,
xplm_joy_ail_rgt,
xplm_joy_B_rud_lft,
xplm_joy_B_rud_rgt,
xplm_joy_look_up,
xplm_joy_look_dn,
xplm_joy_look_lft,
xplm_joy_look_rgt,
xplm_joy_glance_l,
xplm_joy_glance_r,
xplm_joy_v_fnh,
xplm_joy_v_fwh,
xplm_joy_v_tra,
xplm_joy_v_twr,
xplm_joy_v_run,
xplm_joy_v_cha,
xplm_joy_v_fr1,
xplm_joy_v_fr2,
xplm_joy_v_spo,
xplm_joy_flapsup,
xplm_joy_flapsdn,
xplm_joy_vctswpfwd,
xplm_joy_vctswpaft,
xplm_joy_gear_tog,
xplm_joy_gear_up,
xplm_joy_gear_down,
xplm_joy_lft_brake,
xplm_joy_rgt_brake,
xplm_joy_brakesREG,
xplm_joy_brakesMAX,
xplm_joy_speedbrake,
xplm_joy_ott_dis,
xplm_joy_ott_atr,
xplm_joy_ott_asi,
xplm_joy_ott_hdg,
xplm_joy_ott_alt,
xplm_joy_ott_vvi,
xplm_joy_tim_start,
xplm_joy_tim_reset,
xplm_joy_ecam_up,
xplm_joy_ecam_dn,
xplm_joy_fadec,
xplm_joy_yaw_damp,
xplm_joy_art_stab,
xplm_joy_chute,
xplm_joy_JATO,
xplm_joy_arrest,
xplm_joy_jettison,
xplm_joy_fuel_dump,
xplm_joy_puffsmoke,
xplm_joy_prerotate,
xplm_joy_UL_prerot,
xplm_joy_UL_collec,
xplm_joy_TOGA,
xplm_joy_shutdown,
xplm_joy_con_atc,
xplm_joy_fail_now,
xplm_joy_pause,
xplm_joy_rock_up,
xplm_joy_rock_dn,
xplm_joy_rock_lft,
xplm_joy_rock_rgt,
xplm_joy_rock_for,
xplm_joy_rock_aft,
xplm_joy_idle_hilo,
xplm_joy_lanlights,
xplm_joy_max
);
PXPLMCommandButtonID = ^XPLMCommandButtonID;
{
XPLMSimulateKeyPress
This function simulates a key being pressed for X-Plane. The keystroke goes
directly to X-Plane; it is never sent to any plug-ins. However, since this
is a raw key stroke it may be mapped by the keys file or enter text into a
field.
Deprecated: use XPLMCommandOnce
}
PROCEDURE XPLMSimulateKeyPress(
inKeyType : Integer;
inKey : Integer);
cdecl; external XPLM_DLL;
{
XPLMCommandKeyStroke
This routine simulates a command-key stroke. However, the keys are done by
function, not by actual letter, so this function works even if the user has
remapped their keyboard. Examples of things you might do with this include
pausing the simulator.
Deprecated: use XPLMCommandOnce
}
PROCEDURE XPLMCommandKeyStroke(
inKey : XPLMCommandKeyID);
cdecl; external XPLM_DLL;
{
XPLMCommandButtonPress
This function simulates any of the actions that might be taken by pressing
a joystick button. However, this lets you call the command directly rather
than have to know which button is mapped where. Important: you must release
each button you press. The APIs are separate so that you can 'hold down' a
button for a fixed amount of time.
Deprecated: use XPLMCommandBegin.
}
PROCEDURE XPLMCommandButtonPress(
inButton : XPLMCommandButtonID);
cdecl; external XPLM_DLL;
{
XPLMCommandButtonRelease
This function simulates any of the actions that might be taken by pressing
a joystick button. See XPLMCommandButtonPress.
Deprecated: use XPLMCommandEnd.
}
PROCEDURE XPLMCommandButtonRelease(
inButton : XPLMCommandButtonID);
cdecl; external XPLM_DLL;
{$ENDIF XPLM_DEPRECATED}
IMPLEMENTATION
END.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+222
View File
@@ -0,0 +1,222 @@
-------------------------------------------------------------------------------
THE X-PLANE PLUGIN SDK
-------------------------------------------------------------------------------
This download contains the files necessary to build plugins for X-Plane. The
X-Plane plugin website is:
http://https://developer.x-plane.com/sdk/
The website contains full documentation on the SDK including tech notes, sample
plugins, sample code, contact information, and links to the latest versions of
this SDK.
-------------------------------------------------------------------------------
SDK FILES
-------------------------------------------------------------------------------
license.txt Copyright information for this download.
README.txt This document
CHeaders Header files for compiling C/C++ plugins
Delphi Interfaces for compiling Pascal plugins
Libraries Import libraries for linking on Windows
and frameworks for linking on Mac.
Note: there are no import/link-time libraries for Linux; on Linux, plugins
simply leave SDK symbols undefined and they are discovered at runtime. The
SDK website explains this process in more detail.
-------------------------------------------------------------------------------
RELEASE NOTES
-------------------------------------------------------------------------------
This section contains per-release notes for the history of the X-Plane SDK.
X-PLane SDK Release 4.0.0 beta 1 9/18/2022
The 4.0.0 SDK adds support for ARM64 Macs. The 4.0 SDK is supported by X-Plane
12. The new SDK adds support for drawing hooks that draw directly to the G1000
and other avionic cockpit devices.
X-Plane SDK Release 3.0.2 4/29/2020
The SDK 3.0.2 adds the modern 3-d drawing callback for interoperability with
Metal and Vulkan, and deprecates most older drawing callbacks.
X-Plane SDK Release 3.0.1 3/5/2018
The SDK 3.0.1 API adds new messages and APIs to support VR.
X-Plane SDK Release 3.0.0 11/2/7/2017
The SDK 3.0 API supports new features and new packaging for plugins. The 3.0
SDK requires X-Plane 11.0 or newer. New features include:
- Display APIs to match X-Plane 11's UI.
- New map APIs. Legacy 2-d map draw callbacks are deprecated.
- Aircraft-plugins get their own menu
- Aircraft placement by lat-lon-elevation.
- Magnetic variation queries
- Chinese language support
- New instancing API
The 3.0 SDK supports a new plugin packaging schema:
<plugin name>/<ABI>/<plugin name>.xpl
where ABI is one of mac_x64, win_x64 or lin_x64. The new schema is preferred,
so you can pack a version of your plugin that requires 3.0 with this scheme
and include a legacy 2.x plugin using hte old scheme for X-Plane 10
compatibility.
Please use the new scheme where possible - having a unique file name for each
DLL makes crash reports easier to read and triage.
The 3.0 SDK drops support for 32-bit plugins; if you need to ship a 32-bit
plugin for 32-bit X-Plane 10, shipping using two schemes and two binaries may
be the best option.
X-Plane SDK Release 2.1.3 11/14/13
Fixed XPC Wrappers to use int and intptr_t instead of long. This fixes
crashes for plugins on 64-bit Windows.
X-Plane SDK Release 2.1.2 RC2 1/15/13
Removed headers from frameworks, as they don't work; updated README.
X-Plane SDK Release 2.1.2 RC1 1/12/13
The 2.1.2 SDK adds frameworks for the XPLM and XPWidgets; Mac developers
can link directly against these frameworks and avoid unresolved symbols
and flat namespace problems. The frameworks produce plugins that will
work on X-Plane 8, 9, and 10 depending on the plugin CPU architecture,
minimum system SDK, and XPLM API revision number.
X-Plane SDK Release 2.1.1 RC1 10/29/12
The 2.1.1 update to the SDK provides 64-bit build materials.
X-Plane SDK Release 2.1.0 RC1 3/31/12
This is the first release of the version 2.1 X-Plane SDK. This version of the
SDK exposes new APIs.
This API also replaces all references to "long" with int or intptr_t,
depending on whether the integer needs to be wide enough to hold coerced
pointers. Most of the time, int is used; the notable exception is the widgets
library where params and properties can contain pointers to user data.
This change is not an ABI change - compiled plugins will work unmodified.
However for some compilers, you may need to replace long with int or intptr_t
in your code.
X-Plane SDK Release 2.0.1 RC1 7/21/10
This release adds symbol visibility macros for GCC 4 on Linux and corrects a few
function documentation comments.
X-Plane SDK Release 2.0 RC1 7/11/08
This release includes a corrected XPLM.lib for windows with exports for some of
the new 2.0 APIs.
X-Plane SDK Release 2.0 Beta 2 4/23/08
This release includes new APIs for reading and writing data files and drawing
hooks for the local map screen, as well as some minor tweaks:
- Sim version is 2.0 in the headers.
- unload plane msg marked as 2.0 only.
- New enumerations for additional languages.
- Function level docs improved.
X-Plane SDK Release 2.0 Beta 1 1/19/08
This is the first release of the version 2.0 X-Plane SDK. CFM support has
been removed, and the license has been simplified, reflecting that it only has
to cover the SDK include/import lib files and not the sample code or examples.
X-Plane SDK Release 1.0.2 1/5/05
The headers of the SDK are modified to support Kylix. No changes for Mac,
Windows, or C users. Headers now have SDK version numbers.
X-Plane SDK Release 1.0.1 12/29/04
The headers of this SDK are modified to support Linux complication. No changes
for Mac and Windows users.
X-Plane SDK Release Candidate 1
Only one slight change in the enums: the enum xpProperty_SubWindowHasCloseBoxes
in XPStandardWidgets.h has been changed to xpProperty_MainWindowHasCloseBoxes.
Its value has not been changed, so you will need to search-and-replace your code
when using this version of the SDK, but already-compiled plugins will experience
no different operation.
The documentation has been revised for all headers to revise changes made to the
SDK over the course of beta.
X-Plane SDK Beta 5
This version of the SDK features a number of enumeration changes to reflect the
X-Plane interface more correctly. This became crucial when X-Plane 7's new user
interface was released. With X-Plane in release candidates hopefully beta 5 of
the SDK could be the last one. Please see:
www.xsquawkbox.net/xpsdk/newui.html
For a comprehensive description of all the enumeration changes. For most
plugins (no developers reported using the deprecated enumerations), a simple
search and replace should suffice. Plugins compiled against the beta 4 SDK that
do not use now-unsupported graphics will continue to work correctly.
X-Plane SDK Beta 4
This release corrects two problems with the Pascal headers: function pointer
types are now declared cdecl (since this is how the SDK calls them), and the
import library for the widget callbacks is now XPWIDGETS.DLL as it should be.
X-Plane SDK Beta 3
This release finally features full documentation and a stable widgets API, as
well as a few other minor bug fixes.
Starting with beta 3, the DLLs necessary to run plugins ship with X-Plane 660.
The SDK will work with X-Plane 660 RC3 and later. The XPWidgets DLL now lives
in the Resources/plugins folder.
Starting with beta 3, extra plugins, documentation, sample code, and sample
projects are now featured directly on the web in the new X-Plane SDK library.
They are not included in the SDK zip file; the zip file only contains headers
and lib files for the SDK.
X-Plane SDK Beta 2
You must recompile your plugin for the beta 2 plugin SDK! Plugins compiled
against the beta 1 SDK will not work with X-Plane 660 or the new XPLM.DLL.
A huge number of data refs have been added. Unfortunately the documentation
is thin. Use the data ref tester plugin to view the data refs in real time
and find what you need.
The data ref APIs have also changed to allow for arrays of integers as well
as floats. Some sim variables are now arrays that were previously many
individual items.
A new drawing phase is available for replacing aircraft graphics. The
texturing APIs in XPLMGraphics have been revised. The most notable change is
that you cannot use the SDK to load your textures. (This functionality was
broken and never worked in beta 1.) See the x-plane-dev list for sample code
on how to load your own bitmaps.
X-Plane can reload plugins on the fly. Use the Plugin Enabler plugin to reload
your plugin. On the Mac you can throw the old DLL in the trash and put a new
one in its place to reload a new version of the plugin. On the PC, an alert
comes up; while this alert is up you can swap your plugins' DLL. This allows
you to recompile your plugin without rebooting the sim.
Delphi Pascal interfaces and sample code are in the SDK. Thanks to Billy
Verreynne for his hard work on this.
+27
View File
@@ -0,0 +1,27 @@
Copyright (c) 2008, Sandy Barbour and Ben Supnik
All rights reserved.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
so, subject to the following conditions:
* Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
* Neither the names of the authors nor that of X-Plane or Laminar Research
may be used to endorse or promote products derived from this software
without specific prior written permission from the authors or
Laminar Research, respectively.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Executable
+60
View File
@@ -0,0 +1,60 @@
#!/bin/bash
mkdir -p build
cd build
mkdir -p X-Plane/GAConnector/64
mkdir -p X-Plane/GAConnector/recordings
mkdir -p ESP/32/GAConnector
mkdir -p ESP/32/GAConnector/recordings
mkdir -p ESP/64/GAConnector
mkdir -p ESP/64/GAConnector/recordings
rm -f CMakeCache.txt
case $1 in
"mac")
cmake -DXP=ON -DDEBUG=$DEBUG -DCMAKE_TOOLCHAIN_FILE=../toolchain-mac.cmake ..
;;
"lin")
cmake -DXP=ON -DDEBUG=$DEBUG -DBIT=64 -DCMAKE_TOOLCHAIN_FILE=../toolchain-lin.cmake ..
;;
"win64")
cmake -DXP=ON -DDEBUG=$DEBUG -DBIT=64 -DCMAKE_TOOLCHAIN_FILE=../toolchain-win-64.cmake ..
\cp -rf ../openSSL/win64/*.dll X-Plane/GAConnector/64/
\cp -rf /opt/llvm-mingw/x86_64-w64-mingw32/bin/libc++.dll X-Plane/GAConnector/64
\cp -rf /opt/llvm-mingw/x86_64-w64-mingw32/bin/libunwind.dll X-Plane/GAConnector/64
;;
"win64-ESP")
cmake -DDEBUG=$DEBUG -DBIT=64 -DMSFS=ON -DCMAKE_TOOLCHAIN_FILE=../toolchain-win-64.cmake ..
\cp -rf ../openSSL/win64/*.dll ESP/64/GAConnector/
\cp -rf ../SimConnect/64/*.dll ESP/64/GAConnector/
\cp -rf /opt/llvm-mingw/x86_64-w64-mingw32/bin/libc++.dll ESP/64/GAConnector/
\cp -rf /opt/llvm-mingw/x86_64-w64-mingw32/bin/libunwind.dll ESP/64/GAConnector/
;;
"win32")
cmake -DDEBUG=$DEBUG -DBIT=32 -DCMAKE_TOOLCHAIN_FILE=../toolchain-win-32.cmake ..
\cp -rf ../openSSL/win32/*.dll ESP/32/GAConnector/
\cp -rf ../SimConnect/32/*.msi ESP/32/GAConnector/
\cp -rf /opt/llvm-mingw/i686-w64-mingw32/bin/libc++.dll ESP/32/GAConnector/
\cp -rf /opt/llvm-mingw/i686-w64-mingw32/bin/libunwind.dll ESP/32/GAConnector/
;;
*)
echo "Unknown platform, choose one of mac, lin, win64, win64-ESP, win32"
exit 22
;;
esac
make -j
code=$?
if [ "$code" -ne 0 ]
then
exit $code
fi
if [ "$1" = "mac" ] && [ "$DEBUG" = "1" ]
then
echo "Building dSYM"
/opt/osxcross/target/bin/osxcross-llvm-dsymutil X-Plane/GAConnector/mac.xpl
/opt/osxcross/target/bin/osxcross-llvm-dsymutil X-Plane/GAConnector/libixwebsocket.dylib
fi
+75
View File
@@ -0,0 +1,75 @@
file(GLOB socket CONFIGURE_DEPENDS ${CMAKE_SOURCE_DIR}/websocket/*.cpp)
enable_language(RC)
# Add WIN32 to hide console window
add_executable(germanairlinesva_esp WIN32
${socket}
resources/resources-${BIT}.rc
simconnect.cpp
main.cpp
)
target_include_directories(germanairlinesva_esp PRIVATE
${CMAKE_SOURCE_DIR}/file/include
${CMAKE_SOURCE_DIR}/simdata/include
${CMAKE_SOURCE_DIR}/websocket/include
${CMAKE_SOURCE_DIR}/utilities/include
${CMAKE_SOURCE_DIR}/ixwebsocket/include
${CMAKE_SOURCE_DIR}/nlohmann/include
${CMAKE_SOURCE_DIR}/SimConnect/${BIT}/include
)
target_compile_definitions(germanairlinesva_esp PRIVATE
BIT="${BIT}"
IBM
)
if (MSFS)
target_compile_definitions(germanairlinesva_esp PRIVATE
MSFS
)
endif()
target_compile_options(germanairlinesva_esp PRIVATE
-Wall
-Wextra
-pedantic
-fvisibility=hidden
)
if(DEBUG)
target_compile_options(germanairlinesva_esp PRIVATE
-g
)
target_link_options(germanairlinesva_esp PRIVATE
-g
)
else()
target_compile_options(germanairlinesva_esp PRIVATE
-O2
)
endif()
message("Building for Windows ${BIT} into ${PROJECT_BINARY_DIR}/ESP/${BIT}/${PLUGIN_NAME}")
set_target_properties(germanairlinesva_esp PROPERTIES
RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/ESP/${BIT}/${PLUGIN_NAME}"
OUTPUT_NAME "GA Connector"
)
if(DEBUG)
target_compile_options(germanairlinesva_esp PRIVATE
-gcodeview
)
target_link_options(germanairlinesva_esp PRIVATE
-Wl,-pdb=
)
endif()
target_link_libraries(germanairlinesva_esp PRIVATE
user32
shell32
version
ixwebsocket
pthread
${CMAKE_SOURCE_DIR}/SimConnect/${BIT}/SimConnect.lib
)
+125
View File
@@ -0,0 +1,125 @@
#ifndef GERMANAIRLINESVA_GACONNECTOR_ESP_SIMCONNECT_H
#define GERMANAIRLINESVA_GACONNECTOR_ESP_SIMCONNECT_H
#include <cmath>
#include <functional>
#include <string>
#include "websocket.h"
#include <windows.h>
#include "SimConnect.h"
#include "config/config.hpp"
#include "constants.h"
#pragma pack(push)
#pragma pack(1)
struct data {
double parkingBrake; // BRAKE PARKING INDICATOR
double onGround; // SIM ON GROUND
double emptyWeight; // EMPTY WEIGHT
double currentWeight; // TOTAL WEIGHT
double fuel; // FUEL TOTAL QUANTITY WEIGHT
double headingTrue; // PLANE HEADING DEGREES TRUE
double headingMagnetic; // PLANE HEADING DEGREES Magnetic
double groundSpeed; // GROUND VELOCITY
double indicatedAirspeed; // AIRSPEED INDICATED
double barberPoleSpeed; // AIRSPEED BARBER POLE
double verticalVelocity; // VELOCITY WORLD Y
double verticalSpeed; // VERTICAL SPEED
double altitude; // PLANE ALTITUDE
double altitudeAGL; // PLANE ALT ABOVE GROUND
double latitude; // PLANE LATITUDE
double longitude; // PLANE LONGITUDE
double elapsedTime; // ABSOLUTE TIME
double fuelFlowEng1; // ENG FUEL FLOW PPH:1
double fuelFlowEng2; // ENG FUEL FLOW PPH:2
double fuelFlowEng3; // ENG FUEL FLOW PPH:3
double fuelFlowEng4; // ENG FUEL FLOW PPH:4
int brakePos;
int brakeParkPos;
int brakeLeftPos;
double timeZulu; // ZULU TIME IN SECONDS
double gForce; // G FORCE IN G
};
struct Port {
double headingTrue; // PLANE HEADING DEGREES TRUE
double latitude; // PLANE LATITUDE
double longitude; // PLANE LONGITUDE
};
#pragma pack(pop)
enum DEFINITIONS {
D_DATA,
D_PORT,
};
enum REQUESTS {
R_DATA,
R_ACFT,
R_DIALOG,
R_PORT,
};
enum EVENTS {
E_PAUSE,
E_STATUS,
E_TEXT,
E_TIMEMIN,
E_TIMEHRS,
E_TIMESEC,
};
enum GROUPS {
G_TIME,
};
class SimConnect
{
private:
HANDLE simConnect;
bool connectedToSim;
char version;
std::string aircraftPath;
bool pausedMenu;
bool paused;
std::mutex mutex;
struct germanairlinesva::gaconnector::websocket::data simData;
std::shared_ptr<germanairlinesva::file::config::Config> configuration;
std::function<void(const std::string)> toLog;
void handleOpen(SIMCONNECT_RECV_OPEN *data);
void handleSystemEvent(SIMCONNECT_RECV_SYSTEM_STATE *state);
void handleEvent(SIMCONNECT_RECV_EVENT *event);
void handleData(SIMCONNECT_RECV_SIMOBJECT_DATA *data);
public:
SimConnect(
HWND hWnd,
std::function<void(const std::string)> toLog,
std::shared_ptr<germanairlinesva::file::config::Config> &configuration);
~SimConnect();
bool isConnected() const;
const std::string getVersion() const;
void getData(struct germanairlinesva::gaconnector::websocket::data *data);
void getStates() const;
void handleMessage();
};
#endif
+34
View File
@@ -0,0 +1,34 @@
#ifndef GERMANAIRLINESVA_GACONNECTOR_ESP_MAIN_H
#define GERMANAIRLINESVA_GACONNECTOR_ESP_MAIN_H
#include <atomic>
#include <ctime>
#include <fstream>
#include <iomanip>
#include <iostream>
#include <mutex>
#include <queue>
#include <string>
#include "websocket.h"
#include <shlobj.h>
#include <stdlib.h>
#include <windows.h>
#include "_simconnect.h"
#include "config/config.hpp"
#include "constants.h"
#include "logbook/logbook.hpp"
#include "recording/recording.hpp"
#include "simdata/simDatabase.hpp"
WINBOOL addNotifyIcon(HWND hWnd);
WINBOOL removeNotifyIcon(HWND hWnd);
WINBOOL createMenu(HWND hWnd);
void end(HWND hwnd);
void serverWorker();
void recordingWorker();
void toLog(const std::string &message);
#endif
+402
View File
@@ -0,0 +1,402 @@
#include "include/main.h"
std::mutex mutex;
std::queue<std::function<void()>> &messageQueue()
{
static std::queue<std::function<void()>> _messageQueue;
return _messageQueue;
}
std::thread serverThread;
std::thread recordingThread;
std::atomic<bool> wantsExit;
std::shared_ptr<germanairlinesva::file::config::Config> configuration;
std::unique_ptr<germanairlinesva::file::simdata::SimDatabase> database;
std::unique_ptr<germanairlinesva::gaconnector::websocket::Websocket> connector;
std::unique_ptr<SimConnect> simConnect;
struct germanairlinesva::gaconnector::websocket::data toSend;
germanairlinesva::file::recording::Recording p;
// The Window Procedure
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
static UINT s_uTaskbarRestart;
switch (msg) {
case WM_CREATE: {
s_uTaskbarRestart = RegisterWindowMessage(TEXT("TaskbarCreated"));
break;
}
case WM_CLOSE: {
DestroyWindow(hWnd);
break;
}
case WM_DESTROY: {
end(hWnd);
break;
}
case TRAY_MESSAGE: {
switch (lParam) {
case WM_RBUTTONUP:
case WM_CONTEXTMENU: {
createMenu(hWnd);
break;
}
}
break;
}
case SIMCONNECT_MESSAGE: {
if (simConnect != nullptr && simConnect->isConnected()) {
simConnect->handleMessage();
}
break;
}
default: {
if (msg == s_uTaskbarRestart) {
addNotifyIcon(hWnd);
}
break;
}
}
return DefWindowProc(hWnd, msg, wParam, lParam);
}
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-parameter"
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
WNDCLASS wc;
ZeroMemory(&wc, sizeof(WNDCLASS));
HWND hWnd;
MSG msg;
wantsExit.store(false);
// Exit if already running
hWnd = FindWindow(WINDOW_CLASS, WINDOW_CLASS);
if (hWnd != NULL) {
toLog("Exiting duplicate");
return 0;
}
// Clear log
std::ofstream clearLog(BASE_DIRECTORY "log.txt");
clearLog.close();
// Registering the Window Class
wc.lpfnWndProc = WndProc;
wc.hInstance = hInstance;
wc.lpszClassName = WINDOW_CLASS;
if (!RegisterClass(&wc)) {
toLog("Error window register: " + std::to_string(GetLastError()));
return 0;
}
// Creating the Window
hWnd = CreateWindow(WINDOW_CLASS,
WINDOW_CLASS,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
240,
120,
NULL,
NULL,
hInstance,
NULL);
if (hWnd == NULL) {
toLog("Error window create: " + std::to_string(GetLastError()));
return 0;
}
// Add Notify Icon
if (!addNotifyIcon(hWnd)) {
toLog("Error notifyIcon: " + std::to_string(GetLastError()));
return 0;
}
// Never show window
// ShowWindow(hWnd, SHOW_OPENWINDOW);
configuration = std::make_unique<germanairlinesva::file::config::Config>();
toLog("Config loaded");
connector =
std::make_unique<germanairlinesva::gaconnector::websocket::Websocket>(
"wss://ws.hofmannnet.myhome-server.de:8000",
configuration->getUser(),
toLog);
toLog("WebSocket started");
#ifndef MSFS
PWSTR folder;
HRESULT result = SHGetKnownFolderPath(FOLDERID_RoamingAppData,
KF_FLAG_DEFAULT,
NULL,
&folder);
if (SUCCEEDED(result)) {
size_t origsize = wcslen(folder) + 1;
size_t convertedChars = 0;
char *nstring = new char[origsize * 2];
wcstombs_s(&convertedChars, nstring, origsize * 2, folder, _TRUNCATE);
std::string path(nstring);
path.append("\\Microsoft\\FSX\\scenery.cfg");
toLog(path);
delete[] nstring;
CoTaskMemFree(folder);
char hash[2 * MD5LEN + 1] = "";
if (germanairlinesva::utilities::generateMD5(path.c_str(), hash, toLog) ==
0) {
database = std::make_unique<germanairlinesva::file::simdata::SimDatabase>(
FSX_VERSION,
hash,
configuration,
toLog);
}
toLog("Readback test of sim database using EDDF");
auto ap = (*database)["EDDF"];
for (const auto &it : ap.first) {
toLog(" " + it.to_string());
}
for (const auto &it : ap.second) {
toLog(" " + it.to_string());
}
toLog("Readback test of sim database using XXXX");
auto ap2 = (*database)["XXXX"];
ap2.first.size() == 0 ? toLog(" SUCCESS") : toLog(" ERROR");
}
#endif
toLog("Logbook Test");
germanairlinesva::file::logbook::Logbook logbook;
logbook.addEntry("08.09.2022",
"F",
"1000",
"L049",
"D-ALFA",
"John F. Kennedy International Aiport / EDDF",
"A1",
"14L",
"Gander International Airport / CYQX",
"10",
"03",
"10:00",
"10:20",
"13:20",
"13:30",
210.5,
20.1,
5012.4156,
8.87,
5041.3856,
7.1,
971.14,
2.41,
980.65,
-165.23,
1,
1.2012,
"2022-09-08_VGA1000",
5.5,
1);
logbook.toFile();
// Open SimConnect
simConnect = std::make_unique<SimConnect>(hWnd, toLog, configuration);
// Thread for sending data to websocket
serverThread = std::thread(&serverWorker);
recordingThread = std::thread(&recordingWorker);
toLog("Workers started");
// The Message Loop
while (GetMessage(&msg, NULL, 0, 0) > 0) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
// Exit
toLog("Connector stopped");
return msg.wParam;
}
#pragma clang diagnostic pop
WINBOOL addNotifyIcon(HWND hWnd)
{
HICON icon;
NOTIFYICONDATA niData;
ZeroMemory(&niData, sizeof(NOTIFYICONDATA));
icon = (HICON)LoadImage(GetModuleHandle(NULL),
MAKEINTRESOURCE(APP_ICON),
IMAGE_ICON,
GetSystemMetrics(SM_CXSMICON),
GetSystemMetrics(SM_CYSMICON),
LR_SHARED);
if (icon == NULL) {
toLog("error icon " + std::to_string(GetLastError()));
}
niData.cbSize = sizeof(NOTIFYICONDATA);
niData.uVersion = NOTIFYICON_VERSION_4;
niData.uID = TRAY_ICON_ID;
niData.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
strcpy(niData.szTip, "GA Connector");
niData.hIcon = icon;
niData.hWnd = hWnd;
niData.uCallbackMessage = TRAY_MESSAGE;
WINBOOL retVal = Shell_NotifyIcon(NIM_ADD, &niData);
// DestroyIcon(niData.hIcon);
return retVal;
}
WINBOOL removeNotifyIcon(HWND hWnd)
{
NOTIFYICONDATA niData;
ZeroMemory(&niData, sizeof(NOTIFYICONDATA));
niData.cbSize = sizeof(NOTIFYICONDATA);
niData.uID = TRAY_ICON_ID;
niData.hWnd = hWnd;
return Shell_NotifyIcon(NIM_DELETE, &niData);
}
WINBOOL createMenu(HWND hWnd)
{
const int IDM_EXIT = 100;
POINT pt;
GetCursorPos(&pt);
HMENU hMenu = CreatePopupMenu();
AppendMenu(hMenu, MF_STRING | MF_GRAYED, NULL, "Version: " BIT " Bit");
if (simConnect->isConnected()) {
std::string version("Connected to Sim: ");
version.append(simConnect->getVersion());
AppendMenu(hMenu, MF_STRING | MF_GRAYED, NULL, version.c_str());
}
AppendMenu(hMenu, MF_SEPARATOR, NULL, NULL);
AppendMenu(hMenu, MF_STRING, IDM_EXIT, "Exit");
SetForegroundWindow(hWnd);
WINBOOL cmd = TrackPopupMenu(hMenu,
TPM_LEFTALIGN | TPM_LEFTBUTTON |
TPM_BOTTOMALIGN | TPM_RETURNCMD,
pt.x,
pt.y,
0,
hWnd,
NULL);
if (cmd == IDM_EXIT) {
PostMessage(hWnd, WM_CLOSE, 0, NULL);
}
return DestroyMenu(hMenu);
}
void end(HWND hWnd)
{
removeNotifyIcon(hWnd);
UnregisterClass(WINDOW_CLASS, GetModuleHandle(NULL));
/* End threads */
wantsExit = true;
serverThread.join();
recordingThread.join();
p.toFile("flight.rec");
// End SimConnect
delete simConnect.release();
PostQuitMessage(0);
}
void serverWorker()
{
germanairlinesva::utilities::setThreadName("GAServerWorker");
while (!wantsExit) {
simConnect->getStates();
struct germanairlinesva::gaconnector::websocket::data *copy =
new germanairlinesva::gaconnector::websocket::data();
{
const std::lock_guard<std::mutex> lock(mutex);
simConnect->getData(copy);
}
connector->sendData(*copy);
std::this_thread::sleep_for(std::chrono::milliseconds(250));
}
toLog("Server thread stopped");
}
void recordingWorker()
{
germanairlinesva::utilities::setThreadName("GARecordingWorker");
germanairlinesva::file::recording::RecordingEntry lastPath;
std::uint32_t segment = 0;
auto ap = (*database)["EDDF"];
auto rwys = ap.second;
while (!wantsExit) {
struct germanairlinesva::gaconnector::websocket::data *copy =
new germanairlinesva::gaconnector::websocket::data();
{
const std::lock_guard<std::mutex> lock(mutex);
simConnect->getData(copy);
}
germanairlinesva::file::recording::RecordingEntry currentPath(
segment,
static_cast<std::uint16_t>(copy->alt),
static_cast<std::uint16_t>(copy->gs),
{copy->lat, copy->lon});
if (strcmp(copy->path, "") != 0 && !copy->pause &&
lastPath != currentPath) {
p.addEntry(currentPath);
lastPath = currentPath;
for (const auto &it : rwys) {
if (it.containsPoint({copy->lat, copy->lon})) {
toLog("On Runway: " + it.to_string());
}
}
}
segment++;
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
}
toLog("Recording thread stopped");
}
void toLog(const std::string &message)
{
std::time_t utc = std::time(nullptr);
std::tm *time = std::gmtime(&utc);
std::ofstream msg(BASE_DIRECTORY "log.txt", std::ofstream::app);
msg << std::put_time(time, "%Y-%m-%d %H:%M:%S UTC ")
<< "German Airlines VA: " << message << std::endl;
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

+24
View File
@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity type="win32"
name="germanairlinesva.gaconnector"
version="1.0.0.14"
processorArchitecture='x86'
/>
<dependency>
<dependentAssembly>
<assemblyIdentity type='win32'
name='Microsoft.FlightSimulator.SimConnect'
version='10.0.61259.0'
processorArchitecture='x86'
publicKeyToken='67c7c14424d61b5b' />
</dependentAssembly>
</dependency>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>
+15
View File
@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity type="win32"
name="germanairlinesva.gaconnector"
version="1.0.0.14"
processorArchitecture='amd64'
/>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>
+39
View File
@@ -0,0 +1,39 @@
#define APSTUDIO_READONLY_SYMBOLS
#include "winres.h"
#include "winuser.h"
#undef APSTUDIO_READONLY_SYMBOLS
#include "constants.h"
APP_ICON ICON "gatoolv2_icon.ico"
1 RT_MANIFEST "manifest-32.xml"
VS_VERSION_INFO VERSIONINFO
FILEVERSION VER_FILEVERSION
PRODUCTVERSION VER_PRODUCTVERSION
FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
FILEFLAGS VER_DEBUG
FILEOS VOS__WINDOWS32
FILETYPE VFT_APP
FILESUBTYPE 0x0L
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040904E4"
BEGIN
VALUE "CompanyName", VER_COMPANY_NAME
VALUE "FileDescription", VER_FILE_DESCRIPTION
VALUE "FileVersion", VER_FILEVERSION_STR
VALUE "InternalName", VER_INTERNAL_NAME
VALUE "LegalCopyright", VER_LEGAL_COPYRIGHT
VALUE "OriginalFilename", VER_ORIGINAL_FILE_NAME
VALUE "ProductName", VER_PRODUCT_NAME " 32"
VALUE "ProductVersion", VER_PRODUCTVERSION_STR
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x409, 1252
END
END
+39
View File
@@ -0,0 +1,39 @@
#define APSTUDIO_READONLY_SYMBOLS
#include "winres.h"
#include "winuser.h"
#undef APSTUDIO_READONLY_SYMBOLS
#include "constants.h"
APP_ICON ICON "gatoolv2_icon.ico"
1 RT_MANIFEST "manifest-64.xml"
VS_VERSION_INFO VERSIONINFO
FILEVERSION VER_FILEVERSION
PRODUCTVERSION VER_PRODUCTVERSION
FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
FILEFLAGS VER_DEBUG
FILEOS VOS__WINDOWS32
FILETYPE VFT_APP
FILESUBTYPE 0x0L
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040904E4"
BEGIN
VALUE "CompanyName", VER_COMPANY_NAME
VALUE "FileDescription", VER_FILE_DESCRIPTION
VALUE "FileVersion", VER_FILEVERSION_STR
VALUE "InternalName", VER_INTERNAL_NAME
VALUE "LegalCopyright", VER_LEGAL_COPYRIGHT
VALUE "OriginalFilename", VER_ORIGINAL_FILE_NAME
VALUE "ProductName", VER_PRODUCT_NAME " 64"
VALUE "ProductVersion", VER_PRODUCTVERSION_STR
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x409, 1252
END
END
+460
View File
@@ -0,0 +1,460 @@
#include "include/_simconnect.h"
SimConnect::SimConnect(
HWND hWnd,
std::function<void(const std::string)> toLog,
std::shared_ptr<germanairlinesva::file::config::Config> &configuration)
: configuration(configuration), toLog(std::move(toLog))
{
HRESULT hr = SimConnect_Open(&this->simConnect,
"GAConnector",
hWnd,
SIMCONNECT_MESSAGE,
NULL,
NULL);
if (!SUCCEEDED(hr)) {
this->toLog("SimConnect_Open: Failed");
} else {
this->connectedToSim = true;
this->toLog("SimConnect_Close: Connection opened");
// Setup SimConnect
SimConnect_SubscribeToSystemEvent(simConnect, EVENTS::E_PAUSE, "Pause");
SimConnect_SubscribeToSystemEvent(simConnect, EVENTS::E_STATUS, "Sim");
SimConnect_MapClientEventToSimEvent(simConnect,
EVENTS::E_TIMESEC,
"CLOCK_SECONDS_ZERO");
SimConnect_AddClientEventToNotificationGroup(simConnect,
GROUPS::G_TIME,
EVENTS::E_TIMESEC,
false);
SimConnect_SetNotificationGroupPriority(simConnect,
GROUPS::G_TIME,
SIMCONNECT_GROUP_PRIORITY_HIGHEST);
SimConnect_MapClientEventToSimEvent(simConnect,
EVENTS::E_TIMEMIN,
"ZULU_MINUTES_SET");
SimConnect_AddClientEventToNotificationGroup(simConnect,
GROUPS::G_TIME,
EVENTS::E_TIMEMIN,
false);
SimConnect_SetNotificationGroupPriority(simConnect,
GROUPS::G_TIME,
SIMCONNECT_GROUP_PRIORITY_HIGHEST);
SimConnect_MapClientEventToSimEvent(simConnect,
EVENTS::E_TIMEHRS,
"ZULU_HOURS_SET");
SimConnect_AddClientEventToNotificationGroup(simConnect,
GROUPS::G_TIME,
EVENTS::E_TIMEHRS,
false);
SimConnect_SetNotificationGroupPriority(simConnect,
GROUPS::G_TIME,
SIMCONNECT_GROUP_PRIORITY_HIGHEST);
SimConnect_AddToDataDefinition(simConnect,
DEFINITIONS::D_DATA,
"BRAKE PARKING INDICATOR",
"BOOL",
SIMCONNECT_DATATYPE_FLOAT64,
0,
SIMCONNECT_UNUSED);
SimConnect_AddToDataDefinition(simConnect,
DEFINITIONS::D_DATA,
"SIM ON GROUND",
"BOOL",
SIMCONNECT_DATATYPE_FLOAT64,
0,
SIMCONNECT_UNUSED);
SimConnect_AddToDataDefinition(simConnect,
DEFINITIONS::D_DATA,
"EMPTY WEIGHT",
"KILOGRAMS",
SIMCONNECT_DATATYPE_FLOAT64,
0,
SIMCONNECT_UNUSED);
SimConnect_AddToDataDefinition(simConnect,
DEFINITIONS::D_DATA,
"TOTAL WEIGHT",
"KILOGRAMS",
SIMCONNECT_DATATYPE_FLOAT64,
0,
SIMCONNECT_UNUSED);
SimConnect_AddToDataDefinition(simConnect,
DEFINITIONS::D_DATA,
"FUEL TOTAL QUANTITY WEIGHT",
"KILOGRAMS",
SIMCONNECT_DATATYPE_FLOAT64,
0,
SIMCONNECT_UNUSED);
SimConnect_AddToDataDefinition(simConnect,
DEFINITIONS::D_DATA,
"PLANE HEADING DEGREES TRUE",
"DEGREES",
SIMCONNECT_DATATYPE_FLOAT64,
0,
SIMCONNECT_UNUSED);
SimConnect_AddToDataDefinition(simConnect,
DEFINITIONS::D_DATA,
"PLANE HEADING DEGREES MAGNETIC",
"DEGREES",
SIMCONNECT_DATATYPE_FLOAT64,
0,
SIMCONNECT_UNUSED);
SimConnect_AddToDataDefinition(simConnect,
DEFINITIONS::D_DATA,
"GROUND VELOCITY",
"KNOTS",
SIMCONNECT_DATATYPE_FLOAT64,
0,
SIMCONNECT_UNUSED);
SimConnect_AddToDataDefinition(simConnect,
DEFINITIONS::D_DATA,
"AIRSPEED INDICATED",
"KNOTS",
SIMCONNECT_DATATYPE_FLOAT64,
0,
SIMCONNECT_UNUSED);
SimConnect_AddToDataDefinition(simConnect,
DEFINITIONS::D_DATA,
"AIRSPEED BARBER POLE",
"KNOTS",
SIMCONNECT_DATATYPE_FLOAT64,
0,
SIMCONNECT_UNUSED);
SimConnect_AddToDataDefinition(simConnect,
DEFINITIONS::D_DATA,
"VELOCITY WORLD Y",
"FEET/MINUTE",
SIMCONNECT_DATATYPE_FLOAT64,
0,
SIMCONNECT_UNUSED);
SimConnect_AddToDataDefinition(simConnect,
DEFINITIONS::D_DATA,
"VERTICAL SPEED",
"FEET/MINUTE",
SIMCONNECT_DATATYPE_FLOAT64,
0,
SIMCONNECT_UNUSED);
SimConnect_AddToDataDefinition(simConnect,
DEFINITIONS::D_DATA,
"PLANE ALTITUDE",
"FEET",
SIMCONNECT_DATATYPE_FLOAT64,
0,
SIMCONNECT_UNUSED);
SimConnect_AddToDataDefinition(simConnect,
DEFINITIONS::D_DATA,
"PLANE ALT ABOVE GROUND",
"FEET",
SIMCONNECT_DATATYPE_FLOAT64,
0,
SIMCONNECT_UNUSED);
SimConnect_AddToDataDefinition(simConnect,
DEFINITIONS::D_DATA,
"PLANE LATITUDE",
"DEGREES",
SIMCONNECT_DATATYPE_FLOAT64,
0,
SIMCONNECT_UNUSED);
SimConnect_AddToDataDefinition(simConnect,
DEFINITIONS::D_DATA,
"PLANE LONGITUDE",
"DEGREES",
SIMCONNECT_DATATYPE_FLOAT64,
0,
SIMCONNECT_UNUSED);
SimConnect_AddToDataDefinition(simConnect,
DEFINITIONS::D_DATA,
"ABSOLUTE TIME",
"SECONDS",
SIMCONNECT_DATATYPE_FLOAT64,
0,
SIMCONNECT_UNUSED);
SimConnect_AddToDataDefinition(simConnect,
DEFINITIONS::D_DATA,
"ENG FUEL FLOW PPH:1",
"KILOGRAMS PER SECOND",
SIMCONNECT_DATATYPE_FLOAT64,
0,
SIMCONNECT_UNUSED);
SimConnect_AddToDataDefinition(simConnect,
DEFINITIONS::D_DATA,
"ENG FUEL FLOW PPH:2",
"KILOGRAMS PER SECOND",
SIMCONNECT_DATATYPE_FLOAT64,
0,
SIMCONNECT_UNUSED);
SimConnect_AddToDataDefinition(simConnect,
DEFINITIONS::D_DATA,
"ENG FUEL FLOW PPH:3",
"KILOGRAMS PER SECOND",
SIMCONNECT_DATATYPE_FLOAT64,
0,
SIMCONNECT_UNUSED);
SimConnect_AddToDataDefinition(simConnect,
DEFINITIONS::D_DATA,
"ENG FUEL FLOW PPH:4",
"KILOGRAMS PER SECOND",
SIMCONNECT_DATATYPE_FLOAT64,
0,
SIMCONNECT_UNUSED);
SimConnect_AddToDataDefinition(simConnect,
DEFINITIONS::D_DATA,
"BRAKE INDICATOR",
"POSITION",
SIMCONNECT_DATATYPE_INT32,
0,
SIMCONNECT_UNUSED);
SimConnect_AddToDataDefinition(simConnect,
DEFINITIONS::D_DATA,
"BRAKE PARKING POSITION",
"POSITION",
SIMCONNECT_DATATYPE_INT32,
0,
SIMCONNECT_UNUSED);
SimConnect_AddToDataDefinition(simConnect,
DEFINITIONS::D_DATA,
"BRAKE LEFT POSITION",
"POSITION",
SIMCONNECT_DATATYPE_INT32,
0,
SIMCONNECT_UNUSED);
SimConnect_AddToDataDefinition(simConnect,
DEFINITIONS::D_DATA,
"ZULU TIME",
"SECONDS",
SIMCONNECT_DATATYPE_FLOAT64,
0,
SIMCONNECT_UNUSED);
SimConnect_AddToDataDefinition(simConnect,
DEFINITIONS::D_DATA,
"G FORCE",
"GForce",
SIMCONNECT_DATATYPE_FLOAT64,
0,
SIMCONNECT_UNUSED);
SimConnect_AddToDataDefinition(simConnect,
DEFINITIONS::D_PORT,
"PLANE HEADING DEGREES TRUE",
"DEGREES",
SIMCONNECT_DATATYPE_FLOAT64,
0,
SIMCONNECT_UNUSED);
SimConnect_AddToDataDefinition(simConnect,
DEFINITIONS::D_PORT,
"PLANE LATITUDE",
"DEGREES",
SIMCONNECT_DATATYPE_FLOAT64,
0,
SIMCONNECT_UNUSED);
SimConnect_AddToDataDefinition(simConnect,
DEFINITIONS::D_PORT,
"PLANE LONGITUDE",
"DEGREES",
SIMCONNECT_DATATYPE_FLOAT64,
0,
SIMCONNECT_UNUSED);
SimConnect_RequestDataOnSimObject(simConnect,
REQUESTS::R_DATA,
DEFINITIONS::D_DATA,
SIMCONNECT_OBJECT_ID_USER,
SIMCONNECT_PERIOD_SIM_FRAME,
SIMCONNECT_DATA_REQUEST_FLAG_DEFAULT,
0,
0,
0);
}
}
SimConnect::~SimConnect()
{
if (this->connectedToSim) {
HRESULT hr = SimConnect_Close(this->simConnect);
if (!SUCCEEDED(hr)) {
this->toLog("SimConnect_Close: Failed");
} else {
this->connectedToSim = true;
this->toLog("SimConnect_Close: Connection closed");
}
}
}
void SimConnect::getStates() const
{
SimConnect_RequestSystemState(this->simConnect,
REQUESTS::R_ACFT,
"AircraftLoaded");
SimConnect_RequestSystemState(this->simConnect, REQUESTS::R_DIALOG, "DIALOG");
}
bool SimConnect::isConnected() const { return this->connectedToSim; }
const std::string SimConnect::getVersion() const
{
switch (this->version) {
case MSFS_VERSION:
return "MSFS";
case FSX_VERSION:
return "FSX";
case P3D5_VERSION:
return "P3D5";
case P3D4_VERSION:
return "P3D4";
break;
case P3D3_VERSION:
return "P3D3";
default:
return "Unknown";
}
}
void SimConnect::getData(
struct germanairlinesva::gaconnector::websocket::data *data)
{
const std::lock_guard<std::mutex> lock(this->mutex);
memcpy(data, &this->simData, sizeof(this->simData));
}
void SimConnect::handleMessage()
{
SIMCONNECT_RECV *pData;
DWORD cbData;
HRESULT hr = SimConnect_GetNextDispatch(this->simConnect, &pData, &cbData);
if (SUCCEEDED(hr)) {
switch (pData->dwID) {
case SIMCONNECT_RECV_ID_OPEN: {
this->handleOpen((SIMCONNECT_RECV_OPEN *)pData);
break;
}
case SIMCONNECT_RECV_ID_EVENT: {
this->handleEvent((SIMCONNECT_RECV_EVENT *)pData);
break;
}
case SIMCONNECT_RECV_ID_SYSTEM_STATE: {
this->handleSystemEvent((SIMCONNECT_RECV_SYSTEM_STATE *)pData);
break;
}
case SIMCONNECT_RECV_ID_SIMOBJECT_DATA: {
this->handleData((SIMCONNECT_RECV_SIMOBJECT_DATA *)pData);
break;
}
default:
break;
}
}
}
void SimConnect::handleOpen(SIMCONNECT_RECV_OPEN *data)
{
switch (data->dwSimConnectVersionMajor) {
case MSFS_VERSION:
this->version = MSFS_VERSION;
break;
default:
break;
case FSX_VERSION:
switch (data->dwSimConnectBuildMajor) {
case FSXRTM_SUBVERSION:
case FSSXSP1_SUBVERRSION:
break;
case FSXSP2_SUBVERSION:
case FSXACC_SUBVERSION:
case FSXGOLD_SUBVERSION:
this->version = FSX_VERSION;
break;
case FSXSE_SUBVERSION:
if (configuration->getFSXSEPath().length() > 0) {
this->version = FSXSE_VERSION;
} else {
this->version = FSX_VERSION;
}
break;
}
break;
case P3D5_VERSION:
this->version = P3D5_VERSION;
break;
case P3D4_VERSION:
this->version = P3D4_VERSION;
break;
case P3D3_VERSION:
this->version = P3D3_VERSION;
break;
}
}
void SimConnect::handleSystemEvent(SIMCONNECT_RECV_SYSTEM_STATE *state)
{
switch (state->dwRequestID) {
case REQUESTS::R_ACFT:
this->aircraftPath = state->szString;
break;
case REQUESTS::R_DIALOG:
this->pausedMenu = state->dwInteger != 0;
break;
}
}
void SimConnect::handleEvent(SIMCONNECT_RECV_EVENT *event)
{
switch (event->uEventID) {
case EVENTS::E_PAUSE:
this->paused = event->dwData != 0;
break;
case EVENTS::E_STATUS:
this->toLog("SimConnect Status " + std::to_string(event->dwData));
break;
}
}
void SimConnect::handleData(SIMCONNECT_RECV_SIMOBJECT_DATA *data)
{
switch (data->dwRequestID) {
case REQUESTS::R_DATA: {
const std::lock_guard<std::mutex> lock(this->mutex);
struct data *_data = (struct data *)&data->dwData;
this->simData.pause = this->paused || this->pausedMenu;
this->simData.pBrake = _data->parkingBrake != 0 || _data->brakePos;
this->simData.onGrnd = _data->onGround != 0;
this->simData.totFuelKg = _data->fuel;
this->simData.truHdg = _data->headingTrue;
this->simData.alt = _data->altitude;
this->simData.gs = _data->groundSpeed;
this->simData.ias = _data->indicatedAirspeed;
this->simData.vs =
abs(_data->verticalVelocity - _data->verticalSpeed) > 200
? _data->verticalSpeed
: _data->verticalVelocity;
this->simData.lat = _data->latitude;
this->simData.lon = _data->longitude;
this->simData.ff[0] = _data->fuelFlowEng1;
this->simData.ff[1] = _data->fuelFlowEng2;
this->simData.ff[2] = _data->fuelFlowEng3;
this->simData.ff[3] = _data->fuelFlowEng4;
this->simData.maxSpd = _data->barberPoleSpeed;
strcpy(this->simData.path, this->aircraftPath.c_str());
this->simData.uptime = _data->elapsedTime;
this->simData.magHeading = _data->headingMagnetic;
this->simData.payloadKg =
_data->currentWeight - _data->emptyWeight - _data->fuel;
this->simData.totalWeightKg = _data->currentWeight;
}
}
}
+106
View File
@@ -0,0 +1,106 @@
#ifndef GERMANAIRLINESVA_FILE_CONFIG_CONFIG_H
#define GERMANAIRLINESVA_FILE_CONFIG_CONFIG_H
#include <map>
#include <fstream>
#include <map>
#include <string>
#include <vector>
#include "constants.h"
#include "util.hpp"
namespace germanairlinesva
{
namespace file
{
namespace config
{
class Config
{
private:
std::string user;
std::string scenery;
std::string token;
std::string FSXPath;
std::string FSXSEPath;
std::string P3D3Path;
std::string P3D4Path;
std::string P3D5Path;
std::string MSFSPath;
inline void writeFile() const
{
std::ofstream out(BASE_DIRECTORY CONFIG);
out << "scenery=" << this->scenery << "\n";
out << "user=" << this->user << "\n";
out << "token=" << this->token << "\n";
out << "fsxPath=" << this->FSXPath << "\n";
out << "fsxSEPath=" << this->FSXSEPath << "\n";
out << "p3d3Path=" << this->P3D3Path << "\n";
out << "p3d4Path=" << this->P3D4Path << "\n";
out << "p3d5Path=" << this->P3D5Path << "\n";
out << "msfsPath=" << this->MSFSPath << "\n";
out.close();
}
public:
inline Config()
{
std::ifstream in(BASE_DIRECTORY CONFIG);
std::string line;
while (std::getline(in, line)) {
std::vector<std::string> fields = utilities::split(line, '=');
if (fields.size() >= 2) {
utilities::trim(fields[0]);
utilities::trim(fields[1]);
if (fields[0] == "scenery") {
this->scenery = fields[1];
} else if (fields[0] == "user") {
this->user = fields[1];
} else if (fields[0] == "token") {
this->token = fields[1];
} else if (fields[0] == "fsxPath") {
this->FSXPath = fields[1];
} else if (fields[0] == "fsxSEPath") {
this->FSXSEPath = fields[1];
} else if (fields[0] == "p3d3Path") {
this->P3D3Path = fields[1];
} else if (fields[0] == "p3d4Paht") {
this->P3D4Path = fields[1];
} else if (fields[0] == "p3d5Path") {
this->P3D5Path = fields[1];
} else if (fields[0] == "msfsPath") {
this->MSFSPath = fields[1];
}
}
}
in.close();
}
inline void updateScenery(std::string scenery)
{
this->scenery = scenery;
this->writeFile();
}
inline const std::string getUser() const { return this->user; }
inline const std::string getScenery() const { return this->scenery; }
inline const std::string getToken() const { return this->token; }
inline const std::string getFSXPath() const { return this->FSXPath; }
inline const std::string getFSXSEPath() const
{
return this->FSXSEPath;
}
inline const std::string getP3D3Path() const { return this->P3D3Path; }
inline const std::string getP3D4Path() const { return this->P3D4Path; }
inline const std::string getP3D5Path() const { return this->P3D5Path; }
inline const std::string getMSFSPath() const { return this->MSFSPath; }
};
} // namespace config
} // namespace file
} // namespace germanairlinesva
#endif
+57
View File
@@ -0,0 +1,57 @@
#ifndef GERMANAIRLINESVA_FILE_HELPERS_H
#define GERMANAIRLINESVA_FILE_HELPERS_H
#include <cstdint>
#include <fstream>
#include <string>
#include <vector>
namespace germanairlinesva
{
namespace file
{
static inline const std::string readString(std::ifstream &in,
std::uint8_t length)
{
std::vector<char> value(length + 1);
in.read(value.data(), length);
return std::string(std::move(value.data()));
}
static inline const std::string readString(std::ifstream &in)
{
std::uint8_t length;
in.read(reinterpret_cast<char *>(&length), 1);
std::vector<char> value(length + 1);
in.read(value.data(), length);
return std::string(std::move(value.data()));
}
template <typename T> static inline const T read(std::ifstream &in)
{
T value;
in.read(reinterpret_cast<char *>(&value), sizeof(value));
return value;
}
static inline void writeString(std::ofstream &out, std::string value)
{
std::uint8_t length = value.length();
out.write(reinterpret_cast<char *>(&length), sizeof(length));
out.write(value.data(), length);
}
static inline void
writeString(std::ofstream &out, std::string value, std::uint8_t length)
{
out.write(value.data(), length);
}
template <typename T> static inline void write(std::ofstream &out, T value)
{
out.write(reinterpret_cast<char *>(&value), sizeof(value));
}
} // namespace file
} // namespace germanairlinesva
#endif
+144
View File
@@ -0,0 +1,144 @@
#ifndef GERMANAIRLINESVA_FILE_LOGBOOK_LOGBOOK_H
#define GERMANAIRLINESVA_FILE_LOGBOOK_LOGBOOK_H
#include <cstdint>
#include <fstream>
#include <string>
#include <utility>
#include <vector>
#include "constants.h"
#include "helpers.hpp"
#include "logbookEntry.hpp"
#include "util.hpp"
namespace germanairlinesva
{
namespace file
{
namespace logbook
{
/*
* Logbook Header (6)
* CHAR[5] | UINT8
* --------+--------
* VGAL | VERSION
*
* Logbook Entries (n)
* LOGBOOKENTRY[]
*/
class Logbook
{
private:
std::vector<LogbookEntry> entries;
inline void readVersion1(std::ifstream &in)
{
std::string date = readString(in, 10);
std::string flightType = readString(in, 1);
std::string flightNumber = readString(in, 4);
std::string aircraftType = readString(in, 4);
std::string aircraftRegistration = readString(in, 6);
std::string departureAirport = readString(in);
std::string departureGate = readString(in);
std::string departureRunway = readString(in);
std::string arrivalAirport = readString(in);
std::string arrivalGate = readString(in);
std::string arrivalRunway = readString(in);
std::string offBlockTime = readString(in, 5);
std::string outTime = readString(in, 5);
std::string inTime = readString(in, 5);
std::string onBlockTime = readString(in, 5);
float totalFlightTime = read<float>(in);
float taxiOutFuel = read<float>(in);
float inFlightFuel = read<float>(in);
float taxiInFuel = read<float>(in);
float totalFuel = read<float>(in);
float taxiOutDistance = read<float>(in);
float inFlightDistance = read<float>(in);
float taxiInDistance = read<float>(in);
float totalDistance = read<float>(in);
float maxLandingRate = read<float>(in);
std::uint8_t touchdowns = read<std::uint8_t>(in);
float maxLandingGees = read<float>(in);
std::string recordingFilename = readString(in);
float points = read<float>(in);
std::uint8_t flags = read<std::uint8_t>(in);
this->addEntry(date,
flightType,
flightNumber,
aircraftType,
aircraftRegistration,
departureAirport,
departureGate,
departureRunway,
arrivalAirport,
arrivalGate,
arrivalRunway,
offBlockTime,
outTime,
inTime,
onBlockTime,
totalFlightTime,
taxiOutFuel,
inFlightFuel,
taxiInFuel,
totalFuel,
taxiOutDistance,
inFlightDistance,
taxiInDistance,
totalDistance,
maxLandingRate,
touchdowns,
maxLandingGees,
recordingFilename,
points,
flags);
}
inline void fromFile()
{
std::ifstream in(BASE_DIRECTORY LOGBOOK, std::ifstream::binary);
std::string ident = readString(in, 4);
if (ident.compare(LOGBOOK_HEADER) != 0) {
throw std::invalid_argument("Wrong file");
}
std::uint8_t version = read<std::uint8_t>(in);
if (version == 1) {
while (in.peek() != EOF) {
this->readVersion1(in);
}
}
}
public:
inline Logbook()
{
if (utilities::fileExists(BASE_DIRECTORY LOGBOOK)) {
this->fromFile();
}
}
template <class... Args> inline void addEntry(Args &&...args)
{
this->entries.emplace_back(std::forward<Args>(args)...);
}
inline void toFile() const
{
std::ofstream out(BASE_DIRECTORY LOGBOOK, std::fstream::binary);
out.write(LOGBOOK_HEADER, 4);
out.write("\1", 1);
for (const LogbookEntry &entry : this->entries) {
entry.toFile(out);
}
out.close();
}
};
} // namespace logbook
} // namespace file
} // namespace germanairlinesva
#endif
+210
View File
@@ -0,0 +1,210 @@
#ifndef GERMANAIRLINESVA_FILE_LOGBOOK_LOGBOOKENTRY_H
#define GERMANAIRLINESVA_FILE_LOGBOOK_LOGBOOKENTRY_H
#include <cstdint>
#include <fstream>
#include <string>
#include <vector>
#include "helpers.hpp"
namespace germanairlinesva
{
namespace file
{
namespace logbook
{
/*
* Preamble (25)
* CHAR[10] | CHAR[1] | CHAR[4] | CHAR[4] | CHAR[6]
* ---------+-------------+---------------+----------+-------------
* DATE | FLIGHT TYPE | FLIGHT NUMBER | AIRCRAFT | REGISTRATION
* Departure Airport Name (1...257)
* UINT8 | CHAR[]
* -------+-------
* STRLEN | STRING
* Departure Gate Name (1...257)
* UINT8 | CHAR[]
* -------+-------
* STRLEN | STRING
* Departure Runway Name (1...257)
* UINT8 | CHAR[]
* -------+-------
* STRLEN | STRING
* Arrival Airport Name (1...257)
* UINT8 | CHAR[]
* -------+-------
* STRLEN | STRING
* Arrival Gate Name (1...257)
* UINT8 | CHAR[]
* -------+-------
* STRLEN | STRING
* Arrival Runway Name (1...257)
* UINT8 | CHAR[]
* -------+-------
* STRLEN | STRING
* Times (24)
* CHAR[5] | CHAR[5] | CHAR[5] | CHAR[5] | FLOAT
* ----------+---------------+--------------+---------------+------
* OFF BLOCK | TAKEOFF (OUT) | LANDING (ON) | ON BLOCK (IN) | TOTAL
* Fuels (16)
* FLOAT | FLOAT | FLOAT | FLOAT
* ---------+-----------+---------+------
* TAXI OUT | IN FLIGHT | TAXI IN | TOTAL
* Distances (16)
* FLOAT | FLOAT | FLOAT |FLOAT
* ---------+-----------+---------+-----
* TAXI OUT | IN FLIGHT | TAXI IN |TOTAL
* Landing (9)
* FLOAT | CHAR | FLOAT
* ---------+---------- +------------
* MAX RATE | TOUCHDOWNS | MAX G-FORCE
* Recording Filename (1...257)
* UINT8 | CHAR[]
* -------+-------
* STRLEN | STRING
* Postamble (5)
* FLOAT | BITFIELD
* -------+---------
* POINTS | FLAGS
* Flags Bitfield
* 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
* ----+-----+-----+-----+------+------+--------+------
* NIL | NIL | NIL | NIL | SYNC | IVAO | VATSIM | FILED
*/
class LogbookEntry
{
private:
std::string date;
std::string flightType;
std::string flightNumber;
std::string aircraftType;
std::string aircraftRegistration;
std::string departureAirport;
std::string departureGate;
std::string departureRunway;
std::string arrivalAirport;
std::string arrivalGate;
std::string arrivalRunway;
std::string offBlockTime;
std::string outTime;
std::string onTime;
std::string onBlockTime;
float totalFlightTime;
float taxiOutFuel;
float inFlightFuel;
float taxiInFuel;
float totalFuel;
float taxiOutDistance;
float inFlightDistance;
float taxiInDistance;
float totalDistance;
float maxLandingRate;
std::uint8_t touchdowns;
float maxLandingGees;
std::string recordingFilename;
float points;
std::uint8_t flags;
public:
inline LogbookEntry(std::string date,
std::string flightType,
std::string flightNumber,
std::string aircraftType,
std::string aircraftRegistration,
std::string departureAirport,
std::string departureGate,
std::string departureRunway,
std::string arrivalAirport,
std::string arrivalGate,
std::string arrivalRunway,
std::string offBlockTime,
std::string outTime,
std::string onTime,
std::string onBlockTime,
float totalFlightTime,
float taxiOutFuel,
float inFlightFuel,
float taxiInFuel,
float totalFuel,
float taxiOutDistance,
float inFlightDistance,
float taxiInDistance,
float totalDistance,
float maxLandingRate,
std::uint8_t touchdowns,
float maxLandingGees,
std::string recordingFilename,
float points,
std::uint8_t flags)
: date(date), flightType(flightType), flightNumber(flightNumber),
aircraftType(aircraftType),
aircraftRegistration(aircraftRegistration),
departureAirport(departureAirport), departureGate(departureGate),
departureRunway(departureRunway), arrivalAirport(arrivalAirport),
arrivalGate(arrivalGate), arrivalRunway(arrivalRunway),
offBlockTime(offBlockTime), outTime(outTime), onTime(onTime),
onBlockTime(onBlockTime), totalFlightTime(totalFlightTime),
taxiOutFuel(taxiOutFuel), inFlightFuel(inFlightFuel),
taxiInFuel(taxiInFuel), totalFuel(totalFuel),
taxiOutDistance(taxiOutDistance),
inFlightDistance(inFlightDistance),
taxiInDistance(taxiInDistance), totalDistance(totalDistance),
maxLandingRate(maxLandingRate), touchdowns(touchdowns),
maxLandingGees(maxLandingGees),
recordingFilename(recordingFilename), points(points), flags(flags)
{
}
inline void toFile(std::ofstream &out) const
{
writeString(out, this->date, 10);
writeString(out, this->flightType, 1);
writeString(out, this->flightNumber, 4);
writeString(out, this->aircraftType, 4);
writeString(out, this->aircraftRegistration, 6);
writeString(out, this->departureAirport);
writeString(out, this->departureGate);
writeString(out, this->departureRunway);
writeString(out, this->arrivalAirport);
writeString(out, this->arrivalGate);
writeString(out, this->arrivalRunway);
writeString(out, this->offBlockTime, 5);
writeString(out, this->outTime, 5);
writeString(out, this->onTime, 5);
writeString(out, this->onBlockTime, 5);
write<decltype(this->totalFlightTime)>(out, this->totalFlightTime);
write<decltype(this->taxiOutFuel)>(out, this->taxiOutFuel);
write<decltype(this->inFlightFuel)>(out, this->inFlightFuel);
write<decltype(this->taxiInFuel)>(out, this->taxiInFuel);
write<decltype(this->totalFuel)>(out, this->totalFuel);
write<decltype(this->taxiOutDistance)>(out, this->taxiOutDistance);
write<decltype(this->inFlightDistance)>(out, this->inFlightDistance);
write<decltype(this->taxiInDistance)>(out, this->taxiInDistance);
write<decltype(this->totalDistance)>(out, this->totalDistance);
write<decltype(this->maxLandingRate)>(out, this->maxLandingRate);
write<decltype(this->touchdowns)>(out, this->touchdowns);
write<decltype(this->maxLandingGees)>(out, this->maxLandingGees);
writeString(out, this->recordingFilename);
write<decltype(this->points)>(out, this->points);
write<decltype(this->flags)>(out, this->flags);
}
};
} // namespace logbook
} // namespace file
} // namespace germanairlinesva
#endif
+56
View File
@@ -0,0 +1,56 @@
#ifndef GERMANAIRLINESVA_FILE_RECORDING_RECORDING_H
#define GERMANAIRLINESVA_FILE_RECORDING_RECORDING_H
#include <cstdint>
#include <fstream>
#include <vector>
#include "constants.h"
#include "recordingEntry.hpp"
namespace germanairlinesva
{
namespace file
{
namespace recording
{
/*
* Path Recording (6 + n * 24)
* HEADER | SEGMENTS
* Header (6)
* CHAR[5] | UINT8
* --------+--------
* VGAR | VERSION
* Path Segments (n)
* PATHSEGMENT[]
*/
class Recording
{
private:
std::vector<RecordingEntry> entries;
public:
template <class... Args> inline void addEntry(Args &&...args)
{
this->entries.emplace_back(std::forward<Args>(args)...);
}
inline void toFile(std::string fileName) const
{
std::ofstream out(BASE_DIRECTORY RECORDING_DIRECTORY + fileName,
std::fstream::binary);
out.write(RECORDING_HEADER, 4);
out.write("\1", 1);
for (const RecordingEntry &entry : this->entries) {
entry.toFile(out);
}
out.close();
}
};
} // namespace recording
} // namespace file
} // namespace germanairlinesva
#endif
+68
View File
@@ -0,0 +1,68 @@
#ifndef GERMANAIRLINESVA_FILE_RECORDING_RECORDINGENTRY_H
#define GERMANAIRLINESVA_FILE_RECORDING_RECORDINGENTRY_H
#include <cstdint>
#include <fstream>
#include <vector>
#include "geodata.hpp"
#include "helpers.hpp"
namespace germanairlinesva
{
namespace file
{
namespace recording
{
/*
* Path Segment (24)
* UINT32 | UINT16 | UINT16 | POINT
* -------+----------+-------------+------------
* TIME | ALTITUDE | GROUNDSPEED | COORDINATES
*/
class RecordingEntry
{
private:
std::uint32_t time;
std::uint16_t altitude = 0;
std::uint16_t groundSpeed = 0;
struct utilities::geodata::point coordinates = {NAN, NAN};
public:
inline RecordingEntry() = default;
inline RecordingEntry(std::uint32_t time,
std::uint16_t altitude,
std::uint16_t groundSpeed,
struct utilities::geodata::point coordinates)
: time(time), altitude(altitude), groundSpeed(groundSpeed),
coordinates(coordinates)
{
}
inline void toFile(std::ofstream &out) const
{
write<decltype(this->time)>(out, this->time);
write<decltype(this->altitude)>(out, this->altitude);
write<decltype(this->groundSpeed)>(out, this->groundSpeed);
write<decltype(this->coordinates)>(out, this->coordinates);
}
friend inline bool operator==(const RecordingEntry &lhs,
const RecordingEntry &rhs)
{
return lhs.altitude == rhs.altitude &&
lhs.groundSpeed == rhs.groundSpeed &&
lhs.coordinates.latitude == rhs.coordinates.latitude &&
lhs.coordinates.longitude == rhs.coordinates.longitude;
}
friend inline bool operator!=(const RecordingEntry &lhs,
const RecordingEntry &rhs)
{
return !(lhs == rhs);
}
};
} // namespace recording
} // namespace file
} // namespace germanairlinesva
#endif
+83
View File
@@ -0,0 +1,83 @@
#ifndef GERMANAIRLINESVA_FILE_SIMDATA_GATE_H
#define GERMANAIRLINESVA_FILE_SIMDATA_GATE_H
#include <cstdint>
#include <fstream>
#include <iostream>
#include <sstream>
#include <streambuf>
#include <string>
#include <utility>
#include <vector>
#include "geodata.hpp"
#include "helpers.hpp"
namespace germanairlinesva
{
namespace file
{
namespace simdata
{
/*
* Representation of gate
* Center in lat/lon degrees
* Radius in metres
*
* UINT8 | CHAR[] | POINT | UINT8
* -------+------------+--------+-------
* STRLEN | DESIGNATOR | CENTER | RADIUS
*/
class Gate
{
private:
std::string designator;
struct utilities::geodata::point center;
std::uint8_t radius;
public:
// From X-Plane or MakeRwys
inline Gate(std::string designator,
double latitude,
double longitude,
std::uint8_t radius)
: designator(designator), center({latitude, longitude}),
radius(radius){};
// From Database
inline Gate(std::string designator,
struct utilities::geodata::point center,
std::uint8_t radius)
: designator(designator), center(center), radius(radius){};
inline void toFile(std::ofstream &out) const
{
writeString(out, this->designator);
write<decltype(this->center)>(out, this->center);
write<decltype(this->radius)>(out, this->radius);
}
inline bool contains(utilities::geodata::point coordinates) const
{
return utilities::geodata::distanceEarthP(this->center, coordinates);
}
inline const std::string to_string() const
{
std::ostringstream str;
str << "Gate " << this->designator << " at " << this->center.latitude
<< "N " << this->center.longitude << "E, Radius "
<< (int)this->radius << "m";
return str.str();
}
friend inline std::ostream &operator<<(std::ostream &os,
const Gate &gate)
{
return os << gate.to_string();
}
};
} // namespace simdata
} // namespace file
} // namespace germanairlinesva
#endif
+163
View File
@@ -0,0 +1,163 @@
#ifndef GERMANAIRLINESVA_FILE_SIMDATA_RUNWAY_H
#define GERMANAIRLINESVA_FILE_SIMDATA_RUNWAY_H
#include <fstream>
#include <iomanip>
#include <iostream>
#include <regex>
#include <sstream>
#include <string>
#include <utility>
#include <vector>
#include "geodata.hpp"
#include "helpers.hpp"
#include "util.hpp"
namespace germanairlinesva
{
namespace file
{
namespace simdata
{
/*
* Representation of one runway with supplementary information
* Heading in degrees true
* Threshold center in lat/lon degrees
* Width and length in metres
*
* UINT8 | CHAR[] | BOX | UINT8 | UINT16 | DOUBLE
* -------+------------+--------+-------+--------+-------
* STRLEN | DESIGNATOR | BOUNDS | WIDTH | LENGTH | TRUHDG
*/
class Runway
{
private:
std::string designator;
struct utilities::geodata::box bounds;
std::uint8_t width;
std::uint16_t length;
double trueHeading;
public:
// From X-Plane
inline Runway(std::string designator,
double latitudeStart,
double longitudeStart,
double latitudeEnd,
double longitudeEnd,
double width)
: designator(designator), width(width)
{
this->length = utilities::geodata::distanceEarthD(latitudeStart,
longitudeStart,
latitudeEnd,
longitudeEnd);
this->trueHeading = utilities::geodata::bearingDD(latitudeStart,
longitudeStart,
latitudeEnd,
longitudeEnd);
this->bounds = utilities::geodata::calculateBoxDD(
{latitudeStart, longitudeStart},
{latitudeEnd, longitudeEnd},
this->trueHeading,
this->width);
};
// From MakeRwys
inline Runway(std::string designator,
struct utilities::geodata::point start,
double width,
double length,
double trueHeading)
: designator(designator), width(width), length(length),
trueHeading(trueHeading)
{
utilities::geodata::point end =
utilities::geodata::calculatePointDD(start, trueHeading, length);
this->bounds = utilities::geodata::calculateBoxDD(start,
end,
trueHeading,
width);
};
// From database
inline Runway(std::string designator,
struct utilities::geodata::box bounds,
std::uint8_t width,
std::uint16_t length,
double trueHeading)
: designator(designator), bounds(bounds), width(width),
length(length), trueHeading(trueHeading){};
inline bool containsPoint(const utilities::geodata::point point) const
{
size_t j = 3;
bool c = false;
std::vector<utilities::geodata::point> poly{this->bounds.topLeft,
this->bounds.topRight,
this->bounds.bottomRight,
this->bounds.bottomLeft};
for (size_t i = 0; i < poly.size(); i++) {
if ((point.latitude == poly[i].latitude) &&
(point.longitude == poly[i].longitude)) {
// point is a corner
return true;
}
if (((poly[i].longitude > point.longitude) !=
(poly[j].longitude > point.longitude))) {
double slope = (point.latitude - poly[i].latitude) *
(poly[j].longitude - poly[i].longitude) -
(poly[j].latitude - poly[i].latitude) *
(point.longitude - poly[i].longitude);
if (slope == 0) {
// point is on boundary
return true;
}
if ((slope < 0) != (poly[j].longitude < poly[i].longitude)) {
c = !c;
}
}
j = i;
}
return c;
}
inline void toFile(std::ofstream &out) const
{
writeString(out, this->designator);
write<decltype(this->bounds)>(out, this->bounds);
write<decltype(this->width)>(out, this->width);
write<decltype(this->length)>(out, this->length);
write<decltype(this->trueHeading)>(out, this->trueHeading);
}
inline const std::string to_string() const
{
std::ostringstream str;
str << "Runway " << this->designator << " with bounds "
<< this->bounds.topLeft.latitude << "N "
<< this->bounds.topLeft.longitude << "E, "
<< this->bounds.topRight.latitude << "N "
<< this->bounds.topRight.longitude << "E, "
<< this->bounds.bottomRight.latitude << "N "
<< this->bounds.bottomRight.longitude << "E, "
<< this->bounds.bottomLeft.latitude << "N "
<< this->bounds.bottomLeft.longitude << "E, "
<< "Width " << (int)this->width << "m, Length " << this->length
<< "m, True Heading " << this->trueHeading << "°";
return str.str();
}
friend inline std::ostream &operator<<(std::ostream &os,
const Runway &runway)
{
return os << runway.to_string();
}
};
} // namespace simdata
} // namespace file
} // namespace germanairlinesva
#endif
+236
View File
@@ -0,0 +1,236 @@
#ifndef GERMANAIRLINESVA_FILE_SIMDATA_SIMDATABASE_H
#define GERMANAIRLINESVA_FILE_SIMDATA_SIMDATABASE_H
#include <cstdint>
#include <cstring>
#include <fstream>
#include <functional>
#include <iostream>
#include <map>
#include <stdexcept>
#include <string>
#include <utility>
#include <vector>
#include "config/config.hpp"
#include "constants.h"
#include "simdata/gate.hpp"
#include "simdata/runway.hpp"
#ifdef XP
#include "simdata/simdataXP.hpp"
#endif
#if not defined(XP) && not defined(MSFS)
#include "simdata/simdataESP.hpp"
#endif
/*
* Header
*
* CHAR[5] | UINT8
* --------+--------
* VGAS | VERSION
*/
/*
* Airport
*
* UINT8 | CHAR[] | UINT16 | GATE[] | UINT8 | RUNWAY[]
* --------+--------+----------+--------+---------+---------
* STRLEN | ICAO | NUMGATES | GATES | NUMRWYS | RUNWAYS
*/
namespace germanairlinesva
{
namespace file
{
namespace simdata
{
class SimDatabase
{
private:
std::map<std::string, std::pair<std::vector<Gate>, std::vector<Runway>>>
airports;
inline void readVersion1(std::ifstream &in)
{
std::uint16_t numAirports = read<std::uint16_t>(in);
for (int i = 0; i < numAirports; i++) {
// ICAO
std::string icao = readString(in);
// Gates
std::uint16_t numGates = read<std::uint16_t>(in);
for (int j = 0; j < numGates; j++) {
std::string designator = readString(in);
struct utilities::geodata::point center =
read<struct utilities::geodata::point>(in);
std::uint8_t radius = read<std::uint8_t>(in);
this->airports[icao].first.emplace_back(designator,
center,
radius);
}
// Runways
std::uint8_t numRunways = read<std::uint8_t>(in);
for (int j = 0; j < numRunways; j++) {
std::string designator = readString(in);
// Center
struct utilities::geodata::box bounds =
read<struct utilities::geodata::box>(in);
std::uint8_t width = read<std::uint8_t>(in);
std::uint16_t length = read<std::uint16_t>(in);
double trueHeading = read<double>(in);
this->airports[icao].second.emplace_back(designator,
bounds,
width,
length,
trueHeading);
}
}
in.close();
}
inline void fromFile(const char *file)
{
std::string path(BASE_DIRECTORY);
path.append(file);
std::ifstream in(path, std::ifstream::binary);
std::string ident = readString(in, 4);
if (ident.compare(SIMDATABASE_HEADER) != 0) {
throw std::invalid_argument("Wrong file");
}
std::uint8_t version = read<std::uint8_t>(in);
if (version == 1) {
this->readVersion1(in);
}
}
public:
inline SimDatabase(int simVersion,
const char *hash,
std::shared_ptr<config::Config> &configuration,
std::function<void(const std::string)> toLog)
{
if (strcmp(configuration->getScenery().c_str(), hash) != 0 ||
!utilities::fileExists(BASE_DIRECTORY SIMDATABASE)) {
#ifdef XP
scan(simVersion < 12000 ? XPLANE11_BASE_SCENERY
: XPLANE12_BASE_SCENERY,
XPLANE_CUSTOM_SCENERY,
BASE_DIRECTORY "log.txt",
airports);
#endif
#ifndef MSFS
scan(BASE_DIRECTORY MAKERWYS_R5,
BASE_DIRECTORY MAKERWYS_G5,
BASE_DIRECTORY "db_log.txt",
airports);
#endif
configuration->updateScenery(hash);
#ifdef XP
this->toFile(SIMDATABASE);
#endif
#ifndef MSFS
switch (simVersion) {
case FSX_VERSION:
this->toFile(FSX_PREFIX SIMDATABASE);
break;
case FSXSE_VERSION:
this->toFile(FSXSE_PREFIX SIMDATABASE);
break;
case P3D3_VERSION:
this->toFile(P3D3_PREFIX SIMDATABASE);
break;
case P3D4_VERSION:
this->toFile(P3D4_PREFIX SIMDATABASE);
break;
case P3D5_VERSION:
this->toFile(P3D5_PREFIX SIMDATABASE);
break;
}
#endif
toLog("Sim Database updated");
} else {
#ifdef XP
this->fromFile(SIMDATABASE);
#endif
#ifndef MSFS
switch (simVersion) {
case FSX_VERSION:
this->fromFile(FSX_PREFIX SIMDATABASE);
break;
case FSXSE_VERSION:
this->fromFile(FSXSE_PREFIX SIMDATABASE);
break;
case P3D3_VERSION:
this->fromFile(P3D3_PREFIX SIMDATABASE);
break;
case P3D4_VERSION:
this->fromFile(P3D4_PREFIX SIMDATABASE);
break;
case P3D5_VERSION:
this->fromFile(P3D5_PREFIX SIMDATABASE);
break;
}
#endif
toLog("Sim Database loaded");
}
}
inline void toFile(const char *file) const
{
std::string path(BASE_DIRECTORY);
path.append(file);
std::ofstream out(path, std::fstream::binary);
// File Header
out.write(SIMDATABASE_HEADER, 4);
out.write("\1", 1);
// Num Airports
write<std::uint16_t>(out, airports.size());
// Airport
for (const std::pair<
const std::string,
std::pair<std::vector<Gate>, std::vector<Runway>>> &airport :
airports) {
std::string icao = airport.first;
const std::vector<Gate> gates = airport.second.first;
const std::vector<Runway> runways = airport.second.second;
// ICAO
writeString(out, icao);
// Gates
write<std::uint16_t>(out, gates.size());
for (const Gate &gate : gates) {
gate.toFile(out);
}
// Runways
write<std::uint8_t>(out, runways.size());
for (const Runway &runway : runways) {
runway.toFile(out);
}
}
out.close();
}
inline std::size_t getCount() const { return this->airports.size(); }
inline const std::pair<const std::vector<Gate>,
const std::vector<Runway>>
operator[](std::string key)
{
auto it = this->airports.find(key);
if (it != this->airports.end()) {
return this->airports[key];
} else {
return std::pair<std::vector<Gate>, std::vector<Runway>>();
}
}
};
} // namespace simdata
} // namespace file
} // namespace germanairlinesva
#endif
+142
View File
@@ -0,0 +1,142 @@
#ifndef GERMANAIRLINESVA_FILE_SIMDATA_SIMDATAESP_H
#define GERMANAIRLINESVA_FILE_SIMDATA_SIMDATAESP_H
#include <cstdint>
#include <fstream>
#include <map>
#include <sstream>
#include <string>
#include <vector>
#include "geodata.hpp"
#include "simdata/gate.hpp"
#include "simdata/runway.hpp"
#include "util.hpp"
namespace germanairlinesva
{
namespace file
{
namespace simdata
{
inline int scan(
const std::string runwaysFile,
const std::string gatesFile,
const std::string logFile,
std::map<std::string, std::pair<std::vector<Gate>, std::vector<Runway>>>
&airports)
{
std::ifstream runways(runwaysFile);
if (!runways.good()) {
return 1;
}
std::ifstream gates(gatesFile);
if (!gates.good()) {
runways.close();
return 2;
}
std::ofstream log(logFile, std::fstream::trunc);
if (!log.good()) {
runways.close();
gates.close();
return 3;
}
std::string line;
std::string *currentIcao = nullptr;
std::map<std::string, std::vector<Gate>> tmpAirportGates;
std::map<std::string, std::vector<Runway>> tmpAirportRunways;
std::vector<Gate> tmpGates;
std::vector<Runway> tmpRunways;
int apCount = 0;
int validCount = 0;
log << "<FILE> " << runwaysFile << std::endl;
while (std::getline(runways, line)) {
std::vector<std::string> fields = utilities::split(line, ',');
// New ICAO
if (currentIcao != nullptr && *currentIcao != fields[0]) {
tmpAirportRunways[*currentIcao] = tmpRunways;
tmpRunways = std::vector<Runway>();
apCount++;
}
currentIcao = new std::string(fields[0]);
int desig = std::stoi(fields[1]);
std::string designator;
switch (desig % 10) {
case 0:
designator = std::to_string(desig / 10);
break;
case 1:
designator = std::to_string(desig / 10) + " L";
break;
case 2:
designator = std::to_string(desig / 10) + " R";
break;
case 3:
designator = std::to_string(desig / 10) + " C";
break;
}
if (desig < 100) {
designator = "0" + designator;
}
struct utilities::geodata::point start = {std::stod(fields[2]),
std::stod(fields[3])};
tmpRunways.emplace_back(
designator,
start,
utilities::geodata::toMetre(std::stod(fields[8])),
utilities::geodata::toMetre(std::stod(fields[6])),
std::stod(fields[5]) + std::stod(fields[9]));
log << "\t<RUNWAY> " << line << std::endl;
}
currentIcao = nullptr;
while (std::getline(gates, line)) {
std::vector<std::string> fields = utilities::split(line, ',');
// New ICAO
if (currentIcao != nullptr && *currentIcao != fields[0]) {
tmpAirportGates[*currentIcao] = tmpGates;
tmpGates = std::vector<Gate>();
}
currentIcao = new std::string(fields[0]);
double width = std::stod(fields[5]);
tmpGates.emplace_back(fields[1] + fields[2],
std::stod(fields[3]),
std::stod(fields[4]),
width > 0 ? width : 20);
log << "\t<GATE> " << line << std::endl;
}
for (const auto &pair : tmpAirportRunways) {
std::string icao = pair.first;
if (!tmpAirportGates[icao].empty() && !pair.second.empty()) {
airports[icao] = {tmpAirportGates[icao], pair.second};
log << "\t<STATUS> " << icao << " committed" << std::endl;
validCount++;
} else {
log << "\t<STATUS> " << icao << " had no gates or runways"
<< std::endl;
}
}
log << "<STATUS> " << apCount << " airports found, of which "
<< validCount << " are valid" << std::endl;
return 0;
}
} // namespace simdata
} // namespace file
} // namespace germanairlinesva
#endif
+208
View File
@@ -0,0 +1,208 @@
#ifndef GERMANAIRLINESVA_FILE_SIMDATA_SIMDATAXP_H
#define GERMANAIRLINESVA_FILE_SIMDATA_SIMDATAXP_H
#include <fstream>
#include <map>
#include <string>
#include "simdata/gate.hpp"
#include "simdata/runway.hpp"
#include "util.hpp"
namespace germanairlinesva
{
namespace file
{
namespace simdata
{
inline void makeGate15(std::vector<Gate> &gates,
const std::vector<std::string> &fields)
{
std::string gateName;
for (size_t j = 4; j < fields.size() - 1; j++) {
gateName += fields[j] + " ";
}
gateName += fields.back();
gateName = std::regex_replace(gateName, std::regex{","}, "0");
gates.emplace_back(gateName,
std::stod(fields[1]),
std::stod(fields[2]),
40);
}
inline void makeRunway(std::vector<Runway> &runways,
const std::vector<std::string> &fields)
{
runways.emplace_back(fields[8],
std::stod(fields[9]),
std::stod(fields[10]),
std::stod(fields[18]),
std::stod(fields[19]),
std::stod(fields[1]));
runways.emplace_back(fields[17],
std::stod(fields[18]),
std::stod(fields[19]),
std::stod(fields[9]),
std::stod(fields[10]),
std::stod(fields[1]));
}
inline void makeGate1300(std::vector<Gate> &gates,
const std::vector<std::string> &fields)
{
std::string gateName;
for (size_t j = 6; j < fields.size() - 1; j++) {
gateName += fields[j] + " ";
}
gateName += fields.back();
gateName = std::regex_replace(gateName, std::regex{","}, "0");
gates.emplace_back(gateName,
std::stod(fields[1]),
std::stod(fields[2]),
20);
}
inline void makeAirport(
const std::string &kind,
std::ifstream &infile,
std::map<std::string, std::pair<std::vector<Gate>, std::vector<Runway>>>
&airports,
std::ofstream &logfile)
{
std::string line;
std::string *currentIcao = nullptr;
std::vector<Gate> tmpGates;
std::vector<Runway> tmpRunways;
int apCount = 0;
int validCount = 0;
while (std::getline(infile, line)) {
std::vector<std::string> fields = utilities::split(line, ' ');
fields =
utilities::select_T<std::string>(fields, [](const std::string &s) {
return s.length() > 0;
});
if (fields.empty())
continue;
if (fields[0] == "1") {
// Write to file if ICAO is valid, and we have gates and runways
if (currentIcao != nullptr && !tmpRunways.empty() &&
!tmpGates.empty()) {
airports[*currentIcao] = {tmpGates, tmpRunways};
validCount += 1;
logfile << "\t<STATUS> " << *currentIcao << " committed"
<< std::endl;
} else if (currentIcao != nullptr) {
logfile << "\t<STATUS> " << *currentIcao
<< " had no gates or runways" << std::endl;
}
tmpGates = std::vector<Gate>();
tmpRunways = std::vector<Runway>();
currentIcao = new std::string(fields[4]);
apCount += 1;
logfile << "\t<" << kind << "> " << line << std::endl;
} else if (currentIcao != nullptr && fields[0] == "15") {
makeGate15(tmpGates, fields);
logfile << "\t\t<GATE OLD> " << line << std::endl;
} else if (fields[0] == "16" || fields[0] == "17") {
// Write to file if ICAO is valid, and we have gates and runways
if (currentIcao != nullptr && !tmpRunways.empty() &&
!tmpGates.empty()) {
airports[*currentIcao] = {tmpGates, tmpRunways};
validCount += 1;
logfile << "\t<STATUS> " << *currentIcao << " committed"
<< std::endl;
} else if (currentIcao != nullptr) {
logfile << "\t<STATUS> " << *currentIcao
<< " had no gates or runways" << std::endl;
}
tmpGates = std::vector<Gate>();
tmpRunways = std::vector<Runway>();
currentIcao = nullptr;
logfile << "\t<" << kind << " SKIPPED> " << line << std::endl;
} else if (currentIcao != nullptr && fields[0] == "100") {
makeRunway(tmpRunways, fields);
logfile << "\t\t<RUNWAY> " << line << std::endl;
} else if (currentIcao != nullptr && fields[0] == "1300") {
makeGate1300(tmpGates, fields);
logfile << "\t\t<GATE> " << line << std::endl;
}
}
if (currentIcao != nullptr && !tmpRunways.empty() && !tmpGates.empty()) {
airports[*currentIcao] = {tmpGates, tmpRunways};
validCount += 1;
logfile << "\t<STATUS> " << *currentIcao << " committed" << std::endl;
}
logfile << "<STATUS> " << apCount << " airports found, of which "
<< validCount << " are valid" << std::endl;
}
inline int scan(
const std::string defaultFile,
const std::string sceneryPack,
const std::string logFile,
std::map<std::string, std::pair<std::vector<Gate>, std::vector<Runway>>>
&airports)
{
std::ifstream base(defaultFile);
if (!base.good()) {
return 1;
}
std::ifstream custom(sceneryPack);
if (!custom.good()) {
base.close();
return 2;
}
std::ofstream logfile(logFile, std::fstream::trunc);
if (!logfile.good()) {
base.close();
custom.close();
return 3;
}
// Default
logfile << "<FILE> " << defaultFile << std::endl;
makeAirport("DEFAULT", base, airports, logfile);
base.close();
std::string line;
size_t pos;
std::vector<std::string> packs;
while (std::getline(custom, line)) {
if ((pos = line.find("SCENERY_PACK")) != std::string::npos) {
std::string path = utilities::rtrim_copy(line.substr(pos + 13)) +
"Earth nav data/apt.dat";
packs.emplace_back(path);
}
}
std::reverse(packs.begin(), packs.end());
for (std::string const &path : packs) {
std::ifstream pack(path);
if (pack.good()) {
logfile << "<FILE> " << path << std::endl;
makeAirport("CUSTOM", pack, airports, logfile);
pack.close();
} else {
pack.close();
logfile << "<STATUS>"
<< "Could not find " << path << std::endl;
}
}
logfile << std::endl
<< "<STATUS> Total airports: " << airports.size() << std::endl;
custom.close();
logfile.close();
return 0;
}
} // namespace simdata
} // namespace file
} // namespace germanairlinesva
#endif
+21
View File
@@ -0,0 +1,21 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [{
"name": "Launch currently open script",
"type": "php",
"request": "launch",
"program": "${file}",
"cwd": "${fileDirname}",
"port": 0,
"runtimeArgs": [
"-dxdebug.start_with_request=yes"
],
"env": {
"XDEBUG_MODE": "debug,develop",
"XDEBUG_CONFIG": "client_port=${port}"
}
}]
}
+209
View File
@@ -0,0 +1,209 @@
<?php
namespace germanairlinesva\file\logbook;
require_once "Recording.php";
class Logbook
{
private const file_name = "/logbook.bin";
private const recordings_directory = "/recordings/";
private const ident = "VGAL";
private const header_unpack = "a4ident/Cversion";
private const variable_string_size_unpack = "Clength";
private const flight_start_unpack = "a10date/a1flightType/a4flightNumber/a4aircraftType/a6aircraftRegistration";
private const flight_middle_unpack = "a5offBlockTime/a5outTime/a5inTime/a5onBlockTime/gtotalFlightTime/" .
"gtaxiOutFuel/ginFlightFuel/gtaxiInFuel/gtotalFuel/gtaxiOutDistance/ginFlightDistance/gtaxiInDistance/" .
"gtotalDistance/gmaxLandingRate/Ctouchdowns/gmaxLandingGees";
private const flight_end_unpack = "gpoints/Cflags";
private string $directory_name = "";
private array $flights = [];
private int $total_flights = 0;
private float $total_points = 0;
private float $total_distance = 0;
private float $total_fuel = 0;
private array $landing_rates = [];
public function __construct(string $directory)
{
$this->directory_name = $directory;
$this->read();
}
/**
* Generates a json string representation
*
* @return string Json string representation
*/
public function to_json(): string
{
$retVal = [
"flights" => $this->flights,
"aggregates" => $this->get_aggregates(),
];
return json_encode($retVal);
}
/**
* Generates a json string representation of one flight
*
* @return string Json string representation of one flight
*/
public function get_flight_json($id): string
{
return json_encode($this->get_flight($id));
}
private function get_aggregates(): array
{
$retVal = [
"totalFlights" => $this->total_flights,
"totalPoints" => number_format(doubleval($this->total_points), 2, '.', ','),
"totalDistance" => number_format(doubleval($this->total_distance), 0, '.', ','),
"totalFuel" => number_format(doubleval($this->total_fuel), 1, '.', ','),
];
if (count($this->landing_rates) > 0) {
$rate = 0;
$lastIndex = count($this->landing_rates) - 1;
if ($lastIndex % 2 == 0) {
// Two elements
$lowerIndex = floor($lastIndex / 2);
$upperIndex = ceil($lastIndex / 2);
$lowerRate = $this->landing_rates[$lowerIndex];
$upperRate = $this->landing_rates[$upperIndex];
$rate = ($lowerRate + $upperRate) / 2;
} else {
// One Element
$lowerIndex = floor($lastIndex / 2);
$lowerRate = $this->landing_rates[$lowerIndex];
$rate = $lowerRate;
}
$retVal["landingRate"] = number_format(doubleval($rate), 0, '.', ',');
} else {
$retVal["landingRate"] = "N/A";
}
return $retVal;
}
/**
* Get a specific flight
*
* @return array The flight
*/
private function get_flight(int $id): array
{
$flight = $this->flights[$id];
try {
$rec = new \germanairlinesva\file\recording\Recording($this->directory_name .
Logbook::recordings_directory . $flight["recordingFilename"] . ".rec");
$flight["recording"] = $rec->to_json();
} catch (\InvalidArgumentException) {
}
return $flight;
}
/**
* Reads logbook
*/
private function read()
{
$file = fopen($this->directory_name . Logbook::file_name, "rb");
flock($file, LOCK_SH);
$version = $this->read_header($file);
if ($version == 1) {
while ($this->read_flight_1($file) != false);
}
rsort($this->landing_rates);
flock($file, LOCK_UN);
fclose($file);
}
/**
* Reads one flight entry
*
* @param resource $file File handle
*
* @return true If not EOF
* @return false If EOF
*
* @throws InvalidArgumentException If file is not a resource
*/
private function read_flight_1($file): bool
{
if (false === is_resource($file)) {
throw new \InvalidArgumentException(sprintf('Argument must be a valid resource type. %s given.', gettype($file)));
}
$retVal = [];
$data = fread($file, 25);
if ($data) {
$retVal = array_merge($retVal, unpack(Logbook::flight_start_unpack, $data));
$size = unpack(Logbook::variable_string_size_unpack, fread($file, 1))["length"];
$retVal["departureAirport"] = fread($file, $size);
$size = unpack(Logbook::variable_string_size_unpack, fread($file, 1))["length"];
$retVal["departureGate"] = fread($file, $size);
$size = unpack(Logbook::variable_string_size_unpack, fread($file, 1))["length"];
$retVal["departureRunway"] = fread($file, $size);
$size = unpack(Logbook::variable_string_size_unpack, fread($file, 1))["length"];
$retVal["arrivalAirport"] = fread($file, $size);
$size = unpack(Logbook::variable_string_size_unpack, fread($file, 1))["length"];
$retVal["arrivalGate"] = fread($file, $size);
$size = unpack(Logbook::variable_string_size_unpack, fread($file, 1))["length"];
$retVal["arrivalRunway"] = fread($file, $size);
$retVal = array_merge($retVal, unpack(Logbook::flight_middle_unpack, fread($file, 65)));
$size = unpack(Logbook::variable_string_size_unpack, fread($file, 1))["length"];
$retVal["recordingFilename"] = fread($file, $size);
$retVal = array_merge($retVal, unpack(Logbook::flight_end_unpack, fread($file, 5)));
array_push($this->flights, $retVal);
$this->total_flights++;
$this->total_points += $retVal["points"];
$this->total_distance += $retVal["totalDistance"];
$this->total_fuel += $retVal["totalFuel"];
array_push($this->landing_rates, $retVal["maxLandingRate"]);
return true;
}
return false;
}
/**
* Reads the file header
*
* @param resource $file File handle
*
* @return string File version
*
* @throws InvalidArgumentException If file is not a resource
* @throws UnexpectedValueException If ident mismatches
*/
private function read_header($file): string
{
if (false === is_resource($file)) {
throw new \InvalidArgumentException(sprintf('Argument must be a valid resource type. %s given.', gettype($file)));
}
$header = unpack(Logbook::header_unpack, fread($file, 5));
if ($header["ident"] !== Logbook::ident) {
throw
new \UnexpectedValueException(sprintf("Ident mismatch. Got %s, expected %s", $header["ident"], Logbook::ident));
}
return $header["version"];
}
}
+142
View File
@@ -0,0 +1,142 @@
<?php
namespace germanairlinesva\file\recording;
class Recording
{
private const ident = "VGAR";
private const header_unpack = "a4ident/Cversion";
private const segment_unpack = "Vtime/Saltitude/Sgroundspeed/elatitude/elongitude";
private string $file_path = "";
private array $segments = [];
public function __construct(string $path)
{
$this->file_path = $path;
$this->read();
}
/**
* Generates a json representation
*
* @return array Json representation with path as geoJSON and profile as array
*/
public function to_json(): array
{
$path = [
"type" => "FeatureCollection",
"features" => [
0 => [
"type" => "Feature",
"properties" => [
"stroke" => "#ff0000",
"stroke-width" => 2,
"stroke-opacity" => 1
],
"geometry" => [
"type" => "LineString",
"coordinates" => []
]
]
]
];
$path["features"][0]["geometry"]["coordinates"] = array_map(function ($segment) {
return array($segment["longitude"], $segment["latitude"]);
}, $this->segments);
$profile = array_map(function ($segment) {
return array("altitude" => $segment["altitude"], "groundspeed" => $segment["groundspeed"]);
}, $this->segments);
return ["path" => $path, "profile" => $profile];
}
/**
* Generates a json string representation
*
* @return string Json string representation with path as geoJSON and profile as array
*/
public function to_json_string(): string
{
return json_encode($this->to_json());
}
/**
* Reads recording
*/
private function read()
{
if (!file_exists($this->file_path)) {
throw new \InvalidArgumentException("File not found");
}
$file = fopen($this->file_path, "rb");
if ($file) {
flock($file, LOCK_SH);
$version = $this->read_header($file);
if ($version == 1) {
while ($this->read_segment_1($file) != false);
}
flock($file, LOCK_UN);
fclose($file);
} else {
throw new \Exception("fopen Error");
}
}
/**
* Reads one segment entry
*
* @param resource $file File handle
*
* @return true If not EOF
* @return false If EOF
*
* @throws InvalidArgumentException If file is not a resource
*/
private function read_segment_1($file): bool
{
if (false === is_resource($file)) {
throw new \InvalidArgumentException(sprintf('Argument must be a valid resource type. %s given.', gettype($file)));
}
$data = fread($file, 24);
if ($data) {
array_push($this->segments, unpack(Recording::segment_unpack, $data));
return true;
}
return false;
}
/**
* Reads the file header
*
* @param resource $file File handle
*
* @return string File version
*
* @throws InvalidArgumentException If file is not a resource
* @throws UnexpectedValueException If ident mismatches
*/
private function read_header($file): string
{
if (false === is_resource($file)) {
throw new \InvalidArgumentException(sprintf('Argument must be a valid resource type. %s given.', gettype($file)));
}
$header = unpack(Recording::header_unpack, fread($file, 5));
if ($header["ident"] !== Recording::ident) {
throw
new \UnexpectedValueException(sprintf("Ident mismatch. Got %s, expected %s", $header["ident"], Recording::ident));
}
return $header["version"];
}
}
+11
View File
@@ -0,0 +1,11 @@
<?php
require "Logbook.php";
$r = new \germanairlinesva\file\logbook\Logbook("/mnt/f/X-Plane 11/Resources/plugins/GAConnector/");
echo "Object\n";
print_r($r);
echo "\nJSON\n";
print_r($r->to_json());
echo "\n\nJSON Fliht 0\n";
print_r($r->get_flight_json(0));
+7
View File
@@ -0,0 +1,7 @@
<?php
require "Recording.php";
$r = new \germanairlinesva\file\recording\Recording("/mnt/f/X-Plane 11/Resources/plugins/GAConnector/recordings/flight.rec");
print_r($r);
print_r($r->to_json_string());
Executable
+9
View File
@@ -0,0 +1,9 @@
#!/bin/bash
shopt -s globstar
GLOBIGNORE='**/XPLM/**:XPLM/**:**/XPLM:**/ixwebsocket/**:ixwebsocket/**:**/ixwebsocket:**/nlohmann/**:nlohmann/**:**/nlohmann:**/XPSDK/**:XPSDK/**:**/XPSDK:**/build*/**:build*/**:**/build*:**/openSSL/**:openSSL/**:**/openSSL:**/SimConnect/**:SimConnect/**:**/SimConnect'
clang-format -verbose -i **/*.cpp
clang-format -verbose -i **/*.h
clang-format -verbose -i **/*.hpp
Loaded 100 of 424 files, more files were not shown because too many files have changed in this diff. Show more