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