/******************************************************************************* * 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.block; import hu.bme.mit.massif.communication.command.MatlabCommand; import hu.bme.mit.massif.communication.command.MatlabCommandFactory; import hu.bme.mit.massif.communication.datatype.CellMatlabData; import hu.bme.mit.massif.communication.datatype.IVisitableMatlabData; import hu.bme.mit.massif.communication.datatype.MatlabString; import hu.bme.mit.massif.communication.datatype.StructMatlabData; import hu.bme.mit.massif.simulink.Block; import hu.bme.mit.massif.simulink.Goto; import hu.bme.mit.massif.simulink.SimulinkFactory; import hu.bme.mit.massif.simulink.SimulinkReference; import hu.bme.mit.massif.simulink.TagVisibility; import hu.bme.mit.massif.simulink.api.Importer; import java.util.LinkedList; import java.util.List; /** * Adapter class for the goto block */ public class GotoAdapter extends DefaultBlockAdapter { @Override public Block getBlock(Importer traverser) { return SimulinkFactory.eINSTANCE.createGoto(); } @Override public void process(Importer traverser, SimulinkReference parentSimRef, Block blockToProcess) { super.process(traverser, parentSimRef, blockToProcess); // TODO revisit implementation Goto gotoBlock = (Goto) blockToProcess; MatlabCommandFactory commandFactory = traverser.getCommandFactory(); String blockName = gotoBlock.getSimulinkRef().getFQN(); MatlabCommand getGotoTag = commandFactory.getParam().addParam(blockName).addParam("GotoTag"); String gotoTag = MatlabString.getMatlabStringData(getGotoTag.execute()); gotoBlock.setGotoTag(gotoTag); TagVisibility tagVisibility = null; MatlabCommand getGotoTagVisibility = commandFactory.getParam().addParam(blockName).addParam("TagVisibility"); String tagVisibilityStr = MatlabString.getMatlabStringData(getGotoTagVisibility.execute()); if (tagVisibilityStr.contains("local")) { tagVisibility = TagVisibility.LOCAL; } else if (tagVisibilityStr.contains("global")) { tagVisibility = TagVisibility.GLOBAL; } else if (tagVisibilityStr.contains("scoped")) { tagVisibility = TagVisibility.SCOPED; } gotoBlock.setTagVisibility(tagVisibility); List<String> fromNames = null; // Get the corresponding from block FQNs MatlabCommand getGotoHandle = commandFactory.getParam().addParam(blockName).addParam("Handle"); IVisitableMatlabData gotoHandle = getGotoHandle.execute(); MatlabCommand getFromsForGoto = commandFactory.get().addParam(gotoHandle).addParam("FromBlock"); CellMatlabData fromNamesAndHandles = CellMatlabData.asCellMatlabData(getFromsForGoto.execute()); fromNames = new LinkedList<String>(); for (IVisitableMatlabData fromData : fromNamesAndHandles.getDatas()) { StructMatlabData structFromData = (StructMatlabData) fromData; if (structFromData == null) { // This means that there are no corresponding from blocks continue; } String fromName = MatlabString.getMatlabStringData(structFromData.getData("name")); fromNames.add(fromName); } traverser.getGotos().put(gotoBlock, fromNames); // This block is processed further during the creation of connections between blocks } }