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