From: <he...@us...> - 2015-09-12 01:48:26
|
Revision: 399 http://sourceforge.net/p/simspark/svn/399 Author: hedayat Date: 2015-09-12 01:48:23 +0000 (Sat, 12 Sep 2015) Log Message: ----------- Add sparkgui and guiplugin to rcssserver3d and update CMake files Modified Paths: -------------- trunk/rcssserver3d/AUTHORS trunk/rcssserver3d/CMakeLists.txt trunk/rcssserver3d/cmake/FindSpark.cmake trunk/rcssserver3d/data/scripts/bindings.rb trunk/rcssserver3d/doc/Doxyfile.in trunk/rcssserver3d/plugin/CMakeLists.txt trunk/rcssserver3d/plugin/soccer/CMakeLists.txt trunk/rcssserver3d/plugin/soccer/rcs3dmonitor/rcs3dmonitor.h trunk/rcssserver3d/plugin/soccer/sexpmonitor/sexpmonitor.h trunk/rcssserver3d/plugin/soccermonitor/CMakeLists.txt trunk/rcssserver3d/rcssagent3d/CMakeLists.txt trunk/rcssserver3d/rcssmonitor3d/CMakeLists.txt trunk/rcssserver3d/rcssserver3d/CMakeLists.txt trunk/simspark-utilities/cmake/FindSpark.cmake Added Paths: ----------- trunk/rcssserver3d/cmake/FindCarbon.cmake trunk/rcssserver3d/guiplugin/ trunk/rcssserver3d/guiplugin/CMakeLists.txt trunk/rcssserver3d/guiplugin/soccercontrolframe/ trunk/rcssserver3d/guiplugin/soccercontrolframe/CMakeLists.txt trunk/rcssserver3d/guiplugin/soccercontrolframe/export.h trunk/rcssserver3d/guiplugin/soccercontrolframe/soccercontrolframe.cpp trunk/rcssserver3d/guiplugin/soccercontrolframe/soccercontrolframe.h trunk/rcssserver3d/guiplugin/soccercontrolframe/soccercontrolframe.ui trunk/rcssserver3d/guiplugin/soccercontrolframe/soccercontrolframe_soccercommands.cpp trunk/rcssserver3d/guiplugin/soccercontrolframe/soccercontrolframe_soccercommands.h trunk/rcssserver3d/sparkgui/ trunk/rcssserver3d/sparkgui/CMakeLists.txt trunk/rcssserver3d/sparkgui/internalsoccerbindingsgui.rb trunk/rcssserver3d/sparkgui/internalsoccermonitorgui.rb trunk/rcssserver3d/sparkgui/main.cpp trunk/rcssserver3d/sparkgui/naosoccersimgui.rb trunk/rcssserver3d/sparkgui/rcssserver3dintegrated.rb trunk/rcssserver3d/sparkgui/rcssserver3dinternal.rb trunk/rcssserver3d/sparkgui/soccersimgui.rb trunk/rcssserver3d/sparkgui/sparkgui_config.h.cmake Modified: trunk/rcssserver3d/AUTHORS =================================================================== --- trunk/rcssserver3d/AUTHORS 2015-09-12 01:47:34 UTC (rev 398) +++ trunk/rcssserver3d/AUTHORS 2015-09-12 01:48:23 UTC (rev 399) @@ -11,6 +11,7 @@ Joschka Bödecker <jbo...@un...> Christoph Ringelstein <cr...@un...> Hesham Ebrahimi <hes...@gm...> +Patrick Geib <pg...@un...> Also see files ChangeLog and THANKS. Modified: trunk/rcssserver3d/CMakeLists.txt =================================================================== --- trunk/rcssserver3d/CMakeLists.txt 2015-09-12 01:47:34 UTC (rev 398) +++ trunk/rcssserver3d/CMakeLists.txt 2015-09-12 01:48:23 UTC (rev 399) @@ -31,6 +31,8 @@ find_package(DevIL REQUIRED) find_package(ODE REQUIRED) find_package(OpenGL REQUIRED) +find_package(Carbon) +find_package(Qt4 COMPONENTS QtXml QtOpenGl QtGui QtCore) ########## add extra flags ########## if(NOT CMAKE_BUILD_TYPE) @@ -40,11 +42,11 @@ add_definitions(-DHAVE_CONFIG_H ${ODE_CFLAGS}) include_directories(${CMAKE_BINARY_DIR} ${Boost_INCLUDE_DIRS} ${ODE_INCLUDE_DIR} ${SPARK_INCLUDE_DIR} ${SALT_INCLUDE_DIR} ${ZEITGEIST_INCLUDE_DIR} - ${OXYGEN_INCLUDE_DIR} ${KEROSIN_INCLUDE_DIR}) + ${OXYGEN_INCLUDE_DIR} ${KEROSIN_INCLUDE_DIR} ${CARBON_INCLUDE_DIR}) link_directories(${Boost_LIBRARY_DIRS}) if (UNIX) - set(CMAKE_CXX_FLAGS $ENV{CXXFLAGS} CACHE + set(CMAKE_CXX_FLAGS $ENV{CXXFLAGS} "-std=gnu++11" CACHE STRING "Common C++ compiler flags" FORCE) set(CMAKE_CXX_FLAGS_DEBUG "-O0 -g -W -Wall -Woverloaded-virtual" CACHE STRING "C++ compiler flags for Debug builds" FORCE) @@ -69,6 +71,8 @@ set(CMAKE_SHARED_MODULE_PREFIX "") mark_as_advanced(BINDIR LIBDIR DATADIR INCLUDEDIR) + +set(GUI_DATA_DIR ${DATADIR}/carbon) ########## generate configuration file ########## if (APPLE) @@ -82,15 +86,34 @@ configure_file(${CMAKE_CURRENT_SOURCE_DIR}/rcssserver3d_config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/rcssserver3d_config.h) + +########## Additional variables for config files ########## +if (CARBON_FOUND) + set(carbondatadir ${CARBON_DATA_DIR}) + set(carbonlayoutlibdir ${CARBON_ROOT_DIR}/lib/guilayout) + set(carbonpluginlibdir ${CARBON_ROOT_DIR}/lib/guiplugin) + set(guipluginlibdir ${CMAKE_INSTALL_PREFIX}/lib/guiplugin) + set(GUI_PLUGIN_INCLUDE_DIR include/guiplugin) + + set(carbonsetupdir ${carbondatadir}/setups) + set(carbonscriptdir ${carbondatadir}/scripts) + set(sparkscriptdir ${CARBON_ROOT_DIR}/${DATADIR}/simspark) +endif (CARBON_FOUND) + ########## add subdirectories ############ +set(PLUGIN_INCLUDE_DIR ${PROJECT_SOURCE_DIR}/plugin) + add_subdirectory(data) add_subdirectory(doc) add_subdirectory(plugin) add_subdirectory(rcssagent3d) add_subdirectory(rcssmonitor3d) add_subdirectory(rcssserver3d) +if (CARBON_FOUND) + add_subdirectory(guiplugin) + add_subdirectory(sparkgui) +endif (CARBON_FOUND) - ########### install files ############### install(FILES AUTHORS ChangeLog COPYING NEWS README THANKS TODO Added: trunk/rcssserver3d/cmake/FindCarbon.cmake =================================================================== --- trunk/rcssserver3d/cmake/FindCarbon.cmake (rev 0) +++ trunk/rcssserver3d/cmake/FindCarbon.cmake 2015-09-12 01:48:23 UTC (rev 399) @@ -0,0 +1,51 @@ +# - Find Carbon +# Find the native Carbon includes and libraries +# +# CARBON_INCLUDE_DIR - where to find carbon include files +# CARBON_LIB_DIR - where to find carbon libraries +# CARBON_LIBRARIES - list of libraries when using carbon (contains first found carbon lib, debug or release) +# CARBON_LIBRARY_DEBUG - carbon debug library +# CARBON_LIBRARY_RELEASE - carbon release library +# CARBON_FOUND - true if a carbon library was found + +# Carbon section +IF (CARBON_INCLUDE_DIR) + # Already in cache, be silent + SET(CARBON_FIND_QUIETLY TRUE) +ENDIF (CARBON_INCLUDE_DIR) + +SET(CARBON_DIR $ENV{CARBON_DIR} "C:/Program Files/simspark" "C:/Program Files (x86)/simspark" "C:/library/simspark") + +FIND_PATH(CARBON_INCLUDE_DIR carbon/carbon.h + PATHS ${CARBON_DIR} + PATH_SUFFIXES simspark include/simspark) + +FIND_PATH(CARBON_ROOT_DIR share/carbon/setups/DefaultSetupGrid.xml + PATHS ${CARBON_DIR}) + +FIND_PATH(CARBON_DATA_DIR setups/DefaultSetupGrid.xml + PATHS ${CARBON_DIR} + PATH_SUFFIXES share/carbon) + +SET(CARBON_NAMES carbon carbon_debug) +FIND_LIBRARY(CARBON_LIBRARY NAMES ${CARBON_NAMES} + PATHS ${CARBON_DIR} + PATH_SUFFIXES simspark lib/simspark) + +GET_FILENAME_COMPONENT(CARBON_LIB_DIR ${CARBON_LIBRARY} PATH) + +# handle the QUIETLY and REQUIRED arguments and set CARBON_FOUND to TRUE if +# all listed variables are TRUE +INCLUDE(FindPackageHandleStandardArgs) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(CARBON DEFAULT_MSG CARBON_LIBRARY + CARBON_INCLUDE_DIR) + +IF(CARBON_FOUND) + SET( CARBON_LIBRARIES ${CARBON_LIBRARY} ) + STRING(REPLACE "carbon." "carbon_debug." CARBON_LIBRARY_DEBUG ${CARBON_LIBRARY}) + STRING(REPLACE "carbon_debug." "carbon." CARBON_LIBRARY_RELEASE ${CARBON_LIBRARY}) +ELSE(CARBON_FOUND) + SET( CARBON_LIBRARIES ) +ENDIF(CARBON_FOUND) + +MARK_AS_ADVANCED( CARBON_PLUGIN_LIB_DIR CARBON_LAYOUT_LIB_DIR CARBON_DIR CARBON_LIBRARY CARBON_LIBRARY_RELEASE CARBON_LIBRARY_DEBUG CARBON_INCLUDE_DIR ) Modified: trunk/rcssserver3d/cmake/FindSpark.cmake =================================================================== --- trunk/rcssserver3d/cmake/FindSpark.cmake 2015-09-12 01:47:34 UTC (rev 398) +++ trunk/rcssserver3d/cmake/FindSpark.cmake 2015-09-12 01:48:23 UTC (rev 399) @@ -1,25 +1,39 @@ # - Find Spark # Find the native Spark includes and libraries # -# SPARK_INCLUDE_DIR - where to find spark include files -# SPARK_LIB_DIR - where to find spark libraries -# SPARK_LIBRARIES - List of libraries when using spark. -# SPARK_FOUND - True if spark found. -# SALT_INCLUDE_DIR - where to find salt include files -# SALT_LIBRARIES - List of libraries when using salt. -# SALT_FOUND - True if salt found. -# ZEITGEIST_INCLUDE_DIR - where to find zeitgeist include files -# ZEITGEIST_LIBRARIES - List of libraries when using zeitgeist. -# ZEITGEIST_FOUND - True if zeitgeist found. -# OXYGEN_INCLUDE_DIR - where to find oxygen include files -# OXYGEN_LIBRARIES - List of libraries when using oxygen. -# OXYGEN_FOUND - True if oxygen found. -# KEROSIN_INCLUDE_DIR - where to find kerosin include files -# KEROSIN_LIBRARIES - List of libraries when using kerosin. -# KEROSIN_FOUND - True if kerosin found. -# RCSSNET3D_INCLUDE_DIR - where to find kerosin include files -# RCSSNET3D_LIBRARIES - List of libraries when using kerosin. -# RCSSNET3D_FOUND - True if kerosin found. +# SPARK_INCLUDE_DIR - where to find spark include files +# SPARK_LIB_DIR - where to find spark libraries +# SPARK_LIBRARIES - list of libraries when using spark (contains first found spark lib, debug or release) +# SPARK_LIBRARY_DEBUG - spark debug library +# SPARK_LIBRARY_RELEASE - spark release library +# SPARK_FOUND - true if a spark library was found +# SALT_INCLUDE_DIR - where to find salt include files +# SALT_LIB_DIR - where to find salt libraries +# SALT_LIBRARIES - list of libraries when using salt (contains first found salt lib, debug or release) +# SALT_LIBRARY_DEBUG - salt debug library +# SALT_LIBRARY_RELEASE - salt release library +# SALT_FOUND - true if a salt library was found +# KEROSIN_INCLUDE_DIR - where to find spark include files +# KEROSIN_LIB_DIR - where to find spark libraries +# KEROSIN_LIBRARIES - list of libraries when using spark (contains first found spark lib, debug or release) +# KEROSIN_LIBRARY_DEBUG - spark debug library +# KEROSIN_LIBRARY_RELEASE - spark release library +# KEROSIN_FOUND - true if a spark library was found +# ZEITGEIST_INCLUDE_DIR - where to find zeitgeist include files +# ZEITGEIST_LIB_DIR - where to find zeitgeist libraries +# ZEITGEIST_LIBRARIES - list of libraries when using zeitgeist (contains first found zeitgeist lib, debug or release) +# ZEITGEIST_LIBRARY_DEBUG - zeitgeist debug library +# ZEITGEIST_LIBRARY_RELEASE - zeitgeist release library +# ZEITGEIST_FOUND - true if a zeitgeist library was found +# OXYGEN_INCLUDE_DIR - where to find oxygen include files +# OXYGEN_LIB_DIR - where to find oxygen libraries +# OXYGEN_LIBRARIES - list of libraries when using oxygen (contains first found oxygen lib, debug or release) +# OXYGEN_LIBRARY_DEBUG - oxygen debug library +# OXYGEN_LIBRARY_RELEASE - oxygen release library +# OXYGEN_FOUND - true if a oxygen library was found +# RCSSNET3D_INCLUDE_DIR - where to find rcssnet include files +# RCSSNET3D_LIBRARIES - List of libraries when using rcssnet. +# RCSSNET3D_FOUND - True if rcssnet found. # Spark section IF (SPARK_INCLUDE_DIR) @@ -30,16 +44,16 @@ SET(SPARK_DIR $ENV{SPARK_DIR} "C:/Program Files/simspark" "C:/Program Files (x86)/simspark" "C:/library/simspark") FIND_PATH(SPARK_INCLUDE_DIR spark/spark.h - HINTS ${SPARK_DIR} + PATHS ${SPARK_DIR} PATH_SUFFIXES simspark include/simspark) SET(SPARK_NAMES spark spark_debug) FIND_LIBRARY(SPARK_LIBRARY NAMES ${SPARK_NAMES} - HINTS ${SPARK_DIR} + PATHS ${SPARK_DIR} PATH_SUFFIXES simspark lib/simspark) GET_FILENAME_COMPONENT(SPARK_LIB_DIR ${SPARK_LIBRARY} PATH) -# handle the QUIETLY and REQUIRED arguments and set SPARK_FOUND to TRUE if +# handle the QUIETLY and REQUIRED arguments and set SPARK_FOUND to TRUE if # all listed variables are TRUE INCLUDE(FindPackageHandleStandardArgs) FIND_PACKAGE_HANDLE_STANDARD_ARGS(SPARK DEFAULT_MSG SPARK_LIBRARY @@ -47,11 +61,13 @@ IF(SPARK_FOUND) SET( SPARK_LIBRARIES ${SPARK_LIBRARY} ) + STRING(REPLACE "spark." "spark_debug." SPARK_LIBRARY_DEBUG ${SPARK_LIBRARY}) + STRING(REPLACE "spark_debug." "spark." SPARK_LIBRARY_RELEASE ${SPARK_LIBRARY}) ELSE(SPARK_FOUND) SET( SPARK_LIBRARIES ) ENDIF(SPARK_FOUND) -MARK_AS_ADVANCED( SPARK_LIBRARY SPARK_INCLUDE_DIR ) +MARK_AS_ADVANCED( SPARK_LIBRARY SPARK_LIBRARY_RELEASE SPARK_LIBRARY_DEBUG SPARK_INCLUDE_DIR ) # Salt section IF (SALT_INCLUDE_DIR) @@ -60,15 +76,15 @@ ENDIF (SALT_INCLUDE_DIR) FIND_PATH(SALT_INCLUDE_DIR salt/salt.h - HINTS ${SPARK_DIR} + PATHS ${SPARK_DIR} PATH_SUFFIXES simspark include/simspark) SET(SALT_NAMES salt salt_debug) FIND_LIBRARY(SALT_LIBRARY NAMES ${SALT_NAMES} - HINTS ${SPARK_DIR} + PATHS ${SPARK_DIR} PATH_SUFFIXES simspark lib/simspark) -# handle the QUIETLY and REQUIRED arguments and set SALT_FOUND to TRUE if +# handle the QUIETLY and REQUIRED arguments and set SALT_FOUND to TRUE if # all listed variables are TRUE INCLUDE(FindPackageHandleStandardArgs) FIND_PACKAGE_HANDLE_STANDARD_ARGS(SALT DEFAULT_MSG SALT_LIBRARY @@ -76,11 +92,13 @@ IF(SALT_FOUND) SET( SALT_LIBRARIES ${SALT_LIBRARY} ) + STRING(REPLACE "salt." "salt_debug." SALT_LIBRARY_DEBUG ${SALT_LIBRARY}) + STRING(REPLACE "salt_debug." "salt." SALT_LIBRARY_RELEASE ${SALT_LIBRARY}) ELSE(SALT_FOUND) SET( SALT_LIBRARIES ) ENDIF(SALT_FOUND) -MARK_AS_ADVANCED( SALT_LIBRARY SALT_INCLUDE_DIR ) +MARK_AS_ADVANCED( SALT_LIBRARY SALT_LIBRARY_RELEASE SALT_LIBRARY_DEBUG SALT_INCLUDE_DIR ) # Zeitgeist section IF (ZEITGEIST_INCLUDE_DIR) @@ -89,15 +107,15 @@ ENDIF (ZEITGEIST_INCLUDE_DIR) FIND_PATH(ZEITGEIST_INCLUDE_DIR zeitgeist/zeitgeist.h - HINTS ${SPARK_DIR} + PATHS ${SPARK_DIR} PATH_SUFFIXES simspark include/simspark) SET(ZEITGEIST_NAMES zeitgeist zeitgeist_debug) FIND_LIBRARY(ZEITGEIST_LIBRARY NAMES ${ZEITGEIST_NAMES} - HINTS ${SPARK_DIR} + PATHS ${SPARK_DIR} PATH_SUFFIXES simspark lib/simspark) -# handle the QUIETLY and REQUIRED arguments and set ZEITGEIST_FOUND to TRUE if +# handle the QUIETLY and REQUIRED arguments and set ZEITGEIST_FOUND to TRUE if # all listed variables are TRUE INCLUDE(FindPackageHandleStandardArgs) FIND_PACKAGE_HANDLE_STANDARD_ARGS(ZEITGEIST DEFAULT_MSG ZEITGEIST_LIBRARY @@ -105,11 +123,13 @@ IF(ZEITGEIST_FOUND) SET( ZEITGEIST_LIBRARIES ${ZEITGEIST_LIBRARY} ) + STRING(REPLACE "zeitgeist." "zeitgeist_debug." ZEITGEIST_LIBRARY_DEBUG ${ZEITGEIST_LIBRARY}) + STRING(REPLACE "zeitgeist_debug." "zeitgeist." ZEITGEIST_LIBRARY_RELEASE ${ZEITGEIST_LIBRARY}) ELSE(ZEITGEIST_FOUND) SET( ZEITGEIST_LIBRARIES ) ENDIF(ZEITGEIST_FOUND) -MARK_AS_ADVANCED( ZEITGEIST_LIBRARY ZEITGEIST_INCLUDE_DIR ) +MARK_AS_ADVANCED( ZEITGEIST_LIBRARY ZEITGEIST_LIBRARY_RELEASE ZEITGEIST_LIBRARY_DEBUG ZEITGEIST_INCLUDE_DIR ) # Oxygen section IF (OXYGEN_INCLUDE_DIR) @@ -118,15 +138,15 @@ ENDIF (OXYGEN_INCLUDE_DIR) FIND_PATH(OXYGEN_INCLUDE_DIR oxygen/oxygen.h - HINTS ${SPARK_DIR} + PATHS ${SPARK_DIR} PATH_SUFFIXES simspark include/simspark) SET(OXYGEN_NAMES oxygen oxygen_debug) FIND_LIBRARY(OXYGEN_LIBRARY NAMES ${OXYGEN_NAMES} - HINTS ${SPARK_DIR} + PATHS ${SPARK_DIR} PATH_SUFFIXES simspark lib/simspark) -# handle the QUIETLY and REQUIRED arguments and set OXYGEN_FOUND to TRUE if +# handle the QUIETLY and REQUIRED arguments and set OXYGEN_FOUND to TRUE if # all listed variables are TRUE INCLUDE(FindPackageHandleStandardArgs) FIND_PACKAGE_HANDLE_STANDARD_ARGS(OXYGEN DEFAULT_MSG OXYGEN_LIBRARY @@ -134,11 +154,13 @@ IF(OXYGEN_FOUND) SET( OXYGEN_LIBRARIES ${OXYGEN_LIBRARY} ) + STRING(REPLACE "oxygen." "oxygen_debug." OXYGEN_LIBRARY_DEBUG ${OXYGEN_LIBRARY}) + STRING(REPLACE "oxygen_debug." "oxygen." OXYGEN_LIBRARY_RELEASE ${OXYGEN_LIBRARY}) ELSE(OXYGEN_FOUND) SET( OXYGEN_LIBRARIES ) ENDIF(OXYGEN_FOUND) -MARK_AS_ADVANCED( OXYGEN_LIBRARY OXYGEN_INCLUDE_DIR ) +MARK_AS_ADVANCED( OXYGEN_LIBRARY OXYGEN_LIBRARY_RELEASE OXYGEN_LIBRARY_DEBUG OXYGEN_INCLUDE_DIR ) # Kerosin section IF (KEROSIN_INCLUDE_DIR) @@ -147,15 +169,15 @@ ENDIF (KEROSIN_INCLUDE_DIR) FIND_PATH(KEROSIN_INCLUDE_DIR kerosin/kerosin.h - HINTS ${SPARK_DIR} + PATHS ${SPARK_DIR} PATH_SUFFIXES simspark include/simspark) SET(KEROSIN_NAMES kerosin kerosin_debug) FIND_LIBRARY(KEROSIN_LIBRARY NAMES ${KEROSIN_NAMES} - HINTS ${SPARK_DIR} + PATHS ${SPARK_DIR} PATH_SUFFIXES simspark lib/simspark) -# handle the QUIETLY and REQUIRED arguments and set KEROSIN_FOUND to TRUE if +# handle the QUIETLY and REQUIRED arguments and set KEROSIN_FOUND to TRUE if # all listed variables are TRUE INCLUDE(FindPackageHandleStandardArgs) FIND_PACKAGE_HANDLE_STANDARD_ARGS(KEROSIN DEFAULT_MSG KEROSIN_LIBRARY @@ -163,11 +185,13 @@ IF(KEROSIN_FOUND) SET( KEROSIN_LIBRARIES ${KEROSIN_LIBRARY} ) + STRING(REPLACE "kerosin." "kerosin_debug." KEROSIN_LIBRARY_DEBUG ${KEROSIN_LIBRARY}) + STRING(REPLACE "kerosin_debug." "kerosin." KEROSIN_LIBRARY_RELEASE ${KEROSIN_LIBRARY}) ELSE(KEROSIN_FOUND) SET( KEROSIN_LIBRARIES ) ENDIF(KEROSIN_FOUND) -MARK_AS_ADVANCED( KEROSIN_LIBRARY KEROSIN_INCLUDE_DIR ) +MARK_AS_ADVANCED( KEROSIN_LIBRARY KEROSIN_LIBRARY_RELEASE KEROSIN_LIBRARY_DEBUG KEROSIN_INCLUDE_DIR ) # rcssnet3D IF (RCSSNET3D_INCLUDE_DIR) @@ -176,15 +200,15 @@ ENDIF (RCSSNET3D_INCLUDE_DIR) FIND_PATH(RCSSNET3D_INCLUDE_DIR rcssnet/addr.hpp - HINTS ${SPARK_DIR} + PATHS ${SPARK_DIR} PATH_SUFFIXES simspark include/simspark) SET(RCSSNET3D_NAMES rcssnet3D rcssnet3D_debug) FIND_LIBRARY(RCSSNET3D_LIBRARY NAMES ${RCSSNET3D_NAMES} - HINTS ${SPARK_DIR} + PATHS ${SPARK_DIR} PATH_SUFFIXES simspark lib/simspark) -# handle the QUIETLY and REQUIRED arguments and set RCSSNET3D_FOUND to TRUE if +# handle the QUIETLY and REQUIRED arguments and set RCSSNET3D_FOUND to TRUE if # all listed variables are TRUE INCLUDE(FindPackageHandleStandardArgs) FIND_PACKAGE_HANDLE_STANDARD_ARGS(RCSSNET3D DEFAULT_MSG RCSSNET3D_LIBRARY Modified: trunk/rcssserver3d/data/scripts/bindings.rb =================================================================== --- trunk/rcssserver3d/data/scripts/bindings.rb 2015-09-12 01:47:34 UTC (rev 398) +++ trunk/rcssserver3d/data/scripts/bindings.rb 2015-09-12 01:48:23 UTC (rev 399) @@ -14,9 +14,10 @@ inputServer.bindCommand('axisy', Command.MouseY); inputServer.bindCommand('mouse_left', Command.Mouselook); inputServer.bindCommand('mouse_right',Command.Up); + inputServer.bindCommand('mouse_middle',Command.Down); inputServer.bindCommand('pagedown', Command.Down); - inputServer.bindCommand('kp_minus', Command.Down); - inputServer.bindCommand('kp_plus',Command.Up); + inputServer.bindCommand('kp_minus', Command.Down); + inputServer.bindCommand('kp_plus', Command.Up); inputServer.bindCommand('pageup', Command.Up); inputServer.bindCommand('q', Command.Quit) inputServer.bindCommand('a', Command.Left) Modified: trunk/rcssserver3d/doc/Doxyfile.in =================================================================== --- trunk/rcssserver3d/doc/Doxyfile.in 2015-09-12 01:47:34 UTC (rev 398) +++ trunk/rcssserver3d/doc/Doxyfile.in 2015-09-12 01:48:23 UTC (rev 399) @@ -58,7 +58,9 @@ #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- -INPUT = @top_srcdir@/plugin +INPUT = @top_srcdir@/plugin \ + @top_srcdir@/guiplugin \ + @top_srcdir@/sparkgui FILE_PATTERNS = *.h \ *.cpp RECURSIVE = YES Added: trunk/rcssserver3d/guiplugin/CMakeLists.txt =================================================================== --- trunk/rcssserver3d/guiplugin/CMakeLists.txt (rev 0) +++ trunk/rcssserver3d/guiplugin/CMakeLists.txt 2015-09-12 01:48:23 UTC (rev 399) @@ -0,0 +1,9 @@ +if (WIN32 OR APPLE) + set(spark_gui_debug_libs ${SALT_LIBRARY_DEBUG} ${OXYGEN_LIBRARY_DEBUG} ${ZEITGEIST_LIBRARY_DEBUG} + ${KEROSIN_LIBRARY_DEBUG} ${SPARK_LIBRARY_DEBUG} ${CARBON_LIBRARY_DEBUG} ${RCSSNET3D_LIBRARY}) + set(spark_gui_release_libs ${SALT_LIBRARY_RELEASE} ${OXYGEN_LIBRARY_RELEASE} ${ZEITGEIST_LIBRARY_RELEASE} + ${KEROSIN_LIBRARY_RELEASE} ${SPARK_LIBRARY_RELEASE} ${CARBON_LIBRARY_RELEASE} ${RCSSNET3D_LIBRARY}) +endif (WIN32 OR APPLE) + +add_subdirectory(soccercontrolframe) + Added: trunk/rcssserver3d/guiplugin/soccercontrolframe/CMakeLists.txt =================================================================== --- trunk/rcssserver3d/guiplugin/soccercontrolframe/CMakeLists.txt (rev 0) +++ trunk/rcssserver3d/guiplugin/soccercontrolframe/CMakeLists.txt 2015-09-12 01:48:23 UTC (rev 399) @@ -0,0 +1,105 @@ +########### target files ############### +set(soccercontrolframe_QOBJECT_HEADERS + soccercontrolframe.h +) + +set(soccercontrolframe_HEADERS + soccercontrolframe_soccercommands.h + export.h + + ${PLUGIN_INCLUDE_DIR}/soccer/agentstate/agentstate.h + ${PLUGIN_INCLUDE_DIR}/soccer/ballstateaspect/ballstateaspect.h + ${PLUGIN_INCLUDE_DIR}/soccer/gamestateaspect/gamestateaspect.h + ${PLUGIN_INCLUDE_DIR}/soccer/gamestateaspect/gamestateitem.h + ${PLUGIN_INCLUDE_DIR}/soccer/objectstate/objectstate.h + ${PLUGIN_INCLUDE_DIR}/soccer/soccerbase/soccerbase.h + ${PLUGIN_INCLUDE_DIR}/soccer/soccercontrolaspect/soccercontrolaspect.h + ${PLUGIN_INCLUDE_DIR}/soccer/soccernode/soccernode.h + ${PLUGIN_INCLUDE_DIR}/soccer/soccertypes.h +) + +set(soccercontrolframe_SOURCES + soccercontrolframe.cpp + soccercontrolframe_soccercommands.cpp + + ${PLUGIN_INCLUDE_DIR}/soccer/agentstate/agentstate.cpp + ${PLUGIN_INCLUDE_DIR}/soccer/agentstate/agentstate_c.cpp + ${PLUGIN_INCLUDE_DIR}/soccer/ballstateaspect/ballstateaspect.cpp + ${PLUGIN_INCLUDE_DIR}/soccer/ballstateaspect/ballstateaspect_c.cpp + ${PLUGIN_INCLUDE_DIR}/soccer/gamestateaspect/gamestateaspect.cpp + ${PLUGIN_INCLUDE_DIR}/soccer/gamestateaspect/gamestateaspect_c.cpp + ${PLUGIN_INCLUDE_DIR}/soccer/gamestateaspect/gamestateitem.cpp + ${PLUGIN_INCLUDE_DIR}/soccer/gamestateaspect/gamestateitem_c.cpp + ${PLUGIN_INCLUDE_DIR}/soccer/objectstate/objectstate.cpp + ${PLUGIN_INCLUDE_DIR}/soccer/objectstate/objectstate_c.cpp + ${PLUGIN_INCLUDE_DIR}/soccer/soccerbase/soccerbase.cpp + ${PLUGIN_INCLUDE_DIR}/soccer/soccercontrolaspect/soccercontrolaspect.cpp + ${PLUGIN_INCLUDE_DIR}/soccer/soccercontrolaspect/soccercontrolaspect_c.cpp + ${PLUGIN_INCLUDE_DIR}/soccer/soccernode/soccernode.cpp + ${PLUGIN_INCLUDE_DIR}/soccer/soccernode/soccernode_c.cpp +) + +set(soccercontrolframe_FORMS + soccercontrolframe.ui +) + +#set(soccercontrolframe_RESOURCES) + +########### qt properties ############### + +#Additional used libraries +set(QT_USE_QTOPENGL TRUE) +set(QT_USE_QTXML TRUE) + +#Include qt properties +include(${QT_USE_FILE}) +add_definitions(${QT_DEFINITIONS}) + +########### create library ############### + +#Meta object compiler wrapping of header files, forms and resources +QT4_WRAP_CPP(soccercontrolframe_QOBJECT_HEADERS_MOC ${soccercontrolframe_QOBJECT_HEADERS}) +QT4_WRAP_UI(soccercontrolframe_FORMS_HEADERS ${soccercontrolframe_FORMS}) +#QT4_ADD_RESOURCES(soccercontrolframe_RESOURCES_RCC ${soccercontrolframe_RESOURCES}) + +include_directories( + ${CMAKE_CURRENT_SOURCE_DIR} + ${CARBON_INCLUDE_DIR}/carbon + ${FREETYPE_INCLUDE_DIRS} + ${IL_INCLUDE_DIR} + ${OPENGL_INCLUDE_DIR} + ${CMAKE_CURRENT_BINARY_DIR} + ${PLUGIN_INCLUDE_DIR}/soccer + ${PLUGIN_INCLUDE_DIR}) + +add_library( + soccercontrolframe MODULE + ${soccercontrolframe_SOURCES} + ${soccercontrolframe_QOBJECT_HEADERS} + ${soccercontrolframe_QOBJECT_HEADERS_MOC} + ${soccercontrolframe_HEADERS} + ${soccercontrolframe_FORMS_HEADERS}) + #${soccercontrolframe_RESOURCES_RCC}) + +set(soccercontrolframe_LIBS ${OPENGL_LIBRARIES} ${QT_LIBRARIES}) +set(soccercontrolframe_DEBUG_LIBS ${spark_gui_debug_libs}) +set(soccercontrolframe_RELEASE_LIBS ${spark_gui_release_libs}) + +target_link_libraries(soccercontrolframe ${soccercontrolframe_LIBS}) +FOREACH(LIB ${soccercontrolframe_DEBUG_LIBS}) + target_link_libraries(soccercontrolframe debug ${LIB}) +ENDFOREACH(LIB) +FOREACH(LIB ${soccercontrolframe_RELEASE_LIBS}) + target_link_libraries(soccercontrolframe optimized ${LIB}) +ENDFOREACH(LIB) + +if (NOT APPLE) + set_target_properties(soccercontrolframe PROPERTIES VERSION 1.0.0 SOVERSION 1) +endif (NOT APPLE) + +install(TARGETS soccercontrolframe DESTINATION ${guipluginlibdir}) + +########### install files ############### + +install(DIRECTORY ./ DESTINATION ${GUI_PLUGIN_INCLUDE_DIR}/soccercontrolframe + FILES_MATCHING PATTERN "*.h" PATTERN ".svn" EXCLUDE) Added: trunk/rcssserver3d/guiplugin/soccercontrolframe/export.h =================================================================== --- trunk/rcssserver3d/guiplugin/soccercontrolframe/export.h (rev 0) +++ trunk/rcssserver3d/guiplugin/soccercontrolframe/export.h 2015-09-12 01:48:23 UTC (rev 399) @@ -0,0 +1,14 @@ +#ifndef EXPORT_LIB +#define EXPORT_LIB +/** + * \file soccercontrolframe/export.h + * \brief Exports the SoccerControlFrame class as a plugin from a shared library. + */ + +#include "soccercontrolframe.h" + +PLUGINS_EXPORT_BEGIN() +PLUGIN_EXPORT(SoccerControlFrame) +PLUGINS_EXPORT_END() + +#endif \ No newline at end of file Added: trunk/rcssserver3d/guiplugin/soccercontrolframe/soccercontrolframe.cpp =================================================================== --- trunk/rcssserver3d/guiplugin/soccercontrolframe/soccercontrolframe.cpp (rev 0) +++ trunk/rcssserver3d/guiplugin/soccercontrolframe/soccercontrolframe.cpp 2015-09-12 01:48:23 UTC (rev 399) @@ -0,0 +1,610 @@ +/* -*- mode: c++; c-basic-offset: 4; indent-tabs-mode: nil -*- + + this file is part of rcssserver3D + Author: Patrick Geib + Copyright (C) 2012 RoboCup Soccer Server 3D Maintenance Group + $Id$ + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +//Local +#include "soccercontrolframe.h" +#include "soccercontrolframe_soccercommands.h" +#include "export.h" + +//Carbon +#include <pluginmanager.h> +#include <carbon.h> +#include <simulationmanager.h> +#include <simulation.h> +#include <sparkcontroller.h> +#include <guisimcontrol.h> +#include <serverthread.h> +#include <simspark.h> +#include <settings.h> + +//SimSpark +#include <oxygen/gamecontrolserver/gamecontrolserver.h> +#include <zeitgeist/leaf.h> + +//Soccer +#include "soccer/gamestateaspect/gamestateaspect.h" +#include "soccer/soccerruleaspect/soccerruleaspect.h" +#include "soccer/ballstateaspect/ballstateaspect.h" +//#include <agentstate/agentstate.h> + +//Boost +#include <boost/make_shared.hpp> + +//Qt +#include <QValidator> + +using namespace boost; +using namespace oxygen; +using namespace SoccerControlFrameUtil; + +//-------------------------------------------------------------- +// Static +//-------------------------------------------------------------- + +//Factory registration +REGISTER_EXPORT_FRAME(SoccerControlFrame, "soccercontrolframe", "Soccer", 1000) + +//Static class information +void SoccerControlFrame::saveClassInfo() +{ + //Description + setClassInfo(mClassId, AbstractPlugin::PI_DESCRIPTION, + tr("The soccer control frame can be used to monitor and control the state of a simspark soccer simulation.")); + + //Icon + setClassInfo(mClassId, AbstractPlugin::PI_ICON_NAME, ":soccer"); + + //Tags + QStringList tags; + tags << "soccer" << "spark" << "rcssserver3d"; + setClassInfo(mClassId, AbstractPlugin::PI_TAGS, tags); +} + +//-------------------------------------------------------------- +// SoccerFrameUpdateControl +//-------------------------------------------------------------- + +SoccerFrameUpdateControl::SoccerFrameUpdateControl(SoccerControlFrame* parent) + : mParent(parent), CommandQueue(0) +{ +} +SoccerFrameUpdateControl::~SoccerFrameUpdateControl() +{ +} + +void SoccerFrameUpdateControl::startCycle() +{ + emit stateStartCycle(); +} + +void SoccerFrameUpdateControl::endCycle() +{ + SparkCommand::CommandQueue::endCycle(); + emit stateEndCycle(); +} + +void SoccerFrameUpdateControl::waitCycle() +{ + SparkCommand::CommandQueue::waitCycle(); + emit stateWaitCycle(); +} + +//-------------------------------------------------------------- +// SoccerFrame +//-------------------------------------------------------------- +// Public +//-------------------------------------------------------------- + +SoccerControlFrame::SoccerControlFrame() : + mSettings(getCarbon()->getSettings()) +{ + //---------------- + //Layout + ui.setupUi(this); + loadFrameDesign(); + + //---------------- + //Variables + mInit = false; + mLastInitState = true; //--> 1 display update during initialization + mReadyUpdate = true; + mSelectedPlayer = -1; + mSelectedPlayMode = PM_NONE; + mUpdateTimer.setInterval(100); + + //---------------- + //Gui-Field init + ui.gameTimeEdit->setValidator(new QDoubleValidator(0.0, INT_MAX, 4, ui.gameTimeEdit)); + ui.team1GoalsEdit->setValidator(new QIntValidator(0, INT_MAX, ui.team1GoalsEdit)); + ui.team2GoalsEdit->setValidator(new QIntValidator(0, INT_MAX, ui.team2GoalsEdit)); + ui.team1PenaltiesEdit->setValidator(new QIntValidator(0, INT_MAX, ui.team1PenaltiesEdit)); + ui.team2PenaltiesEdit->setValidator(new QIntValidator(0, INT_MAX, ui.team2PenaltiesEdit)); + ui.batteryEdit->setValidator(new QDoubleValidator(0.0, INT_MAX, 4, ui.batteryEdit)); + + //---------------- + //Settings + + loadDefaultSettings(); + loadSettings(); + + //---------------- + //Menu Entries + + //---------------- + //Connections + Simulation* simulation = &*getCarbon()->getSimulationManager()->getSimulation(); + connect(simulation, SIGNAL(serverCreated(boost::shared_ptr<ServerThread>)), this, SLOT(updateServerCreated(boost::shared_ptr<ServerThread>))); + + connect(&mUpdateTimer, SIGNAL(timeout()), this, SLOT(readyUpdate())); +} + +SoccerControlFrame::~SoccerControlFrame() +{ + +} + +void SoccerControlFrame::init(const QStringList& parameters) +{ + //Combo box entries + mGameModes.clear(); + ui.playModeComboBox->clear(); + + mGameModes.insert(PM_BeforeKickOff, GameMode(0, PM_BeforeKickOff, true, tr("Before Kickoff"))); + mGameModes.insert(PM_KickOff_Left, GameMode(0, PM_KickOff_Left, true, tr("KickOff Left"))); + mGameModes.insert(PM_KickOff_Right, GameMode(0, PM_KickOff_Right, true, tr("KickOff Right"))); + mGameModes.insert(PM_PlayOn, GameMode(0, PM_PlayOn, true, tr("Play On"))); + mGameModes.insert(PM_KickIn_Left, GameMode(0, PM_KickIn_Left, true, tr("Kick-In Left"))); + mGameModes.insert(PM_KickIn_Right, GameMode(0, PM_KickIn_Right, true, tr("Kick-In Right"))); + mGameModes.insert(PM_CORNER_KICK_LEFT, GameMode(0, PM_CORNER_KICK_LEFT, true, tr("Corner Kick Left"))); + mGameModes.insert(PM_CORNER_KICK_RIGHT, GameMode(0, PM_CORNER_KICK_RIGHT, true, tr("Corner Kick Right"))); + mGameModes.insert(PM_GOAL_KICK_LEFT, GameMode(0, PM_GOAL_KICK_LEFT, true, tr("Goal Kick Left"))); + mGameModes.insert(PM_GOAL_KICK_RIGHT, GameMode(0, PM_GOAL_KICK_RIGHT, true, tr("Goal Kick Right"))); + mGameModes.insert(PM_OFFSIDE_LEFT, GameMode(0, PM_OFFSIDE_LEFT, true, tr("Offside Left"))); + mGameModes.insert(PM_OFFSIDE_RIGHT, GameMode(0, PM_OFFSIDE_RIGHT, true, tr("Offside Right"))); + mGameModes.insert(PM_GameOver, GameMode(0, PM_GameOver, true, tr("Game Over"))); + mGameModes.insert(PM_Goal_Left, GameMode(0, PM_Goal_Left, true, tr("Goal Left"))); + mGameModes.insert(PM_Goal_Right, GameMode(0, PM_Goal_Right, true, tr("Goal Right"))); + mGameModes.insert(PM_FREE_KICK_LEFT, GameMode(0, PM_FREE_KICK_LEFT, true, tr("Free Kick Left"))); + mGameModes.insert(PM_FREE_KICK_RIGHT, GameMode(0, PM_FREE_KICK_RIGHT, true, tr("Free Kick Right"))); + + int run = 0; + for (auto it = mGameModes.begin(); it != mGameModes.end(); it++) + { + it->mIndex = run; + ui.playModeComboBox->addItem(it->mName); + run++; + } + mSelectedPlayMode = PM_BeforeKickOff; + + tryInitSpark(); + updateDisplay(); +} + +bool SoccerControlFrame::initialized() +{ + return mInit; +} + +void SoccerControlFrame::loadSettings() +{ + +} + +void SoccerControlFrame::saveSettings() +{ + +} + +void SoccerControlFrame::loadDefaultSettings() +{ + mGameControlServerPath = "/sys/server/gamecontrol/"; + mGameStateAspectPath = "/sys/server/gamecontrol/GameStateAspect/"; + mSoccerRuleAspectPath = "/sys/server/gamecontrol/SoccerRuleAspect/"; + mBallStateAspectPath = "/sys/server/gamecontrol/BallStateAspect/"; +} + +//-------------------------------------------------------------- +// Protected +//-------------------------------------------------------------- + +bool SoccerControlFrame::tryInitSpark() +{ + //If already initialized, simply update + if (mInit) + updateDisplay(); + + //If there is no spark controller, try to get it + if (mSparkController.get() == 0) + { + mServerThread = getCarbon()->getSimulationManager()->getSparkServerThread(); + + if (mServerThread.get() == 0) + return false; + else + { + mSparkController = mServerThread->getSparkController(); + connect(&*mSparkController, SIGNAL(sparkRunning(SparkController*)), this, SLOT(updateSparkRunning(SparkController*))); + } + } + + //If there is a spark controller, check for SimSpark + if (mSparkController->getSpark().get() != 0) + { + //There is a controller and simspark-> initialize + + QString gameControlServer = mGameControlServerPath; + QString gameStateAspect = mGameStateAspectPath; + QString soccerRuleAspect = mSoccerRuleAspectPath; + QString ballStateAspect = mBallStateAspectPath; + + //Try to find soccer aspects + if (mSettings->beginGroup(this, true, 1000)) //lock + { + gameControlServer = mSettings->value("mGameControlServerPath", mGameControlServerPath).toString(); + gameStateAspect = mSettings->value("mGameStateAspectPath", mGameStateAspectPath).toString(); + soccerRuleAspect = mSettings->value("mSoccerRuleAspectPath", mSoccerRuleAspectPath).toString(); + ballStateAspect = mSettings->value("mBallStateAspectPath", mBallStateAspectPath).toString(); + mSettings->endGroup(true); //unlock + } + else + { + LOG_WARNING() << "Could not read Settings object in SoccerControlFrame. Using default values for control node paths."; + } + + SimSpark* spark = &*mSparkController->getSpark(); + boost::shared_ptr<GameControlServer> gameControl(dynamic_pointer_cast<GameControlServer>(spark->GetCore()->Get(gameControlServer.toStdString()))); + boost::shared_ptr<GameStateAspect> gameState (dynamic_pointer_cast<GameStateAspect> (spark->GetCore()->Get(gameStateAspect.toStdString()))); + boost::shared_ptr<SoccerRuleAspect> soccerRule (dynamic_pointer_cast<SoccerRuleAspect> (spark->GetCore()->Get(soccerRuleAspect.toStdString()))); + boost::shared_ptr<BallStateAspect> ballState (dynamic_pointer_cast<BallStateAspect> (spark->GetCore()->Get(ballStateAspect.toStdString()))); + + bool success = true; + if (!gameControl.get()) + { + LOG_ERROR() << "Soccer GameControlServer not found. Expected it to be at " << gameControlServer << "."; + success = false; + } + if (!gameState.get()) + { + LOG_ERROR() << "Soccer GameStateAspect not found. Expected it to be at " << gameStateAspect << "."; + success = false; + } + if (!soccerRule.get()) + { + LOG_ERROR() << "Soccer SoccerRuleAspect not found. Expected it to be at " << soccerRuleAspect << "."; + success = false; + } + if (!ballState.get()) + { + LOG_ERROR() << "Soccer BallStateAspect not found. Expected it to be at " << ballStateAspect << "."; + success = false; + } + + if (success == false) + { + //Init failed, return + mGameControlServer.reset(); + mRuleAspect.reset(); + mBallAspect.reset(); + mGameAspect.reset(); + return false; + } + + //All nodes found, init successful + mGameControlServer = gameControl; + mRuleAspect = soccerRule; + mBallAspect = ballState; + mGameAspect = gameState; + + //Register control node that polls an update every time a cycle ended + registerUpdater(); + + mInit = true; + updateDisplay(); + return true; + } + return false; +} + +void SoccerControlFrame::registerUpdater() +{ + shared_ptr<GuiSimControl> simControl = mSparkController->getSimulationControl().lock(); + if (simControl.get() == 0) + { + LOG_ERROR() << "No gui simulation control node found to register updater in."; + return; + } + + //Remove old updater (should happen automatically, just to be safe) + if (mUpdater.get() != 0) + { + simControl->unregisterSimControl(mUpdater); + mUpdater.reset(); + } + + //Create new updater + mUpdater = shared_ptr<SoccerFrameUpdateControl>(new SoccerFrameUpdateControl(this)); + simControl->registerSimControl(mUpdater); + connect(&*mUpdater, SIGNAL(stateEndCycle()), this, SLOT(onCycleFinished())); //Queued connection + connect(&*mUpdater, SIGNAL(stateWaitCycle()), this, SLOT(onCycleFinished())); //Queued connection + + //Start update timer + mUpdateTimer.start(); +} + +//-------------------------------------------------------------- +// Private +//-------------------------------------------------------------- + +//-------------------------------------------------------------- +// Protected Slots +//-------------------------------------------------------------- + +void SoccerControlFrame::updateServerCreated(boost::shared_ptr<ServerThread> server) +{ + mSparkController = server->getSparkController(); + connect(&*mSparkController, SIGNAL(sparkRunning(SparkController*)), this, SLOT(updateSparkRunning(SparkController*))); + tryInitSpark(); +} + +void SoccerControlFrame::updateSparkRunning(SparkController* controller) +{ + if (mSparkController.get() != 0) + { + if (mSparkController->getSpark().get() == controller->getSpark().get()) + { + tryInitSpark(); + } + } +} + +void SoccerControlFrame::onCycleFinished() +{ + updateDisplay(); + mReadyUpdate = false; +} + +//-------------------------------------------------------------- +// Public Slots +//-------------------------------------------------------------- + +void SoccerControlFrame::readyUpdate() +{ + mReadyUpdate = true; +} + +void SoccerControlFrame::updateDisplay() +{ + if (mLastInitState != mInit) + { + mLastInitState = mInit; + mUpdateCount = 0; + + ui.batteryEdit->setEnabled(mInit); + ui.temperatureEdit->setEnabled(mInit); + ui.gameTimeEdit->setEnabled(mInit); + ui.team1GoalsEdit->setEnabled(mInit); + ui.team2GoalsEdit->setEnabled(mInit); + ui.team1PenaltiesEdit->setEnabled(mInit); + ui.team2PenaltiesEdit->setEnabled(mInit); + + ui.gameTimeResetButton->setEnabled(mInit); + ui.resetBatteryButton->setEnabled(mInit); + ui.resetTemperatureButton->setEnabled(mInit); + ui.kickOffButton->setEnabled(mInit); + ui.playModeButton->setEnabled(mInit); + ui.playModeComboBox->setEnabled(mInit); + + mSelectedPlayer = -1; + } + + if (!mInit) + { + ui.batteryEdit->setText(""); + ui.temperatureEdit->setText(""); + ui.gameTimeEdit->setText(""); + ui.team1GoalsEdit->setText(""); + ui.team2GoalsEdit->setText(""); + ui.team1PenaltiesEdit->setText(""); + ui.team2PenaltiesEdit->setText(""); + ui.team1NameLabel->setText(tr("Left")); + ui.team2NameLabel->setText(tr("Right")); + ui.agentNameLabel->setText(""); + ui.agentTeamLabel->setText(""); + ui.playModeLabel->setText(tr("Not initialized.")); + } + + if (mInit && mReadyUpdate) + { + //Read and display non-changing values + if (mUpdateCount == 0) + { + } + + //Read and update changing values + ui.team1NameLabel->setText(mGameAspect->GetTeamName(TI_LEFT).c_str()); + ui.team2NameLabel->setText(mGameAspect->GetTeamName(TI_RIGHT).c_str()); + if (!ui.team1GoalsEdit->hasFocus()) ui.team1GoalsEdit->setText(QString::number(mGameAspect->GetScore(TI_LEFT))); + if (!ui.team2GoalsEdit->hasFocus()) ui.team2GoalsEdit->setText(QString::number(mGameAspect->GetScore(TI_RIGHT))); + if (!ui.team1PenaltiesEdit->hasFocus()) ui.team1PenaltiesEdit->setText("0"); + if (!ui.team2PenaltiesEdit->hasFocus()) ui.team2PenaltiesEdit->setText("0"); + + if (!ui.gameTimeEdit->hasFocus()) ui.gameTimeEdit->setText(QString::number(mGameAspect->GetTime())); + + auto pos = mGameModes.find((int)mGameAspect->GetPlayMode()); + if (pos == mGameModes.end()) + { + LOG_WARNING() << "Current game mode " << mGameAspect->GetPlayMode() << " is unknown."; + } + else + { + if (mUpdateCount == 0) + ui.playModeComboBox->setCurrentIndex(pos->mIndex); + ui.playModeLabel->setText(pos->mName); + } + + updatePlayerDisplay(); + } + + mUpdateCount++; +} + +void SoccerControlFrame::updatePlayerDisplay() +{ + if (mSelectedPlayer == -1) + return; + + if (!mInit) + return; +} + +void SoccerControlFrame::editGameTime() +{ + if (!mInit) + return; + + mUpdater->queueCommand(make_shared<SoccerControlFrameUtil::SetTime>(mGameAspect, ui.gameTimeEdit->text().toFloat())); +} + +void SoccerControlFrame::resetGameTime() +{ + if (!mInit) + return; + + mUpdater->queueCommand(make_shared<SoccerControlFrameUtil::SetTime>(mGameAspect, 0.0)); +} + +void SoccerControlFrame::editTeam1Goals() +{ + if (!mInit) + return; + + mUpdater->queueCommand(make_shared<SoccerControlFrameUtil::SetTeamGoals>(mGameAspect, TI_LEFT, ui.team1GoalsEdit->text().toInt())); +} + +void SoccerControlFrame::editTeam2Goals() +{ + if (!mInit) + return; + + mUpdater->queueCommand(make_shared<SoccerControlFrameUtil::SetTeamGoals>(mGameAspect, TI_LEFT, ui.team2GoalsEdit->text().toInt())); +} + +void SoccerControlFrame::editTeam1Penalties() +{ + if (!mInit) + return; +} + +void SoccerControlFrame::editTeam2Penalties() +{ + if (!mInit) + return; +} + +void SoccerControlFrame::selectPlayMode(int index) +{ + if (!mInit) + return; + + ui.playModeButton->setEnabled(false); + + for (auto it = mGameModes.begin(); it != mGameModes.end(); it++) + { + if (it->mIndex == index) + { + mSelectedPlayMode = it->mMode; + ui.playModeButton->setEnabled(it->mManual); + } + } +} + +void SoccerControlFrame::changePlayMode() +{ + if (!mInit) + return; + + mUpdater->queueCommand(make_shared<SoccerControlFrameUtil::ChangePlayMode>(mGameAspect, mSelectedPlayMode)); +} + +void SoccerControlFrame::kickOff() +{ + if (!mInit) + return; + + mUpdater->queueCommand(make_shared<SoccerControlFrameUtil::KickOff>(mGameAspect)); +} + +void SoccerControlFrame::clearPlayers() +{ + if (!mInit) + return; +} + + +void SoccerControlFrame::selectPlayer(int index) +{ + if (!mInit) + return; + + mSelectedPlayer = -1; + updatePlayerDisplay(); +} + +void SoccerControlFrame::editBattery() +{ + if (!mInit) + return; + + if (mSelectedPlayer == -1) + return; + +} + +void SoccerControlFrame::editTemperature() +{ + if (!mInit) + return; + + if (mSelectedPlayer == -1) + return; + +} + +void SoccerControlFrame::resetBattery() +{ + if (!mInit) + return; + + if (mSelectedPlayer == -1) + return; + +} + +void SoccerControlFrame::resetTemperature() +{ + if (!mInit) + return; + + if (mSelectedPlayer == -1) + return; + + +} \ No newline at end of file Added: trunk/rcssserver3d/guiplugin/soccercontrolframe/soccercontrolframe.h =================================================================== --- trunk/rcssserver3d/guiplugin/soccercontrolframe/soccercontrolframe.h (rev 0) +++ trunk/rcssserver3d/guiplugin/soccercontrolframe/soccercontrolframe.h 2015-09-12 01:48:23 UTC (rev 399) @@ -0,0 +1,391 @@ +/* -*- mode: c++; c-basic-offset: 4; indent-tabs-mode: nil -*- + + this file is part of rcssserver3D + Author: Patrick Geib + Copyright (C) 2012 RoboCup Soccer Server 3D Maintenance Group + $Id$ + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#ifndef SOCCERCONTROLFRAME_H +#define SOCCERCONTROLFRAME_H +/** + * \file soccercontrolframe.h + * \brief Contains SoccerControlFrame and SoccerFrameUpdateControl classes. + */ + +#include "ui_soccercontrolframe.h" +#include "attachableframe.h" +#include "isimcontrol.h" +#include "sparkcommandqueue.h" + +#include <boost/shared_ptr.hpp> +#include <QObject> +#include <QTimer> + +#include <soccer/soccertypes.h> + +class ServerThread; +class SimSpark; +class Settings; + +class SoccerFrameUpdateControl; +class SoccerControlFrame; + +class GameStateAspect; +class SoccerRuleAspect; +class BallStateAspect; + +namespace oxygen +{ + class GameControlServer; +} + +/*! + \brief Update command queue read and set soccer variables and settings in the SimSpark simulation. +*/ +class SoccerFrameUpdateControl : public QObject, public SparkCommand::CommandQueue // is ISimControl +{ + Q_OBJECT + +public: + //public functions + + /*! + \brief Constructor. + */ + SoccerFrameUpdateControl(SoccerControlFrame* parent); + /*! + \brief Destructor. + */ + ~SoccerFrameUpdateControl(); + + /*! + \brief Called when the simulation cycle starts. + + Emits stateStartCycle() + */ + virtual void startCycle(); + /*! + \brief Called when the simulation cycle ends. + + Executes update commands. + Emits stateEndCycle() + */ + virtual void endCycle(); + /*! + \brief Called when the simulation executes a wait-cycle. + + Executes update commands. + Emits stateWaitCycle() + */ + virtual void waitCycle(); + +public: signals: + //public signals + + /*! + \brief Emittet when simualtion cycle starts. + + Calls update function. + */ + void stateStartCycle(); + /*! + \brief Emitted when simulation cycle ends. + + Calls update function. + */ + void stateEndCycle(); + /*! + \brief Emitted when simulation executes a wait-cycle. + + Calls update function. + */ + void stateWaitCycle(); + +public: + //public members + + SoccerControlFrame* mParent; /*!< Parent frame. */ +}; + +/*! + \brief AttachableFrame plugin that displays the state of a Ssoccer simulation and can control it. + + The SoccerControlFrame will wait and try to identify a soccer simulation in every Spark ServerThread that is started. + When it has found a ServerThread that runs a soccer simulation, the frame will register an updater to the SparkController and repeatedly update the + view on soccer variables like the team names, goals and the game time. + + The soccer values can be changed. + A List of SoccerFrameUtil::SoccerCommand derived classes can queue update calls for soccer variables and safely change the current game state. + + \todo Player control not implemented yet. Anyway, for player control to be effective there need to be additional functions to control them. + At the moment the only available functions would be battery state and temperature. + + \todo Currently the frame only controls basic soccer game control with the GameStateAspect and GameControlServer. + Additional control with the BallStateAspect, SoccerRuleAspect and the trainer command parser could be added. +*/ +class SoccerControlFrame : public AttachableFrame +{ + Q_OBJECT + GUI_FRAME + +public: + //public types + + /*! + \brief Description of the current game mode. + + Contains all the soccer game modes (BeforeKickoff, GoalLeft, FreekickRight and so on) and is robust to extension of the game modes. + */ + struct GameMode + { + public: + //public functions + + /*! + \brief full constructor. + + \param index index of the game mode in the combobox + \param mode spark game mode id + \param manual can it be selected by the user + \param name name string of the game mode + */ + GameMode(int index, TPlayMode mode, bool manual, QString name) + : mIndex(index), mMode(mode), mName(name), mManual(manual) {} + + TPlayMode mMode; /*!< spark game mode id */ + QString mName; /*!< name string of the game mode */ + int mIndex; /*!< index of the game mode in the combobox */ + bool mManual; /*!< can it be selected by the user */ + }; + +public: + // public functions + + /*! + \brief Constructor. + */ + SoccerControlFrame(); + /*! + \brief Destructor. + */ + ~SoccerControlFrame(); + +public: + //public virtual functions + + /*! + \brief Initialization function. + + \param parameters parameter list (not used) + */ + virtual void init(const QStringList& parameters); + + /*! + \brief Loads settings from global settings object. + */ + virtual void loadSettings(); + /*! + \brief Saves settings to global settings object. + */ + virtual void saveSettings(); + /*! + \brief Initializes settings with default values. + */ + virtual void loadDefaultSettings(); + + /*! + \brief Returns true after initialization of SimSpark simulation access. + */ + bool initialized(); + +protected: + //protected functions + + /*! + \brief Tries to initialize spark simulation access. + + Will fail if there is no Spark-Server, if the server has no SparkController, if the controller has not initialized SimSpark, or + if the Simulation does not have the required soccer control nodes. + + Tries to initialize again every time a server thread was created or started. + */ + bool tryInitSpark(); + /*! + \brief Registers the updater control to the SparkController. + + Called when spark access was initialized successfully. + */ + void registerUpdater(); + +protected slots: + //protected slots + + /*! + \brief Tries to initialize SimSpark access after a server was created. + + \param server serverthread that was created + */ + void updateServerCreated(boost::shared_ptr<ServerThread> server); + /*! + \brief Tries to initialize SimSpark access after spark was started. + + \param controller that startet SimSpark + */ + void updateSparkRunning(SparkController* controller); + + /*! + \brief Update function called after a run or wait simulation cycle finished. + + Disables updates until the update timer ticks for the next time and calls readyUpdate(). + */ + void onCycleFinished(); + +public slots: + //public slots + + /*! + \brief Causes an update of the display the next time a simulation cycle ends. + */ + void readyUpdate(); + /*! + \brief Updates the data fields with the current soccer variables. + */ + void updateDisplay(); + /*! + \brief updates the data fields of the currently selected agent. + + \todo not implemented yet + */ + void updatePlayerDisplay(); + + /*! + \brief Updates the game time from the ui text edit. + */ + void editGameTime(); + /*! + \brief Resets the game time to the first value recorded. + */ + void resetGameTime(); + + /*! + \brief Updates team 1 goals from the ui text edit. + */ + void editTeam1Goals(); + /*! + \brief Updates team 2 goals from the ui text edit. + */ + void editTeam2Goals(); + /*! + \brief Updates team 1 penalties from the ui text edit. + + \todo Penalties are just a possibility. They are not recorded in SimSpark yet. + */ + void editTeam1Penalties(); + /*! + \brief Updates team 2 penalties from the ui text edit. + + \todo Penalties are just a possibility. They are not recorded in SimSpark yet. + */ + void editTeam2Penalties(); + + /*! + \brief Select a play mode from the ui combo box. It will be changed after confirmation by a button click. + + \param index index of the mode entry + */ + void selectPlayMode(int index); + /*! + \brief Change the current game mode as chosen in the ui combo box. + */ + void changePlayMode(); + + /*! + \brief Change game mode to KickOff. + */ + void kickOff(); + /*! + \brief Moves players away from the ball and resets their position. + + \todo not implemented yet, because there is no direct implementation in SoccerRuleAspect. Integrate the commands of trainer command parser + for this. + */ + void clearPlayers(); + + /*! + \brief Chooses an agent by index. + + \todo player control not implemented yet + \param index index of the player + */ + void selectPlayer(int index); + /*! + \brief Changes the battery value of an agent from the ui text edit. + + \todo player control not implemented yet + */ + void editBattery(); + /*! + \brief Changes the temperature value of an agent from the ui text edit. + + \todo player control not implemented yet + */ + void editTemperature(); + /*! + \brief Resets the battery of an agent to the first recorded value. + + \todo player control not implemented yet + */ + void resetBattery(); + /*! + \brief Resets the temperature of an agent to the first recorded value. + + \todo player control not implemented yet + */ + void resetTemperature(); + +private: + // private members + + Ui::SoccerControlFrame ui; /*!< Ui definition object. */ + boost::shared_ptr<Settings> mSettings; /*!< Global Settings object. */ + boost::shared_ptr<SoccerFrameUpdateControl> mUpdater; /*!< Update control for the soccer frame. Registered to the current SparkControllers GuiSimControl node. */ + boost::shared_ptr<SparkController> mSparkController; /*!< SparkController of the observed simualtion. */ + QTimer mUpdateTimer; /*!< Update timer. When it ticks, the next simualtion cycle will update the display. */ + + bool mInit; /*!< True after spark access was initialized. */ + bool mLastInitState; /*!< Initialization state during last init try. */ + int mSelectedPlayer; /*!< Currently selected agents index. */ + int mUpdateCount; /*!< Amount of updates calls since last reset. */ + bool mReadyUpdate; /*!< If true (activated by update timer) update will be called in next simulation cycle. */ + TPlayMode mSelectedPlayMode; /*!< Currently selected play mode in ui combo box. */ + + boost::shared_ptr<ServerThread> mServerThread; /*!< Observes server thread. */ + boost::shared_ptr<oxygen::GameControlServer> mGameControlServer; /*!< Observes game control server. */ + boost::shared_ptr<SoccerRuleAspect> mRuleAspect; /*!< Observes servers soccer rule aspect. */ + boost::shared_ptr<BallStateAspect> mBallAspect; /*!< Observed servers ball state asoect. */ + boost::shared_ptr<GameStateAspect> mGameAspect; /*!< Observed servers game state aspect. */ + //std::vector<boost::shared_ptr<AgentAspect>> mAgentAspects; /*!< Observed servers agent state aspects. */ + + QString mGameControlServerPath; /*!< Expected scene graph path of game control server. (Loaded from settings) */ + QString mGameStateAspectPath; /*!< Expected scene graph path of game state aspect. (Loaded from settings) */ + QString mSoccerRuleAspectPath; /*!< Expected scene graph path of soccer rule aspect. (Loaded from settings) */ + QString mBallStateAspectPath; /*!< Expected scene graph path of ball state aspect. (Loaded from settings) */ + + QMap<int, GameMode> mGameModes; /*!< Map containing all of the game modes with their TPlayMode indices. */ +}; + +#endif // SOCCERCONTROLFRAME_H Added: trunk/rcssserver3d/guiplugin/soccercontrolframe/soccercontrolframe.ui =================================================================== --- trunk/rcssserver3d/guiplugin/soccercontrolframe/soccercontrolframe.ui (rev 0) +++ trunk/rcssserver3d/guiplugin/soccercontrolframe/soccercontrolframe.ui 2015-09-12 01:48:23 UTC (rev 399) @@ -0,0 +1,857 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>SoccerControlFrame</class> + <widget class="AttachableFrame" name="SoccerControlFrame"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>297</width> + <height>565</height> + </rect> + </property> + <property name="windowTitle"> + <string>Frame</string> + </property> + <property name="whatsThis"> + <string>The soccer control frame can be used to monitor and control the state of a simspark soccer simulation.</string> + </property> + <layout class="QGridLayout" name="gridLayout_3"> + <property name="margin"> + <number>0</number> + </property> + <item row="0" column="0"> + <widget class="QWidget" name="widget_6" native="true"> + <layout class="QVBoxLayout" name="verticalLayout_5"> + <item> + <widget class="QGroupBox" name="groupBox"> + <property name="font"> + <font> + <pointsize>10</pointsize> + </font> + </property> + <property name="title"> + <string>Game State</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <widget class="QWidget" name="widget_8" native="true"> + <property name="font"> + <font> + <pointsize>8</pointsize> + </font> + </property> + <layout class="QHBoxLayout" name="horizontalLayout_4"> + <property name="margin"> + <number>0</number> + </property> + <item> + <widget class="QLabel" name="gameTimeHeaderLabel"> + <property name="font"> + <font> + <pointsize>8</pointsize> + </font> + </property> + <property name="text"> + <string>Game Time:</string> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit"... [truncated message content] |