diff --git a/etc/auv/transports.ini b/etc/auv/transports.ini index d011845309..303de28689 100644 --- a/etc/auv/transports.ini +++ b/etc/auv/transports.ini @@ -131,6 +131,7 @@ Communication Range = 0 Underwater Communications = true Always Transmitted Messages = Abort, SimulatedState +Loopback Internal Messages = true [Transports.Logging] Enabled = Always @@ -294,6 +295,7 @@ Transports = Abort, WaterDensity, WaterVelocity, YoYo +Loopback Internal Messages = true [Transports.TCP.Server/Console] Enabled = Never @@ -345,6 +347,7 @@ Transports = EntityParameters, VehicleMedium, LogBookEntry, ManeuverDone +Loopback Internal Messages = true [Transports.TCP.Server/BackSeat] Enabled = Always @@ -384,6 +387,7 @@ Transports = Announce, VehicleMedium, VehicleState Filtered Entities = Temperature:CTD+OEMX+Water Quality Sensor+CTD Simulator +Loopback Internal Messages = true [Transports.CommManager] Enabled = Always diff --git a/etc/common/transports.ini b/etc/common/transports.ini index 4203f25bae..c98e37d75d 100644 --- a/etc/common/transports.ini +++ b/etc/common/transports.ini @@ -65,6 +65,8 @@ Transports = Chlorophyll, Voltage, PH, Redox +Loopback Internal Messages = true + [Transports.Cache] Enabled = Always Entity Label = Cache diff --git a/etc/lauv-noptilus-2-cpu-cam.ini b/etc/lauv-noptilus-2-cpu-cam.ini index dc85996572..c34d93883b 100644 --- a/etc/lauv-noptilus-2-cpu-cam.ini +++ b/etc/lauv-noptilus-2-cpu-cam.ini @@ -88,6 +88,7 @@ Transports = EntityState, LogBookEntry, LoggingControl, Temperature +Loopback Internal Messages = true [Transports.HTTP] Enabled = Always diff --git a/etc/lauv-noptilus-3-cpu-cam.ini b/etc/lauv-noptilus-3-cpu-cam.ini index 1fc650b906..1f42bbc253 100644 --- a/etc/lauv-noptilus-3-cpu-cam.ini +++ b/etc/lauv-noptilus-3-cpu-cam.ini @@ -37,3 +37,4 @@ Camera IPv4 Address = 10.0.10.106 [Transports.TCP.Client] Server - Address = 10.0.10.100 +Loopback Internal Messages = true diff --git a/etc/lauv-seacon-1-aux.ini b/etc/lauv-seacon-1-aux.ini index 018ab7b45b..d8e8b9eeb0 100644 --- a/etc/lauv-seacon-1-aux.ini +++ b/etc/lauv-seacon-1-aux.ini @@ -63,6 +63,7 @@ Transports = Heartbeat, EntityState, EntityActivationState, EntityInfo +Loopback Internal Messages = true [Transports.FTP] Enabled = Always diff --git a/etc/lauv-seacon-2-aux.ini b/etc/lauv-seacon-2-aux.ini index 773941abb9..b5544d358a 100644 --- a/etc/lauv-seacon-2-aux.ini +++ b/etc/lauv-seacon-2-aux.ini @@ -67,6 +67,7 @@ Transports = DevDataText, PulseDetectionControl, SonarData, Temperature +Loopback Internal Messages = true [Sensors.DeepVisionOSM2] Output Data Format = IMC+DVS diff --git a/etc/lauv-seacon-2-cpu-cam.ini b/etc/lauv-seacon-2-cpu-cam.ini index 5faa56d82f..0283c42557 100644 --- a/etc/lauv-seacon-2-cpu-cam.ini +++ b/etc/lauv-seacon-2-cpu-cam.ini @@ -89,6 +89,7 @@ Transports = EntityState, LogBookEntry, LoggingControl, Temperature +Loopback Internal Messages = true [Transports.HTTP] Enabled = Always diff --git a/etc/lauv-seacon-3-aux.ini b/etc/lauv-seacon-3-aux.ini index 2bb4f7c456..3796f076c6 100644 --- a/etc/lauv-seacon-3-aux.ini +++ b/etc/lauv-seacon-3-aux.ini @@ -67,6 +67,7 @@ Transports = DevDataText, PulseDetectionControl, SonarData, Temperature +Loopback Internal Messages = true [Sensors.Klein3500] Debug Level = None diff --git a/etc/lauv-seacon-3-cpu-cam.ini b/etc/lauv-seacon-3-cpu-cam.ini index bddbae05c1..7490ae3825 100644 --- a/etc/lauv-seacon-3-cpu-cam.ini +++ b/etc/lauv-seacon-3-cpu-cam.ini @@ -89,6 +89,7 @@ Transports = EntityState, LogBookEntry, LoggingControl, Temperature +Loopback Internal Messages = true [Transports.HTTP] Enabled = Always diff --git a/etc/lauv-xplore-4-aux.ini b/etc/lauv-xplore-4-aux.ini index 6fbddba9d7..bc9cd8d07e 100644 --- a/etc/lauv-xplore-4-aux.ini +++ b/etc/lauv-xplore-4-aux.ini @@ -44,6 +44,7 @@ Entity Label = TCP to Master Server - Address = 10.0.10.150 Server - Port = 9999 Transports = RSSI +Loopback Internal Messages = true [Sensors.WifiRSSI] Enabled = Hardware diff --git a/etc/lauv-xtreme-2-aux.ini b/etc/lauv-xtreme-2-aux.ini index f2846bbfcb..7928acbe8a 100644 --- a/etc/lauv-xtreme-2-aux.ini +++ b/etc/lauv-xtreme-2-aux.ini @@ -61,6 +61,7 @@ Transports = EntityState, PulseDetectionControl, SonarData, Temperature +Loopback Internal Messages = true [Sensors.Klein3500] Debug Level = None diff --git a/etc/lauv-xtreme-2-cpu-cam.ini b/etc/lauv-xtreme-2-cpu-cam.ini index 9c129c409e..f61c39d440 100644 --- a/etc/lauv-xtreme-2-cpu-cam.ini +++ b/etc/lauv-xtreme-2-cpu-cam.ini @@ -88,6 +88,7 @@ Transports = EntityState, LogBookEntry, LoggingControl, Temperature +Loopback Internal Messages = true [Transports.HTTP] Enabled = Always diff --git a/etc/otter-aux.ini b/etc/otter-aux.ini index a0d48f7435..c576c4bd03 100644 --- a/etc/otter-aux.ini +++ b/etc/otter-aux.ini @@ -54,6 +54,7 @@ Transports = EntityState, PowerChannelState, Temperature, VehicleState +Loopback Internal Messages = true [Transports.FTP] Enabled = Always diff --git a/src/DUNE/Entities/BasicEntity.cpp b/src/DUNE/Entities/BasicEntity.cpp index 494128df06..382ef97e75 100644 --- a/src/DUNE/Entities/BasicEntity.cpp +++ b/src/DUNE/Entities/BasicEntity.cpp @@ -77,10 +77,10 @@ namespace DUNE if ((flags & DF_KEEP_TIME) == 0) msg->setTimeStamp(); - if ((flags & DF_LOOP_BACK) == 0) - m_ctx.mbus.dispatch(msg, m_owner); - else + if ((flags & DF_LOOP_BACK) || m_loopback) m_ctx.mbus.dispatch(msg); + else + m_ctx.mbus.dispatch(msg, m_owner); } } diff --git a/src/DUNE/Entities/BasicEntity.hpp b/src/DUNE/Entities/BasicEntity.hpp index 1e9ad76e13..a767797655 100644 --- a/src/DUNE/Entities/BasicEntity.hpp +++ b/src/DUNE/Entities/BasicEntity.hpp @@ -68,13 +68,20 @@ namespace DUNE BasicEntity(Tasks::AbstractTask* owner, Tasks::Context& context): m_owner(owner), m_ctx(context), - m_id(DUNE_IMC_CONST_UNK_EID) + m_id(DUNE_IMC_CONST_UNK_EID), + m_loopback(false) { } //! Destructor. virtual ~BasicEntity() { } + void + setLoopback(bool loopback) + { + m_loopback = loopback; + } + //! Set the IMC bindings using the provided recipient object. //! @param[in] recipient pointer to the recipient object to use for binding to IMC messages. virtual void @@ -192,6 +199,8 @@ namespace DUNE unsigned int m_id; //! Entity Label. std::string m_label; + //! Set loopback flag for EntityState report + bool m_loopback; }; } } diff --git a/src/DUNE/Tasks/SimpleTransport.cpp b/src/DUNE/Tasks/SimpleTransport.cpp index 8be8474a5d..a809bc3bb2 100644 --- a/src/DUNE/Tasks/SimpleTransport.cpp +++ b/src/DUNE/Tasks/SimpleTransport.cpp @@ -66,6 +66,9 @@ namespace DUNE void SimpleTransport::consume(const IMC::Message* msg) { + if (msg->getSource() != getSystemId()) + return; + if (m_rl.filter(msg)) return; @@ -86,7 +89,7 @@ namespace DUNE } if (m_gargs.trace_out) - inf(DTR("outgoing: %s"), msg->getName()); + DUNE_MSG(getName(), "outgoing: " + std::string(msg->getName())); onDataTransmission(p, n); } @@ -118,8 +121,8 @@ namespace DUNE dispatch(m, DF_KEEP_TIME | DF_KEEP_SRC_EID); if (m_gargs.trace_in) - inf(DTR("incoming: %s"), m->getName()); - + DUNE_MSG(getName(), "incoming: " + std::string(m->getName())); + delete m; } } diff --git a/src/DUNE/Tasks/Task.cpp b/src/DUNE/Tasks/Task.cpp index dfd3788a5c..d21b77bd25 100644 --- a/src/DUNE/Tasks/Task.cpp +++ b/src/DUNE/Tasks/Task.cpp @@ -88,6 +88,11 @@ namespace DUNE .defaultValue("None") .values("None, Debug, Trace, Spew"); + param(DTR_RT("Loopback Internal Messages"), m_args.loopback) + .defaultValue("false") + .description("Loopback internal messages, such as EntityState" + " and EntityParameters"); + m_recipient = new Recipient(this, ctx); m_entity = new Entities::StatefulEntity(this, m_ctx); m_entities.push_back(m_entity); @@ -228,6 +233,7 @@ namespace DUNE if (m_args.elabel != m_entity->getLabel()) m_params.set(DTR_RT("Entity Label"), m_entity->getLabel()); m_entity->setActTimes(m_args.act_time, m_args.deact_time); + m_entity->setLoopback(m_args.loopback); m_entity->reportInfo(); if (m_debug_level_string == "Debug") @@ -446,10 +452,12 @@ namespace DUNE msg->setSourceEntity(getEntityId()); } - if ((flags & DF_LOOP_BACK) == 0) - m_ctx.mbus.dispatch(msg, this); - else + if ((flags & DF_LOOP_BACK) || + m_args.loopback || + msg->getSource() != getSystemId()) m_ctx.mbus.dispatch(msg); + else + m_ctx.mbus.dispatch(msg, this); } void diff --git a/src/DUNE/Tasks/Task.hpp b/src/DUNE/Tasks/Task.hpp index c538b02eb4..b393dd9adc 100644 --- a/src/DUNE/Tasks/Task.hpp +++ b/src/DUNE/Tasks/Task.hpp @@ -785,6 +785,8 @@ namespace DUNE std::string active_scope; //! Visibility of 'Active' parameter. std::string active_visibility; + //! Loopback internal messages + bool loopback; }; //! Message recipient (queue). diff --git a/src/Transports/UDP/Listener.hpp b/src/Transports/UDP/Listener.hpp index c540977a5b..0db14b4da6 100644 --- a/src/Transports/UDP/Listener.hpp +++ b/src/Transports/UDP/Listener.hpp @@ -57,7 +57,13 @@ namespace Transports m_trace(trace), m_contacts(contact_timeout), m_lcomms(lcomms) - { } + { } + + void + setTrace(bool trace) + { + m_trace = trace; + } void getContacts(std::vector<Contact>& list) @@ -133,7 +139,7 @@ namespace Transports m_task.dispatch(msg, DF_KEEP_TIME | DF_KEEP_SRC_EID); if (m_trace) - msg->toText(std::cerr); + DUNE_MSG(m_task.getName(), "incoming: " + std::string(msg->getName())); delete msg; } diff --git a/src/Transports/UDP/Task.cpp b/src/Transports/UDP/Task.cpp index f27f26bf8e..14b6ca4ebe 100644 --- a/src/Transports/UDP/Task.cpp +++ b/src/Transports/UDP/Task.cpp @@ -229,6 +229,9 @@ namespace Transports debug("limited communications simulation is not active"); m_comm_limitations = false; } + + if (m_listener != NULL) + m_listener->setTrace(m_args.trace_in); } void @@ -321,6 +324,9 @@ namespace Transports void consume(const IMC::Message* msg) { + if (msg->getSource() != getSystemId()) + return; + if (m_lcomms->isActive()) { if (msg->getId() == DUNE_IMC_ESTIMATEDSTATE) @@ -337,7 +343,7 @@ namespace Transports return; if (m_args.trace_out) - msg->toText(std::cerr); + DUNE_MSG(getName(), "outgoing: " + std::string(msg->getName())); uint16_t rv; try