From bf57a32b36678bf404304e9e945255e84f12d3d4 Mon Sep 17 00:00:00 2001 From: Ale Battisti Date: Thu, 24 Nov 2016 10:45:40 +0100 Subject: [PATCH 01/46] Renamed several attributes, removed LinkMode --- .../java/eu/fbk/mpba/sensorsflows/Flow.java | 141 ++++++++++++++++ .../java/eu/fbk/mpba/sensorsflows/Input.java | 12 ++ .../eu/fbk/mpba/sensorsflows/LinkMode.java | 17 -- .../fbk/mpba/sensorsflows/NodeDecorator.java | 24 +-- .../eu/fbk/mpba/sensorsflows/NodePlugin.java | 12 -- .../java/eu/fbk/mpba/sensorsflows/Output.java | 19 +++ ...utputDecorator.java => OutputManager.java} | 36 ++--- .../fbk/mpba/sensorsflows/OutputPlugin.java | 19 --- .../mpba/sensorsflows/SensorComponent.java | 149 ----------------- .../{FlowsMan.java => SensorFlow.java} | 153 +++++++++--------- .../mpba/sensorsflows/base/IFlowCallback.java | 15 ++ .../fbk/mpba/sensorsflows/base/IOutput.java | 2 +- .../fbk/mpba/sensorsflows/base/ISensor.java | 8 +- .../base/ISensorDataCallback.java | 15 -- ...oTimestampSource.java => ITimeSource.java} | 2 +- .../sensorsflows/base/IUserInterface.java | 4 +- 16 files changed, 297 insertions(+), 331 deletions(-) create mode 100644 src/main/java/eu/fbk/mpba/sensorsflows/Flow.java create mode 100644 src/main/java/eu/fbk/mpba/sensorsflows/Input.java delete mode 100644 src/main/java/eu/fbk/mpba/sensorsflows/LinkMode.java delete mode 100644 src/main/java/eu/fbk/mpba/sensorsflows/NodePlugin.java create mode 100644 src/main/java/eu/fbk/mpba/sensorsflows/Output.java rename src/main/java/eu/fbk/mpba/sensorsflows/{OutputDecorator.java => OutputManager.java} (80%) delete mode 100644 src/main/java/eu/fbk/mpba/sensorsflows/OutputPlugin.java delete mode 100644 src/main/java/eu/fbk/mpba/sensorsflows/SensorComponent.java rename src/main/java/eu/fbk/mpba/sensorsflows/{FlowsMan.java => SensorFlow.java} (74%) create mode 100644 src/main/java/eu/fbk/mpba/sensorsflows/base/IFlowCallback.java delete mode 100644 src/main/java/eu/fbk/mpba/sensorsflows/base/ISensorDataCallback.java rename src/main/java/eu/fbk/mpba/sensorsflows/base/{IMonoTimestampSource.java => ITimeSource.java} (86%) diff --git a/src/main/java/eu/fbk/mpba/sensorsflows/Flow.java b/src/main/java/eu/fbk/mpba/sensorsflows/Flow.java new file mode 100644 index 00000000..6908453d --- /dev/null +++ b/src/main/java/eu/fbk/mpba/sensorsflows/Flow.java @@ -0,0 +1,141 @@ +package eu.fbk.mpba.sensorsflows; + +import java.util.ArrayList; +import java.util.List; +import java.util.TreeSet; + +import eu.fbk.mpba.sensorsflows.base.ITimeSource; +import eu.fbk.mpba.sensorsflows.base.ISensor; +import eu.fbk.mpba.sensorsflows.base.IFlowCallback; +import eu.fbk.mpba.sensorsflows.base.SensorStatus; +import eu.fbk.mpba.sensorsflows.util.ReadOnlyIterable; + +/** + * This class adds internal support for the library data-paths. + */ +public abstract class Flow implements ISensor { + protected Input _parent = null; + protected List, TimeT, ValueT>> _handler = new ArrayList<>(); + protected TreeSet> _outputs = new TreeSet<>(); + + private boolean mMuted = true; + protected SensorStatus mStatus = SensorStatus.OFF; + private static long _bootTime = System.currentTimeMillis() * 1_000_000L - System.nanoTime(); + private static ITimeSource _time = new ITimeSource() { + + @Override + public long getMonoUTCNanos() { + return System.nanoTime() + _bootTime; + } + + @Override + public long getMonoUTCNanos(long realTimeNanos) { + return realTimeNanos + _bootTime; + } + + @Override + public long getMonoUTCMillis() { + return getMonoUTCNanos() / 1_000_000; + } + + @Override + public long getMonoUTCMillis(long realTimeNanos) { + return getMonoUTCNanos(realTimeNanos) / 1_000_000; + } + }; + + protected Flow(Input parent) { + _parent = parent; + } + + void addOutput(OutputManager _output) { + _outputs.add(_output); + } + + void addHandler(IFlowCallback, TimeT, ValueT> man) { + _handler.add(man); + } + + void removeHandler(IFlowCallback, TimeT, ValueT> man) { + _handler.remove(man); + } + + Iterable> getOutputs() { + return new ReadOnlyIterable<>(_outputs.iterator()); + } + + // Managed protected getters setters + + protected void changeStatus(SensorStatus state) { + for (IFlowCallback, TimeT, ValueT> i : _handler) { +// if (i instanceof SensorFlow && ((SensorFlow)i).getStatus() == EngineStatus.CLOSED) +// _handler.remove(i); + i.onStatusChanged(this, null, mStatus = state); + } + } + + /** + * Unregisters every outputDecorator + */ + public void close() { + _handler.clear(); + _outputs.clear(); + } + + @Override + protected void finalize() throws Throwable { + close(); + super.finalize(); + } + + // Managed Overrides + + public Input getParentInput() { + return _parent; + } + + @Override + public SensorStatus getStatus() { + return mStatus; + } + + public String getName() { + return this.getClass().getSimpleName(); + } + + public static ITimeSource getTimeSource() { + return _time; + } + + // Notify methods + + public void onValue(TimeT time, ValueT value) { + for (IFlowCallback, TimeT, ValueT> i : _handler) { +// if (i instanceof SensorFlow && ((SensorFlow)i).getStatus() == EngineStatus.CLOSED) +// _handler.remove(i); + i.onValue(this, time, value); + } + } + + public void onEvent(TimeT time, int type, String message) { + for (IFlowCallback, TimeT, ValueT> i : _handler) { +// if (i instanceof SensorFlow && ((SensorFlow)i).getStatus() == EngineStatus.CLOSED) +// _handler.remove(i); + i.onEvent(this, time, type, message); + } + } + + // Listening + + public boolean isMuted() { + return mMuted; + } + + public void setMuted(boolean muted) { + this.mMuted = muted; + } + + // To implement + + public abstract List getHeader(); +} diff --git a/src/main/java/eu/fbk/mpba/sensorsflows/Input.java b/src/main/java/eu/fbk/mpba/sensorsflows/Input.java new file mode 100644 index 00000000..a29146d0 --- /dev/null +++ b/src/main/java/eu/fbk/mpba/sensorsflows/Input.java @@ -0,0 +1,12 @@ +package eu.fbk.mpba.sensorsflows; + +import eu.fbk.mpba.sensorsflows.base.IPlugin; + +public interface Input extends IPlugin { + + void onInputStart(); + + void onInputStop(); + + Iterable> getFlows(); +} diff --git a/src/main/java/eu/fbk/mpba/sensorsflows/LinkMode.java b/src/main/java/eu/fbk/mpba/sensorsflows/LinkMode.java deleted file mode 100644 index 8b0bb915..00000000 --- a/src/main/java/eu/fbk/mpba/sensorsflows/LinkMode.java +++ /dev/null @@ -1,17 +0,0 @@ -package eu.fbk.mpba.sensorsflows; - -public enum LinkMode { - /** - * Uses the links specified through the {@code addLink} method. - */ - MANUAL, - /** - * Links each sensor to each output. - */ - PRODUCT, - /** - * Links each nth element of the longest collection between sensors and outputs to the nth - * element of the other. When the length is not the same the modulo operation is used. - */ - NTH_TO_NTH -} diff --git a/src/main/java/eu/fbk/mpba/sensorsflows/NodeDecorator.java b/src/main/java/eu/fbk/mpba/sensorsflows/NodeDecorator.java index a2cbcad0..59b7a30c 100644 --- a/src/main/java/eu/fbk/mpba/sensorsflows/NodeDecorator.java +++ b/src/main/java/eu/fbk/mpba/sensorsflows/NodeDecorator.java @@ -6,13 +6,13 @@ /** * This class adds internal support for the library data-paths. */ -class NodeDecorator implements INode> { - private FlowsMan _manager = null; +class NodeDecorator implements INode> { + private SensorFlow _manager = null; private DeviceStatus _status = DeviceStatus.NOT_INITIALIZED; - private NodePlugin _nodePlugin; + private Input _input; - NodeDecorator(NodePlugin nodePlugin, FlowsMan manager) { - _nodePlugin = nodePlugin; + NodeDecorator(Input input, SensorFlow manager) { + _input = input; _manager = manager; } @@ -24,19 +24,19 @@ protected void changeStatus(DeviceStatus s) { @Override public void initializeNode() { changeStatus(DeviceStatus.INITIALIZING); - _nodePlugin.inputPluginStart(); + _input.onInputStart(); changeStatus(DeviceStatus.INITIALIZED); } @Override - public Iterable> getSensors() { - return _nodePlugin.getSensors(); + public Iterable> getSensors() { + return _input.getFlows(); } @Override public void finalizeNode() { changeStatus(DeviceStatus.FINALIZING); - _nodePlugin.inputPluginStop(); + _input.onInputStop(); changeStatus(DeviceStatus.FINALIZED); } @@ -47,11 +47,11 @@ public DeviceStatus getStatus() { return _status; } - FlowsMan getManager() { + SensorFlow getManager() { return _manager; } - NodePlugin getPlugIn() { - return _nodePlugin; + Input getPlugIn() { + return _input; } } diff --git a/src/main/java/eu/fbk/mpba/sensorsflows/NodePlugin.java b/src/main/java/eu/fbk/mpba/sensorsflows/NodePlugin.java deleted file mode 100644 index 7b2e52da..00000000 --- a/src/main/java/eu/fbk/mpba/sensorsflows/NodePlugin.java +++ /dev/null @@ -1,12 +0,0 @@ -package eu.fbk.mpba.sensorsflows; - -import eu.fbk.mpba.sensorsflows.base.IPlugin; - -public interface NodePlugin extends IPlugin { - - void inputPluginStart(); - - void inputPluginStop(); - - Iterable> getSensors(); -} diff --git a/src/main/java/eu/fbk/mpba/sensorsflows/Output.java b/src/main/java/eu/fbk/mpba/sensorsflows/Output.java new file mode 100644 index 00000000..27fe0616 --- /dev/null +++ b/src/main/java/eu/fbk/mpba/sensorsflows/Output.java @@ -0,0 +1,19 @@ +package eu.fbk.mpba.sensorsflows; + +import java.util.List; + +import eu.fbk.mpba.sensorsflows.base.ISensor; +import eu.fbk.mpba.sensorsflows.base.IPlugin; +import eu.fbk.mpba.sensorsflows.base.SensorDataEntry; +import eu.fbk.mpba.sensorsflows.base.SensorEventEntry; + +public interface Output extends IPlugin { + + void onOutputStart(Object sessionTag, List streamingSensors); + + void onOutputStop(); + + void onEvent(SensorEventEntry event); + + void onValue(SensorDataEntry data); +} diff --git a/src/main/java/eu/fbk/mpba/sensorsflows/OutputDecorator.java b/src/main/java/eu/fbk/mpba/sensorsflows/OutputManager.java similarity index 80% rename from src/main/java/eu/fbk/mpba/sensorsflows/OutputDecorator.java rename to src/main/java/eu/fbk/mpba/sensorsflows/OutputManager.java index da87ad79..f9797b68 100644 --- a/src/main/java/eu/fbk/mpba/sensorsflows/OutputDecorator.java +++ b/src/main/java/eu/fbk/mpba/sensorsflows/OutputManager.java @@ -1,7 +1,7 @@ package eu.fbk.mpba.sensorsflows; import java.util.ArrayList; -import java.util.List; +import java.util.TreeSet; import java.util.concurrent.ArrayBlockingQueue; import eu.fbk.mpba.sensorsflows.base.IOutput; @@ -16,22 +16,22 @@ * This class adds internal support for the library data-paths. * Polls but has a fixed sleep time in the case that each queue is empty. */ -class OutputDecorator implements IOutput { +class OutputManager implements IOutput { private IOutputCallback _manager = null; private boolean _stopPending = false; private OutputStatus _status = OutputStatus.NOT_INITIALIZED; private Object sessionTag = "unspecified"; - private OutputPlugin outputPlugIn; - private List linkedSensors; + private Output outputPlugIn; + private TreeSet linkedSensors; private ArrayBlockingQueue> _eventsQueue; private ArrayBlockingQueue> _dataQueue; private boolean enabled = true; - protected OutputDecorator(OutputPlugin output, IOutputCallback manager) { + protected OutputManager(Output output, IOutputCallback manager) { _manager = manager; - linkedSensors = new ArrayList<>(); + linkedSensors = new TreeSet<>(); outputPlugIn = output; int dataQueueCapacity = 100; int eventsQueueCapacity = 50; @@ -44,10 +44,10 @@ protected OutputDecorator(OutputPlugin output, IOutputCallback(linkedSensors)); changeStatus(OutputStatus.INITIALIZED); dispatchLoopWhileNotStopPending(); - outputPlugIn.outputPluginStop(); + outputPlugIn.onOutputStop(); changeStatus(OutputStatus.FINALIZED); } }); @@ -59,9 +59,9 @@ private void dispatchLoopWhileNotStopPending() { data = _dataQueue.poll(); event = _eventsQueue.poll(); if (data != null) - outputPlugIn.newSensorData(data); + outputPlugIn.onValue(data); if (event != null) - outputPlugIn.newSensorEvent(event); + outputPlugIn.onEvent(event); else if (data == null) if (_stopPending) break; @@ -86,7 +86,7 @@ private void changeStatus(OutputStatus s) { public void initializeOutput(Object sessionTag) { this.sessionTag = sessionTag; changeStatus(OutputStatus.INITIALIZING); - // outputPlugIn.outputPluginStart(...) in _thread + // outputPlugIn.onOutputStart(...) in _thread _thread.start(); } @@ -102,33 +102,33 @@ public void finalizeOutput() { } @Override - public void sensorStatusChanged(ISensor sensor, TimeT time, SensorStatus state) { + public void onStatusChanged(ISensor sensor, TimeT time, SensorStatus state) { } @Override - public void sensorEvent(ISensor sensor, TimeT time, int type, String message) { + public void onEvent(ISensor sensor, TimeT time, int type, String message) { try { // FIXME WARN Locks the sensor's thread _eventsQueue.put(new SensorEventEntry<>(sensor, time, type, message)); } catch (InterruptedException e) { -// Log.w(LOG_TAG, "InterruptedException in OutputImpl.sensorEvent() find-me:924nj89f8j2"); +// Log.w(LOG_TAG, "InterruptedException in OutputImpl.onEvent() find-me:924nj89f8j2"); } } @Override - public void sensorValue(ISensor sensor, TimeT time, ValueT value) { + public void onValue(ISensor sensor, TimeT time, ValueT value) { try { // FIXME WARN Locks the sensor's thread SensorDataEntry a = new SensorDataEntry<>(sensor, time, value); _dataQueue.put(a); } catch (InterruptedException e) { -// Log.w(LOG_TAG, "InterruptedException in OutputImpl.sensorValue() find-me:24bhi5ti89"); +// Log.w(LOG_TAG, "InterruptedException in OutputImpl.onValue() find-me:24bhi5ti89"); } } // Setters - public void addSensor(ISensor s) { + public void addFlow(ISensor s) { linkedSensors.add(s); } @@ -139,7 +139,7 @@ public OutputStatus getStatus() { return _status; } - OutputPlugin getPlugIn() { + Output getOutput() { return outputPlugIn; } diff --git a/src/main/java/eu/fbk/mpba/sensorsflows/OutputPlugin.java b/src/main/java/eu/fbk/mpba/sensorsflows/OutputPlugin.java deleted file mode 100644 index cc8f0fa3..00000000 --- a/src/main/java/eu/fbk/mpba/sensorsflows/OutputPlugin.java +++ /dev/null @@ -1,19 +0,0 @@ -package eu.fbk.mpba.sensorsflows; - -import java.util.List; - -import eu.fbk.mpba.sensorsflows.base.ISensor; -import eu.fbk.mpba.sensorsflows.base.IPlugin; -import eu.fbk.mpba.sensorsflows.base.SensorDataEntry; -import eu.fbk.mpba.sensorsflows.base.SensorEventEntry; - -public interface OutputPlugin extends IPlugin { - - void outputPluginStart(Object sessionTag, List streamingSensors); - - void outputPluginStop(); - - void newSensorEvent(SensorEventEntry event); - - void newSensorData(SensorDataEntry data); -} diff --git a/src/main/java/eu/fbk/mpba/sensorsflows/SensorComponent.java b/src/main/java/eu/fbk/mpba/sensorsflows/SensorComponent.java deleted file mode 100644 index 169740ba..00000000 --- a/src/main/java/eu/fbk/mpba/sensorsflows/SensorComponent.java +++ /dev/null @@ -1,149 +0,0 @@ -package eu.fbk.mpba.sensorsflows; - -import java.util.ArrayList; -import java.util.List; - -import eu.fbk.mpba.sensorsflows.base.IMonoTimestampSource; -import eu.fbk.mpba.sensorsflows.base.ISensor; -import eu.fbk.mpba.sensorsflows.base.ISensorDataCallback; -import eu.fbk.mpba.sensorsflows.base.SensorStatus; -import eu.fbk.mpba.sensorsflows.util.ReadOnlyIterable; - -/** - * This class adds internal support for the library data-paths. - */ -public abstract class SensorComponent implements ISensor { - protected NodePlugin _parent = null; - protected List, TimeT, ValueT>> _handler = new ArrayList<>(); - protected ArrayList> _outputs = new ArrayList<>(); - - protected SensorComponent(NodePlugin parent) { - _parent = parent; - } - - private int mForwardedMessages = 0; - private boolean mListened = true; - protected SensorStatus mStatus = SensorStatus.OFF; - - private static long _bootTime = System.currentTimeMillis() * 1_000_000L - System.nanoTime(); - - private static IMonoTimestampSource _time = new IMonoTimestampSource() { - - @Override - public long getMonoUTCNanos() { - return System.nanoTime() + _bootTime; - } - - @Override - public long getMonoUTCNanos(long realTimeNanos) { - return realTimeNanos + _bootTime; - } - - @Override - public long getMonoUTCMillis() { - return getMonoUTCNanos() / 1_000_000; - } - - @Override - public long getMonoUTCMillis(long realTimeNanos) { - return getMonoUTCNanos(realTimeNanos) / 1_000_000; - } - }; - - void addOutput(OutputDecorator _output) { - _outputs.add(_output); - } - - void registerManager(ISensorDataCallback, TimeT, ValueT> man) { - _handler.add(man); - } - - void unregisterManager(ISensorDataCallback, TimeT, ValueT> man) { - _handler.remove(man); - } - - Iterable> getOutputs() { - return new ReadOnlyIterable<>(_outputs.iterator()); - } - - // Managed protected getters setters - - protected void changeStatus(SensorStatus state) { - for (ISensorDataCallback, TimeT, ValueT> i : _handler) { -// if (i instanceof FlowsMan && ((FlowsMan)i).getStatus() == EngineStatus.CLOSED) -// _handler.remove(i); - i.sensorStatusChanged(this, null, mStatus = state); - } - } - - /** - * Unregisters every outputDecorator - */ - public void close() { - _handler.clear(); - _outputs.clear(); - } - - @Override - protected void finalize() throws Throwable { - close(); - super.finalize(); - } - - // Managed Overrides - - public NodePlugin getParentDevicePlugin() { - return _parent; - } - - @Override - public SensorStatus getStatus() { - return mStatus; - } - - public String getName() { - return this.getClass().getSimpleName(); - } - - public static IMonoTimestampSource getSTime() { - return _time; - } - - public IMonoTimestampSource getTime() { - return _time; - } - - // Notify methods - - public void sensorValue(TimeT time, ValueT value) { - for (ISensorDataCallback, TimeT, ValueT> i : _handler) { -// if (i instanceof FlowsMan && ((FlowsMan)i).getStatus() == EngineStatus.CLOSED) -// _handler.remove(i); - i.sensorValue(this, time, value); - } - mForwardedMessages++; - } - - public void sensorEvent(TimeT time, int type, String message) { - for (ISensorDataCallback, TimeT, ValueT> i : _handler) { -// if (i instanceof FlowsMan && ((FlowsMan)i).getStatus() == EngineStatus.CLOSED) -// _handler.remove(i); - i.sensorEvent(this, time, type, message); - } - mForwardedMessages++; - } - - // Listenage - - public boolean isListened() { - return mListened; - } - - public void setListened(boolean listened) { - this.mListened = listened; - } - - // To implement - - public abstract List getValueDescriptor(); -} diff --git a/src/main/java/eu/fbk/mpba/sensorsflows/FlowsMan.java b/src/main/java/eu/fbk/mpba/sensorsflows/SensorFlow.java similarity index 74% rename from src/main/java/eu/fbk/mpba/sensorsflows/FlowsMan.java rename to src/main/java/eu/fbk/mpba/sensorsflows/SensorFlow.java index ceb7d524..6721baba 100644 --- a/src/main/java/eu/fbk/mpba/sensorsflows/FlowsMan.java +++ b/src/main/java/eu/fbk/mpba/sensorsflows/SensorFlow.java @@ -12,22 +12,22 @@ import eu.fbk.mpba.sensorsflows.base.IDeviceCallback; import eu.fbk.mpba.sensorsflows.base.IOutput; import eu.fbk.mpba.sensorsflows.base.IOutputCallback; -import eu.fbk.mpba.sensorsflows.base.ISensorDataCallback; +import eu.fbk.mpba.sensorsflows.base.IFlowCallback; import eu.fbk.mpba.sensorsflows.base.IUserInterface; import eu.fbk.mpba.sensorsflows.base.OutputStatus; import eu.fbk.mpba.sensorsflows.base.SensorStatus; /** - * FlowsMan is the class that represents the engine of the library. + * SensorFlow is the class that represents the engine of the library. * This is the only interface that the user should use. * Implementation of the IUserInterface * @param The type of the timestamp returned by the outputs (must be the same for every item). * @param The type of the value returned by the devices (must be the same for every item). */ -public class FlowsMan implements - IUserInterface, SensorComponent, OutputPlugin>, +public class SensorFlow implements + IUserInterface, Flow, Output>, IDeviceCallback>, - ISensorDataCallback, TimeT, ValueT>, + IFlowCallback, TimeT, ValueT>, IOutputCallback { // Status Interface @@ -51,7 +51,7 @@ public void deviceStatusChanged(NodeDecorator sender, DeviceStatus state) { } } if (_outputsToInit == null) - // FIXME WARN User-code timestamp dependency in the output thread or son + // FIXME WARN User-code timestamp dependency in the output thread or child changeStatus(EngineStatus.STREAMING); } // TODO 7 Manage the other states @@ -89,7 +89,7 @@ public void outputStatusChanged(IOutput sender, OutputStatus stat * @param state arg */ @Override - public void sensorStatusChanged(SensorComponent sender, TimeT time, SensorStatus state) { + public void onStatusChanged(Flow sender, TimeT time, SensorStatus state) { // TODO 3 Implement an 'internal device' with an 'internal sensor' for log utilities. // The sensor has to send also an event on a status change. } @@ -105,12 +105,12 @@ public void sensorStatusChanged(SensorComponent sender, TimeT tim * @param value value */ @Override - public void sensorValue(SensorComponent sender, TimeT time, ValueT value) { - if (sender.isListened() && !_paused) { - for (OutputDecorator o : sender.getOutputs()) { + public void onValue(Flow sender, TimeT time, ValueT value) { + if (!sender.isMuted() && !_paused) { + for (OutputManager o : sender.getOutputs()) { if (o.isEnabled()) //noinspection unchecked - o.sensorValue(sender, time, value); + o.onValue(sender, time, value); } } } @@ -123,12 +123,12 @@ public void sensorValue(SensorComponent sender, TimeT time, Value * @param message message text */ @Override - public void sensorEvent(SensorComponent sender, TimeT time, int type, String message) { - if (sender.isListened() && !_paused) { - for (OutputDecorator o : sender.getOutputs()) { + public void onEvent(Flow sender, TimeT time, int type, String message) { + if (!sender.isMuted() && !_paused) { + for (OutputManager o : sender.getOutputs()) { if (o.isEnabled()) //noinspection unchecked - o.sensorEvent(sender, time, type, message); + o.onEvent(sender, time, type, message); } } } @@ -141,7 +141,6 @@ public void sensorEvent(SensorComponent sender, TimeT time, int t final String _emAlreadyRendered = "The engine is initialized. No inputs, outputs or links can be added now."; final String _itemsToInitLock = "_itemsToInitLock"; - private LinkMode _linkMode = LinkMode.PRODUCT; private String sessionTag = ""; protected EngineStatus _status = EngineStatus.STANDBY; protected boolean _paused = false; @@ -149,22 +148,22 @@ public void sensorEvent(SensorComponent sender, TimeT time, int t // maybe key, value protected Map> _userDevices = new TreeMap<>(); - protected Map> _userOutputs = new TreeMap<>(); + protected Map> _userOutputs = new TreeMap<>(); protected List _devicesToInit = new ArrayList<>(); // null protected List _outputsToInit = new ArrayList<>(); // null - protected EventCallback, SensorComponent, OutputPlugin> + protected EventCallback, Flow, Output> , EngineStatus> _onStatusChanged = null; // null - protected EventCallback, DeviceStatus> _onDeviceStatusChanged = null; // null - protected EventCallback, OutputStatus> _onOutputStatusChanged = null; // null + protected EventCallback, DeviceStatus> _onDeviceStatusChanged = null; // null + protected EventCallback, OutputStatus> _onOutputStatusChanged = null; // null // Engine implementation /** * Default constructor. */ - public FlowsMan() { + public SensorFlow() { changeStatus(EngineStatus.STANDBY); } @@ -184,23 +183,23 @@ public void setSessionTag(String sessionTag) { /** * Adds a device to the enumeration, this is to be used before the {@code start} call, before the internal IO-map rendering. * - * @param node Device to add. + * @param input Device to add. */ @Override - public void addInput(NodePlugin node) { + public void addInput(Input input) { if (_status == EngineStatus.STANDBY) { // Check if only the name is already contained - if (!_userDevices.containsKey(node.getName())) { - _userDevices.put(node.getName(), new NodeDecorator<>(node, this)); - for (SensorComponent s : node.getSensors()) - s.registerManager(this); + if (!_userDevices.containsKey(input.getName())) { + _userDevices.put(input.getName(), new NodeDecorator<>(input, this)); + for (Flow s : input.getFlows()) + s.addHandler(this); } } else throw new UnsupportedOperationException(_emAlreadyRendered); } @Override - public NodePlugin getInput(String name) { + public Input getInput(String name) { Object r = _userDevices.get(name); //noinspection unchecked return r == null ? null : ((NodeDecorator)r).getPlugIn(); @@ -213,10 +212,10 @@ public NodePlugin getInput(String name) { * @param toOutput Output channel. */ @Override - public void addLink(SensorComponent fromSensor, OutputPlugin toOutput) { + public void addLink(Flow fromSensor, Output toOutput) { // Manual indexOf for performance - for (OutputDecorator outMan : _userOutputs.values()) - if (toOutput == outMan.getPlugIn()) { // for reference, safe + for (OutputManager outMan : _userOutputs.values()) + if (toOutput == outMan.getOutput()) { // for reference, safe addLink(fromSensor, outMan); break; } @@ -225,25 +224,25 @@ public void addLink(SensorComponent fromSensor, OutputPlugin