/******************************************************************************* * Copyright (c) 2010-2013, Embraer S.A., Budapest University of Technology and Economics * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Marton Bur, Abel Hegedus, Akos Horvath - initial API and implementation *******************************************************************************/ package hu.bme.mit.massif.simulink.api.adapter.port; import hu.bme.mit.massif.communication.command.MatlabCommand; import hu.bme.mit.massif.communication.command.MatlabCommandFactory; import hu.bme.mit.massif.communication.datatype.Handle; import hu.bme.mit.massif.communication.datatype.IVisitableMatlabData; import hu.bme.mit.massif.communication.datatype.MatlabString; import hu.bme.mit.massif.simulink.Block; import hu.bme.mit.massif.simulink.EnableStates; import hu.bme.mit.massif.simulink.InPort; import hu.bme.mit.massif.simulink.InPortBlock; import hu.bme.mit.massif.simulink.OutPortBlock; import hu.bme.mit.massif.simulink.Port; import hu.bme.mit.massif.simulink.PortBlock; import hu.bme.mit.massif.simulink.SimulinkFactory; import hu.bme.mit.massif.simulink.Trigger; import hu.bme.mit.massif.simulink.TriggerBlock; import hu.bme.mit.massif.simulink.TriggerType; import hu.bme.mit.massif.simulink.api.Importer; import java.util.Map; import java.util.Set; public class TriggerAdapter implements IPortAdapter { @SuppressWarnings("unchecked") @Override public Port createPort(Block parent, IVisitableMatlabData currentPortHandle, Map<Double, ? extends Port> inPorts) { InPort port = SimulinkFactory.eINSTANCE.createTrigger(); parent.getPorts().add(port); ((Map<Double, InPort>) inPorts).put(Handle.getHandleData(currentPortHandle), port); return port; } @Override public PortBlock connectToBlock(Port port, IVisitableMatlabData portHandle, Integer portNum, Set<InPortBlock> inPortBlockSet, Set<OutPortBlock> outPortBlockSet, Importer traverser) { // The type is known more specifically Trigger trigger = (Trigger) port; MatlabCommandFactory commandFactory = traverser.getCommandFactory(); // In the following Enable port specific setting is set // They should be set, even the internal blocks are not processed, // so that the corresponding EnablePort block is queried from MATLAB directly // Retrieve the name of the port's parent (the block to whom belongs the port) MatlabCommand getPortParentName = commandFactory.getParam().addParam(portHandle).addParam("Parent"); String portParentName = MatlabString.getMatlabStringData(getPortParentName.execute()); // Get the TiggerPort block's handle - this sould exist, while there was an enable port on // the parent MatlabCommand findTriggerPortBlockHandle = commandFactory.findSystem().addParam(portParentName).addParam("SearchDepth").addParam(1.0) .addParam("LookUnderMasks").addParam("all").addParam("FindAll").addParam("on").addParam("BlockType") .addParam("TriggerPort"); IVisitableMatlabData triggerPortBlockHandle = findTriggerPortBlockHandle.execute(); // Query states when enabling parameter MatlabCommand getStatesWhenEnabling = commandFactory.getParam().addParam(triggerPortBlockHandle).addParam("StatesWhenEnabling"); String statesWhenEnabling = MatlabString.getMatlabStringData(getStatesWhenEnabling.execute()); trigger.setStatesWhenEnabling(EnableStates.getByName(statesWhenEnabling.toUpperCase())); // Query trigger type from the trigger block MatlabCommand getTriggerType = commandFactory.getParam().addParam(triggerPortBlockHandle).addParam("TriggerType"); String triggerType = MatlabString.getMatlabStringData(getTriggerType.execute()); trigger.setTriggerType(TriggerType.getByName(triggerType.toUpperCase())); PortBlock portBlock = null; for (InPortBlock inPortBlock : (Set<InPortBlock>) inPortBlockSet) { if (inPortBlock instanceof TriggerBlock) { portBlock = inPortBlock; } } return portBlock; } }