From 5fec67a7c3d534c45d10e575d9aa190b2f1353a7 Mon Sep 17 00:00:00 2001
From: Ludovic Apvrille <ludovic.apvrille@telecom-paristech.fr>
Date: Thu, 5 Dec 2013 16:32:54 +0000
Subject: [PATCH] Update on TTool: asyncm msgs in simulation

---
 Makefile                                      |   2 +-
 executablecode/Makefile.src                   |   2 +-
 src/avatartranslator/AvatarRelation.java      |   4 +
 ...atarSimulationAsynchronousTransaction.java |  30 ++++
 .../AvatarSimulationBlock.java                |  17 ++-
 .../AvatarSpecificationSimulation.java        |  44 +++++-
 src/ui/MainGUI.java                           |  32 +++--
 .../JFrameAvatarInteractiveSimulation.java    | 134 +++++++++++-------
 8 files changed, 198 insertions(+), 67 deletions(-)

diff --git a/Makefile b/Makefile
index 794c5c0449..5bc5ccd929 100755
--- a/Makefile
+++ b/Makefile
@@ -97,7 +97,7 @@ myrelease: basic launcher ttooljar_std
 basic:
 	$(JAVAC) $(CLASSPATH) $(TTOOL_SRC) $(TTOOL_SRC)/*.java	
 
-ttooljar_std:
+ttooljar:
 	rm -f $(TTOOL_BIN)/$(TTOOL_BINARY)
 	cp $(TTOOL_SRC)/ui/images/$(STD_LOGO) $(TTOOL_SRC)/ui/images/$(LOGO) 
 	cd $(TTOOL_SRC);  $(JAR) cmf $(TTOOL_JAR_TXT) $(TTOOL_BIN)/$(TTOOL_BINARY) Main.class vcd/*.class avatartranslator/*.class avatartranslator/toexecutable/*.class avatartranslator/directsimulation/*.class avatartranslator/touppaal/*.class avatartranslator/toproverif/*.class avatartranslator/totpn/* avatartranslator/*.class avatartranslator/toturtle/*.java automata/*.class compiler/tmlparser/*.class nc/*.class  tepe/*.class tmltranslator/*.class tmltranslator/toautomata/*.class tmatrix/*.class tmltranslator/toturtle/*.class tmltranslator/touppaal/*.class tmltranslator/tosystemc/*.class tmltranslator/tomappingsystemc/*.class tmltranslator/tomappingsystemc2/*.class  tpndescription/*.class ddtranslator/*.class launcher/*.class myutil/*.class sddescription/*.class sdtranslator/*.class translator/*.class translator/tojava/*.class  translator/tosimujava/*.class translator/touppaal/*.class translator/totpn/*.class req/ebrdd/*.java ui/*.class ui/*/*.class ui/*/*/*.class proverifspec/*.class uppaaldesc/*.class ui/images/*.* ui/images/toolbarButtonGraphics/general/*.gif ui/images/toolbarButtonGraphics/media/*.gif $(TTOOL_BIN)/$(LAUNCHER_BINARY) RTLLauncher.class launcher/*.class fr/inria/oasis/vercors/cttool/model/*.class remotesimulation/*.class
diff --git a/executablecode/Makefile.src b/executablecode/Makefile.src
index f005e67c8d..e44f354179 100755
--- a/executablecode/Makefile.src
+++ b/executablecode/Makefile.src
@@ -1 +1 @@
-SRCS = generated_src/main.c generated_src/TestBench.c generated_src/SpeedSensor.c generated_src/RadarSensor.c generated_src/GPSSensor.c generated_src/CarPositionSimulator.c generated_src/EmergencySimulator.c generated_src/Communication.c generated_src/DSRSC_Management.c generated_src/NeighbourhoodTableManagement.c generated_src/CorrectnessChecking.c generated_src/PTC.c generated_src/DrivingPowerReductionStrategy.c generated_src/BCU.c generated_src/DangerAvoidanceStrategy.c generated_src/BrakeManagement.c generated_src/CSCU.c generated_src/ObjectListManagement.c generated_src/PlausibilityCheck.c generated_src/VehiculeDynamicsManagement.c 
\ No newline at end of file
+SRCS = generated_src/main.c generated_src/Block1.c generated_src/Block0.c 
\ No newline at end of file
diff --git a/src/avatartranslator/AvatarRelation.java b/src/avatartranslator/AvatarRelation.java
index 9a48fb265b..806f73695b 100644
--- a/src/avatartranslator/AvatarRelation.java
+++ b/src/avatartranslator/AvatarRelation.java
@@ -191,6 +191,10 @@ public class AvatarRelation extends AvatarElement {
 		return sb.toString();
 	}
 	
+	public String toStringIndex(int index) {
+		return block1.getName() + "." + signals1.get(index).getName() + " -> " + block2.getName() + "." + signals2.get(index).getName();
+	}
+	
 	// Return index of signal. If not found, return -1
 	public int hasSignal(AvatarSignal sig) {
 		int index1 = signals1.indexOf(sig);
diff --git a/src/avatartranslator/directsimulation/AvatarSimulationAsynchronousTransaction.java b/src/avatartranslator/directsimulation/AvatarSimulationAsynchronousTransaction.java
index 61be93a807..f654ad178f 100644
--- a/src/avatartranslator/directsimulation/AvatarSimulationAsynchronousTransaction.java
+++ b/src/avatartranslator/directsimulation/AvatarSimulationAsynchronousTransaction.java
@@ -85,4 +85,34 @@ public class AvatarSimulationAsynchronousTransaction  {
 	public int getIndex() {
 		return index;
 	}
+	
+	public String toString() {
+		String blockName;
+		if (firstTransaction != null) {
+			blockName = firstTransaction.block.getName();
+		} else {
+			blockName = relation.block1.getName();
+		}
+		
+		AvatarSignal sig1 = relation.getSignal1(index);
+		AvatarSignal sig2 = relation.getSignal2(index);
+		
+		if ((sig1 == null) || (sig2 == null)) {
+			return "?";
+		}
+		
+		String ret = blockName + "." + sig1.getName()+"(";
+		for(int i=0; i<parameters.size(); i++) {
+			if (i !=0) {
+				ret += ",";
+			}
+			ret += parameters.get(i);
+		}
+		ret += ") -> ";
+		
+		ret += relation.block2.getName() + "." + sig2.getName();
+		
+		
+		return ret;
+	}
 }
\ No newline at end of file
diff --git a/src/avatartranslator/directsimulation/AvatarSimulationBlock.java b/src/avatartranslator/directsimulation/AvatarSimulationBlock.java
index 98d6c8ebc5..e1970e4b80 100644
--- a/src/avatartranslator/directsimulation/AvatarSimulationBlock.java
+++ b/src/avatartranslator/directsimulation/AvatarSimulationBlock.java
@@ -62,6 +62,8 @@ public class AvatarSimulationBlock  {
 	private Vector <AvatarSimulationTransaction> transactions;
 	private boolean completed;
 	public boolean selected; // Free use for graphic purpose
+	private int forcedRandom = -1;
+	
 	
 	//private int elapsedTime; 
 	
@@ -71,6 +73,10 @@ public class AvatarSimulationBlock  {
 		completed = false;
 		//elapsedTime = 0;
     }
+    
+    public void forceRandom(int _value) {
+    	forcedRandom = _value;
+    }
 	
 	/*public void addElapsedTime(int _elapsedTimed) {
 	elapsedTime += _elapsedTimed;
@@ -259,7 +265,7 @@ public class AvatarSimulationBlock  {
 		if (_elt instanceof AvatarStopState) {
 			makeExecutedTransaction(_allTransactions, _elt, _clockValue, _aspt, _bunchid);
 			
-			// Random
+			// State
 		} else if (_elt instanceof AvatarState) {
 			makeExecutedTransaction(_allTransactions, _elt, _clockValue, _aspt, _bunchid);
 			
@@ -357,7 +363,14 @@ public class AvatarSimulationBlock  {
 				if (index >-1) {
 					int valMin = evaluateIntExpression(random.getMinValue(), attributeValues);
 					int valMax = evaluateIntExpression(random.getMaxValue(), attributeValues);
-					valMin = (int)(Math.floor((Math.random()*(valMax - valMin)))) + valMin;
+					
+					if ((forcedRandom > -1) && (forcedRandom >= valMin) && (forcedRandom <= valMax)){
+						// Use provided value as random value
+						valMin = forcedRandom;
+					} else {
+						// randomnly select a value
+						valMin = (int)(Math.floor((Math.random()) * (valMax - valMin + 1))) + valMin;
+					}
 					attributeValues.remove(index);
 					attributeValues.add(index, "" + valMin);
 					ast.actions = new Vector<String>();
diff --git a/src/avatartranslator/directsimulation/AvatarSpecificationSimulation.java b/src/avatartranslator/directsimulation/AvatarSpecificationSimulation.java
index 5566ccbd05..4fcda68a06 100644
--- a/src/avatartranslator/directsimulation/AvatarSpecificationSimulation.java
+++ b/src/avatartranslator/directsimulation/AvatarSpecificationSimulation.java
@@ -109,6 +109,10 @@ public class AvatarSpecificationSimulation  {
 		reset();
 		setState(GATHER);
     }
+    
+    public Vector<AvatarSimulationAsynchronousTransaction> getAsynchronousMessages() {
+    	return asynchronousMessages;
+    }
 	
 	public AvatarSpecification getAvatarSpecification() {
 		return avspec;
@@ -978,10 +982,38 @@ public class AvatarSpecificationSimulation  {
 							_aspt.isLost = true;
 						} else {
 							_aspt.isLost = false;
-							asynchronousMessages.add(asat);
+							
+							// Must verify that the FIFO is not full if not blocking
+							if (rel.isBlocking()) {
+								// blocking was handled before
+								asynchronousMessages.add(asat);
+							} else {
+								// non blocking -> check the fifo size
+								int nb = getNbOfAsynchronousMessages(rel);
+								if (nb < rel.getSizeOfFIFO()) {
+									TraceManager.addDev("FIFO not full: " + nb + " size=" + rel.getSizeOfFIFO());
+									asynchronousMessages.add(asat);
+								} else {
+									TraceManager.addDev("*** Asyn msg was dropped because FIFO is full");
+								}
+							}
 						}
 					} else {
-						asynchronousMessages.add(asat);
+						// Must verify that the FIFO is not full if not blocking
+						if (rel.isBlocking()) {
+							// blocking was handled before
+							asynchronousMessages.add(asat);
+						} else {
+							// non blocking -> check the fifo size
+							int nb = getNbOfAsynchronousMessages(rel);
+							if (nb < rel.getSizeOfFIFO()) {
+								TraceManager.addDev("FIFO not full: " + nb + " size=" + rel.getSizeOfFIFO());
+								asynchronousMessages.add(asat);
+							} else {
+								TraceManager.addDev("*** Asyn msg was dropped because FIFO is full");
+							}
+						}
+						
 					}
 				} else {
 					// Must remove the asynchronous operation, and give the parameters
@@ -1385,5 +1417,13 @@ public class AvatarSpecificationSimulation  {
 	public void setExecuteStateEntering(boolean _b) {
 		executeStateEntering = _b;
 	}
+	
+	// value: -1 -> not forcing
+	// other value: random is forced to that value
+	public void forceRandom(int value) {
+		for(AvatarSimulationBlock block: blocks) {
+			block.forceRandom(value);
+		}
+	}
 
 }
\ No newline at end of file
diff --git a/src/ui/MainGUI.java b/src/ui/MainGUI.java
index 518c6a24e4..f8d8173385 100755
--- a/src/ui/MainGUI.java
+++ b/src/ui/MainGUI.java
@@ -5699,9 +5699,13 @@ public	class MainGUI implements ActionListener, WindowListener, KeyListener {
                 } else {
                     mainDesignTabbedPane.setTitleAt(index, s);
                 }*/
-                getCurrentJTabbedPane().setTitleAt(index, s);
-                tdp.setName(s);
-                changeMade(tdp, TDiagramPanel.NEW_COMPONENT);
+                if (isAValidTabName(s)) {
+                	JOptionPane.showMessageDialog(frame, "Invalid name", "Error", JOptionPane.INFORMATION_MESSAGE);
+                } else {
+					getCurrentJTabbedPane().setTitleAt(index, s);
+					tdp.setName(s);
+					changeMade(tdp, TDiagramPanel.NEW_COMPONENT);
+                }
             }
         }
     }
@@ -6056,16 +6060,20 @@ public	class MainGUI implements ActionListener, WindowListener, KeyListener {
     
     public void requestRenameTab(int index) {
 		String oldName = mainTabbedPane.getTitleAt(index);
-        String s = (String)JOptionPane.showInputDialog(frame, "TURTLE modeling:", "Name=", JOptionPane.PLAIN_MESSAGE, IconManager.imgic101, null, mainTabbedPane.getTitleAt(index));
+        String s = (String)JOptionPane.showInputDialog(frame, "Name: ", "Renaming a tab=", JOptionPane.PLAIN_MESSAGE, IconManager.imgic101, null, mainTabbedPane.getTitleAt(index));
         if ((s != null) && (s.length() > 0)){
             // name already in use?
 			if (s.compareTo(oldName) != 0) {
-				mainTabbedPane.setTitleAt(index, s);
-				changeMade(getCurrentTDiagramPanel(), ((TURTLEPanel)(tabs.elementAt(index))).tdp.MOVE_COMPONENT);
-				
-				TURTLEPanel tp = (TURTLEPanel)(tabs.elementAt(index));
-				if ((tp instanceof TMLDesignPanel) || (tp instanceof TMLComponentDesignPanel)) {
-					renameMapping(oldName, s);
+				if (isAValidTabName(s)) {
+					mainTabbedPane.setTitleAt(index, s);
+					changeMade(getCurrentTDiagramPanel(), ((TURTLEPanel)(tabs.elementAt(index))).tdp.MOVE_COMPONENT);
+					
+					TURTLEPanel tp = (TURTLEPanel)(tabs.elementAt(index));
+					if ((tp instanceof TMLDesignPanel) || (tp instanceof TMLComponentDesignPanel)) {
+						renameMapping(oldName, s);
+					}
+				} else {
+					JOptionPane.showMessageDialog(frame, "Invalid name", "Error", JOptionPane.INFORMATION_MESSAGE);
 				}
 				
 			}
@@ -6555,6 +6563,10 @@ public	class MainGUI implements ActionListener, WindowListener, KeyListener {
         }
     }
     
+    public boolean isAValidTabName(String name) {
+    	return name.matches("((\\w)*(\\s)*)*");
+    }
+    
     
     
     public void windowClosing(WindowEvent e) {
diff --git a/src/ui/avatarinteractivesimulation/JFrameAvatarInteractiveSimulation.java b/src/ui/avatarinteractivesimulation/JFrameAvatarInteractiveSimulation.java
index 717dfbb428..3dad1012d2 100755
--- a/src/ui/avatarinteractivesimulation/JFrameAvatarInteractiveSimulation.java
+++ b/src/ui/avatarinteractivesimulation/JFrameAvatarInteractiveSimulation.java
@@ -154,6 +154,16 @@ public	class JFrameAvatarInteractiveSimulation extends JFrame implements AvatarS
 	private JScrollPane jspDisplayedBlocks;
 	private Vector<JCheckBox> displayedBlocks;
 	
+	// RandomBlocks
+	private JPanel randomPanel;
+	private JTextField randomValue;
+	private JCheckBox imposeRandom;
+	private JButton updateRandom;
+	
+	// Asynchronous transactions
+	private JPanel asyncPanel;
+	private JList asyncmsgs;
+	
 	// Sequence Diagram
 	private AvatarSpecificationSimulationSDPanel sdpanel;
 	
@@ -776,57 +786,51 @@ public	class JFrameAvatarInteractiveSimulation extends JFrame implements AvatarS
 		jspDisplayedBlocks.setPreferredSize(new Dimension(250, 300));
 		infoTab.addTab("Displayed blocks", IconManager.imgic1202, jspDisplayedBlocks, "Displayed blocks");
 		
-		
-		
-		// Variables
-		/*variablePanel = new JPanel();
-		variablePanel.setLayout(new BorderLayout());
-		infoTab.addTab("Tasks variables", null, variablePanel, "Current value of variables");
-		if (tmap == null) {
-			tvtm = new TaskVariableTableModel(null, valueTable, rowTable);
-		} else {
-			tvtm = new TaskVariableTableModel(tmap.getTMLModeling(), valueTable, rowTable);
-		}
-		sorterPI = new TableSorter(tvtm);
-		jtablePI = new JTable(sorterPI);
-		sorterPI.setTableHeader(jtablePI.getTableHeader());
-		((jtablePI.getColumnModel()).getColumn(0)).setPreferredWidth(100);
-		((jtablePI.getColumnModel()).getColumn(1)).setPreferredWidth(60);
-		((jtablePI.getColumnModel()).getColumn(2)).setPreferredWidth(100);
-		((jtablePI.getColumnModel()).getColumn(3)).setPreferredWidth(60);
-		((jtablePI.getColumnModel()).getColumn(4)).setPreferredWidth(100);
-		jtablePI.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
-		jspTaskVariableInfo = new JScrollPane(jtablePI);
-		jspTaskVariableInfo.setWheelScrollingEnabled(true);
-		jspTaskVariableInfo.getVerticalScrollBar().setUnitIncrement(10);
-		jspTaskVariableInfo.setPreferredSize(new Dimension(500, 300));
-		variablePanel.add(jspTaskVariableInfo, BorderLayout.NORTH);
-		updateTaskVariableInformationButton = new JButton(actions[InteractiveSimulationActions.ACT_UPDATE_VARIABLES]);
-		variablePanel.add(updateTaskVariableInformationButton, BorderLayout.SOUTH);*/
-		
-		// CPUs
-		/*cpuPanel = new JPanel();
-		cpuPanel.setLayout(new BorderLayout());
-		infoTab.addTab("CPUs", IconManager.imgic1100, cpuPanel, "Current state of CPUs");
-		cputm = new CPUTableModel(tmap, valueTable, rowTable);
-		sorterPI = new TableSorter(cputm);
-		jtablePI = new JTable(sorterPI);
-		sorterPI.setTableHeader(jtablePI.getTableHeader());
-		((jtablePI.getColumnModel()).getColumn(0)).setPreferredWidth(100);
-		((jtablePI.getColumnModel()).getColumn(1)).setPreferredWidth(75);
-		((jtablePI.getColumnModel()).getColumn(2)).setPreferredWidth(700);
-		jtablePI.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
-		jspCPUInfo = new JScrollPane(jtablePI);
-		jspCPUInfo.setWheelScrollingEnabled(true);
-		jspCPUInfo.getVerticalScrollBar().setUnitIncrement(10);
-		jspCPUInfo.setPreferredSize(new Dimension(500, 300));
-		cpuPanel.add(jspCPUInfo, BorderLayout.NORTH);
-		panelCPU = new JPanel(new FlowLayout());
-		updateCPUInformationButton = new JButton(actions[InteractiveSimulationActions.ACT_UPDATE_CPUS]);
-		panelCPU.add(updateCPUInformationButton);
-		printCPUInfo = new JButton(actions[InteractiveSimulationActions.ACT_PRINT_CPUS]);
-		panelCPU.add(printCPUInfo);
-		cpuPanel.add(panelCPU, BorderLayout.SOUTH);*/
+		//Randomness
+		randomPanel = new JPanel();
+		randomPanel.setLayout(new GridBagLayout());
+		GridBagConstraints cr = new GridBagConstraints();
+		
+		cr.gridheight = 1;
+		cr.weighty = 1.0;
+		cr.weightx = 1.0;
+		cr.gridwidth = GridBagConstraints.REMAINDER; //end row
+		cr.fill = GridBagConstraints.BOTH;
+		cr.gridheight = 1;
+		imposeRandom = new JCheckBox("Force random value");
+		imposeRandom.addActionListener(this);
+		randomPanel.add(imposeRandom, cr);
+		cr.gridwidth = 1;
+		cr.fill = GridBagConstraints.HORIZONTAL;
+		randomPanel.add(new JLabel("value:"), cr);
+		randomValue = new JTextField();
+		randomPanel.add(randomValue, cr);
+		cr.gridwidth = GridBagConstraints.REMAINDER; //end row
+		updateRandom = new JButton("Update", IconManager.imgic16);
+		updateRandom.setToolTipText("Update random value");
+		randomPanel.add(updateRandom, cr);
+		updateRandom.addActionListener(this);
+		
+		infoTab.addTab("Randomness", IconManager.imgic1202, randomPanel, "Randomness");
+		
+		imposeRandom.setSelected(false);
+		randomValue.setEnabled(false);
+		
+		
+		//Asynchronous
+		asyncPanel = new JPanel();
+		asyncPanel.setLayout(new GridBagLayout());
+		GridBagConstraints ca = new GridBagConstraints();
+		
+		ca.gridheight = 1;
+		ca.weighty = 1.0;
+		ca.weightx = 1.0;
+		ca.gridwidth = GridBagConstraints.REMAINDER; //end row
+		ca.fill = GridBagConstraints.BOTH;
+		ca.gridheight = 1;
+		asyncmsgs = new JList();
+		asyncPanel.add(asyncmsgs, ca);
+		infoTab.addTab("Asynch. msg", IconManager.imgic1202, asyncPanel, "Asynch. msg.");
 		
 		pack();
 		
@@ -960,6 +964,7 @@ public	class JFrameAvatarInteractiveSimulation extends JFrame implements AvatarS
 			//TraceManager.addDev("Animating");
 			updateMetElements();
 			updateTransactionsTable();
+			updateAsynchronousChannels();
 			animateDiagrams();
 		}
 		
@@ -1156,6 +1161,17 @@ public	class JFrameAvatarInteractiveSimulation extends JFrame implements AvatarS
 		}
 	}
 	
+	public void updateAsynchronousChannels() {
+		if (ass != null) {
+			Vector<AvatarSimulationAsynchronousTransaction> msgs = ass.getAsynchronousMessages();
+			if (msgs != null) {
+				if (asyncmsgs != null) {
+					asyncmsgs.setListData(msgs);
+				}
+			}
+		}
+	}
+	
 	public void animateDiagrams() {
 		if ((animate != null) && (ass != null) && (ass.getSimulationBlocks() != null)) {
 			if (animate.isSelected()) {
@@ -1431,6 +1447,22 @@ public	class JFrameAvatarInteractiveSimulation extends JFrame implements AvatarS
 			
 		} else if (evt.getSource() == displayedTransactionsText) {
 			TraceManager.addDev("Entered text:" + displayedTransactionsText.getText());
+			
+		} else if ((evt.getSource() == imposeRandom) || (evt.getSource() == updateRandom)) {
+			randomValue.setEnabled(imposeRandom.isSelected());
+			if (ass != null) {
+				if (imposeRandom.isSelected()) {
+					int val;
+					try {
+						val = Integer.decode(randomValue.getText().trim()).intValue();
+					} catch (Exception e) {
+						val = -1;
+					}
+					ass.forceRandom(val);
+				} else {
+					ass.forceRandom(-1);
+				}
+			}
 		}
 		
 		
-- 
GitLab