Merge github.com/trick 17.3.0 updates to developer.nasa.gov/trick

This commit is contained in:
John M. Penn 2018-04-25 16:40:42 -05:00
commit 8bba7ac30f
201 changed files with 4280 additions and 2895 deletions

1
.gitignore vendored
View File

@ -21,6 +21,7 @@ bin/trick-fxplot
bin/trick-gxplot bin/trick-gxplot
bin/trick-trk2ascii bin/trick-trk2ascii
bin/trick-trk2csv bin/trick-trk2csv
bin/trick-trkConvert
aclocal.m4 aclocal.m4
autom4te.cache autom4te.cache
trick_test trick_test

View File

@ -343,7 +343,20 @@ ${ER7_HEADERS} : ${PREFIX}/include/% : trick_source/%
install -m 0644 $? $@ install -m 0644 $? $@
install: ${ER7_HEADERS} install: ${ER7_HEADERS}
@if [ ! -d ${TRICK_LIB_DIR} ]; then \
make; \
fi
@if [ ${PREFIX} = "/usr/local" ]; then \
if [[ $EUID -ne 0 ]]; then \
echo -e "\n\e[31mInstalling Trick to /usr/local, the default installation location, requires super user privileges."; \
echo -e "Please log in as a super user to continue.\e[0m\n"; \
exit 1; \
fi; \
fi
cp -r bin include $(notdir ${TRICK_LIB_DIR}) libexec share ${PREFIX} cp -r bin include $(notdir ${TRICK_LIB_DIR}) libexec share ${PREFIX}
@echo -e "\n\e[32mTrick has been installed successfully to ${PREFIX}.\e[0m\n"
uninstall: uninstall:
rm -f ${PREFIX}/bin/trick-CP rm -f ${PREFIX}/bin/trick-CP

View File

@ -1,6 +1,9 @@
dnl To generate a new top level configure script from this autoconf directory dnl To generate a new top level configure script from this autoconf directory
dnl 1. aclocal dnl 1. aclocal
dnl 2. autoconf -o ../configure dnl 2. autoconf -o ../configure
dnl If you run into "configure.ac:15: error: possibly undefined macro: AC_MSG_ERROR",
dnl try:
dnl autoreconf -fi
AC_INIT([Trick],[17+]) AC_INIT([Trick],[17+])
AC_LANG(C++) AC_LANG(C++)
@ -174,6 +177,25 @@ AC_DEFUN([AX_JSC_DIRS],[
AC_SUBST([MOTIF_HOME]) AC_SUBST([MOTIF_HOME])
]) ])
AC_DEFUN([AX_GCC_VERSION], [
GCC_VERSION=""
AS_IF([test "x$GCC" = "xyes"],[
AS_IF([test "x$ax_gcc_version_option" != "xno"],[
AC_CACHE_CHECK([gcc version],[ax_cv_gcc_version],[
ax_cv_gcc_version="`$CC -dumpversion`"
AS_IF([test "x$ax_cv_gcc_version" = "x"],[
ax_cv_gcc_version=""
])
])
GCC_VERSION=$ax_cv_gcc_version
])
])
AC_SUBST([GCC_VERSION])
])
dnl get the host_os.
AC_CANONICAL_HOST
dnl add extra paths to find gcc on RHEL 6 systems dnl add extra paths to find gcc on RHEL 6 systems
PATH="/opt/rh/devtoolset-3/root/usr/bin:${PATH}" PATH="/opt/rh/devtoolset-3/root/usr/bin:${PATH}"
dnl add extra paths to find xml headers and X headers on the mac. dnl add extra paths to find xml headers and X headers on the mac.
@ -185,7 +207,17 @@ dnl look for programs we need to compile and run
AC_PROG_AWK AC_PROG_AWK
AC_PROG_CC AC_PROG_CC
AC_PROG_CXX AC_PROG_CXX
AX_GCC_VERSION
dnl do not test gcc version on mac. clang as gcc will return version and it's not >= 4.8
TEST_GCC=yes
case "${host_os}" in
darwin*)
TEST_GCC=no
;;
*)
;;
esac
AS_IF([test "$TEST_GCC" = "yes"],[AX_GCC_VERSION],[])
dnl if the compiler is gcc, test for gcc >= 4.8 dnl if the compiler is gcc, test for gcc >= 4.8
AS_IF([test "x$GCC_VERSION" = "x"],[], AS_IF([test "x$GCC_VERSION" = "x"],[],
[AC_MSG_CHECKING([gcc version >= 4.8]) [AC_MSG_CHECKING([gcc version >= 4.8])
@ -206,6 +238,8 @@ AC_PROG_LEX
AS_IF([test "x$LEX" = "x:"],AC_MSG_ERROR([could not find flex]),[]) AS_IF([test "x$LEX" = "x:"],AC_MSG_ERROR([could not find flex]),[])
AC_PATH_PROG(BISON, bison, nobison) AC_PATH_PROG(BISON, bison, nobison)
AS_IF([test "$ac_cv_path_BISON" = "nobison"],AC_MSG_ERROR([could not find bison]),[]) AS_IF([test "$ac_cv_path_BISON" = "nobison"],AC_MSG_ERROR([could not find bison]),[])
AC_PATH_PROG(CURL, curl, nocurl)
AS_IF([test "$ac_cv_path_CURL" = "nocurl"],AC_MSG_ERROR([could not find curl]),[])
AC_PATH_PROG(PERL, perl, noperl) AC_PATH_PROG(PERL, perl, noperl)
AS_IF([test "$ac_cv_path_PERL" = "noperl"],AC_MSG_ERROR([could not find perl]),[]) AS_IF([test "$ac_cv_path_PERL" = "noperl"],AC_MSG_ERROR([could not find perl]),[])
AC_PATH_PROG(PYTHON, python${PYTHON_VERSION}, nopython) AC_PATH_PROG(PYTHON, python${PYTHON_VERSION}, nopython)
@ -249,6 +283,25 @@ AC_PATH_PROG(CLANG, clang, noclang, "$LLVM_BIN_DIR:/bin:/usr/bin:/usr/local/bin:
AS_IF([test "$ac_cv_path_CLANG" = "noclang"],AC_MSG_ERROR([could not find clang]),[]) AS_IF([test "$ac_cv_path_CLANG" = "noclang"],AC_MSG_ERROR([could not find clang]),[])
AC_SUBST([LLVM_HOME]) AC_SUBST([LLVM_HOME])
AC_DEFUN([AX_CLANG_VERSION], [
CLANG_VERSION=""
ax_cv_clang_version="`$CLANG --version | grep "version" | sed "s/.*version \([0-9]*\.[0-9]*\.[0-9]*\).*/\1/"`"
AS_IF([test "x$ax_cv_clang_version" = "x"],[
ax_cv_clang_version=""
])
CLANG_VERSION=$ax_cv_clang_version
AC_SUBST([CLANG_VERSION])
])
AX_CLANG_VERSION
dnl if llvm/clang, test for version >= 3.4.2
AS_IF([test "x$CLANG_VERSION" = "x"],[],
[AC_MSG_CHECKING([clang version >= 3.4.2])
AX_COMPARE_VERSION([$CLANG_VERSION],[ge],[3.4.2], [AC_MSG_RESULT([yes])],
[AC_MSG_RESULT([no])
AC_MSG_ERROR([Trick requires llvm/clang version >= 3.4.2])
])
])
AX_CHECK_ZLIB([],AC_MSG_ERROR([could not find zlib])) AX_CHECK_ZLIB([],AC_MSG_ERROR([could not find zlib]))
dnl look for udunits in /usr/include and /usr/include/udunits2 dnl look for udunits in /usr/include and /usr/include/udunits2
@ -260,13 +313,14 @@ AS_IF([test "$UDUNITS_HOME" = ""],
UDUNITS_LDFLAGS=-ludunits2 UDUNITS_LDFLAGS=-ludunits2
], ],
[ [
UDUNITS_EXCLUDE=$UDUNITS_HOME
AC_CHECK_FILE([$UDUNITS_HOME/include/udunits2.h], AC_CHECK_FILE([$UDUNITS_HOME/include/udunits2.h],
[UDUNITS_INCLUDES=-I$UDUNITS_HOME/include [UDUNITS_INCLUDES=-I$UDUNITS_HOME/include
UDUNITS_LDFLAGS="-L$UDUNITS_HOME/lib -ludunits2" UDUNITS_LDFLAGS="-Wl,-rpath,$UDUNITS_HOME/lib -L$UDUNITS_HOME/lib -ludunits2"
], ],
[AC_CHECK_FILE([$UDUNITS_HOME/lib/udunits2.h], [AC_CHECK_FILE([$UDUNITS_HOME/lib/udunits2.h],
[UDUNITS_INCLUDES=-I$UDUNITS_HOME/lib [UDUNITS_INCLUDES=-I$UDUNITS_HOME/lib
UDUNITS_LDFLAGS="-L$UDUNITS_HOME/lib -ludunits2" UDUNITS_LDFLAGS="-Wl,-rpath,$UDUNITS_HOME/lib -L$UDUNITS_HOME/lib -ludunits2"
], ],
AC_MSG_ERROR([could not find udunits2])) AC_MSG_ERROR([could not find udunits2]))
] ]
@ -275,6 +329,7 @@ AS_IF([test "$UDUNITS_HOME" = ""],
) )
AC_SUBST([UDUNITS_INCLUDES]) AC_SUBST([UDUNITS_INCLUDES])
AC_SUBST([UDUNITS_LDFLAGS]) AC_SUBST([UDUNITS_LDFLAGS])
AC_SUBST([UDUNITS_EXCLUDE])
dnl process the other optional command line arguments dnl process the other optional command line arguments
AX_HDF5_HOME([]) AX_HDF5_HOME([])

View File

@ -67,7 +67,6 @@ ifndef TRICK_VERBOSE_BUILD
endif endif
MAKE_OUT := build/MAKE_out MAKE_OUT := build/MAKE_out
REMOVE_MAKE_OUT := $(shell rm -f $(MAKE_OUT))
all: all:
$(info Trick Build Process Complete) $(info Trick Build Process Complete)
@ -90,11 +89,11 @@ $(TRICK_STATIC_LIB):
# CP creates S_source.hh required for ICG and SWIG processing # CP creates S_source.hh required for ICG and SWIG processing
S_source.hh: S_define | build S_source.hh: S_define | build
$(PRINT_CP) $(PRINT_CP)
$(ECHO_CMD)${TRICK_HOME}/$(LIBEXEC)/trick/configuration_processor $(TRICK_CPFLAGS) $(ECHO_CMD)${TRICK_HOME}/$(LIBEXEC)/trick/configuration_processor $(TRICK_CPFLAGS) 2>&1 | $(TEE) -a $(MAKE_OUT) ; exit $${PIPESTATUS[0]}
build/Makefile_S_define: S_source.hh build/Makefile_S_define: S_source.hh
$(PRINT_S_DEF_DEPS) $(PRINT_S_DEF_DEPS)
$(ECHO_CMD)$(TRICK_CPPC) $(TRICK_SFLAGS) $(TRICK_SYSTEM_SFLAGS) -MM -MT S_source.hh -MF build/Makefile_S_define -x c++ S_define $(ECHO_CMD)$(TRICK_CPPC) $(TRICK_SFLAGS) $(TRICK_SYSTEM_SFLAGS) -MM -MT S_source.hh -MF build/Makefile_S_define -x c++ S_define 2>&1 | $(TEE) -a $(MAKE_OUT) ; exit $${PIPESTATUS[0]}
# Automatic and manual ICG rules # Automatic and manual ICG rules
ICG: ICG:
@ -108,20 +107,20 @@ force_ICG:
# Create makefile for IO code # Create makefile for IO code
build/Makefile_io_src: S_source.hh | build build/Makefile_io_src: S_source.hh | build
$(PRINT_ICG) $(PRINT_ICG)
$(ECHO_CMD)${TRICK_HOME}/bin/trick-ICG -m ${TRICK_ICGFLAGS} ${TRICK_CXXFLAGS} ${TRICK_SYSTEM_CXXFLAGS} $< $(ECHO_CMD)${TRICK_HOME}/bin/trick-ICG -m ${TRICK_ICGFLAGS} ${TRICK_CXXFLAGS} ${TRICK_SYSTEM_CXXFLAGS} $< 2>&1 | $(TEE) -a $(MAKE_OUT) ; exit $${PIPESTATUS[0]}
# Create makefile for source code # Create makefile for source code
#build/Makefile_src: build/ICG_processed build/ICG_no_found build/S_define.lib_deps #build/Makefile_src: build/ICG_processed build/ICG_no_found build/S_define.lib_deps
build/Makefile_src: build/Makefile_src_deps build/Makefile_io_src S_source.hh build/Makefile_src: build/Makefile_src_deps build/Makefile_io_src S_source.hh
$(PRINT_MAKEFILE_SRC) $(PRINT_MAKEFILE_SRC)
$(ECHO_CMD)${TRICK_HOME}/$(LIBEXEC)/trick/make_makefile_src $? $(ECHO_CMD)${TRICK_HOME}/$(LIBEXEC)/trick/make_makefile_src $? 2>&1 | $(TEE) -a $(MAKE_OUT) ; exit $${PIPESTATUS[0]}
build/Makefile_src_deps: ; build/Makefile_src_deps: ;
# Create makefile for SWIG code # Create makefile for SWIG code
build/Makefile_swig: S_source.hh build/Makefile_swig_deps build/Makefile_swig: S_source.hh build/Makefile_swig_deps
$(PRINT_MAKEFILE_SWIG) $(PRINT_MAKEFILE_SWIG)
$(ECHO_CMD)${TRICK_HOME}/$(LIBEXEC)/trick/make_makefile_swig $(ECHO_CMD)${TRICK_HOME}/$(LIBEXEC)/trick/make_makefile_swig 2>&1 | $(TEE) -a $(MAKE_OUT) ; exit $${PIPESTATUS[0]}
build/Makefile_swig_deps: ; build/Makefile_swig_deps: ;
@ -129,7 +128,7 @@ build/Makefile_swig_deps: ;
# build process. # build process.
.PHONY: convert_swig .PHONY: convert_swig
convert_swig: build/S_library_swig convert_swig: build/S_library_swig
$(ECHO_CMD)${TRICK_HOME}/$(LIBEXEC)/trick/convert_swig ${TRICK_CONVERT_SWIG_FLAGS} $(ECHO_CMD)${TRICK_HOME}/$(LIBEXEC)/trick/convert_swig ${TRICK_CONVERT_SWIG_FLAGS} 2>&1 | $(TEE) -a $(MAKE_OUT) ; exit $${PIPESTATUS[0]}
# Force S_define_exp to be remade each time this rule runs # Force S_define_exp to be remade each time this rule runs
.PHONY: S_define_exp .PHONY: S_define_exp
@ -155,14 +154,17 @@ ifeq ($(findstring ${MAKECMDGOALS},$(CLEAN_TARGETS)),)
-include build/Makefile_swig_deps -include build/Makefile_swig_deps
-include build/Makefile_ICG -include build/Makefile_ICG
endif endif
-include S_overrides.mk
-include build/Makefile_overrides -include build/Makefile_overrides
-include S_overrides.mk
ifndef MAKE_RESTARTS
REMOVE_MAKE_OUT := $(shell rm -f $(MAKE_OUT))
ifeq ($(MAKECMDGOALS),) ifeq ($(MAKECMDGOALS),)
$(info $(call COLOR,Building with the following compilation flags:)) $(info $(call COLOR,Building with the following compilation flags:))
$(info TRICK_CFLAGS = $(TRICK_CFLAGS)) $(info TRICK_CFLAGS = $(TRICK_CFLAGS))
$(info TRICK_CXXFLAGS = $(TRICK_CXXFLAGS)) $(info TRICK_CXXFLAGS = $(TRICK_CXXFLAGS))
endif endif
endif
else else
all: all:

1640
configure vendored

File diff suppressed because it is too large Load Diff

View File

@ -52,15 +52,15 @@ namespace Trick {
@param address Address of the variable. @param address Address of the variable.
@param attr ATTRIBUTES of the variable. @param attr ATTRIBUTES of the variable.
@param curr_dim @param curr_dim Dimensions of the array
@param offset @param offset Offset into the array
*/ */
void assign_rvalue( std::ostream& chkpnt_os, void* address, ATTRIBUTES* attr, int curr_dim, int offset); void assign_rvalue( std::ostream& chkpnt_os, void* address, ATTRIBUTES* attr, int curr_dim, int offset);
/** /**
Restore memory allocations from a checkpoint stream. Restore memory allocations from a checkpoint stream.
@param checkpoint_stream Input stream from which the checkpoint is read. @param checkpoint_stream Input stream from which the checkpoint is read.
@return @return 0/1 success flag
*/ */
int restore( std::istream* checkpoint_stream); int restore( std::istream* checkpoint_stream);
@ -72,7 +72,6 @@ namespace Trick {
@param address - address of the object within which we are checking for nil values. @param address - address of the object within which we are checking for nil values.
@param attr - attr describing the object at the address. @param attr - attr describing the object at the address.
@param curr_dim - dimension of the sub-element being checked. @param curr_dim - dimension of the sub-element being checked.
@param offset - offset of the sub-element
@param offset - if the object specified by @b address and @b attr is arrayed, then this @param offset - if the object specified by @b address and @b attr is arrayed, then this
parameter specifies where, within the array, the sub-object to be parameter specifies where, within the array, the sub-object to be
checked, is located. checked, is located.
@ -86,7 +85,7 @@ namespace Trick {
The pointer must be an address that is being managed by MM (the MemoryManager) or a The pointer must be an address that is being managed by MM (the MemoryManager) or a
character string (char* or wchar_t*). character string (char* or wchar_t*).
@param pointer @param pointer Pointer to be converted.
@param attr ATTRIBUTES of the pointer. @param attr ATTRIBUTES of the pointer.
@param curr_dim current dimension. @param curr_dim current dimension.
@return text expression that represents the pointer. @return text expression that represents the pointer.

View File

@ -117,7 +117,7 @@ namespace Trick {
private: private:
/** The log file.\n */ /** The log file.\n */
int fp ; /**< trick_io(**) trick_units(--) */ int fd ; /**< trick_io(**) trick_units(--) */
} ; } ;

View File

@ -100,6 +100,12 @@ namespace Trick {
/** @brief Disable a group or all groups */ /** @brief Disable a group or all groups */
int record_now_group( const char * in_name ) ; int record_now_group( const char * in_name ) ;
/** @brief set max file size for group */
int set_group_max_file_size(const char * in_name, uint64_t bytes) ;
/** @brief set max file size for all groups */
int set_max_file_size(uint64_t bytes) ;
// override the default Schduler::add_sim_object // override the default Schduler::add_sim_object
virtual int add_sim_object( Trick::SimObject * in_object ) ; virtual int add_sim_object( Trick::SimObject * in_object ) ;

View File

@ -115,6 +115,12 @@ namespace Trick {
/** Current write to file record number.\n */ /** Current write to file record number.\n */
unsigned int writer_num; /**< trick_io(**) trick_units(--) */ unsigned int writer_num; /**< trick_io(**) trick_units(--) */
/** Maximum file size for data record file in bytes.\n */
uint64_t max_file_size; /**< trick_io(**) trick_units(--) */
/** Current file size for data record file in bytes.\n */
uint64_t total_bytes_written; /**< trick_io(**) trick_units(--) */
/** Buffer to hold formatted data ready for disk or other destination.\n */ /** Buffer to hold formatted data ready for disk or other destination.\n */
char * writer_buff ; /**< trick_io(**) trick_units(--) */ char * writer_buff ; /**< trick_io(**) trick_units(--) */
@ -207,6 +213,17 @@ namespace Trick {
*/ */
virtual int set_buffer_type(int buffer_type) ; virtual int set_buffer_type(int buffer_type) ;
/**
@brief @userdesc Command to set the max file size in bytes.
This tells the data record group when it stops writing to the disk.
@par Python Usage:
@code <dr_group>.set_max_file_size(<buffer_type>) @endcode
@param type - the file size in bytes
@return always 0
*/
virtual int set_max_file_size(uint64_t bytes) ;
/** /**
@brief @userdesc Command to print double variable values as single precision (float) in the log file to save space. @brief @userdesc Command to print double variable values as single precision (float) in the log file to save space.
@par Python Usage: @par Python Usage:

View File

@ -146,6 +146,9 @@ namespace Trick {
/** Number of active events\n */ /** Number of active events\n */
unsigned int num_active_events ; /**< trick_io(*io) trick_units(--) */ unsigned int num_active_events ; /**< trick_io(*io) trick_units(--) */
/** Number of active events allocated\n */
unsigned int num_allocated ; /**< trick_io(*io) trick_units(--) */
/** All of the event processors, one per thread. */ /** All of the event processors, one per thread. */
std::vector< Trick::EventProcessor * > event_processors ; /**< trick_io(**) */ std::vector< Trick::EventProcessor * > event_processors ; /**< trick_io(**) */

View File

@ -13,6 +13,7 @@ PROGRAMMERS:
#include "trick/FrameDataRecordGroup.hh" #include "trick/FrameDataRecordGroup.hh"
#include "trick/attributes.h" #include "trick/attributes.h"
#include "trick/JobData.hh" #include "trick/JobData.hh"
#include "trick/Clock.hh"
namespace Trick { namespace Trick {
@ -77,10 +78,12 @@ namespace Trick {
/** Save the name of the trick master/slave sim object.\n */ /** Save the name of the trick master/slave sim object.\n */
std::string ms_sim_object_name; /**< trick_io(**) */ std::string ms_sim_object_name; /**< trick_io(**) */
Trick::Clock & clock ; /**< trick_io(**) */
/** /**
@brief Constructor. @brief Constructor.
*/ */
FrameLog() ; FrameLog(Trick::Clock & in_clock) ;
/** /**
@brief Destructor. @brief Destructor.
@ -152,6 +155,8 @@ namespace Trick {
*/ */
int shutdown() ; int shutdown() ;
void set_clock(Trick::Clock & in_clock) ;
private: private:
std::vector<std::string> trick_jobs; // ** vector containing all trick job names std::vector<std::string> trick_jobs; // ** vector containing all trick job names
std::vector<std::string> user_jobs; // ** vector containing all user job names std::vector<std::string> user_jobs; // ** vector containing all user job names
@ -188,6 +193,9 @@ namespace Trick {
*/ */
int create_DP_timeline_files(); int create_DP_timeline_files();
// This object is not copyable
void operator =(const FrameLog &) {};
} ; } ;
} ; } ;

View File

@ -111,9 +111,9 @@ namespace Trick {
/** @userdesc Last simulation time that this event ran an action.\n */ /** @userdesc Last simulation time that this event ran an action.\n */
double ran_time ; /**< trick_io(*io) trick_units(s) */ double ran_time ; /**< trick_io(*io) trick_units(s) */
/** Array of event's conditions.\n */ /** Array of event's conditions.\n */
condition_t * cond ; /**< trick_io(*io) trick_units(--) */ condition_t ** condition_list ; /**< trick_io(*io) trick_units(--) */
/** Array of event's actions.\n */ /** Array of event's actions.\n */
action_t * act ; /**< trick_io(*io) trick_units(--) */ action_t ** action_list ; /**< trick_io(*io) trick_units(--) */
/** /**
@brief Constructor. @brief Constructor.

View File

@ -84,7 +84,7 @@ class IntegLoopScheduler;
* Designate the specified sim object as integrated by the specified * Designate the specified sim object as integrated by the specified
* scheduler. * scheduler.
* @param sim_object Simulation object. * @param sim_object Simulation object.
* @param scheduler Integration loop scheduler. * @param integrator Integration loop scheduler.
*/ */
void set_integrated_by ( void set_integrated_by (
Trick::SimObject * sim_object, Trick::SimObject * sim_object,

View File

@ -114,7 +114,7 @@ namespace Trick {
/** /**
* Non-default constructor. * Non-default constructor.
* @param cycle The time interval at which the loop's integrate * @param in_cycle The time interval at which the loop's integrate
* function will be called. * function will be called.
* @param parent_so The Trick simulation object that contains this * @param parent_so The Trick simulation object that contains this
* IntegLoopScheduler object. * IntegLoopScheduler object.

View File

@ -179,7 +179,7 @@ namespace Trick {
/** /**
* Sets/Resets the static time_tic value * Sets/Resets the static time_tic value
* @param time_tic_value - number of tics per second * @param in_time_tic_value - number of tics per second
* @return always 0 * @return always 0
*/ */
static int set_time_tic_value(long long in_time_tic_value) ; static int set_time_tic_value(long long in_time_tic_value) ;
@ -187,7 +187,6 @@ namespace Trick {
/** /**
* Sets/Resets the job cycle rate * Sets/Resets the job cycle rate
* @param rate - desired cycle rate in seconds * @param rate - desired cycle rate in seconds
* @param time_tic_value - number of tics per second
* @return always 0 * @return always 0
*/ */
virtual int set_cycle(double rate) ; virtual int set_cycle(double rate) ;
@ -214,10 +213,10 @@ namespace Trick {
/** /**
* Adds another job as a dependency to this job * Adds another job as a dependency to this job
* @param depend - JobData instance of depends_on job * @param in_tag - JobData instance of depends_on job
* @return always 0 * @return always 0
*/ */
virtual int add_tag( std::string ) ; virtual int add_tag( std::string in_tag) ;
/** /**
* Adds another job as a dependency to this job * Adds another job as a dependency to this job

View File

@ -305,7 +305,7 @@ namespace Trick {
/** /**
Forget about the variable with the given name and deallocate the memory associated with it. Forget about the variable with the given name and deallocate the memory associated with it.
@param address - the address of the variable. @param var_name - the address of the variable.
@return 0 = SUCCESS, 1 = FAILURE @return 0 = SUCCESS, 1 = FAILURE
*/ */
int delete_var(const char* var_name); int delete_var(const char* var_name);
@ -321,7 +321,7 @@ namespace Trick {
/** /**
Forget about the external variable with the given name. DOES NOT attempt to deallocate the Forget about the external variable with the given name. DOES NOT attempt to deallocate the
memory at the given address. memory at the given address.
@param address - the address of the external variable. @param var_name - the address of the external variable.
@return 0 = SUCCESS, 1 = FAILURE @return 0 = SUCCESS, 1 = FAILURE
*/ */
int delete_extern_var(const char* var_name); int delete_extern_var(const char* var_name);
@ -334,35 +334,35 @@ namespace Trick {
/** /**
Checkpoint all allocations known to the MemoryManager to a file. Checkpoint all allocations known to the MemoryManager to a file.
@param filename @param filename Name of file to be written.
*/ */
void write_checkpoint( const char* filename); void write_checkpoint( const char* filename);
/** /**
Checkpoint the named variable (allocation) and it dependencies to the given stream. Checkpoint the named variable (allocation) and it dependencies to the given stream.
@param out_s output stream. @param out_s output stream.
@param var_name @param var_name Variable name.
*/ */
void write_checkpoint( std::ostream& out_s, const char* var_name); void write_checkpoint( std::ostream& out_s, const char* var_name);
/** /**
Checkpoint the named variable (allocation) and it dependencies to a file. Checkpoint the named variable (allocation) and it dependencies to a file.
@param filename @param filename Checkpoint file.
@param var_name @param var_name Variable name.
*/ */
void write_checkpoint( const char* filename, const char* var_name); void write_checkpoint( const char* filename, const char* var_name);
/** /**
Checkpoint the named variables and their dependencies to a stream. Checkpoint the named variables and their dependencies to a stream.
@param out_s output stream. @param out_s output stream.
@param var_name_list @param var_name_list List of variable names.
*/ */
void write_checkpoint( std::ostream& out_s, std::vector<const char*>& var_name_list); void write_checkpoint( std::ostream& out_s, std::vector<const char*>& var_name_list);
/** /**
Checkpoint the named variables and their dependencies to a file. Checkpoint the named variables and their dependencies to a file.
@param filename @param filename output file name.
@param var_name_list @param var_name_list List of variable names.
*/ */
void write_checkpoint( const char* filename, std::vector<const char*>& var_name_list); void write_checkpoint( const char* filename, std::vector<const char*>& var_name_list);
@ -521,13 +521,13 @@ namespace Trick {
/** /**
Return the number of array elements in the allocation. Return the number of array elements in the allocation.
@param ptr address. @param addr Address.
*/ */
int get_size(void *addr); int get_size(void *addr);
/** /**
Return the number of array elements in the allocation following ptr. Return the number of array elements in the allocation following ptr.
@param ptr - pointer. @param addr Address.
*/ */
int get_truncated_size(void *addr); int get_truncated_size(void *addr);
@ -565,7 +565,7 @@ namespace Trick {
/** /**
Opens a handle to the shared library file. The handles are used to look for io_src functions. Opens a handle to the shared library file. The handles are used to look for io_src functions.
@param name The name of the file to open. @param file_name The name of the file to open.
*/ */
int add_shared_library_symbols( const char * file_name ); int add_shared_library_symbols( const char * file_name );
@ -609,7 +609,7 @@ namespace Trick {
Write the contents of the variable with the given name to the given stream. Write the contents of the variable with the given name to the given stream.
In other words, checkpoint a single variable to a file. In other words, checkpoint a single variable to a file.
@param out_s - output stream. @param out_s - output stream.
@param address - address of the variable. @param var_name - Name of the variable.
*/ */
void write_var( std::ostream& out_s, const char* var_name ); void write_var( std::ostream& out_s, const char* var_name );
@ -798,16 +798,13 @@ namespace Trick {
/** /**
Call the default destructor for one or more instances of the named class. Call the default destructor for one or more instances of the named class.
@param class_name The name of the class to allocate. @param alloc_info The alloc_info struct that contains the address and type to delete.
@param num The number of instances to allocate.
@return The address of the allocation, or NULL on failure.
*/ */
void io_src_destruct_class(ALLOC_INFO * alloc_info); void io_src_destruct_class(ALLOC_INFO * alloc_info);
/** /**
Call the proper class/struct delete for the address given in the ALLOC_INFO struct. Call the proper class/struct delete for the address given in the ALLOC_INFO struct.
@alloc_info The alloc_info struct that contains the address and type to delete. @param alloc_info The alloc_info struct that contains the address and type to delete.
@return none.
*/ */
void io_src_delete_class(ALLOC_INFO * alloc_info); void io_src_delete_class(ALLOC_INFO * alloc_info);

View File

@ -59,7 +59,7 @@ namespace Trick {
@brief Initializes this subscriber. @brief Initializes this subscriber.
@return always 0 @return always 0
*/ */
int init() ; virtual int init() ;
protected: protected:
/** The output file stream. \n */ /** The output file stream. \n */

View File

@ -45,6 +45,11 @@ namespace Trick {
*/ */
virtual ~MessageSubscriber() {} ; virtual ~MessageSubscriber() {} ;
/**
@brief Initializes the subscriber
*/
virtual int init() { return 0 ; } ;
/** /**
@brief Get a message and send to output. This gets called every time when the message publisher @brief Get a message and send to output. This gets called every time when the message publisher
that this subscriber subscribes to publishes a message. Actual output done in the derived class. that this subscriber subscribes to publishes a message. Actual output done in the derived class.
@ -54,6 +59,11 @@ namespace Trick {
*/ */
virtual void update( unsigned int level , std::string header, std::string message ) = 0 ; virtual void update( unsigned int level , std::string header, std::string message ) = 0 ;
/**
@brief Shutdown the subscriber
*/
virtual int shutdown() { return 0 ; } ;
} ; } ;
} }

View File

@ -86,7 +86,7 @@ namespace Trick {
@brief Initializes this subscriber. @brief Initializes this subscriber.
@return always 0 @return always 0
*/ */
int init() ; virtual int init() ;
/** /**
@brief Restarts this subscriber. @brief Restarts this subscriber.
@ -98,7 +98,7 @@ namespace Trick {
@brief Shuts down this subscriber. @brief Shuts down this subscriber.
@return always 0 @return always 0
*/ */
int shutdown() ; virtual int shutdown() ;
/** The port number for message socket connection. Copied out from listen_thread.\n */ /** The port number for message socket connection. Copied out from listen_thread.\n */
int port ; /**< trick_units(--) */ int port ; /**< trick_units(--) */

View File

@ -0,0 +1,78 @@
/*
PURPOSE:
(Print messages to std::cout on a seperate thread)
*/
#ifndef MESSAGETHREADEDCOUT_HH
#define MESSAGETHREADEDCOUT_HH
#include <iostream>
#include "trick/ThreadBase.hh"
#include "trick/MessageSubscriber.hh"
namespace Trick {
/**
* This MessageThreadedCout is a class that inherits from MessageSubscriber.
* It defines a type of MessageSubscriber with its received message sending to the standard output stream.
*/
class MessageThreadedCout : public MessageSubscriber , public Trick::ThreadBase {
public:
/**
@brief Maximum number of items to hold in ring buffer
*/
unsigned int max_buffer_items ; // trick_units(--)
/**
@brief Maximum size of string to hold
*/
unsigned int max_buffer_size ; // trick_units(--)
std::string color_code ;
/**
@brief The constructor.
*/
MessageThreadedCout() ;
virtual ~MessageThreadedCout() {} ;
// From MessageSubscriber
virtual int init() ;
virtual void update( unsigned int level , std::string header , std::string message ) ;
virtual int shutdown() ;
// From Trick::ThreadBase
virtual void * thread_body() ;
virtual void dump( std::ostream & oss = std::cout ) ;
// Specific Classes
void write_pending_messages() ;
protected:
// After sim shutdown print immediately.
bool print_immediate ;
struct StringNode {
std::string buffer ;
size_t max_len ;
StringNode * next ;
StringNode(size_t str_len) : max_len(str_len) { buffer.reserve(max_len) ; } ;
void copy( std::string &header, std::string & in_color_code, std::string & message ) {
buffer.assign(header, 0, max_len) ;
buffer.append(in_color_code, 0, max_len - buffer.length()) ;
buffer.append(message, 0, max_len - buffer.length()) ;
buffer.append("\033[00m", 0, max_len - buffer.length()) ;
} ;
} ;
StringNode * copy_ptr ; /* trick_io(**) pointer to next buffer to copy data */
StringNode * write_ptr ; /* trick_io(**) pointer to next buffer to write to screen */
pthread_mutex_t write_mutex ; /* trick_io(**) mutex for writing */
} ;
}
#endif

View File

@ -0,0 +1,32 @@
#ifndef RODRIGUES_ROTATION_H
#define RODRIGUES_ROTATION_H
#ifdef __cplusplus
extern "C" {
#endif
/**
* @ingroup TRICK_MATH
* @brief Generate a transformation matrix for rotation about a given line by a given
* angle, using Rodrigues formula.
*
* @param C_out - Transformation matrix for final to initial state.
* @param k - Vector in the direction of the rotation Axis.
* @param theta - Angle of rotation in radians.
*/
void RotAboutLineByAngle(double C_out[3][3], double k[3], double theta);
/**
* @ingroup TRICK_MATH
* @brief Generate a transformation matrix to rotate a vector to new a new orientation.
*
* @param v - Original vector.
* @param w - Vector after rotation.
* @param R_out - Rotation matrix, such that w = Rv.
*/
void RotVectorToNewOrientation(double R_out[3][3], double v[3], double w[3]);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -71,7 +71,7 @@ namespace Trick {
/** /**
* @brief Sets the curr_index to value. * @brief Sets the curr_index to value.
* @param value - Value of index. * @param ii - Value of index.
* @return always 0. * @return always 0.
*/ */
int set_curr_index( unsigned int ii ) ; int set_curr_index( unsigned int ii ) ;
@ -122,8 +122,6 @@ namespace Trick {
* @brief Adds the incoming instrumentation job before target job if specified, or all jobs in list. * @brief Adds the incoming instrumentation job before target job if specified, or all jobs in list.
* Will reallocate list to accommodate additional instrumentation jobs. * Will reallocate list to accommodate additional instrumentation jobs.
* @param instrumentation_job - name of the instrument job * @param instrumentation_job - name of the instrument job
* @param target_job - name of the target job, empty string means all jobs are to be instrumented
* @param in_event - instrumentation data to be stored with instrument job
* @return number of insertions made * @return number of insertions made
*/ */
int instrument_before(JobData * instrumentation_job) ; int instrument_before(JobData * instrumentation_job) ;
@ -132,8 +130,6 @@ namespace Trick {
* @brief Adds the incoming instrumentation job after target job if specified, or all jobs in the list. * @brief Adds the incoming instrumentation job after target job if specified, or all jobs in the list.
* Will reallocate list to accommodate additional instrumentation jobs. * Will reallocate list to accommodate additional instrumentation jobs.
* @param instrumentation_job - name of the instrument job * @param instrumentation_job - name of the instrument job
* @param target_job - name of the target job, empty string means all jobs are to be instrumented
* @param in_event - instrumentation data to be stored with instrument job
* @return number of insertions made * @return number of insertions made
*/ */
int instrument_after(JobData * instrumentation_job) ; int instrument_after(JobData * instrumentation_job) ;
@ -142,7 +138,6 @@ namespace Trick {
* @brief Removes all jobs in the list that match the name job_name. * @brief Removes all jobs in the list that match the name job_name.
* If in_event is specified, only remove this event's instrument job. * If in_event is specified, only remove this event's instrument job.
* @param job_name - name of the instrument job * @param job_name - name of the instrument job
* @param in_event - instrumentation data to be stored with instrument job
* @return always 0 * @return always 0
*/ */
int instrument_remove(std::string job_name) ; int instrument_remove(std::string job_name) ;

View File

@ -85,8 +85,6 @@ namespace Trick {
* otherwise adds in_job before each job in the initialization and scheduled queues. * otherwise adds in_job before each job in the initialization and scheduled queues.
* Requirement [@ref r_exec_instrument_0] * Requirement [@ref r_exec_instrument_0]
* @param instrument_job - the instrument job * @param instrument_job - the instrument job
* @param target_job - name of the target job, empty string means all jobs are to be instrumented
* @param in_event - instrumentation data to be stored with instrument job
* @return always 0 * @return always 0
*/ */
virtual int instrument_job_before(Trick::JobData * instrument_job ) = 0 ; virtual int instrument_job_before(Trick::JobData * instrument_job ) = 0 ;
@ -96,8 +94,6 @@ namespace Trick {
* otherwise adds in_job after each job in the initialization and scheduled queues. * otherwise adds in_job after each job in the initialization and scheduled queues.
* Requirement [@ref r_exec_instrument_2] * Requirement [@ref r_exec_instrument_2]
* @param instrument_job - the instrument job * @param instrument_job - the instrument job
* @param target_job - name of the target job, empty string means all jobs are to be instrumented
* @param in_event - instrumentation data to be stored with instrument job
* @return always 0 * @return always 0
*/ */
virtual int instrument_job_after(Trick::JobData * instrument_job ) = 0 ; virtual int instrument_job_after(Trick::JobData * instrument_job ) = 0 ;
@ -106,7 +102,6 @@ namespace Trick {
* Removes an instrumentation job with the name in_job in the initialization and scheduled queues. * Removes an instrumentation job with the name in_job in the initialization and scheduled queues.
* Requirement [@ref r_exec_instrument_3] * Requirement [@ref r_exec_instrument_3]
* @param in_job - name of the instrument job * @param in_job - name of the instrument job
* @param in_event - instrumentation data to be searched for
* @return always 0 * @return always 0
*/ */
virtual int instrument_job_remove(std::string in_job ) = 0 ; virtual int instrument_job_remove(std::string in_job ) = 0 ;

View File

@ -65,7 +65,7 @@ namespace Trick {
* @param name - name of lower level SimObject * @param name - name of lower level SimObject
* @return always 0 * @return always 0
*/ */
int add_pre_component_object(SimObject *, std::string name) ; int add_pre_component_object(SimObject * in_object, std::string name) ;
/** /**
* Includes a lower level SimObject where the lower level jobs are called after this SimObject * Includes a lower level SimObject where the lower level jobs are called after this SimObject
@ -73,7 +73,7 @@ namespace Trick {
* @param name - name of lower level SimObject * @param name - name of lower level SimObject
* @return always 0 * @return always 0
*/ */
int add_post_component_object(SimObject *, std::string name) ; int add_post_component_object(SimObject * in_object, std::string name) ;
/** /**
* Adds a job to the sim_object. This call is typically in the S_source.cpp file * Adds a job to the sim_object. This call is typically in the S_source.cpp file

View File

@ -53,6 +53,9 @@ namespace Trick {
/** Create test xml output.\n*/ /** Create test xml output.\n*/
bool enabled ; /**< trick_units(--) */ bool enabled ; /**< trick_units(--) */
/** Send the unit test exit code up the chain to Executive.\n*/
bool exit_code_enabled ; /**< trick_units(--) */
/** Name of Unit test\n*/ /** Name of Unit test\n*/
std::string name ; std::string name ;
@ -77,6 +80,12 @@ namespace Trick {
*/ */
bool enable() ; bool enable() ;
/**
@brief Enable/Disable exit code return feature.
@return always 0
*/
int set_exit_code_enabled( bool in_enable ) ;
/** /**
@brief Output message to the file. @brief Output message to the file.
*/ */
@ -96,6 +105,10 @@ namespace Trick {
*/ */
int set_file_name(std::string in_name) ; int set_file_name(std::string in_name) ;
/**
@brief Write output to xml file.
@return always 0
*/
int write_output() ; int write_output() ;
} ; } ;

View File

@ -55,22 +55,26 @@ int checkpoint_map_ik_id(STL & in_map , std::string object_name , std::string va
var_declare << type_string << " " var_declare << type_string << " "
<< object_name << "_" << var_name << "_keys[" << cont_size << "]" ; << object_name << "_" << var_name << "_keys[" << cont_size << "]" ;
keys = (typename STL::key_type *)TMM_declare_var_s(var_declare.str().c_str()) ; keys = (typename STL::key_type *)TMM_declare_var_s(var_declare.str().c_str()) ;
TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name + "_keys").c_str()) ; if ( keys ) {
//message_publish(1, "HERE with %s\n", var_declare) ; TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name + "_keys").c_str()) ;
//message_publish(1, "HERE with %s\n", var_declare) ;
var_declare.str("") ; var_declare.str("") ;
var_declare.clear() ; var_declare.clear() ;
type_string = stl_type_name_convert(abi::__cxa_demangle(typeid(*items).name(), 0, 0, &status )) ; type_string = stl_type_name_convert(abi::__cxa_demangle(typeid(*items).name(), 0, 0, &status )) ;
var_declare << type_string << " " var_declare << type_string << " "
<< object_name << "_" << var_name << "_data[" << cont_size << "]" ; << object_name << "_" << var_name << "_data[" << cont_size << "]" ;
items = (typename STL::mapped_type *)TMM_declare_var_s(var_declare.str().c_str()) ; items = (typename STL::mapped_type *)TMM_declare_var_s(var_declare.str().c_str()) ;
TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name + "_data").c_str()) ; if ( items ) {
//message_publish(1, "HERE with %s\n", var_declare) ; TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name + "_data").c_str()) ;
//message_publish(1, "HERE with %s\n", var_declare) ;
/* copy the contents of the map the 2 arrays */ /* copy the contents of the map the 2 arrays */
for ( iter = in_map.begin() , ii = 0 ; iter != in_map.end() ; iter++ , ii++ ) { for ( iter = in_map.begin() , ii = 0 ; iter != in_map.end() ; iter++ , ii++ ) {
keys[ii] = iter->first ; keys[ii] = iter->first ;
items[ii] = iter->second ; items[ii] = iter->second ;
}
}
} }
} }
return 0 ; return 0 ;
@ -111,29 +115,33 @@ int checkpoint_map_ik_sd(STL & in_map , std::string object_name , std::string va
var_declare << type_string << " " var_declare << type_string << " "
<< object_name << "_" << var_name << "_keys[" << cont_size << "]" ; << object_name << "_" << var_name << "_keys[" << cont_size << "]" ;
keys = (typename STL::key_type *)TMM_declare_var_s(var_declare.str().c_str()) ; keys = (typename STL::key_type *)TMM_declare_var_s(var_declare.str().c_str()) ;
TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name + "_keys").c_str()) ; if ( keys ) {
//message_publish(1, "HERE with %s\n", var_declare) ; TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name + "_keys").c_str()) ;
//message_publish(1, "HERE with %s\n", var_declare) ;
var_declare.str("") ; var_declare.str("") ;
var_declare.clear() ; var_declare.clear() ;
var_declare << "std::string " var_declare << "std::string "
<< object_name << "_" << var_name << "_data[" << cont_size << "]" ; << object_name << "_" << var_name << "_data[" << cont_size << "]" ;
items = (std::string *)TMM_declare_var_s(var_declare.str().c_str()) ; items = (std::string *)TMM_declare_var_s(var_declare.str().c_str()) ;
TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name + "_data").c_str()) ; if ( items ) {
//message_publish(1, "HERE with %s\n", var_declare) ; TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name + "_data").c_str()) ;
//message_publish(1, "HERE with %s\n", var_declare) ;
/* copy the contents of the map the 2 arrays */ /* copy the contents of the map the 2 arrays */
for ( iter = in_map.begin() , ii = 0 ; iter != in_map.end() ; iter++ , ii++ ) { for ( iter = in_map.begin() , ii = 0 ; iter != in_map.end() ; iter++ , ii++ ) {
keys[ii] = iter->first ; keys[ii] = iter->first ;
std::ostringstream sub_elements ; std::ostringstream sub_elements ;
sub_elements << object_name << "_" << var_name << "_data_" << ii ; sub_elements << object_name << "_" << var_name << "_data_" << ii ;
items[ii] = sub_elements.str() ; items[ii] = sub_elements.str() ;
std::ostringstream index_string ; std::ostringstream index_string ;
index_string << ii ; index_string << ii ;
//message_publish(1, "recursive call to checkpoint_stl %s\n", __PRETTY_FUNCTION__) ; //message_publish(1, "recursive call to checkpoint_stl %s\n", __PRETTY_FUNCTION__) ;
checkpoint_stl( iter->second , object_name + "_" + var_name + "_data" , index_string.str() ) ; checkpoint_stl( iter->second , object_name + "_" + var_name + "_data" , index_string.str() ) ;
}
}
} }
} }
return 0 ; return 0 ;
@ -173,30 +181,34 @@ int checkpoint_map_sk_id(STL & in_map , std::string object_name , std::string va
var_declare << "std::string " var_declare << "std::string "
<< object_name << "_" << var_name << "_keys[" << cont_size << "]" ; << object_name << "_" << var_name << "_keys[" << cont_size << "]" ;
keys = (std::string *)TMM_declare_var_s(var_declare.str().c_str()) ; keys = (std::string *)TMM_declare_var_s(var_declare.str().c_str()) ;
TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name + "_keys").c_str()) ; if ( keys ) {
//message_publish(1, "HERE with %s\n", var_declare) ; TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name + "_keys").c_str()) ;
//message_publish(1, "HERE with %s\n", var_declare) ;
var_declare.str("") ; var_declare.str("") ;
var_declare.clear() ; var_declare.clear() ;
std::string type_string = stl_type_name_convert(abi::__cxa_demangle(typeid(*items).name(), 0, 0, &status )) ; std::string type_string = stl_type_name_convert(abi::__cxa_demangle(typeid(*items).name(), 0, 0, &status )) ;
var_declare << type_string << " " var_declare << type_string << " "
<< object_name << "_" << var_name << "_data[" << cont_size << "]" ; << object_name << "_" << var_name << "_data[" << cont_size << "]" ;
items = (typename STL::mapped_type *)TMM_declare_var_s(var_declare.str().c_str()) ; items = (typename STL::mapped_type *)TMM_declare_var_s(var_declare.str().c_str()) ;
TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name + "_data").c_str()) ; if ( items ) {
//message_publish(1, "HERE with %s\n", var_declare) ; TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name + "_data").c_str()) ;
//message_publish(1, "HERE with %s\n", var_declare) ;
/* copy the contents of the map the 2 arrays */ /* copy the contents of the map the 2 arrays */
for ( iter = in_map.begin() , ii = 0 ; iter != in_map.end() ; iter++ , ii++ ) { for ( iter = in_map.begin() , ii = 0 ; iter != in_map.end() ; iter++ , ii++ ) {
std::ostringstream sub_elements ; std::ostringstream sub_elements ;
sub_elements << object_name << "_" << var_name << "_keys_" << ii ; sub_elements << object_name << "_" << var_name << "_keys_" << ii ;
keys[ii] = sub_elements.str() ; keys[ii] = sub_elements.str() ;
std::ostringstream index_string ; std::ostringstream index_string ;
index_string << ii ; index_string << ii ;
checkpoint_stl( const_cast<typename STL::key_type &>(iter->first) , checkpoint_stl( const_cast<typename STL::key_type &>(iter->first) ,
object_name + "_" + var_name + "_keys", index_string.str() ) ; object_name + "_" + var_name + "_keys", index_string.str() ) ;
items[ii] = iter->second ; items[ii] = iter->second ;
}
}
} }
} }
return 0 ; return 0 ;
@ -235,33 +247,37 @@ int checkpoint_map_stl_sk_sd(STL & in_map , std::string object_name , std::strin
var_declare << "std::string " var_declare << "std::string "
<< object_name << "_" << var_name << "_keys[" << cont_size << "]" ; << object_name << "_" << var_name << "_keys[" << cont_size << "]" ;
keys = (std::string *)TMM_declare_var_s(var_declare.str().c_str()) ; keys = (std::string *)TMM_declare_var_s(var_declare.str().c_str()) ;
TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name + "_keys").c_str()) ; if ( keys ) {
//message_publish(1, "HERE with %s\n", var_declare) ; TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name + "_keys").c_str()) ;
//message_publish(1, "HERE with %s\n", var_declare) ;
var_declare.str("") ; var_declare.str("") ;
var_declare.clear() ; var_declare.clear() ;
var_declare << "std::string " var_declare << "std::string "
<< object_name << "_" << var_name << "_data[" << cont_size << "]" ; << object_name << "_" << var_name << "_data[" << cont_size << "]" ;
items = (std::string *)TMM_declare_var_s(var_declare.str().c_str()) ; items = (std::string *)TMM_declare_var_s(var_declare.str().c_str()) ;
TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name + "_data").c_str()) ; if ( items ) {
//message_publish(1, "HERE with %s\n", var_declare) ; TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name + "_data").c_str()) ;
//message_publish(1, "HERE with %s\n", var_declare) ;
/* copy the contents of the map the 2 arrays */ /* copy the contents of the map the 2 arrays */
for ( iter = in_map.begin() , ii = 0 ; iter != in_map.end() ; iter++ , ii++ ) { for ( iter = in_map.begin() , ii = 0 ; iter != in_map.end() ; iter++ , ii++ ) {
std::ostringstream sub_elements ; std::ostringstream sub_elements ;
sub_elements << object_name << "_" << var_name << "_keys_" << ii ; sub_elements << object_name << "_" << var_name << "_keys_" << ii ;
keys[ii] = sub_elements.str() ; keys[ii] = sub_elements.str() ;
std::ostringstream index_string ; std::ostringstream index_string ;
index_string << ii ; index_string << ii ;
checkpoint_stl( const_cast<typename STL::key_type &>(iter->first) , checkpoint_stl( const_cast<typename STL::key_type &>(iter->first) ,
object_name + "_" + var_name + "_keys", index_string.str() ) ; object_name + "_" + var_name + "_keys", index_string.str() ) ;
sub_elements << object_name << "_" << var_name << "_data_" << ii ; sub_elements << object_name << "_" << var_name << "_data_" << ii ;
items[ii] = sub_elements.str() ; items[ii] = sub_elements.str() ;
checkpoint_stl( iter->second , checkpoint_stl( iter->second ,
object_name + "_" + var_name + "_data", index_string.str() ) ; object_name + "_" + var_name + "_data", index_string.str() ) ;
}
}
} }
} }
return 0 ; return 0 ;

View File

@ -38,17 +38,21 @@ int checkpoint_stl(std::pair<FIRST , SECOND> & in_pair , std::string object_name
var_declare << type_string << " " var_declare << type_string << " "
<< object_name << "_" << var_name << "_first[1]" ; << object_name << "_" << var_name << "_first[1]" ;
first = (FIRST *)TMM_declare_var_s(var_declare.str().c_str()) ; first = (FIRST *)TMM_declare_var_s(var_declare.str().c_str()) ;
TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name + "_first").c_str()) ; if ( first ) {
first[0] = in_pair.first ; TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name + "_first").c_str()) ;
first[0] = in_pair.first ;
var_declare.str("") ; var_declare.str("") ;
var_declare.clear() ; var_declare.clear() ;
type_string = stl_type_name_convert(abi::__cxa_demangle(typeid(*second).name(), 0, 0, &status )) ; type_string = stl_type_name_convert(abi::__cxa_demangle(typeid(*second).name(), 0, 0, &status )) ;
var_declare << type_string << " " var_declare << type_string << " "
<< object_name << "_" << var_name << "_second[1]" ; << object_name << "_" << var_name << "_second[1]" ;
second = (SECOND *)TMM_declare_var_s(var_declare.str().c_str()) ; second = (SECOND *)TMM_declare_var_s(var_declare.str().c_str()) ;
TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name + "_second").c_str()) ; if ( second ) {
second[0] = in_pair.second ; TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name + "_second").c_str()) ;
second[0] = in_pair.second ;
}
}
return 0 ; return 0 ;
} }
@ -69,16 +73,20 @@ int checkpoint_stl(std::pair<FIRST , SECOND> & in_pair , std::string object_name
var_declare << type_string << " " var_declare << type_string << " "
<< object_name << "_" << var_name << "_first[1]" ; << object_name << "_" << var_name << "_first[1]" ;
first = (FIRST *)TMM_declare_var_s(var_declare.str().c_str()) ; first = (FIRST *)TMM_declare_var_s(var_declare.str().c_str()) ;
TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name + "_first").c_str()) ; if ( first ) {
first[0] = in_pair.first ; TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name + "_first").c_str()) ;
first[0] = in_pair.first ;
var_declare.str("") ; var_declare.str("") ;
var_declare.clear() ; var_declare.clear() ;
var_declare << "std::string " var_declare << "std::string "
<< object_name << "_" << var_name << "_second[1]" ; << object_name << "_" << var_name << "_second[1]" ;
second = (std::string *)TMM_declare_var_s(var_declare.str().c_str()) ; second = (std::string *)TMM_declare_var_s(var_declare.str().c_str()) ;
TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name + "_second").c_str()) ; if ( second ) {
checkpoint_stl( in_pair.second , object_name + "_" + var_name , "second" ) ; TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name + "_second").c_str()) ;
checkpoint_stl( in_pair.second , object_name + "_" + var_name , "second" ) ;
}
}
return 0 ; return 0 ;
} }

View File

@ -47,12 +47,14 @@ int checkpoint_stl(std::queue<ITEM_TYPE,_Sequence> & in_stl , std::string object
var_declare << type_string << " " var_declare << type_string << " "
<< object_name << "_" << var_name << "[" << cont_size << "]" ; << object_name << "_" << var_name << "[" << cont_size << "]" ;
items = (ITEM_TYPE *)TMM_declare_var_s(var_declare.str().c_str()) ; items = (ITEM_TYPE *)TMM_declare_var_s(var_declare.str().c_str()) ;
TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name).c_str()) ; if ( items ) {
//message_publish(1, "CHECKPOINT_STL_STACK with %s\n", var_declare) ; TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name).c_str()) ;
//message_publish(1, "CHECKPOINT_STL_STACK with %s\n", var_declare) ;
for ( ii = 0 ; ii < cont_size ; ii++ ) { for ( ii = 0 ; ii < cont_size ; ii++ ) {
items[ii] = temp_queue.front() ; items[ii] = temp_queue.front() ;
temp_queue.pop() ; temp_queue.pop() ;
}
} }
} }
@ -78,18 +80,20 @@ int checkpoint_stl(std::queue<ITEM_TYPE,_Sequence> & in_stl , std::string object
var_declare << "std::string " var_declare << "std::string "
<< object_name << "_" << var_name << "[" << cont_size << "]" ; << object_name << "_" << var_name << "[" << cont_size << "]" ;
items = (std::string *)TMM_declare_var_s(var_declare.str().c_str()) ; items = (std::string *)TMM_declare_var_s(var_declare.str().c_str()) ;
TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name).c_str()) ; if ( items ) {
//message_publish(1, "CHECKPOINT_STL_STACK with %s\n", var_declare) ; TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name).c_str()) ;
//message_publish(1, "CHECKPOINT_STL_STACK with %s\n", var_declare) ;
for ( ii = 0 ; ii < cont_size ; ii++ ) { for ( ii = 0 ; ii < cont_size ; ii++ ) {
std::ostringstream sub_elements ; std::ostringstream sub_elements ;
sub_elements << object_name << "_" << var_name << "_" << ii ; sub_elements << object_name << "_" << var_name << "_" << ii ;
items[ii] = sub_elements.str() ; items[ii] = sub_elements.str() ;
std::ostringstream index_string ; std::ostringstream index_string ;
index_string << ii ; index_string << ii ;
checkpoint_stl (temp_queue.front(), object_name + "_" + var_name, index_string.str()) ; checkpoint_stl (temp_queue.front(), object_name + "_" + var_name, index_string.str()) ;
temp_queue.pop() ; temp_queue.pop() ;
}
} }
} }
return 0 ; return 0 ;
@ -116,12 +120,14 @@ int checkpoint_stl(std::priority_queue<ITEM_TYPE, _Container, _Compare> & in_stl
var_declare << type_string << " " var_declare << type_string << " "
<< object_name << "_" << var_name << "[" << cont_size << "]" ; << object_name << "_" << var_name << "[" << cont_size << "]" ;
items = (ITEM_TYPE *)TMM_declare_var_s(var_declare.str().c_str()) ; items = (ITEM_TYPE *)TMM_declare_var_s(var_declare.str().c_str()) ;
TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name).c_str()) ; if ( items ) {
//message_publish(1, "CHECKPOINT_STL_STACK with %s\n", var_declare) ; TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name).c_str()) ;
//message_publish(1, "CHECKPOINT_STL_STACK with %s\n", var_declare) ;
for ( ii = 0 ; ii < cont_size ; ii++ ) { for ( ii = 0 ; ii < cont_size ; ii++ ) {
items[ii] = temp_queue.top() ; items[ii] = temp_queue.top() ;
temp_queue.pop() ; temp_queue.pop() ;
}
} }
} }
@ -148,18 +154,20 @@ int checkpoint_stl(std::priority_queue<ITEM_TYPE, _Container, _Compare> & in_stl
var_declare << "std::string " var_declare << "std::string "
<< object_name << "_" << var_name << "[" << cont_size << "]" ; << object_name << "_" << var_name << "[" << cont_size << "]" ;
items = (std::string *)TMM_declare_var_s(var_declare.str().c_str()) ; items = (std::string *)TMM_declare_var_s(var_declare.str().c_str()) ;
TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name).c_str()) ; if ( items ) {
//message_publish(1, "CHECKPOINT_STL_STACK with %s\n", var_declare) ; TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name).c_str()) ;
//message_publish(1, "CHECKPOINT_STL_STACK with %s\n", var_declare) ;
for ( ii = 0 ; ii < cont_size ; ii++ ) { for ( ii = 0 ; ii < cont_size ; ii++ ) {
std::ostringstream sub_elements ; std::ostringstream sub_elements ;
sub_elements << object_name << "_" << var_name << "_" << ii ; sub_elements << object_name << "_" << var_name << "_" << ii ;
items[ii] = sub_elements.str() ; items[ii] = sub_elements.str() ;
std::ostringstream index_string ; std::ostringstream index_string ;
index_string << ii ; index_string << ii ;
checkpoint_stl (const_cast< ITEM_TYPE &>(temp_queue.top()), object_name + "_" + var_name, index_string.str()) ; checkpoint_stl (const_cast< ITEM_TYPE &>(temp_queue.top()), object_name + "_" + var_name, index_string.str()) ;
temp_queue.pop() ; temp_queue.pop() ;
}
} }
} }

View File

@ -50,12 +50,14 @@ int checkpoint_sequence_i(STL & in_stl , std::string object_name , std::string v
var_declare << type_string << " " var_declare << type_string << " "
<< object_name << "_" << var_name << "[" << cont_size << "]" ; << object_name << "_" << var_name << "[" << cont_size << "]" ;
items = (typename STL::value_type *)TMM_declare_var_s(var_declare.str().c_str()) ; items = (typename STL::value_type *)TMM_declare_var_s(var_declare.str().c_str()) ;
TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name).c_str()) ; if ( items ) {
//message_publish(1, "CHECKPOINT_SEQUENCE_STL with %s\n", var_declare) ; TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name).c_str()) ;
//message_publish(1, "CHECKPOINT_SEQUENCE_STL with %s\n", var_declare) ;
/* copy the contents of the stl */ /* copy the contents of the stl */
for ( ii = 0 , it = in_stl.begin() , end = in_stl.end() ; it != end ; it++ , ii++ ) { for ( ii = 0 , it = in_stl.begin() , end = in_stl.end() ; it != end ; it++ , ii++ ) {
items[ii] = *it ; items[ii] = *it ;
}
} }
} }
@ -84,19 +86,21 @@ int checkpoint_sequence_s(STL & in_stl , std::string object_name , std::string v
var_declare << "std::string " << object_name << "_" << var_name << "[" << cont_size << "]" ; var_declare << "std::string " << object_name << "_" << var_name << "[" << cont_size << "]" ;
items = (std::string *)TMM_declare_var_s(var_declare.str().c_str()) ; items = (std::string *)TMM_declare_var_s(var_declare.str().c_str()) ;
TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name).c_str()) ; if ( items ) {
//message_publish(1, "CHECKPOINT_SEQUENCE_STL_STL with %s\n", var_declare.str().c_str()) ; TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name).c_str()) ;
//message_publish(1, "CHECKPOINT_SEQUENCE_STL_STL with %s\n", var_declare.str().c_str()) ;
/* create the names of the sub stl checkpoint names we're going to be using */ /* create the names of the sub stl checkpoint names we're going to be using */
for ( ii = 0 , it = in_stl.begin() , end = in_stl.end() ; it != end ; it++ , ii++ ) { for ( ii = 0 , it = in_stl.begin() , end = in_stl.end() ; it != end ; it++ , ii++ ) {
std::ostringstream sub_elements ; std::ostringstream sub_elements ;
sub_elements << object_name << "_" << var_name << "_" << ii ; sub_elements << object_name << "_" << var_name << "_" << ii ;
items[ii] = sub_elements.str() ; items[ii] = sub_elements.str() ;
std::ostringstream index_string ; std::ostringstream index_string ;
index_string << ii ; index_string << ii ;
//message_publish(1, "recursive call to checkpoint_stl %s\n", __PRETTY_FUNCTION__) ; //message_publish(1, "recursive call to checkpoint_stl %s\n", __PRETTY_FUNCTION__) ;
checkpoint_stl( (*it) , object_name + "_" + var_name , index_string.str() ) ; checkpoint_stl( (*it) , object_name + "_" + var_name , index_string.str() ) ;
}
} }
} }
return 0 ; return 0 ;

View File

@ -44,12 +44,14 @@ int checkpoint_stl(std::stack<ITEM_TYPE,_Sequence> & in_stl , std::string object
var_declare << type_string << " " var_declare << type_string << " "
<< object_name << "_" << var_name << "[" << cont_size << "]" ; << object_name << "_" << var_name << "[" << cont_size << "]" ;
items = (ITEM_TYPE *)TMM_declare_var_s(var_declare.str().c_str()) ; items = (ITEM_TYPE *)TMM_declare_var_s(var_declare.str().c_str()) ;
TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name).c_str()) ; if ( items ) {
//message_publish(1, "CHECKPOINT_STL_STACK with %s\n", var_declare) ; TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name).c_str()) ;
//message_publish(1, "CHECKPOINT_STL_STACK with %s\n", var_declare) ;
for ( ii = 0 ; ii < cont_size ; ii++ ) { for ( ii = 0 ; ii < cont_size ; ii++ ) {
items[ii] = temp_stack.top() ; items[ii] = temp_stack.top() ;
temp_stack.pop() ; temp_stack.pop() ;
}
} }
} }
@ -75,18 +77,20 @@ int checkpoint_stl(std::stack<ITEM_TYPE,_Sequence> & in_stl , std::string object
var_declare << "std::string " var_declare << "std::string "
<< object_name << "_" << var_name << "[" << cont_size << "]" ; << object_name << "_" << var_name << "[" << cont_size << "]" ;
items = (std::string *)TMM_declare_var_s(var_declare.str().c_str()) ; items = (std::string *)TMM_declare_var_s(var_declare.str().c_str()) ;
TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name).c_str()) ; if ( items ) {
//message_publish(1, "CHECKPOINT_STL_STACK with %s\n", var_declare) ; TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name).c_str()) ;
//message_publish(1, "CHECKPOINT_STL_STACK with %s\n", var_declare) ;
for ( ii = 0 ; ii < cont_size ; ii++ ) { for ( ii = 0 ; ii < cont_size ; ii++ ) {
std::ostringstream sub_elements ; std::ostringstream sub_elements ;
sub_elements << object_name << "_" << var_name << "_" << ii ; sub_elements << object_name << "_" << var_name << "_" << ii ;
items[ii] = sub_elements.str() ; items[ii] = sub_elements.str() ;
std::ostringstream index_string ; std::ostringstream index_string ;
index_string << ii ; index_string << ii ;
checkpoint_stl (temp_stack.top(), object_name + "_" + var_name, index_string.str()) ; checkpoint_stl (temp_stack.top(), object_name + "_" + var_name, index_string.str()) ;
temp_stack.pop() ; temp_stack.pop() ;
}
} }
} }

View File

@ -15,14 +15,14 @@ PROGRAMMERS:
#define MTOIN (39.370079) /* meters to inches */ #define MTOIN (39.370079) /* meters to inches */
#define FTOM (0.3048) /* feet to meters */ #define FTOM (0.3048) /* feet to meters */
#define NMTOM (1852.0) /* nautical miles to meters */ #define NMTOM (1852.0) /* nautical miles to meters */
#define MTF (3.28083989501312336) /* meters to feet */ #define MTF (3.28084) /* meters to feet */
#define LBFTON (4.4482216152605) /* pound-force to newtons */ #define LBFTON (4.4482216152605) /* pound-force to newtons */
#define LBTOKG (0.4535923697760192) /* pound-mass to kilograms */ #define LBTOKG (0.45359237) /* pound-mass to kilograms */
#define SLFTOKGM (1.355817947661907) /* slug-ft**2 to kilogram-m**2 */ #define SLFTOKGM (1.355817947661907) /* slug-ft**2 to kilogram-m**2 */
#define KGTOLB (2.204622622937404) /* kilograms to pound-mass */ #define KGTOLB (2.20462262185) /* kilograms to pound-mass */
#define NMTOFP (0.7375621492772654) /* newton-meters to foot-pounds */ #define NMTOFP (0.7375621492772654) /* newton-meters to foot-pounds */
#define SLTOLB (32.17404855643046) /* slugs to pounds */ #define SLTOLB (32.174049) /* slugs to pounds */
#define SLTOKG (14.5939029372064) /* slugs to kilograms */ #define SLTOKG (14.59390) /* slugs to kilograms */
#endif #endif

View File

@ -14,7 +14,10 @@ int dr_disable() ;
int dr_enable_group( const char * in_name ) ; int dr_enable_group( const char * in_name ) ;
int dr_disable_group( const char * in_name ) ; int dr_disable_group( const char * in_name ) ;
int dr_record_now_group( const char * in_name ) ; int dr_record_now_group( const char * in_name ) ;
int dr_set_max_file_size ( uint64_t bytes ) ;
void remove_all_data_record_groups() ; void remove_all_data_record_groups() ;
int set_max_size_record_group (const char * in_name, uint64_t bytes ) ;
#ifdef __cplusplus #ifdef __cplusplus
int add_data_record_group( Trick::DataRecordGroup * in_group, Trick::DR_Buffering buffering = Trick::DR_Not_Specified ) ; int add_data_record_group( Trick::DataRecordGroup * in_group, Trick::DR_Buffering buffering = Trick::DR_Not_Specified ) ;

View File

@ -25,6 +25,7 @@
#include "trick/MSSharedMem.hh" #include "trick/MSSharedMem.hh"
#include "trick/MemoryManager.hh" #include "trick/MemoryManager.hh"
#include "trick/MessageCout.hh" #include "trick/MessageCout.hh"
#include "trick/MessageThreadedCout.hh"
#include "trick/MessageFile.hh" #include "trick/MessageFile.hh"
#include "trick/MessageLCout.hh" #include "trick/MessageLCout.hh"
#include "trick/MessagePublisher.hh" #include "trick/MessagePublisher.hh"
@ -90,5 +91,6 @@
#include "trick/Flag.h" #include "trick/Flag.h"
#include "trick/wave_form.h" #include "trick/wave_form.h"
#include "trick/rand_generator.h" #include "trick/rand_generator.h"
#include "trick/units_conv.h"
#endif #endif

View File

@ -8,7 +8,7 @@ extern "C" {
#endif #endif
/** /**
* @class Trick::MessagePublisher::MESSAGE_TYPE message_proto.h * @enum Trick::MessagePublisher::MESSAGE_TYPE
* The MESSAGE_TYPE enumeration represents types of messages to publish, which corresponds to the displayed color of the message. * The MESSAGE_TYPE enumeration represents types of messages to publish, which corresponds to the displayed color of the message.
*/ */
typedef enum { typedef enum {

View File

@ -11,7 +11,6 @@ extern "C" {
#endif #endif
/** /**
* @class Trick::MemoryManager::TRICK_TYPE parameter_types.h
* The TRICK_TYPE enumeration represents the Trick data types. * The TRICK_TYPE enumeration represents the Trick data types.
*/ */
typedef enum { typedef enum {
@ -45,6 +44,9 @@ extern "C" {
const char* trickTypeCharString( TRICK_TYPE type, const char* name); const char* trickTypeCharString( TRICK_TYPE type, const char* name);
/* here for backwards compatibility */
#define TRICK_USER_DEFINED_TYPE TRICK_OPAQUE_TYPE
/* Define int_64t and uint_64t depending on compiler options */ /* Define int_64t and uint_64t depending on compiler options */
#if __linux #if __linux
# include <stdint.h> # include <stdint.h>

View File

@ -1,8 +1,7 @@
/* /*
PURPOSE: PURPOSE:
(This header file defines the "RELEASE()" macro for supported platforms. (This header file defines the "RELEASE()" macro for supported platforms.
The release function should yield the processor from the processes that The release function should yield the processor from the processes that makes the call. This allows the UNIX schedular to arbitrate process
makes the call. This allows the UNIX schedular to arbitrate process
priorities during spinloops based on the status of processes waiting priorities during spinloops based on the status of processes waiting
to run) to run)
PROGRAMMER: PROGRAMMER:

View File

@ -7,7 +7,7 @@ PROGRAMMERS:
*/ */
/** /**
* @class SIM_COMMAND sim_mode.h * @enum SIM_COMMAND
* The SIM_COMMAND enumeration represents the TRICK simulation commmands. * The SIM_COMMAND enumeration represents the TRICK simulation commmands.
*/ */
@ -24,7 +24,7 @@ typedef enum {
} SIM_COMMAND; } SIM_COMMAND;
/** /**
* @class SIM_MODE sim_mode.h * @enum SIM_MODE
* The SIM_MODE enumeration represents the TRICK simulation modes. * The SIM_MODE enumeration represents the TRICK simulation modes.
*/ */

View File

@ -9,6 +9,7 @@
#include "trick/wave_form.h" #include "trick/wave_form.h"
#include "trick/reference_frame.h" #include "trick/reference_frame.h"
#include "trick/rand_generator.h" #include "trick/rand_generator.h"
#include "trick/RodriguesRotation.h"
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {

View File

@ -80,6 +80,13 @@
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
int trick_test_enable() ;
int trick_test_set_file_name( const char * in_file_name ) ;
int trick_test_set_test_name( const char * in_test_name ) ;
int trick_test_add_parent(const char * in_test_suite_name, int trick_test_add_parent(const char * in_test_suite_name,
const char * in_test_case, const char * in_test_case,
const char * par_num ) ; const char * par_num ) ;

View File

@ -127,9 +127,14 @@ if ( $help ) {
@include_dirs = $ENV{"TRICK_CFLAGS"} =~ /-I\s*(\S+)/g ; # get include paths from TRICK_CFLAGS @include_dirs = $ENV{"TRICK_CFLAGS"} =~ /-I\s*(\S+)/g ; # get include paths from TRICK_CFLAGS
@exclude_paths = map abs_path($_), split /:/ , $ENV{"TRICK_EXCLUDE"} ; # Get environment variables, split on colons, strip leading/trailing whitespace, remove empty elements, get absolute paths
@swig_exclude_paths = map abs_path($_), split /:/ , $ENV{"TRICK_SWIG_EXCLUDE"} ; sub get_paths {
@ext_lib_paths = map abs_path($_), split /:/ , $ENV{"TRICK_EXT_LIB_DIRS"} ; return map abs_path($_), grep { $_ ne '' } map { s/(^\s+|\s+$)//g ; $_ } split /:/, $ENV{$_[0]} ;
}
@exclude_paths = get_paths( "TRICK_EXCLUDE") ;
@swig_exclude_paths = get_paths( "TRICK_SWIG_EXCLUDE") ;
@ext_lib_paths = get_paths( "TRICK_EXT_LIB_DIRS") ;
@defines = $ENV{"TRICK_CFLAGS"} =~ /(-D\S+)/g ; # get defines from TRICK_CFLAGS @defines = $ENV{"TRICK_CFLAGS"} =~ /(-D\S+)/g ; # get defines from TRICK_CFLAGS
if ( $ENV{"TRICK_CFLAGS"} !~ /DTRICK_VER=/ ) { if ( $ENV{"TRICK_CFLAGS"} !~ /DTRICK_VER=/ ) {
push @defines , "-DTRICK_VER=$year" ; push @defines , "-DTRICK_VER=$year" ;
@ -211,8 +216,8 @@ sub process_file() {
# remove all comments, they can cause all kinds of trouble # remove all comments, they can cause all kinds of trouble
# leave the line continuation character if present # leave the line continuation character if present
$raw_contents =~ s/\/\/(?:.*?)(\\)?(\n)/$1\n/sg ; $raw_contents =~ s/\/\*(?:.*?)\*\/|\/\/(?:.*?)(\\)?(\n)/$1\n/sg ;
$raw_contents =~ s/\/\*(?:.*?)\*\/(\s*\\\n)?/$1/sg ;
## The init_attr functions cause problems when we try and wrap them with SWIG. ## The init_attr functions cause problems when we try and wrap them with SWIG.
## We can safely remove them from the header files. ## We can safely remove them from the header files.
@ -258,7 +263,7 @@ sub process_file() {
} }
# Get the canonical path (resolve ., .., and symbolic links) # Get the canonical path (resolve ., .., and symbolic links)
$file_name = abs_path($file_name) ; $file_name = abs_path(dirname($file_name)) . "/" . basename($file_name) ;
# Skip excluded paths # Skip excluded paths
foreach my $i ( @exclude_paths, @swig_exclude_paths ) { foreach my $i ( @exclude_paths, @swig_exclude_paths ) {
@ -266,7 +271,6 @@ sub process_file() {
next outer ; next outer ;
} }
} }
$file_name = "build" . $file_name ; $file_name = "build" . $file_name ;
$file_name =~ s/\.[^\.]+?$/\_py.i/ ; $file_name =~ s/\.[^\.]+?$/\_py.i/ ;
$contents .= "\%import \"$file_name\"\n" ; $contents .= "\%import \"$file_name\"\n" ;

Binary file not shown.

View File

@ -15,7 +15,8 @@ EXTERNAL_JARS = \
jfreesvg-2.1.jar \ jfreesvg-2.1.jar \
jopt-simple-4.8.jar \ jopt-simple-4.8.jar \
junit-4.12.jar \ junit-4.12.jar \
swingx-1.6.1.jar swingx-1.6.1.jar \
hamcrest-core-1.3.jar
external_jars : ${EXTERNAL_JARS} external_jars : ${EXTERNAL_JARS}
@ -35,6 +36,8 @@ junit-4.12.jar:
curl -O http://repo1.maven.org/maven2/junit/junit/4.12/junit-4.12.jar curl -O http://repo1.maven.org/maven2/junit/junit/4.12/junit-4.12.jar
swingx-1.6.1.jar : swingx-1.6.1.jar :
curl -O http://repo.maven.apache.org/maven2/org/swinglabs/swingx/1.6.1/swingx-1.6.1.jar curl -O http://repo.maven.apache.org/maven2/org/swinglabs/swingx/1.6.1/swingx-1.6.1.jar
hamcrest-core-1.3.jar :
curl -O http://repo.maven.apache.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar
clean: clean:
rm -f ${EXTERNAL_JARS} rm -f ${EXTERNAL_JARS}

View File

@ -133,7 +133,7 @@ if (scalar @exclude_dirs) {
# Error check - delete any element that is null # Error check - delete any element that is null
# (note: sort forced all blank names to front of array # (note: sort forced all blank names to front of array
@exclude_dirs = map { s/(^\s+|\s+$)//g ; $_ } @exclude_dirs ; @exclude_dirs = map { s/(^\s+|\s+$)//g ; $_ } @exclude_dirs ;
while ( not length @exclude_dirs[0] ) { while ( scalar @exclude_dirs and not length @exclude_dirs[0] ) {
# Delete an element from the left side of an array (element zero) # Delete an element from the left side of an array (element zero)
shift @exclude_dirs ; shift @exclude_dirs ;
} }
@ -370,7 +370,7 @@ foreach $k ( sort keys %files_by_dir ) {
s/\$[{(]CURDIR[})]\/(\S+)/$k\/$1/g ; s/\$[{(]CURDIR[})]\/(\S+)/$k\/$1/g ;
s/(?:\$[{(]CURDIR[})]\/)?(\S*)\$[{(]OBJ_DIR[})]/$k\/$1object_\${TRICK_HOST_CPU}/g ; s/(?:\$[{(]CURDIR[})]\/)?(\S*)\$[{(]OBJ_DIR[})]/$k\/$1object_\${TRICK_HOST_CPU}/g ;
s/\$[{(]CURDIR[})]/$k/g ; s/\$[{(]CURDIR[})]/$k/g ;
while ( s,/[^/]+/\.\.,, ) {} while ( s,/[^/.]+/\.\.,, ) {}
s//$comment/ ; s//$comment/ ;
if ( s/^objects\s*:\s*// ) { if ( s/^objects\s*:\s*// ) {
foreach my $ext ( qw{c C cc cxx cpp CPLUSPLUS l y} ) { foreach my $ext ( qw{c C cc cxx cpp CPLUSPLUS l y} ) {
@ -388,8 +388,10 @@ foreach $k ( sort keys %files_by_dir ) {
} }
} }
close OV_FILE ; close OV_FILE ;
print MAKEFILEOVER "\nMAKEFILE_LIST += $k/makefile_overrides\n" ;
print MAKEFILEOVER "\n# Overrides from $k\n\n" ; print MAKEFILEOVER "\n# Overrides from $k\n\n" ;
print MAKEFILEOVER "$files_by_dir{$k}{overrides}\n" ; print MAKEFILEOVER "$files_by_dir{$k}{overrides}\n" ;
print MAKEFILEOVER "\nMAKEFILE_LIST := \$(filter-out $k/makefile_overrides,\$(MAKEFILE_LIST))\n" ;
} }
} }
close MAKEFILEOVER ; close MAKEFILEOVER ;

View File

@ -27,7 +27,7 @@ sub get_paths {
# trim whitespace # trim whitespace
@paths = map { s/(^\s+|\s+$)//g ; $_ } @paths ; @paths = map { s/(^\s+|\s+$)//g ; $_ } @paths ;
# Remove empty elements. Sort forced all blank names to the front. # Remove empty elements. Sort forced all blank names to the front.
while ( not length @paths[0] ) { while ( scalar @paths and not length @paths[0] ) {
shift @paths ; shift @paths ;
} }
@paths = map { (-e $_) ? abs_path($_) : $_ } @paths ; @paths = map { (-e $_) ? abs_path($_) : $_ } @paths ;
@ -95,6 +95,10 @@ sub read_files_to_process() {
print "SWIG Skip TRICK_EXCLUDE: $path$1\n" if $verbose_build ; print "SWIG Skip TRICK_EXCLUDE: $path$1\n" if $verbose_build ;
next outer ; next outer ;
} }
if ( abs_path($word) =~ /^\Q$path\E(.*)/ ) {
print "SWIG Skip TRICK_EXCLUDE: $path$1\n" if $verbose_build ;
next outer ;
}
} }
# skip paths in TRICK_SWIG_EXCLUDE # skip paths in TRICK_SWIG_EXCLUDE
@ -103,6 +107,10 @@ sub read_files_to_process() {
print "SWIG Skip TRICK_SWIG_EXCLUDE: $path$1\n" if $verbose_build ; print "SWIG Skip TRICK_SWIG_EXCLUDE: $path$1\n" if $verbose_build ;
next outer ; next outer ;
} }
if ( abs_path($word) =~ /^\Q$path\E(.*)/ ) {
print "SWIG Skip TRICK_SWIG_EXCLUDE: $path$1\n" if $verbose_build ;
next outer ;
}
} }
# we'll be needing this later # we'll be needing this later
@ -165,6 +173,8 @@ sub write_makefile_swig() {
ifeq (\$(IS_CC_CLANG), 1) ifeq (\$(IS_CC_CLANG), 1)
SWIG_CFLAGS += -Wno-self-assign -Wno-sometimes-uninitialized -Wno-deprecated-register SWIG_CFLAGS += -Wno-self-assign -Wno-sometimes-uninitialized -Wno-deprecated-register
else
SWIG_CFLAGS += -Wno-unused-but-set-variable
endif endif
ifndef TRICK_VERBOSE_BUILD ifndef TRICK_VERBOSE_BUILD

View File

@ -93,6 +93,7 @@ sub gte (@) {
$def{"TRICK_ICG_COMPAT15"} = "" ; $def{"TRICK_ICG_COMPAT15"} = "" ;
$def{"TRICK_ICG_NOCOMMENT"} = "" ; $def{"TRICK_ICG_NOCOMMENT"} = "" ;
$def{"TRICK_ICG_EXCLUDE"} = "" ; $def{"TRICK_ICG_EXCLUDE"} = "" ;
$def{"TRICK_ICG_IGNORE_TYPES"} = "" ;
$def{"TRICK_SWIG_EXCLUDE"} = "" ; $def{"TRICK_SWIG_EXCLUDE"} = "" ;
$def{"TRICK_EXT_LIB_DIRS"} = "" ; $def{"TRICK_EXT_LIB_DIRS"} = "" ;
$def{"TRICK_PYTHON_PATH"} = "" ; $def{"TRICK_PYTHON_PATH"} = "" ;

View File

@ -1,11 +1,11 @@
#!/usr/bin/perl #!/usr/bin/perl
package launch_java ; package launch_java ;
@ISA = qw(Exporter); @ISA = qw(Exporter) ;
@EXPORT = qw(launch_java); @EXPORT = qw(launch_java) ;
# launch_java determines trick_home based on execution location of the calling script. # launch_java determines trick_home based on execution location of the calling script.
use File::Basename ; use File::Basename ;
use Cwd 'abs_path'; use Cwd 'abs_path' ;
use gte ; use gte ;
sub launch_java($$) { sub launch_java($$) {
@ -27,6 +27,10 @@ sub launch_java($$) {
} }
$java_dir = "$ENV{TRICK_HOME}/$lib_dir/trick/java" ; $java_dir = "$ENV{TRICK_HOME}/$lib_dir/trick/java" ;
$javac_version = `javac -version 2>&1` ;
$javac_version =~ /(\d+)/ ;
$javac_version = $1 ;
$host_cpu = gte("TRICK_HOST_CPU") ; $host_cpu = gte("TRICK_HOST_CPU") ;
chomp($host_cpu) ; chomp($host_cpu) ;
$ENV{TRICK_HOST_CPU} = $host_cpu ; $ENV{TRICK_HOST_CPU} = $host_cpu ;
@ -35,18 +39,23 @@ sub launch_java($$) {
$command = "java -classpath $java_dir/dist/*:$java_dir/lib/*:$java_dir/lib/ \\ $command = "java -classpath $java_dir/dist/*:$java_dir/lib/*:$java_dir/lib/ \\
-Xdock:name=\"$name\" \\ -Xdock:name=\"$name\" \\
-Xdock:icon=$java_dir/resources/trick_icon.png \\ -Xdock:icon=$java_dir/resources/trick_icon.png \\
-Djava.net.preferIPv4Stack=true \\ -Djava.net.preferIPv4Stack=true \\" ;
$application" ;
} else { } else {
$command = "java -cp $java_dir/dist/*:$java_dir/lib/*:$java_dir/lib/ $application" ; $command = "java -cp $java_dir/dist/*:$java_dir/lib/*:$java_dir/lib/ \\" ;
} }
if ( ($javac_version eq "9") or ($javac_version eq "10") ) {
$command .= "
--add-modules java.se.ee \\" ;
}
$command .= "
$application" ;
foreach (@ARGV) { foreach (@ARGV) {
$command .= " $_"; $command .= " $_" ;
} }
system $command ; system $command ;
exit $? >> 8; exit $? >> 8 ;
} }
1; 1 ;

View File

@ -746,7 +746,8 @@ sub handle_sim_class_job($$$) {
$tag =~ s/\s+//g ; $tag =~ s/\s+//g ;
@tags = split /,/ , $tag ; @tags = split /,/ , $tag ;
} }
$job_push = "job = add_job($child, $job_id, $class, $sup_class_data, $cycle, \"$job_name\", \"\"" ; # do not remove "this->", see issue #532
$job_push = "job = this->add_job($child, $job_id, $class, $sup_class_data, $cycle, \"$job_name\", \"\"" ;
if ( $class =~ /^integration$/ ) { if ( $class =~ /^integration$/ ) {
if ($job_ret !~ /trick_ret/ ) { if ($job_ret !~ /trick_ret/ ) {

Binary file not shown.

Binary file not shown.

View File

@ -33,30 +33,24 @@ ifndef TRICK_LD
export TRICK_LD := $(LD) export TRICK_LD := $(LD)
endif endif
ifndef TRICK_SFLAGS export TRICK_CFLAGS := $(TRICK_CFLAGS)
export TRICK_SFLAGS := export TRICK_CXXFLAGS := $(TRICK_CXXFLAGS)
endif export TRICK_LDFLAGS := $(TRICK_LDFLAGS)
export TRICK_SFLAGS := $(TRICK_SFLAGS)
export TRICK_CFLAGS export TRICK_EXCLUDE := $(TRICK_EXCLUDE)
export TRICK_CXXFLAGS export TRICK_ICG_COMPAT15 := $(TRICK_ICG_COMPAT15)
export TRICK_LDFLAGS export TRICK_ICG_EXCLUDE := $(TRICK_ICG_EXCLUDE)
export TRICK_SFLAGS export TRICK_ICG_IGNORE_TYPES := $(TRICK_ICG_IGNORE_TYPES)
export TRICK_EXCLUDE export TRICK_ICG_NOCOMMENT := $(TRICK_ICG_NOCOMMENT)
export TRICK_ICG_COMPAT15 export TRICK_SWIG_EXCLUDE := $(TRICK_SWIG_EXCLUDE)
export TRICK_ICG_EXCLUDE export TRICK_EXT_LIB_DIRS := $(TRICK_EXT_LIB_DIRS)
export TRICK_ICG_NOCOMMENT export TRICK_PYTHON_PATH := $(TRICK_PYTHON_PATH)
export TRICK_SWIG_EXCLUDE export TRICK_GTE_EXT := $(TRICK_GTE_EXT)
export TRICK_EXT_LIB_DIRS
export TRICK_PYTHON_PATH
export TRICK_GTE_EXT
export TRICK_HOST_CPU := $(shell $(TRICK_HOME)/bin/trick-gte TRICK_HOST_CPU) export TRICK_HOST_CPU := $(shell $(TRICK_HOME)/bin/trick-gte TRICK_HOST_CPU)
export TRICK_EXEC_LINK_LIBS = ${PTHREAD_LIBS} $(PYTHON_LIB) $(UDUNITS_LDFLAGS) $(PLATFORM_LIBS) -lm -ldl export TRICK_EXEC_LINK_LIBS := ${PTHREAD_LIBS} $(PYTHON_LIB) $(UDUNITS_LDFLAGS) $(PLATFORM_LIBS) -lm -ldl
export TRICK_LIBS = ${RPATH} -L${TRICK_LIB_DIR} -ltrick -ltrick_pyip -ltrick_comm -ltrick_math -ltrick_units -ltrick_mm export TRICK_LIBS := ${RPATH} -L${TRICK_LIB_DIR} -ltrick -ltrick_pyip -ltrick_comm -ltrick_math -ltrick_units -ltrick_mm
export TRICK_SYSTEM_CFLAGS export TRICK_SYSTEM_LDFLAGS := $(TRICK_SYSTEM_LDFLAGS)
export TRICK_SYSTEM_CXXFLAGS export SWIG_FLAGS := $(SWIG_FLAGS)
export TRICK_SYSTEM_SFLAGS
export TRICK_SYSTEM_LDFLAGS
export SWIG_FLAGS
IO_SRC_DIR := io_src/ IO_SRC_DIR := io_src/
OBJ_DIR := object_${TRICK_HOST_CPU} OBJ_DIR := object_${TRICK_HOST_CPU}
@ -80,14 +74,8 @@ endif
TRICK_INCLUDES := -I${TRICK_HOME}/trick_source -I${TRICK_HOME}/include -I${TRICK_HOME}/include/trick/compat TRICK_INCLUDES := -I${TRICK_HOME}/trick_source -I${TRICK_HOME}/include -I${TRICK_HOME}/include/trick/compat
TRICK_VERSIONS := -DTRICK_VER=$(TRICK_MAJOR) -DTRICK_MINOR=$(TRICK_MINOR) TRICK_VERSIONS := -DTRICK_VER=$(TRICK_MAJOR) -DTRICK_MINOR=$(TRICK_MINOR)
TRICK_SYSTEM_CXXFLAGS = $(TRICK_INCLUDES) $(TRICK_VERSIONS) -fpic $(UDUNITS_INCLUDES) export TRICK_SYSTEM_CXXFLAGS := $(TRICK_INCLUDES) $(TRICK_VERSIONS) -fpic $(UDUNITS_INCLUDES)
TRICK_SYSTEM_SFLAGS = -I${TRICK_HOME}/share/trick -I${TRICK_HOME}/share $(TRICK_INCLUDES) $(TRICK_VERSIONS) export TRICK_SYSTEM_SFLAGS := -I${TRICK_HOME}/share/trick -I${TRICK_HOME}/share $(TRICK_INCLUDES) $(TRICK_VERSIONS)
# We pipe the output of compiler through tee. If the user wanted gcc color, make sure they get it.
ifdef GCC_COLORS
TRICK_SYSTEM_CXXFLAGS += -fdiagnostics-color=always
TRICK_SYSTEM_CFLAGS += -fdiagnostics-color=always
endif
HAVE_ZEROCONF ?= 0 HAVE_ZEROCONF ?= 0
ifeq ($(HAVE_ZEROCONF),1) ifeq ($(HAVE_ZEROCONF),1)
@ -147,8 +135,13 @@ ifneq ($(GSL_HOME),)
TRICK_SYSTEM_CXXFLAGS += -D_HAVE_GSL TRICK_SYSTEM_CXXFLAGS += -D_HAVE_GSL
endif endif
# We pipe the output of compiler through tee. If the user wanted gcc color, make sure they get it.
ifdef GCC_COLORS
TRICK_SYSTEM_CXXFLAGS += -fdiagnostics-color=always
endif
# -fexceptions is included to propogate execptions through C code. # -fexceptions is included to propogate execptions through C code.
TRICK_SYSTEM_CFLAGS := $(TRICK_SYSTEM_CXXFLAGS) -fexceptions export TRICK_SYSTEM_CFLAGS := $(TRICK_SYSTEM_CXXFLAGS) -fexceptions
# append additional c and cxx flags defined in config_*.mk files. # append additional c and cxx flags defined in config_*.mk files.
TRICK_SYSTEM_CFLAGS += $(TRICK_ADDITIONAL_CFLAGS) TRICK_SYSTEM_CFLAGS += $(TRICK_ADDITIONAL_CFLAGS)

View File

@ -26,6 +26,7 @@ MOTIF_HOME = @MOTIF_HOME@
UDUNITS_INCLUDES = @UDUNITS_INCLUDES@ UDUNITS_INCLUDES = @UDUNITS_INCLUDES@
UDUNITS_LDFLAGS = @UDUNITS_LDFLAGS@ UDUNITS_LDFLAGS = @UDUNITS_LDFLAGS@
TRICK_EXCLUDE += :@UDUNITS_EXCLUDE@
HDF5 = @HDF5_HOME@ HDF5 = @HDF5_HOME@
DMTCP = @DMTCP_HOME@ DMTCP = @DMTCP_HOME@

View File

@ -47,6 +47,7 @@ a replacement SimObject will create an uncompilable sim.
##include "trick/MessagePublisher.hh" ##include "trick/MessagePublisher.hh"
##include "trick/MessageSubscriber.hh" ##include "trick/MessageSubscriber.hh"
##include "trick/MessageCout.hh" ##include "trick/MessageCout.hh"
##include "trick/MessageThreadedCout.hh"
##include "trick/MessageLCout.hh" ##include "trick/MessageLCout.hh"
##include "trick/MessageFile.hh" ##include "trick/MessageFile.hh"
##include "trick/MessageTCDevice.hh" ##include "trick/MessageTCDevice.hh"
@ -266,6 +267,7 @@ class MessageSimObject : public Trick::SimObject {
public: public:
Trick::MessagePublisher mpublisher ; Trick::MessagePublisher mpublisher ;
Trick::MessageCout mcout ; Trick::MessageCout mcout ;
Trick::MessageThreadedCout mtcout ;
Trick::MessageFile mfile ; Trick::MessageFile mfile ;
Trick::MessageTCDevice mdevice ; Trick::MessageTCDevice mdevice ;
Trick::PlaybackFile pfile ; Trick::PlaybackFile pfile ;
@ -273,11 +275,13 @@ class MessageSimObject : public Trick::SimObject {
MessageSimObject() { MessageSimObject() {
{TRK} ("default_data") mpublisher.subscribe(&mcout) ; {TRK} ("default_data") mpublisher.subscribe(&mcout) ;
//{TRK} ("default_data") mpublisher.subscribe(&mtcout) ;
{TRK} ("default_data") mpublisher.subscribe(&mfile) ; {TRK} ("default_data") mpublisher.subscribe(&mfile) ;
{TRK} ("default_data") mpublisher.subscribe(&mdevice) ; {TRK} ("default_data") mpublisher.subscribe(&mdevice) ;
{TRK} ("default_data") mpublisher.subscribe(&pfile) ; {TRK} ("default_data") mpublisher.subscribe(&pfile) ;
{TRK} ("default_data") mdevice.default_data() ; {TRK} ("default_data") mdevice.default_data() ;
{TRK} P1 ("initialization") mpublisher.init() ; {TRK} P1 ("initialization") mpublisher.init() ;
//{TRK} P1 ("initialization") mtcout.init() ;
{TRK} P1 ("initialization") mfile.init() ; {TRK} P1 ("initialization") mfile.init() ;
{TRK} P1 ("initialization") pfile.init() ; {TRK} P1 ("initialization") pfile.init() ;
{TRK} P1 ("initialization") mdevice.init() ; {TRK} P1 ("initialization") mdevice.init() ;
@ -287,6 +291,7 @@ class MessageSimObject : public Trick::SimObject {
#ifndef TRICK_NO_DMTCP #ifndef TRICK_NO_DMTCP
{TRK} P1 ("dmtcp_restart") mdevice.restart() ; {TRK} P1 ("dmtcp_restart") mdevice.restart() ;
#endif #endif
{TRK} ("shutdown") mtcout.shutdown() ;
{TRK} ("shutdown") mdevice.shutdown() ; {TRK} ("shutdown") mdevice.shutdown() ;
} }
@ -583,7 +588,7 @@ class FrameLogSimObject : public Trick::SimObject {
Trick::FrameLog frame_log ; Trick::FrameLog frame_log ;
FrameLogSimObject() { FrameLogSimObject(Trick::Clock &in_clock) : frame_log(in_clock) {
// Frame log Instrumentation class jobs. Not scheduled by default // Frame log Instrumentation class jobs. Not scheduled by default
{TRK} P0 ("instrumentation") frame_log.frame_clock_start(curr_job) ; {TRK} P0 ("instrumentation") frame_log.frame_clock_start(curr_job) ;
{TRK} P65535 ("instrumentation") frame_log.frame_clock_stop(curr_job) ; {TRK} P65535 ("instrumentation") frame_log.frame_clock_stop(curr_job) ;
@ -601,9 +606,13 @@ class FrameLogSimObject : public Trick::SimObject {
// the frame_log and rt_sync shutdown jobs should be last in sim // the frame_log and rt_sync shutdown jobs should be last in sim
{TRK} P65535 ("shutdown") frame_log.shutdown() ; {TRK} P65535 ("shutdown") frame_log.shutdown() ;
} }
private:
// This object is not copyable
void operator =(const FrameLogSimObject &) {};
} }
FrameLogSimObject trick_frame_log ; FrameLogSimObject trick_frame_log(trick_real_time.gtod_clock) ;
#endif #endif
#ifndef TRICK_NO_MASTERSLAVE #ifndef TRICK_NO_MASTERSLAVE

View File

@ -55,8 +55,8 @@ class ClassOfEverything {
float * fap[4] ; /* kg blah */ float * fap[4] ; /* kg blah */
float ** fpp ; /* kg blah */ float ** fpp ; /* kg blah */
float f_rad ; /* r float test value */ float f_rad ; /* rad float test value */
double d_deg ; /* d blah */ double d_deg ; /* degree blah */
char c ; /* -- blah */ char c ; /* -- blah */
char ca[20] ; /* -- blah */ char ca[20] ; /* -- blah */

View File

@ -16,8 +16,8 @@ typedef struct {
float f[3] ; /* m/s2 -- */ float f[3] ; /* m/s2 -- */
double d[3] ; /* kg*m/s2 -- */ double d[3] ; /* kg*m/s2 -- */
unsigned short us[3] ; /* N -- */ unsigned short us[3] ; /* N -- */
unsigned int ui[3] ; /* cnt -- */ unsigned int ui[3] ; /* count -- */
unsigned long ul[3] ; /* v -- */ unsigned long ul[3] ; /* V -- */
long long ll[3] ; /* K -- */ long long ll[3] ; /* K -- */
} STRUCT_1 ; } STRUCT_1 ;

View File

@ -49,21 +49,20 @@ int cannon_integ( CANNON* C ) {
/* The cannonball sim's dynamic job */ /* The cannonball sim's dynamic job */
double cannon_impact( CANNON* C ) { double cannon_impact( CANNON* C ) {
double tgo ; /* time-to-go */
double now ; /* current integration time. */
double tgo ; C->rf.error = C->pos[1] ; /* Specify the event boundary. */
double now ; now = get_integ_time() ; /* Get the current integration time */
/* Set error function --- how far ball is above ground */ tgo = regula_falsi( now, &(C->rf) ) ; /* Estimate remaining integration time. */
C->rf.error = C->pos[1] ; if (tgo == 0.0) { /* If we are at the event, it's action time! */
now = get_integ_time() ;
tgo = regula_falsi( now, &(C->rf) ) ;
if (tgo == 0.0) {
now = get_integ_time() ; now = get_integ_time() ;
reset_regula_falsi( now, &(C->rf) ) ; reset_regula_falsi( now, &(C->rf) ) ;
C->impact = 1 ; C->impact = 1 ;
C->impactTime = now; C->impactTime = now ;
C->vel[0] = 0.0 ; C->vel[1] = 0.0 ; C->vel[0] = 0.0 ; C->vel[1] = 0.0 ;
C->acc[0] = 0.0 ; C->acc[1] = 0.0 ; C->acc[0] = 0.0 ; C->acc[1] = 0.0 ;
fprintf(stderr, "\n\nIMPACT: SimTime = %.9f, ModelTime = %.9f, pos = %.9f\n\n", now, C->impactTime, C->pos[0] ) ; fprintf(stderr, "\n\nIMPACT: SimTime = %.9f, pos = %.9f\n\n", now, C->pos[0] ) ;
} }
return ( tgo ) ; return (tgo) ;
} }

View File

@ -29,7 +29,7 @@ $(JAR_DIR):
@ mkdir -p $(JAR_DIR) @ mkdir -p $(JAR_DIR)
jar: compile manifest | $(JAR_DIR) jar: compile manifest | $(JAR_DIR)
jar cvfm $(JAR_DIR)/$(PROJECT_NAME).jar manifest -C $(CLASSES_DIR) . jar cvfm $(JAR_DIR)/$(PROJECT_NAME).jar manifest -C $(CLASSES_DIR) . -C resources .
@ echo "-------------------------------------------------------------------------------" @ echo "-------------------------------------------------------------------------------"
@ echo " BUILD COMPLETE" @ echo " BUILD COMPLETE"
@ echo "The Java jar file (the Java Executable) is located at: $(JAR_DIR)/$(PROJECT_NAME).jar" @ echo "The Java jar file (the Java Executable) is located at: $(JAR_DIR)/$(PROJECT_NAME).jar"

View File

@ -24,7 +24,8 @@ import javax.swing.JPanel;
import javax.swing.JSlider; import javax.swing.JSlider;
import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener; import javax.swing.event.ChangeListener;
import javax.sound.sampled.*;
import java.net.URL;
/** /**
* *
* @author penn * @author penn
@ -541,6 +542,34 @@ public class CannonDisplay extends JFrame {
private JPanel panelGroup1; private JPanel panelGroup1;
private ButtonPanel buttonPanel; private ButtonPanel buttonPanel;
public enum SoundEffect {
EXPLOSION("Explosion.wav"),
CANNONBOOM("CannonBoom.wav");
private Clip clip;
SoundEffect(String soundFileName) {
try {
URL url = this.getClass().getClassLoader().getResource(soundFileName);
AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(url);
clip = AudioSystem.getClip();
clip.open(audioInputStream);
} catch (Exception e) {
e.printStackTrace();
}
}
public void play() {
if (clip.isRunning()) clip.stop();
clip.setFramePosition(0);
clip.start();
}
static void init() {
values();
}
}
public CannonDisplay(RangeView arena) { public CannonDisplay(RangeView arena) {
setTitle("Cannon Range"); setTitle("Cannon Range");
@ -570,6 +599,8 @@ public class CannonDisplay extends JFrame {
setSize(800, 500); setSize(800, 500);
setLocationRelativeTo(null); setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
SoundEffect.init();
} }
public int getBarrelAngle() { public int getBarrelAngle() {
@ -654,6 +685,7 @@ public class CannonDisplay extends JFrame {
String host = "localHost"; String host = "localHost";
int port = 0; int port = 0;
boolean boom = false;
// ========================================================== // ==========================================================
// Handle program arguments. // Handle program arguments.
@ -771,21 +803,18 @@ public class CannonDisplay extends JFrame {
} }
if (simMode == TrickSimMode.RUN) { if (simMode == TrickSimMode.RUN) {
evd.resetFireCommand(); if (boom) {
SoundEffect.CANNONBOOM.play();
boom = false;
}
} }
// Update the display data. // Update the display data.
evd.setCannonBallPos(posx, posy); evd.setCannonBallPos(posx, posy);
evd.setCannonBallVel(velx, vely); evd.setCannonBallVel(velx, vely);
// Get inputs from the GUI.
angle = evd.getBarrelAngle();
speed = evd.getMuzzleVelocity();
armCommand = evd.getArmCommand();
fireCommand = evd.getFireCommand();
if (simMode == TrickSimMode.FREEZE) { if (simMode == TrickSimMode.FREEZE) {
if (armCommand) { if (evd.getArmCommand()) {
evd.out.writeBytes( String.format("dyn.cannon.pos[0] = %.2f ;\n", -0.1020 )); evd.out.writeBytes( String.format("dyn.cannon.pos[0] = %.2f ;\n", -0.1020 ));
evd.out.writeBytes( String.format("dyn.cannon.pos[1] = %.2f ;\n", 0.9400 )); evd.out.writeBytes( String.format("dyn.cannon.pos[1] = %.2f ;\n", 0.9400 ));
evd.out.writeBytes( String.format("dyn.cannon.vel[0] = %.2f ;\n", 0.0000 )); evd.out.writeBytes( String.format("dyn.cannon.vel[0] = %.2f ;\n", 0.0000 ));
@ -794,7 +823,9 @@ public class CannonDisplay extends JFrame {
evd.resetArmCommand(); evd.resetArmCommand();
} }
if (fireCommand) { if (evd.getFireCommand()) {
angle = evd.getBarrelAngle();
speed = evd.getMuzzleVelocity();
evd.out.writeBytes( String.format("dyn.cannon.init_angle = %.2f ;\n", Math.toRadians(angle))); evd.out.writeBytes( String.format("dyn.cannon.init_angle = %.2f ;\n", Math.toRadians(angle)));
evd.out.writeBytes( String.format("dyn.cannon.init_speed = %.2f;\n", speed )); evd.out.writeBytes( String.format("dyn.cannon.init_speed = %.2f;\n", speed ));
evd.out.writeBytes( String.format("dyn.cannon.pos0[0] = %.2f ;\n", -0.1020 )); evd.out.writeBytes( String.format("dyn.cannon.pos0[0] = %.2f ;\n", -0.1020 ));
@ -802,8 +833,9 @@ public class CannonDisplay extends JFrame {
evd.out.writeBytes( String.format("dyn.cannon.time = %.2f ;\n", 0.0 )); evd.out.writeBytes( String.format("dyn.cannon.time = %.2f ;\n", 0.0 ));
evd.out.writeBytes( String.format("trick.cannon_init( dyn.cannon );\n" )); evd.out.writeBytes( String.format("trick.cannon_init( dyn.cannon );\n" ));
evd.out.writeBytes( String.format("trick.exec_run();\n" )); evd.out.writeBytes( String.format("trick.exec_run();\n" ));
evd.resetFireCommand();
evd.out.flush(); evd.out.flush();
evd.resetFireCommand();
boom = true;
} }
} }
@ -823,6 +855,7 @@ public class CannonDisplay extends JFrame {
exticks = 0; exticks = 0;
evd.setExplosionPos(posx, posy); evd.setExplosionPos(posx, posy);
explosionModelState = ModelState.ACTIVE; explosionModelState = ModelState.ACTIVE;
SoundEffect.EXPLOSION.play();
} }
break; break;
case ACTIVE: case ACTIVE:

View File

@ -0,0 +1,7 @@
trick.frame_log_on()
trick.real_time_enable()
trick.exec_set_software_frame(0.1)
trick.itimer_enable()
trick.exec_set_enable_freeze(True)
trick.exec_set_freeze_command(True)
trick.sim_control_panel_set_enabled(True)

View File

@ -0,0 +1,84 @@
# SIM_MSD
SIM\_MSD is a simulator for a mass-spring-damper system.
![Picture of MSD](./images/MSD0.png)
The system is described by the equation _mẍ_ + _bẋ_ + _kx_ = _F_, where:
_m_ is the mass of an object.
_x_ is the position of the mass.
_b_ is the damping coefficient.
_k_ is the spring coefficient.
_F_ is an external force applied to the mass.
---
### Building the Simulation
In the SIM_MSD directory, execute **trick-CP** to build the simulation executable. When it's complete, you should see:
```
=== Simulation make complete ===
```
Now **cd** into models/Graphics/ and type **make**. This builds the display client for the simulation.
### Running the Simulation
In the SIM_MSD directory:
```
% ./S_main_*.exe RUN_test/input.py
```
The following windows should appear:
![Picture of MSD](./images/MSD2.png)
![Picture of Control](./images/MSD3.png)
### Controlling the Simulation
Click **Start** to begin the simulation.
Click **Reset** to freeze the simulation and reset the position and velocity to
their initial conditions.
Change **Position** and **Velocity** to adjust the initial conditions for those
attributes.
Change **Mass**, **Spring Coefficient**, **Damping Coefficient**, and **Applied
Force** to adjust initial conditions _**and**_ also update the sim in real-time.
---
The following inputs can be set in any of the RUN_*/input.py files to change
the inputs on startup
### Inputs
Variable | Type | Units | Default Value
---------- |-----------|-------|--------------
dyn.msd.x_0 | double | m | 5.0
dyn.msd.v_0 | double | m/s | 0.0
dyn.msd.b | double | N.s/m | 0.5
dyn.msd.k | double | N/m | 2.0
dyn.msd.F | double | N | 5.0
dyn.msd.m | double | kg | 1.0
---
Some sample input.py files have been created to demonstrate different
mass-spring-damper conditions
### Samples
Path |Type
------------------------|----------------------------------------------
RUN_underdamp/input.py |Underdamped Harmonic Oscillator
RUN_critdamp/input.py |Critically Damped Harmonic Oscillator
RUN_overdamp/input.py |Overdamped Harmonic Oscillator
RUN_nodamp/input.py | Simple Harmonic Oscillator (No Damping Force)

View File

@ -0,0 +1,23 @@
dyn_integloop.getIntegrator(trick.Runge_Kutta_4, 4)
execfile("Modified_data/realtime.py")
dyn.msd.b = 2*(2**(0.5))
#==========================================
# Start the display VarServer Client
#==========================================
varServerPort = trick.var_server_get_port();
MsdGui_path = "models/graphics/dist/MsdGui.jar"
if (os.path.isfile(MsdGui_path)) :
MsdGui_cmd = "java -jar " \
+ MsdGui_path \
+ " " + str(varServerPort) + " &" ;
print(MsdGui_cmd)
os.system( MsdGui_cmd);
else :
print('==================================================================================')
print('MsdGui needs to be built. Please \"cd\" into models/Graphics and type \"make\".')
print('==================================================================================')
trick.stop(300.0)

View File

@ -0,0 +1,23 @@
dyn_integloop.getIntegrator(trick.Runge_Kutta_4, 4)
execfile("Modified_data/realtime.py")
dyn.msd.b = 0
#==========================================
# Start the display VarServer Client
#==========================================
varServerPort = trick.var_server_get_port();
MsdGui_path = "models/graphics/dist/MsdGui.jar"
if (os.path.isfile(MsdGui_path)) :
MsdGui_cmd = "java -jar " \
+ MsdGui_path \
+ " " + str(varServerPort) + " &" ;
print(MsdGui_cmd)
os.system( MsdGui_cmd);
else :
print('==================================================================================')
print('MsdGui needs to be built. Please \"cd\" into models/Graphics and type \"make\".')
print('==================================================================================')
trick.stop(300.0)

View File

@ -0,0 +1,23 @@
dyn_integloop.getIntegrator(trick.Runge_Kutta_4, 4)
execfile("Modified_data/realtime.py")
dyn.msd.b = 4*(2**(0.5)) - 1/2
#==========================================
# Start the display VarServer Client
#==========================================
varServerPort = trick.var_server_get_port();
MsdGui_path = "models/graphics/dist/MsdGui.jar"
if (os.path.isfile(MsdGui_path)) :
MsdGui_cmd = "java -jar " \
+ MsdGui_path \
+ " " + str(varServerPort) + " &" ;
print(MsdGui_cmd)
os.system( MsdGui_cmd);
else :
print('==================================================================================')
print('MsdGui needs to be built. Please \"cd\" into models/Graphics and type \"make\".')
print('==================================================================================')
trick.stop(300.0)

View File

@ -0,0 +1,21 @@
dyn_integloop.getIntegrator(trick.Runge_Kutta_4, 4)
execfile("Modified_data/realtime.py")
#==========================================
# Start the display VarServer Client
#==========================================
varServerPort = trick.var_server_get_port();
MsdGui_path = "models/graphics/dist/MsdGui.jar"
if (os.path.isfile(MsdGui_path)) :
MsdGui_cmd = "java -jar " \
+ MsdGui_path \
+ " " + str(varServerPort) + " &" ;
print(MsdGui_cmd)
os.system( MsdGui_cmd);
else :
print('==================================================================================')
print('MsdGui needs to be built. Please \"cd\" into models/Graphics and type \"make\".')
print('==================================================================================')
trick.stop(300.0)

View File

@ -0,0 +1,23 @@
dyn_integloop.getIntegrator(trick.Runge_Kutta_4, 4)
execfile("Modified_data/realtime.py")
dyn.msd.b = 0.5
#==========================================
# Start the display VarServer Client
#==========================================
varServerPort = trick.var_server_get_port();
MsdGui_path = "models/graphics/dist/MsdGui.jar"
if (os.path.isfile(MsdGui_path)) :
MsdGui_cmd = "java -jar " \
+ MsdGui_path \
+ " " + str(varServerPort) + " &" ;
print(MsdGui_cmd)
os.system( MsdGui_cmd);
else :
print('==================================================================================')
print('MsdGui needs to be built. Please \"cd\" into models/Graphics and type \"make\".')
print('==================================================================================')
trick.stop(300.0)

View File

@ -0,0 +1,33 @@
/************************TRICK HEADER*************************
PURPOSE:
(This S_define works with the RUN_numeric input file)
LIBRARY DEPENDENCIES:
(
(msd/src/msd_init.cpp)
(msd/src/msd_numeric.cpp)
(msd/src/msd_shutdown.cpp)
(msd/src/msd.cpp)
(msd/src/msd_deriv.cpp)
(msd/src/msd_integ.cpp)
)
*************************************************************/
#include "sim_objects/default_trick_sys.sm"
##include "msd/include/msd_numeric.hh"
class MSDSimObject : public Trick::SimObject {
public:
MSD msd;
MSDSimObject() {
("default_data") msd_default_data( msd ) ;
("initialization") msd_init( msd ) ;
("derivative") msd.state_deriv();
("integration") trick_ret= msd.state_integ();
}
} ;
MSDSimObject dyn ;
IntegLoop dyn_integloop (0.01) dyn ;

View File

@ -0,0 +1,2 @@
TRICK_CFLAGS += -Imodels
TRICK_CXXFLAGS += -Imodels

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

View File

@ -0,0 +1,200 @@
/*
* Trick
* 2018 (c) National Aeronautics and Space Administration (NASA)
* Programmers: Scott P. Fennell
*/
import javax.swing.*;
import javax.swing.JTextField;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class MsdController extends JFrame {
JTextField positionTextField;
JTextField velocityTextField;
JTextField springTextField;
JTextField dampingTextField;
JTextField forceTextField;
JTextField massTextField;
ButtonPanel buttonPanel;
JPanel positionPanel;
JPanel labelPanel;
public void armResetCommand() {
buttonPanel.armResetCommand();
}
public void armStartCommand() {
buttonPanel.armStartCommand();
}
public boolean getResetCommand() {
return buttonPanel.getResetCommand();
}
public boolean getStartCommand() {
return buttonPanel.getStartCommand();
}
public MsdController(MsdDisplay display){
setTitle("Mass-Spring-Damper Control");
setLayout(new GridLayout(1, 2));
buttonPanel = new ButtonPanel(display);
positionPanel = new JPanel();
labelPanel = new JPanel();
labelPanel.setAlignmentX(Component.RIGHT_ALIGNMENT);
positionPanel.setLayout(new GridLayout(13, 1));
labelPanel.setLayout(new GridLayout(13, 1));
JPanel framePanel = new JPanel();
GridLayout layout = new GridLayout(1, 3);
framePanel.setLayout(layout);
positionTextField = new JTextField(2);
velocityTextField = new JTextField(2);
massTextField = new JTextField(2);
forceTextField = new JTextField(2);
springTextField = new JTextField(2);
dampingTextField = new JTextField(2);
labelPanel.add(new JLabel());
labelPanel.add(new JLabel("Position: "));
labelPanel.add(new JLabel());
labelPanel.add(new JLabel("Velocity: "));
labelPanel.add(new JLabel());
labelPanel.add(new JLabel("Mass: "));
labelPanel.add(new JLabel());
labelPanel.add(new JLabel("Spring Coefficient: "));
labelPanel.add(new JLabel());
labelPanel.add(new JLabel("Damping Coefficient: "));
labelPanel.add(new JLabel());
labelPanel.add(new JLabel("Applied Force: "));
labelPanel.add(new JLabel());
positionPanel.add(new JLabel());
positionPanel.add(positionTextField);
positionPanel.add(new JLabel());
positionPanel.add(velocityTextField);
positionPanel.add(new JLabel());
positionPanel.add(massTextField);
positionPanel.add(new JLabel());
positionPanel.add(springTextField);
positionPanel.add(new JLabel());
positionPanel.add(dampingTextField);
positionPanel.add(new JLabel());
positionPanel.add(forceTextField);
positionPanel.add(new JLabel());
for(Component L : labelPanel.getComponents()){
if(L instanceof JLabel){
((JLabel)L).setHorizontalAlignment(JLabel.RIGHT);
}
}
framePanel.add(buttonPanel);
framePanel.add(labelPanel);
framePanel.add(positionPanel);
add(framePanel);
positionPanel.setSize(positionPanel.getLayout().preferredLayoutSize(positionPanel));
buttonPanel.setSize(buttonPanel.getPreferredSize());
setSize(getPreferredSize());
setLocationByPlatform(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
class ButtonPanel extends JPanel implements ActionListener {
private MsdDisplay msdDisplay;
private boolean startCommand;
private boolean resetCommand;
private JButton startButton, resetButton, zoomOutButton, zoomInButton;
public ButtonPanel(MsdDisplay cd) {
msdDisplay = cd;
startCommand = false;
resetCommand = false;
setLayout(new GridLayout(4,1 ));
startButton = new JButton("Start");
startButton.addActionListener(this);
startButton.setActionCommand("start");
startButton.setToolTipText("Start MSD");
add(startButton);
resetButton = new JButton("Reset");
resetButton.addActionListener(this);
resetButton.setActionCommand("reset");
resetButton.setToolTipText("Reset MSD");
add(resetButton);
zoomOutButton = new JButton("\u25b2");
zoomOutButton.addActionListener(this);
zoomOutButton.setActionCommand("zoomout");
zoomOutButton.setToolTipText("Zoom in");
add(zoomOutButton);
zoomInButton = new JButton("\u25bc");
zoomInButton.addActionListener(this);
zoomInButton.setActionCommand("zoomin");
zoomInButton.setToolTipText("Zoom Out");
add(zoomInButton);
}
public void actionPerformed(ActionEvent e) {
String s = e.getActionCommand();
switch (s) {
case "start":
startCommand = true;
break;
case "reset":
resetCommand = true;
break;
case "zoomin":
msdDisplay.setScale(msdDisplay.getScale() / 2);
break;
case "zoomout":
msdDisplay.setScale(msdDisplay.getScale() * 2);
break;
default:
System.out.println("Unknown Action Command:" + s);
break;
}
}
public void armResetCommand() {
resetCommand = false;
startButton.setForeground(Color.red);
}
public void armStartCommand() {
startCommand = false;
startButton.setForeground(Color.gray);
}
public boolean getResetCommand() {
return resetCommand;
}
public boolean getStartCommand() {
return startCommand;
}
} // class ButtonPanel
}

View File

@ -0,0 +1,50 @@
/*
* Trick
* 2018 (c) National Aeronautics and Space Administration (NASA)
* Programmers: Scott P. Fennell
*/
import javax.swing.*;
public class MsdDisplay extends JFrame {
MsdView msdView;
public void setPosition(double value) {
msdView.setPosition(value);
}
public void setVelocity(double value) {
msdView.setVelocity(value);
}
public void setScale(int value) {
msdView.setScale(value);
}
public int getScale() {
return msdView.getScale();
}
public void drawMsdView() {
msdView.repaint();
}
public MsdDisplay(MsdView arena) {
setTitle("Mass-Spring-Damper");
msdView = arena;
add(msdView);
setSize(800, 500);
setLocationByPlatform(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}

View File

@ -0,0 +1,218 @@
/*
* Trick
* 2018 (c) National Aeronautics and Space Administration (NASA)
* Programmers: Scott P. Fennell
*/
import java.awt.*;
import java.io.*;
import java.net.Socket;
public class MsdGui {
static BufferedReader in;
static DataOutputStream out;
public static void connectToServer(String host, int port) throws IOException {
Socket socket = new Socket(host, port);
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));
}
public static void main(String[] args) throws IOException {
String host = "localHost";
int port = 0;
// ==========================================================
// Handle program arguments.
// ==========================================================
int ii = 0;
while (ii < args.length) {
switch (args[ii]) {
case "-help":
case "--help": {
MsdUtils.printHelpText();
System.exit(0);
}
break;
default: {
port = (Integer.parseInt(args[ii]));
}
break;
}
++ii;
}
if (port == 0) {
System.out.println("No variable server port specified.");
MsdUtils.printHelpText();
System.exit(0);
}
boolean go = true;
double dt = 0.01; // Time between updates (seconds).
double pos = 0.0;
double vel = 0.0;
boolean resetCommand;
boolean startCommand;
int simMode = 0;
int mapScale = 32; // pixels per meter.
MsdView msdView = new MsdView(mapScale);
MsdDisplay display = new MsdDisplay(msdView);
MsdController controller = new MsdController(display);
display.setVisible(true);
display.drawMsdView();
controller.setVisible(true);
controller.setLocation(new Point((int)display.getLocationOnScreen().getX() + display.getWidth(), (int)display.getLocationOnScreen().getY()));
controller.setSize(controller.getWidth() + 10, display.getHeight());
// Connect to the Trick simulation's variable server
System.out.println("Connecting to: " + host + ":" + port);
connectToServer(host, port);
out.writeBytes("trick.var_set_client_tag(\"MsdGui\") \n");
out.flush();
// Have the Variable Server send us the simulation mode ONCE.
out.writeBytes("trick.var_add(\"trick_sys.sched.mode\")\n" +
"trick.var_add(\"dyn.msd.x_0\")\n" +
"trick.var_add(\"dyn.msd.v_0\")\n" +
"trick.var_add(\"dyn.msd.m\")\n" +
"trick.var_add(\"dyn.msd.b\")\n" +
"trick.var_add(\"dyn.msd.k\")\n" +
"trick.var_add(\"dyn.msd.F\")\n" +
"trick.var_send() \n" +
"trick.var_clear() \n");
out.flush();
// Read the response and extract the simulation mode. Initialize text fields with initial values.
try {
String line;
String field[];
line = in.readLine();
field = line.split("\t");
simMode = Integer.parseInt(field[1]);
controller.positionTextField.setText(String.format("%.2f", new Double(field[2])));
controller.velocityTextField.setText(String.format("%.2f", new Double(field[3])));
controller.massTextField.setText(String.format("%.2f", new Double(field[4])));
controller.dampingTextField.setText(String.format("%.2f", new Double(field[5])));
controller.springTextField.setText(String.format("%.2f", new Double(field[6])));
controller.forceTextField.setText(String.format("%.2f", new Double(field[7])));
} catch (IOException | NullPointerException e) {
go = false;
}
// If we're in FREEZE, make ready to start.
if (simMode == TrickSimMode.FREEZE) {
controller.armResetCommand();
}
// Configure the Variable Server to cyclically send us the following variables.
// Tell the variable server:
// 1) We want the values of the following variables:
out.writeBytes("trick.var_pause() \n" +
"trick.var_add(\"dyn.msd.x\")\n" +
"trick.var_add(\"dyn.msd.v\")\n" +
"trick.var_add(\"trick_sys.sched.mode\")\n" +
// 2) We want the responses in ASCII:
"trick.var_ascii() \n" +
/* 3) We want debug information:
"trick.var_debug(1) \n" +
*/
// 4) We want values to be updated at the specified rate:
String.format("trick.var_cycle(%.3f)\n", dt) +
// 5) Start sending values as specified.
"trick.var_unpause() \n");
out.flush();
while (go) {
// Receive and parse periodic data response from the variable server.
try {
String line;
String field[];
line = in.readLine();
field = line.split("\t");
pos = Double.parseDouble(field[1]);
vel = Double.parseDouble(field[2]);
simMode = Integer.parseInt(field[3]);
} catch (IOException | NullPointerException e) {
go = false;
}
// Get inputs from the GUI.
resetCommand = controller.getResetCommand();
startCommand = controller.getStartCommand();
if (simMode == TrickSimMode.FREEZE) {
controller.armResetCommand();
resetCommand = false;
if (!controller.positionTextField.getText().isEmpty() && new Double(controller.positionTextField.getText()) >= 0.0) {
display.msdView.hideWall = false;
}
if (!(controller.positionTextField.getText().isEmpty() ||
controller.velocityTextField.getText().isEmpty() ||
controller.springTextField.getText().isEmpty() ||
controller.dampingTextField.getText().isEmpty() ||
controller.massTextField.getText().isEmpty() ||
controller.forceTextField.getText().isEmpty())) {
out.writeBytes(
"dyn.msd.x_0 = " + controller.positionTextField.getText() + ";\n" +
"dyn.msd.v_0 = " + controller.velocityTextField.getText() + ";\n" +
"dyn.msd.k = " + controller.springTextField.getText() + ";\n" +
"dyn.msd.b = " + controller.dampingTextField.getText() + ";\n" +
"dyn.msd.m = " + controller.massTextField.getText() + ";\n" +
"dyn.msd.F = " + controller.forceTextField.getText() + ";\n");
out.writeBytes("dyn.msd.x = dyn.msd.x_0 ;\n");
out.writeBytes("dyn.msd.v = dyn.msd.v_0 ;\n");
}
if (startCommand) {
out.writeBytes(String.format("trick.exec_run();\n"));
out.flush();
}
if (resetCommand) {
out.writeBytes(String.format("trick.exec_freeze() ;\n"));
continue;
}
out.flush();
} else if (simMode == TrickSimMode.RUN) {
controller.armStartCommand();
startCommand = false;
if (resetCommand) {
out.writeBytes(String.format("trick.exec_freeze() ;\n"));
out.flush();
}
if (!(controller.springTextField.getText().isEmpty() ||
controller.dampingTextField.getText().isEmpty() ||
controller.massTextField.getText().isEmpty() ||
controller.forceTextField.getText().isEmpty())) {
out.writeBytes(
"dyn.msd.k = " + controller.springTextField.getText() + ";\n" +
"dyn.msd.b = " + controller.dampingTextField.getText() + ";\n" +
"dyn.msd.m = " + controller.massTextField.getText() + ";\n" +
"dyn.msd.F = " + controller.forceTextField.getText() + ";\n");
}
}
// Update the display data.
display.setPosition(pos);
display.setVelocity(vel);
// Update the scene.
display.drawMsdView();
} // while
}
}

View File

@ -0,0 +1,24 @@
/*
* Trick
* 2018 (c) National Aeronautics and Space Administration (NASA)
* Programmers: Scott P. Fennell
*/
public class MsdUtils {
public static void printHelpText() {
System.out.println(
"----------------------------------------------------------------------\n"
+ "usage: java jar CannonDisplay.jar <port-number>\n"
+ "----------------------------------------------------------------------\n"
);
}
}
class TrickSimMode {
public static final int INIT = 0;
public static final int FREEZE = 1;
public static final int RUN = 5;
}

View File

@ -0,0 +1,183 @@
/*
* Trick
* 2018 (c) National Aeronautics and Space Administration (NASA)
* Programmers: Scott P. Fennell
*/
import javax.swing.*;
import java.awt.*;
class MsdView extends JPanel {
private int scale;
private Color massColor;
private Color backgroundColor;
private Color wallColor;
private Color springColor;
private Double position;
private Double velocity;
private Double massRadius;
boolean hideWall = false;
// Origin of world coordinates in jpanel coordinates.
private int worldOriginX;
private int worldOriginY;
/**
* Class constructor.
*/
public MsdView(int mapScale) {
setScale(mapScale);
backgroundColor = new Color(200, 200, 255);
springColor = new Color(150, 150, 100);
massColor = new Color(10, 10, 10);
wallColor = new Color(120, 118, 118);
springColor = Color.BLUE;
massRadius = 0.75;
position = 0.0;
velocity = 0.0;
}
/**
* @param value angle in degrees
*/
public void setPosition(double value) {
position = value;
}
public void setVelocity(double value) {
velocity = value;
}
public void setScale(int mapScale) {
if (mapScale < 4) {
scale = 4;
} else if (mapScale > 128) {
scale = 128;
} else {
scale = mapScale;
}
repaint();
}
public int getScale() {
return scale;
}
public void drawCenteredCircle(Graphics2D g, int x, int y, int r) {
x = x - (r / 2);
y = y - (r / 2);
g.fillOval(x, y, r, r);
}
private void doDrawing(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
RenderingHints rh = new RenderingHints(
RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
rh.put(RenderingHints.KEY_RENDERING,
RenderingHints.VALUE_RENDER_QUALITY);
int ii, jj;
int width = getWidth();
int height = getHeight();
worldOriginX = (width / 3);
worldOriginY = (height / 2);
while (worldOriginX + scale * position > width) {
scale = scale / 2;
}
// Draw Sky
g2d.setPaint(backgroundColor);
g2d.fillRect(0, 0, width, worldOriginY);
// Draw mass
g2d.setPaint(massColor);
int bx = (int) (worldOriginX + scale * position);
int by = (int) (worldOriginY);
drawCenteredCircle(g2d, bx, by, (int) (scale * massRadius));
// Draw spring
double springPosition;
// reflect spring visual over origin correctly
if(position < massRadius/2 && position > -massRadius/2){
springPosition = 0.0;
} else if(position < 0){
springPosition = position + massRadius/2;
} else{
springPosition = position - massRadius/2;
}
int SCALEFACTOR = 200;
int cycles = 5;
int points = SCALEFACTOR * cycles * 2;
double[] sines = new double[points];
for (int i = 0; i < points; i++) {
double radians = (Math.PI / SCALEFACTOR) * i;
sines[i] = Math.sin(radians);
}
int maxWidth = (int) (scale * (springPosition /*- massRadius / 2*/));
double hstep = (double) maxWidth / (double) points;
int maxHeight = (int) (scale);
int[] pts = new int[points];
for (int i = 0; i < points; i++) {
pts[i] = (int) (sines[i] * maxHeight / 2 * .95 + maxHeight / 2);
}
g2d.setColor(springColor);
for (int i = 1; i < points; i++) {
int x1 = (int) ((i - 1) * hstep);
int x2 = (int) (i * hstep);
int y1 = pts[i - 1];
int y2 = pts[i];
g2d.drawLine(x1 + worldOriginX, y1 + height / 2 - scale / 2, x2 + worldOriginX, y2 + height / 2 - scale / 2);
}
//Draw wall
if (!hideWall && position >= 0) {
g2d.setPaint(wallColor);
g2d.fillRect(0, 0, worldOriginX, height);
} else {
hideWall = true;
}
// Draw range markers.
int tickRange = 50;
if (scale >= 8) tickRange = 20;
if (scale >= 16) tickRange = 10;
if (scale >= 32) tickRange = 5;
if (scale >= 64) tickRange = 1;
int lower = ((int) ((-worldOriginX) / (scale * tickRange)) + 1) * tickRange;
int upper = ((int) ((width - worldOriginX) / (scale * tickRange)) + 1) * tickRange;
g2d.setPaint(Color.BLACK);
for (ii = lower; ii < upper; ii += tickRange) {
int mx = (int) (worldOriginX + scale * ii);
g2d.drawLine(mx, worldOriginY, mx, worldOriginY + 20);
g2d.drawString(String.format("%d", ii), mx, worldOriginY + 15);
}
g2d.drawString(String.format("SCALE: %d pixels/meter", scale), 20, 20);
g2d.drawString(String.format(" Position (m): %.2f", position), 20, 80);
g2d.drawString(String.format("Velocity (m/s): %.2f", velocity), 20, 120);
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
doDrawing(g);
}
}

View File

@ -0,0 +1,36 @@
SHELL = /bin/sh
PROJECT_NAME = MsdGui
SRC_DIR = MSD/src
BUILD_DIR = build
CLASSES_DIR = $(BUILD_DIR)/classes
JAR_DIR = dist
MAIN_CLASS = MsdGui
all: jar
clean:
rm -rf $(BUILD_DIR)
rm -f manifest
spotless: clean
rm -rf dist
$(CLASSES_DIR):
@ mkdir -p $(CLASSES_DIR)
compile: | $(CLASSES_DIR)
javac -sourcepath $(SRC_DIR) -d $(CLASSES_DIR) $(SRC_DIR)/MsdGui.java
manifest:
@ echo "Main-Class: $(MAIN_CLASS)" > $@
$(JAR_DIR):
@ mkdir -p $(JAR_DIR)
jar: compile manifest | $(JAR_DIR)
jar cvfm $(JAR_DIR)/$(PROJECT_NAME).jar manifest -C $(CLASSES_DIR) .
@ echo "-------------------------------------------------------------------------------"
@ echo " BUILD COMPLETE"
@ echo "The Java jar file (the Java Executable) is located at: $(JAR_DIR)/$(PROJECT_NAME).jar"
@ echo "-------------------------------------------------------------------------------"

View File

@ -0,0 +1,48 @@
/************************TRICK HEADER*************************
PURPOSE: Mass-Spring-Damper class header file .
PROGRAMMERS:
(((Scott P. Fennell) (CACI International Inc.) (January 2018) (Trick Learning Project)))
*************************************************************/
#ifndef MSD_H
#define MSD_H
class MSD {
public:
double a; /* m/s2 acceleration */
double v; /* m/s velocity */
double x; /* m position */
double m; /* kg mass */;
double v_0; /* *i m/s initial velocity of the mass (at t = 0) */
double x_0; /* *i m initial position of the mass (at t = 0) */
double b; /* N.s/m damping constant */
double k; /* N/m spring constant */
double F; /* N force constant */
MSD(void); /* not used */
MSD(double _m, double _k, double _b, double _F,
double _v_0, double _x_0);
int state_deriv(void);
int state_integ(void);
};
#ifdef __cplusplus
extern "C" {
#endif
int msd_default_data(MSD &);
int msd_init(MSD &);
int msd_shutdown(const MSD &);
#ifdef __cplusplus
}
#endif
#endif /* MSD_H */

View File

@ -0,0 +1,17 @@
/************************TRICK HEADER*************************
PURPOSE: Msd Numeric model
PROGRAMMERS:
(((Scott P. Fennell) (CACI International Inc.) (January 2018) (Trick Learning Project)))
*************************************************************/
#ifndef MSD_NUMERIC_H
#define MSD_NUMERIC_H
#include "msd.hh"
#ifdef __cplusplus
extern "C" {
#endif
#ifdef __cplusplus
}
#endif
#endif

View File

@ -0,0 +1,19 @@
/************************TRICK HEADER*************************
PURPOSE: MSD is a mass-spring-damper class for a trick sim.
PROGRAMMERS:
(((Scott P. Fennell) (CACI International Inc.) (January 2018) (Trick Learning Project)))
*************************************************************/
#include <math.h>
#include "../include/msd_numeric.hh"
#include <float.h>
MSD::MSD(double _m, double _k, double _b, double _F, double _v_0, double _x_0) {
m = _m;
k = _k;
b = _b;
F = _F;
v_0 = _v_0;
x_0 = _x_0;
}
MSD::MSD(void) {/* not used */}

View File

@ -0,0 +1,15 @@
/************************TRICK HEADER*************************
PURPOSE: ( Trick integration )
PROGRAMMERS:
(((Scott P. Fennell) (CACI International Inc.) (January 2018) (Trick Learning Project)))
*************************************************************/
#include "../include/msd_numeric.hh"
#include "../include/msd.hh"
#include <math.h>
int MSD::state_deriv(void) {
/* system equation for second derivitive */
a = (F - b*v - k*x)/m;
return(0);
}

View File

@ -0,0 +1,28 @@
/************************TRICK HEADER*************************
PURPOSE: Set the initial data values of the MSD
PROGRAMMERS:
(((Scott P. Fennell) (CACI International Inc.) (January 2018) (Trick Learning Project)))
*************************************************************/
/* Model Include files */
#include "../include/msd.hh"
/* default data job */
int msd_default_data(MSD &M) {
M = MSD(
1.0, /* m */
2.0, /* k */
0.5, /* b */
5.0, /* F */
0.0, /* v_0 */
5.0 /* x_0 */
);
return 0;
}
/* initialization job */
int msd_init(MSD &M) {
return 0;
}

View File

@ -0,0 +1,31 @@
/************************TRICK HEADER*************************
PURPOSE: ( Trick integration )
PROGRAMMERS:
(((Scott P. Fennell) (CACI International Inc.) (January 2018) (Trick Learning Project)))
*************************************************************/
#include "../include/msd_numeric.hh"
#include "msd.hh"
#include "trick/Integrator.hh"
#include "trick/integrator_c_intf.h"
#include <math.h>
int MSD::state_integ(void) {
int ipass;
load_state(
&x,
&v,
NULL);
load_deriv(
&v,
&a,
NULL);
ipass = integrate();
unload_state(
&x,
&v,
NULL);
return(ipass);
}

View File

@ -0,0 +1,17 @@
/************************TRICK HEADER*************************
PURPOSE: (Print the final msd state.)
PROGRAMMERS:
(((Scott P. Fennell) (CACI International Inc.) (January 2018) (Trick Learning Project)))
*************************************************************/
#include "../include/msd.hh"
#include "trick/exec_proto.h"
#include <stdio.h>
int msd_shutdown(const MSD &M) {
printf("========================================\n");
printf(" MSD State at Shutdown \n");
printf("pos = [%g], vel = [%g], acc = [%g]\n",
M.x, M.v, M.a);
printf("========================================\n");
return 0;
}

View File

@ -270,7 +270,7 @@ void FieldDescription::parseComment(std::string comment) {
if ( chkpnt_io_found == true ) { if ( chkpnt_io_found == true ) {
// If a checkpoint I/O spec is found add it to the io field. // If a checkpoint I/O spec is found add it to the io field.
io = (chkpnt_io << 2 ) + ( io & 3 ) ; io = (chkpnt_io << 2 ) + ( io & 3 ) ;
} else { } else if ( io_found == true ) {
// else duplicated the io field to the chkpnt io field. // else duplicated the io field to the chkpnt io field.
io |= (io << 2 ) ; io |= (io << 2 ) ;
} }

View File

@ -128,6 +128,10 @@ bool FieldVisitor::VisitBuiltinType(clang::BuiltinType *bt) {
bool FieldVisitor::VisitConstantArrayType(clang::ConstantArrayType *cat) { bool FieldVisitor::VisitConstantArrayType(clang::ConstantArrayType *cat) {
//cat->dump() ; std::cout << std::endl ; //cat->dump() ; std::cout << std::endl ;
fdes->addArrayDim(cat->getSize().getZExtValue()) ; fdes->addArrayDim(cat->getSize().getZExtValue()) ;
// If this field is an arrayed STL, skip it!
if ( fdes->isSTL() ) {
fdes->setIO(0) ;
}
return true; return true;
} }
@ -249,6 +253,10 @@ bool FieldVisitor::VisitFieldDecl( clang::FieldDecl *field ) {
bool FieldVisitor::VisitPointerType(clang::PointerType *p) { bool FieldVisitor::VisitPointerType(clang::PointerType *p) {
fdes->addArrayDim(-1) ; fdes->addArrayDim(-1) ;
// If this field is a pointer to an STL, skip it!
if ( fdes->isSTL() ) {
fdes->setIO(0) ;
}
return true; return true;
} }
@ -426,7 +434,7 @@ bool FieldVisitor::VisitRecordType(clang::RecordType *rt) {
tst_string.erase(pos , 7) ; tst_string.erase(pos , 7) ;
} }
// clang changes bool to _Bool. We need to change it back // clang changes bool to _Bool. We need to change it back
if ((pos = tst_string.find("<_Bool")) != std::string::npos ) { while ((pos = tst_string.find("<_Bool")) != std::string::npos ) {
tst_string.replace(pos , 6, "<bool") ; tst_string.replace(pos , 6, "<bool") ;
} }
while ((pos = tst_string.find(" _Bool")) != std::string::npos ) { while ((pos = tst_string.find(" _Bool")) != std::string::npos ) {
@ -474,6 +482,12 @@ bool FieldVisitor::VisitRecordType(clang::RecordType *rt) {
return false ; return false ;
} }
// If the type is a private embedded class there will not be any io_src code for the type. Don't create attributes
if ( CXXRecordVisitor::isPrivateEmbeddedClass(tst_string) ) {
//std::cout << "Type is a private embedded class!" << std::endl ;
fdes->setIO(0) ;
return false ;
}
/* Template specialization types will be processed here because the canonical type /* Template specialization types will be processed here because the canonical type
will be typed as a record. We test if we have a template specialization type. will be typed as a record. We test if we have a template specialization type.
If so process the template type and return */ If so process the template type and return */

View File

@ -35,7 +35,12 @@ void FindTrickICG::FileChanged(clang::SourceLocation Loc, FileChangeReason Reaso
} }
} }
void FindTrickICG::If(clang::SourceLocation Loc, clang::SourceRange ConditionRange, bool ConditionValue) { #if (LIBCLANG_MAJOR > 3) || ((LIBCLANG_MAJOR == 3) && (LIBCLANG_MINOR >= 5))
void FindTrickICG::If(clang::SourceLocation Loc, clang::SourceRange ConditionRange, clang::PPCallbacks::ConditionValueKind ConditionValue)
#else
void FindTrickICG::If(clang::SourceLocation Loc, clang::SourceRange ConditionRange, bool ConditionValue)
#endif
{
if ( ConditionRange.isValid() ) { if ( ConditionRange.isValid() ) {
// Get the full text of the if statement into a string // Get the full text of the if statement into a string
clang::FullSourceLoc fsl_begin(ConditionRange.getBegin() , ci.getSourceManager()) ; clang::FullSourceLoc fsl_begin(ConditionRange.getBegin() , ci.getSourceManager()) ;
@ -67,12 +72,22 @@ void FindTrickICG::If(clang::SourceLocation Loc, clang::SourceRange ConditionRan
} }
} }
void FindTrickICG::ElIf(clang::SourceLocation Loc, clang::SourceRange ConditionRange, bool ConditionValue) { #if (LIBCLANG_MAJOR > 3) || ((LIBCLANG_MAJOR == 3) && (LIBCLANG_MINOR >= 5))
void FindTrickICG::ElIf(clang::SourceLocation Loc, clang::SourceRange ConditionRange, clang::PPCallbacks::ConditionValueKind ConditionValue)
#else
void FindTrickICG::ElIf(clang::SourceLocation Loc, clang::SourceRange ConditionRange, bool ConditionValue)
#endif
{
// Do the same processing for an #elif statement as an #if statement. // Do the same processing for an #elif statement as an #if statement.
If(Loc,ConditionRange,ConditionValue) ; If(Loc,ConditionRange,ConditionValue) ;
} }
void FindTrickICG::Ifdef(clang::SourceLocation Loc, const clang::Token &MacroNameTok, const clang::MacroDirective *MD) { #if (LIBCLANG_MAJOR > 3) || ((LIBCLANG_MAJOR == 3) && (LIBCLANG_MINOR >= 5))
void FindTrickICG::Ifdef(clang::SourceLocation Loc, const clang::Token &MacroNameTok, const clang::MacroDefinition &MD)
#else
void FindTrickICG::Ifdef(clang::SourceLocation Loc, const clang::Token &MacroNameTok, const clang::MacroDirective *MD)
#endif
{
// Get the token name that is being tested. // Get the token name that is being tested.
std::string name = MacroNameTok.getIdentifierInfo()->getName().str() ; std::string name = MacroNameTok.getIdentifierInfo()->getName().str() ;
if ( ! name.compare("TRICK_ICG") ) { if ( ! name.compare("TRICK_ICG") ) {
@ -94,7 +109,12 @@ void FindTrickICG::Ifdef(clang::SourceLocation Loc, const clang::Token &MacroNam
} }
void FindTrickICG::Ifndef(clang::SourceLocation Loc, const clang::Token &MacroNameTok, const clang::MacroDirective *MD) { #if (LIBCLANG_MAJOR > 3) || ((LIBCLANG_MAJOR == 3) && (LIBCLANG_MINOR >= 5))
void FindTrickICG::Ifndef(clang::SourceLocation Loc, const clang::Token &MacroNameTok, const clang::MacroDefinition &MD)
#else
void FindTrickICG::Ifndef(clang::SourceLocation Loc, const clang::Token &MacroNameTok, const clang::MacroDirective *MD)
#endif
{
// Get the token name that is being tested. // Get the token name that is being tested.
std::string name = MacroNameTok.getIdentifierInfo()->getName().str() ; std::string name = MacroNameTok.getIdentifierInfo()->getName().str() ;
if ( ! name.compare("TRICK_ICG") ) { if ( ! name.compare("TRICK_ICG") ) {

View File

@ -21,10 +21,17 @@ class FindTrickICG : public clang::PPCallbacks {
clang::FileID PrevFID = clang::FileID()) ; clang::FileID PrevFID = clang::FileID()) ;
// callbacks called when the preprocessor directives of types are processed. // callbacks called when the preprocessor directives of types are processed.
#if (LIBCLANG_MAJOR > 3) || ((LIBCLANG_MAJOR == 3) && (LIBCLANG_MINOR >= 5))
virtual void If(clang::SourceLocation Loc, clang::SourceRange ConditionRange, clang::PPCallbacks::ConditionValueKind ConditionValue) ;
virtual void ElIf(clang::SourceLocation Loc, clang::SourceRange ConditionRange, clang::PPCallbacks::ConditionValueKind ConditionValue) ;
virtual void Ifdef(clang::SourceLocation Loc, const clang::Token &MacroNameTok, const clang::MacroDefinition &MD) ;
virtual void Ifndef(clang::SourceLocation Loc, const clang::Token &MacroNameTok, const clang::MacroDefinition &MD) ;
#else
virtual void If(clang::SourceLocation Loc, clang::SourceRange ConditionRange, bool ConditionValue) ; virtual void If(clang::SourceLocation Loc, clang::SourceRange ConditionRange, bool ConditionValue) ;
virtual void ElIf(clang::SourceLocation Loc, clang::SourceRange ConditionRange, bool ConditionValue) ; virtual void ElIf(clang::SourceLocation Loc, clang::SourceRange ConditionRange, bool ConditionValue) ;
virtual void Ifdef(clang::SourceLocation Loc, const clang::Token &MacroNameTok, const clang::MacroDirective *MD) ; virtual void Ifdef(clang::SourceLocation Loc, const clang::Token &MacroNameTok, const clang::MacroDirective *MD) ;
virtual void Ifndef(clang::SourceLocation Loc, const clang::Token &MacroNameTok, const clang::MacroDirective *MD) ; virtual void Ifndef(clang::SourceLocation Loc, const clang::Token &MacroNameTok, const clang::MacroDirective *MD) ;
#endif
// print a warning about using TRICK_ICG. // print a warning about using TRICK_ICG.
void print_header() ; void print_header() ;

View File

@ -1,6 +1,7 @@
#include <iostream> #include <iostream>
#include <fstream> #include <fstream>
#include <sstream>
#include <libgen.h> #include <libgen.h>
#include <unistd.h> #include <unistd.h>
#include <stdlib.h> #include <stdlib.h>
@ -32,6 +33,23 @@ PrintAttributes::PrintAttributes(int in_attr_version , HeaderSearchDirs & in_hsd
printer = new PrintFileContents10() ; printer = new PrintFileContents10() ;
} }
void PrintAttributes::addIgnoreTypes() {
char * env_var_contents = getenv("TRICK_ICG_IGNORE_TYPES") ;
if( env_var_contents != NULL ) {
std::string s = std::string(env_var_contents) ;
std::stringstream ss(s);
std::string item;
while(std::getline(ss, item, ';')) {
item = trim(item) ;
if ( ! item.empty() ) {
global_ignore_types.insert(item) ;
}
}
}
}
/** /**
@details @details
@ -240,6 +258,10 @@ void PrintAttributes::printClass( ClassValues * cv ) {
outfile.close(); outfile.close();
} }
if (!isHeaderExcluded(fileName)) {
printer->printClassMap(class_map_outfile, cv);
}
/*
char* realPath = almostRealPath(fileName.c_str()); char* realPath = almostRealPath(fileName.c_str());
if (realPath) { if (realPath) {
if (isFileIncluded(fileName) or hsd.isPathInExtLib(realPath)) { if (isFileIncluded(fileName) or hsd.isPathInExtLib(realPath)) {
@ -247,6 +269,7 @@ void PrintAttributes::printClass( ClassValues * cv ) {
} }
free(realPath); free(realPath);
} }
*/
} }
void PrintAttributes::printEnum(EnumValues* ev) { void PrintAttributes::printEnum(EnumValues* ev) {
@ -270,9 +293,14 @@ void PrintAttributes::printEnum(EnumValues* ev) {
outfile.close() ; outfile.close() ;
} }
if (!isHeaderExcluded(fileName)) {
printer->printEnumMap(enum_map_outfile, ev);
}
/*
if (isFileIncluded(fileName)) { if (isFileIncluded(fileName)) {
printer->printEnumMap(enum_map_outfile, ev) ; printer->printEnumMap(enum_map_outfile, ev) ;
} }
*/
} }
void PrintAttributes::createMapFiles() { void PrintAttributes::createMapFiles() {
@ -472,7 +500,9 @@ bool PrintAttributes::isIgnored(ConstructValues& constructValues) {
std::set<std::string>& constructs = ignored_types[fileName]; std::set<std::string>& constructs = ignored_types[fileName];
const bool ignored = constructs.find(constructValues.getName()) != constructs.end() or const bool ignored = constructs.find(constructValues.getName()) != constructs.end() or
constructs.find(constructValues.getFullyQualifiedName()) != constructs.end(); constructs.find(constructValues.getFullyQualifiedName()) != constructs.end() or
global_ignore_types.find(constructValues.getName()) != global_ignore_types.end() or
global_ignore_types.find(constructValues.getFullyQualifiedName()) != global_ignore_types.end();
if (ignored and verboseBuild) { if (ignored and verboseBuild) {
std::cout << skipping << "ICG Ignore Type: " << constructValues.getName() << " (from " << fileName << ")" << std::endl; std::cout << skipping << "ICG Ignore Type: " << constructValues.getName() << " (from " << fileName << ")" << std::endl;
@ -531,6 +561,35 @@ bool PrintAttributes::isHeaderExcluded(const std::string& header, bool exclude_e
return true; return true;
} }
temp = realpath(header.c_str(),NULL);
if ( temp ) {
const std::string real_path = std::string(temp);
free(temp) ;
if ( real_path.compare(path) ) {
if (hsd.isPathInExclude(real_path)) {
if (verboseBuild) {
std::cout << skipping << "TRICK_EXCLUDE: " << underline(real_path, hsd.getPathInExclude(real_path).size()) << std::endl;
}
return true;
}
if (hsd.isPathInICGExclude(real_path)) {
if (verboseBuild) {
std::cout << skipping << "TRICK_ICG_EXCLUDE: " << underline(real_path, hsd.getPathInICGExclude(real_path).size()) << std::endl;
}
return true;
}
if (hsd.isPathInExtLib(real_path) && exclude_ext_libs) {
if (verboseBuild) {
std::cout << skipping << "TRICK_EXT_LIB_DIRS: " << underline(real_path, hsd.getPathInExtLib(real_path).size()) << std::endl;
}
ext_lib_io_files.insert(header) ;
return true;
}
}
}
return false; return false;
} }

View File

@ -39,6 +39,9 @@ class PrintAttributes {
PrintAttributes( int attr_version , HeaderSearchDirs & hsd , CommentSaver & cs , PrintAttributes( int attr_version , HeaderSearchDirs & hsd , CommentSaver & cs ,
clang::CompilerInstance & in_ci, bool force , bool sim_services, std::string output_dir ) ; clang::CompilerInstance & in_ci, bool force , bool sim_services, std::string output_dir ) ;
/** Adds construct names to ignore from TRICK_ICG_IGNORE_TYPES environment variable */
void addIgnoreTypes() ;
/** Prints all of the processed classes and enumerations */ /** Prints all of the processed classes and enumerations */
virtual void createMapFiles() ; virtual void createMapFiles() ;
virtual void closeMapFiles() ; virtual void closeMapFiles() ;
@ -128,6 +131,9 @@ class PrintAttributes {
/** List of files that have ICG: No */ /** List of files that have ICG: No */
std::vector< std::string > icg_no_files ; std::vector< std::string > icg_no_files ;
/** set of types from the TRICK_ICG_IGNORE_TYPES environment variable */
std::set< std::string > global_ignore_types ;
/** map of ignored types sorted by file */ /** map of ignored types sorted by file */
std::map< std::string , std::set< std::string > > ignored_types ; std::map< std::string , std::set< std::string > > ignored_types ;
/** map of processed classes sorted by file */ /** map of processed classes sorted by file */

View File

@ -60,6 +60,9 @@ bool PrintFileContentsBase::isPrintable( ClassValues * c , FieldDescription * fd
if ( !(fdes->getIO() & ioMask) || !fdes->getTypeName().compare("void") || !fdes->getEnumString().compare("TRICK_VOID")) { if ( !(fdes->getIO() & ioMask) || !fdes->getTypeName().compare("void") || !fdes->getEnumString().compare("TRICK_VOID")) {
return false; return false;
} }
if ( fdes->isSTL() and fdes->getNumDims() ) {
return false;
}
if ( fdes->getAccess() == clang::AS_public || (!fdes->isStatic() && !global_compat15 && !c->isCompat15())) { if ( fdes->getAccess() == clang::AS_public || (!fdes->isStatic() && !global_compat15 && !c->isCompat15())) {
return true; return true;
} }

View File

@ -8,6 +8,7 @@
#include "llvm/Support/Host.h" #include "llvm/Support/Host.h"
#include "llvm/Support/CommandLine.h" #include "llvm/Support/CommandLine.h"
#include "llvm/Support/raw_ostream.h"
#include "clang/Frontend/CompilerInstance.h" #include "clang/Frontend/CompilerInstance.h"
#include "clang/Basic/TargetOptions.h" #include "clang/Basic/TargetOptions.h"
@ -58,9 +59,14 @@ Most of the main program is pieced together from examples on the web. We are doi
-# Parsing the input file. -# Parsing the input file.
*/ */
int main(int argc, char * argv[]) { int main(int argc, char * argv[]) {
llvm::cl::SetVersionPrinter([] { llvm::cl::SetVersionPrinter([]
std::cout << "Trick Interface Code Generator (trick-ICG) " << TRICK_VERSION << std::endl; #if (LIBCLANG_MAJOR >= 6)
}); (llvm::raw_ostream& stream) {stream
#else
{std::cout
#endif
<< "Trick Interface Code Generator (trick-ICG) " << TRICK_VERSION << '\n';}
);
/** /**
* Gather all of the command line arguments into lists of include directories, defines, and input files. * Gather all of the command line arguments into lists of include directories, defines, and input files.
@ -164,6 +170,7 @@ int main(int argc, char * argv[]) {
PrintAttributes printAttributes(attr_version, hsd, cs, ci, force, sim_services_flag, output_dir); PrintAttributes printAttributes(attr_version, hsd, cs, ci, force, sim_services_flag, output_dir);
printAttributes.addIgnoreTypes() ;
// Create new class and enum map files // Create new class and enum map files
if (create_map) { if (create_map) {
printAttributes.createMapFiles(); printAttributes.createMapFiles();

View File

@ -1 +1,3 @@
fermi-ware fermi-ware
Apps/trkConvert/*.o
Apps/trkConvert/trkConvert

View File

@ -0,0 +1,24 @@
#include "CSV_Formatter.hh"
/* ================================================================================
* CLASS: CSV_Formatter isa LogFormatter.
* ================================================================================
*/
void CSV_Formatter::writeHeader(FILE* out_fp, int version, int endianness) {};
void CSV_Formatter::writeColumnLabel(FILE* out_fp, const char* name, const char* units) {
fprintf(out_fp,"%s {%s}", name, units);
}
void CSV_Formatter::writeColumnLabelSeparator(FILE* out_fp) { fprintf(out_fp,","); }
void CSV_Formatter::writeDatumSeparator(FILE* out_fp) { fprintf(out_fp,","); }
void CSV_Formatter::writeRecordSeparator(FILE* out_fp) { fprintf(out_fp,"\n"); }
void CSV_Formatter::writeDatum(FILE* out_fp, int8_t datum) { fprintf(out_fp,"%d", datum); }
void CSV_Formatter::writeDatum(FILE* out_fp, uint8_t datum) { fprintf(out_fp,"%u", datum); }
void CSV_Formatter::writeDatum(FILE* out_fp, int16_t datum) { fprintf(out_fp,"%d", datum); }
void CSV_Formatter::writeDatum(FILE* out_fp, uint16_t datum) { fprintf(out_fp,"%u", datum); }
void CSV_Formatter::writeDatum(FILE* out_fp, int32_t datum) { fprintf(out_fp,"%d", datum); }
void CSV_Formatter::writeDatum(FILE* out_fp, uint32_t datum) { fprintf(out_fp,"%u", datum); }
void CSV_Formatter::writeDatum(FILE* out_fp, int64_t datum) { fprintf(out_fp,"%lld", datum); }
void CSV_Formatter::writeDatum(FILE* out_fp, uint64_t datum) { fprintf(out_fp,"%lld", datum); }
void CSV_Formatter::writeDatum(FILE* out_fp, float datum) { fprintf(out_fp,"%.7f", datum); }
void CSV_Formatter::writeDatum(FILE* out_fp, double datum) { fprintf(out_fp,"%.15g", datum); }
const char* CSV_Formatter::extension() { return ".csv"; };

View File

@ -0,0 +1,27 @@
#ifndef CSV_FORMATTER
#define CSV_FORMATTER
#include <stdio.h>
#include "LogFormatter.hh"
class CSV_Formatter: public LogFormatter {
public:
void writeHeader(FILE* out_fp, int version, int endianness);
void writeColumnLabel(FILE* out_fp, const char* name, const char* units);
void writeColumnLabelSeparator(FILE* out_fp);
void writeDatumSeparator(FILE* out_fp);
void writeRecordSeparator(FILE* out_fp);
void writeDatum(FILE* out_fp, int8_t datum);
void writeDatum(FILE* out_fp, uint8_t datum);
void writeDatum(FILE* out_fp, int16_t datum);
void writeDatum(FILE* out_fp, uint16_t datum);
void writeDatum(FILE* out_fp, int32_t datum);
void writeDatum(FILE* out_fp, uint32_t datum);
void writeDatum(FILE* out_fp, int64_t datum);
void writeDatum(FILE* out_fp, uint64_t datum);
void writeDatum(FILE* out_fp, float datum);
void writeDatum(FILE* out_fp, double datum);
const char* extension();
};
#endif

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