Compare commits

..
Author SHA1 Message Date
ThorstenB cfda390557 #658: avoid crash when Textures.high is missing
Don't resolve the empty file name, which would result in the fgdata
directory path (instead of a path to a file). Eventually this resulted in
a segfault, partly due to a bug in "osgDB::readImageFile", which reports
"success" when given a directory (instead of a file) path, though it
doesn't return a valid image object.
2012-02-11 09:54:53 +01:00
Olaf Flebbe c41d504a29 disable annoying clang warning 2012-02-10 22:37:45 +01:00
ThorstenB 93c115fc5c Olaf Flebbe: Avoid infinite recursion in simgear::Dir::create
when using it with a relative path.
2012-02-10 22:36:24 +01:00
ThorstenB b753646aaf Move JPEG dependency
Alas, JPEG_FACTORY is in SimGearScene, not SimGearCore...
2012-01-29 14:40:26 +01:00
ThorstenB dd07ab0436 Correct dependency of shared simgear libraries with enabled JPEG_FACTORY. 2012-01-29 14:29:35 +01:00
Mathias Froehlich 73f9cd05cd Lower the compressed texture message for the release branch. 2012-01-19 07:38:33 +01:00
Mathias Froehlich 0e4428fe79 Improve the compressed texture message. 2012-01-19 07:36:33 +01:00
281 changed files with 10420 additions and 16831 deletions
+3 -1
View File
@@ -1,4 +1,6 @@
Makefile Makefile
INSTALL
SimGear.spec
*.o *.o
lib*.a lib*.a
.*.swp .*.swp
@@ -10,5 +12,5 @@ CPackSourceConfig.cmake
cmake_uninstall.cmake cmake_uninstall.cmake
CTestTestfile.cmake CTestTestfile.cmake
install_manifest.txt install_manifest.txt
build* build
Build Build
+43 -66
View File
@@ -60,12 +60,12 @@ else(${CMAKE_VERSION} VERSION_GREATER 2.8.4)
endif(${CMAKE_VERSION} VERSION_GREATER 2.8.4) endif(${CMAKE_VERSION} VERSION_GREATER 2.8.4)
message(STATUS "Library installation directory: ${CMAKE_INSTALL_LIBDIR}") message(STATUS "Library installation directory: ${CMAKE_INSTALL_LIBDIR}")
option(SIMGEAR_SHARED "Set to ON to build SimGear as a shared library/framework" OFF) option(SIMGEAR_SHARED "Set to ON to build SimGear as a shared library/framework" OFF)
option(SIMGEAR_HEADLESS "Set to ON to build SimGear without GUI/graphics support" OFF) option(SIMGEAR_HEADLESS "Set to ON to build SimGear without GUI/graphics support" OFF)
option(JPEG_FACTORY "Enable JPEG-factory support" OFF) option(JPEG_FACTORY "Enable JPEG-factory support" OFF)
option(ENABLE_LIBSVN "Set to ON to build SimGear with libsvnclient support" ON) option(ENABLE_LIBSVN "Set to ON to build SimGear with libsvnclient support" ON)
option(ENABLE_RTI "Set to ON to build SimGear with RTI support" OFF) option(ENABLE_RTI "Set to ON to build SimGear with RTI support" OFF)
option(ENABLE_TESTS "Set to OFF to disable building SimGear's test applications" ON) option(ENABLE_TESTS "Set to OFF to disable building SimGear's test applications" ON)
if (MSVC) if (MSVC)
GET_FILENAME_COMPONENT(PARENT_DIR ${PROJECT_SOURCE_DIR} PATH) GET_FILENAME_COMPONENT(PARENT_DIR ${PROJECT_SOURCE_DIR} PATH)
@@ -104,16 +104,19 @@ if (MSVC AND MSVC_3RDPARTY_ROOT)
message(STATUS "BOOST_ROOT is ${BOOST_ROOT}") message(STATUS "BOOST_ROOT is ${BOOST_ROOT}")
set (OPENAL_INCLUDE_DIR ${MSVC_3RDPARTY_ROOT}/${MSVC_3RDPARTY_DIR}/include) set (OPENAL_INCLUDE_DIR ${MSVC_3RDPARTY_ROOT}/${MSVC_3RDPARTY_DIR}/include)
set (ALUT_INCLUDE_DIR ${MSVC_3RDPARTY_ROOT}/${MSVC_3RDPARTY_DIR}/include) set (ALUT_INCLUDE_DIR ${MSVC_3RDPARTY_ROOT}/${MSVC_3RDPARTY_DIR}/include)
set (OPENAL_LIBRARY_DIR ${MSVC_3RDPARTY_ROOT}/${MSVC_3RDPARTY_DIR}/lib) set (OPENAL_LIBRARY_DIR ${MSVC_3RDPARTY_ROOT}/${MSVC_3RDPARTY_DIR}/lib)
endif (MSVC AND MSVC_3RDPARTY_ROOT) endif (MSVC AND MSVC_3RDPARTY_ROOT)
find_package(Boost REQUIRED) find_package(Boost REQUIRED)
set (BOOST_CXX_FLAGS "-DBOOST_MULTI_INDEX_DISABLE_SERIALIZATION -DBOOST_BIMAP_DISABLE_SERIALIZATION") set (BOOST_CXX_FLAGS "-DBOOST_MULTI_INDEX_DISABLE_SERIALIZATION -DBOOST_BIMAP_DISABLE_SERIALIZATION")
find_package(ZLIB REQUIRED)
find_package(Threads REQUIRED)
if(SIMGEAR_HEADLESS) if(SIMGEAR_HEADLESS)
message(STATUS "SimGear mode: HEADLESS") message(STATUS "headless mode")
set(NO_OPENSCENEGRAPH_INTERFACE 1)
else() else()
message(STATUS "SimGear mode: NORMAL")
find_package(OpenGL REQUIRED) find_package(OpenGL REQUIRED)
find_package(OpenAL REQUIRED) find_package(OpenAL REQUIRED)
find_package(ALUT REQUIRED) find_package(ALUT REQUIRED)
@@ -121,44 +124,31 @@ else()
endif(SIMGEAR_HEADLESS) endif(SIMGEAR_HEADLESS)
if(JPEG_FACTORY) if(JPEG_FACTORY)
message(STATUS "JPEG-factory: ENABLED") message(STATUS "JPEG-factory enabled")
find_package(JPEG REQUIRED) find_package(JPEG REQUIRED)
include_directories(${JPEG_INCLUDE_DIR}) include_directories(${JPEG_INCLUDE_DIR})
else()
message(STATUS "JPEG-factory: DISABLED")
endif(JPEG_FACTORY) endif(JPEG_FACTORY)
if(ENABLE_LIBSVN) if(ENABLE_LIBSVN)
find_package(SvnClient) find_package(SvnClient)
if(LIBSVN_FOUND) if(LIBSVN_FOUND)
message(STATUS "Subversion client support: ENABLED") message(STATUS "libsvn found, enabling in SimGear")
set(HAVE_SVN_CLIENT_H 1) set(HAVE_SVN_CLIENT_H 1)
set(HAVE_LIBSVN_CLIENT_1 1) set(HAVE_LIBSVN_CLIENT_1 1)
else() else()
# Oops. ENABLE_LIBSVN is ON, but svn is still missing. message(STATUS "Missing libsvn, unable to enable SVN in SimGear")
# Provide clearly visible warning/hint, so builders know what else they should install (or disable). endif(LIBSVN_FOUND)
message(WARNING "Failed to enable subversion client support. Unable to find required subversion client library. Some features may not be available (scenery download).")
message(WARNING "Install 'libsvn' library/DLL (libsvn-devel/libsvnclient/...). Otherwise disable subversion support (set 'ENABLE_LIBSVN' to 'OFF').")
endif(LIBSVN_FOUND)
else()
message(STATUS "Subversion client support: DISABLED")
endif(ENABLE_LIBSVN) endif(ENABLE_LIBSVN)
find_package(ZLIB REQUIRED)
find_package(Threads REQUIRED)
check_include_file(sys/time.h HAVE_SYS_TIME_H) check_include_file(sys/time.h HAVE_SYS_TIME_H)
check_include_file(sys/timeb.h HAVE_SYS_TIMEB_H) check_include_file(sys/timeb.h HAVE_SYS_TIMEB_H)
check_include_file(unistd.h HAVE_UNISTD_H) check_include_file(unistd.h HAVE_UNISTD_H)
check_include_file(windows.h HAVE_WINDOWS_H) check_include_file(windows.h HAVE_WINDOWS_H)
if(ENABLE_RTI) if(ENABLE_RTI)
# See if we have any rti library variant installed # See if we have any rti library variant installed
message(STATUS "RTI: ENABLED")
find_package(RTI) find_package(RTI)
else()
message(STATUS "RTI: DISABLED")
endif(ENABLE_RTI) endif(ENABLE_RTI)
check_function_exists(gettimeofday HAVE_GETTIMEOFDAY) check_function_exists(gettimeofday HAVE_GETTIMEOFDAY)
@@ -166,8 +156,6 @@ check_function_exists(ftime HAVE_FTIME)
check_function_exists(timegm HAVE_TIMEGM) check_function_exists(timegm HAVE_TIMEGM)
check_function_exists(rint HAVE_RINT) check_function_exists(rint HAVE_RINT)
check_function_exists(mkdtemp HAVE_MKDTEMP) check_function_exists(mkdtemp HAVE_MKDTEMP)
check_function_exists(bcopy HAVE_BCOPY)
check_function_exists(mmap HAVE_MMAP)
if(HAVE_UNISTD_H) if(HAVE_UNISTD_H)
set(CMAKE_REQUIRED_INCLUDES ${CMAKE_INCLUDE_PATH}) set(CMAKE_REQUIRED_INCLUDES ${CMAKE_INCLUDE_PATH})
@@ -179,15 +167,18 @@ if(HAVE_UNISTD_H)
int main() { return 0; } int main() { return 0; }
" "
HAVE_CLOCK_GETTIME) HAVE_CLOCK_GETTIME)
endif(HAVE_UNISTD_H) endif(HAVE_UNISTD_H)
set(RT_LIBRARY "") set(RT_LIBRARY "")
if(HAVE_CLOCK_GETTIME) if(HAVE_CLOCK_GETTIME)
check_library_exists(rt clock_gettime "" HAVE_RT) check_function_exists(clock_gettime CLOCK_GETTIME_IN_LIBC)
if(HAVE_RT) if(NOT CLOCK_GETTIME_IN_LIBC)
set(RT_LIBRARY rt) check_library_exists(rt clock_gettime "" HAVE_RT)
endif(HAVE_RT) if(HAVE_RT)
set(RT_LIBRARY rt)
endif(HAVE_RT)
endif(NOT CLOCK_GETTIME_IN_LIBC)
endif(HAVE_CLOCK_GETTIME) endif(HAVE_CLOCK_GETTIME)
SET(CMAKE_DEBUG_POSTFIX "d" CACHE STRING "add a postfix, usually 'd' on windows") SET(CMAKE_DEBUG_POSTFIX "d" CACHE STRING "add a postfix, usually 'd' on windows")
@@ -202,9 +193,8 @@ check_cxx_source_compiles(
HAVE_ISNAN) HAVE_ISNAN)
if(CMAKE_COMPILER_IS_GNUCXX) if(CMAKE_COMPILER_IS_GNUCXX)
set(WARNING_FLAGS_CXX "-Wall") set(WARNING_FLAGS -Wall)
set(WARNING_FLAGS_C "-Wall")
# certain GCC versions don't provide the atomic builds, and hence # certain GCC versions don't provide the atomic builds, and hence
# require is to provide them in SGAtomic.cxx # require is to provide them in SGAtomic.cxx
set(CMAKE_REQUIRED_INCLUDES ${CMAKE_INCLUDE_PATH}) set(CMAKE_REQUIRED_INCLUDES ${CMAKE_INCLUDE_PATH})
@@ -213,17 +203,8 @@ if(CMAKE_COMPILER_IS_GNUCXX)
GCC_ATOMIC_BUILTINS_FOUND) GCC_ATOMIC_BUILTINS_FOUND)
endif(CMAKE_COMPILER_IS_GNUCXX) endif(CMAKE_COMPILER_IS_GNUCXX)
if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
set(WARNING_FLAGS_CXX "-Wall -Wno-overloaded-virtual")
set(WARNING_FLAGS_C "-Wall")
endif()
if(WIN32) if(WIN32)
if(MINGW)
add_definitions(-D_WIN32_WINNT=0x501)
endif()
if(MSVC) if(MSVC)
# turn off various warnings # turn off various warnings
# foreach(warning 4244 4251 4267 4275 4290 4786 4305 4996) # foreach(warning 4244 4251 4267 4275 4290 4786 4305 4996)
@@ -238,21 +219,24 @@ if(WIN32)
set( WINSOCK_LIBRARY "ws2_32.lib" ) set( WINSOCK_LIBRARY "ws2_32.lib" )
set( RT_LIBRARY "winmm" ) set( RT_LIBRARY "winmm" )
endif(WIN32) endif(WIN32)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${WARNING_FLAGS_C} ${MSVC_FLAGS}") if (${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${WARNING_FLAGS_CXX} ${MSVC_FLAGS} ${BOOST_CXX_FLAGS}") set (WARNING_FLAGS "-Wall -Wno-overloaded-virtual")
endif()
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${WARNING_FLAGS} ${MSVC_FLAGS}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${WARNING_FLAGS} ${MSVC_FLAGS} ${BOOST_CXX_FLAGS}")
include_directories(${PROJECT_SOURCE_DIR}) include_directories(${PROJECT_SOURCE_DIR})
include_directories(${PROJECT_BINARY_DIR}/simgear) include_directories(${PROJECT_BINARY_DIR}/simgear)
include_directories(${PROJECT_BINARY_DIR}/simgear/xml)
include_directories(${OPENSCENEGRAPH_INCLUDE_DIRS} include_directories(${OPENSCENEGRAPH_INCLUDE_DIRS}
${Boost_INCLUDE_DIRS} ${ZLIB_INCLUDE_DIR} ${Boost_INCLUDE_DIRS} ${ZLIB_INCLUDE_DIR}
${ALUT_INCLUDE_DIR} ${OPENAL_INCLUDE_DIR} ) ${ALUT_INCLUDE_DIR} ${OPENAL_INCLUDE_DIR} )
add_definitions(-DHAVE_CONFIG_H) add_definitions(-DHAVE_CONFIG_H)
add_definitions(-DHAVE_EXPAT_CONFIG_H)
# configure a header file to pass some of the CMake settings # configure a header file to pass some of the CMake settings
# to the source code # to the source code
@@ -261,19 +245,11 @@ configure_file (
"${PROJECT_BINARY_DIR}/simgear/simgear_config.h" "${PROJECT_BINARY_DIR}/simgear/simgear_config.h"
) )
configure_file (
"${PROJECT_SOURCE_DIR}/simgear/xml/expat_config_cmake.in"
"${PROJECT_BINARY_DIR}/simgear/xml/expat_config.h"
)
if(ENABLE_TESTS) if(ENABLE_TESTS)
# enable CTest / make test target # enable CTest / make test target
message(STATUS "Tests: ENABLED")
include (Dart) include (Dart)
enable_testing() enable_testing()
else()
message(STATUS "Tests: DISABLED")
endif(ENABLE_TESTS) endif(ENABLE_TESTS)
install (FILES ${PROJECT_BINARY_DIR}/simgear/simgear_config.h DESTINATION include/simgear/) install (FILES ${PROJECT_BINARY_DIR}/simgear/simgear_config.h DESTINATION include/simgear/)
@@ -288,3 +264,4 @@ CONFIGURE_FILE(
IMMEDIATE @ONLY) IMMEDIATE @ONLY)
ADD_CUSTOM_TARGET(uninstall ADD_CUSTOM_TARGET(uninstall
"${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake") "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake")
+16 -16
View File
@@ -34,6 +34,18 @@
# OPENAL_LIBRARY to override this selection or set the CMake environment # OPENAL_LIBRARY to override this selection or set the CMake environment
# CMAKE_INCLUDE_PATH to modify the search paths. # CMAKE_INCLUDE_PATH to modify the search paths.
FIND_PATH(ALUT_INCLUDE_DIR alut.h
HINTS
$ENV{ALUTDIR}
PATH_SUFFIXES include/AL include/ALUT include
PATHS
~/Library/Frameworks
/Library/Frameworks
/usr/local
/usr
/opt
)
FIND_LIBRARY(ALUT_LIBRARY FIND_LIBRARY(ALUT_LIBRARY
NAMES ALUT alut NAMES ALUT alut
HINTS HINTS
@@ -47,21 +59,9 @@ FIND_LIBRARY(ALUT_LIBRARY
/opt /opt
) )
FIND_PATH(ALUT_INCLUDE_DIR
NAMES ALUT/alut.h alut.h
HINTS
$ENV{ALUTDIR}
PATH_SUFFIXES include/AL include
PATHS
~/Library/Frameworks
/Library/Frameworks
/usr/local
/usr
/opt
)
include(FindPackageHandleStandardArgs) SET(ALUT_FOUND "NO")
FIND_PACKAGE_HANDLE_STANDARD_ARGS(ALUT DEFAULT_MSG ALUT_LIBRARY ALUT_INCLUDE_DIR) IF(ALUT_LIBRARY AND ALUT_INCLUDE_DIR)
SET(ALUT_FOUND "YES")
MARK_AS_ADVANCED(ALUT_LIBRARY ALUT_INCLUDE_DIR) ENDIF(ALUT_LIBRARY AND ALUT_INCLUDE_DIR)
+4 -9
View File
@@ -16,18 +16,14 @@ macro(find_static_component comp libs)
string(TOUPPER "${comp}" compLibBase) string(TOUPPER "${comp}" compLibBase)
set( compLibName ${compLibBase}_LIBRARY ) set( compLibName ${compLibBase}_LIBRARY )
# NO_DEFAULT_PATH is important on Mac - we need to ensure subversion
# libraires in dist/ or Macports are picked over the Apple version
# in /usr, since that's what we will ship.
FIND_LIBRARY(${compLibName} FIND_LIBRARY(${compLibName}
NO_DEFAULT_PATH
NAMES ${compLib} NAMES ${compLib}
HINTS $ENV{LIBSVN_DIR} ${CMAKE_INSTALL_PREFIX} HINTS $ENV{PLIBDIR}
PATH_SUFFIXES lib64 lib libs64 libs libs/Win32 libs/Win64 PATH_SUFFIXES lib64 lib libs64 libs libs/Win32 libs/Win64
PATHS PATHS
/opt/local
/usr/local /usr/local
/usr /usr
/opt
) )
list(APPEND ${libs} ${${compLibName}}) list(APPEND ${libs} ${${compLibName}})
@@ -53,14 +49,13 @@ endif(HAVE_APR_CONFIG)
if(HAVE_APR_CONFIG OR MSVC) if(HAVE_APR_CONFIG OR MSVC)
find_path(LIBSVN_INCLUDE_DIR svn_client.h find_path(LIBSVN_INCLUDE_DIR svn_client.h
NO_DEFAULT_PATH
HINTS HINTS
$ENV{LIBSVN_DIR} ${CMAKE_INSTALL_PREFIX} $ENV{LIBSVN_DIR}
PATH_SUFFIXES include/subversion-1 PATH_SUFFIXES include/subversion-1
PATHS PATHS
/opt/local
/usr/local /usr/local
/usr /usr
/opt
) )
set(LIBSVN_LIBRARIES "") set(LIBSVN_LIBRARIES "")
+2 -2
View File
@@ -2,7 +2,7 @@
Version 2, June 1991 Version 2, June 1991
Copyright (C) 1991 Free Software Foundation, Inc. Copyright (C) 1991 Free Software Foundation, Inc.
51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Everyone is permitted to copy and distribute verbatim copies Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed. of this license document, but changing it is not allowed.
@@ -464,7 +464,7 @@ convey the exclusion of warranty; and each file should have at least the
You should have received a copy of the GNU Library General Public You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free License along with this library; if not, write to the Free
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Also add information on how to contact you by electronic and paper mail. Also add information on how to contact you by electronic and paper mail.
-57
View File
@@ -1,57 +0,0 @@
How to build SimGear
====================
SimGear uses the CMake build system to generate a platform-specific
build environment. CMake reads the CMakeLists.txt files that you'll
find throughout the source directories, checks for installed
dependencies and then generates the appropriate build system.
If you don't already have CMake installed on your system you can grab
it from http://www.cmake.org, use version 2.6.4 or later.
Under unices (i.e. Linux, Solaris, Free-BSD, HP-Ux, OSX) use the cmake
or ccmake command-line utils. Preferably, create an out-of-source
build directory and run cmake or ccmake from there. The advantage to
this approach is that the temporary files created by CMake won't
clutter the source directory, and also makes it possible to have
multiple independent build targets by creating multiple build
directories. In a directory alongside the SimGear source directory
use:
mkdir sgbuild
cd sgbuild
cmake ../simgear -DCMAKE_BUILD_TYPE=Release
make
sudo make install
Build Dependencies
==================
SimGear depends on a number of 3rd party libraries, the most notable
being:
* OpenSceneGraph (OSG) - see README.OSG
* Portable Games Library (PLIB) - see README.plib
* zlib compression library - see README.zlib
* Open Audio Library (OpenAL) - see README.OpenAL
* Subversion Client Library (optional dependency)
Further information
===================
* README.cmake
for more detailed CMake instructions
* README.msvc
in the FlightGear source package for more Windows-specific instructions
* FlightGear Wiki
http://wiki.flightgear.org/Building_Flightgear
* FlightGear Forums
For help on building see: http://www.flightgear.org/forums
=> Support/Compiling
* FlightGear Mailing lists
http://wiki.flightgear.org/index.php/Mailing_list
+1 -15
View File
@@ -1,15 +1 @@
SimGear - Simulator Construction Tools [ Nothing here at this time. ]
======================================
http://www.flightgear.org
SimGear is a set of open-source libraries designed to be used as building
blocks for quickly assembling 3d simulations, games, and visualization
applications.
SimGear is developed by the FlightGear project and also provides the base
for the FlightGear Flight Simulator.
Source code for SimGear is released under the GNU Library General Public
License (LGPL) - see COPYING for license details.
See INSTALL file for help on building SimGear.
+1 -1
View File
@@ -3,7 +3,7 @@
You *must* have OpenSceneGraph (OSG) installed to build this version of You *must* have OpenSceneGraph (OSG) installed to build this version of
FlightGear. FlightGear.
Notice that this version of SimGear/FlightGear requires at least OSG 3.0.0. Notice that FlightGear 2.6.0 requires at least version 3.0.0.
You can get the latest version of OSG from: You can get the latest version of OSG from:
-161
View File
@@ -1,161 +0,0 @@
Getting started with CMake
==========================
(These instructions apply to Unix-like systems, including Cygwin and Mac. To
build using Visual Studio or some other IDE supported by CMake, most of the
information below still applies. Otherwise see
http://wiki.flightgear.org/Building_Flightgear for Windows specific build
instructions.)
Always compile in a separate directory to the code. For example, if the
code (eg, from Git) is at /home/curt/projects/simgear, you might create
/home/curt/projects/sgbuild. Change into the new directory, and run
cmake ../simgear
To generate standard Unix Makefiles in sgbuild.
Probably you want to specify an install prefix:
cmake ../simgear -DCMAKE_INSTALL_PREFIX=/usr
Note the install prefix is automatically searched for required libraries
and header files, so if you install PLIB, OpenSceneGraph to the
same prefix, most configuration options are unnecessary.
If for some reason you have a dependency (or several) at a different prefix,
you can specify one or more via CMAKE_PREFIX_PATH:
cmake ../simgear -DCMAKE_PREFIX_PATH="/opt/local;/opt/fgfs"
(note the use of semi-colons to specify multiple prefix paths)
Standard prefixes are searched automatically (/usr, /usr/local, /opt/local)
Most dependencies also expose an environment variable to specify their
installation directory explicitly eg OSG_DIR or PLIBDIR. Any of the methods
described above will work, but specifying an INSTALL_PREFIX or PREFIX_PATH is
usually simpler.
By default, we select a release build. To create a debug build, use
cmake ../simgear -DCMAKE_BUILD_TYPE=Debug
(or MinSizeRel, or RelWithDbg)
Debug builds will automatically use corresponding debug builds of required
libraries, if they are available. For example you can install debug builds of
OpenSceneGraph, and a debug SimGear build will use them.
(Debug builds of libraries have the 'd' suffix by default - Release builds
have no additional suffix)
Note most IDE projects (eg Xcode and Visual Studio) support building all the
build types from the same project, so you can omit the CMAKE_BUILD_TYPE option
when running cmake, and simply pick the build configuration as normal in the
IDE.
It's common to have several build directories with different build
configurations, eg
/home/curt/projects/simgear (the git clone)
/home/curt/projects/sgdebug
/home/curt/projects/sgrelease
/home/curt/projects/sg-with-svn-osg
To set an optional feature, do
cmake ../simgear -DFEATURE_NAME=ON
(or 'OFF' to disable )
To see the variables that can be configured / are currently defined, you can
run one of the GUI front ends, or the following command:
cmake ../simgear -L
Add 'A' to see all the options (including advanced options), or 'H' to see
the help for each option (similar to running configure --help under autoconf):
cmake ../simgear -LH
Build Targets
=============
For a Unix makefile build, 'make dist', 'make uninstall' and 'make test' are
all available and should work as expected. 'make clean' is also as normal,
but there is *no* 'make distclean' target. The equivalent is to completely
remove your build directory, and start with a fresh one.
Adding new files to the build
Add source files to the SOURCES list, and headers to the HEADERS list. Note
technically you only need to add source files, but omitting headers confuses
project generation and distribution / packaging targets.
For target conditional files, you can append to the SOURCES or HEADERS lists
inside an if() test, for example:
if(APPLE)
list(APPEND SOURCES extraFile1.cxx extraFile2.cxx)
endif()
Setting include directories
In any CMakeList.txt, you can do the following:
include_directories(${PROJECT_SOURCE_DIR}/some/path)
For example, this can be done in particular subdirectory, or at the project
root, or an intermediate level.
Setting target specific compile flags, includes or defines
Use set_target_property(), for example
set_target_property(fgfs PROPERTIES
COMPILE_DEFINITIONS FOO BAR=1)
You can set a property on an individual source file:
set_property(SOURCE myfile.cxx PROPERTY COMPILE_FLAGS "-Wno-unsigned-compare")
Detecting Features / Libraries
For most standard libraries (Gtk, wxWidget, Python, GDAL, Qt, libXml, Boost),
cmake provides a standard helper. To see the available modules, run:
cmake --help-module-list
In the root CMakeLists file, use a statement like:
find_package(OpenGL REQUIRED)
Each package helper sets various variables such aaa_FOUND, aaa_INCLUDE_DIR,
and aaa_LIBRARY. Depending on the complexity of the package, these variables
might have different names (eg, OPENSCENEGRAPH_LIBRARIES).
If there's no standard helper for a library you need, find a similar one, copy
it to CMakeModules/FindABC.cmake, and modify the code to fit. Generally this
is pretty straightforward. The built-in modules reside in the Cmake 'share'
directory, eg /usr/share/cmake/modules on Unix systems.
Note libraries support by pkg-config can be handled directly, with no need
to create a custom FindABC helper.
Adding a new executable target
add_executable(myexecutable ${SOURCES} ${HEADERS})
target_link_libraries(myexecutable .... libraries ... )
install(TARGETS myexecutable RUNTIME DESTINATION bin)
(If the executable should not be installed, omit the final line above)
If you add an additional line
add_test(testname ${EXECUTABLE_OUTPUT_PATH}/myexecutable)
Then running 'make test' will run your executable as a unit test. The
executable should return either a success or failure result code.
+1
View File
@@ -0,0 +1 @@
03/25/2001 - Resolve location of Sky dome implimentation documentation.
-13
View File
@@ -1,13 +0,0 @@
Building a SimGear RPM package for Red Hat
Please see the "package/openSUSE" directory for an
example how to build a SimGear RPM package with
shared SimGear libraries.
You may need to adapt the names (exact spelling) of some
of the package dependencies in the openSUSE RPM spec,
since these may slightly differ for Red Hat.
(If you have a working and tested Red Hat RPM spec,
you're welcome to contribute it to this project.)
-23
View File
@@ -1,23 +0,0 @@
Building a SimGear RPM package for openSUSE
(Last tested with openSUSE 11.4+12.1)
This directory contains the files which, along with
the source code tar files, can be used to build
an RPM package targeted at an openSUSE Linux system.
To build SimGear from source do the following:
1. obtain simgear-2.8.0.tar.bz2 (adapt version if
necessary) and copy it into ~/rpmbuild/SOURCES
2. look in the BuildRequires section of SimGear.spec
and check that all the packages referred to are
installed (note, some of these packages may be part
of openSUSE's "games" repository).
3. run 'rpmbuild -ba simgear.spec' and find the RPM
build result in ~/rpmbuild/RPMS
That's all!
-66
View File
@@ -1,66 +0,0 @@
Summary: Simulator Construction Gear
Name: SimGear
Version: 2.8.0
Release: 1
License: LGPL
URL: http://www.flightgear.org
Group: Amusements/Games/3D/Simulation
Source: http://mirrors.ibiblio.org/pub/mirrors/flightgear/ftp/Source/simgear-%{version}.tar.bz2
BuildRoot: %{_tmppath}/%{name}-%{version}-build
BuildRequires: gcc, gcc-c++, cmake
BuildRequires: freealut, freealut-devel
BuildRequires: libopenal1-soft, openal-soft
BuildRequires: plib-devel >= 1.8.5
BuildRequires: libOpenSceneGraph-devel >= 3.0
BuildRequires: zlib, zlib-devel
BuildRequires: libjpeg62, libjpeg62-devel
BuildRequires: boost-devel >= 1.37
BuildRequires: subversion-devel, libapr1-devel
Requires: OpenSceneGraph-plugins >= 3.0
%description
This package contains a tools and libraries useful for constructing
simulation and visualization applications such as FlightGear or TerraGear.
%package devel
Group: Development/Libraries/Other
Summary: Development header files for SimGear
Requires: SimGear = %{version}
Requires: plib-devel
%description devel
Development headers and libraries for building applications against SimGear.
%prep
%setup -T -q -n simgear-%{version} -b 0
%build
export CFLAGS="$RPM_OPT_FLAGS"
export CXXFLAGS="$RPM_OPT_FLAGS"
# build SHARED simgear libraries
cmake -DCMAKE_INSTALL_PREFIX=%{_prefix} -DSIMGEAR_SHARED:BOOL=ON -DENABLE_TESTS:BOOL=OFF -DJPEG_FACTORY:BOOL=ON
make %{?_smp_mflags}
%install
make DESTDIR=%{buildroot} install
%post -p /sbin/ldconfig
%postun -p /sbin/ldconfig
%files
%defattr (-, root, root, -)
%doc AUTHORS COPYING ChangeLog NEWS README
%{_libdir}/libSimGear*.so.*
%files devel
%defattr(-,root,root,-)
%dir %{_includedir}/simgear
%{_includedir}/simgear/*
%{_libdir}/libSimGear*.so
%changelog
* Mon Jul 02 2012 thorstenb@flightgear.org
- Initial version
+2
View File
@@ -0,0 +1,2 @@
The handmade VS2010 project files have been replaced by the Cmake build system.
Please use Cmake to build FlightGear with Visual Studio 2010.
+3
View File
@@ -0,0 +1,3 @@
*.user
Win32
x64
File diff suppressed because it is too large Load Diff
+1
View File
@@ -1,2 +1,3 @@
simgear_config.h simgear_config.h
simgear_config.h.*
version.h version.h
+26 -16
View File
@@ -11,6 +11,7 @@ foreach( mylibfolder
misc misc
nasal nasal
props props
route
serial serial
structure structure
threads threads
@@ -39,13 +40,14 @@ set(HEADERS compiler.h constants.h sg_inlines.h ${PROJECT_BINARY_DIR}/simgear/ve
install (FILES ${HEADERS} DESTINATION include/simgear/) install (FILES ${HEADERS} DESTINATION include/simgear/)
if(SIMGEAR_SHARED) if(SIMGEAR_SHARED)
message(STATUS "Library building mode: SHARED LIBRARIES") message(STATUS "building shared library")
get_property(coreSources GLOBAL PROPERTY CORE_SOURCES) get_property(coreSources GLOBAL PROPERTY CORE_SOURCES)
get_property(sceneSources GLOBAL PROPERTY SCENE_SOURCES) get_property(sceneSources GLOBAL PROPERTY SCENE_SOURCES)
get_property(publicHeaders GLOBAL PROPERTY PUBLIC_HEADERS) get_property(publicHeaders GLOBAL PROPERTY PUBLIC_HEADERS)
add_library(SimGearCore SHARED ${coreSources}) add_library(SimGearCore SHARED ${coreSources})
set_property(TARGET SimGearCore PROPERTY COMPILE_FLAGS "-DNO_OPENSCENEGRAPH_INTERFACE=1")
# set_property(TARGET SimGearCore PROPERTY FRAMEWORK 1) # set_property(TARGET SimGearCore PROPERTY FRAMEWORK 1)
# message(STATUS "public header: ${publicHeaders}") # message(STATUS "public header: ${publicHeaders}")
# set_property(TARGET SimGearCore PROPERTY PUBLIC_HEADER "${publicHeaders}") # set_property(TARGET SimGearCore PROPERTY PUBLIC_HEADER "${publicHeaders}")
@@ -57,32 +59,40 @@ if(SIMGEAR_SHARED)
target_link_libraries(SimGearCore ${ZLIB_LIBRARY} ${RT_LIBRARY}) target_link_libraries(SimGearCore ${ZLIB_LIBRARY} ${RT_LIBRARY})
install(TARGETS SimGearCore LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}) install(TARGETS SimGearCore LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
if(LIBSVN_FOUND)
add_definitions(${APR_CFLAGS})
include_directories(${LIBSVN_INCLUDE_DIR})
target_link_libraries(SimGearCore ${LIBSVN_LIBRARIES})
endif(LIBSVN_FOUND)
if(NOT SIMGEAR_HEADLESS) if(NOT SIMGEAR_HEADLESS)
if(LIBSVN_FOUND)
add_definitions(${APR_CFLAGS})
IF(APPLE)
set_property(SOURCE scene/tsync/terrasync.cxx PROPERTY COMPILE_FLAGS "-iwithsysroot ${LIBSVN_INCLUDE_DIR}")
ELSE()
include_directories(${LIBSVN_INCLUDE_DIR})
ENDIF(APPLE)
endif(LIBSVN_FOUND)
list(APPEND sceneSources scene/util/SGCoreOSGDependant.cxx)
add_library(SimGearScene SHARED ${sceneSources}) add_library(SimGearScene SHARED ${sceneSources})
# set_property(TARGET SimGearScene PROPERTY FRAMEWORK 1) # set_property(TARGET SimGearScene PROPERTY FRAMEWORK 1)
# set_property(TARGET SimGearScene PROPERTY PUBLIC_HEADER "${publicHeaders}") # set_property(TARGET SimGearScene PROPERTY PUBLIC_HEADER "${publicHeaders}")
set_property(TARGET SimGearScene PROPERTY LINKER_LANGUAGE CXX) set_property(TARGET SimGearScene PROPERTY LINKER_LANGUAGE CXX)
set_property(TARGET SimGearScene PROPERTY VERSION ${SIMGEAR_VERSION}) set_property(TARGET SimGearScene PROPERTY VERSION ${SIMGEAR_VERSION})
set_property(TARGET SimGearScene PROPERTY SOVERSION ${SIMGEAR_SOVERSION}) set_property(TARGET SimGearScene PROPERTY SOVERSION ${SIMGEAR_SOVERSION})
target_link_libraries(SimGearScene target_link_libraries(SimGearScene
SimGearCore SimGearCore
${ZLIB_LIBRARY} ${ZLIB_LIBRARY}
${OPENSCENEGRAPH_LIBRARIES} ${OPENSCENEGRAPH_LIBRARIES}
${OPENAL_LIBRARY} ${ALUT_LIBRARY} ${OPENAL_LIBRARY} ${ALUT_LIBRARY}
${OPENGL_LIBRARY} ${OPENGL_LIBRARY}
${JPEG_LIBRARY}) ${JPEG_LIBRARY})
if(LIBSVN_FOUND)
target_link_libraries(SimGearScene ${LIBSVN_LIBRARIES})
endif(LIBSVN_FOUND)
install(TARGETS SimGearScene LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}) install(TARGETS SimGearScene LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
endif() endif()
else()
message(STATUS "Library building mode: STATIC LIBRARIES")
endif(SIMGEAR_SHARED) endif(SIMGEAR_SHARED)
-3
View File
@@ -29,7 +29,6 @@
#include <simgear/constants.h> #include <simgear/constants.h>
#include <osg/ClipNode> #include <osg/ClipNode>
#include <simgear/scene/util/RenderConstants.hxx>
/** /**
* @brief SGPrecipitation constructor * @brief SGPrecipitation constructor
@@ -80,8 +79,6 @@ osg::Group* SGPrecipitation::build(void)
group->addChild(_precipitationEffect.get()); group->addChild(_precipitationEffect.get());
} }
group->setNodeMask( ~(simgear::CASTSHADOW_BIT | simgear::MODELLIGHT_BIT) );
return group; return group;
} }
+2 -11
View File
@@ -22,11 +22,8 @@ set(HLA_HEADERS
HLAOMTXmlVisitor.hxx HLAOMTXmlVisitor.hxx
HLAPropertyDataElement.hxx HLAPropertyDataElement.hxx
HLARawDataElement.hxx HLARawDataElement.hxx
HLATypes.hxx
HLAVariantDataElement.hxx HLAVariantDataElement.hxx
HLAVariantDataType.hxx HLAVariantDataType.hxx
HLAVariantRecordDataElement.hxx
HLAVariantRecordDataType.hxx
) )
set(HLA_SOURCES set(HLA_SOURCES
@@ -40,7 +37,6 @@ set(HLA_SOURCES
HLAEnumeratedDataElement.cxx HLAEnumeratedDataElement.cxx
HLAEnumeratedDataType.cxx HLAEnumeratedDataType.cxx
HLAFederate.cxx HLAFederate.cxx
HLAInteractionClass.cxx
HLAFixedRecordDataElement.cxx HLAFixedRecordDataElement.cxx
HLAFixedRecordDataType.cxx HLAFixedRecordDataType.cxx
HLAObjectClass.cxx HLAObjectClass.cxx
@@ -48,29 +44,24 @@ set(HLA_SOURCES
HLAOMTXmlVisitor.cxx HLAOMTXmlVisitor.cxx
HLAPropertyDataElement.cxx HLAPropertyDataElement.cxx
HLARawDataElement.cxx HLARawDataElement.cxx
HLAVariantRecordDataElement.cxx HLAVariantDataElement.cxx
HLAVariantRecordDataType.cxx HLAVariantDataType.cxx
) )
simgear_component(hla hla "${HLA_SOURCES}" "${HLA_HEADERS}") simgear_component(hla hla "${HLA_SOURCES}" "${HLA_HEADERS}")
if(RTI_FOUND) if(RTI_FOUND)
set(RTI13_SOURCES set(RTI13_SOURCES
RTI13InteractionClass.cxx
RTI13ObjectClass.cxx RTI13ObjectClass.cxx
RTI13ObjectInstance.cxx RTI13ObjectInstance.cxx
RTI13Federate.cxx RTI13Federate.cxx
RTI13FederateFactory.cxx
) )
simgear_component(rti13 hla "${RTI13_SOURCES}" "") simgear_component(rti13 hla "${RTI13_SOURCES}" "")
set_property(TARGET sgrti13 APPEND PROPERTY COMPILE_FLAGS "-I${RTI_INCLUDE_DIR}") set_property(TARGET sgrti13 APPEND PROPERTY COMPILE_FLAGS "-I${RTI_INCLUDE_DIR}")
endif() endif()
set(RTI_SOURCES set(RTI_SOURCES
RTIInteractionClass.cxx
RTIObjectClass.cxx RTIObjectClass.cxx
RTIObjectInstance.cxx RTIObjectInstance.cxx
RTIFederate.cxx RTIFederate.cxx
RTIFederateFactory.cxx
RTIFederateFactoryRegistry.cxx
) )
simgear_component(rti hla "${RTI_SOURCES}" "") simgear_component(rti hla "${RTI_SOURCES}" "")
+15 -62
View File
@@ -1,4 +1,4 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de // Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
// //
// This library is free software; you can redistribute it and/or // This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public // modify it under the terms of the GNU Library General Public
@@ -15,12 +15,6 @@
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
// //
#ifdef HAVE_CONFIG_H
# include <simgear_config.h>
#endif
#include <simgear/compiler.h>
#include "HLAArrayDataElement.hxx" #include "HLAArrayDataElement.hxx"
#include <simgear/debug/logstream.hxx> #include <simgear/debug/logstream.hxx>
@@ -105,7 +99,6 @@ HLAArrayDataElement::HLAArrayDataElement(const HLAArrayDataType* dataType) :
HLAArrayDataElement::~HLAArrayDataElement() HLAArrayDataElement::~HLAArrayDataElement()
{ {
clearStamp();
} }
bool bool
@@ -117,7 +110,6 @@ HLAArrayDataElement::setNumElements(unsigned size)
_elementVector.resize(size); _elementVector.resize(size);
for (unsigned i = oldSize; i < size; ++i) for (unsigned i = oldSize; i < size; ++i)
_elementVector[i] = newElement(i); _elementVector[i] = newElement(i);
setDirty(true);
return true; return true;
} }
@@ -179,12 +171,7 @@ HLAArrayDataElement::setElement(unsigned index, HLADataElement* value)
for (unsigned j = oldSize; j < index; ++j) for (unsigned j = oldSize; j < index; ++j)
_elementVector[j] = newElement(j); _elementVector[j] = newElement(j);
} }
if (_elementVector[index].valid())
_elementVector[index]->clearStamp();
_elementVector[index] = value; _elementVector[index] = value;
if (value)
value->attachStamp(*this);
setDirty(true);
} }
void void
@@ -199,27 +186,12 @@ HLAArrayDataElement::getDataElementFactory()
return _dataElementFactory.get(); return _dataElementFactory.get();
} }
void
HLAArrayDataElement::_setStamp(Stamp* stamp)
{
HLAAbstractArrayDataElement::_setStamp(stamp);
for (ElementVector::iterator i = _elementVector.begin(); i != _elementVector.end(); ++i) {
if (!i->valid())
continue;
(*i)->attachStamp(*this);
}
}
HLADataElement* HLADataElement*
HLAArrayDataElement::newElement(unsigned index) HLAArrayDataElement::newElement(unsigned index)
{ {
if (!_dataElementFactory.valid()) if (!_dataElementFactory.valid())
return 0; return 0;
HLADataElement* dataElement = _dataElementFactory->createElement(*this, index); return _dataElementFactory->createElement(*this, index);
if (!dataElement)
return 0;
dataElement->attachStamp(*this);
return dataElement;
} }
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
@@ -231,7 +203,6 @@ HLAVariantArrayDataElement::HLAVariantArrayDataElement() :
HLAVariantArrayDataElement::~HLAVariantArrayDataElement() HLAVariantArrayDataElement::~HLAVariantArrayDataElement()
{ {
clearStamp();
} }
bool bool
@@ -242,8 +213,8 @@ HLAVariantArrayDataElement::setDataType(const HLADataType* dataType)
SG_LOG(SG_NETWORK, SG_WARN, "HLAVariantArrayDataType: unable to set data type, dataType is not an array data type!"); SG_LOG(SG_NETWORK, SG_WARN, "HLAVariantArrayDataType: unable to set data type, dataType is not an array data type!");
return false; return false;
} }
const HLAVariantRecordDataType* variantRecordDataType = arrayDataType->getElementDataType()->toVariantRecordDataType(); const HLAVariantDataType* variantDataType = arrayDataType->getElementDataType()->toVariantDataType();
if (!variantRecordDataType) { if (!variantDataType) {
SG_LOG(SG_NETWORK, SG_WARN, "HLAVariantArrayDataType: unable to set data type: arrayDataTypes element data type is no a variant data type!"); SG_LOG(SG_NETWORK, SG_WARN, "HLAVariantArrayDataType: unable to set data type: arrayDataTypes element data type is no a variant data type!");
return false; return false;
} }
@@ -260,14 +231,13 @@ HLAVariantArrayDataElement::setNumElements(unsigned size)
_elementVector.resize(size); _elementVector.resize(size);
for (unsigned i = oldSize; i < size; ++i) for (unsigned i = oldSize; i < size; ++i)
_elementVector[i] = newElement(); _elementVector[i] = newElement();
setDirty(true);
return true; return true;
} }
bool bool
HLAVariantArrayDataElement::decodeElement(HLADecodeStream& stream, unsigned i) HLAVariantArrayDataElement::decodeElement(HLADecodeStream& stream, unsigned i)
{ {
HLAVariantRecordDataElement* dataElement = getElement(i); HLAVariantDataElement* dataElement = getElement(i);
if (!dataElement) if (!dataElement)
return false; return false;
return dataElement->decode(stream); return dataElement->decode(stream);
@@ -288,7 +258,7 @@ HLAVariantArrayDataElement::encodeElement(HLAEncodeStream& stream, unsigned i) c
return dataElement->encode(stream); return dataElement->encode(stream);
} }
const HLAVariantRecordDataElement* const HLAVariantDataElement*
HLAVariantArrayDataElement::getElement(unsigned index) const HLAVariantArrayDataElement::getElement(unsigned index) const
{ {
if (_elementVector.size() <= index) if (_elementVector.size() <= index)
@@ -296,7 +266,7 @@ HLAVariantArrayDataElement::getElement(unsigned index) const
return _elementVector[index].get(); return _elementVector[index].get();
} }
HLAVariantRecordDataElement* HLAVariantDataElement*
HLAVariantArrayDataElement::getElement(unsigned index) HLAVariantArrayDataElement::getElement(unsigned index)
{ {
if (_elementVector.size() <= index) if (_elementVector.size() <= index)
@@ -304,7 +274,7 @@ HLAVariantArrayDataElement::getElement(unsigned index)
return _elementVector[index].get(); return _elementVector[index].get();
} }
HLAVariantRecordDataElement* HLAVariantDataElement*
HLAVariantArrayDataElement::getOrCreateElement(unsigned index) HLAVariantArrayDataElement::getOrCreateElement(unsigned index)
{ {
if (_elementVector.size() <= index) if (_elementVector.size() <= index)
@@ -314,7 +284,7 @@ HLAVariantArrayDataElement::getOrCreateElement(unsigned index)
} }
void void
HLAVariantArrayDataElement::setElement(unsigned index, HLAVariantRecordDataElement* value) HLAVariantArrayDataElement::setElement(unsigned index, HLAVariantDataElement* value)
{ {
unsigned oldSize = _elementVector.size(); unsigned oldSize = _elementVector.size();
if (oldSize <= index) { if (oldSize <= index) {
@@ -322,12 +292,7 @@ HLAVariantArrayDataElement::setElement(unsigned index, HLAVariantRecordDataEleme
for (unsigned j = oldSize; j < index; ++j) for (unsigned j = oldSize; j < index; ++j)
_elementVector[j] = newElement(); _elementVector[j] = newElement();
} }
if (_elementVector[index].valid())
_elementVector[index]->clearStamp();
_elementVector[index] = value; _elementVector[index] = value;
if (value)
value->attachStamp(*this);
setDirty(true);
} }
void void
@@ -342,18 +307,7 @@ HLAVariantArrayDataElement::getAlternativeDataElementFactory()
return _alternativeDataElementFactory.get(); return _alternativeDataElementFactory.get();
} }
void HLAVariantDataElement*
HLAVariantArrayDataElement::_setStamp(Stamp* stamp)
{
HLAAbstractArrayDataElement::_setStamp(stamp);
for (ElementVector::iterator i = _elementVector.begin(); i != _elementVector.end(); ++i) {
if (!i->valid())
continue;
(*i)->attachStamp(*this);
}
}
HLAVariantRecordDataElement*
HLAVariantArrayDataElement::newElement() HLAVariantArrayDataElement::newElement()
{ {
const HLAArrayDataType* arrayDataType = getDataType(); const HLAArrayDataType* arrayDataType = getDataType();
@@ -362,13 +316,12 @@ HLAVariantArrayDataElement::newElement()
const HLADataType* elementDataType = arrayDataType->getElementDataType(); const HLADataType* elementDataType = arrayDataType->getElementDataType();
if (!elementDataType) if (!elementDataType)
return 0; return 0;
const HLAVariantRecordDataType* variantRecordDataType = elementDataType->toVariantRecordDataType(); const HLAVariantDataType* variantDataType = elementDataType->toVariantDataType();
if (!variantRecordDataType) if (!variantDataType)
return 0; return 0;
HLAVariantRecordDataElement* variantRecordDataElement = new HLAVariantRecordDataElement(variantRecordDataType); HLAVariantDataElement* variantDataElement = new HLAVariantDataElement(variantDataType);
variantRecordDataElement->setDataElementFactory(_alternativeDataElementFactory.get()); variantDataElement->setDataElementFactory(_alternativeDataElementFactory.get());
variantRecordDataElement->attachStamp(*this); return variantDataElement;
return variantRecordDataElement;
} }
} }
+18 -24
View File
@@ -1,4 +1,4 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de // Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
// //
// This library is free software; you can redistribute it and/or // This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public // modify it under the terms of the GNU Library General Public
@@ -23,7 +23,7 @@
#include <simgear/math/SGMath.hxx> #include <simgear/math/SGMath.hxx>
#include "HLAArrayDataType.hxx" #include "HLAArrayDataType.hxx"
#include "HLADataElement.hxx" #include "HLADataElement.hxx"
#include "HLAVariantRecordDataElement.hxx" #include "HLAVariantDataElement.hxx"
#include "HLADataTypeVisitor.hxx" #include "HLADataTypeVisitor.hxx"
namespace simgear { namespace simgear {
@@ -78,9 +78,6 @@ public:
void setDataElementFactory(DataElementFactory* dataElementFactory); void setDataElementFactory(DataElementFactory* dataElementFactory);
DataElementFactory* getDataElementFactory(); DataElementFactory* getDataElementFactory();
protected:
virtual void _setStamp(Stamp* stamp);
private: private:
HLADataElement* newElement(unsigned index); HLADataElement* newElement(unsigned index);
@@ -105,23 +102,20 @@ public:
virtual unsigned getNumElements() const; virtual unsigned getNumElements() const;
virtual bool encodeElement(HLAEncodeStream& stream, unsigned i) const; virtual bool encodeElement(HLAEncodeStream& stream, unsigned i) const;
const HLAVariantRecordDataElement* getElement(unsigned index) const; const HLAVariantDataElement* getElement(unsigned index) const;
HLAVariantRecordDataElement* getElement(unsigned index); HLAVariantDataElement* getElement(unsigned index);
HLAVariantRecordDataElement* getOrCreateElement(unsigned index); HLAVariantDataElement* getOrCreateElement(unsigned index);
void setElement(unsigned index, HLAVariantRecordDataElement* value); void setElement(unsigned index, HLAVariantDataElement* value);
typedef HLAVariantRecordDataElement::DataElementFactory AlternativeDataElementFactory; typedef HLAVariantDataElement::DataElementFactory AlternativeDataElementFactory;
void setAlternativeDataElementFactory(AlternativeDataElementFactory* alternativeDataElementFactory); void setAlternativeDataElementFactory(AlternativeDataElementFactory* alternativeDataElementFactory);
AlternativeDataElementFactory* getAlternativeDataElementFactory(); AlternativeDataElementFactory* getAlternativeDataElementFactory();
protected:
virtual void _setStamp(Stamp* stamp);
private: private:
HLAVariantRecordDataElement* newElement(); HLAVariantDataElement* newElement();
typedef std::vector<SGSharedPtr<HLAVariantRecordDataElement> > ElementVector; typedef std::vector<SGSharedPtr<HLAVariantDataElement> > ElementVector;
ElementVector _elementVector; ElementVector _elementVector;
SGSharedPtr<AlternativeDataElementFactory> _alternativeDataElementFactory; SGSharedPtr<AlternativeDataElementFactory> _alternativeDataElementFactory;
@@ -139,7 +133,7 @@ public:
const std::string& getValue() const const std::string& getValue() const
{ return _value; } { return _value; }
void setValue(const std::string& value) void setValue(const std::string& value)
{ _value = value; setDirty(true); } { _value = value; }
virtual bool setNumElements(unsigned count) virtual bool setNumElements(unsigned count)
{ {
@@ -216,11 +210,11 @@ public:
const SGVec2<T>& getValue() const const SGVec2<T>& getValue() const
{ return _value; } { return _value; }
void setValue(const SGVec2<T>& value) void setValue(const SGVec2<T>& value)
{ _value = value; setDirty(true); } { _value = value; }
virtual bool setNumElements(unsigned count) virtual bool setNumElements(unsigned count)
{ {
for (unsigned i = count; i < 2; ++i) for (unsigned i = 2; i < count; ++i)
_value[i] = 0; _value[i] = 0;
return true; return true;
} }
@@ -308,11 +302,11 @@ public:
const SGVec3<T>& getValue() const const SGVec3<T>& getValue() const
{ return _value; } { return _value; }
void setValue(const SGVec3<T>& value) void setValue(const SGVec3<T>& value)
{ _value = value; setDirty(true); } { _value = value; }
virtual bool setNumElements(unsigned count) virtual bool setNumElements(unsigned count)
{ {
for (unsigned i = count; i < 3; ++i) for (unsigned i = 3; i < count; ++i)
_value[i] = 0; _value[i] = 0;
return true; return true;
} }
@@ -400,11 +394,11 @@ public:
const SGVec4<T>& getValue() const const SGVec4<T>& getValue() const
{ return _value; } { return _value; }
void setValue(const SGVec4<T>& value) void setValue(const SGVec4<T>& value)
{ _value = value; setDirty(true); } { _value = value; }
virtual bool setNumElements(unsigned count) virtual bool setNumElements(unsigned count)
{ {
for (unsigned i = count; i < 4; ++i) for (unsigned i = 4; i < count; ++i)
_value[i] = 0; _value[i] = 0;
return true; return true;
} }
@@ -492,11 +486,11 @@ public:
const SGQuat<T>& getValue() const const SGQuat<T>& getValue() const
{ return _value; } { return _value; }
void setValue(const SGQuat<T>& value) void setValue(const SGQuat<T>& value)
{ _value = value; setDirty(true); } { _value = value; }
virtual bool setNumElements(unsigned count) virtual bool setNumElements(unsigned count)
{ {
for (unsigned i = count; i < 4; ++i) for (unsigned i = 4; i < count; ++i)
_value[i] = 0; _value[i] = 0;
return true; return true;
} }
+9 -35
View File
@@ -1,4 +1,4 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de // Copyright (C) 2009 - 2011 Mathias Froehlich - Mathias.Froehlich@web.de
// //
// This library is free software; you can redistribute it and/or // This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public // modify it under the terms of the GNU Library General Public
@@ -15,12 +15,6 @@
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
// //
#ifdef HAVE_CONFIG_H
# include <simgear_config.h>
#endif
#include <simgear/compiler.h>
#include "HLAArrayDataType.hxx" #include "HLAArrayDataType.hxx"
#include "HLAArrayDataElement.hxx" #include "HLAArrayDataElement.hxx"
@@ -50,16 +44,12 @@ HLAArrayDataType::toArrayDataType() const
return this; return this;
} }
void
HLAArrayDataType::releaseDataTypeReferences()
{
_elementDataType = 0;
HLADataType::releaseDataTypeReferences();
}
void void
HLAArrayDataType::setElementDataType(const HLADataType* elementDataType) HLAArrayDataType::setElementDataType(const HLADataType* elementDataType)
{ {
// FIXME this only works if we do not reset the alignment to something smaller
if (getAlignment() < elementDataType->getAlignment())
setAlignment(elementDataType->getAlignment());
_elementDataType = elementDataType; _elementDataType = elementDataType;
} }
@@ -75,15 +65,6 @@ HLAArrayDataType::setIsString(bool isString)
_isString = isString; _isString = isString;
} }
void
HLAArrayDataType::_recomputeAlignmentImplementation()
{
unsigned alignment = 1;
if (const HLADataType* dataType = getElementDataType())
alignment = std::max(alignment, dataType->getAlignment());
setAlignment(alignment);
}
/////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////
HLAFixedArrayDataType::HLAFixedArrayDataType(const std::string& name) : HLAFixedArrayDataType::HLAFixedArrayDataType(const std::string& name) :
@@ -179,20 +160,13 @@ HLAVariableArrayDataType::encode(HLAEncodeStream& stream, const HLAAbstractArray
} }
void void
HLAVariableArrayDataType::setSizeDataType(const HLABasicDataType* sizeDataType) HLAVariableArrayDataType::setSizeDataType(const HLADataType* sizeDataType)
{ {
// FIXME this only works if we do not reset the alignment to something smaller
if (getAlignment() < sizeDataType->getAlignment())
setAlignment(sizeDataType->getAlignment());
_sizeDataType = sizeDataType; _sizeDataType = sizeDataType;
} // setAlignment(SGMisc<unsigned>::max(_sizeDataType->getAlignment(), _elementDataType->getAlignment());
void
HLAVariableArrayDataType::_recomputeAlignmentImplementation()
{
unsigned alignment = 1;
if (const HLADataType* dataType = getElementDataType())
alignment = std::max(alignment, dataType->getAlignment());
if (const HLADataType* dataType = getSizeDataType())
alignment = std::max(alignment, dataType->getAlignment());
setAlignment(alignment);
} }
} // namespace simgear } // namespace simgear
+4 -12
View File
@@ -1,4 +1,4 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de // Copyright (C) 2009 - 2011 Mathias Froehlich - Mathias.Froehlich@web.de
// //
// This library is free software; you can redistribute it and/or // This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public // modify it under the terms of the GNU Library General Public
@@ -35,8 +35,6 @@ public:
virtual const HLAArrayDataType* toArrayDataType() const; virtual const HLAArrayDataType* toArrayDataType() const;
virtual void releaseDataTypeReferences();
virtual bool decode(HLADecodeStream& stream, HLAAbstractArrayDataElement& value) const = 0; virtual bool decode(HLADecodeStream& stream, HLAAbstractArrayDataElement& value) const = 0;
virtual bool encode(HLAEncodeStream& stream, const HLAAbstractArrayDataElement& value) const = 0; virtual bool encode(HLAEncodeStream& stream, const HLAAbstractArrayDataElement& value) const = 0;
@@ -52,9 +50,6 @@ public:
bool getIsString() const bool getIsString() const
{ return _isString; } { return _isString; }
protected:
virtual void _recomputeAlignmentImplementation();
private: private:
SGSharedPtr<const HLADataType> _elementDataType; SGSharedPtr<const HLADataType> _elementDataType;
bool _isOpaque; bool _isOpaque;
@@ -90,15 +85,12 @@ public:
virtual bool decode(HLADecodeStream& stream, HLAAbstractArrayDataElement& value) const; virtual bool decode(HLADecodeStream& stream, HLAAbstractArrayDataElement& value) const;
virtual bool encode(HLAEncodeStream& stream, const HLAAbstractArrayDataElement& value) const; virtual bool encode(HLAEncodeStream& stream, const HLAAbstractArrayDataElement& value) const;
void setSizeDataType(const HLABasicDataType* sizeDataType); void setSizeDataType(const HLADataType* sizeDataType);
const HLABasicDataType* getSizeDataType() const const HLADataType* getSizeDataType() const
{ return _sizeDataType.get(); } { return _sizeDataType.get(); }
protected:
virtual void _recomputeAlignmentImplementation();
private: private:
SGSharedPtr<const HLABasicDataType> _sizeDataType; SGSharedPtr<const HLADataType> _sizeDataType;
}; };
} // namespace simgear } // namespace simgear
-7
View File
@@ -15,12 +15,6 @@
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
// //
#ifdef HAVE_CONFIG_H
# include <simgear_config.h>
#endif
#include <simgear/compiler.h>
#include "HLABasicDataElement.hxx" #include "HLABasicDataElement.hxx"
#include "HLADataElementVisitor.hxx" #include "HLADataElementVisitor.hxx"
@@ -131,7 +125,6 @@ void
HLA##type##DataElement::setValue(ctype value) \ HLA##type##DataElement::setValue(ctype value) \
{ \ { \
_value = value; \ _value = value; \
setDirty(true); \
} }
IMPLEMENT_TYPED_HLA_BASIC_DATA_ELEMENT(Char, char); IMPLEMENT_TYPED_HLA_BASIC_DATA_ELEMENT(Char, char);
+1 -7
View File
@@ -1,4 +1,4 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de // Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
// //
// This library is free software; you can redistribute it and/or // This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public // modify it under the terms of the GNU Library General Public
@@ -15,12 +15,6 @@
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
// //
#ifdef HAVE_CONFIG_H
# include <simgear_config.h>
#endif
#include <simgear/compiler.h>
#include "HLABasicDataType.hxx" #include "HLABasicDataType.hxx"
#include "HLADataType.hxx" #include "HLADataType.hxx"
+1 -1
View File
@@ -1,4 +1,4 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de // Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
// //
// This library is free software; you can redistribute it and/or // This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public // modify it under the terms of the GNU Library General Public
+6 -63
View File
@@ -15,12 +15,6 @@
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
// //
#ifdef HAVE_CONFIG_H
# include <simgear_config.h>
#endif
#include <simgear/compiler.h>
#include "HLADataElement.hxx" #include "HLADataElement.hxx"
#include <simgear/debug/logstream.hxx> #include <simgear/debug/logstream.hxx>
@@ -137,51 +131,6 @@ HLADataElement::~HLADataElement()
{ {
} }
void
HLADataElement::setTimeStamp(const SGTimeStamp& timeStamp)
{
if (!_stamp.valid())
return;
_stamp->setTimeStamp(timeStamp);
}
void
HLADataElement::setTimeStampValid(bool timeStampValid)
{
if (!_stamp.valid())
return;
_stamp->setTimeStampValid(timeStampValid);
}
double
HLADataElement::getTimeDifference(const SGTimeStamp& timeStamp) const
{
if (!_stamp.valid())
return 0;
if (!_stamp->getTimeStampValid())
return 0;
return (timeStamp - _stamp->getTimeStamp()).toSecs();
}
void
HLADataElement::createStamp()
{
_setStamp(new Stamp);
setDirty(true);
}
void
HLADataElement::attachStamp(HLADataElement& dataElement)
{
_setStamp(dataElement._getStamp());
}
void
HLADataElement::clearStamp()
{
_setStamp(0);
}
void void
HLADataElement::accept(HLADataElementVisitor& visitor) HLADataElement::accept(HLADataElementVisitor& visitor)
{ {
@@ -203,11 +152,11 @@ HLADataElement::toString(const Path& path)
return s; return s;
} }
HLADataElement::StringPathPair HLADataElement::AttributePathPair
HLADataElement::toStringPathPair(const std::string& s) HLADataElement::toAttributePathPair(const std::string& s)
{ {
Path path; Path path;
// Skip the initial attribute/parameter name if given // Skip the initial attribute name if given
std::string::size_type i = s.find_first_of("[."); std::string::size_type i = s.find_first_of("[.");
std::string attribute = s.substr(0, i); std::string attribute = s.substr(0, i);
while (i < s.size()) { while (i < s.size()) {
@@ -222,7 +171,7 @@ HLADataElement::toStringPathPair(const std::string& s)
if (10 <= v) { if (10 <= v) {
SG_LOG(SG_NETWORK, SG_WARN, "HLADataElement: invalid character in array subscript for \"" SG_LOG(SG_NETWORK, SG_WARN, "HLADataElement: invalid character in array subscript for \""
<< s << "\" at \"" << attribute << toString(path) << "\"!"); << s << "\" at \"" << attribute << toString(path) << "\"!");
return StringPathPair(); return AttributePathPair();
} }
index *= 10; index *= 10;
index += v; index += v;
@@ -237,7 +186,7 @@ HLADataElement::toStringPathPair(const std::string& s)
if (s.size() <= ++i) { if (s.size() <= ++i) {
SG_LOG(SG_NETWORK, SG_WARN, "HLADataElement: invalid terminating '.' for \"" SG_LOG(SG_NETWORK, SG_WARN, "HLADataElement: invalid terminating '.' for \""
<< s << "\"!"); << s << "\"!");
return StringPathPair(); return AttributePathPair();
} }
std::string::size_type e = s.find_first_of("[.", i); std::string::size_type e = s.find_first_of("[.", i);
path.push_back(s.substr(i, e - i)); path.push_back(s.substr(i, e - i));
@@ -246,13 +195,7 @@ HLADataElement::toStringPathPair(const std::string& s)
} }
} }
return StringPathPair(attribute, path); return AttributePathPair(attribute, path);
}
void
HLADataElement::_setStamp(HLADataElement::Stamp* stamp)
{
_stamp = stamp;
} }
} }
+31 -64
View File
@@ -46,30 +46,34 @@ public:
virtual const HLADataType* getDataType() const = 0; virtual const HLADataType* getDataType() const = 0;
virtual bool setDataType(const HLADataType* dataType) = 0; virtual bool setDataType(const HLADataType* dataType) = 0;
/// Returns the time stamp if this data element. // Container for the timestamp the originating attribute was last updated for
/// Do not access this getter if the getTimeStampValid() method returns false. // class TimeStamp : public SGReferenced {
const SGTimeStamp& getTimeStamp() const // public:
{ return _stamp->getTimeStamp(); } // const SGTimeStamp& getTimeStamp() const
void setTimeStamp(const SGTimeStamp& timeStamp); // { return _timeStamp; }
// void setTimeStamp(const SGTimeStamp& timeStamp)
// { _timeStamp = timeStamp; }
// private:
// SGTimeStamp _timeStamp;
// };
bool getTimeStampValid() const // const TimeStamp* getTimeStamp() const
{ if (!_stamp.valid()) return false; return _stamp->getTimeStampValid(); } // { return _timeStamp.get(); }
void setTimeStampValid(bool timeStampValid); // void setTimeStamp(const TimeStamp* timeStamp)
// { _timeStamp = timeStamp; }
/// Convenience function that gives the time difference in seconds to a given timestamp // struct ChangeCount : public SGReferenced {
/// This function returns 0 if the timestamp is not valid. // ChangeCount() : _value(0) {}
double getTimeDifference(const SGTimeStamp& timeStamp) const; // unsigned _value;
// };
/// Dirty tracking of the attribute/parameter that this data element belongs to // SGSharedPtr<ChangeCount> _changeCount;
bool getDirty() const // unsigned getChangeCount() const
{ if (!_stamp.valid()) return true; return _stamp->getDirty(); } // {
void setDirty(bool dirty) // // If we don't have return allways the same
{ if (!_stamp.valid()) return; _stamp->setDirty(dirty); } // if (!_changeCount.valid())
// return 0;
/// Stamp handling // return _changeCount->_value;
void createStamp(); // }
void attachStamp(HLADataElement& dataElement);
void clearStamp();
/// HLADataElements could be identified by path /// HLADataElements could be identified by path
/// These paths are composed of structure field names and array indices in the /// These paths are composed of structure field names and array indices in the
@@ -146,55 +150,18 @@ public:
SGSharedPtr<Data> _data; SGSharedPtr<Data> _data;
}; };
typedef std::list<PathElement> Path; typedef std::list<PathElement> Path;
typedef std::pair<std::string, Path> StringPathPair; typedef std::pair<std::string, Path> AttributePathPair;
typedef StringPathPair AttributePathPair; // deprecated
typedef std::pair<unsigned, Path> IndexPathPair; typedef std::pair<unsigned, Path> IndexPathPair;
static std::string toString(const Path& path); static std::string toString(const Path& path);
static std::string toString(const StringPathPair& path) static std::string toString(const AttributePathPair& path)
{ return path.first + toString(path.second); } { return path.first + toString(path.second); }
static StringPathPair toStringPathPair(const std::string& s); static AttributePathPair toAttributePathPair(const std::string& s);
static AttributePathPair toAttributePathPair(const std::string& s) // deprecated
{ return toStringPathPair(s); }
static Path toPath(const std::string& s) static Path toPath(const std::string& s)
{ return toStringPathPair(s).second; } { return toAttributePathPair(s).second; }
protected:
// Container for the timestamp the originating attribute was last updated for
class Stamp : public SGReferenced {
public:
Stamp() : _timeStampValid(false), _dirty(true)
{ }
const SGTimeStamp& getTimeStamp() const
{ return _timeStamp; }
void setTimeStamp(const SGTimeStamp& timeStamp)
{ _timeStamp = timeStamp; }
bool getTimeStampValid() const
{ return _timeStampValid; }
void setTimeStampValid(bool timeStampValid)
{ _timeStampValid = timeStampValid; }
bool getDirty() const
{ return _dirty; }
void setDirty(bool dirty)
{ _dirty = dirty; }
private:
SGTimeStamp _timeStamp;
bool _timeStampValid;
bool _dirty;
};
/// get the stamp
Stamp* _getStamp() const
{ return _stamp.get(); }
/// Set the stamp
virtual void _setStamp(Stamp* stamp);
private: private:
SGSharedPtr<Stamp> _stamp; // SGSharedPtr<const TimeStamp> _timeStamp;
}; };
class HLADataElementProvider { class HLADataElementProvider {
+4 -4
View File
@@ -1,4 +1,4 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de // Copyright (C) 2009 - 2011 Mathias Froehlich - Mathias.Froehlich@web.de
// //
// This library is free software; you can redistribute it and/or // This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public // modify it under the terms of the GNU Library General Public
@@ -24,7 +24,7 @@ class HLABasicDataElement;
class HLAAbstractEnumeratedDataElement; class HLAAbstractEnumeratedDataElement;
class HLAAbstractFixedRecordDataElement; class HLAAbstractFixedRecordDataElement;
class HLAAbstractArrayDataElement; class HLAAbstractArrayDataElement;
class HLAAbstractVariantRecordDataElement; class HLAAbstractVariantDataElement;
class HLADataElementVisitor { class HLADataElementVisitor {
public: public:
@@ -36,7 +36,7 @@ public:
virtual void apply(HLAAbstractEnumeratedDataElement&); virtual void apply(HLAAbstractEnumeratedDataElement&);
virtual void apply(HLAAbstractArrayDataElement&); virtual void apply(HLAAbstractArrayDataElement&);
virtual void apply(HLAAbstractFixedRecordDataElement&); virtual void apply(HLAAbstractFixedRecordDataElement&);
virtual void apply(HLAAbstractVariantRecordDataElement&); virtual void apply(HLAAbstractVariantDataElement&);
}; };
class HLAConstDataElementVisitor { class HLAConstDataElementVisitor {
@@ -49,7 +49,7 @@ public:
virtual void apply(const HLAAbstractEnumeratedDataElement&); virtual void apply(const HLAAbstractEnumeratedDataElement&);
virtual void apply(const HLAAbstractArrayDataElement&); virtual void apply(const HLAAbstractArrayDataElement&);
virtual void apply(const HLAAbstractFixedRecordDataElement&); virtual void apply(const HLAAbstractFixedRecordDataElement&);
virtual void apply(const HLAAbstractVariantRecordDataElement&); virtual void apply(const HLAAbstractVariantDataElement&);
}; };
} }
+22 -24
View File
@@ -1,4 +1,4 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de // Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
// //
// This library is free software; you can redistribute it and/or // This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public // modify it under the terms of the GNU Library General Public
@@ -15,12 +15,6 @@
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
// //
#ifdef HAVE_CONFIG_H
# include <simgear_config.h>
#endif
#include <simgear/compiler.h>
#include "HLADataType.hxx" #include "HLADataType.hxx"
#include "HLADataElement.hxx" #include "HLADataElement.hxx"
@@ -45,6 +39,12 @@ HLADataType::accept(HLADataTypeVisitor& visitor) const
visitor.apply(*this); visitor.apply(*this);
} }
const HLADataTypeReference*
HLADataType::toDataTypeReference() const
{
return 0;
}
const HLABasicDataType* const HLABasicDataType*
HLADataType::toBasicDataType() const HLADataType::toBasicDataType() const
{ {
@@ -69,25 +69,12 @@ HLADataType::toFixedRecordDataType() const
return 0; return 0;
} }
const HLAVariantRecordDataType* const HLAVariantDataType*
HLADataType::toVariantRecordDataType() const HLADataType::toVariantDataType() const
{ {
return 0; return 0;
} }
bool
HLADataType::recomputeAlignment()
{
unsigned alignment = getAlignment();
_recomputeAlignmentImplementation();
return alignment != getAlignment();
}
void
HLADataType::releaseDataTypeReferences()
{
}
void void
HLADataType::setAlignment(unsigned alignment) HLADataType::setAlignment(unsigned alignment)
{ {
@@ -98,9 +85,20 @@ HLADataType::setAlignment(unsigned alignment)
_alignment = alignment; _alignment = alignment;
} }
void HLADataTypeReference::~HLADataTypeReference()
HLADataType::_recomputeAlignmentImplementation()
{ {
} }
void
HLADataTypeReference::accept(HLADataTypeVisitor& visitor) const
{
visitor.apply(*this);
}
const HLADataTypeReference*
HLADataTypeReference::toDataTypeReference() const
{
return this;
}
} }
+31 -14
View File
@@ -1,4 +1,4 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de // Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
// //
// This library is free software; you can redistribute it and/or // This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public // modify it under the terms of the GNU Library General Public
@@ -27,11 +27,19 @@ namespace simgear {
class HLADataTypeVisitor; class HLADataTypeVisitor;
class HLADataTypeReference;
class HLABasicDataType; class HLABasicDataType;
class HLAArrayDataType; class HLAArrayDataType;
class HLAEnumeratedDataType; class HLAEnumeratedDataType;
class HLAFixedRecordDataType; class HLAFixedRecordDataType;
class HLAVariantRecordDataType; class HLAVariantDataType;
enum HLAUpdateType {
HLAStaticUpdate,
HLAPeriodicUpdate,
HLAConditionalUpdate,
HLAUndefinedUpdate
};
class HLADataType : public SGWeakReferenced { class HLADataType : public SGWeakReferenced {
public: public:
@@ -50,33 +58,42 @@ public:
virtual void accept(HLADataTypeVisitor& visitor) const; virtual void accept(HLADataTypeVisitor& visitor) const;
virtual const HLADataTypeReference* toDataTypeReference() const;
virtual const HLABasicDataType* toBasicDataType() const; virtual const HLABasicDataType* toBasicDataType() const;
virtual const HLAArrayDataType* toArrayDataType() const; virtual const HLAArrayDataType* toArrayDataType() const;
virtual const HLAEnumeratedDataType* toEnumeratedDataType() const; virtual const HLAEnumeratedDataType* toEnumeratedDataType() const;
virtual const HLAFixedRecordDataType* toFixedRecordDataType() const; virtual const HLAFixedRecordDataType* toFixedRecordDataType() const;
/// deprecated virtual const HLAVariantDataType* toVariantDataType() const;
const HLAVariantRecordDataType* toVariantDataType() const { return toVariantRecordDataType(); }
virtual const HLAVariantRecordDataType* toVariantRecordDataType() const;
/// Recompute the alignment value of this data type.
/// Return true if the alignment changed, false otherwise.
bool recomputeAlignment();
/// Release references to other data types. Since we can have cycles this is
/// required for propper feeing of memory.
virtual void releaseDataTypeReferences();
protected: protected:
HLADataType(const std::string& name, unsigned alignment = 1); HLADataType(const std::string& name, unsigned alignment = 1);
void setAlignment(unsigned alignment); void setAlignment(unsigned alignment);
virtual void _recomputeAlignmentImplementation();
private: private:
std::string _name; std::string _name;
std::string _semantics; std::string _semantics;
unsigned _alignment; unsigned _alignment;
}; };
// Weak reference to a data type. Used to implement self referencing data types
class HLADataTypeReference : public HLADataType {
public:
HLADataTypeReference(const SGSharedPtr<HLADataType>& dataType) :
HLADataType(dataType->getName(), dataType->getAlignment()),
_dataType(dataType)
{ }
virtual ~HLADataTypeReference();
SGSharedPtr<const HLADataType> getDataType() const
{ return _dataType.lock(); }
virtual void accept(HLADataTypeVisitor& visitor) const;
virtual const HLADataTypeReference* toDataTypeReference() const;
private:
SGWeakPtr<const HLADataType> _dataType;
};
} // namespace simgear } // namespace simgear
#endif #endif
+10 -16
View File
@@ -1,4 +1,4 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de // Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
// //
// This library is free software; you can redistribute it and/or // This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public // modify it under the terms of the GNU Library General Public
@@ -15,12 +15,6 @@
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
// //
#ifdef HAVE_CONFIG_H
# include <simgear_config.h>
#endif
#include <simgear/compiler.h>
#include "HLADataTypeVisitor.hxx" #include "HLADataTypeVisitor.hxx"
#include "HLAArrayDataElement.hxx" #include "HLAArrayDataElement.hxx"
@@ -28,7 +22,7 @@
#include "HLADataTypeVisitor.hxx" #include "HLADataTypeVisitor.hxx"
#include "HLAEnumeratedDataElement.hxx" #include "HLAEnumeratedDataElement.hxx"
#include "HLAFixedRecordDataElement.hxx" #include "HLAFixedRecordDataElement.hxx"
#include "HLAVariantRecordDataElement.hxx" #include "HLAVariantDataElement.hxx"
namespace simgear { namespace simgear {
@@ -166,11 +160,11 @@ HLADataElementFactoryVisitor::apply(const HLAFixedRecordDataType& dataType)
_dataElement = recordDataElement; _dataElement = recordDataElement;
} }
class HLADataElementFactoryVisitor::VariantRecordDataElementFactory : public HLAVariantRecordDataElement::DataElementFactory { class HLADataElementFactoryVisitor::VariantDataElementFactory : public HLAVariantDataElement::DataElementFactory {
public: public:
virtual HLADataElement* createElement(const HLAVariantRecordDataElement& element, unsigned index) virtual HLADataElement* createElement(const HLAVariantDataElement& element, unsigned index)
{ {
const HLAVariantRecordDataType* dataType = element.getDataType(); const HLAVariantDataType* dataType = element.getDataType();
if (!dataType) if (!dataType)
return 0; return 0;
const HLADataType* alternativeDataType = element.getAlternativeDataType(); const HLADataType* alternativeDataType = element.getAlternativeDataType();
@@ -183,12 +177,12 @@ public:
}; };
void void
HLADataElementFactoryVisitor::apply(const HLAVariantRecordDataType& dataType) HLADataElementFactoryVisitor::apply(const HLAVariantDataType& dataType)
{ {
SGSharedPtr<HLAVariantRecordDataElement> variantRecordDataElement; SGSharedPtr<HLAVariantDataElement> variantDataElement;
variantRecordDataElement = new HLAVariantRecordDataElement(&dataType); variantDataElement = new HLAVariantDataElement(&dataType);
variantRecordDataElement->setDataElementFactory(new VariantRecordDataElementFactory); variantDataElement->setDataElementFactory(new VariantDataElementFactory);
_dataElement = variantRecordDataElement; _dataElement = variantDataElement;
} }
} // namespace simgear } // namespace simgear
+22 -12
View File
@@ -1,4 +1,4 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de // Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
// //
// This library is free software; you can redistribute it and/or // This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public // modify it under the terms of the GNU Library General Public
@@ -27,7 +27,7 @@
#include "HLADataElement.hxx" #include "HLADataElement.hxx"
#include "HLAEnumeratedDataType.hxx" #include "HLAEnumeratedDataType.hxx"
#include "HLAFixedRecordDataType.hxx" #include "HLAFixedRecordDataType.hxx"
#include "HLAVariantRecordDataType.hxx" #include "HLAVariantDataType.hxx"
namespace simgear { namespace simgear {
@@ -38,6 +38,16 @@ public:
virtual void apply(const HLADataType& dataType) virtual void apply(const HLADataType& dataType)
{ } { }
virtual void apply(const HLADataTypeReference& dataType)
{
SGSharedPtr<const HLADataType> dataTypeReference = dataType.getDataType();
if (!dataTypeReference.valid()) {
SG_LOG(SG_NETWORK, SG_WARN, "HLADataTypeReference weak reference vanished!");
return;
}
dataTypeReference->accept(*this);
}
virtual void apply(const HLABasicDataType& dataType) virtual void apply(const HLABasicDataType& dataType)
{ apply(static_cast<const HLADataType&>(dataType)); } { apply(static_cast<const HLADataType&>(dataType)); }
virtual void apply(const HLAInt8DataType& dataType) virtual void apply(const HLAInt8DataType& dataType)
@@ -74,7 +84,7 @@ public:
virtual void apply(const HLAFixedRecordDataType& dataType) virtual void apply(const HLAFixedRecordDataType& dataType)
{ apply(static_cast<const HLADataType&>(dataType)); } { apply(static_cast<const HLADataType&>(dataType)); }
virtual void apply(const HLAVariantRecordDataType& dataType) virtual void apply(const HLAVariantDataType& dataType)
{ apply(static_cast<const HLADataType&>(dataType)); } { apply(static_cast<const HLADataType&>(dataType)); }
}; };
@@ -135,7 +145,7 @@ public:
} }
} }
virtual void apply(const HLAVariantRecordDataType& dataType) virtual void apply(const HLAVariantDataType& dataType)
{ assert(0); } { assert(0); }
protected: protected:
@@ -178,7 +188,7 @@ public:
dataType.getFieldDataType(i)->accept(*this); dataType.getFieldDataType(i)->accept(*this);
} }
virtual void apply(const HLAVariantRecordDataType& dataType) { assert(0); } virtual void apply(const HLAVariantDataType& dataType) { assert(0); }
protected: protected:
HLADecodeStream& _stream; HLADecodeStream& _stream;
@@ -222,7 +232,7 @@ public:
dataType.getFieldDataType(i)->accept(*this); dataType.getFieldDataType(i)->accept(*this);
} }
virtual void apply(const HLAVariantRecordDataType& dataType) { assert(0); } virtual void apply(const HLAVariantDataType& dataType) { assert(0); }
protected: protected:
HLAEncodeStream& _stream; HLAEncodeStream& _stream;
@@ -259,7 +269,7 @@ public:
HLADataTypeDecodeVisitor::apply(dataType); HLADataTypeDecodeVisitor::apply(dataType);
} }
virtual void apply(const HLAVariantRecordDataType& dataType) virtual void apply(const HLAVariantDataType& dataType)
{ {
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while decodeing scalar value"); SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while decodeing scalar value");
HLADataTypeDecodeVisitor::apply(dataType); HLADataTypeDecodeVisitor::apply(dataType);
@@ -295,7 +305,7 @@ public:
HLADataTypeEncodeVisitor::apply(dataType); HLADataTypeEncodeVisitor::apply(dataType);
} }
virtual void apply(const HLAVariantRecordDataType& dataType) virtual void apply(const HLAVariantDataType& dataType)
{ {
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while writing scalar value"); SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while writing scalar value");
HLADataTypeEncodeVisitor::apply(dataType); HLADataTypeEncodeVisitor::apply(dataType);
@@ -376,7 +386,7 @@ public:
HLADataTypeDecodeVisitor::apply(dataType); HLADataTypeDecodeVisitor::apply(dataType);
} }
virtual void apply(const HLAVariantRecordDataType& dataType) virtual void apply(const HLAVariantDataType& dataType)
{ {
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while decodeing a fixed record value"); SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while decodeing a fixed record value");
HLADataTypeDecodeVisitor::apply(dataType); HLADataTypeDecodeVisitor::apply(dataType);
@@ -457,7 +467,7 @@ public:
HLADataTypeEncodeVisitor::apply(dataType); HLADataTypeEncodeVisitor::apply(dataType);
} }
virtual void apply(const HLAVariantRecordDataType& dataType) virtual void apply(const HLAVariantDataType& dataType)
{ {
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while writing a fixed record value"); SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while writing a fixed record value");
HLADataTypeEncodeVisitor::apply(dataType); HLADataTypeEncodeVisitor::apply(dataType);
@@ -644,14 +654,14 @@ public:
virtual void apply(const HLAFixedRecordDataType& dataType); virtual void apply(const HLAFixedRecordDataType& dataType);
virtual void apply(const HLAVariantRecordDataType& dataType); virtual void apply(const HLAVariantDataType& dataType);
HLADataElement* getDataElement() HLADataElement* getDataElement()
{ return _dataElement.release(); } { return _dataElement.release(); }
protected: protected:
class ArrayDataElementFactory; class ArrayDataElementFactory;
class VariantRecordDataElementFactory; class VariantDataElementFactory;
SGSharedPtr<HLADataElement> _dataElement; SGSharedPtr<HLADataElement> _dataElement;
}; };
+1 -7
View File
@@ -1,4 +1,4 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de // Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
// //
// This library is free software; you can redistribute it and/or // This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public // modify it under the terms of the GNU Library General Public
@@ -15,12 +15,6 @@
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
// //
#ifdef HAVE_CONFIG_H
# include <simgear_config.h>
#endif
#include <simgear/compiler.h>
#include "HLAEnumeratedDataElement.hxx" #include "HLAEnumeratedDataElement.hxx"
#include <simgear/debug/logstream.hxx> #include <simgear/debug/logstream.hxx>
+1 -16
View File
@@ -1,4 +1,4 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de // Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
// //
// This library is free software; you can redistribute it and/or // This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public // modify it under the terms of the GNU Library General Public
@@ -15,12 +15,6 @@
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
// //
#ifdef HAVE_CONFIG_H
# include <simgear_config.h>
#endif
#include <simgear/compiler.h>
#include "HLAEnumeratedDataType.hxx" #include "HLAEnumeratedDataType.hxx"
#include <map> #include <map>
@@ -182,14 +176,5 @@ HLAEnumeratedDataType::setRepresentation(HLABasicDataType* representation)
_map.swap(representationVisitor._map); _map.swap(representationVisitor._map);
} }
void
HLAEnumeratedDataType::_recomputeAlignmentImplementation()
{
unsigned alignment = 1;
if (const HLADataType* dataType = getRepresentation())
alignment = std::max(alignment, dataType->getAlignment());
setAlignment(alignment);
}
} // namespace simgear } // namespace simgear
+1 -4
View File
@@ -1,4 +1,4 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de // Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
// //
// This library is free software; you can redistribute it and/or // This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public // modify it under the terms of the GNU Library General Public
@@ -70,9 +70,6 @@ public:
return _map->getDataType(); return _map->getDataType();
} }
protected:
virtual void _recomputeAlignmentImplementation();
private: private:
class AbstractMap : public SGReferenced { class AbstractMap : public SGReferenced {
public: public:
+77 -332
View File
@@ -1,4 +1,4 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de // Copyright (C) 2009 - 2011 Mathias Froehlich - Mathias.Froehlich@web.de
// //
// This library is free software; you can redistribute it and/or // This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public // modify it under the terms of the GNU Library General Public
@@ -15,21 +15,10 @@
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
// //
#ifdef HAVE_CONFIG_H
# include <simgear_config.h>
#endif
#include <simgear/compiler.h>
#include "HLAFederate.hxx" #include "HLAFederate.hxx"
#include <algorithm> #include "RTI13Federate.hxx"
#include "simgear/debug/logstream.hxx"
#include "RTIFederate.hxx" #include "RTIFederate.hxx"
#include "RTIFederateFactoryRegistry.hxx"
#include "RTI13FederateFactory.hxx"
#include "RTIInteractionClass.hxx" #include "RTIInteractionClass.hxx"
#include "RTIObjectClass.hxx" #include "RTIObjectClass.hxx"
#include "HLADataElement.hxx" #include "HLADataElement.hxx"
@@ -46,19 +35,10 @@ HLAFederate::HLAFederate() :
_timeConstrainedByLocalClock(false), _timeConstrainedByLocalClock(false),
_done(false) _done(false)
{ {
// For now instantiate the current only available factory here explicitly
RTI13FederateFactory::instance();
} }
HLAFederate::~HLAFederate() HLAFederate::~HLAFederate()
{ {
_clearRTI();
// Remove the data type references from the data types.
// This is to remove the cycles from the data types that might happen if a data type references itself
for (DataTypeMap::iterator i = _dataTypeMap.begin(); i != _dataTypeMap.end(); ++i) {
i->second->releaseDataTypeReferences();
}
} }
HLAFederate::Version HLAFederate::Version
@@ -78,22 +58,6 @@ HLAFederate::setVersion(HLAFederate::Version version)
return true; return true;
} }
bool
HLAFederate::setVersion(const std::string& version)
{
if (version == "RTI13")
return setVersion(RTI13);
else if (version == "RTI1516")
return setVersion(RTI1516);
else if (version == "RTI1516E")
return setVersion(RTI1516E);
else {
/// at some time think about routing these down to the factory
SG_LOG(SG_NETWORK, SG_ALERT, "HLA: Unknown version string in HLAFederate::setVersion!");
return false;
}
}
const std::list<std::string>& const std::list<std::string>&
HLAFederate::getConnectArguments() const HLAFederate::getConnectArguments() const
{ {
@@ -195,9 +159,28 @@ HLAFederate::setFederateName(const std::string& federateName)
bool bool
HLAFederate::connect(Version version, const std::list<std::string>& stringList) HLAFederate::connect(Version version, const std::list<std::string>& stringList)
{ {
_version = version; if (_rtiFederate.valid()) {
_connectArguments = stringList; SG_LOG(SG_NETWORK, SG_WARN, "HLA: Trying to connect to already connected federate!");
return connect(); return false;
}
switch (version) {
case RTI13:
_rtiFederate = new RTI13Federate(stringList);
_version = version;
_connectArguments = stringList;
break;
case RTI1516:
SG_LOG(SG_IO, SG_ALERT, "HLA version RTI1516 not yet(!?) supported.");
// _rtiFederate = new RTI1516Federate(stringList);
break;
case RTI1516E:
SG_LOG(SG_IO, SG_ALERT, "HLA version RTI1516E not yet(!?) supported.");
// _rtiFederate = new RTI1516eFederate(stringList);
break;
default:
SG_LOG(SG_NETWORK, SG_WARN, "HLA: Unknown rti version in connect!");
}
return _rtiFederate.valid();
} }
bool bool
@@ -207,22 +190,17 @@ HLAFederate::connect()
SG_LOG(SG_NETWORK, SG_WARN, "HLA: Trying to connect to already connected federate!"); SG_LOG(SG_NETWORK, SG_WARN, "HLA: Trying to connect to already connected federate!");
return false; return false;
} }
SGSharedPtr<RTIFederateFactoryRegistry> registry = RTIFederateFactoryRegistry::instance();
if (!registry) {
SG_LOG(SG_NETWORK, SG_ALERT, "HLA: RTIFederateFactoryRegistry is no longer available!");
return false;
}
switch (_version) { switch (_version) {
case RTI13: case RTI13:
_rtiFederate = registry->create("RTI13", _connectArguments); _rtiFederate = new RTI13Federate(_connectArguments);
break; break;
case RTI1516: case RTI1516:
_rtiFederate = registry->create("RTI1516", _connectArguments); SG_LOG(SG_IO, SG_ALERT, "HLA version RTI1516 not yet(!?) supported.");
// _rtiFederate = new RTI1516Federate(_connectArguments);
break; break;
case RTI1516E: case RTI1516E:
_rtiFederate = registry->create("RTI1516E", _connectArguments); SG_LOG(SG_IO, SG_ALERT, "HLA version RTI1516E not yet(!?) supported.");
// _rtiFederate = new RTI1516eFederate(_connectArguments);
break; break;
default: default:
SG_LOG(SG_NETWORK, SG_WARN, "HLA: Unknown rti version in connect!"); SG_LOG(SG_NETWORK, SG_WARN, "HLA: Unknown rti version in connect!");
@@ -237,8 +215,7 @@ HLAFederate::disconnect()
SG_LOG(SG_NETWORK, SG_WARN, "HLA: Accessing unconnected federate!"); SG_LOG(SG_NETWORK, SG_WARN, "HLA: Accessing unconnected federate!");
return false; return false;
} }
_rtiFederate = 0;
_clearRTI();
return true; return true;
} }
@@ -671,11 +648,14 @@ HLAFederate::timeAdvanceAvailable()
} }
SGTimeStamp timeStamp; SGTimeStamp timeStamp;
if (_rtiFederate->queryGALT(timeStamp)) { if (!_rtiFederate->queryGALT(timeStamp)) {
if (!_rtiFederate->timeAdvanceRequestAvailable(timeStamp)) { SG_LOG(SG_NETWORK, SG_WARN, "HLA: Could not query GALT!");
SG_LOG(SG_NETWORK, SG_WARN, "HLA: Time advance request failed!"); return false;
return false; }
}
if (!_rtiFederate->timeAdvanceRequestAvailable(timeStamp)) {
SG_LOG(SG_NETWORK, SG_WARN, "HLA: Time advance request failed!");
return false;
} }
return processMessages(); return processMessages();
@@ -768,6 +748,11 @@ bool
HLAFederate::readObjectModelTemplate(const std::string& objectModel, HLAFederate::readObjectModelTemplate(const std::string& objectModel,
HLAFederate::ObjectModelFactory& objectModelFactory) HLAFederate::ObjectModelFactory& objectModelFactory)
{ {
if (!_rtiFederate.valid()) {
SG_LOG(SG_NETWORK, SG_WARN, "HLA: Accessing unconnected federate!");
return false;
}
// The XML version of the federate object model. // The XML version of the federate object model.
// This one covers the generic attributes, parameters and data types. // This one covers the generic attributes, parameters and data types.
HLAOMTXmlVisitor omtXmlVisitor; HLAOMTXmlVisitor omtXmlVisitor;
@@ -782,8 +767,6 @@ HLAFederate::readObjectModelTemplate(const std::string& objectModel,
return false; return false;
} }
omtXmlVisitor.setDataTypesToFederate(*this);
unsigned numObjectClasses = omtXmlVisitor.getNumObjectClasses(); unsigned numObjectClasses = omtXmlVisitor.getNumObjectClasses();
for (unsigned i = 0; i < numObjectClasses; ++i) { for (unsigned i = 0; i < numObjectClasses; ++i) {
const HLAOMTXmlVisitor::ObjectClass* objectClass = omtXmlVisitor.getObjectClass(i); const HLAOMTXmlVisitor::ObjectClass* objectClass = omtXmlVisitor.getObjectClass(i);
@@ -798,171 +781,56 @@ HLAFederate::readObjectModelTemplate(const std::string& objectModel,
bool publish = objectModelFactory.publishObjectClass(objectClassName, objectClass->getSharing()); bool publish = objectModelFactory.publishObjectClass(objectClassName, objectClass->getSharing());
bool subscribe = objectModelFactory.subscribeObjectClass(objectClassName, objectClass->getSharing()); bool subscribe = objectModelFactory.subscribeObjectClass(objectClassName, objectClass->getSharing());
std::set<unsigned> subscriptions;
std::set<unsigned> publications;
// process the attributes // process the attributes
for (unsigned j = 0; j < objectClass->getNumAttributes(); ++j) { for (unsigned j = 0; j < objectClass->getNumAttributes(); ++j) {
const simgear::HLAOMTXmlVisitor::Attribute* attribute; const simgear::HLAOMTXmlVisitor::Attribute* attribute;
attribute = objectClass->getAttribute(j); attribute = objectClass->getAttribute(j);
std::string attributeName = attribute->getName(); std::string attributeName = attribute->getName();
unsigned index = hlaObjectClass->addAttribute(attributeName); unsigned index = hlaObjectClass->getAttributeIndex(attributeName);
if (index == ~0u) { if (index == ~0u) {
SG_LOG(SG_IO, SG_WARN, "RTI does not know the \"" << attributeName << "\" attribute!"); SG_LOG(SG_IO, SG_WARN, "RTI does not know the \"" << attributeName << "\" attribute!");
continue; continue;
} }
// the attributes datatype SGSharedPtr<HLADataType> dataType;
SGSharedPtr<const HLADataType> dataType = getDataType(attribute->getDataType()); dataType = omtXmlVisitor.getAttributeDataType(objectClassName, attributeName);
if (!dataType.valid()) { if (!dataType.valid()) {
SG_LOG(SG_IO, SG_WARN, "Could not find data type for attribute \"" SG_LOG(SG_IO, SG_WARN, "Could not find data type for attribute \""
<< attributeName << "\" in object class \"" << objectClassName << "\"!"); << attributeName << "\" in object class \"" << objectClassName << "\"!");
} }
hlaObjectClass->setAttributeDataType(index, dataType); hlaObjectClass->setAttributeDataType(index, dataType);
hlaObjectClass->setAttributeUpdateType(index, attribute->getUpdateType());
HLAUpdateType updateType = HLAUndefinedUpdate;
if (attribute->_updateType == "Periodic")
updateType = HLAPeriodicUpdate;
else if (attribute->_updateType == "Static")
updateType = HLAStaticUpdate;
else if (attribute->_updateType == "Conditional")
updateType = HLAConditionalUpdate;
hlaObjectClass->setAttributeUpdateType(index, updateType);
if (subscribe && objectModelFactory.subscribeAttribute(objectClassName, attributeName, attribute->_sharing)) if (subscribe && objectModelFactory.subscribeAttribute(objectClassName, attributeName, attribute->_sharing))
hlaObjectClass->setAttributeSubscriptionType(index, attribute->getSubscriptionType()); subscriptions.insert(index);
if (publish && objectModelFactory.publishAttribute(objectClassName, attributeName, attribute->_sharing)) if (publish && objectModelFactory.publishAttribute(objectClassName, attributeName, attribute->_sharing))
hlaObjectClass->setAttributePublicationType(index, attribute->getPublicationType()); publications.insert(index);
} }
if (publish) if (publish)
hlaObjectClass->publish(); hlaObjectClass->publish(publications);
if (subscribe) if (subscribe)
hlaObjectClass->subscribe(); hlaObjectClass->subscribe(subscriptions, true);
} _objectClassMap[objectClassName] = hlaObjectClass;
return resolveObjectModel();
}
bool
HLAFederate::readRTI13ObjectModelTemplate(const std::string& objectModel)
{
SG_LOG(SG_IO, SG_ALERT, "HLA version RTI13 not yet(!?) supported.");
return false;
}
bool
HLAFederate::readRTI1516ObjectModelTemplate(const std::string& objectModel)
{
// The XML version of the federate object model.
// This one covers the generic attributes, parameters and data types.
HLAOMTXmlVisitor omtXmlVisitor;
try {
readXML(objectModel, omtXmlVisitor);
} catch (const sg_throwable& e) {
SG_LOG(SG_IO, SG_ALERT, "Could not open HLA XML object model file: "
<< e.getMessage());
return false;
} catch (...) {
SG_LOG(SG_IO, SG_ALERT, "Could not open HLA XML object model file");
return false;
}
omtXmlVisitor.setToFederate(*this);
return resolveObjectModel();
}
bool
HLAFederate::readRTI1516EObjectModelTemplate(const std::string& objectModel)
{
SG_LOG(SG_IO, SG_ALERT, "HLA version RTI1516E not yet(!?) supported.");
return false;
}
bool
HLAFederate::resolveObjectModel()
{
if (!_rtiFederate.valid()) {
SG_LOG(SG_NETWORK, SG_WARN, "HLA: Accessing unconnected federate!");
return false;
}
for (InteractionClassMap::iterator i = _interactionClassMap.begin(); i != _interactionClassMap.end(); ++i) {
RTIInteractionClass* rtiInteractionClass = _rtiFederate->createInteractionClass(i->second->getName(), i->second.get());
if (!rtiInteractionClass) {
SG_LOG(SG_NETWORK, SG_ALERT, "HLAFederate::_insertInteractionClass(): "
"No RTIInteractionClass found for \"" << i->second->getName() << "\"!");
return false;
}
i->second->_setRTIInteractionClass(rtiInteractionClass);
}
for (ObjectClassMap::iterator i = _objectClassMap.begin(); i != _objectClassMap.end(); ++i) {
RTIObjectClass* rtiObjectClass = _rtiFederate->createObjectClass(i->second->getName(), i->second.get());
if (!rtiObjectClass) {
SG_LOG(SG_NETWORK, SG_ALERT, "HLAFederate::_insertObjectClass(): "
"No RTIObjectClass found for \"" << i->second->getName() << "\"!");
return false;
}
i->second->_setRTIObjectClass(rtiObjectClass);
} }
return true; return true;
} }
const HLADataType*
HLAFederate::getDataType(const std::string& name) const
{
DataTypeMap::const_iterator i = _dataTypeMap.find(name);
if (i == _dataTypeMap.end())
return 0;
return i->second.get();
}
bool
HLAFederate::insertDataType(const std::string& name, const SGSharedPtr<HLADataType>& dataType)
{
if (!dataType.valid())
return false;
if (_dataTypeMap.find(name) != _dataTypeMap.end()) {
SG_LOG(SG_IO, SG_ALERT, "HLAFederate::insertDataType: data type with name \""
<< name << "\" already known to federate!");
return false;
}
_dataTypeMap.insert(DataTypeMap::value_type(name, dataType));
return true;
}
void
HLAFederate::recomputeDataTypeAlignment()
{
// Finish alignment computations
bool changed;
do {
changed = false;
for (DataTypeMap::iterator i = _dataTypeMap.begin(); i != _dataTypeMap.end(); ++i) {
if (i->second->recomputeAlignment())
changed = true;
}
} while (changed);
}
HLAInteractionClass*
HLAFederate::getInteractionClass(const std::string& name)
{
InteractionClassMap::const_iterator i = _interactionClassMap.find(name);
if (i == _interactionClassMap.end())
return 0;
return i->second.get();
}
const HLAInteractionClass*
HLAFederate::getInteractionClass(const std::string& name) const
{
InteractionClassMap::const_iterator i = _interactionClassMap.find(name);
if (i == _interactionClassMap.end())
return 0;
return i->second.get();
}
HLAInteractionClass*
HLAFederate::createInteractionClass(const std::string& name)
{
return new HLAInteractionClass(name, this);
}
HLAObjectClass* HLAObjectClass*
HLAFederate::getObjectClass(const std::string& name) HLAFederate::getObjectClass(const std::string& name)
{ {
@@ -981,36 +849,24 @@ HLAFederate::getObjectClass(const std::string& name) const
return i->second.get(); return i->second.get();
} }
HLAObjectClass* HLAInteractionClass*
HLAFederate::createObjectClass(const std::string& name) HLAFederate::getInteractionClass(const std::string& name)
{ {
return new HLAObjectClass(name, this); InteractionClassMap::const_iterator i = _interactionClassMap.find(name);
} if (i == _interactionClassMap.end())
HLAObjectInstance*
HLAFederate::getObjectInstance(const std::string& name)
{
ObjectInstanceMap::const_iterator i = _objectInstanceMap.find(name);
if (i == _objectInstanceMap.end())
return 0; return 0;
return i->second.get(); return i->second.get();
} }
const HLAObjectInstance* const HLAInteractionClass*
HLAFederate::getObjectInstance(const std::string& name) const HLAFederate::getInteractionClass(const std::string& name) const
{ {
ObjectInstanceMap::const_iterator i = _objectInstanceMap.find(name); InteractionClassMap::const_iterator i = _interactionClassMap.find(name);
if (i == _objectInstanceMap.end()) if (i == _interactionClassMap.end())
return 0; return 0;
return i->second.get(); return i->second.get();
} }
HLAObjectInstance*
HLAFederate::createObjectInstance(HLAObjectClass* objectClass, const std::string& name)
{
return new HLAObjectInstance(objectClass);
}
void void
HLAFederate::setDone(bool done) HLAFederate::setDone(bool done)
{ {
@@ -1026,62 +882,22 @@ HLAFederate::getDone() const
bool bool
HLAFederate::readObjectModel() HLAFederate::readObjectModel()
{ {
// Depending on the actual version, try to find an apropriate /// Currently empty, but is called at the right time so that
// file format for the given file. The first one is always the /// the object model is present when it is needed
// version native object model file format. return true;
switch (getVersion()) {
case RTI13:
if (readRTI13ObjectModelTemplate(getFederationObjectModel()))
return true;
if (readRTI1516ObjectModelTemplate(getFederationObjectModel()))
return true;
return readRTI1516EObjectModelTemplate(getFederationObjectModel());
case RTI1516:
if (readRTI1516ObjectModelTemplate(getFederationObjectModel()))
return true;
if (readRTI1516EObjectModelTemplate(getFederationObjectModel()))
return true;
return readRTI13ObjectModelTemplate(getFederationObjectModel());
case RTI1516E:
if (readRTI1516EObjectModelTemplate(getFederationObjectModel()))
return true;
if (readRTI1516ObjectModelTemplate(getFederationObjectModel()))
return true;
return readRTI13ObjectModelTemplate(getFederationObjectModel());
default:
return false;
}
} }
bool bool
HLAFederate::subscribe() HLAFederate::subscribe()
{ {
for (InteractionClassMap::iterator i = _interactionClassMap.begin(); i != _interactionClassMap.end(); ++i) { /// Currently empty, but is called at the right time
if (!i->second->subscribe())
return false;
}
for (ObjectClassMap::iterator i = _objectClassMap.begin(); i != _objectClassMap.end(); ++i) {
if (!i->second->subscribe())
return false;
}
return true; return true;
} }
bool bool
HLAFederate::publish() HLAFederate::publish()
{ {
for (InteractionClassMap::iterator i = _interactionClassMap.begin(); i != _interactionClassMap.end(); ++i) { /// Currently empty, but is called at the right time
if (!i->second->publish())
return false;
}
for (ObjectClassMap::iterator i = _objectClassMap.begin(); i != _objectClassMap.end(); ++i) {
if (!i->second->publish())
return false;
}
return true; return true;
} }
@@ -1193,75 +1009,4 @@ HLAFederate::exec()
return true; return true;
} }
void
HLAFederate::_clearRTI()
{
for (InteractionClassMap::iterator i = _interactionClassMap.begin(); i != _interactionClassMap.end(); ++i)
i->second->_clearRTIInteractionClass();
for (ObjectInstanceMap::iterator i = _objectInstanceMap.begin(); i != _objectInstanceMap.end(); ++i)
i->second->_clearRTIObjectInstance();
for (ObjectClassMap::iterator i = _objectClassMap.begin(); i != _objectClassMap.end(); ++i)
i->second->_clearRTIObjectClass();
_rtiFederate = 0;
}
bool
HLAFederate::_insertInteractionClass(const SGSharedPtr<HLAInteractionClass>& interactionClass)
{
if (!interactionClass.valid())
return false;
if (_interactionClassMap.find(interactionClass->getName()) != _interactionClassMap.end()) {
SG_LOG(SG_IO, SG_ALERT, "HLA: _insertInteractionClass: object instance with name \""
<< interactionClass->getName() << "\" already known to federate!");
return false;
}
_interactionClassMap.insert(InteractionClassMap::value_type(interactionClass->getName(), interactionClass));
return true;
}
bool
HLAFederate::_insertObjectClass(const SGSharedPtr<HLAObjectClass>& objectClass)
{
if (!objectClass.valid())
return false;
if (_objectClassMap.find(objectClass->getName()) != _objectClassMap.end()) {
SG_LOG(SG_IO, SG_ALERT, "HLA: _insertObjectClass: object instance with name \""
<< objectClass->getName() << "\" already known to federate!");
return false;
}
_objectClassMap.insert(ObjectClassMap::value_type(objectClass->getName(), objectClass));
return true;
}
bool
HLAFederate::_insertObjectInstance(const SGSharedPtr<HLAObjectInstance>& objectInstance)
{
if (!objectInstance.valid())
return false;
if (objectInstance->getName().empty()) {
SG_LOG(SG_IO, SG_ALERT, "HLA: _insertObjectInstance: trying to insert object instance with empty name!");
return false;
}
if (_objectInstanceMap.find(objectInstance->getName()) != _objectInstanceMap.end()) {
SG_LOG(SG_IO, SG_WARN, "HLA: _insertObjectInstance: object instance with name \""
<< objectInstance->getName() << "\" already known to federate!");
return false;
}
_objectInstanceMap.insert(ObjectInstanceMap::value_type(objectInstance->getName(), objectInstance));
return true;
}
void
HLAFederate::_eraseObjectInstance(const std::string& name)
{
ObjectInstanceMap::iterator i = _objectInstanceMap.find(name);
if (i == _objectInstanceMap.end()) {
SG_LOG(SG_IO, SG_WARN, "HLA: _eraseObjectInstance: object instance with name \""
<< name << "\" not known to federate!");
return;
}
_objectInstanceMap.erase(i);
}
} // namespace simgear } // namespace simgear
+9 -67
View File
@@ -1,4 +1,4 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de // Copyright (C) 2009 - 2011 Mathias Froehlich - Mathias.Froehlich@web.de
// //
// This library is free software; you can redistribute it and/or // This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public // modify it under the terms of the GNU Library General Public
@@ -44,7 +44,6 @@ public:
/// The rti version backend to connect /// The rti version backend to connect
Version getVersion() const; Version getVersion() const;
bool setVersion(HLAFederate::Version version); bool setVersion(HLAFederate::Version version);
bool setVersion(const std::string& version);
/// The rti backends connect arguments, depends on the version /// The rti backends connect arguments, depends on the version
const std::list<std::string>& getConnectArguments() const; const std::list<std::string>& getConnectArguments() const;
@@ -162,7 +161,7 @@ public:
/// a pending time advance is granted. /// a pending time advance is granted.
bool processMessages(); bool processMessages();
/// Legacy tick call - deprecated /// Legacy tick call
bool tick(const double& minimum, const double& maximum); bool tick(const double& minimum, const double& maximum);
class ObjectModelFactory { class ObjectModelFactory {
@@ -171,7 +170,7 @@ public:
{ } { }
virtual HLAObjectClass* createObjectClass(const std::string& name, HLAFederate& federate) virtual HLAObjectClass* createObjectClass(const std::string& name, HLAFederate& federate)
{ return federate.createObjectClass(name); } { return new HLAObjectClass(name, federate); }
virtual bool subscribeObjectClass(const std::string& objectClassName, const std::string& sharing) virtual bool subscribeObjectClass(const std::string& objectClassName, const std::string& sharing)
{ return sharing.find("Subscribe") != std::string::npos; } { return sharing.find("Subscribe") != std::string::npos; }
virtual bool publishObjectClass(const std::string& objectClassName, const std::string& sharing) virtual bool publishObjectClass(const std::string& objectClassName, const std::string& sharing)
@@ -183,56 +182,22 @@ public:
}; };
/// Read an omt xml file - deprecated /// Read an omt xml file
bool readObjectModelTemplate(const std::string& objectModel, bool readObjectModelTemplate(const std::string& objectModel,
ObjectModelFactory& objectModelFactory); ObjectModelFactory& objectModelFactory);
/// Read an rti1.3 omt xml file
bool readRTI13ObjectModelTemplate(const std::string& objectModel);
/// Read an rti1516 omt xml file
bool readRTI1516ObjectModelTemplate(const std::string& objectModel);
/// Read an rti1516e omt xml file
bool readRTI1516EObjectModelTemplate(const std::string& objectModel);
/// Is called past a successful join to populate the rti classes
bool resolveObjectModel();
/// Access data types
const HLADataType* getDataType(const std::string& name) const;
// virtual const HLADataType* createDataType(const std::string& name);
bool insertDataType(const std::string& name, const SGSharedPtr<HLADataType>& dataType);
void recomputeDataTypeAlignment();
/// Get the interaction class of a given name
HLAInteractionClass* getInteractionClass(const std::string& name);
const HLAInteractionClass* getInteractionClass(const std::string& name) const;
/// Default create function. Creates a default interaction class
virtual HLAInteractionClass* createInteractionClass(const std::string& name);
/// Get the object class of a given name /// Get the object class of a given name
HLAObjectClass* getObjectClass(const std::string& name); HLAObjectClass* getObjectClass(const std::string& name);
const HLAObjectClass* getObjectClass(const std::string& name) const; const HLAObjectClass* getObjectClass(const std::string& name) const;
/// Default create function. Creates a default object class
virtual HLAObjectClass* createObjectClass(const std::string& name);
/// Get the object instance of a given name /// Get the interaction class of a given name
HLAObjectInstance* getObjectInstance(const std::string& name); HLAInteractionClass* getInteractionClass(const std::string& name);
const HLAObjectInstance* getObjectInstance(const std::string& name) const; const HLAInteractionClass* getInteractionClass(const std::string& name) const;
virtual HLAObjectInstance* createObjectInstance(HLAObjectClass* objectClass, const std::string& name);
/// Tells the main exec loop to continue or not. /// Tells the main exec loop to continue or not.
void setDone(bool done); void setDone(bool done);
bool getDone() const; bool getDone() const;
/// The user overridable slot that is called to set up an object model
/// By default, depending on the set up rti version, the apropriate
/// bool read{RTI13,RTI1516,RTI1516E}ObjectModelTemplate(const std::string& objectModel);
/// method is called.
/// Note that the RTI13 files do not contain any information about the data types.
/// A user needs to set up the data types and assign them to the object classes/
/// interaction classes theirselves.
/// Past reading the object model, it is still possible to change the subscription/publication
/// types without introducing traffic on the backend rti.
virtual bool readObjectModel(); virtual bool readObjectModel();
virtual bool subscribe(); virtual bool subscribe();
@@ -248,16 +213,6 @@ private:
HLAFederate(const HLAFederate&); HLAFederate(const HLAFederate&);
HLAFederate& operator=(const HLAFederate&); HLAFederate& operator=(const HLAFederate&);
void _clearRTI();
/// Internal helpers for interaction classes
bool _insertInteractionClass(const SGSharedPtr<HLAInteractionClass>& interactionClass);
/// Internal helpers for object classes
bool _insertObjectClass(const SGSharedPtr<HLAObjectClass>& objectClass);
/// Internal helpers for object instances
bool _insertObjectInstance(const SGSharedPtr<HLAObjectInstance>& objectInstance);
void _eraseObjectInstance(const std::string& name);
/// The underlying interface to the rti implementation /// The underlying interface to the rti implementation
SGSharedPtr<RTIFederate> _rtiFederate; SGSharedPtr<RTIFederate> _rtiFederate;
@@ -292,27 +247,14 @@ private:
/// If true the exec method returns. /// If true the exec method returns.
bool _done; bool _done;
/// The Data Types by name
typedef std::map<std::string, SGSharedPtr<HLADataType> > DataTypeMap;
DataTypeMap _dataTypeMap;
/// The Interaction Classes by name
typedef std::map<std::string, SGSharedPtr<HLAInteractionClass> > InteractionClassMap;
InteractionClassMap _interactionClassMap;
/// The Object Classes by name
typedef std::map<std::string, SGSharedPtr<HLAObjectClass> > ObjectClassMap; typedef std::map<std::string, SGSharedPtr<HLAObjectClass> > ObjectClassMap;
ObjectClassMap _objectClassMap; ObjectClassMap _objectClassMap;
/// The Object Instances by name typedef std::map<std::string, SGSharedPtr<HLAInteractionClass> > InteractionClassMap;
typedef std::map<std::string, SGSharedPtr<HLAObjectInstance> > ObjectInstanceMap; InteractionClassMap _interactionClassMap;
ObjectInstanceMap _objectInstanceMap;
/// The Object Instances by name, the ones that have an explicit given name, may be not yet registered
// ObjectInstanceMap _explicitNamedObjectInstanceMap;
friend class HLAInteractionClass; friend class HLAInteractionClass;
friend class HLAObjectClass; friend class HLAObjectClass;
friend class HLAObjectInstance;
}; };
} // namespace simgear } // namespace simgear
+1 -24
View File
@@ -1,4 +1,4 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de // Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
// //
// This library is free software; you can redistribute it and/or // This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public // modify it under the terms of the GNU Library General Public
@@ -15,12 +15,6 @@
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
// //
#ifdef HAVE_CONFIG_H
# include <simgear_config.h>
#endif
#include <simgear/compiler.h>
#include "HLAFixedRecordDataElement.hxx" #include "HLAFixedRecordDataElement.hxx"
#include <string> #include <string>
@@ -126,7 +120,6 @@ HLAFixedRecordDataElement::HLAFixedRecordDataElement(const HLAFixedRecordDataTyp
HLAFixedRecordDataElement::~HLAFixedRecordDataElement() HLAFixedRecordDataElement::~HLAFixedRecordDataElement()
{ {
clearStamp();
} }
bool bool
@@ -188,12 +181,7 @@ HLAFixedRecordDataElement::setField(unsigned index, HLADataElement* value)
{ {
if (getNumFields() <= index) if (getNumFields() <= index)
return; return;
if (_fieldVector[index].valid())
_fieldVector[index]->clearStamp();
_fieldVector[index] = value; _fieldVector[index] = value;
if (value)
value->attachStamp(*this);
setDirty(true);
} }
void void
@@ -202,15 +190,4 @@ HLAFixedRecordDataElement::setField(const std::string& name, HLADataElement* val
setField(getFieldNumber(name), value); setField(getFieldNumber(name), value);
} }
void
HLAFixedRecordDataElement::_setStamp(Stamp* stamp)
{
HLAAbstractFixedRecordDataElement::_setStamp(stamp);
for (FieldVector::iterator i = _fieldVector.begin(); i != _fieldVector.end(); ++i) {
if (!i->valid())
continue;
(*i)->attachStamp(*this);
}
}
} }
@@ -70,9 +70,6 @@ public:
void setField(unsigned index, HLADataElement* value); void setField(unsigned index, HLADataElement* value);
void setField(const std::string& name, HLADataElement* value); void setField(const std::string& name, HLADataElement* value);
protected:
virtual void _setStamp(Stamp* stamp);
private: private:
typedef std::vector<SGSharedPtr<HLADataElement> > FieldVector; typedef std::vector<SGSharedPtr<HLADataElement> > FieldVector;
FieldVector _fieldVector; FieldVector _fieldVector;
+4 -26
View File
@@ -1,4 +1,4 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de // Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
// //
// This library is free software; you can redistribute it and/or // This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public // modify it under the terms of the GNU Library General Public
@@ -15,12 +15,6 @@
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
// //
#ifdef HAVE_CONFIG_H
# include <simgear_config.h>
#endif
#include <simgear/compiler.h>
#include "HLAFixedRecordDataType.hxx" #include "HLAFixedRecordDataType.hxx"
#include "HLADataTypeVisitor.hxx" #include "HLADataTypeVisitor.hxx"
@@ -49,14 +43,6 @@ HLAFixedRecordDataType::toFixedRecordDataType() const
return this; return this;
} }
void
HLAFixedRecordDataType::releaseDataTypeReferences()
{
unsigned numFields = getNumFields();
for (unsigned i = 0; i < numFields; ++i)
_fieldList[i].releaseDataTypeReferences();
}
bool bool
HLAFixedRecordDataType::decode(HLADecodeStream& stream, HLAAbstractFixedRecordDataElement& value) const HLAFixedRecordDataType::decode(HLADecodeStream& stream, HLAAbstractFixedRecordDataElement& value) const
{ {
@@ -82,18 +68,10 @@ HLAFixedRecordDataType::encode(HLAEncodeStream& stream, const HLAAbstractFixedRe
void void
HLAFixedRecordDataType::addField(const std::string& name, const HLADataType* dataType) HLAFixedRecordDataType::addField(const std::string& name, const HLADataType* dataType)
{ {
// FIXME this only works if we do not reset the alignment to something smaller
if (getAlignment() < dataType->getAlignment())
setAlignment(dataType->getAlignment());
_fieldList.push_back(Field(name, dataType)); _fieldList.push_back(Field(name, dataType));
} }
void
HLAFixedRecordDataType::_recomputeAlignmentImplementation()
{
unsigned alignment = 1;
for (unsigned i = 0; i < getNumFields(); ++i) {
if (const HLADataType* dataType = getFieldDataType(i))
alignment = std::max(alignment, dataType->getAlignment());
}
setAlignment(alignment);
}
} // namespace simgear } // namespace simgear
+1 -8
View File
@@ -1,4 +1,4 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de // Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
// //
// This library is free software; you can redistribute it and/or // This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public // modify it under the terms of the GNU Library General Public
@@ -36,8 +36,6 @@ public:
virtual const HLAFixedRecordDataType* toFixedRecordDataType() const; virtual const HLAFixedRecordDataType* toFixedRecordDataType() const;
virtual void releaseDataTypeReferences();
virtual bool decode(HLADecodeStream& stream, HLAAbstractFixedRecordDataElement& value) const; virtual bool decode(HLADecodeStream& stream, HLAAbstractFixedRecordDataElement& value) const;
virtual bool encode(HLAEncodeStream& stream, const HLAAbstractFixedRecordDataElement& value) const; virtual bool encode(HLAEncodeStream& stream, const HLAAbstractFixedRecordDataElement& value) const;
@@ -69,9 +67,6 @@ public:
void addField(const std::string& name, const HLADataType* dataType); void addField(const std::string& name, const HLADataType* dataType);
protected:
virtual void _recomputeAlignmentImplementation();
private: private:
struct Field { struct Field {
Field(const std::string& name, const HLADataType* dataType) : Field(const std::string& name, const HLADataType* dataType) :
@@ -81,8 +76,6 @@ private:
const HLADataType* getDataType() const const HLADataType* getDataType() const
{ return _dataType.get(); } { return _dataType.get(); }
void releaseDataTypeReferences()
{ _dataType = 0; }
private: private:
std::string _name; std::string _name;
-251
View File
@@ -1,251 +0,0 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Library General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
#ifdef HAVE_CONFIG_H
# include <simgear_config.h>
#endif
#include <simgear/compiler.h>
#include "HLAInteractionClass.hxx"
#include <simgear/debug/logstream.hxx>
#include "HLADataElement.hxx"
#include "HLAFederate.hxx"
#include "RTIInteractionClass.hxx"
namespace simgear {
HLAInteractionClass::HLAInteractionClass(const std::string& name, HLAFederate* federate) :
_federate(federate),
_rtiInteractionClass(0),
_name(name),
_subscriptionType(HLAUnsubscribed),
_publicationType(HLAUnpublished)
{
if (!federate) {
SG_LOG(SG_NETWORK, SG_ALERT, "HLAInteractionClass::HLAInteractionClass(): "
"No parent federate given for interaction class \"" << getName() << "\"!");
return;
}
federate->_insertInteractionClass(this);
}
HLAInteractionClass::~HLAInteractionClass()
{
// HLAInteractionClass objects only get deleted when the parent federate
// dies. So we do not need to deregister there.
_clearRTIInteractionClass();
}
const std::string&
HLAInteractionClass::getName() const
{
return _name;
}
const SGWeakPtr<HLAFederate>&
HLAInteractionClass::getFederate() const
{
return _federate;
}
HLASubscriptionType
HLAInteractionClass::getSubscriptionType() const
{
return _subscriptionType;
}
void
HLAInteractionClass::setSubscriptionType(HLASubscriptionType subscriptionType)
{
_subscriptionType = subscriptionType;
}
HLAPublicationType
HLAInteractionClass::getPublicationType() const
{
return _publicationType;
}
void
HLAInteractionClass::setPublicationType(HLAPublicationType publicationType)
{
_publicationType = publicationType;
}
unsigned
HLAInteractionClass::getNumParameters() const
{
return _parameterVector.size();
}
unsigned
HLAInteractionClass::addParameter(const std::string& name)
{
unsigned index = _parameterVector.size();
_nameIndexMap[name] = index;
_parameterVector.push_back(Parameter(name));
_resolveParameterIndex(name, index);
return index;
}
unsigned
HLAInteractionClass::getParameterIndex(const std::string& name) const
{
NameIndexMap::const_iterator i = _nameIndexMap.find(name);
if (i == _nameIndexMap.end())
return ~0u;
return i->second;
}
std::string
HLAInteractionClass::getParameterName(unsigned index) const
{
if (_parameterVector.size() <= index)
return std::string();
return _parameterVector[index]._name;
}
const HLADataType*
HLAInteractionClass::getParameterDataType(unsigned index) const
{
if (_parameterVector.size() <= index)
return 0;
return _parameterVector[index]._dataType.get();
}
void
HLAInteractionClass::setParameterDataType(unsigned index, const SGSharedPtr<const HLADataType>& dataType)
{
if (_parameterVector.size() <= index)
return;
_parameterVector[index]._dataType = dataType;
}
HLADataElement::IndexPathPair
HLAInteractionClass::getIndexPathPair(const HLADataElement::StringPathPair& stringPathPair) const
{
unsigned index = getParameterIndex(stringPathPair.first);
if (getNumParameters() <= index) {
SG_LOG(SG_NETWORK, SG_ALERT, "HLAInteractionClass::getIndexPathPair(\""
<< HLADataElement::toString(stringPathPair)
<< "\"): Could not resolve attribute \"" << stringPathPair.first
<< "\" for interaction class \"" << getName() << "\"!");
}
return HLADataElement::IndexPathPair(index, stringPathPair.second);
}
HLADataElement::IndexPathPair
HLAInteractionClass::getIndexPathPair(const std::string& path) const
{
return getIndexPathPair(HLADataElement::toStringPathPair(path));
}
bool
HLAInteractionClass::subscribe()
{
if (!_rtiInteractionClass) {
SG_LOG(SG_NETWORK, SG_WARN, "HLAInteractionClass::subscribe(): No RTIInteractionClass!");
return false;
}
switch (_subscriptionType) {
case HLAUnsubscribed:
return _rtiInteractionClass->unsubscribe();
case HLASubscribedActive:
return _rtiInteractionClass->subscribe(true);
case HLASubscribedPassive:
return _rtiInteractionClass->subscribe(false);
}
return false;
}
bool
HLAInteractionClass::unsubscribe()
{
if (!_rtiInteractionClass) {
SG_LOG(SG_NETWORK, SG_WARN, "HLAInteractionClass::unsubscribe(): No RTIInteractionClass!");
return false;
}
return _rtiInteractionClass->unsubscribe();
}
bool
HLAInteractionClass::publish()
{
if (!_rtiInteractionClass) {
SG_LOG(SG_NETWORK, SG_WARN, "HLAInteractionClass::publish(): No RTIInteractionClass\"!");
return false;
}
switch (_publicationType) {
case HLAUnpublished:
return _rtiInteractionClass->unpublish();
case HLAPublished:
return _rtiInteractionClass->publish();
}
return false;
}
bool
HLAInteractionClass::unpublish()
{
if (!_rtiInteractionClass) {
SG_LOG(SG_NETWORK, SG_WARN, "HLAInteractionClass::unpublish(): No RTIInteractionClass\"!");
return false;
}
return _rtiInteractionClass->unpublish();
}
void
HLAInteractionClass::_setRTIInteractionClass(RTIInteractionClass* interactionClass)
{
if (_rtiInteractionClass) {
SG_LOG(SG_NETWORK, SG_ALERT, "HLAInteractionClass: Setting RTIInteractionClass twice for interaction class \"" << getName() << "\"!");
return;
}
_rtiInteractionClass = interactionClass;
if (_rtiInteractionClass->_interactionClass != this) {
SG_LOG(SG_NETWORK, SG_ALERT, "HLAInteractionClass: backward reference does not match!");
return;
}
for (unsigned i = 0; i < _parameterVector.size(); ++i)
_resolveParameterIndex(_parameterVector[i]._name, i);
}
void
HLAInteractionClass::_resolveParameterIndex(const std::string& name, unsigned index)
{
if (!_rtiInteractionClass)
return;
if (!_rtiInteractionClass->resolveParameterIndex(name, index))
SG_LOG(SG_NETWORK, SG_ALERT, "HLAInteractionClass: Could not resolve parameter \""
<< name << "\" for interaction class \"" << getName() << "\"!");
}
void
HLAInteractionClass::_clearRTIInteractionClass()
{
if (!_rtiInteractionClass)
return;
_rtiInteractionClass->_interactionClass = 0;
_rtiInteractionClass = 0;
}
} // namespace simgear
+2 -77
View File
@@ -1,4 +1,4 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de // Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
// //
// This library is free software; you can redistribute it and/or // This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public // modify it under the terms of the GNU Library General Public
@@ -18,92 +18,17 @@
#ifndef HLAInteractionClass_hxx #ifndef HLAInteractionClass_hxx
#define HLAInteractionClass_hxx #define HLAInteractionClass_hxx
#include <map>
#include <string>
#include <vector>
#include <simgear/structure/SGWeakReferenced.hxx>
#include "HLADataElement.hxx"
#include "HLADataType.hxx"
#include "HLATypes.hxx"
namespace simgear { namespace simgear {
class RTIInteractionClass; class RTIInteractionClass;
class HLADataType;
class HLAFederate;
class HLAInteractionClass : public SGWeakReferenced { class HLAInteractionClass : public SGWeakReferenced {
public: public:
HLAInteractionClass(const std::string& name, HLAFederate* federate); virtual ~HLAInteractionClass() {}
virtual ~HLAInteractionClass();
const std::string& getName() const;
/// return the federate this interaction class belongs to
const SGWeakPtr<HLAFederate>& getFederate() const;
HLASubscriptionType getSubscriptionType() const;
void setSubscriptionType(HLASubscriptionType subscriptionType);
HLAPublicationType getPublicationType() const;
void setPublicationType(HLAPublicationType publicationType);
unsigned getNumParameters() const;
unsigned addParameter(const std::string& name);
unsigned getParameterIndex(const std::string& name) const;
std::string getParameterName(unsigned index) const;
const HLADataType* getParameterDataType(unsigned index) const;
void setParameterDataType(unsigned index, const SGSharedPtr<const HLADataType>& dataType);
HLADataElement::IndexPathPair getIndexPathPair(const HLADataElement::StringPathPair& stringPathPair) const;
HLADataElement::IndexPathPair getIndexPathPair(const std::string& path) const;
virtual bool subscribe();
virtual bool unsubscribe();
virtual bool publish();
virtual bool unpublish();
private: private:
HLAInteractionClass(const HLAInteractionClass&); HLAInteractionClass(const HLAInteractionClass&);
HLAInteractionClass& operator=(const HLAInteractionClass&); HLAInteractionClass& operator=(const HLAInteractionClass&);
void _setRTIInteractionClass(RTIInteractionClass* interactionClass);
void _resolveParameterIndex(const std::string& name, unsigned index);
void _clearRTIInteractionClass();
struct Parameter {
Parameter() {}
Parameter(const std::string& name) : _name(name) {}
std::string _name;
SGSharedPtr<const HLADataType> _dataType;
};
typedef std::vector<Parameter> ParameterVector;
typedef std::map<std::string,unsigned> NameIndexMap;
/// The parent federate.
SGWeakPtr<HLAFederate> _federate;
/// The rti class if already instantiated.
RTIInteractionClass* _rtiInteractionClass;
/// The interaction class name
std::string _name;
/// The configured subscription and publication type
HLASubscriptionType _subscriptionType;
HLAPublicationType _publicationType;
/// The parameter data
ParameterVector _parameterVector;
/// The mapping from parameter names to parameter indices
NameIndexMap _nameIndexMap;
friend class HLAFederate;
}; };
} // namespace simgear } // namespace simgear
+141 -131
View File
@@ -1,4 +1,4 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de // Copyright (C) 2009 - 2011 Mathias Froehlich - Mathias.Froehlich@web.de
// //
// This library is free software; you can redistribute it and/or // This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public // modify it under the terms of the GNU Library General Public
@@ -15,12 +15,6 @@
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
// //
#ifdef HAVE_CONFIG_H
# include <simgear_config.h>
#endif
#include <simgear/compiler.h>
#include "HLAOMTXmlVisitor.hxx" #include "HLAOMTXmlVisitor.hxx"
#include <map> #include <map>
@@ -33,9 +27,8 @@
#include "HLABasicDataType.hxx" #include "HLABasicDataType.hxx"
#include "HLADataTypeVisitor.hxx" #include "HLADataTypeVisitor.hxx"
#include "HLAEnumeratedDataType.hxx" #include "HLAEnumeratedDataType.hxx"
#include "HLAFederate.hxx"
#include "HLAFixedRecordDataType.hxx" #include "HLAFixedRecordDataType.hxx"
#include "HLAVariantRecordDataType.hxx" #include "HLAVariantDataType.hxx"
namespace simgear { namespace simgear {
@@ -75,6 +68,18 @@ HLAOMTXmlVisitor::ObjectClass::getAttribute(unsigned index) const
return _attributes[index]; return _attributes[index];
} }
const HLAOMTXmlVisitor::Attribute*
HLAOMTXmlVisitor::ObjectClass::getAttribute(const std::string& name) const
{
for (AttributeList::const_iterator i = _attributes.begin(); i != _attributes.end(); ++i) {
if ((*i)->_name != name)
continue;
return i->get();
}
SG_LOG(SG_IO, SG_ALERT, "Could not find class attribute \"" << name << "\".");
return 0;
}
const HLAOMTXmlVisitor::ObjectClass* const HLAOMTXmlVisitor::ObjectClass*
HLAOMTXmlVisitor::ObjectClass::getParentObjectClass() const HLAOMTXmlVisitor::ObjectClass::getParentObjectClass() const
{ {
@@ -102,12 +107,6 @@ HLAOMTXmlVisitor::InteractionClass::getDimensions() const
return _dimensions; return _dimensions;
} }
const std::string&
HLAOMTXmlVisitor::InteractionClass::getSharing() const
{
return _sharing;
}
const std::string& const std::string&
HLAOMTXmlVisitor::InteractionClass::getTransportation() const HLAOMTXmlVisitor::InteractionClass::getTransportation() const
{ {
@@ -134,6 +133,18 @@ HLAOMTXmlVisitor::InteractionClass::getParameter(unsigned index) const
return _parameters[index]; return _parameters[index];
} }
const HLAOMTXmlVisitor::Parameter*
HLAOMTXmlVisitor::InteractionClass::getParameter(const std::string& name) const
{
for (ParameterList::const_iterator i = _parameters.begin(); i != _parameters.end(); ++i) {
if ((*i)->_name != name)
continue;
return i->get();
}
SG_LOG(SG_IO, SG_ALERT, "Could not find parameter \"" << name << "\".");
return 0;
}
const HLAOMTXmlVisitor::InteractionClass* const HLAOMTXmlVisitor::InteractionClass*
HLAOMTXmlVisitor::InteractionClass::getParentInteractionClass() const HLAOMTXmlVisitor::InteractionClass::getParentInteractionClass() const
{ {
@@ -148,81 +159,6 @@ HLAOMTXmlVisitor::~HLAOMTXmlVisitor()
{ {
} }
void
HLAOMTXmlVisitor::setDataTypesToFederate(HLAFederate& federate)
{
// Provide all the data types
for (BasicDataMap::iterator i = _basicDataMap.begin(); i != _basicDataMap.end(); ++i)
federate.insertDataType(i->first, getDataType(i->first));
for (SimpleDataMap::iterator i = _simpleDataMap.begin(); i != _simpleDataMap.end(); ++i)
federate.insertDataType(i->first, getDataType(i->first));
for (EnumeratedDataMap::iterator i = _enumeratedDataMap.begin(); i != _enumeratedDataMap.end(); ++i)
federate.insertDataType(i->first, getDataType(i->first));
for (ArrayDataMap::iterator i = _arrayDataMap.begin(); i != _arrayDataMap.end(); ++i)
federate.insertDataType(i->first, getDataType(i->first));
for (FixedRecordDataMap::iterator i = _fixedRecordDataMap.begin(); i != _fixedRecordDataMap.end(); ++i)
federate.insertDataType(i->first, getDataType(i->first));
for (VariantRecordDataMap::iterator i = _variantRecordDataMap.begin(); i != _variantRecordDataMap.end(); ++i)
federate.insertDataType(i->first, getDataType(i->first));
// Finish alignment computations
federate.recomputeDataTypeAlignment();
}
void
HLAOMTXmlVisitor::setToFederate(HLAFederate& federate)
{
setDataTypesToFederate(federate);
// Provide all interaction classes
unsigned numInteractionClasses = getNumInteractionClasses();
for (unsigned i = 0; i < numInteractionClasses; ++i) {
const InteractionClass* interactionClass = getInteractionClass(i);
SGSharedPtr<HLAInteractionClass> hlaInteractionClass;
hlaInteractionClass = federate.createInteractionClass(interactionClass->getName());
if (!hlaInteractionClass.valid()) {
SG_LOG(SG_IO, SG_INFO, "Ignoring Interaction class \"" << interactionClass->getName() << "\".");
continue;
}
hlaInteractionClass->setSubscriptionType(interactionClass->getSubscriptionType());
hlaInteractionClass->setPublicationType(interactionClass->getPublicationType());
// process the parameters
for (unsigned j = 0; j < interactionClass->getNumParameters(); ++j) {
const Parameter* parameter = interactionClass->getParameter(j);
unsigned index = hlaInteractionClass->addParameter(parameter->getName());
hlaInteractionClass->setParameterDataType(index, federate.getDataType(parameter->getDataType()));
}
}
// Provide all object classes
unsigned numObjectClasses = getNumObjectClasses();
for (unsigned i = 0; i < numObjectClasses; ++i) {
const ObjectClass* objectClass = getObjectClass(i);
SGSharedPtr<HLAObjectClass> hlaObjectClass;
hlaObjectClass = federate.createObjectClass(objectClass->getName());
if (!hlaObjectClass.valid()) {
SG_LOG(SG_IO, SG_INFO, "Ignoring Object class \"" << objectClass->getName() << "\".");
continue;
}
// process the attributes
for (unsigned j = 0; j < objectClass->getNumAttributes(); ++j) {
const Attribute* attribute = objectClass->getAttribute(j);
unsigned index = hlaObjectClass->addAttribute(attribute->getName());
hlaObjectClass->setAttributeDataType(index, federate.getDataType(attribute->getDataType()));
hlaObjectClass->setAttributeSubscriptionType(index, attribute->getSubscriptionType());
hlaObjectClass->setAttributePublicationType(index, attribute->getPublicationType());
hlaObjectClass->setAttributeUpdateType(index, attribute->getUpdateType());
}
}
}
unsigned unsigned
HLAOMTXmlVisitor::getNumObjectClasses() const HLAOMTXmlVisitor::getNumObjectClasses() const
{ {
@@ -237,6 +173,36 @@ HLAOMTXmlVisitor::getObjectClass(unsigned i) const
return _objectClassList[i]; return _objectClassList[i];
} }
const HLAOMTXmlVisitor::ObjectClass*
HLAOMTXmlVisitor::getObjectClass(const std::string& name) const
{
for (ObjectClassList::const_iterator i = _objectClassList.begin(); i != _objectClassList.end(); ++i) {
if ((*i)->_name != name)
continue;
return i->get();
}
SG_LOG(SG_IO, SG_ALERT, "Could not resolve ObjectClass \"" << name << "\".");
return 0;
}
const HLAOMTXmlVisitor::Attribute*
HLAOMTXmlVisitor::getAttribute(const std::string& objectClassName, const std::string& attributeName) const
{
const ObjectClass* objectClass = getObjectClass(objectClassName);
if (!objectClass)
return 0;
return objectClass->getAttribute(attributeName);
}
HLADataType*
HLAOMTXmlVisitor::getAttributeDataType(const std::string& objectClassName, const std::string& attributeName) const
{
const Attribute* attribute = getAttribute(objectClassName, attributeName);
if (!attribute)
return 0;
return getDataType(attribute->_dataType);
}
unsigned unsigned
HLAOMTXmlVisitor::getNumInteractionClasses() const HLAOMTXmlVisitor::getNumInteractionClasses() const
{ {
@@ -251,19 +217,59 @@ HLAOMTXmlVisitor::getInteractionClass(unsigned i) const
return _interactionClassList[i]; return _interactionClassList[i];
} }
SGSharedPtr<HLADataType> const HLAOMTXmlVisitor::InteractionClass*
HLAOMTXmlVisitor::getDataType(const std::string& dataTypeName) HLAOMTXmlVisitor::getInteractionClass(const std::string& name) const
{ {
StringDataTypeMap::const_iterator i = _dataTypeMap.find(dataTypeName); for (InteractionClassList::const_iterator i = _interactionClassList.begin(); i != _interactionClassList.end(); ++i) {
if (i != _dataTypeMap.end()) if ((*i)->_name != name)
return i->second; continue;
return i->get();
}
SG_LOG(SG_IO, SG_ALERT, "Could not resolve InteractionClass \"" << name << "\".");
return 0;
}
const HLAOMTXmlVisitor::Parameter*
HLAOMTXmlVisitor::getParameter(const std::string& interactionClassName, const std::string& parameterName) const
{
const InteractionClass* interactionClass = getInteractionClass(interactionClassName);
if (!interactionClass)
return 0;
return interactionClass->getParameter(parameterName);
}
HLADataType*
HLAOMTXmlVisitor::getParameterDataType(const std::string& interactionClassName, const std::string& parameterName) const
{
const Parameter* parameter = getParameter(interactionClassName, parameterName);
if (!parameter)
return 0;
return getDataType(parameter->_dataType);
}
HLADataType*
HLAOMTXmlVisitor::getDataType(const std::string& dataTypeName) const
{
SGSharedPtr<HLADataType> dataType;
{
// Playing dirty things with reference counts
StringDataTypeMap dataTypeMap;
dataType = getDataType(dataTypeName, dataTypeMap);
}
return dataType.release();
}
SGSharedPtr<HLADataType>
HLAOMTXmlVisitor::getDataType(const std::string& dataTypeName, HLAOMTXmlVisitor::StringDataTypeMap& dataTypeMap) const
{
StringDataTypeMap::const_iterator i = dataTypeMap.find(dataTypeName);
if (i != dataTypeMap.end())
return new HLADataTypeReference(i->second);
SGSharedPtr<HLADataType> dataType; SGSharedPtr<HLADataType> dataType;
dataType = getBasicDataType(dataTypeName); dataType = getBasicDataType(dataTypeName);
if (dataType.valid()) { if (dataType.valid())
_dataTypeMap[dataTypeName] = dataType;
return dataType; return dataType;
}
dataType = getSimpleDataType(dataTypeName); dataType = getSimpleDataType(dataTypeName);
if (dataType.valid()) if (dataType.valid())
@@ -273,15 +279,15 @@ HLAOMTXmlVisitor::getDataType(const std::string& dataTypeName)
if (dataType.valid()) if (dataType.valid())
return dataType; return dataType;
dataType = getArrayDataType(dataTypeName); dataType = getArrayDataType(dataTypeName, dataTypeMap);
if (dataType.valid()) if (dataType.valid())
return dataType; return dataType;
dataType = getFixedRecordDataType(dataTypeName); dataType = getFixedRecordDataType(dataTypeName, dataTypeMap);
if (dataType.valid()) if (dataType.valid())
return dataType; return dataType;
dataType = getVariantRecordDataType(dataTypeName); dataType = getVariantDataType(dataTypeName, dataTypeMap);
if (dataType.valid()) if (dataType.valid())
return dataType; return dataType;
@@ -290,7 +296,7 @@ HLAOMTXmlVisitor::getDataType(const std::string& dataTypeName)
} }
SGSharedPtr<HLABasicDataType> SGSharedPtr<HLABasicDataType>
HLAOMTXmlVisitor::getBasicDataType(const std::string& dataTypeName) HLAOMTXmlVisitor::getBasicDataType(const std::string& dataTypeName) const
{ {
BasicDataMap::const_iterator i = _basicDataMap.find(dataTypeName); BasicDataMap::const_iterator i = _basicDataMap.find(dataTypeName);
if (i == _basicDataMap.end()) if (i == _basicDataMap.end())
@@ -363,7 +369,7 @@ HLAOMTXmlVisitor::getBasicDataType(const std::string& dataTypeName)
} }
SGSharedPtr<HLADataType> SGSharedPtr<HLADataType>
HLAOMTXmlVisitor::getSimpleDataType(const std::string& dataTypeName) HLAOMTXmlVisitor::getSimpleDataType(const std::string& dataTypeName) const
{ {
SimpleDataMap::const_iterator i = _simpleDataMap.find(dataTypeName); SimpleDataMap::const_iterator i = _simpleDataMap.find(dataTypeName);
if (i == _simpleDataMap.end()) if (i == _simpleDataMap.end())
@@ -372,14 +378,13 @@ HLAOMTXmlVisitor::getSimpleDataType(const std::string& dataTypeName)
} }
SGSharedPtr<HLAEnumeratedDataType> SGSharedPtr<HLAEnumeratedDataType>
HLAOMTXmlVisitor::getEnumeratedDataType(const std::string& dataTypeName) HLAOMTXmlVisitor::getEnumeratedDataType(const std::string& dataTypeName) const
{ {
EnumeratedDataMap::const_iterator i = _enumeratedDataMap.find(dataTypeName); EnumeratedDataMap::const_iterator i = _enumeratedDataMap.find(dataTypeName);
if (i == _enumeratedDataMap.end()) if (i == _enumeratedDataMap.end())
return 0; return 0;
SGSharedPtr<HLAEnumeratedDataType> enumeratedDataType = new HLAEnumeratedDataType(dataTypeName); SGSharedPtr<HLAEnumeratedDataType> enumeratedDataType = new HLAEnumeratedDataType(dataTypeName);
_dataTypeMap[dataTypeName] = enumeratedDataType;
enumeratedDataType->setRepresentation(getBasicDataType(i->second._representation)); enumeratedDataType->setRepresentation(getBasicDataType(i->second._representation));
for (EnumeratorList::const_iterator j = i->second._enumeratorList.begin(); for (EnumeratorList::const_iterator j = i->second._enumeratorList.begin();
@@ -395,7 +400,7 @@ HLAOMTXmlVisitor::getEnumeratedDataType(const std::string& dataTypeName)
} }
SGSharedPtr<HLADataType> SGSharedPtr<HLADataType>
HLAOMTXmlVisitor::getArrayDataType(const std::string& dataTypeName) HLAOMTXmlVisitor::getArrayDataType(const std::string& dataTypeName, HLAOMTXmlVisitor::StringDataTypeMap& dataTypeMap) const
{ {
ArrayDataMap::const_iterator i = _arrayDataMap.find(dataTypeName); ArrayDataMap::const_iterator i = _arrayDataMap.find(dataTypeName);
if (i == _arrayDataMap.end()) if (i == _arrayDataMap.end())
@@ -423,13 +428,13 @@ HLAOMTXmlVisitor::getArrayDataType(const std::string& dataTypeName)
return 0; return 0;
} }
_dataTypeMap[dataTypeName] = arrayDataType; dataTypeMap[dataTypeName] = arrayDataType;
SGSharedPtr<HLADataType> elementDataType = getDataType(i->second._dataType); SGSharedPtr<HLADataType> elementDataType = getDataType(i->second._dataType, dataTypeMap);
if (!elementDataType.valid()) { if (!elementDataType.valid()) {
SG_LOG(SG_IO, SG_ALERT, "Could not interpret dataType \"" SG_LOG(SG_IO, SG_ALERT, "Could not interpret dataType \""
<< i->second._dataType << "\" for array data type \"" << i->second._dataType << "\" for array data type \""
<< dataTypeName << "\"."); << dataTypeName << "\".");
_dataTypeMap.erase(dataTypeName); dataTypeMap.erase(dataTypeName);
return 0; return 0;
} }
arrayDataType->setElementDataType(elementDataType.get()); arrayDataType->setElementDataType(elementDataType.get());
@@ -447,20 +452,20 @@ HLAOMTXmlVisitor::getArrayDataType(const std::string& dataTypeName)
} }
SGSharedPtr<HLAFixedRecordDataType> SGSharedPtr<HLAFixedRecordDataType>
HLAOMTXmlVisitor::getFixedRecordDataType(const std::string& dataTypeName) HLAOMTXmlVisitor::getFixedRecordDataType(const std::string& dataTypeName, HLAOMTXmlVisitor::StringDataTypeMap& dataTypeMap) const
{ {
FixedRecordDataMap::const_iterator i = _fixedRecordDataMap.find(dataTypeName); FixedRecordDataMap::const_iterator i = _fixedRecordDataMap.find(dataTypeName);
if (i == _fixedRecordDataMap.end()) if (i == _fixedRecordDataMap.end())
return 0; return 0;
SGSharedPtr<HLAFixedRecordDataType> dataType = new HLAFixedRecordDataType(dataTypeName); SGSharedPtr<HLAFixedRecordDataType> dataType = new HLAFixedRecordDataType(dataTypeName);
_dataTypeMap[dataTypeName] = dataType; dataTypeMap[dataTypeName] = dataType;
for (FieldList::size_type j = 0; j < i->second._fieldList.size(); ++j) { for (FieldList::size_type j = 0; j < i->second._fieldList.size(); ++j) {
SGSharedPtr<HLADataType> fieldDataType = getDataType(i->second._fieldList[j]._dataType); SGSharedPtr<HLADataType> fieldDataType = getDataType(i->second._fieldList[j]._dataType, dataTypeMap);
if (!fieldDataType.valid()) { if (!fieldDataType.valid()) {
SG_LOG(SG_IO, SG_ALERT, "Could not get data type \"" << i->second._fieldList[j]._dataType SG_LOG(SG_IO, SG_ALERT, "Could not get data type \"" << i->second._fieldList[j]._dataType
<< "\" for field " << j << "of fixed record data type \"" << dataTypeName << "\"."); << "\" for field " << j << "of fixed record data type \"" << dataTypeName << "\".");
_dataTypeMap.erase(dataTypeName); dataTypeMap.erase(dataTypeName);
return 0; return 0;
} }
dataType->addField(i->second._fieldList[j]._name, fieldDataType.get()); dataType->addField(i->second._fieldList[j]._name, fieldDataType.get());
@@ -468,14 +473,14 @@ HLAOMTXmlVisitor::getFixedRecordDataType(const std::string& dataTypeName)
return dataType; return dataType;
} }
SGSharedPtr<HLAVariantRecordDataType> SGSharedPtr<HLAVariantDataType>
HLAOMTXmlVisitor::getVariantRecordDataType(const std::string& dataTypeName) HLAOMTXmlVisitor::getVariantDataType(const std::string& dataTypeName, HLAOMTXmlVisitor::StringDataTypeMap& dataTypeMap) const
{ {
VariantRecordDataMap::const_iterator i = _variantRecordDataMap.find(dataTypeName); VariantRecordDataMap::const_iterator i = _variantRecordDataMap.find(dataTypeName);
if (i == _variantRecordDataMap.end()) if (i == _variantRecordDataMap.end())
return 0; return 0;
SGSharedPtr<HLAVariantRecordDataType> dataType = new HLAVariantRecordDataType(dataTypeName); SGSharedPtr<HLAVariantDataType> dataType = new HLAVariantDataType(dataTypeName);
_dataTypeMap[dataTypeName] = dataType; dataTypeMap[dataTypeName] = dataType;
SGSharedPtr<HLAEnumeratedDataType> enumeratedDataType = getEnumeratedDataType(i->second._dataType); SGSharedPtr<HLAEnumeratedDataType> enumeratedDataType = getEnumeratedDataType(i->second._dataType);
if (!enumeratedDataType.valid()) { if (!enumeratedDataType.valid()) {
@@ -487,11 +492,11 @@ HLAOMTXmlVisitor::getVariantRecordDataType(const std::string& dataTypeName)
for (AlternativeList::const_iterator j = i->second._alternativeList.begin(); for (AlternativeList::const_iterator j = i->second._alternativeList.begin();
j != i->second._alternativeList.end(); ++j) { j != i->second._alternativeList.end(); ++j) {
SGSharedPtr<HLADataType> alternativeDataType = getDataType(j->_dataType); SGSharedPtr<HLADataType> alternativeDataType = getDataType(j->_dataType, dataTypeMap);
if (!alternativeDataType.valid()) { if (!alternativeDataType.valid()) {
SG_LOG(SG_IO, SG_ALERT, "Could not resolve alternative dataType \"" << j->_dataType SG_LOG(SG_IO, SG_ALERT, "Could not resolve alternative dataType \"" << j->_dataType
<< "\" for alternative \"" << j->_name << "\"."); << "\" for alternative \"" << j->_name << "\".");
_dataTypeMap.erase(dataTypeName); dataTypeMap.erase(dataTypeName);
return 0; return 0;
} }
if (!dataType->addAlternative(j->_name, j->_enumerator, alternativeDataType.get(), j->_semantics)) { if (!dataType->addAlternative(j->_name, j->_enumerator, alternativeDataType.get(), j->_semantics)) {
@@ -535,26 +540,26 @@ HLAOMTXmlVisitor::endXML()
throw sg_exception("Internal parse error!"); throw sg_exception("Internal parse error!");
// propagate parent attributes to the derived classes // propagate parent attributes to the derived classes
// Note that this preserves the order of the attributes starting from the root object
for (ObjectClassList::const_iterator i = _objectClassList.begin(); i != _objectClassList.end(); ++i) { for (ObjectClassList::const_iterator i = _objectClassList.begin(); i != _objectClassList.end(); ++i) {
SGSharedPtr<const ObjectClass> objectClass = (*i)->_parentObjectClass; SGSharedPtr<const ObjectClass> objectClass = (*i)->_parentObjectClass;
if (!objectClass.valid()) while (objectClass) {
continue; for (AttributeList::const_reverse_iterator j = objectClass->_attributes.rbegin();
for (AttributeList::const_reverse_iterator j = objectClass->_attributes.rbegin(); j != objectClass->_attributes.rend(); ++j) {
j != objectClass->_attributes.rend(); ++j) { (*i)->_attributes.insert((*i)->_attributes.begin(), *j);
(*i)->_attributes.insert((*i)->_attributes.begin(), *j); }
objectClass = objectClass->_parentObjectClass;
} }
} }
// propagate parent parameter to the derived interactions // propagate parent parameter to the derived interactions
// Note that this preserves the order of the parameters starting from the root object
for (InteractionClassList::const_iterator i = _interactionClassList.begin(); i != _interactionClassList.end(); ++i) { for (InteractionClassList::const_iterator i = _interactionClassList.begin(); i != _interactionClassList.end(); ++i) {
SGSharedPtr<const InteractionClass> interactionClass = (*i)->_parentInteractionClass; SGSharedPtr<const InteractionClass> interactionClass = (*i)->_parentInteractionClass;
if (!interactionClass.valid()) while (interactionClass) {
continue; for (ParameterList::const_reverse_iterator j = interactionClass->_parameters.rbegin();
for (ParameterList::const_reverse_iterator j = interactionClass->_parameters.rbegin(); j != interactionClass->_parameters.rend(); ++j) {
j != interactionClass->_parameters.rend(); ++j) { (*i)->_parameters.insert((*i)->_parameters.begin(), *j);
(*i)->_parameters.insert((*i)->_parameters.begin(), *j); }
interactionClass = interactionClass->_parentInteractionClass;
} }
} }
} }
@@ -724,6 +729,11 @@ HLAOMTXmlVisitor::startElement(const char* name, const XMLAttributes& atts)
throw sg_exception("enumeratedDataTypes tag outside dataTypes!"); throw sg_exception("enumeratedDataTypes tag outside dataTypes!");
pushMode(EnumeratedDataTypesMode); pushMode(EnumeratedDataTypesMode);
Enumerator enumerator;
enumerator._name = getAttribute("name", atts);
enumerator._values = getAttribute("values", atts);
_enumeratedDataMap[_enumeratedDataName]._enumeratorList.push_back(enumerator);
} else if (strcmp(name, "arrayData") == 0) { } else if (strcmp(name, "arrayData") == 0) {
if (getCurrentMode() != ArrayDataTypesMode) if (getCurrentMode() != ArrayDataTypesMode)
throw sg_exception("arrayData tag outside arrayDataTypes!"); throw sg_exception("arrayData tag outside arrayDataTypes!");
+28 -69
View File
@@ -1,4 +1,4 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de // Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
// //
// This library is free software; you can redistribute it and/or // This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public // modify it under the terms of the GNU Library General Public
@@ -25,12 +25,9 @@
#include <simgear/structure/SGSharedPtr.hxx> #include <simgear/structure/SGSharedPtr.hxx>
#include <simgear/xml/easyxml.hxx> #include <simgear/xml/easyxml.hxx>
#include "HLADataType.hxx" #include "HLADataType.hxx"
#include "HLATypes.hxx"
namespace simgear { namespace simgear {
class HLAFederate;
class HLAOMTXmlVisitor : public XMLVisitor { class HLAOMTXmlVisitor : public XMLVisitor {
public: public:
/// structures representing the federate object model data /// structures representing the federate object model data
@@ -40,10 +37,6 @@ public:
{ } { }
const std::string& getName() const const std::string& getName() const
{ return _name; } { return _name; }
const std::string& getDataType() const
{ return _dataType; }
const std::string& getSharing() const
{ return _sharing; }
const std::string& getDimensions() const const std::string& getDimensions() const
{ return _dimensions; } { return _dimensions; }
const std::string& getTransportation() const const std::string& getTransportation() const
@@ -51,34 +44,6 @@ public:
const std::string& getOrder() const const std::string& getOrder() const
{ return _order; } { return _order; }
HLASubscriptionType getSubscriptionType() const
{
if (_sharing.find("Subscribe") != std::string::npos)
return HLASubscribedActive;
else
return HLAUnsubscribed;
}
HLAPublicationType getPublicationType() const
{
if (_sharing.find("Publish") != std::string::npos)
return HLAPublished;
else
return HLAUnpublished;
}
HLAUpdateType getUpdateType() const
{
if (_updateType == "Periodic")
return HLAPeriodicUpdate;
else if (_updateType == "Static")
return HLAStaticUpdate;
else if (_updateType == "Conditional")
return HLAConditionalUpdate;
else
return HLAUndefinedUpdate;
}
std::string _name; std::string _name;
std::string _dataType; std::string _dataType;
std::string _updateType; std::string _updateType;
@@ -101,6 +66,7 @@ public:
unsigned getNumAttributes() const; unsigned getNumAttributes() const;
const Attribute* getAttribute(unsigned index) const; const Attribute* getAttribute(unsigned index) const;
const Attribute* getAttribute(const std::string& name) const;
const ObjectClass* getParentObjectClass() const; const ObjectClass* getParentObjectClass() const;
@@ -135,28 +101,12 @@ public:
const std::string& getName() const; const std::string& getName() const;
const std::string& getDimensions() const; const std::string& getDimensions() const;
const std::string& getSharing() const;
const std::string& getTransportation() const; const std::string& getTransportation() const;
const std::string& getOrder() const; const std::string& getOrder() const;
HLASubscriptionType getSubscriptionType() const
{
if (_sharing.find("Subscribe") != std::string::npos)
return HLASubscribedActive;
else
return HLAUnsubscribed;
}
HLAPublicationType getPublicationType() const
{
if (_sharing.find("Publish") != std::string::npos)
return HLAPublished;
else
return HLAUnpublished;
}
unsigned getNumParameters() const; unsigned getNumParameters() const;
const Parameter* getParameter(unsigned index) const; const Parameter* getParameter(unsigned index) const;
const Parameter* getParameter(const std::string& name) const;
const InteractionClass* getParentInteractionClass() const; const InteractionClass* getParentInteractionClass() const;
@@ -164,7 +114,6 @@ public:
friend class HLAOMTXmlVisitor; friend class HLAOMTXmlVisitor;
std::string _name; std::string _name;
std::string _dimensions; std::string _dimensions;
std::string _sharing;
std::string _transportation; std::string _transportation;
std::string _order; std::string _order;
ParameterList _parameters; ParameterList _parameters;
@@ -175,23 +124,36 @@ public:
HLAOMTXmlVisitor(); HLAOMTXmlVisitor();
~HLAOMTXmlVisitor(); ~HLAOMTXmlVisitor();
void setDataTypesToFederate(HLAFederate& federate);
void setToFederate(HLAFederate& federate);
unsigned getNumObjectClasses() const; unsigned getNumObjectClasses() const;
const ObjectClass* getObjectClass(unsigned i) const; const ObjectClass* getObjectClass(unsigned i) const;
const ObjectClass* getObjectClass(const std::string& name) const;
/// Return the data type from the fom data
const Attribute* getAttribute(const std::string& objectClassName, const std::string& attributeName) const;
/// Return the data type from the fom data
HLADataType* getAttributeDataType(const std::string& objectClassName, const std::string& attributeName) const;
unsigned getNumInteractionClasses() const; unsigned getNumInteractionClasses() const;
const InteractionClass* getInteractionClass(unsigned i) const; const InteractionClass* getInteractionClass(unsigned i) const;
const InteractionClass* getInteractionClass(const std::string& name) const;
/// Return the data type from the fom data
const Parameter* getParameter(const std::string& interactionClassName, const std::string& parameterName) const;
/// Return the data type from the fom data
HLADataType* getParameterDataType(const std::string& interactionClassName, const std::string& parameterName) const;
HLADataType* getDataType(const std::string& dataTypeName) const;
private: private:
SGSharedPtr<HLADataType> getDataType(const std::string& dataTypeName); typedef std::map<std::string, SGSharedPtr<HLADataType> > StringDataTypeMap;
SGSharedPtr<HLABasicDataType> getBasicDataType(const std::string& dataTypeName); SGSharedPtr<HLADataType> getDataType(const std::string& dataTypeName, StringDataTypeMap& dataTypeMap) const;
SGSharedPtr<HLADataType> getSimpleDataType(const std::string& dataTypeName); SGSharedPtr<HLABasicDataType> getBasicDataType(const std::string& dataTypeName) const;
SGSharedPtr<HLAEnumeratedDataType> getEnumeratedDataType(const std::string& dataTypeName); SGSharedPtr<HLADataType> getSimpleDataType(const std::string& dataTypeName) const;
SGSharedPtr<HLADataType> getArrayDataType(const std::string& dataTypeName); SGSharedPtr<HLAEnumeratedDataType> getEnumeratedDataType(const std::string& dataTypeName) const;
SGSharedPtr<HLAFixedRecordDataType> getFixedRecordDataType(const std::string& dataTypeName); SGSharedPtr<HLADataType> getArrayDataType(const std::string& dataTypeName, StringDataTypeMap& dataTypeMap) const;
SGSharedPtr<HLAVariantRecordDataType> getVariantRecordDataType(const std::string& dataTypeName); SGSharedPtr<HLAFixedRecordDataType> getFixedRecordDataType(const std::string& dataTypeName, StringDataTypeMap& dataTypeMap) const;
SGSharedPtr<HLAVariantDataType> getVariantDataType(const std::string& dataTypeName, StringDataTypeMap& dataTypeMap) const;
enum Mode { enum Mode {
UnknownMode, UnknownMode,
@@ -233,8 +195,8 @@ private:
virtual void startElement(const char* name, const XMLAttributes& atts); virtual void startElement(const char* name, const XMLAttributes& atts);
virtual void endElement(const char* name); virtual void endElement(const char* name);
static std::string getAttribute(const char* name, const XMLAttributes& atts); std::string getAttribute(const char* name, const XMLAttributes& atts);
static std::string getAttribute(const std::string& name, const XMLAttributes& atts); std::string getAttribute(const std::string& name, const XMLAttributes& atts);
struct BasicData { struct BasicData {
// std::string _name; // std::string _name;
@@ -314,9 +276,6 @@ private:
InteractionClassList _interactionClassList; InteractionClassList _interactionClassList;
InteractionClassList _interactionClassStack; InteractionClassList _interactionClassStack;
typedef std::map<std::string, SGSharedPtr<HLADataType> > StringDataTypeMap;
StringDataTypeMap _dataTypeMap;
/// DataType definitions /// DataType definitions
BasicDataMap _basicDataMap; BasicDataMap _basicDataMap;
SimpleDataMap _simpleDataMap; SimpleDataMap _simpleDataMap;
+91 -234
View File
@@ -1,4 +1,4 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de // Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
// //
// This library is free software; you can redistribute it and/or // This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public // modify it under the terms of the GNU Library General Public
@@ -15,15 +15,8 @@
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
// //
#ifdef HAVE_CONFIG_H
# include <simgear_config.h>
#endif
#include <simgear/compiler.h>
#include "HLAObjectClass.hxx" #include "HLAObjectClass.hxx"
#include "simgear/debug/logstream.hxx"
#include "RTIFederate.hxx" #include "RTIFederate.hxx"
#include "RTIObjectClass.hxx" #include "RTIObjectClass.hxx"
#include "RTIObjectInstance.hxx" #include "RTIObjectInstance.hxx"
@@ -61,226 +54,143 @@ HLAObjectClass::RegistrationCallback::~RegistrationCallback()
{ {
} }
HLAObjectClass::HLAObjectClass(const std::string& name, HLAFederate* federate) : HLAObjectClass::HLAObjectClass(const std::string& name, HLAFederate& federate) :
_federate(federate),
_name(name) _name(name)
{ {
if (!federate) { _rtiObjectClass = federate._rtiFederate->createObjectClass(name, this);
SG_LOG(SG_NETWORK, SG_ALERT, "HLAObjectClass::HLAObjectClass(): " if (!_rtiObjectClass.valid())
"No parent federate given for object class \"" << getName() << "\"!"); SG_LOG(SG_NETWORK, SG_WARN, "HLAObjectClass::HLAObjectClass(): No RTIObjectClass found for \"" << name << "\"!");
return;
}
federate->_insertObjectClass(this);
} }
HLAObjectClass::~HLAObjectClass() HLAObjectClass::~HLAObjectClass()
{ {
// HLAObjectClass objects only get deleted when the parent federate
// dies. So we do not need to deregister there.
_clearRTIObjectClass();
}
const std::string&
HLAObjectClass::getName() const
{
return _name;
}
const SGWeakPtr<HLAFederate>&
HLAObjectClass::getFederate() const
{
return _federate;
} }
unsigned unsigned
HLAObjectClass::getNumAttributes() const HLAObjectClass::getNumAttributes() const
{ {
return _attributeVector.size(); if (!_rtiObjectClass.valid()) {
} SG_LOG(SG_NETWORK, SG_WARN, "HLAObjectClass::getAttributeIndex(): No RTIObject class for object class \"" << getName() << "\"!");
return 0;
unsigned }
HLAObjectClass::addAttribute(const std::string& name) return _rtiObjectClass->getNumAttributes();
{
unsigned index = _attributeVector.size();
_nameIndexMap[name] = index;
_attributeVector.push_back(Attribute(name));
_resolveAttributeIndex(name, index);
return index;
} }
unsigned unsigned
HLAObjectClass::getAttributeIndex(const std::string& name) const HLAObjectClass::getAttributeIndex(const std::string& name) const
{ {
NameIndexMap::const_iterator i = _nameIndexMap.find(name); if (!_rtiObjectClass.valid()) {
if (i == _nameIndexMap.end()) SG_LOG(SG_NETWORK, SG_WARN, "HLAObjectClass::getAttributeIndex(): No RTIObject class for object class \"" << getName() << "\"!");
return ~0u; return ~0u;
return i->second; }
return _rtiObjectClass->getOrCreateAttributeIndex(name);
} }
std::string std::string
HLAObjectClass::getAttributeName(unsigned index) const HLAObjectClass::getAttributeName(unsigned index) const
{ {
if (_attributeVector.size() <= index) if (!_rtiObjectClass.valid()) {
return std::string(); SG_LOG(SG_NETWORK, SG_WARN, "HLAObjectClass::getAttributeIndex(): No RTIObject class for object class \"" << getName() << "\"!");
return _attributeVector[index]._name; return 0;
}
return _rtiObjectClass->getAttributeName(index);
} }
const HLADataType* const HLADataType*
HLAObjectClass::getAttributeDataType(unsigned index) const HLAObjectClass::getAttributeDataType(unsigned index) const
{ {
if (_attributeVector.size() <= index) if (!_rtiObjectClass.valid()) {
SG_LOG(SG_NETWORK, SG_WARN, "HLAObjectClass::getAttributeDataType(): No RTIObject class for object class \"" << getName() << "\"!");
return 0; return 0;
return _attributeVector[index]._dataType.get(); }
return _rtiObjectClass->getAttributeDataType(index);
} }
void void
HLAObjectClass::setAttributeDataType(unsigned index, const HLADataType* dataType) HLAObjectClass::setAttributeDataType(unsigned index, const HLADataType* dataType)
{ {
if (_attributeVector.size() <= index) if (!_rtiObjectClass.valid()) {
SG_LOG(SG_NETWORK, SG_WARN, "HLAObjectClass::setAttributeDataType(): No RTIObject class for object class \"" << getName() << "\"!");
return; return;
_attributeVector[index]._dataType = dataType; }
_rtiObjectClass->setAttributeDataType(index, dataType);
} }
HLAUpdateType HLAUpdateType
HLAObjectClass::getAttributeUpdateType(unsigned index) const HLAObjectClass::getAttributeUpdateType(unsigned index) const
{ {
if (_attributeVector.size() <= index) if (!_rtiObjectClass.valid()) {
SG_LOG(SG_NETWORK, SG_WARN, "HLAObjectClass::getAttributeUpdateType(): No RTIObject class for object class \"" << getName() << "\"!");
return HLAUndefinedUpdate; return HLAUndefinedUpdate;
return _attributeVector[index]._updateType; }
return _rtiObjectClass->getAttributeUpdateType(index);
} }
void void
HLAObjectClass::setAttributeUpdateType(unsigned index, HLAUpdateType updateType) HLAObjectClass::setAttributeUpdateType(unsigned index, HLAUpdateType updateType)
{ {
if (_attributeVector.size() <= index) if (!_rtiObjectClass.valid()) {
SG_LOG(SG_NETWORK, SG_WARN, "HLAObjectClass::setAttributeUpdateType(): "
"No RTIObject class for object class \"" << getName() << "\"!");
return; return;
_attributeVector[index]._updateType = updateType; }
} _rtiObjectClass->setAttributeUpdateType(index, updateType);
HLASubscriptionType
HLAObjectClass::getAttributeSubscriptionType(unsigned index) const
{
if (_attributeVector.size() <= index)
return HLAUnsubscribed;
return _attributeVector[index]._subscriptionType;
}
void
HLAObjectClass::setAttributeSubscriptionType(unsigned index, HLASubscriptionType subscriptionType)
{
if (_attributeVector.size() <= index)
return;
_attributeVector[index]._subscriptionType = subscriptionType;
}
HLAPublicationType
HLAObjectClass::getAttributePublicationType(unsigned index) const
{
if (_attributeVector.size() <= index)
return HLAUnpublished;
return _attributeVector[index]._publicationType;
}
void
HLAObjectClass::setAttributePublicationType(unsigned index, HLAPublicationType publicationType)
{
if (_attributeVector.size() <= index)
return;
_attributeVector[index]._publicationType = publicationType;
} }
HLADataElement::IndexPathPair HLADataElement::IndexPathPair
HLAObjectClass::getIndexPathPair(const HLADataElement::StringPathPair& stringPathPair) const HLAObjectClass::getIndexPathPair(const HLADataElement::AttributePathPair& attributePathPair) const
{ {
unsigned index = getAttributeIndex(stringPathPair.first); unsigned index = getAttributeIndex(attributePathPair.first);
if (getNumAttributes() <= index) { if (getNumAttributes() <= index) {
SG_LOG(SG_NETWORK, SG_ALERT, "HLAObjectClass::getIndexPathPair(\"" SG_LOG(SG_NETWORK, SG_ALERT, "HLAObjectClass::getIndexPathPair(\""
<< HLADataElement::toString(stringPathPair) << HLADataElement::toString(attributePathPair)
<< "\"): Could not resolve attribute \"" << stringPathPair.first << "\"): Could not resolve attribute \"" << attributePathPair.first
<< "\" for object class \"" << getName() << "\"!"); << "\" for object class \"" << getName() << "\"!");
} }
return HLADataElement::IndexPathPair(index, stringPathPair.second); return HLADataElement::IndexPathPair(index, attributePathPair.second);
} }
HLADataElement::IndexPathPair HLADataElement::IndexPathPair
HLAObjectClass::getIndexPathPair(const std::string& path) const HLAObjectClass::getIndexPathPair(const std::string& path) const
{ {
return getIndexPathPair(HLADataElement::toStringPathPair(path)); return getIndexPathPair(HLADataElement::toAttributePathPair(path));
} }
bool bool
HLAObjectClass::subscribe() HLAObjectClass::subscribe(const std::set<unsigned>& indexSet, bool active)
{ {
if (!_rtiObjectClass.valid()) { if (!_rtiObjectClass.valid()) {
SG_LOG(SG_NETWORK, SG_WARN, "HLAObjectClass::subscribe(): " SG_LOG(SG_NETWORK, SG_WARN, "HLAObjectClass::subscribe(): No RTIObject class for object class \"" << getName() << "\"!");
"No RTIObject class for object class \"" << getName() << "\"!");
return false; return false;
} }
return _rtiObjectClass->subscribe(indexSet, active);
HLAIndexList indexList;
for (unsigned i = 1; i < getNumAttributes(); ++i) {
if (_attributeVector[i]._subscriptionType != HLASubscribedActive)
continue;
indexList.push_back(i);
}
if (!indexList.empty()) {
if (!_rtiObjectClass->subscribe(indexList, true))
return false;
}
indexList.clear();
for (unsigned i = 1; i < getNumAttributes(); ++i) {
if (_attributeVector[i]._subscriptionType != HLASubscribedPassive)
continue;
indexList.push_back(i);
}
if (!indexList.empty()) {
if (!_rtiObjectClass->subscribe(indexList, false))
return false;
}
return true;
} }
bool bool
HLAObjectClass::unsubscribe() HLAObjectClass::unsubscribe()
{ {
if (!_rtiObjectClass.valid()) { if (!_rtiObjectClass.valid()) {
SG_LOG(SG_NETWORK, SG_WARN, "HLAObjectClass::unsubscribe(): " SG_LOG(SG_NETWORK, SG_WARN, "HLAObjectClass::unsubscribe(): No RTIObject class for object class \"" << getName() << "\"!");
"No RTIObject class for object class \"" << getName() << "\"!");
return false; return false;
} }
return _rtiObjectClass->unsubscribe(); return _rtiObjectClass->unsubscribe();
} }
bool bool
HLAObjectClass::publish() HLAObjectClass::publish(const std::set<unsigned>& indexSet)
{ {
if (!_rtiObjectClass.valid()) { if (!_rtiObjectClass.valid()) {
SG_LOG(SG_NETWORK, SG_WARN, "HLAObjectClass::publish(): " SG_LOG(SG_NETWORK, SG_WARN, "HLAObjectClass::publish(): No RTIObject class for object class \"" << getName() << "\"!");
"No RTIObject class for object class \"" << getName() << "\"!");
return false; return false;
} }
return _rtiObjectClass->publish(indexSet);
HLAIndexList indexList;
for (unsigned i = 1; i < getNumAttributes(); ++i) {
if (_attributeVector[i]._publicationType == HLAUnpublished)
continue;
indexList.push_back(i);
}
if (indexList.empty())
return true;
if (!_rtiObjectClass->publish(indexList))
return false;
return true;
} }
bool bool
HLAObjectClass::unpublish() HLAObjectClass::unpublish()
{ {
if (!_rtiObjectClass.valid()) { if (!_rtiObjectClass.valid()) {
SG_LOG(SG_NETWORK, SG_WARN, "HLAObjectClass::unpublish(): " SG_LOG(SG_NETWORK, SG_WARN, "HLAObjectClass::unpublish(): No RTIObject class for object class \"" << getName() << "\"!");
"No RTIObject class for object class \"" << getName() << "\"!");
return false; return false;
} }
return _rtiObjectClass->unpublish(); return _rtiObjectClass->unpublish();
@@ -297,135 +207,82 @@ HLAObjectClass::stopRegistration() const
} }
HLAObjectInstance* HLAObjectInstance*
HLAObjectClass::createObjectInstance(const std::string& name) HLAObjectClass::createObjectInstance(RTIObjectInstance* rtiObjectInstance)
{ {
HLAObjectInstance* objectInstance = createObjectInstance(); return new HLAObjectInstance(this, rtiObjectInstance);
if (objectInstance)
return objectInstance;
SGSharedPtr<HLAFederate> federate = _federate.lock();
if (!federate.valid())
return 0;
return federate->createObjectInstance(this, name);
}
HLAObjectInstance*
HLAObjectClass::createObjectInstance()
{
return 0;
} }
void void
HLAObjectClass::_setRTIObjectClass(RTIObjectClass* objectClass) HLAObjectClass::discoverInstance(RTIObjectInstance* objectInstance, const RTIData& tag)
{ {
if (_rtiObjectClass) { SGSharedPtr<HLAObjectInstance> hlaObjectInstance = createObjectInstance(objectInstance);
SG_LOG(SG_NETWORK, SG_ALERT, "HLAObjectClass: Setting RTIObjectClass twice for object class \"" << getName() << "\"!"); if (hlaObjectInstance.valid()) {
return; SG_LOG(SG_NETWORK, SG_INFO, "RTI: create new object instance for discovered \""
<< hlaObjectInstance->getName() << "\" object");
_objectInstanceSet.insert(hlaObjectInstance);
discoverInstanceCallback(*hlaObjectInstance, tag);
} else {
SG_LOG(SG_NETWORK, SG_INFO, "RTI: local delete of \"" << objectInstance->getName() << "\"");
objectInstance->localDeleteObjectInstance();
} }
_rtiObjectClass = objectClass;
if (_rtiObjectClass->_objectClass != this) {
SG_LOG(SG_NETWORK, SG_ALERT, "HLAObjectClass: backward reference does not match!");
return;
}
for (unsigned i = 0; i < _attributeVector.size(); ++i)
_resolveAttributeIndex(_attributeVector[i]._name, i);
} }
void void
HLAObjectClass::_resolveAttributeIndex(const std::string& name, unsigned index) HLAObjectClass::removeInstance(HLAObjectInstance& hlaObjectInstance, const RTIData& tag)
{ {
if (!_rtiObjectClass) SG_LOG(SG_NETWORK, SG_INFO, "RTI: remove object instance \"" << hlaObjectInstance.getName() << "\"");
return; removeInstanceCallback(hlaObjectInstance, tag);
if (!_rtiObjectClass->resolveAttributeIndex(name, index)) _objectInstanceSet.erase(&hlaObjectInstance);
SG_LOG(SG_NETWORK, SG_ALERT, "HLAObjectClass: Could not resolve attribute \""
<< name << "\" for object class \"" << getName() << "\"!");
} }
void void
HLAObjectClass::_clearRTIObjectClass() HLAObjectClass::registerInstance(HLAObjectInstance& objectInstance)
{ {
if (!_rtiObjectClass.valid()) _objectInstanceSet.insert(&objectInstance);
return; registerInstanceCallback(objectInstance);
_rtiObjectClass->_objectClass = 0;
_rtiObjectClass = 0;
} }
void void
HLAObjectClass::_discoverInstance(RTIObjectInstance* rtiObjectInstance, const RTIData& tag) HLAObjectClass::deleteInstance(HLAObjectInstance& objectInstance)
{ {
SGSharedPtr<HLAFederate> federate = _federate.lock(); deleteInstanceCallback(objectInstance);
if (!federate.valid()) { _objectInstanceSet.erase(&objectInstance);
SG_LOG(SG_NETWORK, SG_ALERT, "RTI: could not find parent federate while discovering object instance");
return;
}
SGSharedPtr<HLAObjectInstance> objectInstance = createObjectInstance(rtiObjectInstance->getName());
if (!objectInstance.valid()) {
SG_LOG(SG_NETWORK, SG_INFO, "RTI: could not create new object instance for discovered \""
<< rtiObjectInstance->getName() << "\" object");
return;
}
SG_LOG(SG_NETWORK, SG_INFO, "RTI: create new object instance for discovered \""
<< rtiObjectInstance->getName() << "\" object");
objectInstance->_setRTIObjectInstance(rtiObjectInstance);
if (!federate->_insertObjectInstance(objectInstance)) {
SG_LOG(SG_NETWORK, SG_ALERT, "RTI: could not insert new object instance for discovered \""
<< rtiObjectInstance->getName() << "\" object");
return;
}
if (_instanceCallback.valid())
_instanceCallback->discoverInstance(*this, *objectInstance, tag);
} }
void void
HLAObjectClass::_removeInstance(HLAObjectInstance& objectInstance, const RTIData& tag) HLAObjectClass::discoverInstanceCallback(HLAObjectInstance& objectInstance, const RTIData& tag) const
{ {
SGSharedPtr<HLAFederate> federate = _federate.lock(); if (!_instanceCallback.valid())
if (!federate.valid()) {
SG_LOG(SG_NETWORK, SG_ALERT, "RTI: could not find parent federate while removing object instance");
return; return;
} _instanceCallback->discoverInstance(*this, objectInstance, tag);
SG_LOG(SG_NETWORK, SG_INFO, "RTI: remove object instance \"" << objectInstance.getName() << "\"");
if (_instanceCallback.valid())
_instanceCallback->removeInstance(*this, objectInstance, tag);
federate->_eraseObjectInstance(objectInstance.getName());
} }
void void
HLAObjectClass::_registerInstance(HLAObjectInstance* objectInstance) HLAObjectClass::removeInstanceCallback(HLAObjectInstance& objectInstance, const RTIData& tag) const
{ {
SGSharedPtr<HLAFederate> federate = _federate.lock(); if (!_instanceCallback.valid())
if (!federate.valid()) {
SG_LOG(SG_NETWORK, SG_ALERT, "RTI: could not find parent federate while registering object instance");
return; return;
} _instanceCallback->removeInstance(*this, objectInstance, tag);
if (!objectInstance)
return;
// We can only register object instances with a valid name at the rti.
// So, we cannot do that at HLAObjectInstance creation time.
if (!federate->_insertObjectInstance(objectInstance)) {
SG_LOG(SG_NETWORK, SG_ALERT, "RTI: could not insert new object instance \""
<< objectInstance->getName() << "\" object");
return;
}
if (_instanceCallback.valid())
_instanceCallback->registerInstance(*this, *objectInstance);
} }
void void
HLAObjectClass::_deleteInstance(HLAObjectInstance& objectInstance) HLAObjectClass::registerInstanceCallback(HLAObjectInstance& objectInstance) const
{ {
SGSharedPtr<HLAFederate> federate = _federate.lock(); if (!_instanceCallback.valid())
if (!federate.valid()) {
SG_LOG(SG_NETWORK, SG_ALERT, "RTI: could not find parent federate while deleting object instance");
return; return;
} _instanceCallback->registerInstance(*this, objectInstance);
if (_instanceCallback.valid())
_instanceCallback->deleteInstance(*this, objectInstance);
federate->_eraseObjectInstance(objectInstance.getName());
} }
void void
HLAObjectClass::_startRegistration() HLAObjectClass::deleteInstanceCallback(HLAObjectInstance& objectInstance) const
{
if (!_instanceCallback.valid())
return;
_instanceCallback->deleteInstance(*this, objectInstance);
}
void
HLAObjectClass::startRegistrationCallback()
{ {
if (_registrationCallback.valid()) if (_registrationCallback.valid())
_registrationCallback->startRegistration(*this); _registrationCallback->startRegistration(*this);
@@ -434,7 +291,7 @@ HLAObjectClass::_startRegistration()
} }
void void
HLAObjectClass::_stopRegistration() HLAObjectClass::stopRegistrationCallback()
{ {
if (_registrationCallback.valid()) if (_registrationCallback.valid())
_registrationCallback->stopRegistration(*this); _registrationCallback->stopRegistration(*this);
+32 -78
View File
@@ -1,4 +1,4 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de // Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
// //
// This library is free software; you can redistribute it and/or // This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public // modify it under the terms of the GNU Library General Public
@@ -18,12 +18,12 @@
#ifndef HLAObjectClass_hxx #ifndef HLAObjectClass_hxx
#define HLAObjectClass_hxx #define HLAObjectClass_hxx
#include <set>
#include <string> #include <string>
#include <vector> #include <vector>
#include "HLADataType.hxx" #include "HLADataType.hxx"
#include "HLAObjectInstance.hxx" #include "HLAObjectInstance.hxx"
#include "HLATypes.hxx"
namespace simgear { namespace simgear {
@@ -32,56 +32,30 @@ class HLAFederate;
class HLAObjectClass : public SGWeakReferenced { class HLAObjectClass : public SGWeakReferenced {
public: public:
HLAObjectClass(const std::string& name, HLAFederate* federate); HLAObjectClass(const std::string& name, HLAFederate& federate);
virtual ~HLAObjectClass(); virtual ~HLAObjectClass();
/// Return the name of this object class const std::string& getName() const
const std::string& getName() const; { return _name; }
/// return the federate this class belongs to
const SGWeakPtr<HLAFederate>& getFederate() const;
/// Return the number of attributes in this object class
unsigned getNumAttributes() const; unsigned getNumAttributes() const;
/// Adds a new attribute to this object class, return the index
unsigned addAttribute(const std::string& name);
/// Return the attribute index for the attribute with the given name
unsigned getAttributeIndex(const std::string& name) const; unsigned getAttributeIndex(const std::string& name) const;
/// Return the attribute name for the attribute with the given index
std::string getAttributeName(unsigned index) const; std::string getAttributeName(unsigned index) const;
/// Return the data type of the attribute with the given index
const HLADataType* getAttributeDataType(unsigned index) const; const HLADataType* getAttributeDataType(unsigned index) const;
/// Sets the data type of the attribute with the given index to dataType void setAttributeDataType(unsigned index, const HLADataType*);
void setAttributeDataType(unsigned index, const HLADataType* dataType);
/// Return the update type of the attribute with the given index
HLAUpdateType getAttributeUpdateType(unsigned index) const; HLAUpdateType getAttributeUpdateType(unsigned index) const;
/// Sets the update type of the attribute with the given index to updateType
void setAttributeUpdateType(unsigned index, HLAUpdateType updateType); void setAttributeUpdateType(unsigned index, HLAUpdateType updateType);
/// Return the subscription type of the attribute with the given index HLADataElement::IndexPathPair getIndexPathPair(const HLADataElement::AttributePathPair&) const;
HLASubscriptionType getAttributeSubscriptionType(unsigned index) const;
/// Sets the subscription type of the attribute with the given index to subscriptionType
void setAttributeSubscriptionType(unsigned index, HLASubscriptionType subscriptionType);
/// Return the publication type of the attribute with the given index
HLAPublicationType getAttributePublicationType(unsigned index) const;
/// Sets the publication type of the attribute with the given index to publicationType
void setAttributePublicationType(unsigned index, HLAPublicationType publicationType);
/// Return the index, path pair for the given string path pair
HLADataElement::IndexPathPair getIndexPathPair(const HLADataElement::StringPathPair&) const;
/// Return the index, path pair for the given string path
HLADataElement::IndexPathPair getIndexPathPair(const std::string& path) const; HLADataElement::IndexPathPair getIndexPathPair(const std::string& path) const;
virtual bool subscribe(); bool subscribe(const std::set<unsigned>& indexSet, bool active);
virtual bool unsubscribe(); bool unsubscribe();
virtual bool publish(); bool publish(const std::set<unsigned>& indexSet);
virtual bool unpublish(); bool unpublish();
// Object instance creation and destruction // Object instance creation and destruction
class InstanceCallback : public SGReferenced { class InstanceCallback : public SGReferenced {
@@ -100,11 +74,6 @@ public:
const SGSharedPtr<InstanceCallback>& getInstanceCallback() const const SGSharedPtr<InstanceCallback>& getInstanceCallback() const
{ return _instanceCallback; } { return _instanceCallback; }
// Is called by the default registration callback if installed
// Should register the already known object instances of this class.
virtual void startRegistration() const;
virtual void stopRegistration() const;
// Handles startRegistrationForObjectClass and stopRegistrationForObjectClass events // Handles startRegistrationForObjectClass and stopRegistrationForObjectClass events
class RegistrationCallback : public SGReferenced { class RegistrationCallback : public SGReferenced {
public: public:
@@ -118,61 +87,46 @@ public:
const SGSharedPtr<RegistrationCallback>& getRegistrationCallback() const const SGSharedPtr<RegistrationCallback>& getRegistrationCallback() const
{ return _registrationCallback; } { return _registrationCallback; }
/// Create a new instance of this class. // Is called by the default registration callback if installed
virtual HLAObjectInstance* createObjectInstance(const std::string& name); void startRegistration() const;
virtual HLAObjectInstance* createObjectInstance(); // deprecated void stopRegistration() const;
protected:
virtual HLAObjectInstance* createObjectInstance(RTIObjectInstance* rtiObjectInstance);
private: private:
HLAObjectClass(const HLAObjectClass&); HLAObjectClass(const HLAObjectClass&);
HLAObjectClass& operator=(const HLAObjectClass&); HLAObjectClass& operator=(const HLAObjectClass&);
void _setRTIObjectClass(RTIObjectClass* objectClass);
void _resolveAttributeIndex(const std::string& name, unsigned index);
void _clearRTIObjectClass();
// The internal entry points from the RTILObjectClass callback functions // The internal entry points from the RTILObjectClass callback functions
void _discoverInstance(RTIObjectInstance* objectInstance, const RTIData& tag); void discoverInstance(RTIObjectInstance* objectInstance, const RTIData& tag);
void _removeInstance(HLAObjectInstance& objectInstance, const RTIData& tag); void removeInstance(HLAObjectInstance& objectInstance, const RTIData& tag);
void _registerInstance(HLAObjectInstance* objectInstance); void registerInstance(HLAObjectInstance& objectInstance);
void _deleteInstance(HLAObjectInstance& objectInstance); void deleteInstance(HLAObjectInstance& objectInstance);
void _startRegistration(); void discoverInstanceCallback(HLAObjectInstance& objectInstance, const RTIData& tag) const;
void _stopRegistration(); void removeInstanceCallback(HLAObjectInstance& objectInstance, const RTIData& tag) const;
void registerInstanceCallback(HLAObjectInstance& objectInstance) const;
void deleteInstanceCallback(HLAObjectInstance& objectInstance) const;
void startRegistrationCallback();
void stopRegistrationCallback();
friend class HLAObjectInstance; friend class HLAObjectInstance;
friend class RTIObjectClass; friend class RTIObjectClass;
struct Attribute { // The object class name
Attribute() : _subscriptionType(HLAUnsubscribed), _publicationType(HLAUnpublished), _updateType(HLAUndefinedUpdate) {}
Attribute(const std::string& name) : _name(name), _subscriptionType(HLAUnsubscribed), _publicationType(HLAUnpublished), _updateType(HLAUndefinedUpdate) {}
std::string _name;
SGSharedPtr<const HLADataType> _dataType;
HLASubscriptionType _subscriptionType;
HLAPublicationType _publicationType;
HLAUpdateType _updateType;
};
typedef std::vector<Attribute> AttributeVector;
typedef std::map<std::string,unsigned> NameIndexMap;
/// The parent federate.
SGWeakPtr<HLAFederate> _federate;
/// The object class name
std::string _name; std::string _name;
/// The underlying rti dispatcher class // The underlying rti dispatcher class
SGSharedPtr<RTIObjectClass> _rtiObjectClass; SGSharedPtr<RTIObjectClass> _rtiObjectClass;
/// The attribute data
AttributeVector _attributeVector;
/// The mapping from attribute names to attribute indices
NameIndexMap _nameIndexMap;
// Callback classes // Callback classes
SGSharedPtr<InstanceCallback> _instanceCallback; SGSharedPtr<InstanceCallback> _instanceCallback;
SGSharedPtr<RegistrationCallback> _registrationCallback; SGSharedPtr<RegistrationCallback> _registrationCallback;
friend class HLAFederate; // The set of active objects
typedef std::set<SGSharedPtr<HLAObjectInstance> > ObjectInstanceSet;
ObjectInstanceSet _objectInstanceSet;
}; };
} // namespace simgear } // namespace simgear
+91 -297
View File
@@ -1,4 +1,4 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de // Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
// //
// This library is free software; you can redistribute it and/or // This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public // modify it under the terms of the GNU Library General Public
@@ -15,145 +15,112 @@
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
// //
#ifdef HAVE_CONFIG_H
# include <simgear_config.h>
#endif
#include <simgear/compiler.h>
#include "HLAObjectInstance.hxx" #include "HLAObjectInstance.hxx"
#include <algorithm> #include <algorithm>
#include "simgear/debug/logstream.hxx"
#include "HLAArrayDataElement.hxx" #include "HLAArrayDataElement.hxx"
#include "HLABasicDataElement.hxx" #include "HLABasicDataElement.hxx"
#include "HLADataElement.hxx" #include "HLADataElement.hxx"
#include "HLAEnumeratedDataElement.hxx" #include "HLAEnumeratedDataElement.hxx"
#include "HLAFederate.hxx"
#include "HLAFixedRecordDataElement.hxx" #include "HLAFixedRecordDataElement.hxx"
#include "HLAObjectClass.hxx" #include "HLAObjectClass.hxx"
#include "HLAVariantRecordDataElement.hxx" #include "HLAVariantDataElement.hxx"
#include "RTIObjectClass.hxx" #include "RTIObjectClass.hxx"
#include "RTIObjectInstance.hxx" #include "RTIObjectInstance.hxx"
namespace simgear { namespace simgear {
HLAObjectInstance::UpdateCallback::~UpdateCallback()
{
}
HLAObjectInstance::ReflectCallback::~ReflectCallback()
{
}
HLAObjectInstance::HLAObjectInstance(HLAObjectClass* objectClass) : HLAObjectInstance::HLAObjectInstance(HLAObjectClass* objectClass) :
_objectClass(objectClass) _objectClass(objectClass)
{ {
if (objectClass) }
_federate = objectClass->_federate;
HLAObjectInstance::HLAObjectInstance(HLAObjectClass* objectClass, RTIObjectInstance* rtiObjectInstance) :
_objectClass(objectClass),
_rtiObjectInstance(rtiObjectInstance)
{
_rtiObjectInstance->_hlaObjectInstance = this;
_name = _rtiObjectInstance->getName();
} }
HLAObjectInstance::~HLAObjectInstance() HLAObjectInstance::~HLAObjectInstance()
{ {
_clearRTIObjectInstance();
} }
const std::string& SGSharedPtr<HLAObjectClass>
HLAObjectInstance::getName() const
{
return _name;
}
const SGWeakPtr<HLAFederate>&
HLAObjectInstance::getFederate() const
{
return _federate;
}
const SGSharedPtr<HLAObjectClass>&
HLAObjectInstance::getObjectClass() const HLAObjectInstance::getObjectClass() const
{ {
return _objectClass; return _objectClass.lock();
} }
unsigned unsigned
HLAObjectInstance::getNumAttributes() const HLAObjectInstance::getNumAttributes() const
{ {
if (!_objectClass.valid()) if (!_rtiObjectInstance.valid()) {
SG_LOG(SG_IO, SG_ALERT, "Trying to get number of attributes for inactive object!");
return 0; return 0;
return _objectClass->getNumAttributes(); }
return _rtiObjectInstance->getNumAttributes();
} }
unsigned unsigned
HLAObjectInstance::getAttributeIndex(const std::string& name) const HLAObjectInstance::getAttributeIndex(const std::string& name) const
{ {
if (!_objectClass.valid()) if (!_rtiObjectInstance.valid()) {
return ~0u; SG_LOG(SG_IO, SG_ALERT, "Trying to get attribute index for inactive object!");
return _objectClass->getAttributeIndex(name); return 0;
}
return _rtiObjectInstance->getAttributeIndex(name);
} }
std::string std::string
HLAObjectInstance::getAttributeName(unsigned index) const HLAObjectInstance::getAttributeName(unsigned index) const
{ {
if (!_objectClass.valid()) if (!_rtiObjectInstance.valid()) {
SG_LOG(SG_IO, SG_ALERT, "Trying to get attribute name for inactive object!");
return std::string(); return std::string();
return _objectClass->getAttributeName(index); }
} return _rtiObjectInstance->getAttributeName(index);
bool
HLAObjectInstance::getAttributeOwned(unsigned index) const
{
if (!_rtiObjectInstance.valid())
return false;
return _rtiObjectInstance->getAttributeOwned(index);
} }
const HLADataType* const HLADataType*
HLAObjectInstance::getAttributeDataType(unsigned index) const HLAObjectInstance::getAttributeDataType(unsigned index) const
{ {
if (!_objectClass.valid()) if (!_rtiObjectInstance.valid()) {
SG_LOG(SG_IO, SG_ALERT, "Trying to get attribute index for inactive object!");
return 0; return 0;
return _objectClass->getAttributeDataType(index); }
return _rtiObjectInstance->getAttributeDataType(index);
}
void
HLAObjectInstance::setAttributeDataElement(unsigned index, SGSharedPtr<HLADataElement> dataElement)
{
if (!_rtiObjectInstance.valid()) {
SG_LOG(SG_IO, SG_ALERT, "Trying to set data element for inactive object!");
return;
}
_rtiObjectInstance->setDataElement(index, dataElement);
} }
HLADataElement* HLADataElement*
HLAObjectInstance::getAttributeDataElement(unsigned index) HLAObjectInstance::getAttributeDataElement(unsigned index)
{ {
if (_attributeVector.size() <= index) if (!_rtiObjectInstance.valid()) {
SG_LOG(SG_IO, SG_ALERT, "Trying to set data element for inactive object!");
return 0; return 0;
return _attributeVector[index]._dataElement.get(); }
return _rtiObjectInstance->getDataElement(index);
} }
const HLADataElement* const HLADataElement*
HLAObjectInstance::getAttributeDataElement(unsigned index) const HLAObjectInstance::getAttributeDataElement(unsigned index) const
{
if (_attributeVector.size() <= index)
return 0;
return _attributeVector[index]._dataElement.get();
}
bool
HLAObjectInstance::getAttributeData(unsigned index, RTIData& data) const
{ {
if (!_rtiObjectInstance.valid()) { if (!_rtiObjectInstance.valid()) {
SG_LOG(SG_IO, SG_ALERT, "Trying to get raw attribute data without rti object instance for \"" << getName() << "\"!"); SG_LOG(SG_IO, SG_ALERT, "Trying to set data element for inactive object!");
return false; return 0;
} }
return _rtiObjectInstance->getAttributeData(index, data); return _rtiObjectInstance->getDataElement(index);
}
void
HLAObjectInstance::setAttributeDataElement(unsigned index, const SGSharedPtr<HLADataElement>& dataElement)
{
unsigned numAttributes = getNumAttributes();
if (numAttributes <= index)
return;
_attributeVector.resize(numAttributes);
if (_attributeVector[index]._dataElement.valid())
_attributeVector[index]._dataElement->clearStamp();
_attributeVector[index]._dataElement = dataElement;
if (_attributeVector[index]._dataElement.valid())
_attributeVector[index]._dataElement->createStamp();
} }
class HLAObjectInstance::DataElementFactoryVisitor : public HLADataElementFactoryVisitor { class HLAObjectInstance::DataElementFactoryVisitor : public HLADataElementFactoryVisitor {
@@ -345,9 +312,9 @@ public:
_dataElement = recordDataElement; _dataElement = recordDataElement;
} }
class VariantRecordDataElementFactory : public HLAVariantRecordDataElement::DataElementFactory { class VariantDataElementFactory : public HLAVariantDataElement::DataElementFactory {
public: public:
VariantRecordDataElementFactory(const HLADataElement::Path& path, const HLAPathElementMap& pathElementMap) : VariantDataElementFactory(const HLADataElement::Path& path, const HLAPathElementMap& pathElementMap) :
_path(path) _path(path)
{ {
for (HLAPathElementMap::const_iterator i = pathElementMap.lower_bound(path); for (HLAPathElementMap::const_iterator i = pathElementMap.lower_bound(path);
@@ -358,9 +325,9 @@ public:
_pathElementMap.insert(*i); _pathElementMap.insert(*i);
} }
} }
virtual HLADataElement* createElement(const HLAVariantRecordDataElement& element, unsigned index) virtual HLADataElement* createElement(const HLAVariantDataElement& element, unsigned index)
{ {
const HLAVariantRecordDataType* dataType = element.getDataType(); const HLAVariantDataType* dataType = element.getDataType();
if (!dataType) if (!dataType)
return 0; return 0;
const HLADataType* alternativeDataType = element.getAlternativeDataType(); const HLADataType* alternativeDataType = element.getAlternativeDataType();
@@ -377,17 +344,17 @@ public:
HLAPathElementMap _pathElementMap; HLAPathElementMap _pathElementMap;
}; };
virtual void apply(const HLAVariantRecordDataType& dataType) virtual void apply(const HLAVariantDataType& dataType)
{ {
_dataElement = createDataElement(_path, dataType); _dataElement = createDataElement(_path, dataType);
if (_dataElement.valid()) if (_dataElement.valid())
return; return;
SGSharedPtr<HLAVariantRecordDataElement> variantRecordDataElement; SGSharedPtr<HLAVariantDataElement> variantDataElement;
variantRecordDataElement = new HLAVariantRecordDataElement(&dataType); variantDataElement = new HLAVariantDataElement(&dataType);
variantRecordDataElement->setDataElementFactory(new VariantRecordDataElementFactory(_path, _pathElementMap)); variantDataElement->setDataElementFactory(new VariantDataElementFactory(_path, _pathElementMap));
_dataElement = variantRecordDataElement; _dataElement = variantDataElement;
} }
private: private:
@@ -420,8 +387,8 @@ HLAObjectInstance::setAttribute(unsigned index, const HLAPathElementMap& pathEle
{ {
const HLADataType* dataType = getAttributeDataType(index); const HLADataType* dataType = getAttributeDataType(index);
if (!dataType) { if (!dataType) {
SG_LOG(SG_IO, SG_ALERT, "Cannot get attribute data type for setting attribute \"" SG_LOG(SG_IO, SG_ALERT, "Cannot get attribute data type for setting attribute at index "
<< getAttributeName(index) << "\" at index " << index << "!"); << index << "!");
return; return;
} }
@@ -444,36 +411,26 @@ HLAObjectInstance::setAttributes(const HLAAttributePathElementMap& attributePath
void void
HLAObjectInstance::registerInstance() HLAObjectInstance::registerInstance()
{
registerInstance(_objectClass.get());
}
void
HLAObjectInstance::registerInstance(HLAObjectClass* objectClass)
{ {
if (_rtiObjectInstance.valid()) { if (_rtiObjectInstance.valid()) {
SG_LOG(SG_IO, SG_ALERT, "Trying to register object " << getName() << " already known to the RTI!"); SG_LOG(SG_IO, SG_ALERT, "Trying to register object " << getName() << " already known to the RTI!");
return; return;
} }
if (!objectClass) { SGSharedPtr<HLAObjectClass> objectClass = _objectClass.lock();
if (!objectClass.valid()) {
SG_LOG(SG_IO, SG_ALERT, "Could not register object with unknown object class!"); SG_LOG(SG_IO, SG_ALERT, "Could not register object with unknown object class!");
return; return;
} }
if (_objectClass.valid() && objectClass != _objectClass.get()) {
SG_LOG(SG_IO, SG_ALERT, "Could not change object class while registering!");
return;
}
_objectClass = objectClass;
_federate = _objectClass->_federate;
// This error must have been flagged before // This error must have been flagged before
if (!_objectClass->_rtiObjectClass.valid()) if (!objectClass->_rtiObjectClass.valid())
return; return;
_setRTIObjectInstance(_objectClass->_rtiObjectClass->registerObjectInstance(this)); _rtiObjectInstance = objectClass->_rtiObjectClass->registerObjectInstance(this);
if (!_rtiObjectInstance.valid()) { if (!_rtiObjectInstance.valid()) {
SG_LOG(SG_IO, SG_ALERT, "Could not register object at the RTI!"); SG_LOG(SG_IO, SG_ALERT, "Could not register object at the RTI!");
return; return;
} }
_objectClass->_registerInstance(this); _name = _rtiObjectInstance->getName();
objectClass->registerInstance(*this);
} }
void void
@@ -483,224 +440,61 @@ HLAObjectInstance::deleteInstance(const RTIData& tag)
SG_LOG(SG_IO, SG_ALERT, "Trying to delete inactive object!"); SG_LOG(SG_IO, SG_ALERT, "Trying to delete inactive object!");
return; return;
} }
if (!_objectClass.valid()) SGSharedPtr<HLAObjectClass> objectClass = _objectClass.lock();
if (!objectClass.valid())
return; return;
_objectClass->_deleteInstance(*this); objectClass->deleteInstance(*this);
_rtiObjectInstance->deleteObjectInstance(tag); _rtiObjectInstance->deleteObjectInstance(tag);
} }
void void
HLAObjectInstance::updateAttributeValues(const RTIData& tag) HLAObjectInstance::updateAttributeValues(const RTIData& tag)
{ {
if (!_rtiObjectInstance.valid()) {
SG_LOG(SG_IO, SG_INFO, "Not updating inactive object!");
return;
}
if (_attributeCallback.valid()) if (_attributeCallback.valid())
_attributeCallback->updateAttributeValues(*this, tag); _attributeCallback->updateAttributeValues(*this, tag);
if (_updateCallback.valid()) { _rtiObjectInstance->updateAttributeValues(tag);
_updateCallback->updateAttributeValues(*this, tag);
} else {
encodeAttributeValues();
sendAttributeValues(tag);
}
} }
void void
HLAObjectInstance::updateAttributeValues(const SGTimeStamp& timeStamp, const RTIData& tag) HLAObjectInstance::updateAttributeValues(const SGTimeStamp& timeStamp, const RTIData& tag)
{ {
if (!_rtiObjectInstance.valid()) {
SG_LOG(SG_IO, SG_INFO, "Not updating inactive object!");
return;
}
if (_attributeCallback.valid()) if (_attributeCallback.valid())
_attributeCallback->updateAttributeValues(*this, tag); _attributeCallback->updateAttributeValues(*this, tag);
if (_updateCallback.valid()) {
_updateCallback->updateAttributeValues(*this, timeStamp, tag);
} else {
encodeAttributeValues();
sendAttributeValues(timeStamp, tag);
}
}
void
HLAObjectInstance::encodeAttributeValues()
{
unsigned numAttributes = _attributeVector.size();
for (unsigned i = 0; i < numAttributes;++i) {
if (_attributeVector[i]._unconditionalUpdate) {
encodeAttributeValue(i);
} else if (_attributeVector[i]._enabledUpdate) {
const HLADataElement* dataElement = getAttributeDataElement(i);
if (dataElement && dataElement->getDirty())
encodeAttributeValue(i);
}
}
}
void
HLAObjectInstance::encodeAttributeValue(unsigned index)
{
if (!_rtiObjectInstance.valid()) {
SG_LOG(SG_IO, SG_INFO, "Not updating inactive object!");
return;
}
HLADataElement* dataElement = getAttributeDataElement(index);
if (!dataElement)
return;
_rtiObjectInstance->encodeAttributeData(index, *dataElement);
dataElement->setDirty(false);
}
void
HLAObjectInstance::sendAttributeValues(const RTIData& tag)
{
if (!_rtiObjectInstance.valid()) {
SG_LOG(SG_IO, SG_INFO, "Not updating inactive object!");
return;
}
_rtiObjectInstance->updateAttributeValues(tag);
}
void
HLAObjectInstance::sendAttributeValues(const SGTimeStamp& timeStamp, const RTIData& tag)
{
if (!_rtiObjectInstance.valid()) {
SG_LOG(SG_IO, SG_INFO, "Not updating inactive object!");
return;
}
_rtiObjectInstance->updateAttributeValues(timeStamp, tag); _rtiObjectInstance->updateAttributeValues(timeStamp, tag);
} }
void void
HLAObjectInstance::reflectAttributeValues(const HLAIndexList& indexList, const RTIData& tag) HLAObjectInstance::removeInstance(const RTIData& tag)
{ {
for (HLAIndexList::const_iterator i = indexList.begin(); i != indexList.end(); ++i) SGSharedPtr<HLAObjectClass> objectClass = _objectClass.lock();
reflectAttributeValue(*i, tag); if (!objectClass.valid())
return;
objectClass->removeInstanceCallback(*this, tag);
} }
void void
HLAObjectInstance::reflectAttributeValues(const HLAIndexList& indexList, HLAObjectInstance::reflectAttributeValues(const RTIIndexDataPairList& dataPairList, const RTIData& tag)
{
if (!_attributeCallback.valid())
return;
_attributeCallback->reflectAttributeValues(*this, dataPairList, tag);
}
void
HLAObjectInstance::reflectAttributeValues(const RTIIndexDataPairList& dataPairList,
const SGTimeStamp& timeStamp, const RTIData& tag) const SGTimeStamp& timeStamp, const RTIData& tag)
{ {
for (HLAIndexList::const_iterator i = indexList.begin(); i != indexList.end(); ++i) if (!_attributeCallback.valid())
reflectAttributeValue(*i, timeStamp, tag);
}
void
HLAObjectInstance::reflectAttributeValue(unsigned index, const RTIData& tag)
{
HLADataElement* dataElement = getAttributeDataElement(index);
if (!dataElement)
return; return;
dataElement->setTimeStampValid(false); _attributeCallback->reflectAttributeValues(*this, dataPairList, timeStamp, tag);
_rtiObjectInstance->decodeAttributeData(index, *dataElement);
}
void
HLAObjectInstance::reflectAttributeValue(unsigned index, const SGTimeStamp& timeStamp, const RTIData& tag)
{
HLADataElement* dataElement = getAttributeDataElement(index);
if (!dataElement)
return;
dataElement->setTimeStamp(timeStamp);
dataElement->setTimeStampValid(true);
_rtiObjectInstance->decodeAttributeData(index, *dataElement);
}
void
HLAObjectInstance::_setRTIObjectInstance(RTIObjectInstance* rtiObjectInstance)
{
if (!_objectClass.valid())
return;
_rtiObjectInstance = rtiObjectInstance;
_rtiObjectInstance->setObjectInstance(this);
_name = _rtiObjectInstance->getName();
unsigned numAttributes = getNumAttributes();
_attributeVector.resize(numAttributes);
for (unsigned i = 0; i < numAttributes; ++i) {
HLAUpdateType updateType = _objectClass->getAttributeUpdateType(i);
if (getAttributeOwned(i) && updateType != HLAUndefinedUpdate) {
_attributeVector[i]._enabledUpdate = true;
_attributeVector[i]._unconditionalUpdate = (updateType == HLAPeriodicUpdate);
// In case of an owned attribute, now encode its value
encodeAttributeValue(i);
} else {
_attributeVector[i]._enabledUpdate = false;
_attributeVector[i]._unconditionalUpdate = false;
}
}
// This makes sense with any new object. Even if we registered one, there might be unpublished attributes.
HLAIndexList indexList;
for (unsigned i = 0; i < numAttributes; ++i) {
HLAUpdateType updateType = _objectClass->getAttributeUpdateType(i);
if (getAttributeOwned(i))
continue;
if (updateType == HLAUndefinedUpdate)
continue;
if (updateType == HLAPeriodicUpdate)
continue;
indexList.push_back(i);
}
_rtiObjectInstance->requestObjectAttributeValueUpdate(indexList);
}
void
HLAObjectInstance::_clearRTIObjectInstance()
{
if (!_rtiObjectInstance.valid())
return;
for (unsigned i = 0; i < _attributeVector.size(); ++i) {
_attributeVector[i]._enabledUpdate = false;
_attributeVector[i]._unconditionalUpdate = false;
}
_rtiObjectInstance->setObjectInstance(0);
_rtiObjectInstance = 0;
}
void
HLAObjectInstance::_removeInstance(const RTIData& tag)
{
if (!_objectClass.valid())
return;
_objectClass->_removeInstance(*this, tag);
}
void
HLAObjectInstance::_reflectAttributeValues(const HLAIndexList& indexList, const RTIData& tag)
{
if (_reflectCallback.valid()) {
_reflectCallback->reflectAttributeValues(*this, indexList, tag);
} else if (_attributeCallback.valid()) {
reflectAttributeValues(indexList, tag);
RTIIndexDataPairList dataPairList;
for (HLAIndexList::const_iterator i = indexList.begin(); i != indexList.end(); ++i) {
dataPairList.push_back(RTIIndexDataPair());
dataPairList.back().first = *i;
getAttributeData(*i, dataPairList.back().second);
}
_attributeCallback->reflectAttributeValues(*this, dataPairList, tag);
} else {
reflectAttributeValues(indexList, tag);
}
}
void
HLAObjectInstance::_reflectAttributeValues(const HLAIndexList& indexList, const SGTimeStamp& timeStamp, const RTIData& tag)
{
if (_reflectCallback.valid()) {
_reflectCallback->reflectAttributeValues(*this, indexList, timeStamp, tag);
} else if (_attributeCallback.valid()) {
reflectAttributeValues(indexList, timeStamp, tag);
RTIIndexDataPairList dataPairList;
for (HLAIndexList::const_iterator i = indexList.begin(); i != indexList.end(); ++i) {
dataPairList.push_back(RTIIndexDataPair());
dataPairList.back().first = *i;
getAttributeData(*i, dataPairList.back().second);
}
_attributeCallback->reflectAttributeValues(*this, dataPairList, timeStamp, tag);
} else {
reflectAttributeValues(indexList, timeStamp, tag);
}
} }
} // namespace simgear } // namespace simgear
+20 -123
View File
@@ -1,4 +1,4 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de // Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
// //
// This library is free software; you can redistribute it and/or // This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public // modify it under the terms of the GNU Library General Public
@@ -18,121 +18,51 @@
#ifndef HLAObjectInstance_hxx #ifndef HLAObjectInstance_hxx
#define HLAObjectInstance_hxx #define HLAObjectInstance_hxx
#include <vector>
#include <simgear/structure/SGWeakPtr.hxx> #include <simgear/structure/SGWeakPtr.hxx>
#include "HLADataElement.hxx" #include "HLADataElement.hxx"
#include "HLATypes.hxx"
class SGTimeStamp; class SGTimeStamp;
namespace simgear { namespace simgear {
class RTIObjectInstance; class RTIObjectInstance;
class HLAFederate;
class HLAObjectClass; class HLAObjectClass;
class HLAObjectInstance : public SGWeakReferenced { class HLAObjectInstance : public SGWeakReferenced {
public: public:
HLAObjectInstance(HLAObjectClass* objectClass = 0); HLAObjectInstance(HLAObjectClass* objectClass);
HLAObjectInstance(HLAObjectClass* objectClass, RTIObjectInstance* rtiObjectInstance);
virtual ~HLAObjectInstance(); virtual ~HLAObjectInstance();
/// Return the name of this object instance const std::string& getName() const
const std::string& getName() const; { return _name; }
/// return the federate this instance belongs to SGSharedPtr<HLAObjectClass> getObjectClass() const;
const SGWeakPtr<HLAFederate>& getFederate() const;
/// Return the object class of this instance.
/// Should always return a valid object class.
const SGSharedPtr<HLAObjectClass>& getObjectClass() const;
/// Return the number of attributes
unsigned getNumAttributes() const; unsigned getNumAttributes() const;
/// Return the attribute index for the attribute with the given name
unsigned getAttributeIndex(const std::string& name) const; unsigned getAttributeIndex(const std::string& name) const;
/// Return the attribute name for the attribute with the given index
std::string getAttributeName(unsigned index) const; std::string getAttributeName(unsigned index) const;
/// Return true if the attribute with the given index is owned by
/// this federate
bool getAttributeOwned(unsigned index) const;
/// Return the data type of the attribute with the given index
const HLADataType* getAttributeDataType(unsigned index) const; const HLADataType* getAttributeDataType(unsigned index) const;
/// Return the data element of the attribute with the given index void setAttributeDataElement(unsigned index, SGSharedPtr<HLADataElement> dataElement);
HLADataElement* getAttributeDataElement(unsigned index); HLADataElement* getAttributeDataElement(unsigned index);
const HLADataElement* getAttributeDataElement(unsigned index) const; const HLADataElement* getAttributeDataElement(unsigned index) const;
/// Write the raw attribute data value into data, works only of the object
/// is backed up with an rti object instance
bool getAttributeData(unsigned index, RTIData& data) const;
/// Sets the data element of the attribute with the given index to dataElement
void setAttributeDataElement(unsigned index, const SGSharedPtr<HLADataElement>& dataElement);
/// Sets the data element of the attribute with the given index to the content of pathElementMap
void setAttribute(unsigned index, const HLAPathElementMap& pathElementMap); void setAttribute(unsigned index, const HLAPathElementMap& pathElementMap);
void setAttributes(const HLAAttributePathElementMap& attributePathElementMap); void setAttributes(const HLAAttributePathElementMap& attributePathElementMap);
void registerInstance(); void registerInstance();
void registerInstance(HLAObjectClass* objectClass);
void deleteInstance(const RTIData& tag); void deleteInstance(const RTIData& tag);
// Push the current values into the RTI
virtual void updateAttributeValues(const RTIData& tag);
virtual void updateAttributeValues(const SGTimeStamp& timeStamp, const RTIData& tag);
// encode periodic and dirty attribute values for the next sendAttributeValues
void encodeAttributeValues();
// encode the attribute value at index i for the next sendAttributeValues
void encodeAttributeValue(unsigned index);
// Really sends the prepared attribute update values into the RTI
void sendAttributeValues(const RTIData& tag);
void sendAttributeValues(const SGTimeStamp& timeStamp, const RTIData& tag);
class UpdateCallback : public SGReferenced {
public:
virtual ~UpdateCallback();
virtual void updateAttributeValues(HLAObjectInstance&, const RTIData&) = 0;
virtual void updateAttributeValues(HLAObjectInstance&, const SGTimeStamp&, const RTIData&) = 0;
};
void setUpdateCallback(const SGSharedPtr<UpdateCallback>& updateCallback)
{ _updateCallback = updateCallback; }
const SGSharedPtr<UpdateCallback>& getUpdateCallback() const
{ return _updateCallback; }
// Reflects the indices given in the index vector into the attributes HLADataElements.
virtual void reflectAttributeValues(const HLAIndexList& indexList, const RTIData& tag);
virtual void reflectAttributeValues(const HLAIndexList& indexList, const SGTimeStamp& timeStamp, const RTIData& tag);
// Reflect a single attribute value at the given index into the attributes HLADataELement.
virtual void reflectAttributeValue(unsigned index, const RTIData& tag);
virtual void reflectAttributeValue(unsigned index, const SGTimeStamp& timeStamp, const RTIData& tag);
class ReflectCallback : public SGReferenced {
public:
virtual ~ReflectCallback();
virtual void reflectAttributeValues(HLAObjectInstance&, const HLAIndexList&, const RTIData&) = 0;
virtual void reflectAttributeValues(HLAObjectInstance&, const HLAIndexList&, const SGTimeStamp&, const RTIData&) = 0;
};
void setReflectCallback(const SGSharedPtr<ReflectCallback>& reflectCallback)
{ _reflectCallback = reflectCallback; }
const SGSharedPtr<ReflectCallback>& getReflectCallback() const
{ return _reflectCallback; }
// deprecated.
class AttributeCallback : public SGReferenced { class AttributeCallback : public SGReferenced {
public: public:
virtual ~AttributeCallback() {} virtual ~AttributeCallback() {}
// Notification about reflect and whatever TBD
// Hmm, don't know yet how this should look like
virtual void updateAttributeValues(HLAObjectInstance& objectInstance, const RTIData& tag) virtual void updateAttributeValues(HLAObjectInstance& objectInstance, const RTIData& tag)
{ } { }
virtual void reflectAttributeValues(HLAObjectInstance& objectInstance, virtual void reflectAttributeValues(HLAObjectInstance& objectInstance,
const RTIIndexDataPairList& dataPairList, const RTIData& tag) const RTIIndexDataPairList& dataPairList, const RTIData& tag)
{ } { }
@@ -146,57 +76,24 @@ public:
const SGSharedPtr<AttributeCallback>& getAttributeCallback() const const SGSharedPtr<AttributeCallback>& getAttributeCallback() const
{ return _attributeCallback; } { return _attributeCallback; }
private: // Push the current values into the RTI
void _setRTIObjectInstance(RTIObjectInstance* rtiObjectInstance); void updateAttributeValues(const RTIData& tag);
void _clearRTIObjectInstance(); void updateAttributeValues(const SGTimeStamp& timeStamp, const RTIData& tag);
// The callback entry points from the RTI interface classes. private:
void _removeInstance(const RTIData& tag); void removeInstance(const RTIData& tag);
void _reflectAttributeValues(const HLAIndexList& indexList, const RTIData& tag); void reflectAttributeValues(const RTIIndexDataPairList& dataPairList, const RTIData& tag);
void _reflectAttributeValues(const HLAIndexList& indexList, const SGTimeStamp& timeStamp, const RTIData& tag); void reflectAttributeValues(const RTIIndexDataPairList& dataPairList, const SGTimeStamp& timeStamp, const RTIData& tag);
friend class RTIObjectInstance;
friend class HLAObjectClass;
class DataElementFactoryVisitor; class DataElementFactoryVisitor;
struct Attribute {
Attribute() : _enabledUpdate(false), _unconditionalUpdate(false) {}
SGSharedPtr<HLADataElement> _dataElement;
bool _enabledUpdate;
bool _unconditionalUpdate;
// HLAIndexList::iterator _unconditionalUpdateAttributeIndexListIterator;
// HLAIndexList::iterator _conditionalUpdateAttributeIndexListIterator;
};
typedef std::vector<Attribute> AttributeVector;
// At some time we want these: Until then, use the _enabledUpdate and _unconditionalUpdate flags in the Attribute struct.
// HLAIndexList _unconditionalUpdateAttributeIndexList;
// HLAIndexList _conditionalUpdateAttributeIndexList;
/// The parent Federate
SGWeakPtr<HLAFederate> _federate;
/// The ObjectClass
SGSharedPtr<HLAObjectClass> _objectClass;
/// The name as known in the RTI
std::string _name; std::string _name;
// /// The name as given by the local created instance SGWeakPtr<HLAObjectClass> _objectClass;
// std::string _givenName;
/// The underlying rti dispatcher class
SGSharedPtr<RTIObjectInstance> _rtiObjectInstance; SGSharedPtr<RTIObjectInstance> _rtiObjectInstance;
/// The attribute data
AttributeVector _attributeVector;
// Callback classes
SGSharedPtr<UpdateCallback> _updateCallback;
SGSharedPtr<ReflectCallback> _reflectCallback;
SGSharedPtr<AttributeCallback> _attributeCallback; SGSharedPtr<AttributeCallback> _attributeCallback;
friend class HLAFederate;
friend class HLAObjectClass;
friend class RTIObjectInstance;
}; };
} // namespace simgear } // namespace simgear
+11 -17
View File
@@ -1,4 +1,4 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de // Copyright (C) 2009 - 2011 Mathias Froehlich - Mathias.Froehlich@web.de
// //
// This library is free software; you can redistribute it and/or // This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public // modify it under the terms of the GNU Library General Public
@@ -15,12 +15,6 @@
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
// //
#ifdef HAVE_CONFIG_H
# include <simgear_config.h>
#endif
#include <simgear/compiler.h>
#include "HLAPropertyDataElement.hxx" #include "HLAPropertyDataElement.hxx"
#include "HLAArrayDataElement.hxx" #include "HLAArrayDataElement.hxx"
@@ -28,7 +22,7 @@
#include "HLADataElementVisitor.hxx" #include "HLADataElementVisitor.hxx"
#include "HLADataTypeVisitor.hxx" #include "HLADataTypeVisitor.hxx"
#include "HLAFixedRecordDataElement.hxx" #include "HLAFixedRecordDataElement.hxx"
#include "HLAVariantRecordDataElement.hxx" #include "HLAVariantDataElement.hxx"
namespace simgear { namespace simgear {
@@ -379,14 +373,14 @@ public:
_dataElement = recordDataElement; _dataElement = recordDataElement;
} }
class VariantRecordDataElementFactory : public HLAVariantRecordDataElement::DataElementFactory { class VariantDataElementFactory : public HLAVariantDataElement::DataElementFactory {
public: public:
VariantRecordDataElementFactory(SGPropertyNode* propertyNode) : VariantDataElementFactory(SGPropertyNode* propertyNode) :
_propertyNode(propertyNode) _propertyNode(propertyNode)
{ } { }
virtual HLADataElement* createElement(const HLAVariantRecordDataElement& element, unsigned index) virtual HLADataElement* createElement(const HLAVariantDataElement& element, unsigned index)
{ {
const HLAVariantRecordDataType* dataType = element.getDataType(); const HLAVariantDataType* dataType = element.getDataType();
if (!dataType) if (!dataType)
return 0; return 0;
const HLADataType* alternativeDataType = element.getAlternativeDataType(); const HLADataType* alternativeDataType = element.getAlternativeDataType();
@@ -400,12 +394,12 @@ public:
SGSharedPtr<SGPropertyNode> _propertyNode; SGSharedPtr<SGPropertyNode> _propertyNode;
}; };
virtual void apply(const HLAVariantRecordDataType& dataType) virtual void apply(const HLAVariantDataType& dataType)
{ {
SGSharedPtr<HLAVariantRecordDataElement> variantRecordDataElement; SGSharedPtr<HLAVariantDataElement> variantDataElement;
variantRecordDataElement = new HLAVariantRecordDataElement(&dataType); variantDataElement = new HLAVariantDataElement(&dataType);
variantRecordDataElement->setDataElementFactory(new VariantRecordDataElementFactory(_propertyNode.get())); variantDataElement->setDataElementFactory(new VariantDataElementFactory(_propertyNode.get()));
_dataElement = variantRecordDataElement; _dataElement = variantDataElement;
} }
HLADataElement* getDataElement() HLADataElement* getDataElement()
+1 -7
View File
@@ -1,4 +1,4 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de // Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
// //
// This library is free software; you can redistribute it and/or // This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public // modify it under the terms of the GNU Library General Public
@@ -15,12 +15,6 @@
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
// //
#ifdef HAVE_CONFIG_H
# include <simgear_config.h>
#endif
#include <simgear/compiler.h>
#include "HLARawDataElement.hxx" #include "HLARawDataElement.hxx"
namespace simgear { namespace simgear {
-47
View File
@@ -1,47 +0,0 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Library General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
#ifndef HLATypes_hxx
#define HLATypes_hxx
#include <list>
namespace simgear {
enum HLASubscriptionType {
HLAUnsubscribed,
HLASubscribedActive,
HLASubscribedPassive
};
enum HLAPublicationType {
HLAUnpublished,
HLAPublished
};
enum HLAUpdateType {
HLAStaticUpdate,
HLAPeriodicUpdate,
HLAConditionalUpdate,
HLAUndefinedUpdate
};
typedef std::list<unsigned> HLAIndexList;
} // namespace simgear
#endif
+169
View File
@@ -0,0 +1,169 @@
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Library General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
#include "HLAVariantDataElement.hxx"
#include <simgear/debug/logstream.hxx>
#include "HLADataElementVisitor.hxx"
namespace simgear {
HLAAbstractVariantDataElement::HLAAbstractVariantDataElement(const HLAVariantDataType* dataType) :
_dataType(dataType)
{
}
HLAAbstractVariantDataElement::~HLAAbstractVariantDataElement()
{
}
void
HLAAbstractVariantDataElement::accept(HLADataElementVisitor& visitor)
{
visitor.apply(*this);
}
void
HLAAbstractVariantDataElement::accept(HLAConstDataElementVisitor& visitor) const
{
visitor.apply(*this);
}
bool
HLAAbstractVariantDataElement::decode(HLADecodeStream& stream)
{
if (!_dataType.valid())
return false;
return _dataType->decode(stream, *this);
}
bool
HLAAbstractVariantDataElement::encode(HLAEncodeStream& stream) const
{
if (!_dataType.valid())
return false;
return _dataType->encode(stream, *this);
}
const HLAVariantDataType*
HLAAbstractVariantDataElement::getDataType() const
{
return _dataType.get();
}
bool
HLAAbstractVariantDataElement::setDataType(const HLADataType* dataType)
{
const HLAVariantDataType* variantDataType = dataType->toVariantDataType();
if (!variantDataType) {
SG_LOG(SG_NETWORK, SG_WARN, "HLAVariantDataType: unable to set data type!");
return false;
}
setDataType(variantDataType);
return true;
}
void
HLAAbstractVariantDataElement::setDataType(const HLAVariantDataType* dataType)
{
_dataType = dataType;
}
std::string
HLAAbstractVariantDataElement::getAlternativeName() const
{
if (!_dataType.valid())
return std::string();
return _dataType->getAlternativeName(getAlternativeIndex());
}
const HLADataType*
HLAAbstractVariantDataElement::getAlternativeDataType() const
{
if (!_dataType.valid())
return 0;
return _dataType->getAlternativeDataType(getAlternativeIndex());
}
HLAVariantDataElement::DataElementFactory::~DataElementFactory()
{
}
HLAVariantDataElement::HLAVariantDataElement(const HLAVariantDataType* dataType) :
HLAAbstractVariantDataElement(dataType),
_alternativeIndex(~0u)
{
}
HLAVariantDataElement::~HLAVariantDataElement()
{
}
bool
HLAVariantDataElement::setAlternativeIndex(unsigned index)
{
if (_alternativeIndex == index)
return true;
SGSharedPtr<HLADataElement> dataElement = newElement(index);
if (!dataElement.valid())
return false;
_dataElement.swap(dataElement);
_alternativeIndex = index;
return true;
}
bool
HLAVariantDataElement::decodeAlternative(HLADecodeStream& stream)
{
return _dataElement->decode(stream);
}
unsigned
HLAVariantDataElement::getAlternativeIndex() const
{
return _alternativeIndex;
}
bool
HLAVariantDataElement::encodeAlternative(HLAEncodeStream& stream) const
{
return _dataElement->encode(stream);
}
void
HLAVariantDataElement::setDataElementFactory(HLAVariantDataElement::DataElementFactory* dataElementFactory)
{
_dataElementFactory = dataElementFactory;
}
HLAVariantDataElement::DataElementFactory*
HLAVariantDataElement::getDataElementFactory()
{
return _dataElementFactory;
}
HLADataElement*
HLAVariantDataElement::newElement(unsigned index)
{
if (!_dataElementFactory.valid())
return 0;
return _dataElementFactory->createElement(*this, index);
}
}
+58 -4
View File
@@ -1,4 +1,4 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de // Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
// //
// This library is free software; you can redistribute it and/or // This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public // modify it under the terms of the GNU Library General Public
@@ -18,13 +18,67 @@
#ifndef HLAVariantDataElement_hxx #ifndef HLAVariantDataElement_hxx
#define HLAVariantDataElement_hxx #define HLAVariantDataElement_hxx
#include <string>
#include <simgear/structure/SGSharedPtr.hxx>
#include "HLADataElement.hxx"
#include "HLAVariantDataType.hxx" #include "HLAVariantDataType.hxx"
#include "HLAVariantRecordDataElement.hxx"
namespace simgear { namespace simgear {
typedef HLAAbstractVariantRecordDataElement HLAAbstractVariantDataElement; class HLAAbstractVariantDataElement : public HLADataElement {
typedef HLAVariantRecordDataElement HLAVariantDataElement; public:
HLAAbstractVariantDataElement(const HLAVariantDataType* dataType);
virtual ~HLAAbstractVariantDataElement();
virtual void accept(HLADataElementVisitor& visitor);
virtual void accept(HLAConstDataElementVisitor& visitor) const;
virtual bool decode(HLADecodeStream& stream);
virtual bool encode(HLAEncodeStream& stream) const;
virtual const HLAVariantDataType* getDataType() const;
virtual bool setDataType(const HLADataType* dataType);
void setDataType(const HLAVariantDataType* dataType);
std::string getAlternativeName() const;
const HLADataType* getAlternativeDataType() const;
virtual bool setAlternativeIndex(unsigned index) = 0;
virtual bool decodeAlternative(HLADecodeStream& stream) = 0;
virtual unsigned getAlternativeIndex() const = 0;
virtual bool encodeAlternative(HLAEncodeStream& stream) const = 0;
private:
SGSharedPtr<const HLAVariantDataType> _dataType;
};
class HLAVariantDataElement : public HLAAbstractVariantDataElement {
public:
HLAVariantDataElement(const HLAVariantDataType* dataType);
virtual ~HLAVariantDataElement();
virtual bool setAlternativeIndex(unsigned index);
virtual bool decodeAlternative(HLADecodeStream& stream);
virtual unsigned getAlternativeIndex() const;
virtual bool encodeAlternative(HLAEncodeStream& stream) const;
class DataElementFactory : public SGReferenced {
public:
virtual ~DataElementFactory();
virtual HLADataElement* createElement(const HLAVariantDataElement&, unsigned) = 0;
};
void setDataElementFactory(DataElementFactory* dataElementFactory);
DataElementFactory* getDataElementFactory();
private:
HLADataElement* newElement(unsigned index);
SGSharedPtr<HLADataElement> _dataElement;
unsigned _alternativeIndex;
SGSharedPtr<DataElementFactory> _dataElementFactory;
};
} }
@@ -1,4 +1,4 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de // Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
// //
// This library is free software; you can redistribute it and/or // This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public // modify it under the terms of the GNU Library General Public
@@ -15,49 +15,36 @@
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
// //
#ifdef HAVE_CONFIG_H #include "HLAVariantDataType.hxx"
# include <simgear_config.h>
#endif
#include <simgear/compiler.h>
#include "HLAVariantRecordDataType.hxx"
#include "HLADataTypeVisitor.hxx" #include "HLADataTypeVisitor.hxx"
#include "HLAVariantRecordDataElement.hxx" #include "HLAVariantDataElement.hxx"
namespace simgear { namespace simgear {
HLAVariantRecordDataType::HLAVariantRecordDataType(const std::string& name) : HLAVariantDataType::HLAVariantDataType(const std::string& name) :
HLADataType(name) HLADataType(name)
{ {
} }
HLAVariantRecordDataType::~HLAVariantRecordDataType() HLAVariantDataType::~HLAVariantDataType()
{ {
} }
void void
HLAVariantRecordDataType::accept(HLADataTypeVisitor& visitor) const HLAVariantDataType::accept(HLADataTypeVisitor& visitor) const
{ {
visitor.apply(*this); visitor.apply(*this);
} }
const HLAVariantRecordDataType* const HLAVariantDataType*
HLAVariantRecordDataType::toVariantRecordDataType() const HLAVariantDataType::toVariantDataType() const
{ {
return this; return this;
} }
void
HLAVariantRecordDataType::releaseDataTypeReferences()
{
for (AlternativeList::iterator i = _alternativeList.begin(); i != _alternativeList.end(); ++i)
i->_dataType = 0;
}
bool bool
HLAVariantRecordDataType::decode(HLADecodeStream& stream, HLAAbstractVariantRecordDataElement& value) const HLAVariantDataType::decode(HLADecodeStream& stream, HLAAbstractVariantDataElement& value) const
{ {
if (!stream.alignOffsetForSize(getAlignment())) if (!stream.alignOffsetForSize(getAlignment()))
return false; return false;
@@ -74,7 +61,7 @@ HLAVariantRecordDataType::decode(HLADecodeStream& stream, HLAAbstractVariantReco
} }
bool bool
HLAVariantRecordDataType::encode(HLAEncodeStream& stream, const HLAAbstractVariantRecordDataElement& value) const HLAVariantDataType::encode(HLAEncodeStream& stream, const HLAAbstractVariantDataElement& value) const
{ {
if (!stream.alignOffsetForSize(getAlignment())) if (!stream.alignOffsetForSize(getAlignment()))
return false; return false;
@@ -89,14 +76,14 @@ HLAVariantRecordDataType::encode(HLAEncodeStream& stream, const HLAAbstractVaria
} }
void void
HLAVariantRecordDataType::setEnumeratedDataType(HLAEnumeratedDataType* dataType) HLAVariantDataType::setEnumeratedDataType(HLAEnumeratedDataType* dataType)
{ {
_enumeratedDataType = dataType; _enumeratedDataType = dataType;
} }
bool bool
HLAVariantRecordDataType::addAlternative(const std::string& name, const std::string& enumerator, HLAVariantDataType::addAlternative(const std::string& name, const std::string& enumerator,
const HLADataType* dataType, const std::string& semantics) const HLADataType* dataType, const std::string& semantics)
{ {
if (!_enumeratedDataType.valid()) if (!_enumeratedDataType.valid())
return false; return false;
@@ -107,20 +94,8 @@ HLAVariantRecordDataType::addAlternative(const std::string& name, const std::str
_alternativeList[index]._name = name; _alternativeList[index]._name = name;
_alternativeList[index]._dataType = dataType; _alternativeList[index]._dataType = dataType;
_alternativeList[index]._semantics = semantics; _alternativeList[index]._semantics = semantics;
setAlignment(SGMisc<unsigned>::max(getAlignment(), dataType->getAlignment()));
return true; return true;
} }
void
HLAVariantRecordDataType::_recomputeAlignmentImplementation()
{
unsigned alignment = 1;
if (const HLADataType* dataType = getEnumeratedDataType())
alignment = std::max(alignment, dataType->getAlignment());
for (unsigned i = 0; i < getNumAlternatives(); ++i) {
if (const HLADataType* dataType = getAlternativeDataType(i))
alignment = std::max(alignment, dataType->getAlignment());
}
setAlignment(alignment);
}
} // namespace simgear } // namespace simgear
+76 -3
View File
@@ -1,4 +1,4 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de // Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
// //
// This library is free software; you can redistribute it and/or // This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public // modify it under the terms of the GNU Library General Public
@@ -18,11 +18,84 @@
#ifndef HLAVariantDataType_hxx #ifndef HLAVariantDataType_hxx
#define HLAVariantDataType_hxx #define HLAVariantDataType_hxx
#include "HLAVariantRecordDataType.hxx" #include <string>
#include <vector>
#include "simgear/structure/SGSharedPtr.hxx"
#include "HLADataType.hxx"
#include "HLAEnumeratedDataType.hxx"
namespace simgear { namespace simgear {
typedef HLAVariantRecordDataType HLAVariantDataType; class HLAAbstractVariantDataElement;
class HLAVariantDataType : public HLADataType {
public:
HLAVariantDataType(const std::string& name = "HLAVariantDataType");
virtual ~HLAVariantDataType();
virtual void accept(HLADataTypeVisitor& visitor) const;
virtual const HLAVariantDataType* toVariantDataType() const;
virtual bool decode(HLADecodeStream& stream, HLAAbstractVariantDataElement& value) const;
virtual bool encode(HLAEncodeStream& stream, const HLAAbstractVariantDataElement& value) const;
const HLAEnumeratedDataType* getEnumeratedDataType() const
{ return _enumeratedDataType.get(); }
void setEnumeratedDataType(HLAEnumeratedDataType* dataType);
bool addAlternative(const std::string& name, const std::string& enumerator,
const HLADataType* dataType, const std::string& semantics);
unsigned getNumAlternatives() const
{ return _alternativeList.size(); }
unsigned getAlternativeIndex(const std::string& enumerator) const
{
if (!_enumeratedDataType.valid())
return ~unsigned(0);
return _enumeratedDataType->getIndex(enumerator);
}
const HLADataType* getAlternativeDataType(unsigned index) const
{
if (_alternativeList.size() <= index)
return 0;
return _alternativeList[index]._dataType.get();
}
const HLADataType* getAlternativeDataType(const std::string& enumerator) const
{ return getAlternativeDataType(getAlternativeIndex(enumerator)); }
std::string getAlternativeName(unsigned index) const
{
if (_alternativeList.size() <= index)
return std::string();
return _alternativeList[index]._name;
}
std::string getAlternativeName(const std::string& enumerator) const
{ return getAlternativeName(getAlternativeIndex(enumerator)); }
std::string getAlternativeSemantics(unsigned index) const
{
if (_alternativeList.size() <= index)
return std::string();
return _alternativeList[index]._semantics;
}
std::string getAlternativeSemantics(const std::string& enumerator) const
{ return getAlternativeSemantics(getAlternativeIndex(enumerator)); }
private:
SGSharedPtr<HLAEnumeratedDataType> _enumeratedDataType;
struct Alternative {
std::string _name;
SGSharedPtr<const HLADataType> _dataType;
std::string _semantics;
};
typedef std::vector<Alternative> AlternativeList;
AlternativeList _alternativeList;
};
} // namespace simgear } // namespace simgear
-190
View File
@@ -1,190 +0,0 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Library General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
#ifdef HAVE_CONFIG_H
# include <simgear_config.h>
#endif
#include <simgear/compiler.h>
#include "HLAVariantRecordDataElement.hxx"
#include <simgear/debug/logstream.hxx>
#include "HLADataElementVisitor.hxx"
namespace simgear {
HLAAbstractVariantRecordDataElement::HLAAbstractVariantRecordDataElement(const HLAVariantRecordDataType* dataType) :
_dataType(dataType)
{
}
HLAAbstractVariantRecordDataElement::~HLAAbstractVariantRecordDataElement()
{
}
void
HLAAbstractVariantRecordDataElement::accept(HLADataElementVisitor& visitor)
{
visitor.apply(*this);
}
void
HLAAbstractVariantRecordDataElement::accept(HLAConstDataElementVisitor& visitor) const
{
visitor.apply(*this);
}
bool
HLAAbstractVariantRecordDataElement::decode(HLADecodeStream& stream)
{
if (!_dataType.valid())
return false;
return _dataType->decode(stream, *this);
}
bool
HLAAbstractVariantRecordDataElement::encode(HLAEncodeStream& stream) const
{
if (!_dataType.valid())
return false;
return _dataType->encode(stream, *this);
}
const HLAVariantRecordDataType*
HLAAbstractVariantRecordDataElement::getDataType() const
{
return _dataType.get();
}
bool
HLAAbstractVariantRecordDataElement::setDataType(const HLADataType* dataType)
{
const HLAVariantRecordDataType* variantRecordDataType = dataType->toVariantRecordDataType();
if (!variantRecordDataType) {
SG_LOG(SG_NETWORK, SG_WARN, "HLAVariantRecordDataType: unable to set data type!");
return false;
}
setDataType(variantRecordDataType);
return true;
}
void
HLAAbstractVariantRecordDataElement::setDataType(const HLAVariantRecordDataType* dataType)
{
_dataType = dataType;
}
std::string
HLAAbstractVariantRecordDataElement::getAlternativeName() const
{
if (!_dataType.valid())
return std::string();
return _dataType->getAlternativeName(getAlternativeIndex());
}
const HLADataType*
HLAAbstractVariantRecordDataElement::getAlternativeDataType() const
{
if (!_dataType.valid())
return 0;
return _dataType->getAlternativeDataType(getAlternativeIndex());
}
HLAVariantRecordDataElement::DataElementFactory::~DataElementFactory()
{
}
HLAVariantRecordDataElement::HLAVariantRecordDataElement(const HLAVariantRecordDataType* dataType) :
HLAAbstractVariantRecordDataElement(dataType),
_alternativeIndex(~0u)
{
}
HLAVariantRecordDataElement::~HLAVariantRecordDataElement()
{
clearStamp();
}
bool
HLAVariantRecordDataElement::setAlternativeIndex(unsigned index)
{
if (_alternativeIndex == index)
return true;
SGSharedPtr<HLADataElement> dataElement = newElement(index);
if (!dataElement.valid())
return false;
_dataElement.swap(dataElement);
_alternativeIndex = index;
setDirty(true);
return true;
}
bool
HLAVariantRecordDataElement::decodeAlternative(HLADecodeStream& stream)
{
return _dataElement->decode(stream);
}
unsigned
HLAVariantRecordDataElement::getAlternativeIndex() const
{
return _alternativeIndex;
}
bool
HLAVariantRecordDataElement::encodeAlternative(HLAEncodeStream& stream) const
{
return _dataElement->encode(stream);
}
void
HLAVariantRecordDataElement::setDataElementFactory(HLAVariantRecordDataElement::DataElementFactory* dataElementFactory)
{
_dataElementFactory = dataElementFactory;
}
HLAVariantRecordDataElement::DataElementFactory*
HLAVariantRecordDataElement::getDataElementFactory()
{
return _dataElementFactory;
}
void
HLAVariantRecordDataElement::_setStamp(Stamp* stamp)
{
HLAAbstractVariantRecordDataElement::_setStamp(stamp);
if (!_dataElement.valid())
return;
_dataElement->attachStamp(*this);
}
HLADataElement*
HLAVariantRecordDataElement::newElement(unsigned index)
{
if (!_dataElementFactory.valid())
return 0;
HLADataElement* dataElement = _dataElementFactory->createElement(*this, index);
if (!dataElement)
return 0;
dataElement->attachStamp(*this);
return dataElement;
}
}
@@ -1,88 +0,0 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Library General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
#ifndef HLAVariantRecordDataElement_hxx
#define HLAVariantRecordDataElement_hxx
#include <string>
#include <simgear/structure/SGSharedPtr.hxx>
#include "HLADataElement.hxx"
#include "HLAVariantRecordDataType.hxx"
namespace simgear {
class HLAAbstractVariantRecordDataElement : public HLADataElement {
public:
HLAAbstractVariantRecordDataElement(const HLAVariantRecordDataType* dataType);
virtual ~HLAAbstractVariantRecordDataElement();
virtual void accept(HLADataElementVisitor& visitor);
virtual void accept(HLAConstDataElementVisitor& visitor) const;
virtual bool decode(HLADecodeStream& stream);
virtual bool encode(HLAEncodeStream& stream) const;
virtual const HLAVariantRecordDataType* getDataType() const;
virtual bool setDataType(const HLADataType* dataType);
void setDataType(const HLAVariantRecordDataType* dataType);
std::string getAlternativeName() const;
const HLADataType* getAlternativeDataType() const;
virtual bool setAlternativeIndex(unsigned index) = 0;
virtual bool decodeAlternative(HLADecodeStream& stream) = 0;
virtual unsigned getAlternativeIndex() const = 0;
virtual bool encodeAlternative(HLAEncodeStream& stream) const = 0;
private:
SGSharedPtr<const HLAVariantRecordDataType> _dataType;
};
class HLAVariantRecordDataElement : public HLAAbstractVariantRecordDataElement {
public:
HLAVariantRecordDataElement(const HLAVariantRecordDataType* dataType);
virtual ~HLAVariantRecordDataElement();
virtual bool setAlternativeIndex(unsigned index);
virtual bool decodeAlternative(HLADecodeStream& stream);
virtual unsigned getAlternativeIndex() const;
virtual bool encodeAlternative(HLAEncodeStream& stream) const;
class DataElementFactory : public SGReferenced {
public:
virtual ~DataElementFactory();
virtual HLADataElement* createElement(const HLAVariantRecordDataElement&, unsigned) = 0;
};
void setDataElementFactory(DataElementFactory* dataElementFactory);
DataElementFactory* getDataElementFactory();
protected:
virtual void _setStamp(Stamp* stamp);
private:
HLADataElement* newElement(unsigned index);
SGSharedPtr<HLADataElement> _dataElement;
unsigned _alternativeIndex;
SGSharedPtr<DataElementFactory> _dataElementFactory;
};
}
#endif
-107
View File
@@ -1,107 +0,0 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Library General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
#ifndef HLAVariantRecordDataType_hxx
#define HLAVariantRecordDataType_hxx
#include <string>
#include <vector>
#include "simgear/structure/SGSharedPtr.hxx"
#include "HLADataType.hxx"
#include "HLAEnumeratedDataType.hxx"
namespace simgear {
class HLAAbstractVariantRecordDataElement;
class HLAVariantRecordDataType : public HLADataType {
public:
HLAVariantRecordDataType(const std::string& name = "HLAVariantRecordDataType");
virtual ~HLAVariantRecordDataType();
virtual void accept(HLADataTypeVisitor& visitor) const;
virtual const HLAVariantRecordDataType* toVariantRecordDataType() const;
virtual void releaseDataTypeReferences();
virtual bool decode(HLADecodeStream& stream, HLAAbstractVariantRecordDataElement& value) const;
virtual bool encode(HLAEncodeStream& stream, const HLAAbstractVariantRecordDataElement& value) const;
const HLAEnumeratedDataType* getEnumeratedDataType() const
{ return _enumeratedDataType.get(); }
void setEnumeratedDataType(HLAEnumeratedDataType* dataType);
bool addAlternative(const std::string& name, const std::string& enumerator,
const HLADataType* dataType, const std::string& semantics);
unsigned getNumAlternatives() const
{ return _alternativeList.size(); }
unsigned getAlternativeIndex(const std::string& enumerator) const
{
if (!_enumeratedDataType.valid())
return ~unsigned(0);
return _enumeratedDataType->getIndex(enumerator);
}
const HLADataType* getAlternativeDataType(unsigned index) const
{
if (_alternativeList.size() <= index)
return 0;
return _alternativeList[index]._dataType.get();
}
const HLADataType* getAlternativeDataType(const std::string& enumerator) const
{ return getAlternativeDataType(getAlternativeIndex(enumerator)); }
std::string getAlternativeName(unsigned index) const
{
if (_alternativeList.size() <= index)
return std::string();
return _alternativeList[index]._name;
}
std::string getAlternativeName(const std::string& enumerator) const
{ return getAlternativeName(getAlternativeIndex(enumerator)); }
std::string getAlternativeSemantics(unsigned index) const
{
if (_alternativeList.size() <= index)
return std::string();
return _alternativeList[index]._semantics;
}
std::string getAlternativeSemantics(const std::string& enumerator) const
{ return getAlternativeSemantics(getAlternativeIndex(enumerator)); }
protected:
virtual void _recomputeAlignmentImplementation();
private:
SGSharedPtr<HLAEnumeratedDataType> _enumeratedDataType;
struct Alternative {
std::string _name;
SGSharedPtr<const HLADataType> _dataType;
std::string _semantics;
};
typedef std::vector<Alternative> AlternativeList;
AlternativeList _alternativeList;
};
} // namespace simgear
#endif
+62 -21
View File
@@ -71,22 +71,11 @@ public:
{ _rtiAmbassador.publishObjectClass(handle, attributeHandleSet); } { _rtiAmbassador.publishObjectClass(handle, attributeHandleSet); }
void unpublishObjectClass(const RTI::ObjectClassHandle& handle) void unpublishObjectClass(const RTI::ObjectClassHandle& handle)
{ _rtiAmbassador.unpublishObjectClass(handle); } { _rtiAmbassador.unpublishObjectClass(handle); }
void publishInteractionClass(const RTI::InteractionClassHandle& handle)
{ _rtiAmbassador.publishInteractionClass(handle); }
void unpublishInteractionClass(const RTI::InteractionClassHandle& handle)
{ _rtiAmbassador.unpublishInteractionClass(handle); }
void subscribeObjectClassAttributes(const RTI::ObjectClassHandle& handle, const RTI::AttributeHandleSet& attributeHandleSet, bool active) void subscribeObjectClassAttributes(const RTI::ObjectClassHandle& handle, const RTI::AttributeHandleSet& attributeHandleSet, bool active)
{ _rtiAmbassador.subscribeObjectClassAttributes(handle, attributeHandleSet, active ? RTI::RTI_TRUE : RTI::RTI_FALSE); } { _rtiAmbassador.subscribeObjectClassAttributes(handle, attributeHandleSet, active ? RTI::RTI_TRUE : RTI::RTI_FALSE); }
void unsubscribeObjectClass(const RTI::ObjectClassHandle& handle) void unsubscribeObjectClass(const RTI::ObjectClassHandle& handle)
{ _rtiAmbassador.unsubscribeObjectClass(handle); } { _rtiAmbassador.unsubscribeObjectClass(handle); }
void subscribeInteractionClass(const RTI::InteractionClassHandle& handle, bool active)
{ _rtiAmbassador.subscribeInteractionClass(handle, active ? RTI::RTI_TRUE : RTI::RTI_FALSE); }
void unsubscribeInteractionClass(const RTI::InteractionClassHandle& handle)
{ _rtiAmbassador.unsubscribeInteractionClass(handle); }
RTI::ObjectHandle registerObjectInstance(const RTI::ObjectClassHandle& handle) RTI::ObjectHandle registerObjectInstance(const RTI::ObjectClassHandle& handle)
{ return _rtiAmbassador.registerObjectInstance(handle); } { return _rtiAmbassador.registerObjectInstance(handle); }
void updateAttributeValues(const RTI::ObjectHandle& objectHandle, const RTI::AttributeHandleValuePairSet& attributeValues, void updateAttributeValues(const RTI::ObjectHandle& objectHandle, const RTI::AttributeHandleValuePairSet& attributeValues,
@@ -275,8 +264,20 @@ public:
// } // }
// return false; // return false;
// } // }
bool isAttributeOwnedByFederate(const RTI::ObjectHandle& objectHandle, const RTI::AttributeHandle& attributeHandle) // bool isAttributeOwnedByFederate(const RTIHandle& objectHandle, const RTIHandle& attributeHandle)
{ return _rtiAmbassador.isAttributeOwnedByFederate(objectHandle, attributeHandle); } // {
// try {
// return _rtiAmbassador.isAttributeOwnedByFederate(objectHandle, attributeHandle);
// } catch (RTI::ObjectNotKnown& e) {
// } catch (RTI::AttributeNotDefined& e) {
// } catch (RTI::FederateNotExecutionMember& e) {
// } catch (RTI::ConcurrentAccessAttempted& e) {
// } catch (RTI::SaveInProgress& e) {
// } catch (RTI::RestoreInProgress& e) {
// } catch (RTI::RTIinternalError& e) {
// }
// return false;
// }
/// Time Management /// Time Management
@@ -346,15 +347,55 @@ public:
std::string getAttributeName(const RTI::AttributeHandle& attributeHandle, const RTI::ObjectClassHandle& objectClassHandle) std::string getAttributeName(const RTI::AttributeHandle& attributeHandle, const RTI::ObjectClassHandle& objectClassHandle)
{ return rtiToStdString(_rtiAmbassador.getAttributeName(attributeHandle, objectClassHandle)); } { return rtiToStdString(_rtiAmbassador.getAttributeName(attributeHandle, objectClassHandle)); }
RTI::InteractionClassHandle getInteractionClassHandle(const std::string& name) // RTIHandle getInteractionClassHandle(const std::string& name)
{ return _rtiAmbassador.getInteractionClassHandle(name.c_str()); } // {
std::string getInteractionClassName(const RTI::InteractionClassHandle& handle) // try {
{ return rtiToStdString(_rtiAmbassador.getInteractionClassName(handle)); } // return _rtiAmbassador.getInteractionClassHandle(name.c_str());
// } catch (RTI::NameNotFound& e) {
// } catch (RTI::FederateNotExecutionMember& e) {
// } catch (RTI::ConcurrentAccessAttempted& e) {
// } catch (RTI::RTIinternalError& e) {
// }
// return RTIHandle(-1);
// }
// std::string getInteractionClassName(const RTIHandle& handle)
// {
// std::string name;
// try {
// rtiToStdString(name, _rtiAmbassador.getInteractionClassName(handle));
// } catch (RTI::InteractionClassNotDefined& e) {
// } catch (RTI::FederateNotExecutionMember& e) {
// } catch (RTI::ConcurrentAccessAttempted& e) {
// } catch (RTI::RTIinternalError& e) {
// }
// return name;
// }
RTI::ParameterHandle getParameterHandle(const std::string& parameterName, const RTI::InteractionClassHandle& interactionClassHandle) // RTIHandle getParameterHandle(const std::string& parameterName, const RTIHandle& interactionClassHandle)
{ return _rtiAmbassador.getParameterHandle(parameterName.c_str(), interactionClassHandle); } // {
std::string getParameterName(const RTI::ParameterHandle& parameterHandle, const RTI::InteractionClassHandle& interactionClassHandle) // try {
{ return rtiToStdString(_rtiAmbassador.getParameterName(parameterHandle, interactionClassHandle)); } // return _rtiAmbassador.getParameterHandle(parameterName.c_str(), interactionClassHandle);
// } catch (RTI::InteractionClassNotDefined& e) {
// } catch (RTI::NameNotFound& e) {
// } catch (RTI::FederateNotExecutionMember& e) {
// } catch (RTI::ConcurrentAccessAttempted& e) {
// } catch (RTI::RTIinternalError& e) {
// }
// return RTIHandle(-1);
// }
// std::string getParameterName(const RTIHandle& parameterHandle, const RTIHandle& interactionClassHandle)
// {
// std::string parameterName;
// try {
// rtiToStdString(parameterName, _rtiAmbassador.getParameterName(parameterHandle, interactionClassHandle));
// } catch (RTI::InteractionClassNotDefined& e) {
// } catch (RTI::InteractionParameterNotDefined& e) {
// } catch (RTI::FederateNotExecutionMember& e) {
// } catch (RTI::ConcurrentAccessAttempted& e) {
// } catch (RTI::RTIinternalError& e) {
// }
// return parameterName;
// }
RTI::ObjectHandle getObjectInstanceHandle(const std::string& name) RTI::ObjectHandle getObjectInstanceHandle(const std::string& name)
{ return _rtiAmbassador.getObjectInstanceHandle(name.c_str()); } { return _rtiAmbassador.getObjectInstanceHandle(name.c_str()); }
+4 -46
View File
@@ -1,4 +1,4 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de // Copyright (C) 2009 - 2011 Mathias Froehlich - Mathias.Froehlich@web.de
// //
// This library is free software; you can redistribute it and/or // This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public // modify it under the terms of the GNU Library General Public
@@ -15,12 +15,6 @@
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
// //
#ifdef HAVE_CONFIG_H
# include <simgear_config.h>
#endif
#include <simgear/compiler.h>
#include "RTI13Federate.hxx" #include "RTI13Federate.hxx"
#include "RTI13Ambassador.hxx" #include "RTI13Ambassador.hxx"
@@ -228,7 +222,7 @@ struct RTI13Federate::FederateAmbassador : public RTI::FederateAmbassador {
return; return;
if (!i->second.valid()) if (!i->second.valid())
return; return;
SGSharedPtr<RTI13ObjectInstance> objectInstance = new RTI13ObjectInstance(objectHandle, 0, i->second, _rtiAmbassador.get()); SGSharedPtr<RTI13ObjectInstance> objectInstance = new RTI13ObjectInstance(objectHandle, 0, i->second, _rtiAmbassador.get(), false);
_objectInstanceMap[objectHandle] = objectInstance; _objectInstanceMap[objectHandle] = objectInstance;
i->second->discoverInstance(objectInstance.get(), tag); i->second->discoverInstance(objectInstance.get(), tag);
} }
@@ -284,7 +278,7 @@ struct RTI13Federate::FederateAmbassador : public RTI::FederateAmbassador {
return; return;
if (!i->second.valid()) if (!i->second.valid())
return; return;
i->second->reflectAttributeValues(attributeHandleDataPairList, timeStamp, tag, _indexPool); i->second->reflectAttributeValues(attributeHandleDataPairList, timeStamp, tag);
} }
class ReflectAttributeValuesCallback : public TagQueueCallback { class ReflectAttributeValuesCallback : public TagQueueCallback {
@@ -333,7 +327,7 @@ struct RTI13Federate::FederateAmbassador : public RTI::FederateAmbassador {
return; return;
if (!i->second.valid()) if (!i->second.valid())
return; return;
i->second->reflectAttributeValues(attributeHandleDataPairList, tag, _indexPool); i->second->reflectAttributeValues(attributeHandleDataPairList, tag);
} }
virtual void receiveInteraction(RTI::InteractionClassHandle interactionClassHandle, const RTI::ParameterHandleValuePairSet& parameters, virtual void receiveInteraction(RTI::InteractionClassHandle interactionClassHandle, const RTI::ParameterHandleValuePairSet& parameters,
@@ -861,9 +855,6 @@ struct RTI13Federate::FederateAmbassador : public RTI::FederateAmbassador {
void freeAttributeHandleDataPairList(RTI13AttributeHandleDataPairList& attributeHandleDataPairList) void freeAttributeHandleDataPairList(RTI13AttributeHandleDataPairList& attributeHandleDataPairList)
{ _attributeHandleDataPairPool.splice(_attributeHandleDataPairPool.end(), attributeHandleDataPairList); } { _attributeHandleDataPairPool.splice(_attributeHandleDataPairPool.end(), attributeHandleDataPairList); }
// For attribute reflection, pool or indices
HLAIndexList _indexPool;
// Top level information for dispatching federate object attribute updates // Top level information for dispatching federate object attribute updates
typedef std::map<RTI::ObjectHandle, SGSharedPtr<RTI13ObjectInstance> > ObjectInstanceMap; typedef std::map<RTI::ObjectHandle, SGSharedPtr<RTI13ObjectInstance> > ObjectInstanceMap;
// Map of all available objects // Map of all available objects
@@ -873,10 +864,6 @@ struct RTI13Federate::FederateAmbassador : public RTI::FederateAmbassador {
typedef std::map<RTI::ObjectClassHandle, SGSharedPtr<RTI13ObjectClass> > ObjectClassMap; typedef std::map<RTI::ObjectClassHandle, SGSharedPtr<RTI13ObjectClass> > ObjectClassMap;
ObjectClassMap _objectClassMap; ObjectClassMap _objectClassMap;
// Top level information for dispatching creation of federate objects
typedef std::map<RTI::InteractionClassHandle, SGSharedPtr<RTI13InteractionClass> > InteractionClassMap;
InteractionClassMap _interactionClassMap;
bool _timeRegulationEnabled; bool _timeRegulationEnabled;
bool _timeConstrainedEnabled; bool _timeConstrainedEnabled;
bool _timeAdvancePending; bool _timeAdvancePending;
@@ -1615,35 +1602,6 @@ RTI13Federate::createObjectClass(const std::string& objectClassName, HLAObjectCl
} }
} }
RTI13InteractionClass*
RTI13Federate::createInteractionClass(const std::string& interactionClassName, HLAInteractionClass* interactionClass)
{
try {
RTI::InteractionClassHandle interactionClassHandle;
interactionClassHandle = _ambassador->getInteractionClassHandle(interactionClassName);
if (_federateAmbassador->_interactionClassMap.find(interactionClassHandle) != _federateAmbassador->_interactionClassMap.end()) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not create interaction class, interaction class already exists!");
return 0;
}
RTI13InteractionClass* rtiInteractionClass;
rtiInteractionClass = new RTI13InteractionClass(interactionClass, interactionClassHandle, _ambassador.get());
_federateAmbassador->_interactionClassMap[interactionClassHandle] = rtiInteractionClass;
return rtiInteractionClass;
} catch (RTI::NameNotFound& e) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get interaction class: " << e._name << " " << e._reason);
return 0;
} catch (RTI::FederateNotExecutionMember& e) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get interaction class: " << e._name << " " << e._reason);
return 0;
} catch (RTI::ConcurrentAccessAttempted& e) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get interaction class: " << e._name << " " << e._reason);
return 0;
} catch (RTI::RTIinternalError& e) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get interaction class: " << e._name << " " << e._reason);
return 0;
}
}
RTI13ObjectInstance* RTI13ObjectInstance*
RTI13Federate::getObjectInstance(const std::string& objectInstanceName) RTI13Federate::getObjectInstance(const std::string& objectInstanceName)
{ {
-2
View File
@@ -25,7 +25,6 @@
#include <RTI.hh> #include <RTI.hh>
#include "RTIFederate.hxx" #include "RTIFederate.hxx"
#include "RTI13InteractionClass.hxx"
#include "RTI13ObjectClass.hxx" #include "RTI13ObjectClass.hxx"
#include "RTI13ObjectInstance.hxx" #include "RTI13ObjectInstance.hxx"
@@ -79,7 +78,6 @@ public:
virtual bool processMessages(const double& minimum, const double& maximum); virtual bool processMessages(const double& minimum, const double& maximum);
virtual RTI13ObjectClass* createObjectClass(const std::string& name, HLAObjectClass* hlaObjectClass); virtual RTI13ObjectClass* createObjectClass(const std::string& name, HLAObjectClass* hlaObjectClass);
virtual RTI13InteractionClass* createInteractionClass(const std::string& name, HLAInteractionClass* interactionClass);
virtual RTI13ObjectInstance* getObjectInstance(const std::string& name); virtual RTI13ObjectInstance* getObjectInstance(const std::string& name);
void insertObjectInstance(RTI13ObjectInstance* objectInstance); void insertObjectInstance(RTI13ObjectInstance* objectInstance);
-55
View File
@@ -1,55 +0,0 @@
// Copyright (C) 2011 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Library General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
#ifdef HAVE_CONFIG_H
# include <simgear_config.h>
#endif
#include <simgear/compiler.h>
#include "RTI13FederateFactory.hxx"
#include "RTI13Federate.hxx"
namespace simgear {
RTI13FederateFactory::RTI13FederateFactory()
{
_registerAtFactory();
}
RTI13FederateFactory::~RTI13FederateFactory()
{
}
RTIFederate*
RTI13FederateFactory::create(const std::string& name, const std::list<std::string>& stringList) const
{
if (name != "RTI13")
return 0;
return new RTI13Federate(stringList);
}
const SGSharedPtr<RTI13FederateFactory>&
RTI13FederateFactory::instance()
{
static SGSharedPtr<RTI13FederateFactory> federateFactory = new RTI13FederateFactory;
return federateFactory;
}
}
-39
View File
@@ -1,39 +0,0 @@
// Copyright (C) 2011 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Library General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
#ifndef RTI13FederateFactory_hxx
#define RTI13FederateFactory_hxx
#include "RTIFederateFactory.hxx"
#include "simgear/structure/SGSharedPtr.hxx"
namespace simgear {
class RTI13FederateFactory : public RTIFederateFactory {
public:
RTI13FederateFactory();
virtual ~RTI13FederateFactory();
virtual RTIFederate* create(const std::string& name, const std::list<std::string>& stringList) const;
static const SGSharedPtr<RTI13FederateFactory>& instance();
};
}
#endif
-245
View File
@@ -1,245 +0,0 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Library General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
#ifdef HAVE_CONFIG_H
# include <simgear_config.h>
#endif
#include <simgear/compiler.h>
#include "RTI13InteractionClass.hxx"
#include "RTI13Ambassador.hxx"
namespace simgear {
RTI13InteractionClass::RTI13InteractionClass(HLAInteractionClass* interactionClass, const RTI::InteractionClassHandle& handle, RTI13Ambassador* ambassador) :
RTIInteractionClass(interactionClass),
_handle(handle),
_ambassador(ambassador)
{
}
RTI13InteractionClass::~RTI13InteractionClass()
{
}
bool
RTI13InteractionClass::resolveParameterIndex(const std::string& name, unsigned index)
{
if (!_ambassador.valid()) {
SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero.");
return false;
}
if (index != _parameterHandleVector.size()) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Resolving needs to happen in growing index order!");
return false;
}
try {
RTI::ParameterHandle parameterHandle = _ambassador->getParameterHandle(name, _handle);
ParameterHandleIndexMap::const_iterator i = _parameterHandleIndexMap.find(parameterHandle);
if (i != _parameterHandleIndexMap.end()) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Resolving parameterIndex for parameter \"" << name << "\" twice!");
return false;
}
_parameterHandleIndexMap[parameterHandle] = index;
_parameterHandleVector.push_back(parameterHandle);
return true;
} catch (RTI::NameNotFound& e) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get interaction class parameter: " << e._name << " " << e._reason);
return false;
} catch (RTI::FederateNotExecutionMember& e) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get interaction class parameter: " << e._name << " " << e._reason);
return false;
} catch (RTI::ConcurrentAccessAttempted& e) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get interaction class parameter: " << e._name << " " << e._reason);
return false;
} catch (RTI::RTIinternalError& e) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get interaction class parameter: " << e._name << " " << e._reason);
return false;
} catch (...) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get interaction class parameter.");
return false;
}
return false;
}
bool
RTI13InteractionClass::publish()
{
if (!_ambassador.valid()) {
SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero.");
return false;
}
try {
_ambassador->publishInteractionClass(_handle);
return true;
} catch (RTI::InteractionClassNotDefined& e) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not publish interaction class: " << e._name << " " << e._reason);
return false;
} catch (RTI::FederateNotExecutionMember& e) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not publish interaction class: " << e._name << " " << e._reason);
return false;
} catch (RTI::ConcurrentAccessAttempted& e) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not publish interaction class: " << e._name << " " << e._reason);
return false;
} catch (RTI::SaveInProgress& e) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not publish interaction class: " << e._name << " " << e._reason);
return false;
} catch (RTI::RestoreInProgress& e) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not publish interaction class: " << e._name << " " << e._reason);
return false;
} catch (RTI::RTIinternalError& e) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not publish interaction class: " << e._name << " " << e._reason);
return false;
} catch (...) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not publish interaction class.");
return false;
}
return false;
}
bool
RTI13InteractionClass::unpublish()
{
if (!_ambassador.valid()) {
SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero.");
return false;
}
try {
_ambassador->unpublishInteractionClass(_handle);
return true;
} catch (RTI::InteractionClassNotDefined& e) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unpublish interaction class: " << e._name << " " << e._reason);
return false;
} catch (RTI::InteractionClassNotPublished& e) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unpublish interaction class: " << e._name << " " << e._reason);
return false;
} catch (RTI::FederateNotExecutionMember& e) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unpublish interaction class: " << e._name << " " << e._reason);
return false;
} catch (RTI::ConcurrentAccessAttempted& e) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unpublish interaction class: " << e._name << " " << e._reason);
return false;
} catch (RTI::SaveInProgress& e) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unpublish interaction class: " << e._name << " " << e._reason);
return false;
} catch (RTI::RestoreInProgress& e) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unpublish interaction class: " << e._name << " " << e._reason);
return false;
} catch (RTI::RTIinternalError& e) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unpublish interaction class: " << e._name << " " << e._reason);
return false;
} catch (...) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unpublish interaction class.");
return false;
}
return false;
}
bool
RTI13InteractionClass::subscribe(bool active)
{
if (!_ambassador.valid()) {
SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero.");
return false;
}
try {
_ambassador->subscribeInteractionClass(_handle, active);
return true;
} catch (RTI::InteractionClassNotDefined& e) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not subscribe interaction class: " << e._name << " " << e._reason);
return false;
} catch (RTI::FederateNotExecutionMember& e) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not subscribe interaction class: " << e._name << " " << e._reason);
return false;
} catch (RTI::ConcurrentAccessAttempted& e) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not subscribe interaction class: " << e._name << " " << e._reason);
return false;
} catch (RTI::FederateLoggingServiceCalls& e) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not subscribe interaction class: " << e._name << " " << e._reason);
return false;
} catch (RTI::SaveInProgress& e) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not subscribe interaction class: " << e._name << " " << e._reason);
return false;
} catch (RTI::RestoreInProgress& e) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not subscribe interaction class: " << e._name << " " << e._reason);
return false;
} catch (RTI::RTIinternalError& e) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not subscribe interaction class: " << e._name << " " << e._reason);
return false;
} catch (...) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not subscribe interaction class.");
return false;
}
return false;
}
bool
RTI13InteractionClass::unsubscribe()
{
if (!_ambassador.valid()) {
SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero.");
return false;
}
try {
_ambassador->unsubscribeInteractionClass(_handle);
return true;
} catch (RTI::InteractionClassNotDefined& e) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unsubscribe interaction class: " << e._name << " " << e._reason);
return false;
} catch (RTI::InteractionClassNotSubscribed& e) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unsubscribe interaction class: " << e._name << " " << e._reason);
return false;
} catch (RTI::FederateNotExecutionMember& e) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unsubscribe interaction class: " << e._name << " " << e._reason);
return false;
} catch (RTI::ConcurrentAccessAttempted& e) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unsubscribe interaction class: " << e._name << " " << e._reason);
return false;
} catch (RTI::SaveInProgress& e) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unsubscribe interaction class: " << e._name << " " << e._reason);
return false;
} catch (RTI::RestoreInProgress& e) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unsubscribe interaction class: " << e._name << " " << e._reason);
return false;
} catch (RTI::RTIinternalError& e) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unsubscribe interaction class: " << e._name << " " << e._reason);
return false;
} catch (...) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unsubscribe interaction class.");
return false;
}
return false;
}
}
-64
View File
@@ -1,64 +0,0 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Library General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
#ifndef RTI13InteractionClass_hxx
#define RTI13InteractionClass_hxx
#include <map>
#include <vector>
#ifndef RTI_USES_STD_FSTREAM
#define RTI_USES_STD_FSTREAM
#endif
#include <RTI.hh>
#include "RTIInteractionClass.hxx"
#include <simgear/structure/SGSharedPtr.hxx>
namespace simgear {
class RTI13Ambassador;
class RTI13InteractionClass : public RTIInteractionClass {
public:
RTI13InteractionClass(HLAInteractionClass* interactionClass, const RTI::InteractionClassHandle& handle, RTI13Ambassador* ambassador);
virtual ~RTI13InteractionClass();
virtual bool resolveParameterIndex(const std::string& name, unsigned index);
virtual bool publish();
virtual bool unpublish();
virtual bool subscribe(bool);
virtual bool unsubscribe();
private:
RTI::InteractionClassHandle _handle;
SGSharedPtr<RTI13Ambassador> _ambassador;
typedef std::map<RTI::ParameterHandle, unsigned> ParameterHandleIndexMap;
ParameterHandleIndexMap _parameterHandleIndexMap;
typedef std::vector<RTI::ParameterHandle> ParameterHandleVector;
ParameterHandleVector _parameterHandleVector;
};
}
#endif
+146 -59
View File
@@ -1,4 +1,4 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de // Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
// //
// This library is free software; you can redistribute it and/or // This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public // modify it under the terms of the GNU Library General Public
@@ -15,74 +15,33 @@
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
// //
#ifdef HAVE_CONFIG_H
# include <simgear_config.h>
#endif
#include <simgear/compiler.h>
#include "RTI13ObjectClass.hxx" #include "RTI13ObjectClass.hxx"
#include "RTI13Ambassador.hxx" #include "RTI13Ambassador.hxx"
namespace simgear { namespace simgear {
RTI13ObjectClass::RTI13ObjectClass(HLAObjectClass* hlaObjectClass, const RTI::ObjectClassHandle& handle, RTI13Ambassador* ambassador) : RTI13ObjectClass::RTI13ObjectClass(HLAObjectClass* hlaObjectClass, RTI::ObjectClassHandle& handle, RTI13Ambassador* ambassador) :
RTIObjectClass(hlaObjectClass), RTIObjectClass(hlaObjectClass),
_handle(handle), _handle(handle),
_ambassador(ambassador) _ambassador(ambassador)
{ {
if (0 != getOrCreateAttributeIndex("privilegeToDelete") &&
0 != getOrCreateAttributeIndex("HLAprivilegeToDeleteObject"))
SG_LOG(SG_NETWORK, SG_WARN, "RTI13ObjectClass: Cannot find object root attribute.");
} }
RTI13ObjectClass::~RTI13ObjectClass() RTI13ObjectClass::~RTI13ObjectClass()
{ {
} }
bool std::string
RTI13ObjectClass::resolveAttributeIndex(const std::string& name, unsigned index) RTI13ObjectClass::getName() const
{ {
if (!_ambassador.valid()) { if (!_ambassador.valid()) {
SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero."); SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero.");
return false; return std::string();
}
if (index != _attributeHandleVector.size()) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Resolving needs to happen in growing index order!");
return false;
}
try {
RTI::AttributeHandle attributeHandle = _ambassador->getAttributeHandle(name, _handle);
AttributeHandleIndexMap::const_iterator i = _attributeHandleIndexMap.find(attributeHandle);
if (i != _attributeHandleIndexMap.end()) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Resolving attributeIndex for attribute \"" << name << "\" twice!");
return false;
}
_attributeHandleIndexMap[attributeHandle] = index;
_attributeHandleVector.push_back(attributeHandle);
return true;
} catch (RTI::ObjectClassNotDefined& e) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute: " << e._name << " " << e._reason);
return false;
} catch (RTI::NameNotFound& e) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute: " << e._name << " " << e._reason);
return false;
} catch (RTI::FederateNotExecutionMember& e) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute: " << e._name << " " << e._reason);
return false;
} catch (RTI::ConcurrentAccessAttempted& e) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute: " << e._name << " " << e._reason);
return false;
} catch (RTI::RTIinternalError& e) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute: " << e._name << " " << e._reason);
return false;
} catch (...) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute.");
return false;
} }
return _ambassador->getObjectClassName(_handle);
} }
unsigned unsigned
@@ -91,8 +50,121 @@ RTI13ObjectClass::getNumAttributes() const
return _attributeHandleVector.size(); return _attributeHandleVector.size();
} }
unsigned
RTI13ObjectClass::getAttributeIndex(const std::string& name) const
{
if (!_ambassador.valid()) {
SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero.");
return ~0u;
}
try {
RTI::AttributeHandle attributeHandle = _ambassador->getAttributeHandle(name, _handle);
AttributeHandleIndexMap::const_iterator i = _attributeHandleIndexMap.find(attributeHandle);
if (i != _attributeHandleIndexMap.end())
return i->second;
return ~0u;
} catch (RTI::ObjectClassNotDefined& e) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute: " << e._name << " " << e._reason);
return ~0u;
} catch (RTI::NameNotFound& e) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute: " << e._name << " " << e._reason);
return ~0u;
} catch (RTI::FederateNotExecutionMember& e) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute: " << e._name << " " << e._reason);
return ~0u;
} catch (RTI::ConcurrentAccessAttempted& e) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute: " << e._name << " " << e._reason);
return ~0u;
} catch (RTI::RTIinternalError& e) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute: " << e._name << " " << e._reason);
return ~0u;
} catch (...) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute.");
return ~0u;
}
}
unsigned
RTI13ObjectClass::getOrCreateAttributeIndex(const std::string& name)
{
if (!_ambassador.valid()) {
SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero.");
return ~0u;
}
try {
RTI::AttributeHandle attributeHandle = _ambassador->getAttributeHandle(name, _handle);
AttributeHandleIndexMap::const_iterator i = _attributeHandleIndexMap.find(attributeHandle);
if (i != _attributeHandleIndexMap.end())
return i->second;
unsigned index = _attributeHandleVector.size();
_attributeHandleIndexMap[attributeHandle] = index;
_attributeHandleVector.push_back(attributeHandle);
_attributeDataVector.push_back(name);
return index;
} catch (RTI::ObjectClassNotDefined& e) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute: " << e._name << " " << e._reason);
return ~0u;
} catch (RTI::NameNotFound& e) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute: " << e._name << " " << e._reason);
return ~0u;
} catch (RTI::FederateNotExecutionMember& e) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute: " << e._name << " " << e._reason);
return ~0u;
} catch (RTI::ConcurrentAccessAttempted& e) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute: " << e._name << " " << e._reason);
return ~0u;
} catch (RTI::RTIinternalError& e) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute: " << e._name << " " << e._reason);
return ~0u;
} catch (...) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute.");
return ~0u;
}
}
// std::string
// RTI13ObjectClass::getAttributeName(unsigned index) const
// {
// SGSharedPtr<RTI13Ambassador> ambassador = _ambassador.lock();
// if (!ambassador.valid()) {
// SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero.");
// return std::string();
// }
// try {
// return ambassador->getAttributeName(getAttributeHandle(index), _handle);
// } catch (RTI::ObjectClassNotDefined& e) {
// SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute name: " << e._name << " " << e._reason);
// return std::string();
// } catch (RTI::AttributeNotDefined& e) {
// SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute name: " << e._name << " " << e._reason);
// return std::string();
// } catch (RTI::FederateNotExecutionMember& e) {
// SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute name: " << e._name << " " << e._reason);
// return std::string();
// } catch (RTI::ConcurrentAccessAttempted& e) {
// SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute name: " << e._name << " " << e._reason);
// return std::string();
// } catch (RTI::RTIinternalError& e) {
// SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute name: " << e._name << " " << e._reason);
// return std::string();
// } catch (...) {
// SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute name.");
// return std::string();
// }
// }
bool bool
RTI13ObjectClass::publish(const HLAIndexList& indexList) RTI13ObjectClass::publish(const std::set<unsigned>& indexSet)
{ {
if (!_ambassador.valid()) { if (!_ambassador.valid()) {
SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero."); SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero.");
@@ -100,9 +172,8 @@ RTI13ObjectClass::publish(const HLAIndexList& indexList)
} }
try { try {
unsigned numAttributes = getNumAttributes(); std::auto_ptr<RTI::AttributeHandleSet> attributeHandleSet(RTI::AttributeHandleSetFactory::create(indexSet.size()));
std::auto_ptr<RTI::AttributeHandleSet> attributeHandleSet(RTI::AttributeHandleSetFactory::create(numAttributes)); for (std::set<unsigned>::const_iterator i = indexSet.begin(); i != indexSet.end(); ++i) {
for (HLAIndexList::const_iterator i = indexList.begin(); i != indexList.end(); ++i) {
if (_attributeHandleVector.size() <= *i) { if (_attributeHandleVector.size() <= *i) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI13ObjectClass::publish(): Invalid attribute index!"); SG_LOG(SG_NETWORK, SG_WARN, "RTI13ObjectClass::publish(): Invalid attribute index!");
continue; continue;
@@ -112,6 +183,10 @@ RTI13ObjectClass::publish(const HLAIndexList& indexList)
_ambassador->publishObjectClass(_handle, *attributeHandleSet); _ambassador->publishObjectClass(_handle, *attributeHandleSet);
for (unsigned i = 0; i < getNumAttributes(); ++i) {
_attributeDataVector[i]._published = true;
}
return true; return true;
} catch (RTI::ObjectClassNotDefined& e) { } catch (RTI::ObjectClassNotDefined& e) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not publish object class: " << e._name << " " << e._reason); SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not publish object class: " << e._name << " " << e._reason);
@@ -154,6 +229,10 @@ RTI13ObjectClass::unpublish()
try { try {
_ambassador->unpublishObjectClass(_handle); _ambassador->unpublishObjectClass(_handle);
for (unsigned i = 0; i < getNumAttributes(); ++i) {
_attributeDataVector[i]._published = false;
}
return true; return true;
} catch (RTI::ObjectClassNotDefined& e) { } catch (RTI::ObjectClassNotDefined& e) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unpublish object class: " << e._name << " " << e._reason); SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unpublish object class: " << e._name << " " << e._reason);
@@ -186,7 +265,7 @@ RTI13ObjectClass::unpublish()
} }
bool bool
RTI13ObjectClass::subscribe(const HLAIndexList& indexList, bool active) RTI13ObjectClass::subscribe(const std::set<unsigned>& indexSet, bool active)
{ {
if (!_ambassador.valid()) { if (!_ambassador.valid()) {
SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero."); SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero.");
@@ -194,9 +273,9 @@ RTI13ObjectClass::subscribe(const HLAIndexList& indexList, bool active)
} }
try { try {
unsigned numAttributes = getNumAttributes(); std::auto_ptr<RTI::AttributeHandleSet> attributeHandleSet(RTI::AttributeHandleSetFactory::create(indexSet.size()));
std::auto_ptr<RTI::AttributeHandleSet> attributeHandleSet(RTI::AttributeHandleSetFactory::create(numAttributes)); for (std::set<unsigned>::const_iterator i = indexSet.begin();
for (HLAIndexList::const_iterator i = indexList.begin(); i != indexList.end(); ++i) { i != indexSet.end(); ++i) {
if (_attributeHandleVector.size() <= *i) { if (_attributeHandleVector.size() <= *i) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI13ObjectClass::subscribe(): Invalid attribute index!"); SG_LOG(SG_NETWORK, SG_WARN, "RTI13ObjectClass::subscribe(): Invalid attribute index!");
continue; continue;
@@ -206,6 +285,10 @@ RTI13ObjectClass::subscribe(const HLAIndexList& indexList, bool active)
_ambassador->subscribeObjectClassAttributes(_handle, *attributeHandleSet, active); _ambassador->subscribeObjectClassAttributes(_handle, *attributeHandleSet, active);
for (unsigned i = 0; i < getNumAttributes(); ++i) {
_attributeDataVector[i]._subscribed = true;
}
return true; return true;
} catch (RTI::ObjectClassNotDefined& e) { } catch (RTI::ObjectClassNotDefined& e) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not subscribe object class: " << e._name << " " << e._reason); SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not subscribe object class: " << e._name << " " << e._reason);
@@ -245,6 +328,10 @@ RTI13ObjectClass::unsubscribe()
try { try {
_ambassador->unsubscribeObjectClass(_handle); _ambassador->unsubscribeObjectClass(_handle);
for (unsigned i = 0; i < getNumAttributes(); ++i) {
_attributeDataVector[i]._subscribed = false;
}
return true; return true;
} catch (RTI::ObjectClassNotDefined& e) { } catch (RTI::ObjectClassNotDefined& e) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unsubscribe object class: " << e._name << " " << e._reason); SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unsubscribe object class: " << e._name << " " << e._reason);
@@ -289,7 +376,7 @@ RTI13ObjectClass::registerObjectInstance(HLAObjectInstance* hlaObjectInstance)
try { try {
RTI::ObjectHandle objectHandle = _ambassador->registerObjectInstance(getHandle()); RTI::ObjectHandle objectHandle = _ambassador->registerObjectInstance(getHandle());
RTI13ObjectInstance* objectInstance = new RTI13ObjectInstance(objectHandle, hlaObjectInstance, this, _ambassador.get()); RTI13ObjectInstance* objectInstance = new RTI13ObjectInstance(objectHandle, hlaObjectInstance, this, _ambassador.get(), true);
federate->insertObjectInstance(objectInstance); federate->insertObjectInstance(objectInstance);
return objectInstance; return objectInstance;
} catch (RTI::ObjectClassNotDefined& e) { } catch (RTI::ObjectClassNotDefined& e) {
+7 -5
View File
@@ -1,4 +1,4 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de // Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
// //
// This library is free software; you can redistribute it and/or // This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public // modify it under the terms of the GNU Library General Public
@@ -37,15 +37,17 @@ class RTIObjectInstance;
class RTI13ObjectClass : public RTIObjectClass { class RTI13ObjectClass : public RTIObjectClass {
public: public:
RTI13ObjectClass(HLAObjectClass* hlaObjectClass, const RTI::ObjectClassHandle& handle, RTI13Ambassador* ambassador); RTI13ObjectClass(HLAObjectClass* hlaObjectClass, RTI::ObjectClassHandle& handle, RTI13Ambassador* ambassador);
virtual ~RTI13ObjectClass(); virtual ~RTI13ObjectClass();
const RTI::ObjectClassHandle& getHandle() const const RTI::ObjectClassHandle& getHandle() const
{ return _handle; } { return _handle; }
virtual bool resolveAttributeIndex(const std::string& name, unsigned index); virtual std::string getName() const;
virtual unsigned getNumAttributes() const; virtual unsigned getNumAttributes() const;
virtual unsigned getAttributeIndex(const std::string& name) const;
virtual unsigned getOrCreateAttributeIndex(const std::string& name);
unsigned getAttributeIndex(const RTI::AttributeHandle& handle) const unsigned getAttributeIndex(const RTI::AttributeHandle& handle) const
{ {
@@ -61,10 +63,10 @@ public:
return _attributeHandleVector[index]; return _attributeHandleVector[index];
} }
virtual bool publish(const HLAIndexList& indexList); virtual bool publish(const std::set<unsigned>& indexSet);
virtual bool unpublish(); virtual bool unpublish();
virtual bool subscribe(const HLAIndexList& indexList, bool); virtual bool subscribe(const std::set<unsigned>& indexSet, bool);
virtual bool unsubscribe(); virtual bool unsubscribe();
virtual RTIObjectInstance* registerObjectInstance(HLAObjectInstance* hlaObjectInstance); virtual RTIObjectInstance* registerObjectInstance(HLAObjectInstance* hlaObjectInstance);
+63 -97
View File
@@ -1,4 +1,4 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de // Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
// //
// This library is free software; you can redistribute it and/or // This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public // modify it under the terms of the GNU Library General Public
@@ -15,26 +15,20 @@
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
// //
#ifdef HAVE_CONFIG_H
# include <simgear_config.h>
#endif
#include <simgear/compiler.h>
#include "RTIObjectInstance.hxx" #include "RTIObjectInstance.hxx"
#include "RTI13Ambassador.hxx" #include "RTI13Ambassador.hxx"
namespace simgear { namespace simgear {
RTI13ObjectInstance::RTI13ObjectInstance(const RTI::ObjectHandle& handle, HLAObjectInstance* objectInstance, RTI13ObjectInstance::RTI13ObjectInstance(const RTI::ObjectHandle& handle, HLAObjectInstance* hlaObjectInstance,
const RTI13ObjectClass* objectClass, RTI13Ambassador* ambassador) : const RTI13ObjectClass* objectClass, RTI13Ambassador* ambassador, bool owned) :
RTIObjectInstance(objectInstance), RTIObjectInstance(hlaObjectInstance),
_handle(handle), _handle(handle),
_objectClass(objectClass), _objectClass(objectClass),
_ambassador(ambassador), _ambassador(ambassador),
_attributeValuePairSet(RTI::AttributeSetFactory::create(objectClass->getNumAttributes())) _attributeValuePairSet(RTI::AttributeSetFactory::create(objectClass->getNumAttributes()))
{ {
_setNumAttributes(getNumAttributes()); updateAttributesFromClass(owned);
} }
RTI13ObjectInstance::~RTI13ObjectInstance() RTI13ObjectInstance::~RTI13ObjectInstance()
@@ -183,80 +177,82 @@ RTI13ObjectInstance::localDeleteObjectInstance()
} }
void void
RTI13ObjectInstance::reflectAttributeValues(RTI13AttributeHandleDataPairList& attributeHandleDataPairList, RTI13ObjectInstance::reflectAttributeValues(RTI13AttributeHandleDataPairList& attributeHandleDataPairList, const RTIData& tag)
const RTIData& tag, HLAIndexList& indexPool)
{ {
HLAIndexList reflectedIndices; // Retrieve an empty update struct from the memory pool
RTIIndexDataPairList indexDataPairList;
for (RTI13AttributeHandleDataPairList::iterator i = attributeHandleDataPairList.begin(); for (RTI13AttributeHandleDataPairList::iterator i = attributeHandleDataPairList.begin();
i != attributeHandleDataPairList.end(); ++i) { i != attributeHandleDataPairList.end(); ++i) {
unsigned index = getAttributeIndex(i->first); unsigned index = getAttributeIndex(i->first);
_attributeData[index]._data.swap(i->second); // Get a RTIData from the data pool
getDataFromPool(indexDataPairList);
if (indexPool.empty()) indexDataPairList.back().first = index;
reflectedIndices.push_back(index); indexDataPairList.back().second.swap(i->second);
else {
reflectedIndices.splice(reflectedIndices.end(), indexPool, indexPool.begin());
reflectedIndices.back() = index;
}
} }
RTIObjectInstance::reflectAttributeValues(reflectedIndices, tag); RTIObjectInstance::reflectAttributeValues(indexDataPairList, tag);
// Return the index list to the pool RTIIndexDataPairList::iterator j = indexDataPairList.begin();
indexPool.splice(indexPool.end(), reflectedIndices); for (RTI13AttributeHandleDataPairList::iterator i = attributeHandleDataPairList.begin();
i != attributeHandleDataPairList.end(); ++i, ++j) {
i->second.swap(j->second);
}
// Return the update data back to the pool
putDataToPool(indexDataPairList);
} }
void void
RTI13ObjectInstance::reflectAttributeValues(RTI13AttributeHandleDataPairList& attributeHandleDataPairList, RTI13ObjectInstance::reflectAttributeValues(RTI13AttributeHandleDataPairList& attributeHandleDataPairList,
const SGTimeStamp& timeStamp, const RTIData& tag, HLAIndexList& indexPool) const SGTimeStamp& timeStamp, const RTIData& tag)
{ {
HLAIndexList reflectedIndices; // Retrieve an empty update struct from the memory pool
RTIIndexDataPairList indexDataPairList;
for (RTI13AttributeHandleDataPairList::iterator i = attributeHandleDataPairList.begin(); for (RTI13AttributeHandleDataPairList::iterator i = attributeHandleDataPairList.begin();
i != attributeHandleDataPairList.end(); ++i) { i != attributeHandleDataPairList.end(); ++i) {
unsigned index = getAttributeIndex(i->first); unsigned index = getAttributeIndex(i->first);
_attributeData[index]._data.swap(i->second); // Get a RTIData from the data pool
getDataFromPool(indexDataPairList);
if (indexPool.empty()) indexDataPairList.back().first = index;
reflectedIndices.push_back(index); indexDataPairList.back().second.swap(i->second);
else {
reflectedIndices.splice(reflectedIndices.end(), indexPool, indexPool.begin());
reflectedIndices.back() = index;
}
} }
RTIObjectInstance::reflectAttributeValues(reflectedIndices, timeStamp, tag); RTIObjectInstance::reflectAttributeValues(indexDataPairList, timeStamp, tag);
// Return the index list to the pool RTIIndexDataPairList::iterator j = indexDataPairList.begin();
indexPool.splice(indexPool.end(), reflectedIndices); for (RTI13AttributeHandleDataPairList::iterator i = attributeHandleDataPairList.begin();
i != attributeHandleDataPairList.end(); ++i, ++j) {
i->second.swap(j->second);
}
// Return the update data back to the pool
putDataToPool(indexDataPairList);
} }
void void
RTI13ObjectInstance::requestObjectAttributeValueUpdate(const HLAIndexList& indexList) RTI13ObjectInstance::requestObjectAttributeValueUpdate()
{ {
if (!_ambassador.valid()) { if (!_ambassador.valid()) {
SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero."); SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero.");
return; return;
} }
if (indexList.empty())
return;
try { try {
unsigned numAttributes = getNumAttributes(); unsigned numAttributes = getNumAttributes();
std::auto_ptr<RTI::AttributeHandleSet> attributeHandleSet(RTI::AttributeHandleSetFactory::create(numAttributes)); std::auto_ptr<RTI::AttributeHandleSet> attributeHandleSet(RTI::AttributeHandleSetFactory::create(numAttributes));
for (HLAIndexList::const_iterator i = indexList.begin(); i != indexList.end(); ++i) { for (unsigned i = 0; i < numAttributes; ++i) {
if (getAttributeOwned(*i)) { if (!getRequestAttributeUpdate(i))
SG_LOG(SG_NETWORK, SG_WARN, "RTI13ObjectInstance::requestObjectAttributeValueUpdate(): "
"Invalid attribute index!");
continue; continue;
} attributeHandleSet->add(getAttributeHandle(i));
attributeHandleSet->add(getAttributeHandle(*i));
} }
if (!attributeHandleSet->size()) if (!attributeHandleSet->size())
return; return;
_ambassador->requestObjectAttributeValueUpdate(_handle, *attributeHandleSet); _ambassador->requestObjectAttributeValueUpdate(_handle, *attributeHandleSet);
for (unsigned i = 0; i < numAttributes; ++i)
setRequestAttributeUpdate(i, false);
return; return;
} catch (RTI::ObjectNotKnown& e) { } catch (RTI::ObjectNotKnown& e) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not request attribute update for object instance: " << e._name << " " << e._reason); SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not request attribute update for object instance: " << e._name << " " << e._reason);
@@ -292,7 +288,7 @@ RTI13ObjectInstance::provideAttributeValueUpdate(const std::vector<RTI::Attribut
size_t numAttribs = attributeHandleSet.size(); size_t numAttribs = attributeHandleSet.size();
for (RTI::ULong i = 0; i < numAttribs; ++i) { for (RTI::ULong i = 0; i < numAttribs; ++i) {
unsigned index = getAttributeIndex(attributeHandleSet[i]); unsigned index = getAttributeIndex(attributeHandleSet[i]);
_attributeData[index]._dirty = true; setAttributeForceUpdate(index);
} }
} }
@@ -310,9 +306,15 @@ RTI13ObjectInstance::updateAttributeValues(const RTIData& tag)
unsigned numAttributes = getNumAttributes(); unsigned numAttributes = getNumAttributes();
for (unsigned i = 0; i < numAttributes; ++i) { for (unsigned i = 0; i < numAttributes; ++i) {
if (!_attributeData[i]._dirty) if (!getAttributeEffectiveUpdateEnabled(i))
continue; continue;
const RTIData& data = _attributeData[i]._data; const HLADataElement* dataElement = getDataElement(i);
if (!dataElement)
continue;
// FIXME cache somewhere
RTIData data;
HLAEncodeStream stream(data);
dataElement->encode(stream);
_attributeValuePairSet->add(getAttributeHandle(i), data.data(), data.size()); _attributeValuePairSet->add(getAttributeHandle(i), data.data(), data.size());
} }
@@ -322,7 +324,7 @@ RTI13ObjectInstance::updateAttributeValues(const RTIData& tag)
_ambassador->updateAttributeValues(_handle, *_attributeValuePairSet, tag); _ambassador->updateAttributeValues(_handle, *_attributeValuePairSet, tag);
for (unsigned i = 0; i < numAttributes; ++i) { for (unsigned i = 0; i < numAttributes; ++i) {
_attributeData[i]._dirty = false; setAttributeUpdated(i);
} }
} catch (RTI::ObjectNotKnown& e) { } catch (RTI::ObjectNotKnown& e) {
@@ -361,9 +363,15 @@ RTI13ObjectInstance::updateAttributeValues(const SGTimeStamp& timeStamp, const R
unsigned numAttributes = getNumAttributes(); unsigned numAttributes = getNumAttributes();
for (unsigned i = 0; i < numAttributes; ++i) { for (unsigned i = 0; i < numAttributes; ++i) {
if (!_attributeData[i]._dirty) if (!getAttributeEffectiveUpdateEnabled(i))
continue; continue;
const RTIData& data = _attributeData[i]._data; const HLADataElement* dataElement = getDataElement(i);
if (!dataElement)
continue;
// FIXME cache somewhere
RTIData data;
HLAEncodeStream stream(data);
dataElement->encode(stream);
_attributeValuePairSet->add(getAttributeHandle(i), data.data(), data.size()); _attributeValuePairSet->add(getAttributeHandle(i), data.data(), data.size());
} }
@@ -373,7 +381,7 @@ RTI13ObjectInstance::updateAttributeValues(const SGTimeStamp& timeStamp, const R
_ambassador->updateAttributeValues(_handle, *_attributeValuePairSet, timeStamp, tag); _ambassador->updateAttributeValues(_handle, *_attributeValuePairSet, timeStamp, tag);
for (unsigned i = 0; i < numAttributes; ++i) { for (unsigned i = 0; i < numAttributes; ++i) {
_attributeData[i]._dirty = false; setAttributeUpdated(i);
} }
} catch (RTI::ObjectNotKnown& e) { } catch (RTI::ObjectNotKnown& e) {
@@ -440,48 +448,6 @@ RTI13ObjectInstance::turnUpdatesOffForObjectInstance(const std::vector<RTI::Attr
} }
} }
bool
RTI13ObjectInstance::isAttributeOwnedByFederate(unsigned index) const
{
if (!_ambassador.valid()) {
SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero.");
return false;
}
try {
RTI::AttributeHandle attributeHandle = getAttributeHandle(index);
return _ambassador->isAttributeOwnedByFederate(_handle, attributeHandle);
} catch (RTI::ObjectNotKnown& e) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not query attribute ownership for index " << index << ": "
<< e._name << " " << e._reason);
return false;
} catch (RTI::AttributeNotDefined& e) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not query attribute ownership for index " << index << ": "
<< e._name << " " << e._reason);
return false;
} catch (RTI::FederateNotExecutionMember& e) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not query attribute ownership for index " << index << ": "
<< e._name << " " << e._reason);
return false;
} catch (RTI::ConcurrentAccessAttempted& e) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not query attribute ownership for index " << index << ": "
<< e._name << " " << e._reason);
return false;
} catch (RTI::SaveInProgress& e) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not query attribute ownership for index " << index << ": "
<< e._name << " " << e._reason);
return false;
} catch (RTI::RestoreInProgress& e) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not query attribute ownership for index " << index << ": "
<< e._name << " " << e._reason);
return false;
} catch (RTI::RTIinternalError& e) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not query attribute ownership for index " << index << ": "
<< e._name << " " << e._reason);
return false;
}
return false;
}
void void
RTI13ObjectInstance::requestAttributeOwnershipAssumption(const std::vector<RTI::AttributeHandle>& attributes, const RTIData& tag) RTI13ObjectInstance::requestAttributeOwnershipAssumption(const std::vector<RTI::AttributeHandle>& attributes, const RTIData& tag)
{ {
+6 -8
View File
@@ -42,7 +42,7 @@ typedef std::list<RTI13AttributeHandleDataPair> RTI13AttributeHandleDataPairList
class RTI13ObjectInstance : public RTIObjectInstance { class RTI13ObjectInstance : public RTIObjectInstance {
public: public:
RTI13ObjectInstance(const RTI::ObjectHandle& handle, HLAObjectInstance* hlaObjectInstance, const RTI13ObjectClass* objectClass, RTI13Ambassador* ambassador); RTI13ObjectInstance(const RTI::ObjectHandle& handle, HLAObjectInstance* hlaObjectInstance, const RTI13ObjectClass* objectClass, RTI13Ambassador* ambassador, bool owned);
virtual ~RTI13ObjectInstance(); virtual ~RTI13ObjectInstance();
const RTI::ObjectHandle& getHandle() const const RTI::ObjectHandle& getHandle() const
@@ -55,6 +55,8 @@ public:
unsigned getNumAttributes() const unsigned getNumAttributes() const
{ return get13ObjectClass()->getNumAttributes(); } { return get13ObjectClass()->getNumAttributes(); }
unsigned getAttributeIndex(const std::string& name) const
{ return get13ObjectClass()->getAttributeIndex(name); }
unsigned getAttributeIndex(const RTI::AttributeHandle& handle) const unsigned getAttributeIndex(const RTI::AttributeHandle& handle) const
{ return get13ObjectClass()->getAttributeIndex(handle); } { return get13ObjectClass()->getAttributeIndex(handle); }
RTI::AttributeHandle getAttributeHandle(unsigned index) const RTI::AttributeHandle getAttributeHandle(unsigned index) const
@@ -66,18 +68,14 @@ public:
virtual void deleteObjectInstance(const SGTimeStamp& timeStamp, const RTIData& tag); virtual void deleteObjectInstance(const SGTimeStamp& timeStamp, const RTIData& tag);
virtual void localDeleteObjectInstance(); virtual void localDeleteObjectInstance();
void reflectAttributeValues(RTI13AttributeHandleDataPairList& attributeHandleDataPairList, void reflectAttributeValues(RTI13AttributeHandleDataPairList& attributeHandleDataPairList, const RTIData& tag);
const RTIData& tag, HLAIndexList& indexPool); void reflectAttributeValues(RTI13AttributeHandleDataPairList& attributeHandleDataPairList, const SGTimeStamp& timeStamp, const RTIData& tag);
void reflectAttributeValues(RTI13AttributeHandleDataPairList& attributeHandleDataPairList, virtual void requestObjectAttributeValueUpdate();
const SGTimeStamp& timeStamp, const RTIData& tag, HLAIndexList& indexPool);
virtual void requestObjectAttributeValueUpdate(const HLAIndexList& indexList);
void provideAttributeValueUpdate(const std::vector<RTI::AttributeHandle>& attributes); void provideAttributeValueUpdate(const std::vector<RTI::AttributeHandle>& attributes);
virtual void updateAttributeValues(const RTIData& tag); virtual void updateAttributeValues(const RTIData& tag);
virtual void updateAttributeValues(const SGTimeStamp& timeStamp, const RTIData& tag); virtual void updateAttributeValues(const SGTimeStamp& timeStamp, const RTIData& tag);
virtual bool isAttributeOwnedByFederate(unsigned index) const;
void attributesInScope(const std::vector<RTI::AttributeHandle>& attributes); void attributesInScope(const std::vector<RTI::AttributeHandle>& attributes);
void attributesOutOfScope(const std::vector<RTI::AttributeHandle>& attributes); void attributesOutOfScope(const std::vector<RTI::AttributeHandle>& attributes);
+1 -7
View File
@@ -1,4 +1,4 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de // Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
// //
// This library is free software; you can redistribute it and/or // This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public // modify it under the terms of the GNU Library General Public
@@ -15,12 +15,6 @@
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
// //
#ifdef HAVE_CONFIG_H
# include <simgear_config.h>
#endif
#include <simgear/compiler.h>
#include "RTIFederate.hxx" #include "RTIFederate.hxx"
namespace simgear { namespace simgear {
+2 -3
View File
@@ -1,4 +1,4 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de // Copyright (C) 2009 - 2011 Mathias Froehlich - Mathias.Froehlich@web.de
// //
// This library is free software; you can redistribute it and/or // This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public // modify it under the terms of the GNU Library General Public
@@ -20,7 +20,6 @@
#include <string> #include <string>
#include "simgear/structure/SGWeakReferenced.hxx" #include "simgear/structure/SGWeakReferenced.hxx"
#include "RTIInteractionClass.hxx"
#include "RTIObjectClass.hxx" #include "RTIObjectClass.hxx"
#include "RTIObjectInstance.hxx" #include "RTIObjectInstance.hxx"
@@ -80,7 +79,7 @@ public:
virtual bool processMessages(const double& minimum, const double& maximum) = 0; virtual bool processMessages(const double& minimum, const double& maximum) = 0;
virtual RTIObjectClass* createObjectClass(const std::string& name, HLAObjectClass* hlaObjectClass) = 0; virtual RTIObjectClass* createObjectClass(const std::string& name, HLAObjectClass* hlaObjectClass) = 0;
virtual RTIInteractionClass* createInteractionClass(const std::string& name, HLAInteractionClass* interactionClass) = 0; // virtual RTIInteractionClass* createInteractionClass(const std::string& name) = 0;
virtual RTIObjectInstance* getObjectInstance(const std::string& name) = 0; virtual RTIObjectInstance* getObjectInstance(const std::string& name) = 0;
-40
View File
@@ -1,40 +0,0 @@
// Copyright (C) 2011 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Library General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
#ifndef RTIFederateFactory_hxx
#define RTIFederateFactory_hxx
#include <list>
#include <string>
#include "simgear/structure/SGReferenced.hxx"
namespace simgear {
class RTIFederate;
class RTIFederateFactory : public SGReferenced {
public:
virtual ~RTIFederateFactory();
virtual RTIFederate* create(const std::string& name, const std::list<std::string>& stringList) const = 0;
protected:
void _registerAtFactory();
};
}
#endif
@@ -1,66 +0,0 @@
// Copyright (C) 2011 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Library General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
#ifdef HAVE_CONFIG_H
# include <simgear_config.h>
#endif
#include <simgear/compiler.h>
#include "RTIFederateFactoryRegistry.hxx"
#include "simgear/threads/SGGuard.hxx"
#include "RTIFederate.hxx"
namespace simgear {
RTIFederateFactoryRegistry::RTIFederateFactoryRegistry()
{
}
RTIFederateFactoryRegistry::~RTIFederateFactoryRegistry()
{
}
SGSharedPtr<RTIFederate>
RTIFederateFactoryRegistry::create(const std::string& name, const std::list<std::string>& stringList) const
{
SGGuard<SGMutex> guard(_mutex);
for (FederateFactoryList::const_iterator i = _federateFactoryList.begin(); i != _federateFactoryList.end(); ++i) {
SGSharedPtr<RTIFederate> federate = (*i)->create(name, stringList);
if (!federate.valid())
continue;
return federate;
}
return NULL;
}
void
RTIFederateFactoryRegistry::registerFactory(RTIFederateFactory* factory)
{
SGGuard<SGMutex> guard(_mutex);
_federateFactoryList.push_back(factory);
}
const SGSharedPtr<RTIFederateFactoryRegistry>&
RTIFederateFactoryRegistry::instance()
{
static SGSharedPtr<RTIFederateFactoryRegistry> registry = new RTIFederateFactoryRegistry;
return registry;
}
}
@@ -1,54 +0,0 @@
// Copyright (C) 2011 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Library General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
#ifndef RTIFederateFactoryRegistry_hxx
#define RTIFederateFactoryRegistry_hxx
#include <list>
#include <string>
#include "simgear/structure/SGReferenced.hxx"
#include "simgear/structure/SGSharedPtr.hxx"
#include "RTIFederateFactory.hxx"
#include "simgear/threads/SGThread.hxx"
namespace simgear {
class RTIFederateFactoryRegistry : public SGReferenced {
public:
~RTIFederateFactoryRegistry();
SGSharedPtr<RTIFederate> create(const std::string& name, const std::list<std::string>& stringList) const;
void registerFactory(RTIFederateFactory* factory);
static const SGSharedPtr<RTIFederateFactoryRegistry>& instance();
private:
RTIFederateFactoryRegistry();
RTIFederateFactoryRegistry(const RTIFederateFactoryRegistry&);
RTIFederateFactoryRegistry& operator=(const RTIFederateFactoryRegistry&);
mutable SGMutex _mutex;
typedef std::list<SGSharedPtr<RTIFederateFactory> > FederateFactoryList;
FederateFactoryList _federateFactoryList;
};
}
#endif
+23 -12
View File
@@ -1,4 +1,4 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de // Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
// //
// This library is free software; you can redistribute it and/or // This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public // modify it under the terms of the GNU Library General Public
@@ -18,33 +18,44 @@
#ifndef RTIInteractionClass_hxx #ifndef RTIInteractionClass_hxx
#define RTIInteractionClass_hxx #define RTIInteractionClass_hxx
#include <set>
#include <string> #include <string>
#include <vector>
#include "simgear/structure/SGReferenced.hxx" #include "simgear/structure/SGReferenced.hxx"
#include "simgear/structure/SGSharedPtr.hxx"
#include "simgear/structure/SGReferenced.hxx"
#include "RTIData.hxx"
namespace simgear { namespace simgear {
class HLAInteractionClass;
class RTIInteractionClass : public SGReferenced { class RTIInteractionClass : public SGReferenced {
public: public:
RTIInteractionClass(HLAInteractionClass* interactionClass); RTIInteractionClass(const std::string& name);
virtual ~RTIInteractionClass(); virtual ~RTIInteractionClass();
virtual bool resolveParameterIndex(const std::string& name, unsigned index) = 0; const std::string& getName() const
{ return _name; }
virtual bool publish() = 0; virtual unsigned getNumParameters() const = 0;
virtual unsigned getParameterIndex(const std::string& name) const = 0;
virtual unsigned getOrCreateParameterIndex(const std::string& name) = 0;
virtual bool publish(const std::set<unsigned>& indexSet) = 0;
virtual bool unpublish() = 0; virtual bool unpublish() = 0;
virtual bool subscribe(bool) = 0; virtual bool subscribe(const std::set<unsigned>& indexSet, bool) = 0;
virtual bool unsubscribe() = 0; virtual bool unsubscribe() = 0;
// virtual void send(const RTIData& tag) = 0; virtual void send(const RTIData& tag) = 0;
// virtual void send(const SGTimeStamp& timeStamp, const RTIData& tag) = 0; virtual void send(const SGTimeStamp& timeStamp, const RTIData& tag) = 0;
class ReceiveCallback : public SGReferenced {
public:
virtual ~ReceiveCallback() {}
};
private: private:
HLAInteractionClass* _interactionClass; std::string _name;
friend class HLAInteractionClass;
}; };
} }
+13 -16
View File
@@ -1,4 +1,4 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de // Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
// //
// This library is free software; you can redistribute it and/or // This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public // modify it under the terms of the GNU Library General Public
@@ -15,21 +15,14 @@
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
// //
#ifdef HAVE_CONFIG_H
# include <simgear_config.h>
#endif
#include <simgear/compiler.h>
#include "RTIObjectClass.hxx" #include "RTIObjectClass.hxx"
#include "simgear/debug/logstream.hxx"
#include "RTIObjectInstance.hxx" #include "RTIObjectInstance.hxx"
namespace simgear { namespace simgear {
RTIObjectClass::RTIObjectClass(HLAObjectClass* objectClass) : RTIObjectClass::RTIObjectClass(HLAObjectClass* hlaObjectClass) :
_objectClass(objectClass) _hlaObjectClass(hlaObjectClass)
{ {
} }
@@ -40,31 +33,35 @@ RTIObjectClass::~RTIObjectClass()
void void
RTIObjectClass::discoverInstance(RTIObjectInstance* objectInstance, const RTIData& tag) const RTIObjectClass::discoverInstance(RTIObjectInstance* objectInstance, const RTIData& tag) const
{ {
if (!_objectClass) { SGSharedPtr<HLAObjectClass> hlaObjectClass = _hlaObjectClass.lock();
if (!hlaObjectClass.valid()) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Invalid hla object class pointer in RTIObjectClass::discoverInstance()."); SG_LOG(SG_NETWORK, SG_WARN, "RTI: Invalid hla object class pointer in RTIObjectClass::discoverInstance().");
return; return;
} }
_objectClass->_discoverInstance(objectInstance, tag); hlaObjectClass->discoverInstance(objectInstance, tag);
objectInstance->requestObjectAttributeValueUpdate();
} }
void void
RTIObjectClass::startRegistration() const RTIObjectClass::startRegistration() const
{ {
if (!_objectClass) { SGSharedPtr<HLAObjectClass> hlaObjectClass = _hlaObjectClass.lock();
if (!hlaObjectClass.valid()) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Invalid hla object class pointer in RTIObjectClass::startRegstration()."); SG_LOG(SG_NETWORK, SG_WARN, "RTI: Invalid hla object class pointer in RTIObjectClass::startRegstration().");
return; return;
} }
_objectClass->_startRegistration(); hlaObjectClass->startRegistrationCallback();
} }
void void
RTIObjectClass::stopRegistration() const RTIObjectClass::stopRegistration() const
{ {
if (!_objectClass) { SGSharedPtr<HLAObjectClass> hlaObjectClass = _hlaObjectClass.lock();
if (!hlaObjectClass.valid()) {
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Invalid hla object class pointer in RTIObjectClass::stopRegistration()."); SG_LOG(SG_NETWORK, SG_WARN, "RTI: Invalid hla object class pointer in RTIObjectClass::stopRegistration().");
return; return;
} }
_objectClass->_stopRegistration(); hlaObjectClass->stopRegistrationCallback();
} }
} }
+68 -10
View File
@@ -1,4 +1,4 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de // Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
// //
// This library is free software; you can redistribute it and/or // This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public // modify it under the terms of the GNU Library General Public
@@ -19,44 +19,102 @@
#define RTIObjectClass_hxx #define RTIObjectClass_hxx
#include <string> #include <string>
#include <vector>
#include "simgear/structure/SGReferenced.hxx" #include "simgear/structure/SGReferenced.hxx"
#include "simgear/structure/SGSharedPtr.hxx"
#include "simgear/structure/SGWeakPtr.hxx"
#include "RTIData.hxx" #include "RTIData.hxx"
#include "HLAObjectClass.hxx" #include "HLAObjectClass.hxx"
namespace simgear { namespace simgear {
class RTIData;
class RTIObjectInstance; class RTIObjectInstance;
class HLAObjectClass; class HLAObjectClass;
class RTIObjectClass : public SGReferenced { class RTIObjectClass : public SGReferenced {
public: public:
RTIObjectClass(HLAObjectClass* objectClass); RTIObjectClass(HLAObjectClass* hlaObjectClass);
virtual ~RTIObjectClass(); virtual ~RTIObjectClass();
virtual bool resolveAttributeIndex(const std::string& name, unsigned index) = 0; virtual std::string getName() const = 0;
virtual unsigned getNumAttributes() const = 0; virtual unsigned getNumAttributes() const = 0;
virtual unsigned getAttributeIndex(const std::string& name) const = 0;
virtual unsigned getOrCreateAttributeIndex(const std::string& name) = 0;
virtual bool publish(const HLAIndexList& indexList) = 0; virtual bool publish(const std::set<unsigned>& indexSet) = 0;
virtual bool unpublish() = 0; virtual bool unpublish() = 0;
virtual bool subscribe(const HLAIndexList& indexList, bool) = 0; virtual bool subscribe(const std::set<unsigned>& indexSet, bool) = 0;
virtual bool unsubscribe() = 0; virtual bool unsubscribe() = 0;
// Factory to create an object instance that can be used in this current federate // Factory to create an object instance that can be used in this current federate
virtual RTIObjectInstance* registerObjectInstance(HLAObjectInstance*) = 0; virtual RTIObjectInstance* registerObjectInstance(HLAObjectInstance*) = 0;
// Call back into HLAObjectClass
void discoverInstance(RTIObjectInstance* objectInstance, const RTIData& tag) const; void discoverInstance(RTIObjectInstance* objectInstance, const RTIData& tag) const;
void startRegistration() const; void startRegistration() const;
void stopRegistration() const; void stopRegistration() const;
private: void setAttributeDataType(unsigned index, SGSharedPtr<const HLADataType> dataType)
HLAObjectClass* _objectClass; {
if (_attributeDataVector.size() <= index)
return;
_attributeDataVector[index]._dataType = dataType;
}
const HLADataType* getAttributeDataType(unsigned index) const
{
if (_attributeDataVector.size() <= index)
return 0;
return _attributeDataVector[index]._dataType.get();
}
friend class HLAObjectClass; HLAUpdateType getAttributeUpdateType(unsigned index) const
{
if (_attributeDataVector.size() <= index)
return HLAUndefinedUpdate;
return _attributeDataVector[index]._updateType;
}
void setAttributeUpdateType(unsigned index, HLAUpdateType updateType)
{
if (_attributeDataVector.size() <= index)
return;
_attributeDataVector[index]._updateType = updateType;
}
bool getAttributeSubscribed(unsigned index) const
{
if (_attributeDataVector.size() <= index)
return false;
return _attributeDataVector[index]._subscribed;
}
bool getAttributePublished(unsigned index) const
{
if (_attributeDataVector.size() <= index)
return false;
return _attributeDataVector[index]._published;
}
std::string getAttributeName(unsigned index) const
{
if (_attributeDataVector.size() <= index)
return std::string();
return _attributeDataVector[index]._name;
}
protected:
struct AttributeData {
AttributeData(const std::string& name) : _name(name), _subscribed(false), _published(false), _updateType(HLAUndefinedUpdate) {}
std::string _name;
SGSharedPtr<const HLADataType> _dataType;
bool _subscribed;
bool _published;
HLAUpdateType _updateType;
};
typedef std::vector<AttributeData> AttributeDataVector;
AttributeDataVector _attributeDataVector;
private:
SGWeakPtr<HLAObjectClass> _hlaObjectClass;
}; };
} }
+36 -16
View File
@@ -1,4 +1,4 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de // Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
// //
// This library is free software; you can redistribute it and/or // This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public // modify it under the terms of the GNU Library General Public
@@ -15,12 +15,6 @@
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
// //
#ifdef HAVE_CONFIG_H
# include <simgear_config.h>
#endif
#include <simgear/compiler.h>
#include "RTIObjectInstance.hxx" #include "RTIObjectInstance.hxx"
#include "RTIObjectClass.hxx" #include "RTIObjectClass.hxx"
#include "HLAObjectInstance.hxx" #include "HLAObjectInstance.hxx"
@@ -28,7 +22,8 @@
namespace simgear { namespace simgear {
RTIObjectInstance::RTIObjectInstance(HLAObjectInstance* hlaObjectInstance) : RTIObjectInstance::RTIObjectInstance(HLAObjectInstance* hlaObjectInstance) :
_objectInstance(hlaObjectInstance) _hlaObjectInstance(hlaObjectInstance),
_pendingAttributeUpdateRequest(false)
{ {
} }
@@ -42,29 +37,54 @@ RTIObjectInstance::getNumAttributes() const
return getObjectClass()->getNumAttributes(); return getObjectClass()->getNumAttributes();
} }
unsigned
RTIObjectInstance::getAttributeIndex(const std::string& name) const
{
return getObjectClass()->getAttributeIndex(name);
}
std::string
RTIObjectInstance::getAttributeName(unsigned index) const
{
return getObjectClass()->getAttributeName(index);
}
void void
RTIObjectInstance::removeInstance(const RTIData& tag) RTIObjectInstance::removeInstance(const RTIData& tag)
{ {
if (!_objectInstance) SGSharedPtr<HLAObjectInstance> hlaObjectInstance = _hlaObjectInstance.lock();
if (!hlaObjectInstance.valid())
return; return;
_objectInstance->_removeInstance(tag); hlaObjectInstance->removeInstance(tag);
} }
void void
RTIObjectInstance::reflectAttributeValues(const HLAIndexList& indexList, const RTIData& tag) RTIObjectInstance::reflectAttributeValues(const RTIIndexDataPairList& dataPairList, const RTIData& tag)
{ {
if (!_objectInstance) for (RTIIndexDataPairList::const_iterator i = dataPairList.begin();
i != dataPairList.end(); ++i) {
reflectAttributeValue(i->first, i->second);
}
SGSharedPtr<HLAObjectInstance> hlaObjectInstance = _hlaObjectInstance.lock();
if (!hlaObjectInstance.valid())
return; return;
_objectInstance->_reflectAttributeValues(indexList, tag); hlaObjectInstance->reflectAttributeValues(dataPairList, tag);
} }
void void
RTIObjectInstance::reflectAttributeValues(const HLAIndexList& indexList, RTIObjectInstance::reflectAttributeValues(const RTIIndexDataPairList& dataPairList,
const SGTimeStamp& timeStamp, const RTIData& tag) const SGTimeStamp& timeStamp, const RTIData& tag)
{ {
if (!_objectInstance) for (RTIIndexDataPairList::const_iterator i = dataPairList.begin();
i != dataPairList.end(); ++i) {
reflectAttributeValue(i->first, i->second);
}
SGSharedPtr<HLAObjectInstance> hlaObjectInstance = _hlaObjectInstance.lock();
if (!hlaObjectInstance.valid())
return; return;
_objectInstance->_reflectAttributeValues(indexList, timeStamp, tag); hlaObjectInstance->reflectAttributeValues(dataPairList, timeStamp, tag);
} }
} }
+189 -55
View File
@@ -18,9 +18,13 @@
#ifndef RTIObjectInstance_hxx #ifndef RTIObjectInstance_hxx
#define RTIObjectInstance_hxx #define RTIObjectInstance_hxx
#include <list>
#include <map>
#include <string> #include <string>
#include <vector> #include <vector>
#include "simgear/debug/logstream.hxx"
#include "simgear/structure/SGReferenced.hxx" #include "simgear/structure/SGReferenced.hxx"
#include "simgear/structure/SGWeakPtr.hxx"
#include "simgear/timing/timestamp.hxx" #include "simgear/timing/timestamp.hxx"
#include "RTIData.hxx" #include "RTIData.hxx"
#include "RTIObjectClass.hxx" #include "RTIObjectClass.hxx"
@@ -35,117 +39,247 @@ class HLAObjectInstance;
class RTIObjectInstance : public SGReferenced { class RTIObjectInstance : public SGReferenced {
public: public:
RTIObjectInstance(HLAObjectInstance* objectInstance); RTIObjectInstance(HLAObjectInstance* hlaObjectInstance);
virtual ~RTIObjectInstance(); virtual ~RTIObjectInstance();
void setObjectInstance(HLAObjectInstance* objectInstance)
{ _objectInstance = objectInstance; }
virtual const RTIObjectClass* getObjectClass() const = 0; virtual const RTIObjectClass* getObjectClass() const = 0;
virtual std::string getName() const = 0; virtual std::string getName() const = 0;
unsigned getNumAttributes() const; unsigned getNumAttributes() const;
unsigned getAttributeIndex(const std::string& name) const;
std::string getAttributeName(unsigned index) const;
virtual void deleteObjectInstance(const RTIData& tag) = 0; virtual void deleteObjectInstance(const RTIData& tag) = 0;
virtual void deleteObjectInstance(const SGTimeStamp& timeStamp, const RTIData& tag) = 0; virtual void deleteObjectInstance(const SGTimeStamp& timeStamp, const RTIData& tag) = 0;
virtual void localDeleteObjectInstance() = 0; virtual void localDeleteObjectInstance() = 0;
virtual void requestObjectAttributeValueUpdate(const HLAIndexList& indexList) = 0; virtual void requestObjectAttributeValueUpdate() = 0;
virtual void updateAttributeValues(const RTIData& tag) = 0; virtual void updateAttributeValues(const RTIData& tag) = 0;
virtual void updateAttributeValues(const SGTimeStamp& timeStamp, const RTIData& tag) = 0; virtual void updateAttributeValues(const SGTimeStamp& timeStamp, const RTIData& tag) = 0;
virtual bool isAttributeOwnedByFederate(unsigned index) const = 0;
void removeInstance(const RTIData& tag); void removeInstance(const RTIData& tag);
void reflectAttributeValues(const HLAIndexList& indexList, const RTIData& tag); void reflectAttributeValues(const RTIIndexDataPairList& dataPairList, const RTIData& tag);
void reflectAttributeValues(const HLAIndexList& indexList, const SGTimeStamp& timeStamp, const RTIData& tag); void reflectAttributeValues(const RTIIndexDataPairList& dataPairList, const SGTimeStamp& timeStamp, const RTIData& tag);
void reflectAttributeValue(unsigned i, const RTIData& data)
bool encodeAttributeData(unsigned index, const HLADataElement& dataElement)
{ {
if (_attributeData.size() <= index) if (_attributeData.size() <= i)
return false; return;
return _attributeData[index].encodeAttributeData(dataElement); HLADataElement* dataElement = _attributeData[i]._dataElement.get();
if (!dataElement)
return;
HLADecodeStream stream(data);
dataElement->decode(stream);
} }
bool decodeAttributeData(unsigned index, HLADataElement& dataElement) const const HLADataType* getAttributeDataType(unsigned i) const
{ {
if (_attributeData.size() <= index) return getObjectClass()->getAttributeDataType(i);
return false; }
return _attributeData[index].decodeAttributeData(dataElement); HLAUpdateType getAttributeUpdateType(unsigned i) const
{
return getObjectClass()->getAttributeUpdateType(i);
}
bool getAttributeSubscribed(unsigned i) const
{
return getObjectClass()->getAttributeSubscribed(i);
}
bool getAttributePublished(unsigned i) const
{
return getObjectClass()->getAttributePublished(i);
} }
bool getAttributeData(unsigned index, RTIData& data) const HLADataElement* getDataElement(unsigned i)
{ {
if (_attributeData.size() <= index) if (_attributeData.size() <= i)
return false; return 0;
data = _attributeData[index]._data; return _attributeData[i]._dataElement.get();
return true; }
const HLADataElement* getDataElement(unsigned i) const
{
if (_attributeData.size() <= i)
return 0;
return _attributeData[i]._dataElement.get();
}
void setDataElement(unsigned i, HLADataElement* dataElement)
{
if (_attributeData.size() <= i)
return;
_attributeData[i]._dataElement = dataElement;
} }
bool getAttributeOwned(unsigned index) const void updateAttributesFromClass(bool owned)
{ {
if (_attributeData.size() <= index) // FIXME: rethink that!!!
return false; unsigned numAttributes = getNumAttributes();
return _attributeData[index]._owned; unsigned i = 0;
for (; i < _attributeData.size(); ++i) {
if (getAttributePublished(i)) {
} else {
_attributeData[i].setUpdateEnabled(false);
_attributeData[i].setOwned(false);
if (getAttributeSubscribed(i))
_attributeData[i].setRequestUpdate(true);
}
}
_attributeData.resize(numAttributes);
for (; i < numAttributes; ++i) {
if (getAttributePublished(i)) {
_attributeData[i].setUpdateEnabled(true);
_attributeData[i].setOwned(owned);
if (!owned && getAttributeSubscribed(i))
_attributeData[i].setRequestUpdate(true);
} else {
_attributeData[i].setUpdateEnabled(false);
_attributeData[i].setOwned(false);
if (getAttributeSubscribed(i))
_attributeData[i].setRequestUpdate(true);
}
}
} }
void setAttributeForceUpdate(unsigned i)
{
if (_attributeData.size() <= i)
return;
_attributeData[i].setForceUpdate(true);
}
void setAttributeInScope(unsigned i, bool inScope) void setAttributeInScope(unsigned i, bool inScope)
{ {
if (_attributeData.size() <= i) if (_attributeData.size() <= i)
return; return;
_attributeData[i]._inScope = inScope; _attributeData[i].setInScope(inScope);
} }
void setAttributeUpdateEnabled(unsigned i, bool enabled) void setAttributeUpdateEnabled(unsigned i, bool enabled)
{ {
if (_attributeData.size() <= i) if (_attributeData.size() <= i)
return; return;
_attributeData[i]._updateEnabled = enabled; _attributeData[i].setUpdateEnabled(enabled);
}
void setAttributeUpdated(unsigned i)
{
if (_attributeData.size() <= i)
return;
_attributeData[i].setForceUpdate(false);
}
bool getAttributeEffectiveUpdateEnabled(unsigned i)
{
if (_attributeData.size() <= i)
return false;
if (!getAttributePublished(i))
return false;
if (!_attributeData[i]._updateEnabled)
return false;
if (!_attributeData[i]._inScope)
return false;
if (_attributeData[i]._forceUpdate)
return true;
switch (getAttributeUpdateType(i)) {
case HLAPeriodicUpdate:
return true;
case HLAConditionalUpdate:
return true; // FIXME
case HLAStaticUpdate:
return false;
default:
return false;
}
}
void setRequestAttributeUpdate(bool request)
{
for (unsigned i = 0; i < getNumAttributes(); ++i) {
if (getAttributeUpdateType(i) == HLAPeriodicUpdate)
continue;
setRequestAttributeUpdate(i, request);
}
}
void setRequestAttributeUpdate(unsigned i, bool request)
{
if (_attributeData.size() <= i)
return;
_attributeData[i].setRequestUpdate(request);
if (request) {
if (!_pendingAttributeUpdateRequest) {
_pendingAttributeUpdateRequest = true;
}
}
}
bool getRequestAttributeUpdate(unsigned i) const
{
if (_attributeData.size() <= i)
return false;
return _attributeData[i]._requestUpdate;
}
void flushPendingRequests()
{
if (_pendingAttributeUpdateRequest) {
requestObjectAttributeValueUpdate();
_pendingAttributeUpdateRequest = false;
}
} }
protected: protected:
// Initially set the number of attributes, do an initial query for the attribute ownership // The backward reference to the user visible object
void _setNumAttributes(unsigned numAttributes) SGWeakPtr<HLAObjectInstance> _hlaObjectInstance;
// Is true if we should emit a requestattr
bool _pendingAttributeUpdateRequest;
// Pool of update list entries
RTIIndexDataPairList _indexDataPairList;
// This adds raw storage for attribute index i to the end of the dataPairList.
void getDataFromPool(RTIIndexDataPairList& dataPairList)
{ {
_attributeData.resize(numAttributes); // Nothing left in the pool - so allocate something
for (unsigned i = 0; i < numAttributes; ++i) if (_indexDataPairList.empty()) {
_attributeData[i]._owned = isAttributeOwnedByFederate(i); dataPairList.push_back(RTIIndexDataPairList::value_type());
return;
}
// Take one from the pool
dataPairList.splice(dataPairList.end(), _indexDataPairList, _indexDataPairList.begin());
} }
// The backward reference to the user visible object void putDataToPool(RTIIndexDataPairList& dataPairList)
HLAObjectInstance* _objectInstance; {
_indexDataPairList.splice(_indexDataPairList.begin(), dataPairList);
}
struct AttributeData { struct AttributeData {
AttributeData() : _owned(false), _inScope(true), _updateEnabled(true), _dirty(false) AttributeData() : _owned(false), _inScope(true), _updateEnabled(true), _forceUpdate(false), _requestUpdate(false)
{ } { }
bool encodeAttributeData(const HLADataElement& dataElement) // The hla level data element with tha actual local program
{ // accessible data.
_dirty = true; SGSharedPtr<HLADataElement> _dataElement;
_data.resize(0); // SGSharedPtr<HLADataElement::TimeStamp> _timeStamp;
HLAEncodeStream stream(_data);
return dataElement.encode(stream);
}
bool decodeAttributeData(HLADataElement& dataElement) const // Pool of already allocated raw data used for reflection of updates
{ RTIIndexDataPairList _indexDataPairList;
HLADecodeStream stream(_data);
return dataElement.decode(stream);
}
// The rti level raw data element void setOwned(bool owned)
RTIData _data; { _owned = owned; }
void setInScope(bool inScope)
{ _inScope = inScope; }
void setUpdateEnabled(bool updateEnabled)
{ _updateEnabled = updateEnabled; }
void setForceUpdate(bool forceUpdate)
{ _forceUpdate = forceUpdate; }
void setRequestUpdate(bool requestUpdate)
{ _requestUpdate = requestUpdate; }
// The state of the attribute as tracked from the rti.
bool _owned; bool _owned;
bool _inScope; bool _inScope;
bool _updateEnabled; bool _updateEnabled;
bool _forceUpdate;
// Is set to true if _data has be reencoded bool _requestUpdate;
bool _dirty;
}; };
std::vector<AttributeData> _attributeData; std::vector<AttributeData> _attributeData;
friend class HLAObjectInstance;
}; };
} }
+9 -29
View File
@@ -25,6 +25,9 @@ using std::string;
using std::stringstream; using std::stringstream;
using std::vector; using std::vector;
//#include <iostream>
//using namespace std;
namespace simgear namespace simgear
{ {
@@ -32,7 +35,6 @@ namespace HTTP
{ {
extern const int DEFAULT_HTTP_PORT = 80; extern const int DEFAULT_HTTP_PORT = 80;
const char* CONTENT_TYPE_URL_ENCODED = "application/x-www-form-urlencoded";
class Connection : public NetChat class Connection : public NetChat
{ {
@@ -101,27 +103,15 @@ public:
state = STATE_SENT_REQUEST; state = STATE_SENT_REQUEST;
bodyTransferSize = -1; bodyTransferSize = -1;
chunkedTransfer = false; chunkedTransfer = false;
noMessageBody = (r->method() == "HEAD");
setTerminator("\r\n"); setTerminator("\r\n");
stringstream headerData; stringstream headerData;
string path = r->path(); string path = r->path();
string query = r->query();
string bodyData;
if (!client->proxyHost().empty()) { if (!client->proxyHost().empty()) {
path = r->scheme() + "://" + r->host() + r->path(); path = r->url();
} }
if (r->method() == "POST") { headerData << r->method() << " " << path << " HTTP/1.1\r\n";
headerData << r->method() << " " << path << " HTTP/1.1\r\n";
bodyData = query.substr(1); // URL-encode, drop the leading '?'
headerData << "Content-Type:" << CONTENT_TYPE_URL_ENCODED << "\r\n";
headerData << "Content-Length:" << bodyData.size() << "\r\n";
} else {
headerData << r->method() << " " << path << query << " HTTP/1.1\r\n";
}
headerData << "Host: " << r->hostAndPort() << "\r\n"; headerData << "Host: " << r->hostAndPort() << "\r\n";
headerData << "User-Agent:" << client->userAgent() << "\r\n"; headerData << "User-Agent:" << client->userAgent() << "\r\n";
if (!client->proxyAuth().empty()) { if (!client->proxyAuth().empty()) {
@@ -133,10 +123,9 @@ public:
} }
headerData << "\r\n"; // final CRLF to terminate the headers headerData << "\r\n"; // final CRLF to terminate the headers
if (!bodyData.empty()) {
headerData << bodyData; // TODO - add request body support for PUT, etc operations
}
bool ok = push(headerData.str().c_str()); bool ok = push(headerData.str().c_str());
if (!ok) { if (!ok) {
SG_LOG(SG_IO, SG_WARN, "HTTP writing to socket failed"); SG_LOG(SG_IO, SG_WARN, "HTTP writing to socket failed");
@@ -161,10 +150,6 @@ public:
activeRequest->responseStart(buffer); activeRequest->responseStart(buffer);
state = STATE_GETTING_HEADERS; state = STATE_GETTING_HEADERS;
buffer.clear(); buffer.clear();
if (activeRequest->responseCode() == 204) {
noMessageBody = true;
}
break; break;
case STATE_GETTING_HEADERS: case STATE_GETTING_HEADERS:
@@ -248,11 +233,6 @@ private:
if (chunkedTransfer) { if (chunkedTransfer) {
state = STATE_GETTING_CHUNKED; state = STATE_GETTING_CHUNKED;
} else if (noMessageBody || (bodyTransferSize == 0)) {
// force the state to GETTING_BODY, to simplify logic in
// responseComplete and handleClose
state = STATE_GETTING_BODY;
responseComplete();
} else { } else {
setByteCount(bodyTransferSize); // may be -1, that's fine setByteCount(bodyTransferSize); // may be -1, that's fine
state = STATE_GETTING_BODY; state = STATE_GETTING_BODY;
@@ -347,6 +327,7 @@ private:
{ {
activeRequest->responseComplete(); activeRequest->responseComplete();
client->requestFinished(this); client->requestFinished(this);
//cout << "response complete: " << activeRequest->url() << endl;
bool doClose = activeRequest->closeAfterComplete(); bool doClose = activeRequest->closeAfterComplete();
activeRequest = NULL; activeRequest = NULL;
@@ -393,7 +374,6 @@ private:
int bodyTransferSize; int bodyTransferSize;
SGTimeStamp idleTime; SGTimeStamp idleTime;
bool chunkedTransfer; bool chunkedTransfer;
bool noMessageBody;
std::list<Request_ptr> queuedRequests; std::list<Request_ptr> queuedRequests;
}; };
-14
View File
@@ -125,20 +125,6 @@ string Request::path() const
return u.substr(hostEnd, query - hostEnd); return u.substr(hostEnd, query - hostEnd);
} }
string Request::query() const
{
string u(url());
int query = u.find('?');
if (query < 0) {
return ""; //no query string found
}
return u.substr(query); //includes question mark
}
string Request::host() const string Request::host() const
{ {
string hp(hostAndPort()); string hp(hostAndPort());
-1
View File
@@ -30,7 +30,6 @@ public:
virtual std::string host() const; virtual std::string host() const;
virtual std::string hostAndPort() const; virtual std::string hostAndPort() const;
virtual unsigned short port() const; virtual unsigned short port() const;
virtual std::string query() const;
virtual string_list requestHeaders() const; virtual string_list requestHeaders() const;
virtual std::string header(const std::string& name) const; virtual std::string header(const std::string& name) const;
+1 -1
View File
@@ -17,7 +17,7 @@
You should have received a copy of the GNU Library General Public You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free Software License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/ */
#ifdef HAVE_CONFIG_H #ifdef HAVE_CONFIG_H
+1 -1
View File
@@ -17,7 +17,7 @@
You should have received a copy of the GNU Library General Public You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free Software License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/ */
#ifndef SG_IO_SOCKET_HXX #ifndef SG_IO_SOCKET_HXX
+1 -1
View File
@@ -16,7 +16,7 @@
You should have received a copy of the GNU Library General Public You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free Software License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
For further information visit http://plib.sourceforge.net For further information visit http://plib.sourceforge.net
+1 -1
View File
@@ -16,7 +16,7 @@
You should have received a copy of the GNU Library General Public You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free Software License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
For further information visit http://plib.sourceforge.net For further information visit http://plib.sourceforge.net
+1 -1
View File
@@ -16,7 +16,7 @@
You should have received a copy of the GNU Library General Public You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free Software License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
For further information visit http://plib.sourceforge.net For further information visit http://plib.sourceforge.net
+1 -1
View File
@@ -16,7 +16,7 @@
You should have received a copy of the GNU Library General Public You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free Software License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
For further information visit http://plib.sourceforge.net For further information visit http://plib.sourceforge.net
+1 -1
View File
@@ -16,7 +16,7 @@
You should have received a copy of the GNU Library General Public You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free Software License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
For further information visit http://plib.sourceforge.net For further information visit http://plib.sourceforge.net
+1 -1
View File
@@ -16,7 +16,7 @@
You should have received a copy of the GNU Library General Public You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free Software License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
For further information visit http://plib.sourceforge.net For further information visit http://plib.sourceforge.net
+7 -132
View File
@@ -46,8 +46,8 @@ public:
bool failed; bool failed;
string bodyData; string bodyData;
TestRequest(const std::string& url, const std::string method = "GET") : TestRequest(const std::string& url) :
HTTP::Request(url, method), HTTP::Request(url),
complete(false) complete(false)
{ {
} }
@@ -133,13 +133,6 @@ public:
method = line[0]; method = line[0];
path = line[1]; path = line[1];
string::size_type queryPos = path.find('?');
if (queryPos != string::npos) {
parseArgs(path.substr(queryPos + 1));
path = path.substr(0, queryPos);
}
httpVersion = line[2]; httpVersion = line[2];
requestHeaders.clear(); requestHeaders.clear();
buffer.clear(); buffer.clear();
@@ -151,8 +144,8 @@ public:
return; return;
} }
string::size_type colonPos = buffer.find(':'); int colonPos = buffer.find(':');
if (colonPos == string::npos) { if (colonPos < 0) {
cerr << "malformed HTTP response header:" << buffer << endl; cerr << "malformed HTTP response header:" << buffer << endl;
buffer.clear(); buffer.clear();
return; return;
@@ -163,28 +156,10 @@ public:
requestHeaders[key] = value; requestHeaders[key] = value;
buffer.clear(); buffer.clear();
} else if (state == STATE_REQUEST_BODY) { } else if (state == STATE_REQUEST_BODY) {
cerr << "done getting requst body";
receivedBody();
setTerminator("\r\n");
} }
} }
void parseArgs(const string& argData)
{
string_list argv = strutils::split(argData, "&");
for (unsigned int a=0; a<argv.size(); ++a) {
string::size_type eqPos = argv[a].find('=');
if (eqPos == string::npos) {
cerr << "malformed HTTP argument:" << argv[a] << endl;
continue;
}
string key = argv[a].substr(0, eqPos);
string value = argv[a].substr(eqPos + 1);
args[key] = value;
}
}
void receivedRequestHeaders() void receivedRequestHeaders()
{ {
state = STATE_IDLE; state = STATE_IDLE;
@@ -197,14 +172,6 @@ public:
d << "\r\n"; // final CRLF to terminate the headers d << "\r\n"; // final CRLF to terminate the headers
d << contentStr; d << contentStr;
push(d.str().c_str()); push(d.str().c_str());
} else if (path == "/test_zero_length_content") {
string contentStr;
stringstream d;
d << "HTTP/1.1 " << 200 << " " << reasonForCode(200) << "\r\n";
d << "Content-Length:" << contentStr.size() << "\r\n";
d << "\r\n"; // final CRLF to terminate the headers
d << contentStr;
push(d.str().c_str());
} else if (path == "/test_headers") { } else if (path == "/test_headers") {
COMPARE(requestHeaders["X-Foo"], string("Bar")); COMPARE(requestHeaders["X-Foo"], string("Bar"));
COMPARE(requestHeaders["X-AnotherHeader"], string("A longer value")); COMPARE(requestHeaders["X-AnotherHeader"], string("A longer value"));
@@ -272,53 +239,8 @@ public:
d << contentStr; d << contentStr;
push(d.str().c_str()); push(d.str().c_str());
closeWhenDone(); closeWhenDone();
} else if (path == "/test_args") {
if ((args["foo"] != "abc") || (args["bar"] != "1234") || (args["username"] != "johndoe")) {
sendErrorResponse(400, true, "bad arguments");
return;
}
string contentStr(BODY1);
stringstream d;
d << "HTTP/1.1 " << 200 << " " << reasonForCode(200) << "\r\n";
d << "Content-Length:" << contentStr.size() << "\r\n";
d << "\r\n"; // final CRLF to terminate the headers
d << contentStr;
push(d.str().c_str());
} else if (path == "/test_post") {
if (requestHeaders["Content-Type"] != "application/x-www-form-urlencoded") {
cerr << "bad content type: '" << requestHeaders["Content-Type"] << "'" << endl;
sendErrorResponse(400, true, "bad content type");
return;
}
requestContentLength = strutils::to_int(requestHeaders["Content-Length"]);
setByteCount(requestContentLength);
state = STATE_REQUEST_BODY;
} else { } else {
sendErrorResponse(404, false, ""); sendErrorResponse(404, true, "");
}
}
void receivedBody()
{
state = STATE_IDLE;
if (method == "POST") {
parseArgs(buffer);
}
if (path == "/test_post") {
if ((args["foo"] != "abc") || (args["bar"] != "1234") || (args["username"] != "johndoe")) {
sendErrorResponse(400, true, "bad arguments");
return;
}
stringstream d;
d << "HTTP/1.1 " << 204 << " " << reasonForCode(204) << "\r\n";
d << "\r\n"; // final CRLF to terminate the headers
push(d.str().c_str());
cerr << "sent 204 response ok" << endl;
} }
} }
@@ -351,7 +273,6 @@ public:
{ {
switch (code) { switch (code) {
case 200: return "OK"; case 200: return "OK";
case 204: return "no content";
case 404: return "not found"; case 404: return "not found";
default: return "unknown code"; default: return "unknown code";
} }
@@ -363,8 +284,6 @@ public:
string path; string path;
string httpVersion; string httpVersion;
std::map<string, string> requestHeaders; std::map<string, string> requestHeaders;
std::map<string, string> args;
int requestContentLength;
}; };
class TestServer : public NetChannel class TestServer : public NetChannel
@@ -455,17 +374,7 @@ int main(int argc, char* argv[])
COMPARE(tr->responseBytesReceived(), strlen(BODY1)); COMPARE(tr->responseBytesReceived(), strlen(BODY1));
COMPARE(tr->bodyData, string(BODY1)); COMPARE(tr->bodyData, string(BODY1));
} }
{
TestRequest* tr = new TestRequest("http://localhost:2000/test_args?foo=abc&bar=1234&username=johndoe");
HTTP::Request_ptr own(tr);
cl.makeRequest(tr);
waitForComplete(&cl, tr);
COMPARE(tr->responseCode(), 200);
}
cerr << "done args" << endl;
{ {
TestRequest* tr = new TestRequest("http://localhost:2000/test_headers"); TestRequest* tr = new TestRequest("http://localhost:2000/test_headers");
HTTP::Request_ptr own(tr); HTTP::Request_ptr own(tr);
@@ -496,7 +405,6 @@ int main(int argc, char* argv[])
COMPARE(tr->bodyData, string(body2, body2Size)); COMPARE(tr->bodyData, string(body2, body2Size));
} }
cerr << "testing chunked" << endl;
{ {
TestRequest* tr = new TestRequest("http://localhost:2000/testchunked"); TestRequest* tr = new TestRequest("http://localhost:2000/testchunked");
HTTP::Request_ptr own(tr); HTTP::Request_ptr own(tr);
@@ -522,16 +430,6 @@ int main(int argc, char* argv[])
COMPARE(tr->responseLength(), 0); COMPARE(tr->responseLength(), 0);
} }
cout << "done 404 test" << endl;
{
TestRequest* tr = new TestRequest("http://localhost:2000/test_args?foo=abc&bar=1234&username=johndoe");
HTTP::Request_ptr own(tr);
cl.makeRequest(tr);
waitForComplete(&cl, tr);
COMPARE(tr->responseCode(), 200);
}
cout << "done1" << endl; cout << "done1" << endl;
// test HTTP/1.0 // test HTTP/1.0
{ {
@@ -638,29 +536,6 @@ int main(int argc, char* argv[])
COMPARE(tr3->bodyData, string(BODY1)); COMPARE(tr3->bodyData, string(BODY1));
} }
// POST
{
cout << "POST" << endl;
TestRequest* tr = new TestRequest("http://localhost:2000/test_post?foo=abc&bar=1234&username=johndoe", "POST");
HTTP::Request_ptr own(tr);
cl.makeRequest(tr);
waitForComplete(&cl, tr);
COMPARE(tr->responseCode(), 204);
}
// test_zero_length_content
{
cout << "zero-length-content-response" << endl;
TestRequest* tr = new TestRequest("http://localhost:2000/test_zero_length_content");
HTTP::Request_ptr own(tr);
cl.makeRequest(tr);
waitForComplete(&cl, tr);
COMPARE(tr->responseCode(), 200);
COMPARE(tr->bodyData, string());
COMPARE(tr->responseBytesReceived(), 0);
}
cout << "all tests passed ok" << endl; cout << "all tests passed ok" << endl;
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }
+1 -1
View File
@@ -9,7 +9,7 @@
#include <cstdlib> #include <cstdlib>
#include <cstdio> #include <cstdio>
#if defined _MSC_VER || defined _WIN32_WINNT #ifdef _MSC_VER
# define random rand # define random rand
#endif #endif
+4 -2
View File
@@ -2,6 +2,7 @@ include (SimGearComponent)
set(HEADERS set(HEADERS
Math.hxx
SGBox.hxx SGBox.hxx
SGCMath.hxx SGCMath.hxx
SGGeoc.hxx SGGeoc.hxx
@@ -29,14 +30,15 @@ set(HEADERS
leastsqs.hxx leastsqs.hxx
sg_geodesy.hxx sg_geodesy.hxx
sg_types.hxx sg_types.hxx
sg_random.h sg_random.h
) )
set(SOURCES set(SOURCES
SGGeod.cxx
SGGeodesy.cxx SGGeodesy.cxx
interpolater.cxx interpolater.cxx
leastsqs.cxx leastsqs.cxx
sg_random.c sg_random.c
) )
simgear_component(math math "${SOURCES}" "${HEADERS}") simgear_component(math math "${SOURCES}" "${HEADERS}")
+23
View File
@@ -0,0 +1,23 @@
#ifndef SIMGEAR_MATH_MATH_HXX
#define SIMGEAR_MATH_MATH_HXX 1
namespace simgear
{
namespace math
{
/** Linear interpolation between two values.
*/
template<typename T>
inline T lerp(const T& x, const T& y, double alpha)
{
return x * (1.0 - alpha) + y * alpha;
}
template<typename T>
inline T lerp(const T& x, const T& y, float alpha)
{
return x * (1.0f - alpha) + y * alpha;
}
}
}
#endif
+59
View File
@@ -0,0 +1,59 @@
// Copyright (C) 2008 Tim Moore timoore@redhat.com
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Library General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
#ifdef HAVE_CONFIG_H
# include <simgear_config.h>
#endif
#include "SGMath.hxx"
#ifndef NO_OPENSCENEGRAPH_INTERFACE
osg::Matrix SGGeod::makeSimulationFrameRelative() const
{
SGQuatd hlOr = SGQuatd::fromLonLat(*this);
return osg::Matrix(toOsg(hlOr));
}
osg::Matrix SGGeod::makeSimulationFrame() const
{
osg::Matrix result(makeSimulationFrameRelative());
SGVec3d coord;
SGGeodesy::SGGeodToCart(*this, coord);
result.setTrans(toOsg(coord));
return result;
}
osg::Matrix SGGeod::makeZUpFrameRelative() const
{
osg::Matrix result(makeSimulationFrameRelative());
// 180 degree rotation around Y axis
osg::Quat flip(0.0, 1.0, 0.0, 0.0);
result.preMult(osg::Matrix(flip));
return result;
}
osg::Matrix SGGeod::makeZUpFrame() const
{
osg::Matrix result(makeZUpFrameRelative());
SGVec3d coord;
SGGeodesy::SGGeodToCart(*this, coord);
result.setTrans(toOsg(coord));
return result;
}
#endif
+17
View File
@@ -20,6 +20,10 @@
#include <simgear/constants.h> #include <simgear/constants.h>
#ifndef NO_OPENSCENEGRAPH_INTERFACE
#include <osg/Matrix>
#endif
// #define SG_GEOD_NATIVE_DEGREE // #define SG_GEOD_NATIVE_DEGREE
/// Class representing a geodetic location /// Class representing a geodetic location
@@ -85,6 +89,19 @@ public:
// Compare two geodetic positions for equality // Compare two geodetic positions for equality
bool operator == ( const SGGeod & other ) const; bool operator == ( const SGGeod & other ) const;
#ifndef NO_OPENSCENEGRAPH_INTERFACE
// Create a local coordinate frame in the earth-centered frame of
// reference. X points north, Z points down.
// makeSimulationFrameRelative() only includes rotation.
osg::Matrix makeSimulationFrameRelative() const;
osg::Matrix makeSimulationFrame() const;
// Create a Z-up local coordinate frame in the earth-centered frame
// of reference. This is what scenery models, etc. expect.
// makeZUpFrameRelative() only includes rotation.
osg::Matrix makeZUpFrameRelative() const;
osg::Matrix makeZUpFrame() const;
#endif
private: private:
/// This one is private since construction is not unique if you do /// This one is private since construction is not unique if you do
/// not know the units of the arguments. Use the factory methods for /// not know the units of the arguments. Use the factory methods for
+1 -1
View File
@@ -87,7 +87,7 @@ SGGeodesy::SGCartToGeod(const SGVec3<double>& cart, SGGeod& geod)
// coordinates 0/0/-EQURAD. It may be any other place on geoide's surface, // coordinates 0/0/-EQURAD. It may be any other place on geoide's surface,
// the Northpole, Hawaii or Wentorf. This one was easy to code ;-) // the Northpole, Hawaii or Wentorf. This one was easy to code ;-)
geod.setLongitudeRad( 0.0 ); geod.setLongitudeRad( 0.0 );
geod.setLatitudeRad( 0.0 ); geod.setLongitudeRad( 0.0 );
geod.setElevationM( -EQURAD ); geod.setElevationM( -EQURAD );
return; return;
} }

Some files were not shown because too many files have changed in this diff Show More