baranch merge
This commit is contained in:
213
doc/doxygen.conf
213
doc/doxygen.conf
@@ -1,4 +1,4 @@
|
||||
# Doxyfile 1.4.4
|
||||
# Doxyfile 1.5.4
|
||||
|
||||
# This file describes the settings to be used by the documentation system
|
||||
# doxygen (www.doxygen.org) for a project
|
||||
@@ -14,10 +14,18 @@
|
||||
# Project related configuration options
|
||||
#---------------------------------------------------------------------------
|
||||
|
||||
# This tag specifies the encoding used for all characters in the config file that
|
||||
# follow. The default is UTF-8 which is also the encoding used for all text before
|
||||
# the first occurrence of this tag. Doxygen uses libiconv (or the iconv built into
|
||||
# libc) for the transcoding. See http://www.gnu.org/software/libiconv for the list of
|
||||
# possible encodings.
|
||||
|
||||
DOXYFILE_ENCODING = UTF-8
|
||||
|
||||
# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
|
||||
# by quotes) that should identify the project.
|
||||
|
||||
PROJECT_NAME = "NS-3"
|
||||
PROJECT_NAME = "NS-3 "
|
||||
|
||||
# The PROJECT_NUMBER tag can be used to enter a project or revision number.
|
||||
# This could be handy for archiving the generated documentation or
|
||||
@@ -45,24 +53,14 @@ CREATE_SUBDIRS = NO
|
||||
# documentation generated by doxygen is written. Doxygen will use this
|
||||
# information to generate all constant output in the proper language.
|
||||
# The default language is English, other supported languages are:
|
||||
# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish,
|
||||
# Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese,
|
||||
# Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian,
|
||||
# Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish,
|
||||
# Swedish, and Ukrainian.
|
||||
# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional,
|
||||
# Croatian, Czech, Danish, Dutch, Finnish, French, German, Greek, Hungarian,
|
||||
# Italian, Japanese, Japanese-en (Japanese with English messages), Korean,
|
||||
# Korean-en, Lithuanian, Norwegian, Polish, Portuguese, Romanian, Russian,
|
||||
# Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian.
|
||||
|
||||
OUTPUT_LANGUAGE = English
|
||||
|
||||
# This tag can be used to specify the encoding used in the generated output.
|
||||
# The encoding is not always determined by the language that is chosen,
|
||||
# but also whether or not the output is meant for Windows or non-Windows users.
|
||||
# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES
|
||||
# forces the Windows encoding (this is the default for the Windows binary),
|
||||
# whereas setting the tag to NO uses a Unix-style encoding (the default for
|
||||
# all platforms other than Windows).
|
||||
|
||||
USE_WINDOWS_ENCODING = NO
|
||||
|
||||
# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
|
||||
# include brief member descriptions after the members that are listed in
|
||||
# the file and class documentation (similar to JavaDoc).
|
||||
@@ -135,11 +133,19 @@ SHORT_NAMES = NO
|
||||
# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
|
||||
# will interpret the first line (until the first dot) of a JavaDoc-style
|
||||
# comment as the brief description. If set to NO, the JavaDoc
|
||||
# comments will behave just like the Qt-style comments (thus requiring an
|
||||
# explicit @brief command for a brief description.
|
||||
# comments will behave just like regular Qt-style comments
|
||||
# (thus requiring an explicit @brief command for a brief description.)
|
||||
|
||||
JAVADOC_AUTOBRIEF = NO
|
||||
|
||||
# If the QT_AUTOBRIEF tag is set to YES then Doxygen will
|
||||
# interpret the first line (until the first dot) of a Qt-style
|
||||
# comment as the brief description. If set to NO, the comments
|
||||
# will behave just like regular Qt-style comments (thus requiring
|
||||
# an explicit \brief command for a brief description.)
|
||||
|
||||
QT_AUTOBRIEF = NO
|
||||
|
||||
# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen
|
||||
# treat a multi-line C++ special comment block (i.e. a block of //! or ///
|
||||
# comments) as a brief description. This used to be the default behaviour.
|
||||
@@ -161,13 +167,6 @@ DETAILS_AT_TOP = NO
|
||||
|
||||
INHERIT_DOCS = YES
|
||||
|
||||
# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
|
||||
# tag is set to YES, then doxygen will reuse the documentation of the first
|
||||
# member in the group (if any) for the other members of the group. By default
|
||||
# all members of a group must be documented explicitly.
|
||||
|
||||
DISTRIBUTE_GROUP_DOC = NO
|
||||
|
||||
# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce
|
||||
# a new page for each member. If set to NO, the documentation of a member will
|
||||
# be part of the file/class/namespace that contains it.
|
||||
@@ -195,13 +194,40 @@ ALIASES =
|
||||
|
||||
OPTIMIZE_OUTPUT_FOR_C = NO
|
||||
|
||||
# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources
|
||||
# only. Doxygen will then generate output that is more tailored for Java.
|
||||
# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java
|
||||
# sources only. Doxygen will then generate output that is more tailored for Java.
|
||||
# For instance, namespaces will be presented as packages, qualified scopes
|
||||
# will look different, etc.
|
||||
|
||||
OPTIMIZE_OUTPUT_JAVA = NO
|
||||
|
||||
# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to
|
||||
# include (a tag file for) the STL sources as input, then you should
|
||||
# set this tag to YES in order to let doxygen match functions declarations and
|
||||
# definitions whose arguments contain STL classes (e.g. func(std::string); v.s.
|
||||
# func(std::string) {}). This also make the inheritance and collaboration
|
||||
# diagrams that involve STL classes more complete and accurate.
|
||||
|
||||
BUILTIN_STL_SUPPORT = NO
|
||||
|
||||
# If you use Microsoft's C++/CLI language, you should set this option to YES to
|
||||
# enable parsing support.
|
||||
|
||||
CPP_CLI_SUPPORT = NO
|
||||
|
||||
# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only.
|
||||
# Doxygen will parse them like normal C++ but will assume all classes use public
|
||||
# instead of private inheritance when no explicit protection keyword is present.
|
||||
|
||||
SIP_SUPPORT = NO
|
||||
|
||||
# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
|
||||
# tag is set to YES, then doxygen will reuse the documentation of the first
|
||||
# member in the group (if any) for the other members of the group. By default
|
||||
# all members of a group must be documented explicitly.
|
||||
|
||||
DISTRIBUTE_GROUP_DOC = NO
|
||||
|
||||
# Set the SUBGROUPING tag to YES (the default) to allow class member groups of
|
||||
# the same type (for instance a group of public functions) to be put as a
|
||||
# subgroup of that type (e.g. under the Public Functions section). Set it to
|
||||
@@ -210,6 +236,16 @@ OPTIMIZE_OUTPUT_JAVA = NO
|
||||
|
||||
SUBGROUPING = YES
|
||||
|
||||
# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct (or union) is
|
||||
# documented as struct with the name of the typedef. So
|
||||
# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
|
||||
# with name TypeT. When disabled the typedef will appear as a member of a file,
|
||||
# namespace, or class. And the struct will be named TypeS. This can typically
|
||||
# be useful for C code where the coding convention is that all structs are
|
||||
# typedef'ed and only the typedef is referenced never the struct's name.
|
||||
|
||||
TYPEDEF_HIDES_STRUCT = NO
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# Build related configuration options
|
||||
#---------------------------------------------------------------------------
|
||||
@@ -244,6 +280,13 @@ EXTRACT_LOCAL_CLASSES = NO
|
||||
|
||||
EXTRACT_LOCAL_METHODS = NO
|
||||
|
||||
# If this flag is set to YES, the members of anonymous namespaces will be extracted
|
||||
# and appear in the documentation as a namespace called 'anonymous_namespace{file}',
|
||||
# where file will be replaced with the base name of the file that contains the anonymous
|
||||
# namespace. By default anonymous namespace are hidden.
|
||||
|
||||
EXTRACT_ANON_NSPACES = NO
|
||||
|
||||
# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
|
||||
# undocumented members of documented classes, files or namespaces.
|
||||
# If set to NO (the default) these members will be included in the
|
||||
@@ -376,7 +419,7 @@ SHOW_USED_FILES = YES
|
||||
|
||||
# If the sources in your project are distributed over multiple directories
|
||||
# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy
|
||||
# in the documentation. The default is YES.
|
||||
# in the documentation. The default is NO.
|
||||
|
||||
SHOW_DIRECTORIES = NO
|
||||
|
||||
@@ -385,7 +428,7 @@ SHOW_DIRECTORIES = NO
|
||||
# version control system). Doxygen will invoke the program by executing (via
|
||||
# popen()) the command <command> <input-file>, where <command> is the value of
|
||||
# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file
|
||||
# provided by doxygen. Whatever the progam writes to standard output
|
||||
# provided by doxygen. Whatever the program writes to standard output
|
||||
# is used as the file version. See the manual for examples.
|
||||
|
||||
FILE_VERSION_FILTER =
|
||||
@@ -433,7 +476,7 @@ WARN_NO_PARAMDOC = NO
|
||||
# $version, which will be replaced by the version of the file (if it could
|
||||
# be obtained via FILE_VERSION_FILTER)
|
||||
|
||||
WARN_FORMAT = "$file:$line: $text"
|
||||
WARN_FORMAT = "$file:$line: $text "
|
||||
|
||||
# The WARN_LOGFILE tag can be used to specify a file to which warning
|
||||
# and error messages should be written. If left blank the output is written
|
||||
@@ -450,16 +493,27 @@ WARN_LOGFILE =
|
||||
# directories like "/usr/src/myproject". Separate the files or directories
|
||||
# with spaces.
|
||||
|
||||
INPUT = src doc/main.txt doc/trace-source-list.h doc/tracing.h
|
||||
INPUT = src \
|
||||
doc/main.txt \
|
||||
doc/trace-source-list.h \
|
||||
doc/tracing.h
|
||||
|
||||
# This tag can be used to specify the character encoding of the source files that
|
||||
# doxygen parses. Internally doxygen uses the UTF-8 encoding, which is also the default
|
||||
# input encoding. Doxygen uses libiconv (or the iconv built into libc) for the transcoding.
|
||||
# See http://www.gnu.org/software/libiconv for the list of possible encodings.
|
||||
|
||||
INPUT_ENCODING = UTF-8
|
||||
|
||||
# If the value of the INPUT tag contains directories, you can use the
|
||||
# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
|
||||
# and *.h) to filter out the source-files in the directories. If left
|
||||
# blank the following patterns are tested:
|
||||
# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx
|
||||
# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm
|
||||
# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90
|
||||
|
||||
FILE_PATTERNS = *.h *.tcc
|
||||
FILE_PATTERNS = *.h \
|
||||
*.tcc
|
||||
|
||||
# The RECURSIVE tag can be used to turn specify whether or not subdirectories
|
||||
# should be searched for input files as well. Possible values are YES and NO.
|
||||
@@ -471,13 +525,12 @@ RECURSIVE = YES
|
||||
# excluded from the INPUT source files. This way you can easily exclude a
|
||||
# subdirectory from a directory tree whose root is specified with the INPUT tag.
|
||||
|
||||
EXCLUDE = \
|
||||
src/routing/olsr/olsr-state.h \
|
||||
src/routing/olsr/repositories.h \
|
||||
src/routing/olsr/routing-table.h \
|
||||
src/simulator/high-precision.h \
|
||||
src/simulator/high-precision-128.h \
|
||||
src/simulator/high-precision-double.h
|
||||
EXCLUDE = src/routing/olsr/olsr-state.h \
|
||||
src/routing/olsr/repositories.h \
|
||||
src/routing/olsr/routing-table.h \
|
||||
src/simulator/high-precision.h \
|
||||
src/simulator/high-precision-128.h \
|
||||
src/simulator/high-precision-double.h
|
||||
|
||||
# The EXCLUDE_SYMLINKS tag can be used select whether or not files or
|
||||
# directories that are symbolic links (a Unix filesystem feature) are excluded
|
||||
@@ -493,6 +546,13 @@ EXCLUDE_SYMLINKS = NO
|
||||
|
||||
EXCLUDE_PATTERNS =
|
||||
|
||||
# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
|
||||
# (namespaces, classes, functions, etc.) that should be excluded from the output.
|
||||
# The symbol name can be a fully qualified name, a word, or if the wildcard * is used,
|
||||
# a substring. Examples: ANamespace, AClass, AClass::ANamespace, ANamespace::*Test
|
||||
|
||||
EXCLUDE_SYMBOLS =
|
||||
|
||||
# The EXAMPLE_PATH tag can be used to specify one or more files or
|
||||
# directories that contain example code fragments that are included (see
|
||||
# the \include command).
|
||||
@@ -551,7 +611,9 @@ FILTER_SOURCE_FILES = NO
|
||||
# If the SOURCE_BROWSER tag is set to YES then a list of source files will
|
||||
# be generated. Documented entities will be cross-referenced with these sources.
|
||||
# Note: To get rid of all source code in the generated output, make sure also
|
||||
# VERBATIM_HEADERS is set to NO.
|
||||
# VERBATIM_HEADERS is set to NO. If you have enabled CALL_GRAPH or CALLER_GRAPH
|
||||
# then you must also enable this option. If you don't then doxygen will produce
|
||||
# a warning and turn it on anyway
|
||||
|
||||
SOURCE_BROWSER = NO
|
||||
|
||||
@@ -578,6 +640,13 @@ REFERENCED_BY_RELATION = YES
|
||||
|
||||
REFERENCES_RELATION = YES
|
||||
|
||||
# If the REFERENCES_LINK_SOURCE tag is set to YES (the default)
|
||||
# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from
|
||||
# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will
|
||||
# link to the source code. Otherwise they will link to the documentstion.
|
||||
|
||||
REFERENCES_LINK_SOURCE = YES
|
||||
|
||||
# If the USE_HTAGS tag is set to YES then the references to source code
|
||||
# will point to the HTML generated by the htags(1) tool instead of doxygen
|
||||
# built-in source browser. The htags tool is part of GNU's global source
|
||||
@@ -670,6 +739,14 @@ HTML_ALIGN_MEMBERS = YES
|
||||
|
||||
GENERATE_HTMLHELP = NO
|
||||
|
||||
# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
|
||||
# documentation will contain sections that can be hidden and shown after the
|
||||
# page has loaded. For this to work a browser that supports
|
||||
# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox
|
||||
# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari).
|
||||
|
||||
HTML_DYNAMIC_SECTIONS = NO
|
||||
|
||||
# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can
|
||||
# be used to specify the file name of the resulting .chm file. You
|
||||
# can add a path in front of the file if the result should not be
|
||||
@@ -972,7 +1049,7 @@ MACRO_EXPANSION = NO
|
||||
|
||||
# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
|
||||
# then the macro expansion is limited to the macros specified with the
|
||||
# PREDEFINED and EXPAND_AS_PREDEFINED tags.
|
||||
# PREDEFINED and EXPAND_AS_DEFINED tags.
|
||||
|
||||
EXPAND_ONLY_PREDEF = NO
|
||||
|
||||
@@ -1002,7 +1079,9 @@ INCLUDE_FILE_PATTERNS =
|
||||
# undefined via #undef or recursively expanded use the := operator
|
||||
# instead of the = operator.
|
||||
|
||||
PREDEFINED = RUN_SELF_TESTS NS3_DEBUG_ENABLE NS3_ASSERT_ENABLE NS3_LOG_ENABLE
|
||||
PREDEFINED = RUN_SELF_TESTS \
|
||||
NS3_ASSERT_ENABLE \
|
||||
NS3_LOG_ENABLE
|
||||
|
||||
# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
|
||||
# this tag can be used to specify a list of macro names that should be expanded.
|
||||
@@ -1075,6 +1154,14 @@ PERL_PATH = /usr/bin/perl
|
||||
|
||||
CLASS_DIAGRAMS = YES
|
||||
|
||||
# You can define message sequence charts within doxygen comments using the \msc
|
||||
# command. Doxygen will then run the mscgen tool (see http://www.mcternan.me.uk/mscgen/) to
|
||||
# produce the chart and insert it in the documentation. The MSCGEN_PATH tag allows you to
|
||||
# specify the directory where the mscgen tool resides. If left empty the tool is assumed to
|
||||
# be found in the default search path.
|
||||
|
||||
MSCGEN_PATH =
|
||||
|
||||
# If set to YES, the inheritance and collaboration graphs will hide
|
||||
# inheritance and usage relations if the target is undocumented
|
||||
# or is not a class.
|
||||
@@ -1132,7 +1219,7 @@ INCLUDE_GRAPH = YES
|
||||
|
||||
INCLUDED_BY_GRAPH = YES
|
||||
|
||||
# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will
|
||||
# If the CALL_GRAPH, SOURCE_BROWSER and HAVE_DOT tags are set to YES then doxygen will
|
||||
# generate a call dependency graph for every global function or class method.
|
||||
# Note that enabling this option will significantly increase the time of a run.
|
||||
# So in most cases it will be better to enable call graphs for selected
|
||||
@@ -1140,6 +1227,14 @@ INCLUDED_BY_GRAPH = YES
|
||||
|
||||
CALL_GRAPH = NO
|
||||
|
||||
# If the CALLER_GRAPH, SOURCE_BROWSER and HAVE_DOT tags are set to YES then doxygen will
|
||||
# generate a caller dependency graph for every global function or class method.
|
||||
# Note that enabling this option will significantly increase the time of a run.
|
||||
# So in most cases it will be better to enable caller graphs for selected
|
||||
# functions only using the \callergraph command.
|
||||
|
||||
CALLER_GRAPH = NO
|
||||
|
||||
# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
|
||||
# will graphical hierarchy of all classes instead of a textual one.
|
||||
|
||||
@@ -1169,31 +1264,23 @@ DOT_PATH =
|
||||
|
||||
DOTFILE_DIRS =
|
||||
|
||||
# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width
|
||||
# (in pixels) of the graphs generated by dot. If a graph becomes larger than
|
||||
# this value, doxygen will try to truncate the graph, so that it fits within
|
||||
# the specified constraint. Beware that most browsers cannot cope with very
|
||||
# large images.
|
||||
# The MAX_DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of
|
||||
# nodes that will be shown in the graph. If the number of nodes in a graph
|
||||
# becomes larger than this value, doxygen will truncate the graph, which is
|
||||
# visualized by representing a node as a red box. Note that doxygen if the number
|
||||
# of direct children of the root node in a graph is already larger than
|
||||
# MAX_DOT_GRAPH_NOTES then the graph will not be shown at all. Also note
|
||||
# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
|
||||
|
||||
MAX_DOT_GRAPH_WIDTH = 1024
|
||||
|
||||
# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height
|
||||
# (in pixels) of the graphs generated by dot. If a graph becomes larger than
|
||||
# this value, doxygen will try to truncate the graph, so that it fits within
|
||||
# the specified constraint. Beware that most browsers cannot cope with very
|
||||
# large images.
|
||||
|
||||
MAX_DOT_GRAPH_HEIGHT = 1024
|
||||
DOT_GRAPH_MAX_NODES = 50
|
||||
|
||||
# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the
|
||||
# graphs generated by dot. A depth value of 3 means that only nodes reachable
|
||||
# from the root by following a path via at most 3 edges will be shown. Nodes
|
||||
# that lay further from the root node will be omitted. Note that setting this
|
||||
# option to 1 or 2 may greatly reduce the computation time needed for large
|
||||
# code bases. Also note that a graph may be further truncated if the graph's
|
||||
# image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH
|
||||
# and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default),
|
||||
# the graph is not depth-constrained.
|
||||
# code bases. Also note that the size of a graph can be further restricted by
|
||||
# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
|
||||
|
||||
MAX_DOT_GRAPH_DEPTH = 0
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
* - a Functor class: ns3::Callback
|
||||
* - an os-independent interface to get access to the elapsed wall clock time: ns3::SystemWallClockMs
|
||||
* - a class to register regression tests with the test manager: ns3::Test and ns3::TestManager
|
||||
* - debugging facilities: \ref debugging, \ref assert, \ref error
|
||||
* - debugging facilities: \ref logging, \ref assert, \ref error
|
||||
* - \ref randomvariable
|
||||
* - \ref config
|
||||
* - a base class for objects which need to support reference counting
|
||||
|
||||
@@ -497,6 +497,8 @@
|
||||
* };
|
||||
* // called from MyModel::GetTraceResolver
|
||||
* MyModelTraceType (enum Type type);
|
||||
* // needed for by the tracing subsystem.
|
||||
* MyModelTraceType ();
|
||||
* // called from trace sink
|
||||
* enum Type Get (void) const;
|
||||
* // needed by the tracing subsystem
|
||||
@@ -513,10 +515,14 @@
|
||||
* \endcode
|
||||
* The implementation does not require much thinking:
|
||||
* \code
|
||||
* MyModelTraceType::MyModelTraceType ()
|
||||
* : m_type (RX)
|
||||
* {// an arbitrary default value.
|
||||
* }
|
||||
* MyModelTraceType::MyModelTraceType (enum Type type)
|
||||
* : m_type (type)
|
||||
* {}
|
||||
* enum Type
|
||||
* enum MyModelTraceType::Type
|
||||
* MyModelTraceType::Get (void) const
|
||||
* {
|
||||
* return m_type;
|
||||
@@ -531,14 +537,14 @@
|
||||
* }
|
||||
* void
|
||||
* MyModelTraceType::Print (std::ostream &os) const
|
||||
* (
|
||||
* {
|
||||
* // this method is invoked by the print function of a TraceContext
|
||||
* // if it contains an instance of this TraceContextElement.
|
||||
* switch (m_type) {
|
||||
* case RX: os << "rx"; break;
|
||||
* // ...
|
||||
* }
|
||||
* )
|
||||
* }
|
||||
* std::string
|
||||
* MyModelTraceType::GetTypeName (void) const
|
||||
* {
|
||||
|
||||
@@ -1,13 +0,0 @@
|
||||
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
|
||||
#include "ns3/debug.h"
|
||||
|
||||
NS_DEBUG_COMPONENT_DEFINE ("MyComponentB");
|
||||
|
||||
namespace foo {
|
||||
|
||||
void OneFunction (void)
|
||||
{
|
||||
NS_DEBUG ("OneFunction debug");
|
||||
}
|
||||
|
||||
}; // namespace foo
|
||||
@@ -1,27 +0,0 @@
|
||||
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
|
||||
#include "ns3/debug.h"
|
||||
#include "ns3/assert.h"
|
||||
|
||||
NS_DEBUG_COMPONENT_DEFINE ("MyComponentA");
|
||||
|
||||
// declare other function
|
||||
namespace foo {
|
||||
void OneFunction (void);
|
||||
}
|
||||
|
||||
int main (int argc, int argv)
|
||||
{
|
||||
NS_DEBUG ("nargc="<<argc);
|
||||
|
||||
foo::OneFunction ();
|
||||
|
||||
NS_DEBUG ("other debug output");
|
||||
|
||||
int a;
|
||||
a = 0;
|
||||
|
||||
NS_ASSERT (a == 0);
|
||||
NS_ASSERT_MSG (a == 0, "my msg");
|
||||
NS_ASSERT (a != 0);
|
||||
NS_ASSERT_MSG (a != 0, "my 2 msg");
|
||||
}
|
||||
@@ -41,7 +41,7 @@ int main (int argc, char *argv[])
|
||||
Ptr<Object> object = *j;
|
||||
Ptr<MobilityModel> position = object->QueryInterface<MobilityModel> (MobilityModel::iid);
|
||||
NS_ASSERT (position != 0);
|
||||
Position pos = position->Get ();
|
||||
Vector pos = position->GetPosition ();
|
||||
std::cout << "x=" << pos.x << ", y=" << pos.y << ", z=" << pos.z << std::endl;
|
||||
}
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@ using namespace ns3;
|
||||
static void
|
||||
CourseChange (const TraceContext &context, Ptr<const MobilityModel> position)
|
||||
{
|
||||
Position pos = position->Get ();
|
||||
Vector pos = position->GetPosition ();
|
||||
std::cout << Simulator::Now () << ", pos=" << position << ", x=" << pos.x << ", y=" << pos.y
|
||||
<< ", z=" << pos.z << std::endl;
|
||||
}
|
||||
|
||||
@@ -18,11 +18,11 @@ using namespace ns3;
|
||||
static void
|
||||
CourseChange (ns3::TraceContext const&, Ptr<const MobilityModel> mobility)
|
||||
{
|
||||
Position pos = mobility->Get ();
|
||||
Speed vel = mobility->GetSpeed ();
|
||||
Vector pos = mobility->GetPosition ();
|
||||
Vector vel = mobility->GetVelocity ();
|
||||
std::cout << Simulator::Now () << ", model=" << mobility << ", POS: x=" << pos.x << ", y=" << pos.y
|
||||
<< ", z=" << pos.z << "; VEL:" << vel.dx << ", y=" << vel.dy
|
||||
<< ", z=" << vel.dz << std::endl;
|
||||
<< ", z=" << pos.z << "; VEL:" << vel.x << ", y=" << vel.y
|
||||
<< ", z=" << vel.z << std::endl;
|
||||
}
|
||||
|
||||
int main (int argc, char *argv[])
|
||||
|
||||
@@ -1,9 +1,6 @@
|
||||
## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
|
||||
|
||||
def build(bld):
|
||||
obj = bld.create_ns3_program('main-debug')
|
||||
obj.source = ['main-debug.cc', 'main-debug-other.cc']
|
||||
|
||||
obj = bld.create_ns3_program('main-callback')
|
||||
obj.source = 'main-callback.cc'
|
||||
|
||||
|
||||
@@ -20,7 +20,6 @@
|
||||
*/
|
||||
|
||||
#include "command-line.h"
|
||||
#include "ns3/debug.h"
|
||||
#include <unistd.h>
|
||||
|
||||
namespace ns3 {
|
||||
|
||||
@@ -1,192 +0,0 @@
|
||||
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2006 INRIA
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation;
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
|
||||
*/
|
||||
#include <list>
|
||||
#include <utility>
|
||||
#include <iostream>
|
||||
#include "debug.h"
|
||||
#include "assert.h"
|
||||
#include "ns3/core-config.h"
|
||||
#include "fatal-error.h"
|
||||
|
||||
#ifdef HAVE_STDLIB_H
|
||||
#include <stdlib.h>
|
||||
#endif
|
||||
|
||||
namespace ns3 {
|
||||
|
||||
typedef std::list<std::pair <std::string, DebugComponent *> > ComponentList;
|
||||
typedef std::list<std::pair <std::string, DebugComponent *> >::iterator ComponentListI;
|
||||
|
||||
static
|
||||
ComponentList *GetComponentList (void)
|
||||
{
|
||||
static ComponentList components;
|
||||
return &components;
|
||||
}
|
||||
|
||||
|
||||
static bool g_firstDebug = true;
|
||||
|
||||
void
|
||||
DebugComponentEnableEnvVar (void)
|
||||
{
|
||||
#ifdef HAVE_GETENV
|
||||
char *envVar = getenv("NS_DEBUG");
|
||||
if (envVar == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
bool allFound = true;
|
||||
std::string env = envVar;
|
||||
std::string::size_type cur = 0;
|
||||
std::string::size_type next = 0;
|
||||
while (true)
|
||||
{
|
||||
next = env.find_first_of (";", cur);
|
||||
std::string tmp = std::string (env, cur, next);
|
||||
{
|
||||
/* The following code is a workaround for a bug in the g++
|
||||
* c++ string library. Its goal is to remove any trailing ';'
|
||||
* from the string even though there should not be any in
|
||||
* it. This code should be safe even if the bug is not there.
|
||||
*/
|
||||
std::string::size_type trailing = tmp.find_first_of (";");
|
||||
tmp = tmp.substr (0, trailing);
|
||||
}
|
||||
if (tmp.size () == 0)
|
||||
{
|
||||
break;
|
||||
}
|
||||
bool found = false;
|
||||
ComponentList *components = GetComponentList ();
|
||||
for (ComponentListI i = components->begin ();
|
||||
i != components->end ();
|
||||
i++)
|
||||
{
|
||||
if (i->first.compare (tmp) == 0)
|
||||
{
|
||||
found = true;
|
||||
i->second->Enable ();
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!found)
|
||||
{
|
||||
allFound = false;
|
||||
}
|
||||
if (next == std::string::npos)
|
||||
{
|
||||
break;
|
||||
}
|
||||
cur = next + 1;
|
||||
if (cur >= env.size ())
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (allFound)
|
||||
{
|
||||
g_firstDebug = true;
|
||||
}
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
DebugComponent::DebugComponent (char const * name)
|
||||
: m_isEnabled (false)
|
||||
{
|
||||
ComponentList *components = GetComponentList ();
|
||||
for (ComponentListI i = components->begin ();
|
||||
i != components->end ();
|
||||
i++)
|
||||
{
|
||||
NS_ASSERT (i->first != name);
|
||||
}
|
||||
components->push_back (std::make_pair (name, this));
|
||||
}
|
||||
bool
|
||||
DebugComponent::IsEnabled (void)
|
||||
{
|
||||
if (g_firstDebug)
|
||||
{
|
||||
DebugComponentEnableEnvVar ();
|
||||
}
|
||||
return m_isEnabled;
|
||||
}
|
||||
void
|
||||
DebugComponent::Enable (void)
|
||||
{
|
||||
m_isEnabled = true;
|
||||
}
|
||||
void
|
||||
DebugComponent::Disable (void)
|
||||
{
|
||||
m_isEnabled = false;
|
||||
}
|
||||
|
||||
void
|
||||
DebugComponentEnable (char const *name)
|
||||
{
|
||||
ComponentList *components = GetComponentList ();
|
||||
for (ComponentListI i = components->begin ();
|
||||
i != components->end ();
|
||||
i++)
|
||||
{
|
||||
if (i->first.compare (name) == 0)
|
||||
{
|
||||
i->second->Enable ();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
void
|
||||
DebugComponentDisable (char const *name)
|
||||
{
|
||||
ComponentList *components = GetComponentList ();
|
||||
for (ComponentListI i = components->begin ();
|
||||
i != components->end ();
|
||||
i++)
|
||||
{
|
||||
if (i->first.compare (name) == 0)
|
||||
{
|
||||
i->second->Disable ();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
DebugComponentPrintList (void)
|
||||
{
|
||||
ComponentList *components = GetComponentList ();
|
||||
for (ComponentListI i = components->begin ();
|
||||
i != components->end ();
|
||||
i++)
|
||||
{
|
||||
std::cout << i->first << "=" << (i->second->IsEnabled ()?"enabled":"disabled") << std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
}; // namespace ns3
|
||||
|
||||
|
||||
140
src/core/debug.h
140
src/core/debug.h
@@ -1,140 +0,0 @@
|
||||
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2006 INRIA
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation;
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
|
||||
*/
|
||||
#ifndef DEBUG_H
|
||||
#define DEBUG_H
|
||||
|
||||
/**
|
||||
* \defgroup debugging Debugging
|
||||
* \brief Debugging functions and macros
|
||||
*
|
||||
* - DEBUG functionality: macros which allow developers to
|
||||
* send information out on screen only in debugging builds.
|
||||
* All debug messages are disabled by default. To enable
|
||||
* selected debug messages, use the ns3::DebugComponentEnable
|
||||
* function. Alternatively, you can use the NS_DEBUG
|
||||
* environment variable to define a ';'-separated list of
|
||||
* messages to enable. For example, NS_DEBUG=a;b;c;DAFD;GH
|
||||
* would enable the components 'a', 'b', 'c', 'DAFD', and, 'GH'.
|
||||
*/
|
||||
|
||||
namespace ns3 {
|
||||
|
||||
/**
|
||||
* \param name a debug component name
|
||||
* \ingroup debugging
|
||||
*
|
||||
* Enable the debugging output associated with that debug component.
|
||||
* The debugging output can be later disabled with a call
|
||||
* to ns3::DebugComponentDisable.
|
||||
*/
|
||||
void DebugComponentEnable (char const *name);
|
||||
/**
|
||||
* \param name a debug component name
|
||||
* \ingroup debugging
|
||||
*
|
||||
* Disable the debugging output associated with that debug component.
|
||||
* The debugging output can be later re-enabled with a call
|
||||
* to ns3::DebugComponentEnable.
|
||||
*/
|
||||
void DebugComponentDisable (char const *name);
|
||||
/**
|
||||
* \ingroup debugging
|
||||
* Print the list of debugging messages available.
|
||||
*/
|
||||
void DebugComponentPrintList (void);
|
||||
|
||||
class DebugComponent {
|
||||
public:
|
||||
DebugComponent (char const *name);
|
||||
bool IsEnabled (void);
|
||||
void Enable (void);
|
||||
void Disable (void);
|
||||
private:
|
||||
bool m_isEnabled;
|
||||
};
|
||||
|
||||
}; // namespace ns3
|
||||
|
||||
|
||||
#ifdef NS3_DEBUG_ENABLE
|
||||
|
||||
#include <string>
|
||||
#include <iostream>
|
||||
|
||||
|
||||
/**
|
||||
* \ingroup debugging
|
||||
* \param name a string
|
||||
*
|
||||
* Define a Debug component with a specific name. This macro
|
||||
* should be used at the top of every file in which you want
|
||||
* to use the NS_DEBUG macro. This macro defines a new
|
||||
* "debug component" which can be later selectively enabled
|
||||
* or disabled with the ns3::DebugComponentEnable and
|
||||
* ns3::DebugComponentDisable functions or with the NS_DEBUG
|
||||
* environment variable.
|
||||
*/
|
||||
#define NS_DEBUG_COMPONENT_DEFINE(name) \
|
||||
static ns3::DebugComponent g_debug = ns3::DebugComponent (name)
|
||||
|
||||
/**
|
||||
* \ingroup debugging
|
||||
* \param msg message to output
|
||||
*
|
||||
* Generate debugging output in the "debug component" of the
|
||||
* current file. i.e., every call to NS_DEBUG from within
|
||||
* a file implicitely generates out within the component
|
||||
* defined with the NS_DEBUG_COMPONENT_DEFINE macro in the
|
||||
* same file.
|
||||
*/
|
||||
#define NS_DEBUG(msg) \
|
||||
do \
|
||||
{ \
|
||||
if (g_debug.IsEnabled ()) \
|
||||
{ \
|
||||
std::cerr << msg << std::endl; \
|
||||
} \
|
||||
} \
|
||||
while (false)
|
||||
|
||||
/**
|
||||
* \ingroup debugging
|
||||
* \param msg message to output
|
||||
*
|
||||
* Generate debugging output unconditionally in all
|
||||
* debug builds.
|
||||
*/
|
||||
#define NS_DEBUG_UNCOND(msg) \
|
||||
do \
|
||||
{ \
|
||||
std::cerr << msg << std::endl; \
|
||||
} \
|
||||
while (false)
|
||||
|
||||
#else /* NS3_DEBUG_ENABLE */
|
||||
|
||||
#define NS_DEBUG_COMPONENT_DEFINE(name)
|
||||
#define NS_DEBUG(x)
|
||||
#define NS_DEBUG_UNCOND(msg)
|
||||
|
||||
#endif /* NS3_DEBUG_ENABLE */
|
||||
|
||||
#endif /* DEBUG_H */
|
||||
@@ -42,7 +42,6 @@ namespace ns3{
|
||||
//-----------------------------------------------------------------------------
|
||||
// RandomVariable methods
|
||||
|
||||
uint32_t RandomVariable::runNumber = 0;
|
||||
bool RandomVariable::initialized = false; // True if RngStream seed set
|
||||
bool RandomVariable::useDevRandom = false; // True if use /dev/random
|
||||
bool RandomVariable::globalSeedSet = false; // True if GlobalSeed called
|
||||
@@ -50,6 +49,7 @@ int RandomVariable::devRandom = -1;
|
||||
uint32_t RandomVariable::globalSeed[6];
|
||||
unsigned long RandomVariable::heuristic_sequence;
|
||||
RngStream* RandomVariable::m_static_generator = 0;
|
||||
uint32_t RandomVariable::runNumber = 0;
|
||||
|
||||
//the static object random_variable_initializer initializes the static members
|
||||
//of RandomVariable
|
||||
@@ -58,9 +58,9 @@ static class RandomVariableInitializer
|
||||
public:
|
||||
RandomVariableInitializer()
|
||||
{
|
||||
RandomVariable::Initialize(); // sets the static package seed
|
||||
RandomVariable::m_static_generator = new RngStream();
|
||||
RandomVariable::m_static_generator->InitializeStream();
|
||||
// RandomVariable::Initialize(); // sets the static package seed
|
||||
// RandomVariable::m_static_generator = new RngStream();
|
||||
// RandomVariable::m_static_generator->InitializeStream();
|
||||
}
|
||||
~RandomVariableInitializer()
|
||||
{
|
||||
@@ -69,15 +69,20 @@ static class RandomVariableInitializer
|
||||
} random_variable_initializer;
|
||||
|
||||
RandomVariable::RandomVariable()
|
||||
: m_generator(NULL)
|
||||
{
|
||||
m_generator = new RngStream();
|
||||
m_generator->InitializeStream();
|
||||
m_generator->ResetNthSubstream(RandomVariable::runNumber);
|
||||
// m_generator = new RngStream();
|
||||
// m_generator->InitializeStream();
|
||||
// m_generator->ResetNthSubstream(RandomVariable::runNumber);
|
||||
}
|
||||
|
||||
RandomVariable::RandomVariable(const RandomVariable& r)
|
||||
:m_generator(0)
|
||||
{
|
||||
m_generator = new RngStream(*r.m_generator);
|
||||
if(r.m_generator)
|
||||
{
|
||||
m_generator = new RngStream(*r.m_generator);
|
||||
}
|
||||
}
|
||||
|
||||
RandomVariable::~RandomVariable()
|
||||
@@ -97,6 +102,12 @@ void RandomVariable::UseDevRandom(bool udr)
|
||||
|
||||
void RandomVariable::GetSeed(uint32_t seed[6])
|
||||
{
|
||||
if(!m_generator)
|
||||
{
|
||||
m_generator = new RngStream();
|
||||
m_generator->InitializeStream();
|
||||
m_generator->ResetNthSubstream(RandomVariable::runNumber);
|
||||
}
|
||||
m_generator->GetState(seed);
|
||||
}
|
||||
|
||||
@@ -202,6 +213,16 @@ UniformVariable::UniformVariable(const UniformVariable& c)
|
||||
|
||||
double UniformVariable::GetValue()
|
||||
{
|
||||
if(!RandomVariable::initialized)
|
||||
{
|
||||
RandomVariable::Initialize();
|
||||
}
|
||||
if(!m_generator)
|
||||
{
|
||||
m_generator = new RngStream();
|
||||
m_generator->InitializeStream();
|
||||
m_generator->ResetNthSubstream(RandomVariable::runNumber);
|
||||
}
|
||||
return m_min + m_generator->RandU01() * (m_max - m_min);
|
||||
}
|
||||
|
||||
@@ -212,6 +233,12 @@ RandomVariable* UniformVariable::Copy() const
|
||||
|
||||
double UniformVariable::GetSingleValue(double s, double l)
|
||||
{
|
||||
if(!RandomVariable::m_static_generator)
|
||||
{
|
||||
RandomVariable::Initialize(); // sets the static package seed
|
||||
RandomVariable::m_static_generator = new RngStream();
|
||||
RandomVariable::m_static_generator->InitializeStream();
|
||||
}
|
||||
return s + m_static_generator->RandU01() * (l - s);;
|
||||
}
|
||||
|
||||
@@ -305,6 +332,16 @@ ExponentialVariable::ExponentialVariable(const ExponentialVariable& c)
|
||||
|
||||
double ExponentialVariable::GetValue()
|
||||
{
|
||||
if(!RandomVariable::initialized)
|
||||
{
|
||||
RandomVariable::Initialize();
|
||||
}
|
||||
if(!m_generator)
|
||||
{
|
||||
m_generator = new RngStream();
|
||||
m_generator->InitializeStream();
|
||||
m_generator->ResetNthSubstream(RandomVariable::runNumber);
|
||||
}
|
||||
double r = -m_mean*log(m_generator->RandU01());
|
||||
if (m_bound != 0 && r > m_bound) return m_bound;
|
||||
return r;
|
||||
@@ -316,6 +353,12 @@ RandomVariable* ExponentialVariable::Copy() const
|
||||
}
|
||||
double ExponentialVariable::GetSingleValue(double m, double b/*=0*/)
|
||||
{
|
||||
if(!RandomVariable::m_static_generator)
|
||||
{
|
||||
RandomVariable::Initialize(); // sets the static package seed
|
||||
RandomVariable::m_static_generator = new RngStream();
|
||||
RandomVariable::m_static_generator->InitializeStream();
|
||||
}
|
||||
double r = -m*log(m_static_generator->RandU01());
|
||||
if (b != 0 && r > b) return b;
|
||||
return r;
|
||||
@@ -341,6 +384,16 @@ ParetoVariable::ParetoVariable(const ParetoVariable& c)
|
||||
|
||||
double ParetoVariable::GetValue()
|
||||
{
|
||||
if(!RandomVariable::initialized)
|
||||
{
|
||||
RandomVariable::Initialize();
|
||||
}
|
||||
if(!m_generator)
|
||||
{
|
||||
m_generator = new RngStream();
|
||||
m_generator->InitializeStream();
|
||||
m_generator->ResetNthSubstream(RandomVariable::runNumber);
|
||||
}
|
||||
double scale = m_mean * ( m_shape - 1.0) / m_shape;
|
||||
double r = (scale * ( 1.0 / pow(m_generator->RandU01(), 1.0 / m_shape)));
|
||||
if (m_bound != 0 && r > m_bound) return m_bound;
|
||||
@@ -354,6 +407,12 @@ RandomVariable* ParetoVariable::Copy() const
|
||||
|
||||
double ParetoVariable::GetSingleValue(double m, double s, double b/*=0*/)
|
||||
{
|
||||
if(!RandomVariable::m_static_generator)
|
||||
{
|
||||
RandomVariable::Initialize(); // sets the static package seed
|
||||
RandomVariable::m_static_generator = new RngStream();
|
||||
RandomVariable::m_static_generator->InitializeStream();
|
||||
}
|
||||
double scale = m * ( s - 1.0) / s;
|
||||
double r = (scale * ( 1.0 / pow(m_static_generator->RandU01(), 1.0 / s)));
|
||||
if (b != 0 && r > b) return b;
|
||||
@@ -375,6 +434,16 @@ WeibullVariable::WeibullVariable(const WeibullVariable& c)
|
||||
|
||||
double WeibullVariable::GetValue()
|
||||
{
|
||||
if(!RandomVariable::initialized)
|
||||
{
|
||||
RandomVariable::Initialize();
|
||||
}
|
||||
if(!m_generator)
|
||||
{
|
||||
m_generator = new RngStream();
|
||||
m_generator->InitializeStream();
|
||||
m_generator->ResetNthSubstream(RandomVariable::runNumber);
|
||||
}
|
||||
double exponent = 1.0 / m_alpha;
|
||||
double r = m_mean * pow( -log(m_generator->RandU01()), exponent);
|
||||
if (m_bound != 0 && r > m_bound) return m_bound;
|
||||
@@ -388,6 +457,12 @@ RandomVariable* WeibullVariable::Copy() const
|
||||
|
||||
double WeibullVariable::GetSingleValue(double m, double s, double b/*=0*/)
|
||||
{
|
||||
if(!RandomVariable::m_static_generator)
|
||||
{
|
||||
RandomVariable::Initialize(); // sets the static package seed
|
||||
RandomVariable::m_static_generator = new RngStream();
|
||||
RandomVariable::m_static_generator->InitializeStream();
|
||||
}
|
||||
double exponent = 1.0 / s;
|
||||
double r = m * pow( -log(m_static_generator->RandU01()), exponent);
|
||||
if (b != 0 && r > b) return b;
|
||||
@@ -412,6 +487,16 @@ NormalVariable::NormalVariable(const NormalVariable& c)
|
||||
|
||||
double NormalVariable::GetValue()
|
||||
{
|
||||
if(!RandomVariable::initialized)
|
||||
{
|
||||
RandomVariable::Initialize();
|
||||
}
|
||||
if(!m_generator)
|
||||
{
|
||||
m_generator = new RngStream();
|
||||
m_generator->InitializeStream();
|
||||
m_generator->ResetNthSubstream(RandomVariable::runNumber);
|
||||
}
|
||||
if (m_nextValid)
|
||||
{ // use previously generated
|
||||
m_nextValid = false;
|
||||
@@ -445,6 +530,12 @@ RandomVariable* NormalVariable::Copy() const
|
||||
|
||||
double NormalVariable::GetSingleValue(double m, double v, double b)
|
||||
{
|
||||
if(!RandomVariable::m_static_generator)
|
||||
{
|
||||
RandomVariable::Initialize(); // sets the static package seed
|
||||
RandomVariable::m_static_generator = new RngStream();
|
||||
RandomVariable::m_static_generator->InitializeStream();
|
||||
}
|
||||
if (m_static_nextValid)
|
||||
{ // use previously generated
|
||||
m_static_nextValid = false;
|
||||
@@ -495,6 +586,16 @@ EmpiricalVariable::~EmpiricalVariable() { }
|
||||
double EmpiricalVariable::GetValue()
|
||||
{ // Return a value from the empirical distribution
|
||||
// This code based (loosely) on code by Bruce Mah (Thanks Bruce!)
|
||||
if(!RandomVariable::initialized)
|
||||
{
|
||||
RandomVariable::Initialize();
|
||||
}
|
||||
if(!m_generator)
|
||||
{
|
||||
m_generator = new RngStream();
|
||||
m_generator->InitializeStream();
|
||||
m_generator->ResetNthSubstream(RandomVariable::runNumber);
|
||||
}
|
||||
if (emp.size() == 0) return 0.0; // HuH? No empirical data
|
||||
if (!validated) Validate(); // Insure in non-decreasing
|
||||
double r = m_generator->RandU01();
|
||||
@@ -642,6 +743,16 @@ LogNormalVariable::LogNormalVariable (double mu, double sigma)
|
||||
double
|
||||
LogNormalVariable::GetValue ()
|
||||
{
|
||||
if(!RandomVariable::initialized)
|
||||
{
|
||||
RandomVariable::Initialize();
|
||||
}
|
||||
if(!m_generator)
|
||||
{
|
||||
m_generator = new RngStream();
|
||||
m_generator->InitializeStream();
|
||||
m_generator->ResetNthSubstream(RandomVariable::runNumber);
|
||||
}
|
||||
double u, v, r2, normal, z;
|
||||
|
||||
do
|
||||
@@ -665,6 +776,12 @@ LogNormalVariable::GetValue ()
|
||||
|
||||
double LogNormalVariable::GetSingleValue (double mu, double sigma)
|
||||
{
|
||||
if(!RandomVariable::m_static_generator)
|
||||
{
|
||||
RandomVariable::Initialize(); // sets the static package seed
|
||||
RandomVariable::m_static_generator = new RngStream();
|
||||
RandomVariable::m_static_generator->InitializeStream();
|
||||
}
|
||||
double u, v, r2, normal, z;
|
||||
do
|
||||
{
|
||||
@@ -698,6 +815,16 @@ TriangularVariable::TriangularVariable(const TriangularVariable& c)
|
||||
|
||||
double TriangularVariable::GetValue()
|
||||
{
|
||||
if(!RandomVariable::initialized)
|
||||
{
|
||||
RandomVariable::Initialize();
|
||||
}
|
||||
if(!m_generator)
|
||||
{
|
||||
m_generator = new RngStream();
|
||||
m_generator->InitializeStream();
|
||||
m_generator->ResetNthSubstream(RandomVariable::runNumber);
|
||||
}
|
||||
double u = m_generator->RandU01();
|
||||
if(u <= (m_mode - m_min) / (m_max - m_min) )
|
||||
return m_min + sqrt(u * (m_max - m_min) * (m_mode - m_min) );
|
||||
@@ -712,6 +839,12 @@ RandomVariable* TriangularVariable::Copy() const
|
||||
|
||||
double TriangularVariable::GetSingleValue(double s, double l, double mean)
|
||||
{
|
||||
if(!RandomVariable::m_static_generator)
|
||||
{
|
||||
RandomVariable::Initialize(); // sets the static package seed
|
||||
RandomVariable::m_static_generator = new RngStream();
|
||||
RandomVariable::m_static_generator->InitializeStream();
|
||||
}
|
||||
double mode = 3.0*mean-s-l;
|
||||
double u = m_static_generator->RandU01();
|
||||
if(u <= (mode - s) / (l - s) )
|
||||
|
||||
@@ -71,7 +71,7 @@ public:
|
||||
* \brief Returns a random double from the underlying distribution
|
||||
* \return A floating point random value
|
||||
*/
|
||||
virtual double GetValue() = 0;
|
||||
virtual double GetValue() = 0;
|
||||
|
||||
/**
|
||||
* \brief Returns a random integer integer from the underlying distribution
|
||||
@@ -173,19 +173,19 @@ public:
|
||||
*/
|
||||
static void SetRunNumber(uint32_t n);
|
||||
private:
|
||||
static void Initialize(); // Initialize the RNG system
|
||||
static void GetRandomSeeds(uint32_t seeds[6]);
|
||||
private:
|
||||
static bool initialized; // True if package seed is set
|
||||
static bool useDevRandom; // True if using /dev/random desired
|
||||
static bool globalSeedSet; // True if global seed has been specified
|
||||
static int devRandom; // File handle for /dev/random
|
||||
static uint32_t globalSeed[6]; // The global seed to use
|
||||
static uint32_t runNumber;
|
||||
friend class RandomVariableInitializer;
|
||||
protected:
|
||||
static unsigned long heuristic_sequence;
|
||||
static RngStream* m_static_generator;
|
||||
static uint32_t runNumber;
|
||||
static void Initialize(); // Initialize the RNG system
|
||||
static bool initialized; // True if package seed is set
|
||||
RngStream* m_generator; //underlying generator being wrapped
|
||||
};
|
||||
|
||||
|
||||
@@ -29,7 +29,6 @@ def build(bld):
|
||||
core = bld.create_ns3_module('core')
|
||||
core.source = [
|
||||
'callback-test.cc',
|
||||
'debug.cc',
|
||||
'log.cc',
|
||||
'breakpoint.cc',
|
||||
'ptr.cc',
|
||||
@@ -70,7 +69,6 @@ def build(bld):
|
||||
'callback.h',
|
||||
'ptr.h',
|
||||
'object.h',
|
||||
'debug.h',
|
||||
'log.h',
|
||||
'assert.h',
|
||||
'breakpoint.h',
|
||||
|
||||
@@ -46,7 +46,7 @@ GridTopology::LayoutOneRowFirst (Ptr<Object> object, uint32_t i)
|
||||
Ptr<MobilityModel> mobility = ComponentManager::Create<MobilityModel> (m_positionClassId,
|
||||
MobilityModel::iid);
|
||||
object->AddInterface (mobility);
|
||||
mobility->Set (Position (x, y, 0.0));
|
||||
mobility->SetPosition (Vector (x, y, 0.0));
|
||||
}
|
||||
|
||||
void
|
||||
@@ -58,7 +58,7 @@ GridTopology::LayoutOneColumnFirst (Ptr<Object> object, uint32_t i)
|
||||
Ptr<MobilityModel> mobility = ComponentManager::Create<MobilityModel> (m_positionClassId,
|
||||
MobilityModel::iid);
|
||||
object->AddInterface (mobility);
|
||||
mobility->Set (Position (x, y, 0.0));
|
||||
mobility->SetPosition (Vector (x, y, 0.0));
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -56,34 +56,34 @@ HierarchicalMobilityModel::GetParent (void) const
|
||||
return m_parent;
|
||||
}
|
||||
|
||||
Position
|
||||
HierarchicalMobilityModel::DoGet (void) const
|
||||
Vector
|
||||
HierarchicalMobilityModel::DoGetPosition (void) const
|
||||
{
|
||||
Position parentPosition = m_parent->Get ();
|
||||
Position childPosition = m_child->Get ();
|
||||
return Position (parentPosition.x + childPosition.x,
|
||||
Vector parentPosition = m_parent->GetPosition ();
|
||||
Vector childPosition = m_child->GetPosition ();
|
||||
return Vector (parentPosition.x + childPosition.x,
|
||||
parentPosition.y + childPosition.y,
|
||||
parentPosition.z + childPosition.z);
|
||||
}
|
||||
void
|
||||
HierarchicalMobilityModel::DoSet (const Position &position)
|
||||
HierarchicalMobilityModel::DoSetPosition (const Vector &position)
|
||||
{
|
||||
// This implementation of DoSet is really an arbitraty choice.
|
||||
// This implementation of DoSetPosition is really an arbitraty choice.
|
||||
// anything else would have been ok.
|
||||
Position parentPosition = m_parent->Get ();
|
||||
Position childPosition (position.x - parentPosition.x,
|
||||
Vector parentPosition = m_parent->GetPosition ();
|
||||
Vector childPosition (position.x - parentPosition.x,
|
||||
position.y - parentPosition.y,
|
||||
position.z - parentPosition.z);
|
||||
m_child->Set (childPosition);
|
||||
m_child->SetPosition (childPosition);
|
||||
}
|
||||
Speed
|
||||
HierarchicalMobilityModel::DoGetSpeed (void) const
|
||||
Vector
|
||||
HierarchicalMobilityModel::DoGetVelocity (void) const
|
||||
{
|
||||
Speed parentSpeed = m_parent->GetSpeed ();
|
||||
Speed childSpeed = m_child->GetSpeed ();
|
||||
Speed speed (parentSpeed.dx + childSpeed.dx,
|
||||
parentSpeed.dy + childSpeed.dy,
|
||||
parentSpeed.dz + childSpeed.dz);
|
||||
Vector parentSpeed = m_parent->GetVelocity ();
|
||||
Vector childSpeed = m_child->GetVelocity ();
|
||||
Vector speed (parentSpeed.x + childSpeed.x,
|
||||
parentSpeed.y + childSpeed.y,
|
||||
parentSpeed.z + childSpeed.z);
|
||||
return speed;
|
||||
}
|
||||
|
||||
|
||||
@@ -58,9 +58,9 @@ public:
|
||||
Ptr<MobilityModel> GetParent (void) const;
|
||||
|
||||
private:
|
||||
virtual Position DoGet (void) const;
|
||||
virtual void DoSet (const Position &position);
|
||||
virtual Speed DoGetSpeed (void) const;
|
||||
virtual Vector DoGetPosition (void) const;
|
||||
virtual void DoSetPosition (const Vector &position);
|
||||
virtual Vector DoGetVelocity (void) const;
|
||||
|
||||
void ParentChanged (const TraceContext &context, Ptr<const MobilityModel> model);
|
||||
void ChildChanged (const TraceContext &context, Ptr<const MobilityModel> model);
|
||||
|
||||
@@ -33,28 +33,28 @@ MobilityModel::MobilityModel ()
|
||||
MobilityModel::~MobilityModel ()
|
||||
{}
|
||||
|
||||
Position
|
||||
MobilityModel::Get (void) const
|
||||
Vector
|
||||
MobilityModel::GetPosition (void) const
|
||||
{
|
||||
return DoGet ();
|
||||
return DoGetPosition ();
|
||||
}
|
||||
Speed
|
||||
MobilityModel::GetSpeed (void) const
|
||||
Vector
|
||||
MobilityModel::GetVelocity (void) const
|
||||
{
|
||||
return DoGetSpeed ();
|
||||
return DoGetVelocity ();
|
||||
}
|
||||
|
||||
void
|
||||
MobilityModel::Set (const Position &position)
|
||||
MobilityModel::SetPosition (const Vector &position)
|
||||
{
|
||||
DoSet (position);
|
||||
DoSetPosition (position);
|
||||
}
|
||||
|
||||
double
|
||||
MobilityModel::GetDistanceFrom (Ptr<const MobilityModel> other) const
|
||||
{
|
||||
Position oPosition = other->DoGet ();
|
||||
Position position = DoGet ();
|
||||
Vector oPosition = other->DoGetPosition ();
|
||||
Vector position = DoGetPosition ();
|
||||
return CalculateDistance (position, oPosition);
|
||||
}
|
||||
|
||||
|
||||
@@ -21,8 +21,7 @@
|
||||
#define MOBILITY_MODEL_H
|
||||
|
||||
#include "ns3/object.h"
|
||||
#include "position.h"
|
||||
#include "speed.h"
|
||||
#include "vector.h"
|
||||
|
||||
namespace ns3 {
|
||||
|
||||
@@ -43,15 +42,15 @@ public:
|
||||
/**
|
||||
* \returns the current position
|
||||
*/
|
||||
Position Get (void) const;
|
||||
Vector GetPosition (void) const;
|
||||
/**
|
||||
* \param position the position to set.
|
||||
*/
|
||||
void Set (const Position &position);
|
||||
void SetPosition (const Vector &position);
|
||||
/**
|
||||
* \returns the current position.
|
||||
* \returns the current velocity.
|
||||
*/
|
||||
Speed GetSpeed (void) const;
|
||||
Vector GetVelocity (void) const;
|
||||
/**
|
||||
* \param position a reference to another mobility model
|
||||
* \returns the distance between the two objects. Unit is meters.
|
||||
@@ -70,21 +69,21 @@ private:
|
||||
* Concrete subclasses of this base class must
|
||||
* implement this method.
|
||||
*/
|
||||
virtual Position DoGet (void) const = 0;
|
||||
virtual Vector DoGetPosition (void) const = 0;
|
||||
/**
|
||||
* \param position the position to set.
|
||||
*
|
||||
* Concrete subclasses of this base class must
|
||||
* implement this method.
|
||||
*/
|
||||
virtual void DoSet (const Position &position) = 0;
|
||||
virtual void DoSetPosition (const Vector &position) = 0;
|
||||
/**
|
||||
* \returns the current speed.
|
||||
* \returns the current velocity.
|
||||
*
|
||||
* Concrete subclasses of this base class must
|
||||
* implement this method.
|
||||
*/
|
||||
virtual Speed DoGetSpeed (void) const = 0;
|
||||
virtual Vector DoGetVelocity (void) const = 0;
|
||||
};
|
||||
|
||||
}; // namespace ns3
|
||||
|
||||
@@ -20,14 +20,14 @@
|
||||
*/
|
||||
#include <fstream>
|
||||
#include <sstream>
|
||||
#include "ns3/debug.h"
|
||||
#include "ns3/log.h"
|
||||
#include "ns3/simulator.h"
|
||||
#include "ns3/node-list.h"
|
||||
#include "ns3/node.h"
|
||||
#include "ns2-mobility-file-topology.h"
|
||||
#include "static-speed-mobility-model.h"
|
||||
|
||||
NS_DEBUG_COMPONENT_DEFINE ("Ns2MobilityFileTopology");
|
||||
NS_LOG_COMPONENT_DEFINE ("Ns2MobilityFileTopology");
|
||||
|
||||
namespace ns3 {
|
||||
|
||||
@@ -97,27 +97,27 @@ Ns2MobilityFileTopology::LayoutObjectStore (const ObjectStore &store) const
|
||||
{
|
||||
double value = ReadDouble (line.substr (endNodeId + 9, std::string::npos));
|
||||
std::string coordinate = line.substr (endNodeId + 6, 1);
|
||||
Position position = model->Get ();
|
||||
Vector position = model->GetPosition ();
|
||||
if (coordinate == "X")
|
||||
{
|
||||
position.x = value;
|
||||
NS_DEBUG ("X=" << value);
|
||||
NS_LOG_DEBUG ("X=" << value);
|
||||
}
|
||||
else if (coordinate == "Y")
|
||||
{
|
||||
position.y = value;
|
||||
NS_DEBUG ("Y=" << value);
|
||||
NS_LOG_DEBUG ("Y=" << value);
|
||||
}
|
||||
else if (coordinate == "Z")
|
||||
{
|
||||
position.z = value;
|
||||
NS_DEBUG ("Z=" << value);
|
||||
NS_LOG_DEBUG ("Z=" << value);
|
||||
}
|
||||
else
|
||||
{
|
||||
continue;
|
||||
}
|
||||
model->Set (position);
|
||||
model->SetPosition (position);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -127,9 +127,9 @@ Ns2MobilityFileTopology::LayoutObjectStore (const ObjectStore &store) const
|
||||
double xSpeed = ReadDouble (line.substr (endNodeId + 10, xSpeedEnd - endNodeId - 10));
|
||||
double ySpeed = ReadDouble (line.substr (xSpeedEnd + 1, ySpeedEnd - xSpeedEnd - 1));
|
||||
double zSpeed = ReadDouble (line.substr (ySpeedEnd + 1, std::string::npos));
|
||||
NS_DEBUG ("at=" << at << "xSpeed=" << xSpeed << ", ySpeed=" << ySpeed << ", zSpeed=" << zSpeed);
|
||||
NS_LOG_DEBUG ("at=" << at << "xSpeed=" << xSpeed << ", ySpeed=" << ySpeed << ", zSpeed=" << zSpeed);
|
||||
Simulator::Schedule (Seconds (at), &StaticSpeedMobilityModel::SetSpeed, model,
|
||||
Speed (xSpeed, ySpeed, zSpeed));
|
||||
Vector (xSpeed, ySpeed, zSpeed));
|
||||
}
|
||||
}
|
||||
file.close();
|
||||
|
||||
@@ -153,12 +153,12 @@ RandomDirection2dMobilityModel::SetDirectionAndSpeed (double direction)
|
||||
{
|
||||
NS_LOG_FUNCTION;
|
||||
double speed = m_parameters->m_speedVariable->GetValue ();
|
||||
const Speed vector (std::cos (direction) * speed,
|
||||
std::sin (direction) * speed,
|
||||
0.0);
|
||||
Position position = m_helper.GetCurrentPosition (m_parameters->m_bounds);
|
||||
const Vector vector (std::cos (direction) * speed,
|
||||
std::sin (direction) * speed,
|
||||
0.0);
|
||||
Vector position = m_helper.GetCurrentPosition (m_parameters->m_bounds);
|
||||
m_helper.Reset (vector);
|
||||
Position next = m_parameters->m_bounds.CalculateIntersection (position, vector);
|
||||
Vector next = m_parameters->m_bounds.CalculateIntersection (position, vector);
|
||||
Time delay = Seconds (CalculateDistance (position, next) / speed);
|
||||
m_event = Simulator::Schedule (delay,
|
||||
&RandomDirection2dMobilityModel::BeginPause, this);
|
||||
@@ -169,7 +169,7 @@ RandomDirection2dMobilityModel::ResetDirectionAndSpeed (void)
|
||||
{
|
||||
double direction = UniformVariable::GetSingleValue (0, PI);
|
||||
|
||||
Position position = m_helper.GetCurrentPosition (m_parameters->m_bounds);
|
||||
Vector position = m_helper.GetCurrentPosition (m_parameters->m_bounds);
|
||||
switch (m_parameters->m_bounds.GetClosestSide (position))
|
||||
{
|
||||
case Rectangle::RIGHT:
|
||||
@@ -187,22 +187,22 @@ RandomDirection2dMobilityModel::ResetDirectionAndSpeed (void)
|
||||
}
|
||||
SetDirectionAndSpeed (direction);
|
||||
}
|
||||
Position
|
||||
RandomDirection2dMobilityModel::DoGet (void) const
|
||||
Vector
|
||||
RandomDirection2dMobilityModel::DoGetPosition (void) const
|
||||
{
|
||||
return m_helper.GetCurrentPosition (m_parameters->m_bounds);
|
||||
}
|
||||
void
|
||||
RandomDirection2dMobilityModel::DoSet (const Position &position)
|
||||
RandomDirection2dMobilityModel::DoSetPosition (const Vector &position)
|
||||
{
|
||||
m_helper.InitializePosition (position);
|
||||
Simulator::Remove (m_event);
|
||||
m_event = Simulator::ScheduleNow (&RandomDirection2dMobilityModel::Start, this);
|
||||
}
|
||||
Speed
|
||||
RandomDirection2dMobilityModel::DoGetSpeed (void) const
|
||||
Vector
|
||||
RandomDirection2dMobilityModel::DoGetVelocity (void) const
|
||||
{
|
||||
return m_helper.GetSpeed ();
|
||||
return m_helper.GetVelocity ();
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -106,9 +106,9 @@ class RandomDirection2dMobilityModel : public MobilityModel
|
||||
void SetDirectionAndSpeed (double direction);
|
||||
void InitializeDirectionAndSpeed (void);
|
||||
virtual void DoDispose (void);
|
||||
virtual Position DoGet (void) const;
|
||||
virtual void DoSet (const Position &position);
|
||||
virtual Speed DoGetSpeed (void) const;
|
||||
virtual Vector DoGetPosition (void) const;
|
||||
virtual void DoSetPosition (const Vector &position);
|
||||
virtual Vector DoGetVelocity (void) const;
|
||||
|
||||
static const double PI;
|
||||
Ptr<RandomDirection2dMobilityModelParameters> m_parameters;
|
||||
|
||||
@@ -91,12 +91,12 @@ RandomRectanglePosition::~RandomRectanglePosition ()
|
||||
m_x = 0;
|
||||
m_y = 0;
|
||||
}
|
||||
Position
|
||||
Vector
|
||||
RandomRectanglePosition::Get (void) const
|
||||
{
|
||||
double x = m_x->GetValue ();
|
||||
double y = m_y->GetValue ();
|
||||
return Position (x, y, 0.0);
|
||||
return Vector (x, y, 0.0);
|
||||
}
|
||||
|
||||
RandomDiscPosition::RandomDiscPosition ()
|
||||
@@ -120,7 +120,7 @@ RandomDiscPosition::~RandomDiscPosition ()
|
||||
m_theta = 0;
|
||||
m_rho = 0;
|
||||
}
|
||||
Position
|
||||
Vector
|
||||
RandomDiscPosition::Get (void) const
|
||||
{
|
||||
double theta = m_theta->GetValue ();
|
||||
@@ -128,7 +128,7 @@ RandomDiscPosition::Get (void) const
|
||||
double x = m_x + std::cos (theta) * rho;
|
||||
double y = m_y + std::sin (theta) * rho;
|
||||
NS_LOG_DEBUG ("Disc position x=" << x << ", y=" << y);
|
||||
return Position (x, y, 0.0);
|
||||
return Vector (x, y, 0.0);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
|
||||
#include "ns3/object.h"
|
||||
#include "ns3/component-manager.h"
|
||||
#include "position.h"
|
||||
#include "vector.h"
|
||||
|
||||
namespace ns3 {
|
||||
|
||||
@@ -42,7 +42,7 @@ public:
|
||||
/**
|
||||
* \returns the next randomly-choosen position.
|
||||
*/
|
||||
virtual Position Get (void) const = 0;
|
||||
virtual Vector Get (void) const = 0;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -67,7 +67,7 @@ public:
|
||||
RandomRectanglePosition (const RandomVariable &x,
|
||||
const RandomVariable &y);
|
||||
virtual ~RandomRectanglePosition ();
|
||||
virtual Position Get (void) const;
|
||||
virtual Vector Get (void) const;
|
||||
private:
|
||||
RandomVariable *m_x;
|
||||
RandomVariable *m_y;
|
||||
@@ -102,7 +102,7 @@ public:
|
||||
const RandomVariable &rho,
|
||||
double x, double y);
|
||||
virtual ~RandomDiscPosition ();
|
||||
virtual Position Get (void) const;
|
||||
virtual Vector Get (void) const;
|
||||
private:
|
||||
RandomVariable *m_theta;
|
||||
RandomVariable *m_rho;
|
||||
|
||||
@@ -70,8 +70,8 @@ RandomTopology::LayoutOne (Ptr<Object> object)
|
||||
Ptr<MobilityModel> mobility = ComponentManager::Create<MobilityModel> (m_mobilityModel,
|
||||
MobilityModel::iid);
|
||||
object->AddInterface (mobility);
|
||||
Position position = m_positionModel->Get ();
|
||||
mobility->Set (position);
|
||||
Vector position = m_positionModel->Get ();
|
||||
mobility->SetPosition (position);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -24,10 +24,10 @@
|
||||
#include "ns3/rectangle-default-value.h"
|
||||
#include "ns3/random-variable-default-value.h"
|
||||
#include "ns3/simulator.h"
|
||||
#include "ns3/debug.h"
|
||||
#include "ns3/log.h"
|
||||
#include <cmath>
|
||||
|
||||
NS_DEBUG_COMPONENT_DEFINE ("RandomWalk2d");
|
||||
NS_LOG_COMPONENT_DEFINE ("RandomWalk2d");
|
||||
|
||||
namespace ns3 {
|
||||
|
||||
@@ -143,9 +143,9 @@ RandomWalk2dMobilityModel::Start (void)
|
||||
{
|
||||
double speed = m_parameters->m_speed->GetValue ();
|
||||
double direction = m_parameters->m_direction->GetValue ();
|
||||
Speed vector (std::cos (direction) * speed,
|
||||
std::sin (direction) * speed,
|
||||
0.0);
|
||||
Vector vector (std::cos (direction) * speed,
|
||||
std::sin (direction) * speed,
|
||||
0.0);
|
||||
m_helper.Reset (vector);
|
||||
|
||||
Time delayLeft;
|
||||
@@ -163,11 +163,11 @@ RandomWalk2dMobilityModel::Start (void)
|
||||
void
|
||||
RandomWalk2dMobilityModel::DoWalk (Time delayLeft)
|
||||
{
|
||||
Position position = m_helper.GetCurrentPosition ();
|
||||
Speed speed = m_helper.GetSpeed ();
|
||||
Position nextPosition = position;
|
||||
nextPosition.x += speed.dx * delayLeft.GetSeconds ();
|
||||
nextPosition.y += speed.dy * delayLeft.GetSeconds ();
|
||||
Vector position = m_helper.GetCurrentPosition ();
|
||||
Vector speed = m_helper.GetVelocity ();
|
||||
Vector nextPosition = position;
|
||||
nextPosition.x += speed.x * delayLeft.GetSeconds ();
|
||||
nextPosition.y += speed.y * delayLeft.GetSeconds ();
|
||||
if (m_parameters->m_bounds.IsInside (nextPosition))
|
||||
{
|
||||
m_event = Simulator::Schedule (delayLeft, &RandomWalk2dMobilityModel::Start, this);
|
||||
@@ -175,7 +175,7 @@ RandomWalk2dMobilityModel::DoWalk (Time delayLeft)
|
||||
else
|
||||
{
|
||||
nextPosition = m_parameters->m_bounds.CalculateIntersection (position, speed);
|
||||
Time delay = Seconds ((nextPosition.x - position.x) / speed.dx);
|
||||
Time delay = Seconds ((nextPosition.x - position.x) / speed.x);
|
||||
m_event = Simulator::Schedule (delay, &RandomWalk2dMobilityModel::Rebound, this,
|
||||
delayLeft - delay);
|
||||
}
|
||||
@@ -185,17 +185,17 @@ RandomWalk2dMobilityModel::DoWalk (Time delayLeft)
|
||||
void
|
||||
RandomWalk2dMobilityModel::Rebound (Time delayLeft)
|
||||
{
|
||||
Position position = m_helper.GetCurrentPosition (m_parameters->m_bounds);
|
||||
Speed speed = m_helper.GetSpeed ();
|
||||
Vector position = m_helper.GetCurrentPosition (m_parameters->m_bounds);
|
||||
Vector speed = m_helper.GetVelocity ();
|
||||
switch (m_parameters->m_bounds.GetClosestSide (position))
|
||||
{
|
||||
case Rectangle::RIGHT:
|
||||
case Rectangle::LEFT:
|
||||
speed.dx = - speed.dx;
|
||||
speed.x = - speed.x;
|
||||
break;
|
||||
case Rectangle::TOP:
|
||||
case Rectangle::BOTTOM:
|
||||
speed.dy = - speed.dy;
|
||||
speed.y = - speed.y;
|
||||
break;
|
||||
}
|
||||
m_helper.Reset (speed);
|
||||
@@ -209,23 +209,23 @@ RandomWalk2dMobilityModel::DoDispose (void)
|
||||
// chain up
|
||||
MobilityModel::DoDispose ();
|
||||
}
|
||||
Position
|
||||
RandomWalk2dMobilityModel::DoGet (void) const
|
||||
Vector
|
||||
RandomWalk2dMobilityModel::DoGetPosition (void) const
|
||||
{
|
||||
return m_helper.GetCurrentPosition (m_parameters->m_bounds);
|
||||
}
|
||||
void
|
||||
RandomWalk2dMobilityModel::DoSet (const Position &position)
|
||||
RandomWalk2dMobilityModel::DoSetPosition (const Vector &position)
|
||||
{
|
||||
NS_ASSERT (m_parameters->m_bounds.IsInside (position));
|
||||
m_helper.InitializePosition (position);
|
||||
Simulator::Remove (m_event);
|
||||
m_event = Simulator::ScheduleNow (&RandomWalk2dMobilityModel::Start, this);
|
||||
}
|
||||
Speed
|
||||
RandomWalk2dMobilityModel::DoGetSpeed (void) const
|
||||
Vector
|
||||
RandomWalk2dMobilityModel::DoGetVelocity (void) const
|
||||
{
|
||||
return m_helper.GetSpeed ();
|
||||
return m_helper.GetVelocity ();
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -132,9 +132,9 @@ class RandomWalk2dMobilityModel : public MobilityModel
|
||||
void Rebound (Time timeLeft);
|
||||
void DoWalk (Time timeLeft);
|
||||
virtual void DoDispose (void);
|
||||
virtual Position DoGet (void) const;
|
||||
virtual void DoSet (const Position &position);
|
||||
virtual Speed DoGetSpeed (void) const;
|
||||
virtual Vector DoGetPosition (void) const;
|
||||
virtual void DoSetPosition (const Vector &position);
|
||||
virtual Vector DoGetVelocity (void) const;
|
||||
|
||||
StaticSpeedHelper m_helper;
|
||||
EventId m_event;
|
||||
|
||||
@@ -117,15 +117,15 @@ RandomWaypointMobilityModel::RandomWaypointMobilityModel (Ptr<RandomWaypointMobi
|
||||
void
|
||||
RandomWaypointMobilityModel::BeginWalk (void)
|
||||
{
|
||||
Position m_current = m_helper.GetCurrentPosition ();
|
||||
Position destination = m_parameters->m_position->Get ();
|
||||
Vector m_current = m_helper.GetCurrentPosition ();
|
||||
Vector destination = m_parameters->m_position->Get ();
|
||||
double speed = m_parameters->m_speed->GetValue ();
|
||||
double dx = (destination.x - m_current.x);
|
||||
double dy = (destination.y - m_current.y);
|
||||
double dz = (destination.z - m_current.z);
|
||||
double k = speed / std::sqrt (dx*dx + dy*dy + dz*dz);
|
||||
|
||||
m_helper.Reset (Speed (k*dx, k*dy, k*dz));
|
||||
m_helper.Reset (Vector (k*dx, k*dy, k*dz));
|
||||
Time travelDelay = Seconds (CalculateDistance (destination, m_current) / speed);
|
||||
m_event = Simulator::Schedule (travelDelay,
|
||||
&RandomWaypointMobilityModel::Start, this);
|
||||
@@ -141,22 +141,22 @@ RandomWaypointMobilityModel::Start (void)
|
||||
m_event = Simulator::Schedule (pause, &RandomWaypointMobilityModel::BeginWalk, this);
|
||||
}
|
||||
|
||||
Position
|
||||
RandomWaypointMobilityModel::DoGet (void) const
|
||||
Vector
|
||||
RandomWaypointMobilityModel::DoGetPosition (void) const
|
||||
{
|
||||
return m_helper.GetCurrentPosition ();
|
||||
}
|
||||
void
|
||||
RandomWaypointMobilityModel::DoSet (const Position &position)
|
||||
RandomWaypointMobilityModel::DoSetPosition (const Vector &position)
|
||||
{
|
||||
m_helper.InitializePosition (position);
|
||||
Simulator::Remove (m_event);
|
||||
Simulator::ScheduleNow (&RandomWaypointMobilityModel::Start, this);
|
||||
}
|
||||
Speed
|
||||
RandomWaypointMobilityModel::DoGetSpeed (void) const
|
||||
Vector
|
||||
RandomWaypointMobilityModel::DoGetVelocity (void) const
|
||||
{
|
||||
return m_helper.GetSpeed ();
|
||||
return m_helper.GetVelocity ();
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -98,9 +98,9 @@ public:
|
||||
private:
|
||||
void Start (void);
|
||||
void BeginWalk (void);
|
||||
virtual Position DoGet (void) const;
|
||||
virtual void DoSet (const Position &position);
|
||||
virtual Speed DoGetSpeed (void) const;
|
||||
virtual Vector DoGetPosition (void) const;
|
||||
virtual void DoSetPosition (const Vector &position);
|
||||
virtual Vector DoGetVelocity (void) const;
|
||||
|
||||
StaticSpeedHelper m_helper;
|
||||
Ptr<RandomWaypointMobilityModelParameters> m_parameters;
|
||||
|
||||
@@ -18,8 +18,7 @@
|
||||
* Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
|
||||
*/
|
||||
#include "rectangle.h"
|
||||
#include "position.h"
|
||||
#include "speed.h"
|
||||
#include "vector.h"
|
||||
#include "ns3/assert.h"
|
||||
#include <cmath>
|
||||
#include <algorithm>
|
||||
@@ -42,7 +41,7 @@ Rectangle::Rectangle ()
|
||||
{}
|
||||
|
||||
bool
|
||||
Rectangle::IsInside (const Position &position) const
|
||||
Rectangle::IsInside (const Vector &position) const
|
||||
{
|
||||
return
|
||||
position.x <= this->xMax && position.x >= this->xMin &&
|
||||
@@ -50,7 +49,7 @@ Rectangle::IsInside (const Position &position) const
|
||||
}
|
||||
|
||||
Rectangle::Side
|
||||
Rectangle::GetClosestSide (const Position &position) const
|
||||
Rectangle::GetClosestSide (const Vector &position) const
|
||||
{
|
||||
double xMinDist = std::abs (position.x - this->xMin);
|
||||
double xMaxDist = std::abs (this->xMax - position.x);
|
||||
@@ -82,38 +81,38 @@ Rectangle::GetClosestSide (const Position &position) const
|
||||
}
|
||||
}
|
||||
|
||||
Position
|
||||
Rectangle::CalculateIntersection (const Position ¤t, const Speed &speed) const
|
||||
Vector
|
||||
Rectangle::CalculateIntersection (const Vector ¤t, const Vector &speed) const
|
||||
{
|
||||
double xMaxY = current.y + (this->xMax - current.x) / speed.dx * speed.dy;
|
||||
double xMinY = current.y + (this->xMin - current.x) / speed.dx * speed.dy;
|
||||
double yMaxX = current.x + (this->yMax - current.y) / speed.dy * speed.dx;
|
||||
double yMinX = current.x + (this->yMin - current.y) / speed.dy * speed.dx;
|
||||
double xMaxY = current.y + (this->xMax - current.x) / speed.x * speed.y;
|
||||
double xMinY = current.y + (this->xMin - current.x) / speed.x * speed.y;
|
||||
double yMaxX = current.x + (this->yMax - current.y) / speed.y * speed.x;
|
||||
double yMinX = current.x + (this->yMin - current.y) / speed.y * speed.x;
|
||||
bool xMaxYOk = (xMaxY <= this->yMax && xMaxY >= this->yMin);
|
||||
bool xMinYOk = (xMinY <= this->yMax && xMinY >= this->yMin);
|
||||
bool yMaxXOk = (yMaxX <= this->xMax && yMaxX >= this->xMin);
|
||||
bool yMinXOk = (yMinX <= this->xMax && yMinX >= this->xMin);
|
||||
if (xMaxYOk && speed.dx >= 0)
|
||||
if (xMaxYOk && speed.x >= 0)
|
||||
{
|
||||
return Position (this->xMax, xMaxY, 0.0);
|
||||
return Vector (this->xMax, xMaxY, 0.0);
|
||||
}
|
||||
else if (xMinYOk && speed.dx <= 0)
|
||||
else if (xMinYOk && speed.x <= 0)
|
||||
{
|
||||
return Position (this->xMin, xMinY, 0.0);
|
||||
return Vector (this->xMin, xMinY, 0.0);
|
||||
}
|
||||
else if (yMaxXOk && speed.dy >= 0)
|
||||
else if (yMaxXOk && speed.y >= 0)
|
||||
{
|
||||
return Position (yMaxX, this->yMax, 0.0);
|
||||
return Vector (yMaxX, this->yMax, 0.0);
|
||||
}
|
||||
else if (yMinXOk && speed.dy <= 0)
|
||||
else if (yMinXOk && speed.y <= 0)
|
||||
{
|
||||
return Position (yMinX, this->yMin, 0.0);
|
||||
return Vector (yMinX, this->yMin, 0.0);
|
||||
}
|
||||
else
|
||||
{
|
||||
NS_ASSERT (false);
|
||||
// quiet compiler
|
||||
return Position (0.0, 0.0, 0.0);
|
||||
return Vector (0.0, 0.0, 0.0);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -22,8 +22,7 @@
|
||||
|
||||
namespace ns3 {
|
||||
|
||||
class Position;
|
||||
class Speed;
|
||||
class Vector;
|
||||
|
||||
/**
|
||||
* \brief a 2d rectangle
|
||||
@@ -51,9 +50,9 @@ public:
|
||||
* Create a zero-sized rectangle located at coordinates (0.0,0.0)
|
||||
*/
|
||||
Rectangle ();
|
||||
bool IsInside (const Position &position) const;
|
||||
Side GetClosestSide (const Position &position) const;
|
||||
Position CalculateIntersection (const Position ¤t, const Speed &speed) const;
|
||||
bool IsInside (const Vector &position) const;
|
||||
Side GetClosestSide (const Vector &position) const;
|
||||
Vector CalculateIntersection (const Vector ¤t, const Vector &speed) const;
|
||||
|
||||
double xMin;
|
||||
double xMax;
|
||||
|
||||
@@ -1,36 +0,0 @@
|
||||
/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2007 INRIA
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation;
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
|
||||
*/
|
||||
#include "speed.h"
|
||||
|
||||
namespace ns3 {
|
||||
|
||||
Speed::Speed (double _dx, double _dy, double _dz)
|
||||
: dx (_dx),
|
||||
dy (_dy),
|
||||
dz (_dz)
|
||||
{}
|
||||
|
||||
Speed::Speed ()
|
||||
: dx (0.0),
|
||||
dy (0.0),
|
||||
dz (0.0)
|
||||
{}
|
||||
|
||||
} // namespace ns3
|
||||
@@ -1,61 +0,0 @@
|
||||
/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2007 INRIA
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation;
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
|
||||
*/
|
||||
#ifndef SPEED_H
|
||||
#define SPEED_H
|
||||
|
||||
namespace ns3 {
|
||||
|
||||
/**
|
||||
* \brief keep track of 3d cartesian speed vectors
|
||||
*
|
||||
* Unit is meters/s.
|
||||
*/
|
||||
class Speed
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* \param _dx x coordinate of speed vector
|
||||
* \param _dy y coordinate of speed vector
|
||||
* \param _dz z coordinate of speed vector
|
||||
*
|
||||
* Create speed vector (_dx, _dy, _dz)
|
||||
*/
|
||||
Speed (double _dx, double _dy, double _dz);
|
||||
/**
|
||||
* Create speed vector (0.0, 0.0, 0.0)
|
||||
*/
|
||||
Speed ();
|
||||
/**
|
||||
* x coordinate of speed vector
|
||||
*/
|
||||
double dx;
|
||||
/**
|
||||
* y coordinate of speed vector
|
||||
*/
|
||||
double dy;
|
||||
/**
|
||||
* z coordinate of speed vector
|
||||
*/
|
||||
double dz;
|
||||
};
|
||||
|
||||
} // namespace ns3
|
||||
|
||||
#endif /* SPEED_H */
|
||||
@@ -28,7 +28,7 @@ StaticMobilityModel::StaticMobilityModel ()
|
||||
{
|
||||
SetInterfaceId (StaticMobilityModel::iid);
|
||||
}
|
||||
StaticMobilityModel::StaticMobilityModel (const Position &position)
|
||||
StaticMobilityModel::StaticMobilityModel (const Vector &position)
|
||||
: m_position (position)
|
||||
{
|
||||
SetInterfaceId (StaticMobilityModel::iid);
|
||||
@@ -36,21 +36,21 @@ StaticMobilityModel::StaticMobilityModel (const Position &position)
|
||||
StaticMobilityModel::~StaticMobilityModel ()
|
||||
{}
|
||||
|
||||
Position
|
||||
StaticMobilityModel::DoGet (void) const
|
||||
Vector
|
||||
StaticMobilityModel::DoGetPosition (void) const
|
||||
{
|
||||
return m_position;
|
||||
}
|
||||
void
|
||||
StaticMobilityModel::DoSet (const Position &position)
|
||||
StaticMobilityModel::DoSetPosition (const Vector &position)
|
||||
{
|
||||
m_position = position;
|
||||
NotifyCourseChange ();
|
||||
}
|
||||
Speed
|
||||
StaticMobilityModel::DoGetSpeed (void) const
|
||||
Vector
|
||||
StaticMobilityModel::DoGetVelocity (void) const
|
||||
{
|
||||
return Speed ();
|
||||
return Vector (0.0, 0.0, 0.0);
|
||||
}
|
||||
|
||||
}; // namespace ns3
|
||||
|
||||
@@ -44,15 +44,15 @@ public:
|
||||
* Create a position located at coordinates (x,y,z).
|
||||
* Unit is meters
|
||||
*/
|
||||
StaticMobilityModel (const Position &position);
|
||||
StaticMobilityModel (const Vector &position);
|
||||
virtual ~StaticMobilityModel ();
|
||||
|
||||
private:
|
||||
virtual Position DoGet (void) const;
|
||||
virtual void DoSet (const Position &position);
|
||||
virtual Speed DoGetSpeed (void) const;
|
||||
virtual Vector DoGetPosition (void) const;
|
||||
virtual void DoSetPosition (const Vector &position);
|
||||
virtual Vector DoGetVelocity (void) const;
|
||||
|
||||
Position m_position;
|
||||
Vector m_position;
|
||||
};
|
||||
|
||||
}; // namespace ns3
|
||||
|
||||
@@ -25,40 +25,40 @@ namespace ns3 {
|
||||
|
||||
StaticSpeedHelper::StaticSpeedHelper ()
|
||||
{}
|
||||
StaticSpeedHelper::StaticSpeedHelper (const Position &position)
|
||||
StaticSpeedHelper::StaticSpeedHelper (const Vector &position)
|
||||
: m_position (position)
|
||||
{}
|
||||
StaticSpeedHelper::StaticSpeedHelper (const Position &position,
|
||||
const Speed &speed)
|
||||
StaticSpeedHelper::StaticSpeedHelper (const Vector &position,
|
||||
const Vector &speed)
|
||||
: m_position (position),
|
||||
m_speed (speed),
|
||||
m_paused (true)
|
||||
{}
|
||||
void
|
||||
StaticSpeedHelper::InitializePosition (const Position &position)
|
||||
StaticSpeedHelper::InitializePosition (const Vector &position)
|
||||
{
|
||||
m_position = position;
|
||||
m_speed.dx = 0.0;
|
||||
m_speed.dy = 0.0;
|
||||
m_speed.dz = 0.0;
|
||||
m_speed.x = 0.0;
|
||||
m_speed.y = 0.0;
|
||||
m_speed.z = 0.0;
|
||||
m_lastUpdate = Simulator::Now ();
|
||||
m_paused = true;
|
||||
}
|
||||
|
||||
Position
|
||||
Vector
|
||||
StaticSpeedHelper::GetCurrentPosition (void) const
|
||||
{
|
||||
Update ();
|
||||
return m_position;
|
||||
}
|
||||
|
||||
Speed
|
||||
StaticSpeedHelper::GetSpeed (void) const
|
||||
Vector
|
||||
StaticSpeedHelper::GetVelocity (void) const
|
||||
{
|
||||
return m_paused? Speed (0, 0, 0) : m_speed;
|
||||
return m_paused? Vector (0.0, 0.0, 0.0) : m_speed;
|
||||
}
|
||||
void
|
||||
StaticSpeedHelper::SetSpeed (const Speed &speed)
|
||||
StaticSpeedHelper::SetSpeed (const Vector &speed)
|
||||
{
|
||||
Update ();
|
||||
m_speed = speed;
|
||||
@@ -76,13 +76,13 @@ StaticSpeedHelper::Update (void) const
|
||||
Time deltaTime = now - m_lastUpdate;
|
||||
m_lastUpdate = now;
|
||||
double deltaS = deltaTime.GetSeconds ();
|
||||
m_position.x += m_speed.dx * deltaS;
|
||||
m_position.y += m_speed.dy * deltaS;
|
||||
m_position.z += m_speed.dz * deltaS;
|
||||
m_position.x += m_speed.x * deltaS;
|
||||
m_position.y += m_speed.y * deltaS;
|
||||
m_position.z += m_speed.z * deltaS;
|
||||
}
|
||||
|
||||
void
|
||||
StaticSpeedHelper::Reset (const Speed &speed)
|
||||
StaticSpeedHelper::Reset (const Vector &speed)
|
||||
{
|
||||
Update ();
|
||||
m_speed = speed;
|
||||
@@ -98,7 +98,7 @@ StaticSpeedHelper::UpdateFull (const Rectangle &bounds) const
|
||||
m_position.y = std::max (bounds.yMin, m_position.y);
|
||||
}
|
||||
|
||||
Position
|
||||
Vector
|
||||
StaticSpeedHelper::GetCurrentPosition (const Rectangle &bounds) const
|
||||
{
|
||||
UpdateFull (bounds);
|
||||
|
||||
@@ -21,8 +21,7 @@
|
||||
#define STATIC_SPEED_HELPER_H
|
||||
|
||||
#include "ns3/nstime.h"
|
||||
#include "position.h"
|
||||
#include "speed.h"
|
||||
#include "vector.h"
|
||||
|
||||
namespace ns3 {
|
||||
|
||||
@@ -32,16 +31,16 @@ class StaticSpeedHelper
|
||||
{
|
||||
public:
|
||||
StaticSpeedHelper ();
|
||||
StaticSpeedHelper (const Position &position);
|
||||
StaticSpeedHelper (const Position &position,
|
||||
const Speed &speed);
|
||||
void InitializePosition (const Position &position);
|
||||
StaticSpeedHelper (const Vector &position);
|
||||
StaticSpeedHelper (const Vector &position,
|
||||
const Vector &speed);
|
||||
void InitializePosition (const Vector &position);
|
||||
|
||||
void Reset (const Speed &speed);
|
||||
Position GetCurrentPosition (const Rectangle &bounds) const;
|
||||
Position GetCurrentPosition (void) const;
|
||||
Speed GetSpeed (void) const;
|
||||
void SetSpeed (const Speed &speed);
|
||||
void Reset (const Vector &speed);
|
||||
Vector GetCurrentPosition (const Rectangle &bounds) const;
|
||||
Vector GetCurrentPosition (void) const;
|
||||
Vector GetVelocity (void) const;
|
||||
void SetSpeed (const Vector &speed);
|
||||
void Pause (void);
|
||||
void Unpause (void);
|
||||
|
||||
@@ -49,8 +48,8 @@ class StaticSpeedHelper
|
||||
void Update (void) const;
|
||||
void UpdateFull (const Rectangle &rectangle) const;
|
||||
mutable Time m_lastUpdate;
|
||||
mutable Position m_position;
|
||||
Speed m_speed;
|
||||
mutable Vector m_position;
|
||||
Vector m_speed;
|
||||
bool m_paused;
|
||||
};
|
||||
|
||||
|
||||
@@ -33,13 +33,13 @@ StaticSpeedMobilityModel::StaticSpeedMobilityModel ()
|
||||
{
|
||||
SetInterfaceId (StaticSpeedMobilityModel::iid);
|
||||
}
|
||||
StaticSpeedMobilityModel::StaticSpeedMobilityModel (const Position &position)
|
||||
StaticSpeedMobilityModel::StaticSpeedMobilityModel (const Vector &position)
|
||||
: m_helper (position)
|
||||
{
|
||||
SetInterfaceId (StaticSpeedMobilityModel::iid);
|
||||
}
|
||||
StaticSpeedMobilityModel::StaticSpeedMobilityModel (const Position &position,
|
||||
const Speed &speed)
|
||||
StaticSpeedMobilityModel::StaticSpeedMobilityModel (const Vector &position,
|
||||
const Vector &speed)
|
||||
: m_helper (position, speed)
|
||||
{
|
||||
SetInterfaceId (StaticSpeedMobilityModel::iid);
|
||||
@@ -49,28 +49,28 @@ StaticSpeedMobilityModel::~StaticSpeedMobilityModel ()
|
||||
{}
|
||||
|
||||
void
|
||||
StaticSpeedMobilityModel::SetSpeed (const Speed speed)
|
||||
StaticSpeedMobilityModel::SetSpeed (const Vector &speed)
|
||||
{
|
||||
m_helper.SetSpeed (speed);
|
||||
NotifyCourseChange ();
|
||||
}
|
||||
|
||||
|
||||
Position
|
||||
StaticSpeedMobilityModel::DoGet (void) const
|
||||
Vector
|
||||
StaticSpeedMobilityModel::DoGetPosition (void) const
|
||||
{
|
||||
return m_helper.GetCurrentPosition ();
|
||||
}
|
||||
void
|
||||
StaticSpeedMobilityModel::DoSet (const Position &position)
|
||||
StaticSpeedMobilityModel::DoSetPosition (const Vector &position)
|
||||
{
|
||||
m_helper.InitializePosition (position);
|
||||
NotifyCourseChange ();
|
||||
}
|
||||
Speed
|
||||
StaticSpeedMobilityModel::DoGetSpeed (void) const
|
||||
Vector
|
||||
StaticSpeedMobilityModel::DoGetVelocity (void) const
|
||||
{
|
||||
return m_helper.GetSpeed ();
|
||||
return m_helper.GetVelocity ();
|
||||
}
|
||||
|
||||
}; // namespace ns3
|
||||
|
||||
@@ -25,7 +25,6 @@
|
||||
#include "ns3/nstime.h"
|
||||
#include "ns3/component-manager.h"
|
||||
#include "static-speed-helper.h"
|
||||
#include "speed.h"
|
||||
|
||||
namespace ns3 {
|
||||
|
||||
@@ -48,15 +47,15 @@ public:
|
||||
* Create a position located at coordinates (x,y,z) with
|
||||
* speed (0,0,0).
|
||||
*/
|
||||
StaticSpeedMobilityModel (const Position &position);
|
||||
StaticSpeedMobilityModel (const Vector &position);
|
||||
/**
|
||||
*
|
||||
* Create a position located at coordinates (x,y,z) with
|
||||
* speed (dx,dy,dz).
|
||||
* Unit is meters and meters/s
|
||||
*/
|
||||
StaticSpeedMobilityModel (const Position &position,
|
||||
const Speed &speed);
|
||||
StaticSpeedMobilityModel (const Vector &position,
|
||||
const Vector &speed);
|
||||
virtual ~StaticSpeedMobilityModel ();
|
||||
|
||||
/**
|
||||
@@ -65,11 +64,11 @@ public:
|
||||
* Set the current speed now to (dx,dy,dz)
|
||||
* Unit is meters/s
|
||||
*/
|
||||
void SetSpeed (const Speed speed);
|
||||
void SetSpeed (const Vector &speed);
|
||||
private:
|
||||
virtual Position DoGet (void) const;
|
||||
virtual void DoSet (const Position &position);
|
||||
virtual Speed DoGetSpeed (void) const;
|
||||
virtual Vector DoGetPosition (void) const;
|
||||
virtual void DoSetPosition (const Vector &position);
|
||||
virtual Vector DoGetVelocity (void) const;
|
||||
void Update (void) const;
|
||||
StaticSpeedHelper m_helper;
|
||||
};
|
||||
|
||||
@@ -17,26 +17,26 @@
|
||||
*
|
||||
* Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
|
||||
*/
|
||||
#include "position.h"
|
||||
#include "vector.h"
|
||||
#include <cmath>
|
||||
|
||||
namespace ns3 {
|
||||
|
||||
|
||||
Position::Position (double _x, double _y, double _z)
|
||||
Vector::Vector (double _x, double _y, double _z)
|
||||
: x (_x),
|
||||
y (_y),
|
||||
z (_z)
|
||||
{}
|
||||
|
||||
Position::Position ()
|
||||
Vector::Vector ()
|
||||
: x (0.0),
|
||||
y (0.0),
|
||||
z (0.0)
|
||||
{}
|
||||
|
||||
double
|
||||
CalculateDistance (const Position &a, const Position &b)
|
||||
CalculateDistance (const Vector &a, const Vector &b)
|
||||
{
|
||||
double dx = b.x - a.x;
|
||||
double dy = b.y - a.y;
|
||||
@@ -17,8 +17,8 @@
|
||||
*
|
||||
* Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
|
||||
*/
|
||||
#ifndef POSITION_H
|
||||
#define POSITION_H
|
||||
#ifndef VECTOR_H
|
||||
#define VECTOR_H
|
||||
|
||||
namespace ns3 {
|
||||
|
||||
@@ -27,37 +27,37 @@ namespace ns3 {
|
||||
*
|
||||
* Unit is meters.
|
||||
*/
|
||||
class Position
|
||||
class Vector
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* \param _x x coordinate of position vector
|
||||
* \param _y y coordinate of position vector
|
||||
* \param _z z coordinate of position vector
|
||||
* \param _x x coordinate of vector vector
|
||||
* \param _y y coordinate of vector vector
|
||||
* \param _z z coordinate of vector vector
|
||||
*
|
||||
* Create position vector (_x, _y, _z)
|
||||
* Create vector vector (_x, _y, _z)
|
||||
*/
|
||||
Position (double _x, double _y, double _z);
|
||||
Vector (double _x, double _y, double _z);
|
||||
/**
|
||||
* Create position vector (0.0, 0.0, 0.0)
|
||||
* Create vector vector (0.0, 0.0, 0.0)
|
||||
*/
|
||||
Position ();
|
||||
Vector ();
|
||||
/**
|
||||
* x coordinate of position vector
|
||||
* x coordinate of vector vector
|
||||
*/
|
||||
double x;
|
||||
/**
|
||||
* y coordinate of position vector
|
||||
* y coordinate of vector vector
|
||||
*/
|
||||
double y;
|
||||
/**
|
||||
* z coordinate of position vector
|
||||
* z coordinate of vector vector
|
||||
*/
|
||||
double z;
|
||||
};
|
||||
|
||||
double CalculateDistance (const Position &a, const Position &b);
|
||||
double CalculateDistance (const Vector &a, const Vector &b);
|
||||
|
||||
} // namespace ns3
|
||||
|
||||
#endif /* POSITION_H */
|
||||
#endif /* VECTOR_H */
|
||||
@@ -3,16 +3,15 @@
|
||||
def build(bld):
|
||||
mobility = bld.create_ns3_module('mobility', ['core', 'simulator'])
|
||||
mobility.source = [
|
||||
'vector.cc',
|
||||
'grid-topology.cc',
|
||||
'hierarchical-mobility-model.cc',
|
||||
'mobility-model.cc',
|
||||
'mobility-model-notifier.cc',
|
||||
'position.cc',
|
||||
'random-position.cc',
|
||||
'random-topology.cc',
|
||||
'rectangle.cc',
|
||||
'rectangle-default-value.cc',
|
||||
'speed.cc',
|
||||
'static-mobility-model.cc',
|
||||
'static-speed-helper.cc',
|
||||
'static-speed-mobility-model.cc',
|
||||
@@ -24,16 +23,15 @@ def build(bld):
|
||||
|
||||
headers = bld.create_obj('ns3header')
|
||||
headers.source = [
|
||||
'vector.h',
|
||||
'grid-topology.h',
|
||||
'hierarchical-mobility-model.h',
|
||||
'mobility-model.h',
|
||||
'mobility-model-notifier.h',
|
||||
'position.h',
|
||||
'random-position.h',
|
||||
'random-topology.h',
|
||||
'rectangle.h',
|
||||
'rectangle-default-value.h',
|
||||
'speed.h',
|
||||
'static-mobility-model.h',
|
||||
'static-speed-helper.h',
|
||||
'static-speed-mobility-model.h',
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
#include "ns3/udp.h"
|
||||
#include "ns3/internet-node.h"
|
||||
#include "ns3/simulator.h"
|
||||
#include "ns3/debug.h"
|
||||
#include "ns3/log.h"
|
||||
#include "ns3/random-variable.h"
|
||||
#include "ns3/inet-socket-address.h"
|
||||
#include "ns3/composite-trace-resolver.h"
|
||||
@@ -143,7 +143,7 @@
|
||||
namespace ns3 {
|
||||
namespace olsr {
|
||||
|
||||
NS_DEBUG_COMPONENT_DEFINE ("OlsrAgent");
|
||||
NS_LOG_COMPONENT_DEFINE ("OlsrAgent");
|
||||
|
||||
|
||||
/********** OLSR class **********/
|
||||
@@ -232,7 +232,7 @@ void AgentImpl::Start ()
|
||||
NS_ASSERT (m_mainAddress != Ipv4Address ());
|
||||
}
|
||||
|
||||
NS_DEBUG ("Starting OLSR on node " << m_mainAddress);
|
||||
NS_LOG_DEBUG ("Starting OLSR on node " << m_mainAddress);
|
||||
|
||||
m_routingTable = Create<RoutingTable> (m_ipv4, m_mainAddress);
|
||||
// Add OLSR as routing protocol, with slightly lower priority than
|
||||
@@ -247,7 +247,7 @@ void AgentImpl::Start ()
|
||||
TcTimerExpire ();
|
||||
MidTimerExpire ();
|
||||
|
||||
NS_DEBUG ("OLSR on node " << m_mainAddress << " started");
|
||||
NS_LOG_DEBUG ("OLSR on node " << m_mainAddress << " started");
|
||||
}
|
||||
|
||||
void AgentImpl::SetMainInterface (uint32_t interface)
|
||||
@@ -284,7 +284,7 @@ AgentImpl::RecvOlsr (Ptr<Socket> socket,
|
||||
Ptr<Packet> receivedPacket,
|
||||
const Address &sourceAddress)
|
||||
{
|
||||
NS_DEBUG ("OLSR node " << m_mainAddress << " received a OLSR packet");
|
||||
NS_LOG_DEBUG ("OLSR node " << m_mainAddress << " received a OLSR packet");
|
||||
InetSocketAddress inetSourceAddr = InetSocketAddress::ConvertFrom (sourceAddress);
|
||||
|
||||
// All routing messages are sent from and to port RT_PORT,
|
||||
@@ -308,7 +308,7 @@ AgentImpl::RecvOlsr (Ptr<Socket> socket,
|
||||
|
||||
sizeLeft -= messageHeader.GetSerializedSize ();
|
||||
|
||||
NS_DEBUG ("Olsr Msg received with type "
|
||||
NS_LOG_DEBUG ("Olsr Msg received with type "
|
||||
<< std::dec << int (messageHeader.GetMessageType ())
|
||||
<< " TTL=" << int (messageHeader.GetTimeToLive ())
|
||||
<< " origAddr=" << messageHeader.GetOriginatorAddress ());
|
||||
@@ -343,29 +343,29 @@ AgentImpl::RecvOlsr (Ptr<Socket> socket,
|
||||
switch (messageHeader.GetMessageType ())
|
||||
{
|
||||
case olsr::MessageHeader::HELLO_MESSAGE:
|
||||
NS_DEBUG ("OLSR node received HELLO message of size " << messageHeader.GetSerializedSize ());
|
||||
NS_LOG_DEBUG ("OLSR node received HELLO message of size " << messageHeader.GetSerializedSize ());
|
||||
ProcessHello (messageHeader, m_mainAddress, inetSourceAddr.GetIpv4 ());
|
||||
break;
|
||||
|
||||
case olsr::MessageHeader::TC_MESSAGE:
|
||||
NS_DEBUG ("OLSR node received TC message of size " << messageHeader.GetSerializedSize ());
|
||||
NS_LOG_DEBUG ("OLSR node received TC message of size " << messageHeader.GetSerializedSize ());
|
||||
ProcessTc (messageHeader, inetSourceAddr.GetIpv4 ());
|
||||
break;
|
||||
|
||||
case olsr::MessageHeader::MID_MESSAGE:
|
||||
NS_DEBUG ("OLSR node received MID message of size " << messageHeader.GetSerializedSize ());
|
||||
NS_LOG_DEBUG ("OLSR node received MID message of size " << messageHeader.GetSerializedSize ());
|
||||
ProcessMid (messageHeader, inetSourceAddr.GetIpv4 ());
|
||||
break;
|
||||
|
||||
default:
|
||||
NS_DEBUG ("OLSR message type " <<
|
||||
NS_LOG_DEBUG ("OLSR message type " <<
|
||||
int (messageHeader.GetMessageType ()) <<
|
||||
" not implemented");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
NS_DEBUG ("OLSR message is duplicated, not reading it.");
|
||||
NS_LOG_DEBUG ("OLSR message is duplicated, not reading it.");
|
||||
|
||||
// If the message has been considered for forwarding, it should
|
||||
// not be retransmitted again
|
||||
@@ -1093,7 +1093,7 @@ void
|
||||
AgentImpl::SendPacket (Ptr<Packet> packet,
|
||||
const MessageList &containedMessages)
|
||||
{
|
||||
NS_DEBUG ("OLSR node " << m_mainAddress << " sending a OLSR packet");
|
||||
NS_LOG_DEBUG ("OLSR node " << m_mainAddress << " sending a OLSR packet");
|
||||
|
||||
// Add a header
|
||||
olsr::PacketHeader header;
|
||||
@@ -1121,7 +1121,7 @@ AgentImpl::SendQueuedMessages ()
|
||||
Ptr<Packet> packet = Create<Packet> ();
|
||||
int numMessages = 0;
|
||||
|
||||
NS_DEBUG ("Olsr node " << m_mainAddress << ": SendQueuedMessages");
|
||||
NS_LOG_DEBUG ("Olsr node " << m_mainAddress << ": SendQueuedMessages");
|
||||
|
||||
MessageList msglist;
|
||||
|
||||
@@ -1249,8 +1249,8 @@ AgentImpl::SendHello ()
|
||||
|
||||
linkMessages.push_back (linkMessage);
|
||||
}
|
||||
NS_DEBUG ("OLSR HELLO message size: " << int (msg.GetSerializedSize ())
|
||||
<< " (with " << int (linkMessages.size ()) << " link messages)");
|
||||
NS_LOG_DEBUG ("OLSR HELLO message size: " << int (msg.GetSerializedSize ())
|
||||
<< " (with " << int (linkMessages.size ()) << " link messages)");
|
||||
QueueMessage (msg, JITTER);
|
||||
}
|
||||
|
||||
@@ -2113,40 +2113,3 @@ AgentImpl::IfaceAssocTupleTimerExpire (IfaceAssocTuple tuple)
|
||||
}} // namespace olsr, ns3
|
||||
|
||||
|
||||
|
||||
#ifdef RUN_SELF_TESTS
|
||||
|
||||
|
||||
#include "ns3/test.h"
|
||||
|
||||
namespace ns3 {
|
||||
|
||||
class OlsrTest : public ns3::Test {
|
||||
private:
|
||||
public:
|
||||
OlsrTest ();
|
||||
virtual bool RunTests (void);
|
||||
|
||||
|
||||
};
|
||||
|
||||
OlsrTest::OlsrTest ()
|
||||
: ns3::Test ("Olsr")
|
||||
{}
|
||||
|
||||
|
||||
bool
|
||||
OlsrTest::RunTests (void)
|
||||
{
|
||||
bool result = true;
|
||||
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static OlsrTest gOlsrTest;
|
||||
|
||||
}
|
||||
|
||||
|
||||
#endif /* RUN_SELF_TESTS */
|
||||
|
||||
@@ -48,8 +48,6 @@ namespace olsr {
|
||||
|
||||
class AgentImpl : public Agent
|
||||
{
|
||||
friend class OlsrTest;
|
||||
|
||||
public:
|
||||
AgentImpl (Ptr<Node> node);
|
||||
|
||||
|
||||
@@ -28,11 +28,11 @@
|
||||
#include "routing-table.h"
|
||||
#include "ns3/packet.h"
|
||||
#include "ns3/ipv4-header.h"
|
||||
#include "ns3/debug.h"
|
||||
#include "ns3/log.h"
|
||||
|
||||
namespace ns3 { namespace olsr {
|
||||
|
||||
NS_DEBUG_COMPONENT_DEFINE ("OlsrRoutingTable");
|
||||
NS_LOG_COMPONENT_DEFINE ("OlsrRoutingTable");
|
||||
|
||||
///
|
||||
/// \brief Clears the routing table and frees the memory assigned to each one of its entries.
|
||||
@@ -119,19 +119,19 @@ RoutingTable::RequestRoute (uint32_t ifIndex,
|
||||
Ipv4Route route = Ipv4Route::CreateHostRouteTo
|
||||
(ipHeader.GetDestination (), entry2.nextAddr, entry2.interface);
|
||||
|
||||
NS_DEBUG ("Olsr node" << m_mainAddress
|
||||
<< ": RouteRequest for dest=" << ipHeader.GetDestination ()
|
||||
<< " --> destHop=" << entry2.nextAddr
|
||||
<< " interface=" << entry2.interface);
|
||||
NS_LOG_DEBUG ("Olsr node" << m_mainAddress
|
||||
<< ": RouteRequest for dest=" << ipHeader.GetDestination ()
|
||||
<< " --> destHop=" << entry2.nextAddr
|
||||
<< " interface=" << entry2.interface);
|
||||
|
||||
routeReply (true, route, packet, ipHeader);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
NS_DEBUG ("Olsr node" << m_mainAddress
|
||||
<< ": RouteRequest for dest=" << ipHeader.GetDestination ()
|
||||
<< " --> NOT FOUND");
|
||||
NS_LOG_DEBUG ("Olsr node" << m_mainAddress
|
||||
<< ": RouteRequest for dest=" << ipHeader.GetDestination ()
|
||||
<< " --> NOT FOUND");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,7 +15,6 @@
|
||||
*/
|
||||
|
||||
#include "ns3/log.h"
|
||||
#include "ns3/debug.h"
|
||||
|
||||
NS_LOG_COMPONENT_DEFINE ("HelloSimulator");
|
||||
|
||||
@@ -24,8 +23,6 @@ using namespace ns3;
|
||||
int
|
||||
main (int argc, char *argv[])
|
||||
{
|
||||
DebugComponentEnable ("Log");
|
||||
|
||||
// LogComponentEnable ("HelloSimulator",
|
||||
// LogLevel (LOG_LEVEL_INFO | LOG_PREFIX_ALL));
|
||||
|
||||
|
||||
@@ -211,13 +211,19 @@ int main (int argc, char *argv[])
|
||||
argc--;
|
||||
argv++;
|
||||
}
|
||||
if (n == 0)
|
||||
{
|
||||
std::cerr << "Error-- number of packets must be specified " <<
|
||||
"by command-line argument --n=(number of packets)" << std::endl;
|
||||
exit (1);
|
||||
}
|
||||
std::cout << "Running bench-packets with n=" << n << std::endl;
|
||||
|
||||
|
||||
Packet::EnableMetadata ();
|
||||
runBench (&benchPtrA, n, "a");
|
||||
runBench (&benchPtrB, n, "b");
|
||||
runBench (&benchPtrC, n, "c");
|
||||
|
||||
Packet::EnableMetadata ();
|
||||
//runBench (&benchPrint, n, "print");
|
||||
PacketMetadata::SetOptOne (false);
|
||||
runBench (&benchPtrA, n, "meta-a");
|
||||
|
||||
@@ -48,15 +48,15 @@ Sample ()
|
||||
{
|
||||
Ptr<Node> node = *nodeIter;
|
||||
Ptr<MobilityModel> mobility = node->QueryInterface<MobilityModel> (MobilityModel::iid);
|
||||
Position pos = mobility->Get ();
|
||||
Speed vel = mobility->GetSpeed ();
|
||||
Vector pos = mobility->GetPosition ();
|
||||
Vector vel = mobility->GetVelocity ();
|
||||
|
||||
NodeUpdate update;
|
||||
update.node = PeekPointer<Node> (node);
|
||||
update.x = pos.x;
|
||||
update.y = pos.y;
|
||||
update.vx = vel.dx;
|
||||
update.vy = vel.dy;
|
||||
update.vx = vel.x;
|
||||
update.vy = vel.y;
|
||||
data->updateList.push_back (update);
|
||||
}
|
||||
data->time = Simulator::Now ().GetSeconds ();
|
||||
|
||||
@@ -21,11 +21,13 @@
|
||||
|
||||
#include "ns3/test.h"
|
||||
#include "ns3/packet-metadata.h"
|
||||
#include "ns3/random-variable.h"
|
||||
|
||||
|
||||
int main (int argc, char *argv[])
|
||||
{
|
||||
#ifdef RUN_SELF_TESTS
|
||||
ns3::RandomVariable::UseGlobalSeed(1,2,3,4,5,6);
|
||||
ns3::PacketMetadata::Enable ();
|
||||
ns3::TestManager::EnableVerbose ();
|
||||
bool success = ns3::TestManager::RunTests ();
|
||||
|
||||
1
wscript
1
wscript
@@ -118,7 +118,6 @@ def configure(conf):
|
||||
variant_env.append_value('CXXFLAGS', ['-Werror'])
|
||||
|
||||
if 'debug' in Params.g_options.debug_level.lower():
|
||||
variant_env.append_value('CXXDEFINES', 'NS3_DEBUG_ENABLE')
|
||||
variant_env.append_value('CXXDEFINES', 'NS3_ASSERT_ENABLE')
|
||||
variant_env.append_value('CXXDEFINES', 'NS3_LOG_ENABLE')
|
||||
|
||||
|
||||
Reference in New Issue
Block a user