diff --git a/src/components/experiment-list/simulation-details.js b/src/components/experiment-list/simulation-details.js index 7463816c41f72cdd0c39a19971c1f2342672a628..fba5b183b81a0a1ea8f12d6627f8a84ca674a9ea 100644 --- a/src/components/experiment-list/simulation-details.js +++ b/src/components/experiment-list/simulation-details.js @@ -53,7 +53,10 @@ class SimulationDetails extends React.Component { * Opens experiment workbench and sets the running simulation ID in ExperimentWorkbenchService */ joinSimulation(simulationInfo) { - ExperimentWorkbenchService.instance.simulationID = simulationInfo.runningSimulation.simulationID; + ExperimentWorkbenchService.instance.simulationInfo = { + ID: simulationInfo.runningSimulation.simulationID, + MQTTPrefix: simulationInfo.runningSimulation.MQTTPrefix + }; ServerResourcesService.instance.getServerConfig(simulationInfo.server).then((serverConfig) => { ExperimentWorkbenchService.instance.serverURL = serverConfig['nrp-services']; this.props.history.push({ diff --git a/src/components/experiment-workbench/experiment-time-box.js b/src/components/experiment-workbench/experiment-time-box.js index f2694f01853c8147d458646fed2da2c78378b960..1fb36b54b9600d92a890ad1c74c41980bada73f2 100644 --- a/src/components/experiment-workbench/experiment-time-box.js +++ b/src/components/experiment-workbench/experiment-time-box.js @@ -32,7 +32,6 @@ export default class ExperimentTimeBox extends React.Component { break; } this.state = { - simulationID: undefined, timeToken: null, simulationTime: undefined }; diff --git a/src/components/experiment-workbench/experiment-workbench-service.js b/src/components/experiment-workbench/experiment-workbench-service.js index dc8817c6528a2a4bd9d7d1642cf57af2be3e62f9..4a9edc07d3812bd5ebe107089f468baf250c0437 100644 --- a/src/components/experiment-workbench/experiment-workbench-service.js +++ b/src/components/experiment-workbench/experiment-workbench-service.js @@ -15,7 +15,7 @@ class ExperimentWorkbenchService extends EventEmitter { if (enforcer !== SINGLETON_ENFORCER) { throw new Error('Use ' + this.constructor.name + '.instance'); } - this._simulationID = undefined; + this._simulationInfo = undefined; this._serverURL = undefined; this._errorToken = undefined; this._statusToken = undefined; @@ -53,17 +53,23 @@ class ExperimentWorkbenchService extends EventEmitter { console.info(['ExperimentWorkbenchService - serverURL', this._serverURL]); } - get simulationID() { - return this._simulationID; + /** + * Returns the simulation MQTT description + * @returns {object} the simulation info + * @returns {string} simulationInfo.ID the simulation ID + * @returns {string} simulationInfo.MQTTPrefix the simulation MQTT Prefix + */ + get simulationInfo() { + return this._simulationInfo; } - set simulationID(simulationID) { - this._simulationID = simulationID; - console.info(['ExperimentWorkbenchService - simulationID', this._simulationID]); + set simulationInfo(simulationInfo) { + this._simulationInfo = simulationInfo; + console.info(['ExperimentWorkbenchService - simulationInfo', this._simulationInfo]); ExperimentWorkbenchService.instance.emit( ExperimentWorkbenchService.EVENTS.SIMULATION_SET, - this._simulationID + this._simulationInfo ); - this.setTopics(this._simulationID); + this.setTopics(this._simulationInfo); } /** @@ -74,7 +80,7 @@ class ExperimentWorkbenchService extends EventEmitter { return MqttClientService.instance.isConnected(); } - setTopics = (simulationID) => { + setTopics = (simulationInfo) => { if (this._errorToken) { MqttClientService.instance.unsubscribe(this._errorToken); this._errorToken = undefined; @@ -83,9 +89,11 @@ class ExperimentWorkbenchService extends EventEmitter { MqttClientService.instance.unsubscribe(this._statusToken); this._statusToken = undefined; } - if (simulationID !== undefined) { - const topicBase = MqttClientService.instance.getConfig().mqtt.topics.base + '/' - + simulationID + '/'; + if (simulationInfo !== undefined) { + const mqttTopics = MqttClientService.instance.getConfig().mqtt.topics; + const topicBase = simulationInfo.MQTTPrefix ? + simulationInfo.MQTTPrefix + '/' + mqttTopics.base + '/' + simulationInfo.ID + '/' : + mqttTopics.base + '/' + simulationInfo.ID + '/'; // assign error MQTT topic const errorTopic = topicBase + MqttClientService.instance.getConfig().mqtt.topics.errors; const errorToken = MqttClientService.instance.subscribeToTopic(errorTopic, this.errorMsgHandler); diff --git a/src/components/experiment-workbench/experiment-workbench.js b/src/components/experiment-workbench/experiment-workbench.js index 3fbe88c88f5bf88584934b1bde37b5c54fae57f9..58bbed9ed9e5336101691900302180631776a96a 100644 --- a/src/components/experiment-workbench/experiment-workbench.js +++ b/src/components/experiment-workbench/experiment-workbench.js @@ -212,7 +212,9 @@ class ExperimentWorkbench extends React.Component { async componentDidMount() { // Get the simulation ID from ExperimentWorkbenchService, if is defined (for joining the simulation) - this.state.runningSimulationID = ExperimentWorkbenchService.instance.simulationID; + if (ExperimentWorkbenchService.instance.simulationInfo !== undefined) { + this.state.runningSimulationID = ExperimentWorkbenchService.instance.simulationInfo.ID; + } // Update simulation state, if it is defined if (this.state.runningSimulationID !== undefined) { @@ -255,7 +257,7 @@ class ExperimentWorkbench extends React.Component { this.onUpdateServerAvailability ); // Remove the simulation when we leave the workbench - ExperimentWorkbenchService.instance.simulationID = undefined; + ExperimentWorkbenchService.instance.simulationInfo = undefined; } /** @@ -283,9 +285,9 @@ class ExperimentWorkbench extends React.Component { DialogService.instance.progressNotification({ message: 'The experiment is ' + this.state.simulationState }); - // clear simulationID for the finilized experiments + // clear simulationInfo for the finilized experiments if (EXPERIMENT_FINAL_STATE.includes(this.state.simulationState)) { - ExperimentWorkbenchService.instance.simulationID = undefined; + ExperimentWorkbenchService.instance.simulationInfo = undefined; this.setState({ runningSimulationID: undefined }); } } @@ -320,7 +322,10 @@ class ExperimentWorkbench extends React.Component { const simInfo = await simRespose['simulation'].json(); // TODO: get proper simulation information if (simInfo) { - ExperimentWorkbenchService.instance.simulationID = simInfo.simulationID; + ExperimentWorkbenchService.instance.simulationInfo = { + ID: simInfo.simulationID, + MQTTPrefix: simInfo.MQTTPrefix + }; this.setState({ runningSimulationID: simInfo.simulationID }); // get the simulationState from MQTT only this.setState({ simStateLoading: true }); @@ -361,7 +366,7 @@ class ExperimentWorkbench extends React.Component { await this.setSimulationState(newState).then(() => { if (this.state.simulationState === EXPERIMENT_STATE.STOPPED) { this.setState({ runningSimulationID: undefined }); - ExperimentWorkbenchService.instance.simulationID = undefined; + ExperimentWorkbenchService.instance.simulationInfo = undefined; } }); } @@ -379,8 +384,8 @@ class ExperimentWorkbench extends React.Component { if (simInfo.state === EXPERIMENT_STATE.STOPPED) { this.setState({ simulationState: simInfo.state }); this.setState({ simStateLoading: false }); - // clear simulationID for the finilized experiments - ExperimentWorkbenchService.instance.simulationID = undefined; + // clear simulationInfo for the finilized experiments + ExperimentWorkbenchService.instance.simulationInfo = undefined; this.setState({ runningSimulationID: undefined }); } });