Compare commits
228
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2e60af7cc0 | ||
|
|
a7519c9e95 | ||
|
|
3ba312116b | ||
|
|
e6ab3ddb7d | ||
|
|
8ed0fec364 | ||
|
|
ddfdbd75b8 | ||
|
|
00e21af5bb | ||
|
|
51a17a7a0f | ||
|
|
fa58672f09 | ||
|
|
4f7f5023df | ||
|
|
4838a9690e | ||
|
|
edcbfb52eb | ||
|
|
5af8bb7c8e | ||
|
|
3fa835d74c | ||
|
|
035ff3e1ea | ||
|
|
2c54237fe5 | ||
|
|
00c61204a4 | ||
|
|
284aa3a444 | ||
|
|
f0b7a27fd4 | ||
|
|
a781eea10e | ||
|
|
8e42e5bdba | ||
|
|
ad4a9eeaa5 | ||
|
|
190e6b3958 | ||
|
|
8a33223483 | ||
|
|
0e4eab1569 | ||
|
|
9d6e27c85c | ||
|
|
9720f8ca16 | ||
|
|
5b3dccc1f7 | ||
|
|
e0df014acf | ||
|
|
de3d433ead | ||
|
|
3407db3dd6 | ||
|
|
b10a40ff8d | ||
|
|
ec22623f1c | ||
|
|
7e8fb16507 | ||
|
|
a634d7c361 | ||
|
|
aae77a7983 | ||
|
|
3f6f34e7e1 | ||
|
|
eff1541ba3 | ||
|
|
e7e06c89e1 | ||
|
|
a41d5b1609 | ||
|
|
edbea633f3 | ||
|
|
950af5375c | ||
|
|
c6d2e32f05 | ||
|
|
3796ce4d86 | ||
|
|
ffb67f4014 | ||
|
|
d479686804 | ||
|
|
1387f47a79 | ||
|
|
65784896e1 | ||
|
|
e692e7c119 | ||
|
|
23d4628d88 | ||
|
|
38c335c339 | ||
|
|
e69d1b5a82 | ||
|
|
6695b918ea | ||
|
|
2b9072417b | ||
|
|
6cf2224146 | ||
|
|
a1f74729ab | ||
|
|
71443d1c9a | ||
|
|
a83f5deaac | ||
|
|
234e778e8f | ||
|
|
0bdeaeb4e2 | ||
|
|
cc37713a66 | ||
|
|
6129de31f0 | ||
|
|
0908f86714 | ||
|
|
31ed79fe43 | ||
|
|
1af2ad12bf | ||
|
|
44db6d9e44 | ||
|
|
6e662fe4d6 | ||
|
|
067ff4f8ed | ||
|
|
91cf3d4def | ||
|
|
1eb846a93a | ||
|
|
56661afc05 | ||
|
|
655971208f | ||
|
|
d3ab2d3fbc | ||
|
|
65aca6607e | ||
|
|
e44eb39046 | ||
|
|
ab7d2a4bcc | ||
|
|
87c744b88b | ||
|
|
dfc4b1564f | ||
|
|
db6e99f885 | ||
|
|
35681e3adf | ||
|
|
a5ca531aac | ||
|
|
2daf895d00 | ||
|
|
1041445a22 | ||
|
|
f712bc9294 | ||
|
|
2d174d0b14 | ||
|
|
dd54f6938e | ||
|
|
6e0e74a7d9 | ||
|
|
6a90696820 | ||
|
|
f9bf403fc0 | ||
|
|
0c13fb7ae4 | ||
|
|
9a113bdb44 | ||
|
|
69ef461e6d | ||
|
|
4abcf3215f | ||
|
|
4b607d6484 | ||
|
|
fe8ba57c94 | ||
|
|
de191107a9 | ||
|
|
77b8b278ea | ||
|
|
4758447370 | ||
|
|
77909577e4 | ||
|
|
1a835a2e1b | ||
|
|
8d0330675a | ||
|
|
95a9d7a229 | ||
|
|
2fed46e222 | ||
|
|
9ad070871a | ||
|
|
b95fb48a16 | ||
|
|
29462005b7 | ||
|
|
4de05629ee | ||
|
|
2b62411a78 | ||
|
|
6fa4c7e138 | ||
|
|
ece38a6dbf | ||
|
|
a592488f3e | ||
|
|
191675cc79 | ||
|
|
df2e5bf39f | ||
|
|
ac29faf3bb | ||
|
|
94eabf6220 | ||
|
|
40bc0cbd48 | ||
|
|
b55e9df70a | ||
|
|
986d2cc42a | ||
|
|
0b8bfd9ed8 | ||
|
|
eff0c610e2 | ||
|
|
ca97e67511 | ||
|
|
47c2dce26d | ||
|
|
619163d40e | ||
|
|
b11c13fb9f | ||
|
|
a5435b7d8c | ||
|
|
b5fb829468 | ||
|
|
43fceaf3a4 | ||
|
|
8cb8395a24 | ||
|
|
2a2be51b8f | ||
|
|
5a5d65134e | ||
|
|
0a96f4e145 | ||
|
|
ba21713329 | ||
|
|
32ef925a79 | ||
|
|
c62c778c88 | ||
|
|
2f0a6fdb67 | ||
|
|
70ec13e10b | ||
|
|
3693e3600c | ||
|
|
69debc6777 | ||
|
|
84d7488061 | ||
|
|
fbb7c84409 | ||
|
|
a7379c88f4 | ||
|
|
cc8977b83d | ||
|
|
50380bc6c5 | ||
|
|
92074f0d3c | ||
|
|
1e889c4d07 | ||
|
|
617a09d89a | ||
|
|
2af409f54d | ||
|
|
6d3766e913 | ||
|
|
9b130f099f | ||
|
|
20414e6ef4 | ||
|
|
78645169bf | ||
|
|
a276e7e379 | ||
|
|
1dfde64ac2 | ||
|
|
1fa27f2d19 | ||
|
|
2822006d01 | ||
|
|
288e63f0d8 | ||
|
|
66c9187c95 | ||
|
|
cbf8687e3d | ||
|
|
c9a80caff5 | ||
|
|
f9857235fc | ||
|
|
c595a276a0 | ||
|
|
b582cd230e | ||
|
|
ad6c04489c | ||
|
|
ec7e59eda1 | ||
|
|
d929323e93 | ||
|
|
5a96b283f6 | ||
|
|
d393e4a019 | ||
|
|
9700e46e47 | ||
|
|
036c0034c3 | ||
|
|
f5067b058c | ||
|
|
0d9b247da1 | ||
|
|
a2b75e0d7a | ||
|
|
c9165a565b | ||
|
|
49d8b96768 | ||
|
|
5ad6eb937b | ||
|
|
f66e023ea8 | ||
|
|
72f1538ac2 | ||
|
|
4e24095d8b | ||
|
|
1473eabc7c | ||
|
|
11fd888ed8 | ||
|
|
8c78588ee1 | ||
|
|
c74e212494 | ||
|
|
13f96cdcc9 | ||
|
|
86e32035d7 | ||
|
|
80274596df | ||
|
|
2cc5e776b3 | ||
|
|
57a3b0fd1e | ||
|
|
9414874e1d | ||
|
|
9e46820c57 | ||
|
|
3020990121 | ||
|
|
27219e0f58 | ||
|
|
098441f5fb | ||
|
|
a07ca86207 | ||
|
|
e4e3760b3d | ||
|
|
811147d08e | ||
|
|
a563cfd0f2 | ||
|
|
92f7445bb9 | ||
|
|
a72d858034 | ||
|
|
39d45e9e0a | ||
|
|
4fae9039c1 | ||
|
|
124db3da8e | ||
|
|
4bf4091ef7 | ||
|
|
b7fa1d4f02 | ||
|
|
f1c2afacc4 | ||
|
|
8aed0e75df | ||
|
|
cf2619613d | ||
|
|
2a9d39f201 | ||
|
|
ae0b8eb3b3 | ||
|
|
63081c94a1 | ||
|
|
c39926dd72 | ||
|
|
4683e7e9c9 | ||
|
|
dc9163f801 | ||
|
|
42cc699263 | ||
|
|
37457fcb33 | ||
|
|
441dc41715 | ||
|
|
811f156ad1 | ||
|
|
2a0e9d31e1 | ||
|
|
c473cd7213 | ||
|
|
1af8aacd1d | ||
|
|
5eb9acd8b6 | ||
|
|
6bc9eb950f | ||
|
|
593c884f14 | ||
|
|
9d20de068c | ||
|
|
96c2e4d3ab | ||
|
|
165d2ea978 | ||
|
|
0702272097 | ||
|
|
965c8ccfd2 | ||
|
|
b20a49b018 |
+1
-3
@@ -1,6 +1,4 @@
|
|||||||
Makefile
|
Makefile
|
||||||
INSTALL
|
|
||||||
SimGear.spec
|
|
||||||
*.o
|
*.o
|
||||||
lib*.a
|
lib*.a
|
||||||
.*.swp
|
.*.swp
|
||||||
@@ -12,5 +10,5 @@ CPackSourceConfig.cmake
|
|||||||
cmake_uninstall.cmake
|
cmake_uninstall.cmake
|
||||||
CTestTestfile.cmake
|
CTestTestfile.cmake
|
||||||
install_manifest.txt
|
install_manifest.txt
|
||||||
build
|
build*
|
||||||
Build
|
Build
|
||||||
|
|||||||
+63
-40
@@ -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)
|
||||||
@@ -110,13 +110,10 @@ 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 "headless mode")
|
message(STATUS "SimGear mode: HEADLESS")
|
||||||
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)
|
||||||
@@ -124,31 +121,44 @@ 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 "libsvn found, enabling in SimGear")
|
message(STATUS "Subversion client support: ENABLED")
|
||||||
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()
|
||||||
message(STATUS "Missing libsvn, unable to enable SVN in SimGear")
|
# Oops. ENABLE_LIBSVN is ON, but svn is still missing.
|
||||||
endif(LIBSVN_FOUND)
|
# Provide clearly visible warning/hint, so builders know what else they should install (or disable).
|
||||||
|
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)
|
||||||
@@ -156,6 +166,8 @@ 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})
|
||||||
@@ -172,13 +184,10 @@ endif(HAVE_UNISTD_H)
|
|||||||
|
|
||||||
set(RT_LIBRARY "")
|
set(RT_LIBRARY "")
|
||||||
if(HAVE_CLOCK_GETTIME)
|
if(HAVE_CLOCK_GETTIME)
|
||||||
check_function_exists(clock_gettime CLOCK_GETTIME_IN_LIBC)
|
check_library_exists(rt clock_gettime "" HAVE_RT)
|
||||||
if(NOT CLOCK_GETTIME_IN_LIBC)
|
if(HAVE_RT)
|
||||||
check_library_exists(rt clock_gettime "" HAVE_RT)
|
set(RT_LIBRARY rt)
|
||||||
if(HAVE_RT)
|
endif(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")
|
||||||
@@ -193,7 +202,8 @@ check_cxx_source_compiles(
|
|||||||
HAVE_ISNAN)
|
HAVE_ISNAN)
|
||||||
|
|
||||||
if(CMAKE_COMPILER_IS_GNUCXX)
|
if(CMAKE_COMPILER_IS_GNUCXX)
|
||||||
set(WARNING_FLAGS -Wall)
|
set(WARNING_FLAGS_CXX "-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
|
||||||
@@ -203,8 +213,17 @@ 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)
|
||||||
@@ -221,22 +240,19 @@ if(WIN32)
|
|||||||
set( RT_LIBRARY "winmm" )
|
set( RT_LIBRARY "winmm" )
|
||||||
endif(WIN32)
|
endif(WIN32)
|
||||||
|
|
||||||
if (${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang")
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${WARNING_FLAGS_C} ${MSVC_FLAGS}")
|
||||||
set (WARNING_FLAGS "-Wall -Wno-overloaded-virtual")
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${WARNING_FLAGS_CXX} ${MSVC_FLAGS} ${BOOST_CXX_FLAGS}")
|
||||||
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
|
||||||
@@ -245,11 +261,19 @@ configure_file (
|
|||||||
"${PROJECT_BINARY_DIR}/simgear/simgear_config.h"
|
"${PROJECT_BINARY_DIR}/simgear/simgear_config.h"
|
||||||
)
|
)
|
||||||
|
|
||||||
if(ENABLE_TESTS)
|
configure_file (
|
||||||
# enable CTest / make test target
|
"${PROJECT_SOURCE_DIR}/simgear/xml/expat_config_cmake.in"
|
||||||
|
"${PROJECT_BINARY_DIR}/simgear/xml/expat_config.h"
|
||||||
|
)
|
||||||
|
|
||||||
include (Dart)
|
if(ENABLE_TESTS)
|
||||||
enable_testing()
|
# enable CTest / make test target
|
||||||
|
message(STATUS "Tests: ENABLED")
|
||||||
|
|
||||||
|
include (Dart)
|
||||||
|
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/)
|
||||||
@@ -264,4 +288,3 @@ 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
@@ -34,18 +34,6 @@
|
|||||||
# 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
|
||||||
@@ -59,9 +47,21 @@ 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
|
||||||
|
)
|
||||||
|
|
||||||
SET(ALUT_FOUND "NO")
|
include(FindPackageHandleStandardArgs)
|
||||||
IF(ALUT_LIBRARY AND ALUT_INCLUDE_DIR)
|
FIND_PACKAGE_HANDLE_STANDARD_ARGS(ALUT DEFAULT_MSG ALUT_LIBRARY ALUT_INCLUDE_DIR)
|
||||||
SET(ALUT_FOUND "YES")
|
|
||||||
ENDIF(ALUT_LIBRARY AND ALUT_INCLUDE_DIR)
|
MARK_AS_ADVANCED(ALUT_LIBRARY ALUT_INCLUDE_DIR)
|
||||||
|
|
||||||
|
|||||||
@@ -16,14 +16,18 @@ 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{PLIBDIR}
|
HINTS $ENV{LIBSVN_DIR} ${CMAKE_INSTALL_PREFIX}
|
||||||
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}})
|
||||||
@@ -49,13 +53,14 @@ 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}
|
$ENV{LIBSVN_DIR} ${CMAKE_INSTALL_PREFIX}
|
||||||
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,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.
|
||||||
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
51 Franklin St, Fifth Floor, Boston, MA 02110-1301, 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, 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.
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,57 @@
|
|||||||
|
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 +1,15 @@
|
|||||||
[ Nothing here at this time. ]
|
SimGear - Simulator Construction Tools
|
||||||
|
======================================
|
||||||
|
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
@@ -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 FlightGear 2.6.0 requires at least version 3.0.0.
|
Notice that this version of SimGear/FlightGear requires at least OSG 3.0.0.
|
||||||
|
|
||||||
You can get the latest version of OSG from:
|
You can get the latest version of OSG from:
|
||||||
|
|
||||||
|
|||||||
+161
@@ -0,0 +1,161 @@
|
|||||||
|
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 +0,0 @@
|
|||||||
03/25/2001 - Resolve location of Sky dome implimentation documentation.
|
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
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.)
|
||||||
|
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
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!
|
||||||
|
|
||||||
@@ -0,0 +1,66 @@
|
|||||||
|
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
|
||||||
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
The handmade VS2010 project files have been replaced by the Cmake build system.
|
|
||||||
Please use Cmake to build FlightGear with Visual Studio 2010.
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
*.user
|
|
||||||
Win32
|
|
||||||
x64
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,3 +1,2 @@
|
|||||||
simgear_config.h
|
simgear_config.h
|
||||||
simgear_config.h.*
|
|
||||||
version.h
|
version.h
|
||||||
|
|||||||
+9
-19
@@ -11,7 +11,6 @@ foreach( mylibfolder
|
|||||||
misc
|
misc
|
||||||
nasal
|
nasal
|
||||||
props
|
props
|
||||||
route
|
|
||||||
serial
|
serial
|
||||||
structure
|
structure
|
||||||
threads
|
threads
|
||||||
@@ -40,13 +39,12 @@ 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 "building shared library")
|
message(STATUS "Library building mode: SHARED LIBRARIES")
|
||||||
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}")
|
||||||
@@ -59,19 +57,13 @@ 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}")
|
||||||
@@ -87,12 +79,10 @@ if(SIMGEAR_SHARED)
|
|||||||
${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)
|
||||||
|
|
||||||
|
|||||||
@@ -29,6 +29,7 @@
|
|||||||
|
|
||||||
#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
|
||||||
@@ -79,6 +80,8 @@ 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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -22,8 +22,11 @@ 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
|
||||||
@@ -37,6 +40,7 @@ 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
|
||||||
@@ -44,24 +48,29 @@ set(HLA_SOURCES
|
|||||||
HLAOMTXmlVisitor.cxx
|
HLAOMTXmlVisitor.cxx
|
||||||
HLAPropertyDataElement.cxx
|
HLAPropertyDataElement.cxx
|
||||||
HLARawDataElement.cxx
|
HLARawDataElement.cxx
|
||||||
HLAVariantDataElement.cxx
|
HLAVariantRecordDataElement.cxx
|
||||||
HLAVariantDataType.cxx
|
HLAVariantRecordDataType.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}" "")
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
// Copyright (C) 2009 - 2012 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,6 +15,12 @@
|
|||||||
// 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>
|
||||||
@@ -99,6 +105,7 @@ HLAArrayDataElement::HLAArrayDataElement(const HLAArrayDataType* dataType) :
|
|||||||
|
|
||||||
HLAArrayDataElement::~HLAArrayDataElement()
|
HLAArrayDataElement::~HLAArrayDataElement()
|
||||||
{
|
{
|
||||||
|
clearStamp();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
@@ -110,6 +117,7 @@ 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;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -171,7 +179,12 @@ 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
|
||||||
@@ -186,12 +199,27 @@ 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;
|
||||||
return _dataElementFactory->createElement(*this, index);
|
HLADataElement* dataElement = _dataElementFactory->createElement(*this, index);
|
||||||
|
if (!dataElement)
|
||||||
|
return 0;
|
||||||
|
dataElement->attachStamp(*this);
|
||||||
|
return dataElement;
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////
|
||||||
@@ -203,6 +231,7 @@ HLAVariantArrayDataElement::HLAVariantArrayDataElement() :
|
|||||||
|
|
||||||
HLAVariantArrayDataElement::~HLAVariantArrayDataElement()
|
HLAVariantArrayDataElement::~HLAVariantArrayDataElement()
|
||||||
{
|
{
|
||||||
|
clearStamp();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
@@ -213,8 +242,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 HLAVariantDataType* variantDataType = arrayDataType->getElementDataType()->toVariantDataType();
|
const HLAVariantRecordDataType* variantRecordDataType = arrayDataType->getElementDataType()->toVariantRecordDataType();
|
||||||
if (!variantDataType) {
|
if (!variantRecordDataType) {
|
||||||
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;
|
||||||
}
|
}
|
||||||
@@ -231,13 +260,14 @@ 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)
|
||||||
{
|
{
|
||||||
HLAVariantDataElement* dataElement = getElement(i);
|
HLAVariantRecordDataElement* dataElement = getElement(i);
|
||||||
if (!dataElement)
|
if (!dataElement)
|
||||||
return false;
|
return false;
|
||||||
return dataElement->decode(stream);
|
return dataElement->decode(stream);
|
||||||
@@ -258,7 +288,7 @@ HLAVariantArrayDataElement::encodeElement(HLAEncodeStream& stream, unsigned i) c
|
|||||||
return dataElement->encode(stream);
|
return dataElement->encode(stream);
|
||||||
}
|
}
|
||||||
|
|
||||||
const HLAVariantDataElement*
|
const HLAVariantRecordDataElement*
|
||||||
HLAVariantArrayDataElement::getElement(unsigned index) const
|
HLAVariantArrayDataElement::getElement(unsigned index) const
|
||||||
{
|
{
|
||||||
if (_elementVector.size() <= index)
|
if (_elementVector.size() <= index)
|
||||||
@@ -266,7 +296,7 @@ HLAVariantArrayDataElement::getElement(unsigned index) const
|
|||||||
return _elementVector[index].get();
|
return _elementVector[index].get();
|
||||||
}
|
}
|
||||||
|
|
||||||
HLAVariantDataElement*
|
HLAVariantRecordDataElement*
|
||||||
HLAVariantArrayDataElement::getElement(unsigned index)
|
HLAVariantArrayDataElement::getElement(unsigned index)
|
||||||
{
|
{
|
||||||
if (_elementVector.size() <= index)
|
if (_elementVector.size() <= index)
|
||||||
@@ -274,7 +304,7 @@ HLAVariantArrayDataElement::getElement(unsigned index)
|
|||||||
return _elementVector[index].get();
|
return _elementVector[index].get();
|
||||||
}
|
}
|
||||||
|
|
||||||
HLAVariantDataElement*
|
HLAVariantRecordDataElement*
|
||||||
HLAVariantArrayDataElement::getOrCreateElement(unsigned index)
|
HLAVariantArrayDataElement::getOrCreateElement(unsigned index)
|
||||||
{
|
{
|
||||||
if (_elementVector.size() <= index)
|
if (_elementVector.size() <= index)
|
||||||
@@ -284,7 +314,7 @@ HLAVariantArrayDataElement::getOrCreateElement(unsigned index)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
HLAVariantArrayDataElement::setElement(unsigned index, HLAVariantDataElement* value)
|
HLAVariantArrayDataElement::setElement(unsigned index, HLAVariantRecordDataElement* value)
|
||||||
{
|
{
|
||||||
unsigned oldSize = _elementVector.size();
|
unsigned oldSize = _elementVector.size();
|
||||||
if (oldSize <= index) {
|
if (oldSize <= index) {
|
||||||
@@ -292,7 +322,12 @@ HLAVariantArrayDataElement::setElement(unsigned index, HLAVariantDataElement* va
|
|||||||
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
|
||||||
@@ -307,7 +342,18 @@ HLAVariantArrayDataElement::getAlternativeDataElementFactory()
|
|||||||
return _alternativeDataElementFactory.get();
|
return _alternativeDataElementFactory.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
HLAVariantDataElement*
|
void
|
||||||
|
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();
|
||||||
@@ -316,12 +362,13 @@ HLAVariantArrayDataElement::newElement()
|
|||||||
const HLADataType* elementDataType = arrayDataType->getElementDataType();
|
const HLADataType* elementDataType = arrayDataType->getElementDataType();
|
||||||
if (!elementDataType)
|
if (!elementDataType)
|
||||||
return 0;
|
return 0;
|
||||||
const HLAVariantDataType* variantDataType = elementDataType->toVariantDataType();
|
const HLAVariantRecordDataType* variantRecordDataType = elementDataType->toVariantRecordDataType();
|
||||||
if (!variantDataType)
|
if (!variantRecordDataType)
|
||||||
return 0;
|
return 0;
|
||||||
HLAVariantDataElement* variantDataElement = new HLAVariantDataElement(variantDataType);
|
HLAVariantRecordDataElement* variantRecordDataElement = new HLAVariantRecordDataElement(variantRecordDataType);
|
||||||
variantDataElement->setDataElementFactory(_alternativeDataElementFactory.get());
|
variantRecordDataElement->setDataElementFactory(_alternativeDataElementFactory.get());
|
||||||
return variantDataElement;
|
variantRecordDataElement->attachStamp(*this);
|
||||||
|
return variantRecordDataElement;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
// Copyright (C) 2009 - 2012 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 "HLAVariantDataElement.hxx"
|
#include "HLAVariantRecordDataElement.hxx"
|
||||||
#include "HLADataTypeVisitor.hxx"
|
#include "HLADataTypeVisitor.hxx"
|
||||||
|
|
||||||
namespace simgear {
|
namespace simgear {
|
||||||
@@ -78,6 +78,9 @@ 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);
|
||||||
|
|
||||||
@@ -102,20 +105,23 @@ 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 HLAVariantDataElement* getElement(unsigned index) const;
|
const HLAVariantRecordDataElement* getElement(unsigned index) const;
|
||||||
HLAVariantDataElement* getElement(unsigned index);
|
HLAVariantRecordDataElement* getElement(unsigned index);
|
||||||
HLAVariantDataElement* getOrCreateElement(unsigned index);
|
HLAVariantRecordDataElement* getOrCreateElement(unsigned index);
|
||||||
void setElement(unsigned index, HLAVariantDataElement* value);
|
void setElement(unsigned index, HLAVariantRecordDataElement* value);
|
||||||
|
|
||||||
typedef HLAVariantDataElement::DataElementFactory AlternativeDataElementFactory;
|
typedef HLAVariantRecordDataElement::DataElementFactory AlternativeDataElementFactory;
|
||||||
|
|
||||||
void setAlternativeDataElementFactory(AlternativeDataElementFactory* alternativeDataElementFactory);
|
void setAlternativeDataElementFactory(AlternativeDataElementFactory* alternativeDataElementFactory);
|
||||||
AlternativeDataElementFactory* getAlternativeDataElementFactory();
|
AlternativeDataElementFactory* getAlternativeDataElementFactory();
|
||||||
|
|
||||||
private:
|
protected:
|
||||||
HLAVariantDataElement* newElement();
|
virtual void _setStamp(Stamp* stamp);
|
||||||
|
|
||||||
typedef std::vector<SGSharedPtr<HLAVariantDataElement> > ElementVector;
|
private:
|
||||||
|
HLAVariantRecordDataElement* newElement();
|
||||||
|
|
||||||
|
typedef std::vector<SGSharedPtr<HLAVariantRecordDataElement> > ElementVector;
|
||||||
ElementVector _elementVector;
|
ElementVector _elementVector;
|
||||||
|
|
||||||
SGSharedPtr<AlternativeDataElementFactory> _alternativeDataElementFactory;
|
SGSharedPtr<AlternativeDataElementFactory> _alternativeDataElementFactory;
|
||||||
@@ -133,7 +139,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; }
|
{ _value = value; setDirty(true); }
|
||||||
|
|
||||||
virtual bool setNumElements(unsigned count)
|
virtual bool setNumElements(unsigned count)
|
||||||
{
|
{
|
||||||
@@ -210,11 +216,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; }
|
{ _value = value; setDirty(true); }
|
||||||
|
|
||||||
virtual bool setNumElements(unsigned count)
|
virtual bool setNumElements(unsigned count)
|
||||||
{
|
{
|
||||||
for (unsigned i = 2; i < count; ++i)
|
for (unsigned i = count; i < 2; ++i)
|
||||||
_value[i] = 0;
|
_value[i] = 0;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -302,11 +308,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; }
|
{ _value = value; setDirty(true); }
|
||||||
|
|
||||||
virtual bool setNumElements(unsigned count)
|
virtual bool setNumElements(unsigned count)
|
||||||
{
|
{
|
||||||
for (unsigned i = 3; i < count; ++i)
|
for (unsigned i = count; i < 3; ++i)
|
||||||
_value[i] = 0;
|
_value[i] = 0;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -394,11 +400,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; }
|
{ _value = value; setDirty(true); }
|
||||||
|
|
||||||
virtual bool setNumElements(unsigned count)
|
virtual bool setNumElements(unsigned count)
|
||||||
{
|
{
|
||||||
for (unsigned i = 4; i < count; ++i)
|
for (unsigned i = count; i < 4; ++i)
|
||||||
_value[i] = 0;
|
_value[i] = 0;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -486,11 +492,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; }
|
{ _value = value; setDirty(true); }
|
||||||
|
|
||||||
virtual bool setNumElements(unsigned count)
|
virtual bool setNumElements(unsigned count)
|
||||||
{
|
{
|
||||||
for (unsigned i = 4; i < count; ++i)
|
for (unsigned i = count; i < 4; ++i)
|
||||||
_value[i] = 0;
|
_value[i] = 0;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright (C) 2009 - 2011 Mathias Froehlich - Mathias.Froehlich@web.de
|
// Copyright (C) 2009 - 2012 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,6 +15,12 @@
|
|||||||
// 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"
|
||||||
@@ -44,12 +50,16 @@ 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;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -65,6 +75,15 @@ 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) :
|
||||||
@@ -160,13 +179,20 @@ HLAVariableArrayDataType::encode(HLAEncodeStream& stream, const HLAAbstractArray
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
HLAVariableArrayDataType::setSizeDataType(const HLADataType* sizeDataType)
|
HLAVariableArrayDataType::setSizeDataType(const HLABasicDataType* 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
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright (C) 2009 - 2011 Mathias Froehlich - Mathias.Froehlich@web.de
|
// Copyright (C) 2009 - 2012 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,6 +35,8 @@ 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;
|
||||||
|
|
||||||
@@ -50,6 +52,9 @@ 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;
|
||||||
@@ -85,12 +90,15 @@ 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 HLADataType* sizeDataType);
|
void setSizeDataType(const HLABasicDataType* sizeDataType);
|
||||||
const HLADataType* getSizeDataType() const
|
const HLABasicDataType* getSizeDataType() const
|
||||||
{ return _sizeDataType.get(); }
|
{ return _sizeDataType.get(); }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual void _recomputeAlignmentImplementation();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
SGSharedPtr<const HLADataType> _sizeDataType;
|
SGSharedPtr<const HLABasicDataType> _sizeDataType;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace simgear
|
} // namespace simgear
|
||||||
|
|||||||
@@ -15,6 +15,12 @@
|
|||||||
// 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"
|
||||||
@@ -125,6 +131,7 @@ 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,4 +1,4 @@
|
|||||||
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
// Copyright (C) 2009 - 2012 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,6 +15,12 @@
|
|||||||
// 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,4 +1,4 @@
|
|||||||
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
// Copyright (C) 2009 - 2012 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,6 +15,12 @@
|
|||||||
// 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>
|
||||||
@@ -131,6 +137,51 @@ 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)
|
||||||
{
|
{
|
||||||
@@ -152,11 +203,11 @@ HLADataElement::toString(const Path& path)
|
|||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
HLADataElement::AttributePathPair
|
HLADataElement::StringPathPair
|
||||||
HLADataElement::toAttributePathPair(const std::string& s)
|
HLADataElement::toStringPathPair(const std::string& s)
|
||||||
{
|
{
|
||||||
Path path;
|
Path path;
|
||||||
// Skip the initial attribute name if given
|
// Skip the initial attribute/parameter 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()) {
|
||||||
@@ -171,7 +222,7 @@ HLADataElement::toAttributePathPair(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 AttributePathPair();
|
return StringPathPair();
|
||||||
}
|
}
|
||||||
index *= 10;
|
index *= 10;
|
||||||
index += v;
|
index += v;
|
||||||
@@ -186,7 +237,7 @@ HLADataElement::toAttributePathPair(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 AttributePathPair();
|
return StringPathPair();
|
||||||
}
|
}
|
||||||
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));
|
||||||
@@ -195,7 +246,13 @@ HLADataElement::toAttributePathPair(const std::string& s)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return AttributePathPair(attribute, path);
|
return StringPathPair(attribute, path);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
HLADataElement::_setStamp(HLADataElement::Stamp* stamp)
|
||||||
|
{
|
||||||
|
_stamp = stamp;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -46,34 +46,30 @@ 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;
|
||||||
|
|
||||||
// Container for the timestamp the originating attribute was last updated for
|
/// Returns the time stamp if this data element.
|
||||||
// class TimeStamp : public SGReferenced {
|
/// Do not access this getter if the getTimeStampValid() method returns false.
|
||||||
// public:
|
const SGTimeStamp& getTimeStamp() const
|
||||||
// const SGTimeStamp& getTimeStamp() const
|
{ return _stamp->getTimeStamp(); }
|
||||||
// { return _timeStamp; }
|
void setTimeStamp(const SGTimeStamp& timeStamp);
|
||||||
// void setTimeStamp(const SGTimeStamp& timeStamp)
|
|
||||||
// { _timeStamp = timeStamp; }
|
|
||||||
// private:
|
|
||||||
// SGTimeStamp _timeStamp;
|
|
||||||
// };
|
|
||||||
|
|
||||||
// const TimeStamp* getTimeStamp() const
|
bool getTimeStampValid() const
|
||||||
// { return _timeStamp.get(); }
|
{ if (!_stamp.valid()) return false; return _stamp->getTimeStampValid(); }
|
||||||
// void setTimeStamp(const TimeStamp* timeStamp)
|
void setTimeStampValid(bool timeStampValid);
|
||||||
// { _timeStamp = timeStamp; }
|
|
||||||
|
|
||||||
// struct ChangeCount : public SGReferenced {
|
/// Convenience function that gives the time difference in seconds to a given timestamp
|
||||||
// ChangeCount() : _value(0) {}
|
/// This function returns 0 if the timestamp is not valid.
|
||||||
// unsigned _value;
|
double getTimeDifference(const SGTimeStamp& timeStamp) const;
|
||||||
// };
|
|
||||||
// SGSharedPtr<ChangeCount> _changeCount;
|
/// Dirty tracking of the attribute/parameter that this data element belongs to
|
||||||
// unsigned getChangeCount() const
|
bool getDirty() const
|
||||||
// {
|
{ if (!_stamp.valid()) return true; return _stamp->getDirty(); }
|
||||||
// // If we don't have return allways the same
|
void setDirty(bool dirty)
|
||||||
// if (!_changeCount.valid())
|
{ if (!_stamp.valid()) return; _stamp->setDirty(dirty); }
|
||||||
// return 0;
|
|
||||||
// return _changeCount->_value;
|
/// Stamp handling
|
||||||
// }
|
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
|
||||||
@@ -150,18 +146,55 @@ public:
|
|||||||
SGSharedPtr<Data> _data;
|
SGSharedPtr<Data> _data;
|
||||||
};
|
};
|
||||||
typedef std::list<PathElement> Path;
|
typedef std::list<PathElement> Path;
|
||||||
typedef std::pair<std::string, Path> AttributePathPair;
|
typedef std::pair<std::string, Path> StringPathPair;
|
||||||
|
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 AttributePathPair& path)
|
static std::string toString(const StringPathPair& path)
|
||||||
{ return path.first + toString(path.second); }
|
{ return path.first + toString(path.second); }
|
||||||
static AttributePathPair toAttributePathPair(const std::string& s);
|
static StringPathPair toStringPathPair(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 toAttributePathPair(s).second; }
|
{ return toStringPathPair(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<const TimeStamp> _timeStamp;
|
SGSharedPtr<Stamp> _stamp;
|
||||||
};
|
};
|
||||||
|
|
||||||
class HLADataElementProvider {
|
class HLADataElementProvider {
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright (C) 2009 - 2011 Mathias Froehlich - Mathias.Froehlich@web.de
|
// Copyright (C) 2009 - 2012 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 HLAAbstractVariantDataElement;
|
class HLAAbstractVariantRecordDataElement;
|
||||||
|
|
||||||
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(HLAAbstractVariantDataElement&);
|
virtual void apply(HLAAbstractVariantRecordDataElement&);
|
||||||
};
|
};
|
||||||
|
|
||||||
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 HLAAbstractVariantDataElement&);
|
virtual void apply(const HLAAbstractVariantRecordDataElement&);
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+23
-21
@@ -1,4 +1,4 @@
|
|||||||
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
// Copyright (C) 2009 - 2012 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,6 +15,12 @@
|
|||||||
// 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"
|
||||||
@@ -39,12 +45,6 @@ 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,12 +69,25 @@ HLADataType::toFixedRecordDataType() const
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
const HLAVariantDataType*
|
const HLAVariantRecordDataType*
|
||||||
HLADataType::toVariantDataType() const
|
HLADataType::toVariantRecordDataType() 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)
|
||||||
{
|
{
|
||||||
@@ -85,20 +98,9 @@ HLADataType::setAlignment(unsigned alignment)
|
|||||||
_alignment = alignment;
|
_alignment = alignment;
|
||||||
}
|
}
|
||||||
|
|
||||||
HLADataTypeReference::~HLADataTypeReference()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
HLADataTypeReference::accept(HLADataTypeVisitor& visitor) const
|
HLADataType::_recomputeAlignmentImplementation()
|
||||||
{
|
{
|
||||||
visitor.apply(*this);
|
|
||||||
}
|
|
||||||
|
|
||||||
const HLADataTypeReference*
|
|
||||||
HLADataTypeReference::toDataTypeReference() const
|
|
||||||
{
|
|
||||||
return this;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+14
-31
@@ -1,4 +1,4 @@
|
|||||||
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
// Copyright (C) 2009 - 2012 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,19 +27,11 @@ 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 HLAVariantDataType;
|
class HLAVariantRecordDataType;
|
||||||
|
|
||||||
enum HLAUpdateType {
|
|
||||||
HLAStaticUpdate,
|
|
||||||
HLAPeriodicUpdate,
|
|
||||||
HLAConditionalUpdate,
|
|
||||||
HLAUndefinedUpdate
|
|
||||||
};
|
|
||||||
|
|
||||||
class HLADataType : public SGWeakReferenced {
|
class HLADataType : public SGWeakReferenced {
|
||||||
public:
|
public:
|
||||||
@@ -58,42 +50,33 @@ 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;
|
||||||
virtual const HLAVariantDataType* toVariantDataType() const;
|
/// deprecated
|
||||||
|
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
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
// Copyright (C) 2009 - 2012 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,6 +15,12 @@
|
|||||||
// 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"
|
||||||
@@ -22,7 +28,7 @@
|
|||||||
#include "HLADataTypeVisitor.hxx"
|
#include "HLADataTypeVisitor.hxx"
|
||||||
#include "HLAEnumeratedDataElement.hxx"
|
#include "HLAEnumeratedDataElement.hxx"
|
||||||
#include "HLAFixedRecordDataElement.hxx"
|
#include "HLAFixedRecordDataElement.hxx"
|
||||||
#include "HLAVariantDataElement.hxx"
|
#include "HLAVariantRecordDataElement.hxx"
|
||||||
|
|
||||||
namespace simgear {
|
namespace simgear {
|
||||||
|
|
||||||
@@ -160,11 +166,11 @@ HLADataElementFactoryVisitor::apply(const HLAFixedRecordDataType& dataType)
|
|||||||
_dataElement = recordDataElement;
|
_dataElement = recordDataElement;
|
||||||
}
|
}
|
||||||
|
|
||||||
class HLADataElementFactoryVisitor::VariantDataElementFactory : public HLAVariantDataElement::DataElementFactory {
|
class HLADataElementFactoryVisitor::VariantRecordDataElementFactory : public HLAVariantRecordDataElement::DataElementFactory {
|
||||||
public:
|
public:
|
||||||
virtual HLADataElement* createElement(const HLAVariantDataElement& element, unsigned index)
|
virtual HLADataElement* createElement(const HLAVariantRecordDataElement& element, unsigned index)
|
||||||
{
|
{
|
||||||
const HLAVariantDataType* dataType = element.getDataType();
|
const HLAVariantRecordDataType* dataType = element.getDataType();
|
||||||
if (!dataType)
|
if (!dataType)
|
||||||
return 0;
|
return 0;
|
||||||
const HLADataType* alternativeDataType = element.getAlternativeDataType();
|
const HLADataType* alternativeDataType = element.getAlternativeDataType();
|
||||||
@@ -177,12 +183,12 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
void
|
void
|
||||||
HLADataElementFactoryVisitor::apply(const HLAVariantDataType& dataType)
|
HLADataElementFactoryVisitor::apply(const HLAVariantRecordDataType& dataType)
|
||||||
{
|
{
|
||||||
SGSharedPtr<HLAVariantDataElement> variantDataElement;
|
SGSharedPtr<HLAVariantRecordDataElement> variantRecordDataElement;
|
||||||
variantDataElement = new HLAVariantDataElement(&dataType);
|
variantRecordDataElement = new HLAVariantRecordDataElement(&dataType);
|
||||||
variantDataElement->setDataElementFactory(new VariantDataElementFactory);
|
variantRecordDataElement->setDataElementFactory(new VariantRecordDataElementFactory);
|
||||||
_dataElement = variantDataElement;
|
_dataElement = variantRecordDataElement;
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace simgear
|
} // namespace simgear
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
// Copyright (C) 2009 - 2012 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 "HLAVariantDataType.hxx"
|
#include "HLAVariantRecordDataType.hxx"
|
||||||
|
|
||||||
namespace simgear {
|
namespace simgear {
|
||||||
|
|
||||||
@@ -38,16 +38,6 @@ 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)
|
||||||
@@ -84,7 +74,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 HLAVariantDataType& dataType)
|
virtual void apply(const HLAVariantRecordDataType& dataType)
|
||||||
{ apply(static_cast<const HLADataType&>(dataType)); }
|
{ apply(static_cast<const HLADataType&>(dataType)); }
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -145,7 +135,7 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void apply(const HLAVariantDataType& dataType)
|
virtual void apply(const HLAVariantRecordDataType& dataType)
|
||||||
{ assert(0); }
|
{ assert(0); }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
@@ -188,7 +178,7 @@ public:
|
|||||||
dataType.getFieldDataType(i)->accept(*this);
|
dataType.getFieldDataType(i)->accept(*this);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void apply(const HLAVariantDataType& dataType) { assert(0); }
|
virtual void apply(const HLAVariantRecordDataType& dataType) { assert(0); }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
HLADecodeStream& _stream;
|
HLADecodeStream& _stream;
|
||||||
@@ -232,7 +222,7 @@ public:
|
|||||||
dataType.getFieldDataType(i)->accept(*this);
|
dataType.getFieldDataType(i)->accept(*this);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void apply(const HLAVariantDataType& dataType) { assert(0); }
|
virtual void apply(const HLAVariantRecordDataType& dataType) { assert(0); }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
HLAEncodeStream& _stream;
|
HLAEncodeStream& _stream;
|
||||||
@@ -269,7 +259,7 @@ public:
|
|||||||
HLADataTypeDecodeVisitor::apply(dataType);
|
HLADataTypeDecodeVisitor::apply(dataType);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void apply(const HLAVariantDataType& dataType)
|
virtual void apply(const HLAVariantRecordDataType& 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);
|
||||||
@@ -305,7 +295,7 @@ public:
|
|||||||
HLADataTypeEncodeVisitor::apply(dataType);
|
HLADataTypeEncodeVisitor::apply(dataType);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void apply(const HLAVariantDataType& dataType)
|
virtual void apply(const HLAVariantRecordDataType& 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);
|
||||||
@@ -386,7 +376,7 @@ public:
|
|||||||
HLADataTypeDecodeVisitor::apply(dataType);
|
HLADataTypeDecodeVisitor::apply(dataType);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void apply(const HLAVariantDataType& dataType)
|
virtual void apply(const HLAVariantRecordDataType& 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);
|
||||||
@@ -467,7 +457,7 @@ public:
|
|||||||
HLADataTypeEncodeVisitor::apply(dataType);
|
HLADataTypeEncodeVisitor::apply(dataType);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void apply(const HLAVariantDataType& dataType)
|
virtual void apply(const HLAVariantRecordDataType& 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);
|
||||||
@@ -654,14 +644,14 @@ public:
|
|||||||
|
|
||||||
virtual void apply(const HLAFixedRecordDataType& dataType);
|
virtual void apply(const HLAFixedRecordDataType& dataType);
|
||||||
|
|
||||||
virtual void apply(const HLAVariantDataType& dataType);
|
virtual void apply(const HLAVariantRecordDataType& dataType);
|
||||||
|
|
||||||
HLADataElement* getDataElement()
|
HLADataElement* getDataElement()
|
||||||
{ return _dataElement.release(); }
|
{ return _dataElement.release(); }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
class ArrayDataElementFactory;
|
class ArrayDataElementFactory;
|
||||||
class VariantDataElementFactory;
|
class VariantRecordDataElementFactory;
|
||||||
|
|
||||||
SGSharedPtr<HLADataElement> _dataElement;
|
SGSharedPtr<HLADataElement> _dataElement;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
// Copyright (C) 2009 - 2012 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,6 +15,12 @@
|
|||||||
// 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,4 +1,4 @@
|
|||||||
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
// Copyright (C) 2009 - 2012 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,6 +15,12 @@
|
|||||||
// 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>
|
||||||
@@ -176,5 +182,14 @@ 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 +1,4 @@
|
|||||||
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
// Copyright (C) 2009 - 2012 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,6 +70,9 @@ public:
|
|||||||
return _map->getDataType();
|
return _map->getDataType();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual void _recomputeAlignmentImplementation();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
class AbstractMap : public SGReferenced {
|
class AbstractMap : public SGReferenced {
|
||||||
public:
|
public:
|
||||||
|
|||||||
+334
-79
@@ -1,4 +1,4 @@
|
|||||||
// Copyright (C) 2009 - 2011 Mathias Froehlich - Mathias.Froehlich@web.de
|
// Copyright (C) 2009 - 2012 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,10 +15,21 @@
|
|||||||
// 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 "RTI13Federate.hxx"
|
#include <algorithm>
|
||||||
|
|
||||||
|
#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"
|
||||||
@@ -35,10 +46,19 @@ 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
|
||||||
@@ -58,6 +78,22 @@ 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
|
||||||
{
|
{
|
||||||
@@ -159,28 +195,9 @@ 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)
|
||||||
{
|
{
|
||||||
if (_rtiFederate.valid()) {
|
_version = version;
|
||||||
SG_LOG(SG_NETWORK, SG_WARN, "HLA: Trying to connect to already connected federate!");
|
_connectArguments = stringList;
|
||||||
return false;
|
return connect();
|
||||||
}
|
|
||||||
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
|
||||||
@@ -190,17 +207,22 @@ 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 = new RTI13Federate(_connectArguments);
|
_rtiFederate = registry->create("RTI13", _connectArguments);
|
||||||
break;
|
break;
|
||||||
case RTI1516:
|
case RTI1516:
|
||||||
SG_LOG(SG_IO, SG_ALERT, "HLA version RTI1516 not yet(!?) supported.");
|
_rtiFederate = registry->create("RTI1516", _connectArguments);
|
||||||
// _rtiFederate = new RTI1516Federate(_connectArguments);
|
|
||||||
break;
|
break;
|
||||||
case RTI1516E:
|
case RTI1516E:
|
||||||
SG_LOG(SG_IO, SG_ALERT, "HLA version RTI1516E not yet(!?) supported.");
|
_rtiFederate = registry->create("RTI1516E", _connectArguments);
|
||||||
// _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!");
|
||||||
@@ -215,7 +237,8 @@ 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;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -648,14 +671,11 @@ HLAFederate::timeAdvanceAvailable()
|
|||||||
}
|
}
|
||||||
|
|
||||||
SGTimeStamp timeStamp;
|
SGTimeStamp timeStamp;
|
||||||
if (!_rtiFederate->queryGALT(timeStamp)) {
|
if (_rtiFederate->queryGALT(timeStamp)) {
|
||||||
SG_LOG(SG_NETWORK, SG_WARN, "HLA: Could not query GALT!");
|
if (!_rtiFederate->timeAdvanceRequestAvailable(timeStamp)) {
|
||||||
return false;
|
SG_LOG(SG_NETWORK, SG_WARN, "HLA: Time advance request failed!");
|
||||||
}
|
return false;
|
||||||
|
}
|
||||||
if (!_rtiFederate->timeAdvanceRequestAvailable(timeStamp)) {
|
|
||||||
SG_LOG(SG_NETWORK, SG_WARN, "HLA: Time advance request failed!");
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return processMessages();
|
return processMessages();
|
||||||
@@ -748,11 +768,6 @@ 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;
|
||||||
@@ -767,6 +782,8 @@ 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);
|
||||||
@@ -781,72 +798,145 @@ 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->getAttributeIndex(attributeName);
|
unsigned index = hlaObjectClass->addAttribute(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;
|
||||||
}
|
}
|
||||||
|
|
||||||
SGSharedPtr<HLADataType> dataType;
|
// the attributes datatype
|
||||||
dataType = omtXmlVisitor.getAttributeDataType(objectClassName, attributeName);
|
SGSharedPtr<const HLADataType> dataType = getDataType(attribute->getDataType());
|
||||||
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))
|
||||||
subscriptions.insert(index);
|
hlaObjectClass->setAttributeSubscriptionType(index, attribute->getSubscriptionType());
|
||||||
if (publish && objectModelFactory.publishAttribute(objectClassName, attributeName, attribute->_sharing))
|
if (publish && objectModelFactory.publishAttribute(objectClassName, attributeName, attribute->_sharing))
|
||||||
publications.insert(index);
|
hlaObjectClass->setAttributePublicationType(index, attribute->getPublicationType());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (publish)
|
if (publish)
|
||||||
hlaObjectClass->publish(publications);
|
hlaObjectClass->publish();
|
||||||
if (subscribe)
|
if (subscribe)
|
||||||
hlaObjectClass->subscribe(subscriptions, true);
|
hlaObjectClass->subscribe();
|
||||||
|
|
||||||
_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;
|
||||||
}
|
}
|
||||||
|
|
||||||
HLAObjectClass*
|
const HLADataType*
|
||||||
HLAFederate::getObjectClass(const std::string& name)
|
HLAFederate::getDataType(const std::string& name) const
|
||||||
{
|
{
|
||||||
ObjectClassMap::const_iterator i = _objectClassMap.find(name);
|
DataTypeMap::const_iterator i = _dataTypeMap.find(name);
|
||||||
if (i == _objectClassMap.end())
|
if (i == _dataTypeMap.end())
|
||||||
return 0;
|
return 0;
|
||||||
return i->second.get();
|
return i->second.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
const HLAObjectClass*
|
bool
|
||||||
HLAFederate::getObjectClass(const std::string& name) const
|
HLAFederate::insertDataType(const std::string& name, const SGSharedPtr<HLADataType>& dataType)
|
||||||
{
|
{
|
||||||
ObjectClassMap::const_iterator i = _objectClassMap.find(name);
|
if (!dataType.valid())
|
||||||
if (i == _objectClassMap.end())
|
return false;
|
||||||
return 0;
|
if (_dataTypeMap.find(name) != _dataTypeMap.end()) {
|
||||||
return i->second.get();
|
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*
|
HLAInteractionClass*
|
||||||
@@ -867,6 +957,60 @@ HLAFederate::getInteractionClass(const std::string& name) const
|
|||||||
return i->second.get();
|
return i->second.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
HLAInteractionClass*
|
||||||
|
HLAFederate::createInteractionClass(const std::string& name)
|
||||||
|
{
|
||||||
|
return new HLAInteractionClass(name, this);
|
||||||
|
}
|
||||||
|
|
||||||
|
HLAObjectClass*
|
||||||
|
HLAFederate::getObjectClass(const std::string& name)
|
||||||
|
{
|
||||||
|
ObjectClassMap::const_iterator i = _objectClassMap.find(name);
|
||||||
|
if (i == _objectClassMap.end())
|
||||||
|
return 0;
|
||||||
|
return i->second.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
const HLAObjectClass*
|
||||||
|
HLAFederate::getObjectClass(const std::string& name) const
|
||||||
|
{
|
||||||
|
ObjectClassMap::const_iterator i = _objectClassMap.find(name);
|
||||||
|
if (i == _objectClassMap.end())
|
||||||
|
return 0;
|
||||||
|
return i->second.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
HLAObjectClass*
|
||||||
|
HLAFederate::createObjectClass(const std::string& name)
|
||||||
|
{
|
||||||
|
return new HLAObjectClass(name, this);
|
||||||
|
}
|
||||||
|
|
||||||
|
HLAObjectInstance*
|
||||||
|
HLAFederate::getObjectInstance(const std::string& name)
|
||||||
|
{
|
||||||
|
ObjectInstanceMap::const_iterator i = _objectInstanceMap.find(name);
|
||||||
|
if (i == _objectInstanceMap.end())
|
||||||
|
return 0;
|
||||||
|
return i->second.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
const HLAObjectInstance*
|
||||||
|
HLAFederate::getObjectInstance(const std::string& name) const
|
||||||
|
{
|
||||||
|
ObjectInstanceMap::const_iterator i = _objectInstanceMap.find(name);
|
||||||
|
if (i == _objectInstanceMap.end())
|
||||||
|
return 0;
|
||||||
|
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)
|
||||||
{
|
{
|
||||||
@@ -882,22 +1026,62 @@ HLAFederate::getDone() const
|
|||||||
bool
|
bool
|
||||||
HLAFederate::readObjectModel()
|
HLAFederate::readObjectModel()
|
||||||
{
|
{
|
||||||
/// Currently empty, but is called at the right time so that
|
// Depending on the actual version, try to find an apropriate
|
||||||
/// the object model is present when it is needed
|
// file format for the given file. The first one is always the
|
||||||
return true;
|
// version native object model file format.
|
||||||
|
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()
|
||||||
{
|
{
|
||||||
/// Currently empty, but is called at the right time
|
for (InteractionClassMap::iterator i = _interactionClassMap.begin(); i != _interactionClassMap.end(); ++i) {
|
||||||
|
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()
|
||||||
{
|
{
|
||||||
/// Currently empty, but is called at the right time
|
for (InteractionClassMap::iterator i = _interactionClassMap.begin(); i != _interactionClassMap.end(); ++i) {
|
||||||
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1009,4 +1193,75 @@ 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
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright (C) 2009 - 2011 Mathias Froehlich - Mathias.Froehlich@web.de
|
// Copyright (C) 2009 - 2012 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,6 +44,7 @@ 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;
|
||||||
@@ -161,7 +162,7 @@ public:
|
|||||||
/// a pending time advance is granted.
|
/// a pending time advance is granted.
|
||||||
bool processMessages();
|
bool processMessages();
|
||||||
|
|
||||||
/// Legacy tick call
|
/// Legacy tick call - deprecated
|
||||||
bool tick(const double& minimum, const double& maximum);
|
bool tick(const double& minimum, const double& maximum);
|
||||||
|
|
||||||
class ObjectModelFactory {
|
class ObjectModelFactory {
|
||||||
@@ -170,7 +171,7 @@ public:
|
|||||||
{ }
|
{ }
|
||||||
|
|
||||||
virtual HLAObjectClass* createObjectClass(const std::string& name, HLAFederate& federate)
|
virtual HLAObjectClass* createObjectClass(const std::string& name, HLAFederate& federate)
|
||||||
{ return new HLAObjectClass(name, federate); }
|
{ return federate.createObjectClass(name); }
|
||||||
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)
|
||||||
@@ -182,22 +183,56 @@ public:
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/// Read an omt xml file
|
/// Read an omt xml file - deprecated
|
||||||
bool readObjectModelTemplate(const std::string& objectModel,
|
bool readObjectModelTemplate(const std::string& objectModel,
|
||||||
ObjectModelFactory& objectModelFactory);
|
ObjectModelFactory& objectModelFactory);
|
||||||
|
|
||||||
/// Get the object class of a given name
|
/// Read an rti1.3 omt xml file
|
||||||
HLAObjectClass* getObjectClass(const std::string& name);
|
bool readRTI13ObjectModelTemplate(const std::string& objectModel);
|
||||||
const HLAObjectClass* getObjectClass(const std::string& name) const;
|
/// 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
|
/// Get the interaction class of a given name
|
||||||
HLAInteractionClass* getInteractionClass(const std::string& name);
|
HLAInteractionClass* getInteractionClass(const std::string& name);
|
||||||
const HLAInteractionClass* getInteractionClass(const std::string& name) const;
|
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
|
||||||
|
HLAObjectClass* getObjectClass(const std::string& name);
|
||||||
|
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
|
||||||
|
HLAObjectInstance* getObjectInstance(const std::string& name);
|
||||||
|
const HLAObjectInstance* getObjectInstance(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();
|
||||||
@@ -213,6 +248,16 @@ 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;
|
||||||
|
|
||||||
@@ -247,14 +292,27 @@ private:
|
|||||||
/// If true the exec method returns.
|
/// If true the exec method returns.
|
||||||
bool _done;
|
bool _done;
|
||||||
|
|
||||||
typedef std::map<std::string, SGSharedPtr<HLAObjectClass> > ObjectClassMap;
|
/// The Data Types by name
|
||||||
ObjectClassMap _objectClassMap;
|
typedef std::map<std::string, SGSharedPtr<HLADataType> > DataTypeMap;
|
||||||
|
DataTypeMap _dataTypeMap;
|
||||||
|
|
||||||
|
/// The Interaction Classes by name
|
||||||
typedef std::map<std::string, SGSharedPtr<HLAInteractionClass> > InteractionClassMap;
|
typedef std::map<std::string, SGSharedPtr<HLAInteractionClass> > InteractionClassMap;
|
||||||
InteractionClassMap _interactionClassMap;
|
InteractionClassMap _interactionClassMap;
|
||||||
|
|
||||||
|
/// The Object Classes by name
|
||||||
|
typedef std::map<std::string, SGSharedPtr<HLAObjectClass> > ObjectClassMap;
|
||||||
|
ObjectClassMap _objectClassMap;
|
||||||
|
|
||||||
|
/// The Object Instances by name
|
||||||
|
typedef std::map<std::string, SGSharedPtr<HLAObjectInstance> > ObjectInstanceMap;
|
||||||
|
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,4 +1,4 @@
|
|||||||
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
// Copyright (C) 2009 - 2012 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,6 +15,12 @@
|
|||||||
// 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>
|
||||||
@@ -120,6 +126,7 @@ HLAFixedRecordDataElement::HLAFixedRecordDataElement(const HLAFixedRecordDataTyp
|
|||||||
|
|
||||||
HLAFixedRecordDataElement::~HLAFixedRecordDataElement()
|
HLAFixedRecordDataElement::~HLAFixedRecordDataElement()
|
||||||
{
|
{
|
||||||
|
clearStamp();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
@@ -181,7 +188,12 @@ 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
|
||||||
@@ -190,4 +202,15 @@ 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,6 +70,9 @@ 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;
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
// Copyright (C) 2009 - 2012 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,6 +15,12 @@
|
|||||||
// 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"
|
||||||
@@ -43,6 +49,14 @@ 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
|
||||||
{
|
{
|
||||||
@@ -68,10 +82,18 @@ 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,4 +1,4 @@
|
|||||||
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
// Copyright (C) 2009 - 2012 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,6 +36,8 @@ 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;
|
||||||
|
|
||||||
@@ -67,6 +69,9 @@ 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) :
|
||||||
@@ -76,6 +81,8 @@ 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;
|
||||||
|
|||||||
@@ -0,0 +1,251 @@
|
|||||||
|
// 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
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
// Copyright (C) 2009 - 2012 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,17 +18,92 @@
|
|||||||
#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:
|
||||||
virtual ~HLAInteractionClass() {}
|
HLAInteractionClass(const std::string& name, HLAFederate* federate);
|
||||||
|
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
|
||||||
|
|||||||
+130
-140
@@ -1,4 +1,4 @@
|
|||||||
// Copyright (C) 2009 - 2011 Mathias Froehlich - Mathias.Froehlich@web.de
|
// Copyright (C) 2009 - 2012 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,6 +15,12 @@
|
|||||||
// 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>
|
||||||
@@ -27,8 +33,9 @@
|
|||||||
#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 "HLAVariantDataType.hxx"
|
#include "HLAVariantRecordDataType.hxx"
|
||||||
|
|
||||||
namespace simgear {
|
namespace simgear {
|
||||||
|
|
||||||
@@ -68,18 +75,6 @@ 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
|
||||||
{
|
{
|
||||||
@@ -107,6 +102,12 @@ 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
|
||||||
{
|
{
|
||||||
@@ -133,18 +134,6 @@ 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
|
||||||
{
|
{
|
||||||
@@ -159,6 +148,81 @@ 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
|
||||||
{
|
{
|
||||||
@@ -173,36 +237,6 @@ 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
|
||||||
{
|
{
|
||||||
@@ -217,59 +251,19 @@ HLAOMTXmlVisitor::getInteractionClass(unsigned i) const
|
|||||||
return _interactionClassList[i];
|
return _interactionClassList[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
const HLAOMTXmlVisitor::InteractionClass*
|
|
||||||
HLAOMTXmlVisitor::getInteractionClass(const std::string& name) const
|
|
||||||
{
|
|
||||||
for (InteractionClassList::const_iterator i = _interactionClassList.begin(); i != _interactionClassList.end(); ++i) {
|
|
||||||
if ((*i)->_name != name)
|
|
||||||
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>
|
SGSharedPtr<HLADataType>
|
||||||
HLAOMTXmlVisitor::getDataType(const std::string& dataTypeName, HLAOMTXmlVisitor::StringDataTypeMap& dataTypeMap) const
|
HLAOMTXmlVisitor::getDataType(const std::string& dataTypeName)
|
||||||
{
|
{
|
||||||
StringDataTypeMap::const_iterator i = dataTypeMap.find(dataTypeName);
|
StringDataTypeMap::const_iterator i = _dataTypeMap.find(dataTypeName);
|
||||||
if (i != dataTypeMap.end())
|
if (i != _dataTypeMap.end())
|
||||||
return new HLADataTypeReference(i->second);
|
return 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())
|
||||||
@@ -279,15 +273,15 @@ HLAOMTXmlVisitor::getDataType(const std::string& dataTypeName, HLAOMTXmlVisitor:
|
|||||||
if (dataType.valid())
|
if (dataType.valid())
|
||||||
return dataType;
|
return dataType;
|
||||||
|
|
||||||
dataType = getArrayDataType(dataTypeName, dataTypeMap);
|
dataType = getArrayDataType(dataTypeName);
|
||||||
if (dataType.valid())
|
if (dataType.valid())
|
||||||
return dataType;
|
return dataType;
|
||||||
|
|
||||||
dataType = getFixedRecordDataType(dataTypeName, dataTypeMap);
|
dataType = getFixedRecordDataType(dataTypeName);
|
||||||
if (dataType.valid())
|
if (dataType.valid())
|
||||||
return dataType;
|
return dataType;
|
||||||
|
|
||||||
dataType = getVariantDataType(dataTypeName, dataTypeMap);
|
dataType = getVariantRecordDataType(dataTypeName);
|
||||||
if (dataType.valid())
|
if (dataType.valid())
|
||||||
return dataType;
|
return dataType;
|
||||||
|
|
||||||
@@ -296,7 +290,7 @@ HLAOMTXmlVisitor::getDataType(const std::string& dataTypeName, HLAOMTXmlVisitor:
|
|||||||
}
|
}
|
||||||
|
|
||||||
SGSharedPtr<HLABasicDataType>
|
SGSharedPtr<HLABasicDataType>
|
||||||
HLAOMTXmlVisitor::getBasicDataType(const std::string& dataTypeName) const
|
HLAOMTXmlVisitor::getBasicDataType(const std::string& dataTypeName)
|
||||||
{
|
{
|
||||||
BasicDataMap::const_iterator i = _basicDataMap.find(dataTypeName);
|
BasicDataMap::const_iterator i = _basicDataMap.find(dataTypeName);
|
||||||
if (i == _basicDataMap.end())
|
if (i == _basicDataMap.end())
|
||||||
@@ -369,7 +363,7 @@ HLAOMTXmlVisitor::getBasicDataType(const std::string& dataTypeName) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
SGSharedPtr<HLADataType>
|
SGSharedPtr<HLADataType>
|
||||||
HLAOMTXmlVisitor::getSimpleDataType(const std::string& dataTypeName) const
|
HLAOMTXmlVisitor::getSimpleDataType(const std::string& dataTypeName)
|
||||||
{
|
{
|
||||||
SimpleDataMap::const_iterator i = _simpleDataMap.find(dataTypeName);
|
SimpleDataMap::const_iterator i = _simpleDataMap.find(dataTypeName);
|
||||||
if (i == _simpleDataMap.end())
|
if (i == _simpleDataMap.end())
|
||||||
@@ -378,13 +372,14 @@ HLAOMTXmlVisitor::getSimpleDataType(const std::string& dataTypeName) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
SGSharedPtr<HLAEnumeratedDataType>
|
SGSharedPtr<HLAEnumeratedDataType>
|
||||||
HLAOMTXmlVisitor::getEnumeratedDataType(const std::string& dataTypeName) const
|
HLAOMTXmlVisitor::getEnumeratedDataType(const std::string& dataTypeName)
|
||||||
{
|
{
|
||||||
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();
|
||||||
@@ -400,7 +395,7 @@ HLAOMTXmlVisitor::getEnumeratedDataType(const std::string& dataTypeName) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
SGSharedPtr<HLADataType>
|
SGSharedPtr<HLADataType>
|
||||||
HLAOMTXmlVisitor::getArrayDataType(const std::string& dataTypeName, HLAOMTXmlVisitor::StringDataTypeMap& dataTypeMap) const
|
HLAOMTXmlVisitor::getArrayDataType(const std::string& dataTypeName)
|
||||||
{
|
{
|
||||||
ArrayDataMap::const_iterator i = _arrayDataMap.find(dataTypeName);
|
ArrayDataMap::const_iterator i = _arrayDataMap.find(dataTypeName);
|
||||||
if (i == _arrayDataMap.end())
|
if (i == _arrayDataMap.end())
|
||||||
@@ -428,13 +423,13 @@ HLAOMTXmlVisitor::getArrayDataType(const std::string& dataTypeName, HLAOMTXmlVis
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
dataTypeMap[dataTypeName] = arrayDataType;
|
_dataTypeMap[dataTypeName] = arrayDataType;
|
||||||
SGSharedPtr<HLADataType> elementDataType = getDataType(i->second._dataType, dataTypeMap);
|
SGSharedPtr<HLADataType> elementDataType = getDataType(i->second._dataType);
|
||||||
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());
|
||||||
@@ -452,20 +447,20 @@ HLAOMTXmlVisitor::getArrayDataType(const std::string& dataTypeName, HLAOMTXmlVis
|
|||||||
}
|
}
|
||||||
|
|
||||||
SGSharedPtr<HLAFixedRecordDataType>
|
SGSharedPtr<HLAFixedRecordDataType>
|
||||||
HLAOMTXmlVisitor::getFixedRecordDataType(const std::string& dataTypeName, HLAOMTXmlVisitor::StringDataTypeMap& dataTypeMap) const
|
HLAOMTXmlVisitor::getFixedRecordDataType(const std::string& dataTypeName)
|
||||||
{
|
{
|
||||||
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, dataTypeMap);
|
SGSharedPtr<HLADataType> fieldDataType = getDataType(i->second._fieldList[j]._dataType);
|
||||||
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());
|
||||||
@@ -473,14 +468,14 @@ HLAOMTXmlVisitor::getFixedRecordDataType(const std::string& dataTypeName, HLAOMT
|
|||||||
return dataType;
|
return dataType;
|
||||||
}
|
}
|
||||||
|
|
||||||
SGSharedPtr<HLAVariantDataType>
|
SGSharedPtr<HLAVariantRecordDataType>
|
||||||
HLAOMTXmlVisitor::getVariantDataType(const std::string& dataTypeName, HLAOMTXmlVisitor::StringDataTypeMap& dataTypeMap) const
|
HLAOMTXmlVisitor::getVariantRecordDataType(const std::string& dataTypeName)
|
||||||
{
|
{
|
||||||
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<HLAVariantDataType> dataType = new HLAVariantDataType(dataTypeName);
|
SGSharedPtr<HLAVariantRecordDataType> dataType = new HLAVariantRecordDataType(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()) {
|
||||||
@@ -492,11 +487,11 @@ HLAOMTXmlVisitor::getVariantDataType(const std::string& dataTypeName, HLAOMTXmlV
|
|||||||
|
|
||||||
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, dataTypeMap);
|
SGSharedPtr<HLADataType> alternativeDataType = getDataType(j->_dataType);
|
||||||
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)) {
|
||||||
@@ -540,26 +535,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;
|
||||||
while (objectClass) {
|
if (!objectClass.valid())
|
||||||
for (AttributeList::const_reverse_iterator j = objectClass->_attributes.rbegin();
|
continue;
|
||||||
j != objectClass->_attributes.rend(); ++j) {
|
for (AttributeList::const_reverse_iterator j = objectClass->_attributes.rbegin();
|
||||||
(*i)->_attributes.insert((*i)->_attributes.begin(), *j);
|
j != objectClass->_attributes.rend(); ++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;
|
||||||
while (interactionClass) {
|
if (!interactionClass.valid())
|
||||||
for (ParameterList::const_reverse_iterator j = interactionClass->_parameters.rbegin();
|
continue;
|
||||||
j != interactionClass->_parameters.rend(); ++j) {
|
for (ParameterList::const_reverse_iterator j = interactionClass->_parameters.rbegin();
|
||||||
(*i)->_parameters.insert((*i)->_parameters.begin(), *j);
|
j != interactionClass->_parameters.rend(); ++j) {
|
||||||
}
|
(*i)->_parameters.insert((*i)->_parameters.begin(), *j);
|
||||||
interactionClass = interactionClass->_parentInteractionClass;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -729,11 +724,6 @@ 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!");
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
// Copyright (C) 2009 - 2012 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,9 +25,12 @@
|
|||||||
#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
|
||||||
@@ -37,6 +40,10 @@ 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
|
||||||
@@ -44,6 +51,34 @@ 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;
|
||||||
@@ -66,7 +101,6 @@ 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;
|
||||||
|
|
||||||
@@ -101,12 +135,28 @@ 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;
|
||||||
|
|
||||||
@@ -114,6 +164,7 @@ 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;
|
||||||
@@ -124,36 +175,23 @@ 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:
|
||||||
typedef std::map<std::string, SGSharedPtr<HLADataType> > StringDataTypeMap;
|
SGSharedPtr<HLADataType> getDataType(const std::string& dataTypeName);
|
||||||
SGSharedPtr<HLADataType> getDataType(const std::string& dataTypeName, StringDataTypeMap& dataTypeMap) const;
|
SGSharedPtr<HLABasicDataType> getBasicDataType(const std::string& dataTypeName);
|
||||||
SGSharedPtr<HLABasicDataType> getBasicDataType(const std::string& dataTypeName) const;
|
SGSharedPtr<HLADataType> getSimpleDataType(const std::string& dataTypeName);
|
||||||
SGSharedPtr<HLADataType> getSimpleDataType(const std::string& dataTypeName) const;
|
SGSharedPtr<HLAEnumeratedDataType> getEnumeratedDataType(const std::string& dataTypeName);
|
||||||
SGSharedPtr<HLAEnumeratedDataType> getEnumeratedDataType(const std::string& dataTypeName) const;
|
SGSharedPtr<HLADataType> getArrayDataType(const std::string& dataTypeName);
|
||||||
SGSharedPtr<HLADataType> getArrayDataType(const std::string& dataTypeName, StringDataTypeMap& dataTypeMap) const;
|
SGSharedPtr<HLAFixedRecordDataType> getFixedRecordDataType(const std::string& dataTypeName);
|
||||||
SGSharedPtr<HLAFixedRecordDataType> getFixedRecordDataType(const std::string& dataTypeName, StringDataTypeMap& dataTypeMap) const;
|
SGSharedPtr<HLAVariantRecordDataType> getVariantRecordDataType(const std::string& dataTypeName);
|
||||||
SGSharedPtr<HLAVariantDataType> getVariantDataType(const std::string& dataTypeName, StringDataTypeMap& dataTypeMap) const;
|
|
||||||
|
|
||||||
enum Mode {
|
enum Mode {
|
||||||
UnknownMode,
|
UnknownMode,
|
||||||
@@ -195,8 +233,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);
|
||||||
|
|
||||||
std::string getAttribute(const char* name, const XMLAttributes& atts);
|
static std::string getAttribute(const char* name, const XMLAttributes& atts);
|
||||||
std::string getAttribute(const std::string& name, const XMLAttributes& atts);
|
static std::string getAttribute(const std::string& name, const XMLAttributes& atts);
|
||||||
|
|
||||||
struct BasicData {
|
struct BasicData {
|
||||||
// std::string _name;
|
// std::string _name;
|
||||||
@@ -276,6 +314,9 @@ 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;
|
||||||
|
|||||||
+245
-102
@@ -1,4 +1,4 @@
|
|||||||
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
// Copyright (C) 2009 - 2012 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,8 +15,15 @@
|
|||||||
// 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"
|
||||||
@@ -54,143 +61,226 @@ 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)
|
||||||
{
|
{
|
||||||
_rtiObjectClass = federate._rtiFederate->createObjectClass(name, this);
|
if (!federate) {
|
||||||
if (!_rtiObjectClass.valid())
|
SG_LOG(SG_NETWORK, SG_ALERT, "HLAObjectClass::HLAObjectClass(): "
|
||||||
SG_LOG(SG_NETWORK, SG_WARN, "HLAObjectClass::HLAObjectClass(): No RTIObjectClass found for \"" << name << "\"!");
|
"No parent federate given for object class \"" << getName() << "\"!");
|
||||||
|
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
|
||||||
{
|
{
|
||||||
if (!_rtiObjectClass.valid()) {
|
return _attributeVector.size();
|
||||||
SG_LOG(SG_NETWORK, SG_WARN, "HLAObjectClass::getAttributeIndex(): No RTIObject class for object class \"" << getName() << "\"!");
|
}
|
||||||
return 0;
|
|
||||||
}
|
unsigned
|
||||||
return _rtiObjectClass->getNumAttributes();
|
HLAObjectClass::addAttribute(const std::string& name)
|
||||||
|
{
|
||||||
|
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
|
||||||
{
|
{
|
||||||
if (!_rtiObjectClass.valid()) {
|
NameIndexMap::const_iterator i = _nameIndexMap.find(name);
|
||||||
SG_LOG(SG_NETWORK, SG_WARN, "HLAObjectClass::getAttributeIndex(): No RTIObject class for object class \"" << getName() << "\"!");
|
if (i == _nameIndexMap.end())
|
||||||
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 (!_rtiObjectClass.valid()) {
|
if (_attributeVector.size() <= index)
|
||||||
SG_LOG(SG_NETWORK, SG_WARN, "HLAObjectClass::getAttributeIndex(): No RTIObject class for object class \"" << getName() << "\"!");
|
return std::string();
|
||||||
return 0;
|
return _attributeVector[index]._name;
|
||||||
}
|
|
||||||
return _rtiObjectClass->getAttributeName(index);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const HLADataType*
|
const HLADataType*
|
||||||
HLAObjectClass::getAttributeDataType(unsigned index) const
|
HLAObjectClass::getAttributeDataType(unsigned index) const
|
||||||
{
|
{
|
||||||
if (!_rtiObjectClass.valid()) {
|
if (_attributeVector.size() <= index)
|
||||||
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 (!_rtiObjectClass.valid()) {
|
if (_attributeVector.size() <= index)
|
||||||
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 (!_rtiObjectClass.valid()) {
|
if (_attributeVector.size() <= index)
|
||||||
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 (!_rtiObjectClass.valid()) {
|
if (_attributeVector.size() <= index)
|
||||||
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::AttributePathPair& attributePathPair) const
|
HLAObjectClass::getIndexPathPair(const HLADataElement::StringPathPair& stringPathPair) const
|
||||||
{
|
{
|
||||||
unsigned index = getAttributeIndex(attributePathPair.first);
|
unsigned index = getAttributeIndex(stringPathPair.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(attributePathPair)
|
<< HLADataElement::toString(stringPathPair)
|
||||||
<< "\"): Could not resolve attribute \"" << attributePathPair.first
|
<< "\"): Could not resolve attribute \"" << stringPathPair.first
|
||||||
<< "\" for object class \"" << getName() << "\"!");
|
<< "\" for object class \"" << getName() << "\"!");
|
||||||
}
|
}
|
||||||
return HLADataElement::IndexPathPair(index, attributePathPair.second);
|
return HLADataElement::IndexPathPair(index, stringPathPair.second);
|
||||||
}
|
}
|
||||||
|
|
||||||
HLADataElement::IndexPathPair
|
HLADataElement::IndexPathPair
|
||||||
HLAObjectClass::getIndexPathPair(const std::string& path) const
|
HLAObjectClass::getIndexPathPair(const std::string& path) const
|
||||||
{
|
{
|
||||||
return getIndexPathPair(HLADataElement::toAttributePathPair(path));
|
return getIndexPathPair(HLADataElement::toStringPathPair(path));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
HLAObjectClass::subscribe(const std::set<unsigned>& indexSet, bool active)
|
HLAObjectClass::subscribe()
|
||||||
{
|
{
|
||||||
if (!_rtiObjectClass.valid()) {
|
if (!_rtiObjectClass.valid()) {
|
||||||
SG_LOG(SG_NETWORK, SG_WARN, "HLAObjectClass::subscribe(): No RTIObject class for object class \"" << getName() << "\"!");
|
SG_LOG(SG_NETWORK, SG_WARN, "HLAObjectClass::subscribe(): "
|
||||||
|
"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(): No RTIObject class for object class \"" << getName() << "\"!");
|
SG_LOG(SG_NETWORK, SG_WARN, "HLAObjectClass::unsubscribe(): "
|
||||||
|
"No RTIObject class for object class \"" << getName() << "\"!");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return _rtiObjectClass->unsubscribe();
|
return _rtiObjectClass->unsubscribe();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
HLAObjectClass::publish(const std::set<unsigned>& indexSet)
|
HLAObjectClass::publish()
|
||||||
{
|
{
|
||||||
if (!_rtiObjectClass.valid()) {
|
if (!_rtiObjectClass.valid()) {
|
||||||
SG_LOG(SG_NETWORK, SG_WARN, "HLAObjectClass::publish(): No RTIObject class for object class \"" << getName() << "\"!");
|
SG_LOG(SG_NETWORK, SG_WARN, "HLAObjectClass::publish(): "
|
||||||
|
"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(): No RTIObject class for object class \"" << getName() << "\"!");
|
SG_LOG(SG_NETWORK, SG_WARN, "HLAObjectClass::unpublish(): "
|
||||||
|
"No RTIObject class for object class \"" << getName() << "\"!");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return _rtiObjectClass->unpublish();
|
return _rtiObjectClass->unpublish();
|
||||||
@@ -207,82 +297,135 @@ HLAObjectClass::stopRegistration() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
HLAObjectInstance*
|
HLAObjectInstance*
|
||||||
HLAObjectClass::createObjectInstance(RTIObjectInstance* rtiObjectInstance)
|
HLAObjectClass::createObjectInstance(const std::string& name)
|
||||||
{
|
{
|
||||||
return new HLAObjectInstance(this, rtiObjectInstance);
|
HLAObjectInstance* objectInstance = createObjectInstance();
|
||||||
|
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::discoverInstance(RTIObjectInstance* objectInstance, const RTIData& tag)
|
HLAObjectClass::_setRTIObjectClass(RTIObjectClass* objectClass)
|
||||||
{
|
{
|
||||||
SGSharedPtr<HLAObjectInstance> hlaObjectInstance = createObjectInstance(objectInstance);
|
if (_rtiObjectClass) {
|
||||||
if (hlaObjectInstance.valid()) {
|
SG_LOG(SG_NETWORK, SG_ALERT, "HLAObjectClass: Setting RTIObjectClass twice for object class \"" << getName() << "\"!");
|
||||||
SG_LOG(SG_NETWORK, SG_INFO, "RTI: create new object instance for discovered \""
|
return;
|
||||||
<< 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) {
|
||||||
void
|
SG_LOG(SG_NETWORK, SG_ALERT, "HLAObjectClass: backward reference does not match!");
|
||||||
HLAObjectClass::removeInstance(HLAObjectInstance& hlaObjectInstance, const RTIData& tag)
|
|
||||||
{
|
|
||||||
SG_LOG(SG_NETWORK, SG_INFO, "RTI: remove object instance \"" << hlaObjectInstance.getName() << "\"");
|
|
||||||
removeInstanceCallback(hlaObjectInstance, tag);
|
|
||||||
_objectInstanceSet.erase(&hlaObjectInstance);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
HLAObjectClass::registerInstance(HLAObjectInstance& objectInstance)
|
|
||||||
{
|
|
||||||
_objectInstanceSet.insert(&objectInstance);
|
|
||||||
registerInstanceCallback(objectInstance);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
HLAObjectClass::deleteInstance(HLAObjectInstance& objectInstance)
|
|
||||||
{
|
|
||||||
deleteInstanceCallback(objectInstance);
|
|
||||||
_objectInstanceSet.erase(&objectInstance);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
HLAObjectClass::discoverInstanceCallback(HLAObjectInstance& objectInstance, const RTIData& tag) const
|
|
||||||
{
|
|
||||||
if (!_instanceCallback.valid())
|
|
||||||
return;
|
return;
|
||||||
_instanceCallback->discoverInstance(*this, objectInstance, tag);
|
}
|
||||||
|
for (unsigned i = 0; i < _attributeVector.size(); ++i)
|
||||||
|
_resolveAttributeIndex(_attributeVector[i]._name, i);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
HLAObjectClass::removeInstanceCallback(HLAObjectInstance& objectInstance, const RTIData& tag) const
|
HLAObjectClass::_resolveAttributeIndex(const std::string& name, unsigned index)
|
||||||
{
|
{
|
||||||
if (!_instanceCallback.valid())
|
if (!_rtiObjectClass)
|
||||||
return;
|
return;
|
||||||
_instanceCallback->removeInstance(*this, objectInstance, tag);
|
if (!_rtiObjectClass->resolveAttributeIndex(name, index))
|
||||||
|
SG_LOG(SG_NETWORK, SG_ALERT, "HLAObjectClass: Could not resolve attribute \""
|
||||||
|
<< name << "\" for object class \"" << getName() << "\"!");
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
HLAObjectClass::registerInstanceCallback(HLAObjectInstance& objectInstance) const
|
HLAObjectClass::_clearRTIObjectClass()
|
||||||
{
|
{
|
||||||
if (!_instanceCallback.valid())
|
if (!_rtiObjectClass.valid())
|
||||||
return;
|
return;
|
||||||
_instanceCallback->registerInstance(*this, objectInstance);
|
_rtiObjectClass->_objectClass = 0;
|
||||||
|
_rtiObjectClass = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
HLAObjectClass::deleteInstanceCallback(HLAObjectInstance& objectInstance) const
|
HLAObjectClass::_discoverInstance(RTIObjectInstance* rtiObjectInstance, const RTIData& tag)
|
||||||
{
|
{
|
||||||
if (!_instanceCallback.valid())
|
SGSharedPtr<HLAFederate> federate = _federate.lock();
|
||||||
|
if (!federate.valid()) {
|
||||||
|
SG_LOG(SG_NETWORK, SG_ALERT, "RTI: could not find parent federate while discovering object instance");
|
||||||
return;
|
return;
|
||||||
_instanceCallback->deleteInstance(*this, objectInstance);
|
}
|
||||||
|
|
||||||
|
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::startRegistrationCallback()
|
HLAObjectClass::_removeInstance(HLAObjectInstance& objectInstance, const RTIData& tag)
|
||||||
|
{
|
||||||
|
SGSharedPtr<HLAFederate> federate = _federate.lock();
|
||||||
|
if (!federate.valid()) {
|
||||||
|
SG_LOG(SG_NETWORK, SG_ALERT, "RTI: could not find parent federate while removing object instance");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
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
|
||||||
|
HLAObjectClass::_registerInstance(HLAObjectInstance* objectInstance)
|
||||||
|
{
|
||||||
|
SGSharedPtr<HLAFederate> federate = _federate.lock();
|
||||||
|
if (!federate.valid()) {
|
||||||
|
SG_LOG(SG_NETWORK, SG_ALERT, "RTI: could not find parent federate while registering object instance");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
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
|
||||||
|
HLAObjectClass::_deleteInstance(HLAObjectInstance& objectInstance)
|
||||||
|
{
|
||||||
|
SGSharedPtr<HLAFederate> federate = _federate.lock();
|
||||||
|
if (!federate.valid()) {
|
||||||
|
SG_LOG(SG_NETWORK, SG_ALERT, "RTI: could not find parent federate while deleting object instance");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (_instanceCallback.valid())
|
||||||
|
_instanceCallback->deleteInstance(*this, objectInstance);
|
||||||
|
federate->_eraseObjectInstance(objectInstance.getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
HLAObjectClass::_startRegistration()
|
||||||
{
|
{
|
||||||
if (_registrationCallback.valid())
|
if (_registrationCallback.valid())
|
||||||
_registrationCallback->startRegistration(*this);
|
_registrationCallback->startRegistration(*this);
|
||||||
@@ -291,7 +434,7 @@ HLAObjectClass::startRegistrationCallback()
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
HLAObjectClass::stopRegistrationCallback()
|
HLAObjectClass::_stopRegistration()
|
||||||
{
|
{
|
||||||
if (_registrationCallback.valid())
|
if (_registrationCallback.valid())
|
||||||
_registrationCallback->stopRegistration(*this);
|
_registrationCallback->stopRegistration(*this);
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
// Copyright (C) 2009 - 2012 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,30 +32,56 @@ 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();
|
||||||
|
|
||||||
const std::string& getName() const
|
/// Return the name of this object class
|
||||||
{ return _name; }
|
const std::string& getName() const;
|
||||||
|
|
||||||
|
/// 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;
|
||||||
void setAttributeDataType(unsigned index, const HLADataType*);
|
/// Sets the data type of the attribute with the given index to dataType
|
||||||
|
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);
|
||||||
|
|
||||||
HLADataElement::IndexPathPair getIndexPathPair(const HLADataElement::AttributePathPair&) const;
|
/// Return the subscription type of the attribute with the given index
|
||||||
|
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;
|
||||||
|
|
||||||
bool subscribe(const std::set<unsigned>& indexSet, bool active);
|
virtual bool subscribe();
|
||||||
bool unsubscribe();
|
virtual bool unsubscribe();
|
||||||
|
|
||||||
bool publish(const std::set<unsigned>& indexSet);
|
virtual bool publish();
|
||||||
bool unpublish();
|
virtual bool unpublish();
|
||||||
|
|
||||||
// Object instance creation and destruction
|
// Object instance creation and destruction
|
||||||
class InstanceCallback : public SGReferenced {
|
class InstanceCallback : public SGReferenced {
|
||||||
@@ -74,6 +100,11 @@ 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:
|
||||||
@@ -87,46 +118,61 @@ public:
|
|||||||
const SGSharedPtr<RegistrationCallback>& getRegistrationCallback() const
|
const SGSharedPtr<RegistrationCallback>& getRegistrationCallback() const
|
||||||
{ return _registrationCallback; }
|
{ return _registrationCallback; }
|
||||||
|
|
||||||
// Is called by the default registration callback if installed
|
/// Create a new instance of this class.
|
||||||
void startRegistration() const;
|
virtual HLAObjectInstance* createObjectInstance(const std::string& name);
|
||||||
void stopRegistration() const;
|
virtual HLAObjectInstance* createObjectInstance(); // deprecated
|
||||||
|
|
||||||
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 discoverInstanceCallback(HLAObjectInstance& objectInstance, const RTIData& tag) const;
|
void _startRegistration();
|
||||||
void removeInstanceCallback(HLAObjectInstance& objectInstance, const RTIData& tag) const;
|
void _stopRegistration();
|
||||||
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;
|
||||||
|
|
||||||
// The object class name
|
struct Attribute {
|
||||||
|
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;
|
||||||
|
|
||||||
// The set of active objects
|
friend class HLAFederate;
|
||||||
typedef std::set<SGSharedPtr<HLAObjectInstance> > ObjectInstanceSet;
|
|
||||||
ObjectInstanceSet _objectInstanceSet;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace simgear
|
} // namespace simgear
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
// Copyright (C) 2009 - 2012 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,112 +15,145 @@
|
|||||||
// 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 "HLAVariantDataElement.hxx"
|
#include "HLAVariantRecordDataElement.hxx"
|
||||||
#include "RTIObjectClass.hxx"
|
#include "RTIObjectClass.hxx"
|
||||||
#include "RTIObjectInstance.hxx"
|
#include "RTIObjectInstance.hxx"
|
||||||
|
|
||||||
namespace simgear {
|
namespace simgear {
|
||||||
|
|
||||||
HLAObjectInstance::HLAObjectInstance(HLAObjectClass* objectClass) :
|
HLAObjectInstance::UpdateCallback::~UpdateCallback()
|
||||||
_objectClass(objectClass)
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
HLAObjectInstance::HLAObjectInstance(HLAObjectClass* objectClass, RTIObjectInstance* rtiObjectInstance) :
|
HLAObjectInstance::ReflectCallback::~ReflectCallback()
|
||||||
_objectClass(objectClass),
|
|
||||||
_rtiObjectInstance(rtiObjectInstance)
|
|
||||||
{
|
{
|
||||||
_rtiObjectInstance->_hlaObjectInstance = this;
|
}
|
||||||
_name = _rtiObjectInstance->getName();
|
|
||||||
|
HLAObjectInstance::HLAObjectInstance(HLAObjectClass* objectClass) :
|
||||||
|
_objectClass(objectClass)
|
||||||
|
{
|
||||||
|
if (objectClass)
|
||||||
|
_federate = objectClass->_federate;
|
||||||
}
|
}
|
||||||
|
|
||||||
HLAObjectInstance::~HLAObjectInstance()
|
HLAObjectInstance::~HLAObjectInstance()
|
||||||
{
|
{
|
||||||
|
_clearRTIObjectInstance();
|
||||||
}
|
}
|
||||||
|
|
||||||
SGSharedPtr<HLAObjectClass>
|
const std::string&
|
||||||
|
HLAObjectInstance::getName() const
|
||||||
|
{
|
||||||
|
return _name;
|
||||||
|
}
|
||||||
|
|
||||||
|
const SGWeakPtr<HLAFederate>&
|
||||||
|
HLAObjectInstance::getFederate() const
|
||||||
|
{
|
||||||
|
return _federate;
|
||||||
|
}
|
||||||
|
|
||||||
|
const SGSharedPtr<HLAObjectClass>&
|
||||||
HLAObjectInstance::getObjectClass() const
|
HLAObjectInstance::getObjectClass() const
|
||||||
{
|
{
|
||||||
return _objectClass.lock();
|
return _objectClass;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned
|
unsigned
|
||||||
HLAObjectInstance::getNumAttributes() const
|
HLAObjectInstance::getNumAttributes() const
|
||||||
{
|
{
|
||||||
if (!_rtiObjectInstance.valid()) {
|
if (!_objectClass.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 (!_rtiObjectInstance.valid()) {
|
if (!_objectClass.valid())
|
||||||
SG_LOG(SG_IO, SG_ALERT, "Trying to get attribute index for inactive object!");
|
return ~0u;
|
||||||
return 0;
|
return _objectClass->getAttributeIndex(name);
|
||||||
}
|
|
||||||
return _rtiObjectInstance->getAttributeIndex(name);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string
|
std::string
|
||||||
HLAObjectInstance::getAttributeName(unsigned index) const
|
HLAObjectInstance::getAttributeName(unsigned index) const
|
||||||
{
|
{
|
||||||
if (!_rtiObjectInstance.valid()) {
|
if (!_objectClass.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 (!_rtiObjectInstance.valid()) {
|
if (!_objectClass.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 (!_rtiObjectInstance.valid()) {
|
if (_attributeVector.size() <= index)
|
||||||
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 (!_rtiObjectInstance.valid()) {
|
if (_attributeVector.size() <= index)
|
||||||
SG_LOG(SG_IO, SG_ALERT, "Trying to set data element for inactive object!");
|
|
||||||
return 0;
|
return 0;
|
||||||
|
return _attributeVector[index]._dataElement.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
HLAObjectInstance::getAttributeData(unsigned index, RTIData& data) const
|
||||||
|
{
|
||||||
|
if (!_rtiObjectInstance.valid()) {
|
||||||
|
SG_LOG(SG_IO, SG_ALERT, "Trying to get raw attribute data without rti object instance for \"" << getName() << "\"!");
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
return _rtiObjectInstance->getDataElement(index);
|
return _rtiObjectInstance->getAttributeData(index, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
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 {
|
||||||
@@ -312,9 +345,9 @@ public:
|
|||||||
_dataElement = recordDataElement;
|
_dataElement = recordDataElement;
|
||||||
}
|
}
|
||||||
|
|
||||||
class VariantDataElementFactory : public HLAVariantDataElement::DataElementFactory {
|
class VariantRecordDataElementFactory : public HLAVariantRecordDataElement::DataElementFactory {
|
||||||
public:
|
public:
|
||||||
VariantDataElementFactory(const HLADataElement::Path& path, const HLAPathElementMap& pathElementMap) :
|
VariantRecordDataElementFactory(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);
|
||||||
@@ -325,9 +358,9 @@ public:
|
|||||||
_pathElementMap.insert(*i);
|
_pathElementMap.insert(*i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
virtual HLADataElement* createElement(const HLAVariantDataElement& element, unsigned index)
|
virtual HLADataElement* createElement(const HLAVariantRecordDataElement& element, unsigned index)
|
||||||
{
|
{
|
||||||
const HLAVariantDataType* dataType = element.getDataType();
|
const HLAVariantRecordDataType* dataType = element.getDataType();
|
||||||
if (!dataType)
|
if (!dataType)
|
||||||
return 0;
|
return 0;
|
||||||
const HLADataType* alternativeDataType = element.getAlternativeDataType();
|
const HLADataType* alternativeDataType = element.getAlternativeDataType();
|
||||||
@@ -344,17 +377,17 @@ public:
|
|||||||
HLAPathElementMap _pathElementMap;
|
HLAPathElementMap _pathElementMap;
|
||||||
};
|
};
|
||||||
|
|
||||||
virtual void apply(const HLAVariantDataType& dataType)
|
virtual void apply(const HLAVariantRecordDataType& dataType)
|
||||||
{
|
{
|
||||||
_dataElement = createDataElement(_path, dataType);
|
_dataElement = createDataElement(_path, dataType);
|
||||||
if (_dataElement.valid())
|
if (_dataElement.valid())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
SGSharedPtr<HLAVariantDataElement> variantDataElement;
|
SGSharedPtr<HLAVariantRecordDataElement> variantRecordDataElement;
|
||||||
variantDataElement = new HLAVariantDataElement(&dataType);
|
variantRecordDataElement = new HLAVariantRecordDataElement(&dataType);
|
||||||
variantDataElement->setDataElementFactory(new VariantDataElementFactory(_path, _pathElementMap));
|
variantRecordDataElement->setDataElementFactory(new VariantRecordDataElementFactory(_path, _pathElementMap));
|
||||||
|
|
||||||
_dataElement = variantDataElement;
|
_dataElement = variantRecordDataElement;
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@@ -387,8 +420,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 at index "
|
SG_LOG(SG_IO, SG_ALERT, "Cannot get attribute data type for setting attribute \""
|
||||||
<< index << "!");
|
<< getAttributeName(index) << "\" at index " << index << "!");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -411,26 +444,36 @@ 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;
|
||||||
}
|
}
|
||||||
SGSharedPtr<HLAObjectClass> objectClass = _objectClass.lock();
|
if (!objectClass) {
|
||||||
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;
|
||||||
}
|
}
|
||||||
// This error must have been flagged before
|
if (_objectClass.valid() && objectClass != _objectClass.get()) {
|
||||||
if (!objectClass->_rtiObjectClass.valid())
|
SG_LOG(SG_IO, SG_ALERT, "Could not change object class while registering!");
|
||||||
return;
|
return;
|
||||||
_rtiObjectInstance = objectClass->_rtiObjectClass->registerObjectInstance(this);
|
}
|
||||||
|
_objectClass = objectClass;
|
||||||
|
_federate = _objectClass->_federate;
|
||||||
|
// This error must have been flagged before
|
||||||
|
if (!_objectClass->_rtiObjectClass.valid())
|
||||||
|
return;
|
||||||
|
_setRTIObjectInstance(_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;
|
||||||
}
|
}
|
||||||
_name = _rtiObjectInstance->getName();
|
_objectClass->_registerInstance(this);
|
||||||
objectClass->registerInstance(*this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -440,61 +483,224 @@ 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;
|
||||||
}
|
}
|
||||||
SGSharedPtr<HLAObjectClass> objectClass = _objectClass.lock();
|
if (!_objectClass.valid())
|
||||||
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);
|
||||||
_rtiObjectInstance->updateAttributeValues(tag);
|
if (_updateCallback.valid()) {
|
||||||
|
_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 (_attributeCallback.valid())
|
||||||
|
_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()) {
|
if (!_rtiObjectInstance.valid()) {
|
||||||
SG_LOG(SG_IO, SG_INFO, "Not updating inactive object!");
|
SG_LOG(SG_IO, SG_INFO, "Not updating inactive object!");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (_attributeCallback.valid())
|
|
||||||
_attributeCallback->updateAttributeValues(*this, tag);
|
|
||||||
_rtiObjectInstance->updateAttributeValues(timeStamp, tag);
|
_rtiObjectInstance->updateAttributeValues(timeStamp, tag);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
HLAObjectInstance::removeInstance(const RTIData& tag)
|
HLAObjectInstance::reflectAttributeValues(const HLAIndexList& indexList, const RTIData& tag)
|
||||||
{
|
{
|
||||||
SGSharedPtr<HLAObjectClass> objectClass = _objectClass.lock();
|
for (HLAIndexList::const_iterator i = indexList.begin(); i != indexList.end(); ++i)
|
||||||
if (!objectClass.valid())
|
reflectAttributeValue(*i, tag);
|
||||||
return;
|
|
||||||
objectClass->removeInstanceCallback(*this, tag);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
HLAObjectInstance::reflectAttributeValues(const RTIIndexDataPairList& dataPairList, const RTIData& tag)
|
HLAObjectInstance::reflectAttributeValues(const HLAIndexList& indexList,
|
||||||
{
|
|
||||||
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)
|
||||||
{
|
{
|
||||||
if (!_attributeCallback.valid())
|
for (HLAIndexList::const_iterator i = indexList.begin(); i != indexList.end(); ++i)
|
||||||
|
reflectAttributeValue(*i, timeStamp, tag);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
HLAObjectInstance::reflectAttributeValue(unsigned index, const RTIData& tag)
|
||||||
|
{
|
||||||
|
HLADataElement* dataElement = getAttributeDataElement(index);
|
||||||
|
if (!dataElement)
|
||||||
return;
|
return;
|
||||||
_attributeCallback->reflectAttributeValues(*this, dataPairList, timeStamp, tag);
|
dataElement->setTimeStampValid(false);
|
||||||
|
_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
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
// Copyright (C) 2009 - 2012 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,51 +18,121 @@
|
|||||||
#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);
|
HLAObjectInstance(HLAObjectClass* objectClass = 0);
|
||||||
HLAObjectInstance(HLAObjectClass* objectClass, RTIObjectInstance* rtiObjectInstance);
|
|
||||||
virtual ~HLAObjectInstance();
|
virtual ~HLAObjectInstance();
|
||||||
|
|
||||||
const std::string& getName() const
|
/// Return the name of this object instance
|
||||||
{ return _name; }
|
const std::string& getName() const;
|
||||||
|
|
||||||
SGSharedPtr<HLAObjectClass> getObjectClass() const;
|
/// return the federate this instance belongs to
|
||||||
|
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;
|
||||||
|
|
||||||
void setAttributeDataElement(unsigned index, SGSharedPtr<HLADataElement> dataElement);
|
/// Return the data element of the attribute with the given index
|
||||||
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)
|
||||||
{ }
|
{ }
|
||||||
@@ -76,24 +146,57 @@ public:
|
|||||||
const SGSharedPtr<AttributeCallback>& getAttributeCallback() const
|
const SGSharedPtr<AttributeCallback>& getAttributeCallback() const
|
||||||
{ return _attributeCallback; }
|
{ return _attributeCallback; }
|
||||||
|
|
||||||
// Push the current values into the RTI
|
|
||||||
void updateAttributeValues(const RTIData& tag);
|
|
||||||
void updateAttributeValues(const SGTimeStamp& timeStamp, const RTIData& tag);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void removeInstance(const RTIData& tag);
|
void _setRTIObjectInstance(RTIObjectInstance* rtiObjectInstance);
|
||||||
void reflectAttributeValues(const RTIIndexDataPairList& dataPairList, const RTIData& tag);
|
void _clearRTIObjectInstance();
|
||||||
void reflectAttributeValues(const RTIIndexDataPairList& dataPairList, const SGTimeStamp& timeStamp, const RTIData& tag);
|
|
||||||
friend class RTIObjectInstance;
|
// The callback entry points from the RTI interface classes.
|
||||||
friend class HLAObjectClass;
|
void _removeInstance(const RTIData& tag);
|
||||||
|
void _reflectAttributeValues(const HLAIndexList& indexList, const RTIData& tag);
|
||||||
|
void _reflectAttributeValues(const HLAIndexList& indexList, const SGTimeStamp& timeStamp, const RTIData& tag);
|
||||||
|
|
||||||
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;
|
||||||
|
|
||||||
SGWeakPtr<HLAObjectClass> _objectClass;
|
// /// The name as given by the local created instance
|
||||||
|
// 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
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright (C) 2009 - 2011 Mathias Froehlich - Mathias.Froehlich@web.de
|
// Copyright (C) 2009 - 2012 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,6 +15,12 @@
|
|||||||
// 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"
|
||||||
@@ -22,7 +28,7 @@
|
|||||||
#include "HLADataElementVisitor.hxx"
|
#include "HLADataElementVisitor.hxx"
|
||||||
#include "HLADataTypeVisitor.hxx"
|
#include "HLADataTypeVisitor.hxx"
|
||||||
#include "HLAFixedRecordDataElement.hxx"
|
#include "HLAFixedRecordDataElement.hxx"
|
||||||
#include "HLAVariantDataElement.hxx"
|
#include "HLAVariantRecordDataElement.hxx"
|
||||||
|
|
||||||
namespace simgear {
|
namespace simgear {
|
||||||
|
|
||||||
@@ -373,14 +379,14 @@ public:
|
|||||||
_dataElement = recordDataElement;
|
_dataElement = recordDataElement;
|
||||||
}
|
}
|
||||||
|
|
||||||
class VariantDataElementFactory : public HLAVariantDataElement::DataElementFactory {
|
class VariantRecordDataElementFactory : public HLAVariantRecordDataElement::DataElementFactory {
|
||||||
public:
|
public:
|
||||||
VariantDataElementFactory(SGPropertyNode* propertyNode) :
|
VariantRecordDataElementFactory(SGPropertyNode* propertyNode) :
|
||||||
_propertyNode(propertyNode)
|
_propertyNode(propertyNode)
|
||||||
{ }
|
{ }
|
||||||
virtual HLADataElement* createElement(const HLAVariantDataElement& element, unsigned index)
|
virtual HLADataElement* createElement(const HLAVariantRecordDataElement& element, unsigned index)
|
||||||
{
|
{
|
||||||
const HLAVariantDataType* dataType = element.getDataType();
|
const HLAVariantRecordDataType* dataType = element.getDataType();
|
||||||
if (!dataType)
|
if (!dataType)
|
||||||
return 0;
|
return 0;
|
||||||
const HLADataType* alternativeDataType = element.getAlternativeDataType();
|
const HLADataType* alternativeDataType = element.getAlternativeDataType();
|
||||||
@@ -394,12 +400,12 @@ public:
|
|||||||
SGSharedPtr<SGPropertyNode> _propertyNode;
|
SGSharedPtr<SGPropertyNode> _propertyNode;
|
||||||
};
|
};
|
||||||
|
|
||||||
virtual void apply(const HLAVariantDataType& dataType)
|
virtual void apply(const HLAVariantRecordDataType& dataType)
|
||||||
{
|
{
|
||||||
SGSharedPtr<HLAVariantDataElement> variantDataElement;
|
SGSharedPtr<HLAVariantRecordDataElement> variantRecordDataElement;
|
||||||
variantDataElement = new HLAVariantDataElement(&dataType);
|
variantRecordDataElement = new HLAVariantRecordDataElement(&dataType);
|
||||||
variantDataElement->setDataElementFactory(new VariantDataElementFactory(_propertyNode.get()));
|
variantRecordDataElement->setDataElementFactory(new VariantRecordDataElementFactory(_propertyNode.get()));
|
||||||
_dataElement = variantDataElement;
|
_dataElement = variantRecordDataElement;
|
||||||
}
|
}
|
||||||
|
|
||||||
HLADataElement* getDataElement()
|
HLADataElement* getDataElement()
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
// Copyright (C) 2009 - 2012 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,6 +15,12 @@
|
|||||||
// 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 {
|
||||||
|
|||||||
@@ -0,0 +1,47 @@
|
|||||||
|
// 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
|
||||||
@@ -1,169 +0,0 @@
|
|||||||
// 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);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
// Copyright (C) 2009 - 2012 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,67 +18,13 @@
|
|||||||
#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 {
|
||||||
|
|
||||||
class HLAAbstractVariantDataElement : public HLADataElement {
|
typedef HLAAbstractVariantRecordDataElement HLAAbstractVariantDataElement;
|
||||||
public:
|
typedef HLAVariantRecordDataElement HLAVariantDataElement;
|
||||||
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 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
// Copyright (C) 2009 - 2012 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,84 +18,11 @@
|
|||||||
#ifndef HLAVariantDataType_hxx
|
#ifndef HLAVariantDataType_hxx
|
||||||
#define HLAVariantDataType_hxx
|
#define HLAVariantDataType_hxx
|
||||||
|
|
||||||
#include <string>
|
#include "HLAVariantRecordDataType.hxx"
|
||||||
#include <vector>
|
|
||||||
#include "simgear/structure/SGSharedPtr.hxx"
|
|
||||||
#include "HLADataType.hxx"
|
|
||||||
#include "HLAEnumeratedDataType.hxx"
|
|
||||||
|
|
||||||
namespace simgear {
|
namespace simgear {
|
||||||
|
|
||||||
class HLAAbstractVariantDataElement;
|
typedef HLAVariantRecordDataType HLAVariantDataType;
|
||||||
|
|
||||||
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
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,190 @@
|
|||||||
|
// 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,88 @@
|
|||||||
|
// 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
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
// Copyright (C) 2009 - 2012 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,36 +15,49 @@
|
|||||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
//
|
//
|
||||||
|
|
||||||
#include "HLAVariantDataType.hxx"
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <simgear_config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <simgear/compiler.h>
|
||||||
|
|
||||||
|
#include "HLAVariantRecordDataType.hxx"
|
||||||
|
|
||||||
#include "HLADataTypeVisitor.hxx"
|
#include "HLADataTypeVisitor.hxx"
|
||||||
#include "HLAVariantDataElement.hxx"
|
#include "HLAVariantRecordDataElement.hxx"
|
||||||
|
|
||||||
namespace simgear {
|
namespace simgear {
|
||||||
|
|
||||||
HLAVariantDataType::HLAVariantDataType(const std::string& name) :
|
HLAVariantRecordDataType::HLAVariantRecordDataType(const std::string& name) :
|
||||||
HLADataType(name)
|
HLADataType(name)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
HLAVariantDataType::~HLAVariantDataType()
|
HLAVariantRecordDataType::~HLAVariantRecordDataType()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
HLAVariantDataType::accept(HLADataTypeVisitor& visitor) const
|
HLAVariantRecordDataType::accept(HLADataTypeVisitor& visitor) const
|
||||||
{
|
{
|
||||||
visitor.apply(*this);
|
visitor.apply(*this);
|
||||||
}
|
}
|
||||||
|
|
||||||
const HLAVariantDataType*
|
const HLAVariantRecordDataType*
|
||||||
HLAVariantDataType::toVariantDataType() const
|
HLAVariantRecordDataType::toVariantRecordDataType() const
|
||||||
{
|
{
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
HLAVariantRecordDataType::releaseDataTypeReferences()
|
||||||
|
{
|
||||||
|
for (AlternativeList::iterator i = _alternativeList.begin(); i != _alternativeList.end(); ++i)
|
||||||
|
i->_dataType = 0;
|
||||||
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
HLAVariantDataType::decode(HLADecodeStream& stream, HLAAbstractVariantDataElement& value) const
|
HLAVariantRecordDataType::decode(HLADecodeStream& stream, HLAAbstractVariantRecordDataElement& value) const
|
||||||
{
|
{
|
||||||
if (!stream.alignOffsetForSize(getAlignment()))
|
if (!stream.alignOffsetForSize(getAlignment()))
|
||||||
return false;
|
return false;
|
||||||
@@ -61,7 +74,7 @@ HLAVariantDataType::decode(HLADecodeStream& stream, HLAAbstractVariantDataElemen
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
HLAVariantDataType::encode(HLAEncodeStream& stream, const HLAAbstractVariantDataElement& value) const
|
HLAVariantRecordDataType::encode(HLAEncodeStream& stream, const HLAAbstractVariantRecordDataElement& value) const
|
||||||
{
|
{
|
||||||
if (!stream.alignOffsetForSize(getAlignment()))
|
if (!stream.alignOffsetForSize(getAlignment()))
|
||||||
return false;
|
return false;
|
||||||
@@ -76,14 +89,14 @@ HLAVariantDataType::encode(HLAEncodeStream& stream, const HLAAbstractVariantData
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
HLAVariantDataType::setEnumeratedDataType(HLAEnumeratedDataType* dataType)
|
HLAVariantRecordDataType::setEnumeratedDataType(HLAEnumeratedDataType* dataType)
|
||||||
{
|
{
|
||||||
_enumeratedDataType = dataType;
|
_enumeratedDataType = dataType;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
HLAVariantDataType::addAlternative(const std::string& name, const std::string& enumerator,
|
HLAVariantRecordDataType::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;
|
||||||
@@ -94,8 +107,20 @@ HLAVariantDataType::addAlternative(const std::string& name, const std::string& e
|
|||||||
_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
|
||||||
@@ -0,0 +1,107 @@
|
|||||||
|
// 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
|
||||||
@@ -71,11 +71,22 @@ 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,
|
||||||
@@ -264,20 +275,8 @@ public:
|
|||||||
// }
|
// }
|
||||||
// return false;
|
// return false;
|
||||||
// }
|
// }
|
||||||
// bool isAttributeOwnedByFederate(const RTIHandle& objectHandle, const RTIHandle& attributeHandle)
|
bool isAttributeOwnedByFederate(const RTI::ObjectHandle& objectHandle, const RTI::AttributeHandle& 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
|
||||||
|
|
||||||
@@ -347,55 +346,15 @@ 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)); }
|
||||||
|
|
||||||
// RTIHandle getInteractionClassHandle(const std::string& name)
|
RTI::InteractionClassHandle getInteractionClassHandle(const std::string& name)
|
||||||
// {
|
{ return _rtiAmbassador.getInteractionClassHandle(name.c_str()); }
|
||||||
// try {
|
std::string getInteractionClassName(const RTI::InteractionClassHandle& handle)
|
||||||
// return _rtiAmbassador.getInteractionClassHandle(name.c_str());
|
{ return rtiToStdString(_rtiAmbassador.getInteractionClassName(handle)); }
|
||||||
// } 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;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// RTIHandle getParameterHandle(const std::string& parameterName, const RTIHandle& interactionClassHandle)
|
RTI::ParameterHandle getParameterHandle(const std::string& parameterName, const RTI::InteractionClassHandle& interactionClassHandle)
|
||||||
// {
|
{ return _rtiAmbassador.getParameterHandle(parameterName.c_str(), interactionClassHandle); }
|
||||||
// try {
|
std::string getParameterName(const RTI::ParameterHandle& parameterHandle, const RTI::InteractionClassHandle& interactionClassHandle)
|
||||||
// return _rtiAmbassador.getParameterHandle(parameterName.c_str(), interactionClassHandle);
|
{ return rtiToStdString(_rtiAmbassador.getParameterName(parameterHandle, 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()); }
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright (C) 2009 - 2011 Mathias Froehlich - Mathias.Froehlich@web.de
|
// Copyright (C) 2009 - 2012 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,6 +15,12 @@
|
|||||||
// 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"
|
||||||
@@ -222,7 +228,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(), false);
|
SGSharedPtr<RTI13ObjectInstance> objectInstance = new RTI13ObjectInstance(objectHandle, 0, i->second, _rtiAmbassador.get());
|
||||||
_objectInstanceMap[objectHandle] = objectInstance;
|
_objectInstanceMap[objectHandle] = objectInstance;
|
||||||
i->second->discoverInstance(objectInstance.get(), tag);
|
i->second->discoverInstance(objectInstance.get(), tag);
|
||||||
}
|
}
|
||||||
@@ -278,7 +284,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);
|
i->second->reflectAttributeValues(attributeHandleDataPairList, timeStamp, tag, _indexPool);
|
||||||
}
|
}
|
||||||
|
|
||||||
class ReflectAttributeValuesCallback : public TagQueueCallback {
|
class ReflectAttributeValuesCallback : public TagQueueCallback {
|
||||||
@@ -327,7 +333,7 @@ struct RTI13Federate::FederateAmbassador : public RTI::FederateAmbassador {
|
|||||||
return;
|
return;
|
||||||
if (!i->second.valid())
|
if (!i->second.valid())
|
||||||
return;
|
return;
|
||||||
i->second->reflectAttributeValues(attributeHandleDataPairList, tag);
|
i->second->reflectAttributeValues(attributeHandleDataPairList, tag, _indexPool);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void receiveInteraction(RTI::InteractionClassHandle interactionClassHandle, const RTI::ParameterHandleValuePairSet& parameters,
|
virtual void receiveInteraction(RTI::InteractionClassHandle interactionClassHandle, const RTI::ParameterHandleValuePairSet& parameters,
|
||||||
@@ -855,6 +861,9 @@ 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
|
||||||
@@ -864,6 +873,10 @@ 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;
|
||||||
@@ -1602,6 +1615,35 @@ 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)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -25,6 +25,7 @@
|
|||||||
#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"
|
||||||
|
|
||||||
@@ -78,6 +79,7 @@ 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);
|
||||||
|
|||||||
@@ -0,0 +1,55 @@
|
|||||||
|
// 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
// 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
|
||||||
@@ -0,0 +1,245 @@
|
|||||||
|
// 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,64 @@
|
|||||||
|
// 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
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
// Copyright (C) 2009 - 2012 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,33 +15,74 @@
|
|||||||
// 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, RTI::ObjectClassHandle& handle, RTI13Ambassador* ambassador) :
|
RTI13ObjectClass::RTI13ObjectClass(HLAObjectClass* hlaObjectClass, const 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()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string
|
bool
|
||||||
RTI13ObjectClass::getName() const
|
RTI13ObjectClass::resolveAttributeIndex(const std::string& name, unsigned index)
|
||||||
{
|
{
|
||||||
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 std::string();
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
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
|
||||||
@@ -50,121 +91,8 @@ 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 std::set<unsigned>& indexSet)
|
RTI13ObjectClass::publish(const HLAIndexList& indexList)
|
||||||
{
|
{
|
||||||
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.");
|
||||||
@@ -172,8 +100,9 @@ RTI13ObjectClass::publish(const std::set<unsigned>& indexSet)
|
|||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
std::auto_ptr<RTI::AttributeHandleSet> attributeHandleSet(RTI::AttributeHandleSetFactory::create(indexSet.size()));
|
unsigned numAttributes = getNumAttributes();
|
||||||
for (std::set<unsigned>::const_iterator i = indexSet.begin(); i != indexSet.end(); ++i) {
|
std::auto_ptr<RTI::AttributeHandleSet> attributeHandleSet(RTI::AttributeHandleSetFactory::create(numAttributes));
|
||||||
|
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;
|
||||||
@@ -183,10 +112,6 @@ RTI13ObjectClass::publish(const std::set<unsigned>& indexSet)
|
|||||||
|
|
||||||
_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);
|
||||||
@@ -229,10 +154,6 @@ 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);
|
||||||
@@ -265,7 +186,7 @@ RTI13ObjectClass::unpublish()
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
RTI13ObjectClass::subscribe(const std::set<unsigned>& indexSet, bool active)
|
RTI13ObjectClass::subscribe(const HLAIndexList& indexList, 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.");
|
||||||
@@ -273,9 +194,9 @@ RTI13ObjectClass::subscribe(const std::set<unsigned>& indexSet, bool active)
|
|||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
std::auto_ptr<RTI::AttributeHandleSet> attributeHandleSet(RTI::AttributeHandleSetFactory::create(indexSet.size()));
|
unsigned numAttributes = getNumAttributes();
|
||||||
for (std::set<unsigned>::const_iterator i = indexSet.begin();
|
std::auto_ptr<RTI::AttributeHandleSet> attributeHandleSet(RTI::AttributeHandleSetFactory::create(numAttributes));
|
||||||
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::subscribe(): Invalid attribute index!");
|
SG_LOG(SG_NETWORK, SG_WARN, "RTI13ObjectClass::subscribe(): Invalid attribute index!");
|
||||||
continue;
|
continue;
|
||||||
@@ -285,10 +206,6 @@ RTI13ObjectClass::subscribe(const std::set<unsigned>& indexSet, 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);
|
||||||
@@ -328,10 +245,6 @@ 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);
|
||||||
@@ -376,7 +289,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(), true);
|
RTI13ObjectInstance* objectInstance = new RTI13ObjectInstance(objectHandle, hlaObjectInstance, this, _ambassador.get());
|
||||||
federate->insertObjectInstance(objectInstance);
|
federate->insertObjectInstance(objectInstance);
|
||||||
return objectInstance;
|
return objectInstance;
|
||||||
} catch (RTI::ObjectClassNotDefined& e) {
|
} catch (RTI::ObjectClassNotDefined& e) {
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
// Copyright (C) 2009 - 2012 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,17 +37,15 @@ class RTIObjectInstance;
|
|||||||
|
|
||||||
class RTI13ObjectClass : public RTIObjectClass {
|
class RTI13ObjectClass : public RTIObjectClass {
|
||||||
public:
|
public:
|
||||||
RTI13ObjectClass(HLAObjectClass* hlaObjectClass, RTI::ObjectClassHandle& handle, RTI13Ambassador* ambassador);
|
RTI13ObjectClass(HLAObjectClass* hlaObjectClass, const RTI::ObjectClassHandle& handle, RTI13Ambassador* ambassador);
|
||||||
virtual ~RTI13ObjectClass();
|
virtual ~RTI13ObjectClass();
|
||||||
|
|
||||||
const RTI::ObjectClassHandle& getHandle() const
|
const RTI::ObjectClassHandle& getHandle() const
|
||||||
{ return _handle; }
|
{ return _handle; }
|
||||||
|
|
||||||
virtual std::string getName() const;
|
virtual bool resolveAttributeIndex(const std::string& name, unsigned index);
|
||||||
|
|
||||||
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
|
||||||
{
|
{
|
||||||
@@ -63,10 +61,10 @@ public:
|
|||||||
return _attributeHandleVector[index];
|
return _attributeHandleVector[index];
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool publish(const std::set<unsigned>& indexSet);
|
virtual bool publish(const HLAIndexList& indexList);
|
||||||
virtual bool unpublish();
|
virtual bool unpublish();
|
||||||
|
|
||||||
virtual bool subscribe(const std::set<unsigned>& indexSet, bool);
|
virtual bool subscribe(const HLAIndexList& indexList, bool);
|
||||||
virtual bool unsubscribe();
|
virtual bool unsubscribe();
|
||||||
|
|
||||||
virtual RTIObjectInstance* registerObjectInstance(HLAObjectInstance* hlaObjectInstance);
|
virtual RTIObjectInstance* registerObjectInstance(HLAObjectInstance* hlaObjectInstance);
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
// Copyright (C) 2009 - 2012 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,20 +15,26 @@
|
|||||||
// 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* hlaObjectInstance,
|
RTI13ObjectInstance::RTI13ObjectInstance(const RTI::ObjectHandle& handle, HLAObjectInstance* objectInstance,
|
||||||
const RTI13ObjectClass* objectClass, RTI13Ambassador* ambassador, bool owned) :
|
const RTI13ObjectClass* objectClass, RTI13Ambassador* ambassador) :
|
||||||
RTIObjectInstance(hlaObjectInstance),
|
RTIObjectInstance(objectInstance),
|
||||||
_handle(handle),
|
_handle(handle),
|
||||||
_objectClass(objectClass),
|
_objectClass(objectClass),
|
||||||
_ambassador(ambassador),
|
_ambassador(ambassador),
|
||||||
_attributeValuePairSet(RTI::AttributeSetFactory::create(objectClass->getNumAttributes()))
|
_attributeValuePairSet(RTI::AttributeSetFactory::create(objectClass->getNumAttributes()))
|
||||||
{
|
{
|
||||||
updateAttributesFromClass(owned);
|
_setNumAttributes(getNumAttributes());
|
||||||
}
|
}
|
||||||
|
|
||||||
RTI13ObjectInstance::~RTI13ObjectInstance()
|
RTI13ObjectInstance::~RTI13ObjectInstance()
|
||||||
@@ -177,82 +183,80 @@ RTI13ObjectInstance::localDeleteObjectInstance()
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
RTI13ObjectInstance::reflectAttributeValues(RTI13AttributeHandleDataPairList& attributeHandleDataPairList, const RTIData& tag)
|
RTI13ObjectInstance::reflectAttributeValues(RTI13AttributeHandleDataPairList& attributeHandleDataPairList,
|
||||||
|
const RTIData& tag, HLAIndexList& indexPool)
|
||||||
{
|
{
|
||||||
// Retrieve an empty update struct from the memory pool
|
HLAIndexList reflectedIndices;
|
||||||
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);
|
||||||
// Get a RTIData from the data pool
|
_attributeData[index]._data.swap(i->second);
|
||||||
getDataFromPool(indexDataPairList);
|
|
||||||
indexDataPairList.back().first = index;
|
if (indexPool.empty())
|
||||||
indexDataPairList.back().second.swap(i->second);
|
reflectedIndices.push_back(index);
|
||||||
|
else {
|
||||||
|
reflectedIndices.splice(reflectedIndices.end(), indexPool, indexPool.begin());
|
||||||
|
reflectedIndices.back() = index;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
RTIObjectInstance::reflectAttributeValues(indexDataPairList, tag);
|
RTIObjectInstance::reflectAttributeValues(reflectedIndices, tag);
|
||||||
|
|
||||||
RTIIndexDataPairList::iterator j = indexDataPairList.begin();
|
// Return the index list to the pool
|
||||||
for (RTI13AttributeHandleDataPairList::iterator i = attributeHandleDataPairList.begin();
|
indexPool.splice(indexPool.end(), reflectedIndices);
|
||||||
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)
|
const SGTimeStamp& timeStamp, const RTIData& tag, HLAIndexList& indexPool)
|
||||||
{
|
{
|
||||||
// Retrieve an empty update struct from the memory pool
|
HLAIndexList reflectedIndices;
|
||||||
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);
|
||||||
// Get a RTIData from the data pool
|
_attributeData[index]._data.swap(i->second);
|
||||||
getDataFromPool(indexDataPairList);
|
|
||||||
indexDataPairList.back().first = index;
|
if (indexPool.empty())
|
||||||
indexDataPairList.back().second.swap(i->second);
|
reflectedIndices.push_back(index);
|
||||||
|
else {
|
||||||
|
reflectedIndices.splice(reflectedIndices.end(), indexPool, indexPool.begin());
|
||||||
|
reflectedIndices.back() = index;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
RTIObjectInstance::reflectAttributeValues(indexDataPairList, timeStamp, tag);
|
RTIObjectInstance::reflectAttributeValues(reflectedIndices, timeStamp, tag);
|
||||||
|
|
||||||
RTIIndexDataPairList::iterator j = indexDataPairList.begin();
|
// Return the index list to the pool
|
||||||
for (RTI13AttributeHandleDataPairList::iterator i = attributeHandleDataPairList.begin();
|
indexPool.splice(indexPool.end(), reflectedIndices);
|
||||||
i != attributeHandleDataPairList.end(); ++i, ++j) {
|
|
||||||
i->second.swap(j->second);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Return the update data back to the pool
|
|
||||||
putDataToPool(indexDataPairList);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
RTI13ObjectInstance::requestObjectAttributeValueUpdate()
|
RTI13ObjectInstance::requestObjectAttributeValueUpdate(const HLAIndexList& indexList)
|
||||||
{
|
{
|
||||||
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 (unsigned i = 0; i < numAttributes; ++i) {
|
for (HLAIndexList::const_iterator i = indexList.begin(); i != indexList.end(); ++i) {
|
||||||
if (!getRequestAttributeUpdate(i))
|
if (getAttributeOwned(*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);
|
||||||
@@ -288,7 +292,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]);
|
||||||
setAttributeForceUpdate(index);
|
_attributeData[index]._dirty = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -306,15 +310,9 @@ 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 (!getAttributeEffectiveUpdateEnabled(i))
|
if (!_attributeData[i]._dirty)
|
||||||
continue;
|
continue;
|
||||||
const HLADataElement* dataElement = getDataElement(i);
|
const RTIData& data = _attributeData[i]._data;
|
||||||
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());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -324,7 +322,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) {
|
||||||
setAttributeUpdated(i);
|
_attributeData[i]._dirty = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (RTI::ObjectNotKnown& e) {
|
} catch (RTI::ObjectNotKnown& e) {
|
||||||
@@ -363,15 +361,9 @@ 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 (!getAttributeEffectiveUpdateEnabled(i))
|
if (!_attributeData[i]._dirty)
|
||||||
continue;
|
continue;
|
||||||
const HLADataElement* dataElement = getDataElement(i);
|
const RTIData& data = _attributeData[i]._data;
|
||||||
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());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -381,7 +373,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) {
|
||||||
setAttributeUpdated(i);
|
_attributeData[i]._dirty = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (RTI::ObjectNotKnown& e) {
|
} catch (RTI::ObjectNotKnown& e) {
|
||||||
@@ -448,6 +440,48 @@ 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)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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, bool owned);
|
RTI13ObjectInstance(const RTI::ObjectHandle& handle, HLAObjectInstance* hlaObjectInstance, const RTI13ObjectClass* objectClass, RTI13Ambassador* ambassador);
|
||||||
virtual ~RTI13ObjectInstance();
|
virtual ~RTI13ObjectInstance();
|
||||||
|
|
||||||
const RTI::ObjectHandle& getHandle() const
|
const RTI::ObjectHandle& getHandle() const
|
||||||
@@ -55,8 +55,6 @@ 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
|
||||||
@@ -68,14 +66,18 @@ 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, const RTIData& tag);
|
void reflectAttributeValues(RTI13AttributeHandleDataPairList& attributeHandleDataPairList,
|
||||||
void reflectAttributeValues(RTI13AttributeHandleDataPairList& attributeHandleDataPairList, const SGTimeStamp& timeStamp, const RTIData& tag);
|
const RTIData& tag, HLAIndexList& indexPool);
|
||||||
virtual void requestObjectAttributeValueUpdate();
|
void reflectAttributeValues(RTI13AttributeHandleDataPairList& attributeHandleDataPairList,
|
||||||
|
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,4 +1,4 @@
|
|||||||
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
// Copyright (C) 2009 - 2012 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,6 +15,12 @@
|
|||||||
// 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 {
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright (C) 2009 - 2011 Mathias Froehlich - Mathias.Froehlich@web.de
|
// Copyright (C) 2009 - 2012 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,6 +20,7 @@
|
|||||||
|
|
||||||
#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"
|
||||||
|
|
||||||
@@ -79,7 +80,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) = 0;
|
virtual RTIInteractionClass* createInteractionClass(const std::string& name, HLAInteractionClass* interactionClass) = 0;
|
||||||
|
|
||||||
virtual RTIObjectInstance* getObjectInstance(const std::string& name) = 0;
|
virtual RTIObjectInstance* getObjectInstance(const std::string& name) = 0;
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
// PathOptions.cxx -- make an osgDB Options object from a path
|
// Copyright (C) 2011 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||||
// Copyright (C) 2007 Tim Moore timoore@redhat.com
|
|
||||||
//
|
//
|
||||||
// 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,23 +14,30 @@
|
|||||||
// along with this program; if not, write to the Free Software
|
// along with this program; if not, write to the Free Software
|
||||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
//
|
//
|
||||||
// $Id$
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
#ifdef HAVE_CONFIG_H
|
||||||
# include <simgear_config.h>
|
# include <simgear_config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <osgDB/Registry>
|
#include <simgear/compiler.h>
|
||||||
|
|
||||||
#include "PathOptions.hxx"
|
#include "RTIFederateFactory.hxx"
|
||||||
|
|
||||||
using namespace simgear;
|
#include "RTIFederateFactoryRegistry.hxx"
|
||||||
|
|
||||||
osgDB::ReaderWriter::Options* simgear::makeOptionsFromPath(const SGPath& path)
|
namespace simgear {
|
||||||
|
|
||||||
|
RTIFederateFactory::~RTIFederateFactory()
|
||||||
{
|
{
|
||||||
using namespace osgDB;
|
}
|
||||||
ReaderWriter::Options *options
|
|
||||||
= new ReaderWriter::Options(*(Registry::instance()->getOptions()));
|
void
|
||||||
options->setDatabasePath(path.str());
|
RTIFederateFactory::_registerAtFactory()
|
||||||
return options;
|
{
|
||||||
|
SGSharedPtr<RTIFederateFactoryRegistry> registry = RTIFederateFactoryRegistry::instance();
|
||||||
|
if (!registry.valid())
|
||||||
|
return;
|
||||||
|
registry->registerFactory(this);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
// 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
|
||||||
@@ -0,0 +1,66 @@
|
|||||||
|
// 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,54 @@
|
|||||||
|
// 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
|
||||||
@@ -1,5 +1,4 @@
|
|||||||
// PathOptions.hxx -- make an osgDB Options object from a path
|
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||||
// Copyright (C) 2007 Tim Moore timoore@redhat.com
|
|
||||||
//
|
//
|
||||||
// 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,17 +14,25 @@
|
|||||||
// along with this program; if not, write to the Free Software
|
// along with this program; if not, write to the Free Software
|
||||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
//
|
//
|
||||||
// $Id$
|
|
||||||
|
|
||||||
#ifndef PATHOPTIONSHXX
|
#ifdef HAVE_CONFIG_H
|
||||||
#define PATHOPTIONSHXX 1
|
# include <simgear_config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <osgDB/ReaderWriter>
|
#include <simgear/compiler.h>
|
||||||
#include <simgear/misc/sg_path.hxx>
|
|
||||||
|
|
||||||
namespace simgear
|
#include "RTIInteractionClass.hxx"
|
||||||
|
|
||||||
|
namespace simgear {
|
||||||
|
|
||||||
|
RTIInteractionClass::RTIInteractionClass(HLAInteractionClass* interactionClass) :
|
||||||
|
_interactionClass(interactionClass)
|
||||||
{
|
{
|
||||||
osgDB::ReaderWriter::Options* makeOptionsFromPath(const SGPath&);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
RTIInteractionClass::~RTIInteractionClass()
|
||||||
|
{
|
||||||
|
_interactionClass = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
// Copyright (C) 2009 - 2012 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,44 +18,33 @@
|
|||||||
#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(const std::string& name);
|
RTIInteractionClass(HLAInteractionClass* interactionClass);
|
||||||
virtual ~RTIInteractionClass();
|
virtual ~RTIInteractionClass();
|
||||||
|
|
||||||
const std::string& getName() const
|
virtual bool resolveParameterIndex(const std::string& name, unsigned index) = 0;
|
||||||
{ return _name; }
|
|
||||||
|
|
||||||
virtual unsigned getNumParameters() const = 0;
|
virtual bool publish() = 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(const std::set<unsigned>& indexSet, bool) = 0;
|
virtual bool subscribe(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:
|
||||||
std::string _name;
|
HLAInteractionClass* _interactionClass;
|
||||||
|
|
||||||
|
friend class HLAInteractionClass;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
// Copyright (C) 2009 - 2012 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,14 +15,21 @@
|
|||||||
// 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* hlaObjectClass) :
|
RTIObjectClass::RTIObjectClass(HLAObjectClass* objectClass) :
|
||||||
_hlaObjectClass(hlaObjectClass)
|
_objectClass(objectClass)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -33,35 +40,31 @@ RTIObjectClass::~RTIObjectClass()
|
|||||||
void
|
void
|
||||||
RTIObjectClass::discoverInstance(RTIObjectInstance* objectInstance, const RTIData& tag) const
|
RTIObjectClass::discoverInstance(RTIObjectInstance* objectInstance, const RTIData& tag) const
|
||||||
{
|
{
|
||||||
SGSharedPtr<HLAObjectClass> hlaObjectClass = _hlaObjectClass.lock();
|
if (!_objectClass) {
|
||||||
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;
|
||||||
}
|
}
|
||||||
hlaObjectClass->discoverInstance(objectInstance, tag);
|
_objectClass->_discoverInstance(objectInstance, tag);
|
||||||
objectInstance->requestObjectAttributeValueUpdate();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
RTIObjectClass::startRegistration() const
|
RTIObjectClass::startRegistration() const
|
||||||
{
|
{
|
||||||
SGSharedPtr<HLAObjectClass> hlaObjectClass = _hlaObjectClass.lock();
|
if (!_objectClass) {
|
||||||
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;
|
||||||
}
|
}
|
||||||
hlaObjectClass->startRegistrationCallback();
|
_objectClass->_startRegistration();
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
RTIObjectClass::stopRegistration() const
|
RTIObjectClass::stopRegistration() const
|
||||||
{
|
{
|
||||||
SGSharedPtr<HLAObjectClass> hlaObjectClass = _hlaObjectClass.lock();
|
if (!_objectClass) {
|
||||||
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;
|
||||||
}
|
}
|
||||||
hlaObjectClass->stopRegistrationCallback();
|
_objectClass->_stopRegistration();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
// Copyright (C) 2009 - 2012 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,102 +19,44 @@
|
|||||||
#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* hlaObjectClass);
|
RTIObjectClass(HLAObjectClass* objectClass);
|
||||||
virtual ~RTIObjectClass();
|
virtual ~RTIObjectClass();
|
||||||
|
|
||||||
virtual std::string getName() const = 0;
|
virtual bool resolveAttributeIndex(const std::string& name, unsigned index) = 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 std::set<unsigned>& indexSet) = 0;
|
virtual bool publish(const HLAIndexList& indexList) = 0;
|
||||||
virtual bool unpublish() = 0;
|
virtual bool unpublish() = 0;
|
||||||
|
|
||||||
virtual bool subscribe(const std::set<unsigned>& indexSet, bool) = 0;
|
virtual bool subscribe(const HLAIndexList& indexList, 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;
|
||||||
|
|
||||||
void setAttributeDataType(unsigned index, SGSharedPtr<const HLADataType> dataType)
|
|
||||||
{
|
|
||||||
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();
|
|
||||||
}
|
|
||||||
|
|
||||||
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:
|
private:
|
||||||
SGWeakPtr<HLAObjectClass> _hlaObjectClass;
|
HLAObjectClass* _objectClass;
|
||||||
|
|
||||||
|
friend class HLAObjectClass;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
// Copyright (C) 2009 - 2012 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,6 +15,12 @@
|
|||||||
// 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"
|
||||||
@@ -22,8 +28,7 @@
|
|||||||
namespace simgear {
|
namespace simgear {
|
||||||
|
|
||||||
RTIObjectInstance::RTIObjectInstance(HLAObjectInstance* hlaObjectInstance) :
|
RTIObjectInstance::RTIObjectInstance(HLAObjectInstance* hlaObjectInstance) :
|
||||||
_hlaObjectInstance(hlaObjectInstance),
|
_objectInstance(hlaObjectInstance)
|
||||||
_pendingAttributeUpdateRequest(false)
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -37,54 +42,29 @@ 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)
|
||||||
{
|
{
|
||||||
SGSharedPtr<HLAObjectInstance> hlaObjectInstance = _hlaObjectInstance.lock();
|
if (!_objectInstance)
|
||||||
if (!hlaObjectInstance.valid())
|
|
||||||
return;
|
return;
|
||||||
hlaObjectInstance->removeInstance(tag);
|
_objectInstance->_removeInstance(tag);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
RTIObjectInstance::reflectAttributeValues(const RTIIndexDataPairList& dataPairList, const RTIData& tag)
|
RTIObjectInstance::reflectAttributeValues(const HLAIndexList& indexList, const RTIData& tag)
|
||||||
{
|
{
|
||||||
for (RTIIndexDataPairList::const_iterator i = dataPairList.begin();
|
if (!_objectInstance)
|
||||||
i != dataPairList.end(); ++i) {
|
|
||||||
reflectAttributeValue(i->first, i->second);
|
|
||||||
}
|
|
||||||
|
|
||||||
SGSharedPtr<HLAObjectInstance> hlaObjectInstance = _hlaObjectInstance.lock();
|
|
||||||
if (!hlaObjectInstance.valid())
|
|
||||||
return;
|
return;
|
||||||
hlaObjectInstance->reflectAttributeValues(dataPairList, tag);
|
_objectInstance->_reflectAttributeValues(indexList, tag);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
RTIObjectInstance::reflectAttributeValues(const RTIIndexDataPairList& dataPairList,
|
RTIObjectInstance::reflectAttributeValues(const HLAIndexList& indexList,
|
||||||
const SGTimeStamp& timeStamp, const RTIData& tag)
|
const SGTimeStamp& timeStamp, const RTIData& tag)
|
||||||
{
|
{
|
||||||
for (RTIIndexDataPairList::const_iterator i = dataPairList.begin();
|
if (!_objectInstance)
|
||||||
i != dataPairList.end(); ++i) {
|
|
||||||
reflectAttributeValue(i->first, i->second);
|
|
||||||
}
|
|
||||||
|
|
||||||
SGSharedPtr<HLAObjectInstance> hlaObjectInstance = _hlaObjectInstance.lock();
|
|
||||||
if (!hlaObjectInstance.valid())
|
|
||||||
return;
|
return;
|
||||||
hlaObjectInstance->reflectAttributeValues(dataPairList, timeStamp, tag);
|
_objectInstance->_reflectAttributeValues(indexList, timeStamp, tag);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,13 +18,9 @@
|
|||||||
#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"
|
||||||
@@ -39,247 +35,117 @@ class HLAObjectInstance;
|
|||||||
|
|
||||||
class RTIObjectInstance : public SGReferenced {
|
class RTIObjectInstance : public SGReferenced {
|
||||||
public:
|
public:
|
||||||
RTIObjectInstance(HLAObjectInstance* hlaObjectInstance);
|
RTIObjectInstance(HLAObjectInstance* objectInstance);
|
||||||
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() = 0;
|
virtual void requestObjectAttributeValueUpdate(const HLAIndexList& indexList) = 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 RTIIndexDataPairList& dataPairList, const RTIData& tag);
|
void reflectAttributeValues(const HLAIndexList& indexList, const RTIData& tag);
|
||||||
void reflectAttributeValues(const RTIIndexDataPairList& dataPairList, const SGTimeStamp& timeStamp, const RTIData& tag);
|
void reflectAttributeValues(const HLAIndexList& indexList, const SGTimeStamp& timeStamp, const RTIData& tag);
|
||||||
void reflectAttributeValue(unsigned i, const RTIData& data)
|
|
||||||
|
bool encodeAttributeData(unsigned index, const HLADataElement& dataElement)
|
||||||
{
|
{
|
||||||
if (_attributeData.size() <= i)
|
if (_attributeData.size() <= index)
|
||||||
return;
|
return false;
|
||||||
HLADataElement* dataElement = _attributeData[i]._dataElement.get();
|
return _attributeData[index].encodeAttributeData(dataElement);
|
||||||
if (!dataElement)
|
|
||||||
return;
|
|
||||||
HLADecodeStream stream(data);
|
|
||||||
dataElement->decode(stream);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const HLADataType* getAttributeDataType(unsigned i) const
|
bool decodeAttributeData(unsigned index, HLADataElement& dataElement) const
|
||||||
{
|
{
|
||||||
return getObjectClass()->getAttributeDataType(i);
|
if (_attributeData.size() <= index)
|
||||||
}
|
return false;
|
||||||
HLAUpdateType getAttributeUpdateType(unsigned i) const
|
return _attributeData[index].decodeAttributeData(dataElement);
|
||||||
{
|
|
||||||
return getObjectClass()->getAttributeUpdateType(i);
|
|
||||||
}
|
|
||||||
bool getAttributeSubscribed(unsigned i) const
|
|
||||||
{
|
|
||||||
return getObjectClass()->getAttributeSubscribed(i);
|
|
||||||
}
|
|
||||||
bool getAttributePublished(unsigned i) const
|
|
||||||
{
|
|
||||||
return getObjectClass()->getAttributePublished(i);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
HLADataElement* getDataElement(unsigned i)
|
bool getAttributeData(unsigned index, RTIData& data) const
|
||||||
{
|
{
|
||||||
if (_attributeData.size() <= i)
|
if (_attributeData.size() <= index)
|
||||||
return 0;
|
return false;
|
||||||
return _attributeData[i]._dataElement.get();
|
data = _attributeData[index]._data;
|
||||||
}
|
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void updateAttributesFromClass(bool owned)
|
bool getAttributeOwned(unsigned index) const
|
||||||
{
|
{
|
||||||
// FIXME: rethink that!!!
|
if (_attributeData.size() <= index)
|
||||||
unsigned numAttributes = getNumAttributes();
|
return false;
|
||||||
unsigned i = 0;
|
return _attributeData[index]._owned;
|
||||||
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].setInScope(inScope);
|
_attributeData[i]._inScope = 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].setUpdateEnabled(enabled);
|
_attributeData[i]._updateEnabled = 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
|
||||||
|
void _setNumAttributes(unsigned numAttributes)
|
||||||
|
{
|
||||||
|
_attributeData.resize(numAttributes);
|
||||||
|
for (unsigned i = 0; i < numAttributes; ++i)
|
||||||
|
_attributeData[i]._owned = isAttributeOwnedByFederate(i);
|
||||||
|
}
|
||||||
|
|
||||||
// The backward reference to the user visible object
|
// The backward reference to the user visible object
|
||||||
SGWeakPtr<HLAObjectInstance> _hlaObjectInstance;
|
HLAObjectInstance* _objectInstance;
|
||||||
|
|
||||||
// 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)
|
|
||||||
{
|
|
||||||
// Nothing left in the pool - so allocate something
|
|
||||||
if (_indexDataPairList.empty()) {
|
|
||||||
dataPairList.push_back(RTIIndexDataPairList::value_type());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Take one from the pool
|
|
||||||
dataPairList.splice(dataPairList.end(), _indexDataPairList, _indexDataPairList.begin());
|
|
||||||
}
|
|
||||||
|
|
||||||
void putDataToPool(RTIIndexDataPairList& dataPairList)
|
|
||||||
{
|
|
||||||
_indexDataPairList.splice(_indexDataPairList.begin(), dataPairList);
|
|
||||||
}
|
|
||||||
|
|
||||||
struct AttributeData {
|
struct AttributeData {
|
||||||
AttributeData() : _owned(false), _inScope(true), _updateEnabled(true), _forceUpdate(false), _requestUpdate(false)
|
AttributeData() : _owned(false), _inScope(true), _updateEnabled(true), _dirty(false)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
// The hla level data element with tha actual local program
|
bool encodeAttributeData(const HLADataElement& dataElement)
|
||||||
// accessible data.
|
{
|
||||||
SGSharedPtr<HLADataElement> _dataElement;
|
_dirty = true;
|
||||||
// SGSharedPtr<HLADataElement::TimeStamp> _timeStamp;
|
_data.resize(0);
|
||||||
|
HLAEncodeStream stream(_data);
|
||||||
|
return dataElement.encode(stream);
|
||||||
|
}
|
||||||
|
|
||||||
// Pool of already allocated raw data used for reflection of updates
|
bool decodeAttributeData(HLADataElement& dataElement) const
|
||||||
RTIIndexDataPairList _indexDataPairList;
|
{
|
||||||
|
HLADecodeStream stream(_data);
|
||||||
|
return dataElement.decode(stream);
|
||||||
|
}
|
||||||
|
|
||||||
void setOwned(bool owned)
|
// The rti level raw data element
|
||||||
{ _owned = owned; }
|
RTIData _data;
|
||||||
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;
|
|
||||||
bool _requestUpdate;
|
// Is set to true if _data has be reencoded
|
||||||
|
bool _dirty;
|
||||||
};
|
};
|
||||||
std::vector<AttributeData> _attributeData;
|
std::vector<AttributeData> _attributeData;
|
||||||
|
|
||||||
friend class HLAObjectInstance;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,9 +25,6 @@ using std::string;
|
|||||||
using std::stringstream;
|
using std::stringstream;
|
||||||
using std::vector;
|
using std::vector;
|
||||||
|
|
||||||
//#include <iostream>
|
|
||||||
//using namespace std;
|
|
||||||
|
|
||||||
namespace simgear
|
namespace simgear
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -35,6 +32,7 @@ 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
|
||||||
{
|
{
|
||||||
@@ -103,15 +101,27 @@ 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->url();
|
path = r->scheme() + "://" + r->host() + r->path();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (r->method() == "POST") {
|
||||||
|
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 << r->method() << " " << path << " 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()) {
|
||||||
@@ -123,8 +133,9 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
headerData << "\r\n"; // final CRLF to terminate the headers
|
headerData << "\r\n"; // final CRLF to terminate the headers
|
||||||
|
if (!bodyData.empty()) {
|
||||||
// TODO - add request body support for PUT, etc operations
|
headerData << bodyData;
|
||||||
|
}
|
||||||
|
|
||||||
bool ok = push(headerData.str().c_str());
|
bool ok = push(headerData.str().c_str());
|
||||||
if (!ok) {
|
if (!ok) {
|
||||||
@@ -150,6 +161,10 @@ 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:
|
||||||
@@ -233,6 +248,11 @@ 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;
|
||||||
@@ -327,7 +347,6 @@ 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;
|
||||||
@@ -374,6 +393,7 @@ 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;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -125,6 +125,20 @@ 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());
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ 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;
|
||||||
|
|||||||
@@ -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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
#ifdef HAVE_CONFIG_H
|
||||||
|
|||||||
@@ -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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef SG_IO_SOCKET_HXX
|
#ifndef SG_IO_SOCKET_HXX
|
||||||
|
|||||||
@@ -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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
|
|
||||||
For further information visit http://plib.sourceforge.net
|
For further information visit http://plib.sourceforge.net
|
||||||
|
|
||||||
|
|||||||
@@ -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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
|
|
||||||
For further information visit http://plib.sourceforge.net
|
For further information visit http://plib.sourceforge.net
|
||||||
|
|
||||||
|
|||||||
@@ -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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
|
|
||||||
For further information visit http://plib.sourceforge.net
|
For further information visit http://plib.sourceforge.net
|
||||||
|
|
||||||
|
|||||||
@@ -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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
|
|
||||||
For further information visit http://plib.sourceforge.net
|
For further information visit http://plib.sourceforge.net
|
||||||
|
|
||||||
|
|||||||
@@ -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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
|
|
||||||
For further information visit http://plib.sourceforge.net
|
For further information visit http://plib.sourceforge.net
|
||||||
|
|
||||||
|
|||||||
@@ -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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
|
|
||||||
For further information visit http://plib.sourceforge.net
|
For further information visit http://plib.sourceforge.net
|
||||||
|
|
||||||
|
|||||||
+130
-5
@@ -46,8 +46,8 @@ public:
|
|||||||
bool failed;
|
bool failed;
|
||||||
string bodyData;
|
string bodyData;
|
||||||
|
|
||||||
TestRequest(const std::string& url) :
|
TestRequest(const std::string& url, const std::string method = "GET") :
|
||||||
HTTP::Request(url),
|
HTTP::Request(url, method),
|
||||||
complete(false)
|
complete(false)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@@ -133,6 +133,13 @@ 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();
|
||||||
@@ -144,8 +151,8 @@ public:
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
int colonPos = buffer.find(':');
|
string::size_type colonPos = buffer.find(':');
|
||||||
if (colonPos < 0) {
|
if (colonPos == string::npos) {
|
||||||
cerr << "malformed HTTP response header:" << buffer << endl;
|
cerr << "malformed HTTP response header:" << buffer << endl;
|
||||||
buffer.clear();
|
buffer.clear();
|
||||||
return;
|
return;
|
||||||
@@ -156,7 +163,25 @@ 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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -172,6 +197,14 @@ 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"));
|
||||||
@@ -239,8 +272,53 @@ 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, true, "");
|
sendErrorResponse(404, false, "");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -273,6 +351,7 @@ 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";
|
||||||
}
|
}
|
||||||
@@ -284,6 +363,8 @@ 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
|
||||||
@@ -375,6 +456,16 @@ int main(int argc, char* argv[])
|
|||||||
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);
|
||||||
@@ -405,6 +496,7 @@ 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);
|
||||||
@@ -430,6 +522,16 @@ 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
|
||||||
{
|
{
|
||||||
@@ -536,6 +638,29 @@ 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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
#if defined _MSC_VER || defined _WIN32_WINNT
|
||||||
# define random rand
|
# define random rand
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ include (SimGearComponent)
|
|||||||
|
|
||||||
|
|
||||||
set(HEADERS
|
set(HEADERS
|
||||||
Math.hxx
|
|
||||||
SGBox.hxx
|
SGBox.hxx
|
||||||
SGCMath.hxx
|
SGCMath.hxx
|
||||||
SGGeoc.hxx
|
SGGeoc.hxx
|
||||||
@@ -30,15 +29,14 @@ 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}")
|
||||||
|
|||||||
@@ -1,23 +0,0 @@
|
|||||||
#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
|
|
||||||
@@ -1,59 +0,0 @@
|
|||||||
// 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
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user