From f5021f25df3089c4f7920cc42390fb1e89d95df3 Mon Sep 17 00:00:00 2001 From: Sophie Coudert <sophie.coudert@telecom-paris.fr> Date: Thu, 23 May 2024 17:01:29 +0200 Subject: [PATCH] Stx2Avatar point: blocks handling : transition part in progress --- .../tosysmlv2/AvatarFromSysML.java | 73 ++++++++++++------- .../tosysmlv2/AvatarFromSysMLSyntax.java | 1 + 2 files changed, 48 insertions(+), 26 deletions(-) diff --git a/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysML.java b/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysML.java index 73e351b2a8..7013c2e941 100644 --- a/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysML.java +++ b/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysML.java @@ -38,6 +38,7 @@ package avatartranslator.tosysmlv2; import java.io.StringReader; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.function.BiConsumer; @@ -49,6 +50,7 @@ import java_cup.runtime.ComplexSymbolFactory; public class AvatarFromSysML { private AvatarSpecification avSpec; private StxModel stxSpec; + private ArrayList<AvatarTransition> transitionList; private HashMap<StxSignal, AvatarSignal> signalMap; private HashMap<StxBlock, AvatarBlock> blockMap; private HashMap<StxState, AvatarStateMachineElement> stateMap; @@ -261,41 +263,60 @@ public class AvatarFromSysML { // add states StxState[] states = blk.getStates(); AvatarStateMachine asm = theBlock.getStateMachine(); + AvatarStateMachineElement theSourceState; size = states.length; for (int i = 0; i < size; i++) { - AvatarStateMachineElement theState = getState(states[i], theBlock); - switch(states[i].getType()) { - case AvatarFromSysMLSyntax.STXSTARTSTATE : - break; - case AvatarFromSysMLSyntax.STXSTOPSTATE : - break; - case AvatarFromSysMLSyntax.STXSTANDARDSTATE : - break; - case AvatarFromSysMLSyntax.STXRANDOMSTATE : - break; - case AvatarFromSysMLSyntax.STXCOUNTSTATE : - break; - case AvatarFromSysMLSyntax.STXSENDSTATE : - break; - case AvatarFromSysMLSyntax.STXRECEIVESTATE : - break; - case AvatarFromSysMLSyntax.STXPRESENDSTATE : - break; - case AvatarFromSysMLSyntax.STXPRERECEIVESTATE : - break; - case AvatarFromSysMLSyntax.STXSETTIMERSTATE : - break; - case AvatarFromSysMLSyntax.STXRESETTIMERSTATE : - break; - case AvatarFromSysMLSyntax.STXEXPIRETIMERSTATE : + byte stateType = states[i].getType(); + if (stateType != AvatarFromSysMLSyntax.STXPRESENDSTATE && stateType != AvatarFromSysMLSyntax.STXPRERECEIVESTATE) { + theSourceState = getState(states[i], theBlock); + asm.addElement(theSourceState); + if (stateType == AvatarFromSysMLSyntax.STXRANDOMSTATE) { + ((AvatarRandom) theSourceState).setValues(states[i].getMinValue(), states[i].getMaxValue()); + ((AvatarRandom) theSourceState).setVariable(states[i].getVariable()); + } + // add transitions + List<StxTransition> transitions = states[i].getTransitions(); + int tsize = transitions.size(); + for (int j = 0; j < tsize; j++) { + AvatarTransition theTransition = new AvatarTransition(theBlock,"", null); + transitionList.add(theTransition); + theSourceState.addNext(theTransition); + theTransition.setGuard(transitions.get(j).getGuard()); + theTransition.setDelays(transitions.get(j).getMinDelay(), transitions.get(j).getMaxDelay()); + setDistributionLaw(theTransition, transitions.get(j).getDelayDistributionLaw(),transitions.get(j).getDelayExtra()); + } } } - } } private void buildBlocks(){ stxSpec.getBlockMap().forEach(new BuildBlock()); } + private void setDistributionLaw(AvatarTransition _t, String distributionLaw, HashMap<String,String> delayExtra) { + int law = -1; + int size; + if (distributionLaw == null || distributionLaw.equals("")) law = AvatarTransition.DELAY_UNIFORM_LAW; + else { + size = _t.DISTRIBUTION_LAWS.length; + for (int i = 0; i < size; i++) { + if (_t.DISTRIBUTION_LAWS[i].equals(distributionLaw)) { + law = i; + break; + } + } + if (law == -1) law = AvatarTransition.DELAY_UNIFORM_LAW; + } + String extra1 = _t.LABELS_OF_EXTRA_ATTRIBUTES_1[law]; + String extra2 = _t.LABELS_OF_EXTRA_ATTRIBUTES_2[law]; + size = _t.NB_OF_EXTRA_ATTRIBUTES[law]; + if (size > 0) { + extra1 = delayExtra.get(extra1); + if (size > 1) { + extra2 = delayExtra.get(extra2); + } + } + _t.setDistributionLaw(law, extra1, extra2); + } private void buildProfile(StxStructure ss, AvatarMethod am, AvatarBlock b) { AvatarAttribute aa; int size = ss.getSize(); diff --git a/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLSyntax.java b/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLSyntax.java index 20b89b0ed3..aed8d89c8d 100644 --- a/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLSyntax.java +++ b/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLSyntax.java @@ -471,6 +471,7 @@ public class AvatarFromSysMLSyntax { public void setMinValue(String _s) { minValue = _s; }; public String getMaxValue() { return maxValue; }; public void setMaxValue(String _s) { maxValue = _s; }; + public List<StxTransition> getTransitions() { return transitions; } public StxTransition getTransition(int i) { if (i<0) return null; StxTransition result = transitions.get(i); -- GitLab