diff --git a/src/main/java/ui/interactivesimulation/JFrameInteractiveSimulation.java b/src/main/java/ui/interactivesimulation/JFrameInteractiveSimulation.java index a07e5e58a89c32163ceb8daf156c658e3db453d4..7d5ddb40541029d6d31b64acc4769cfaca02c497 100755 --- a/src/main/java/ui/interactivesimulation/JFrameInteractiveSimulation.java +++ b/src/main/java/ui/interactivesimulation/JFrameInteractiveSimulation.java @@ -1392,6 +1392,17 @@ public class JFrameInteractiveSimulation extends JFrame implements ActionListene public void writeSimTrace(){ try { tmlSimPanel = new JFrameTMLSimulationPanel(new Frame(), mgui, "Simulation Transactions"); + HashMap<String, ArrayList<String>> deviceTaskMap = new HashMap<String, ArrayList<String>>(); + for (HwNode node : tmap.getTMLArchitecture().getHwNodes()){ + deviceTaskMap.put(node.getName(), new ArrayList<String>()); + } + for (TMLTask task: tmap.getTMLModeling().getTasks()){ + HwNode node = tmap.getHwNodeOf(task); + if (node!=null){ + deviceTaskMap.get(node.getName()).add(task.getName()); + } + } + tmlSimPanel.getSDPanel().setDevices(deviceTaskMap); pos = new PipedOutputStream(); pis = new PipedInputStream(pos, 4096); tmlSimPanel.setFileReference(new BufferedReader(new InputStreamReader(pis))); @@ -1573,37 +1584,98 @@ public class JFrameInteractiveSimulation extends JFrame implements ActionListene simtraces.add(trace); } } - else if (command.equals("Send")){ + else if ((command.equals("Send") || command.equals("Wait")) && tran.deviceName.contains("CPU")){ TMLEvent evt = tmap.getTMLModeling().getEventByShortName(tran.channelName); if (evt!=null){ TMLTask originTask = evt.getOriginTask(); TMLTask destTask = evt.getDestinationTask(); if (originTask!=null && destTask!=null){ - String trace = "time=" + tran.endTime+ " block="+ originTask.getName() + " type=synchro blockdestination="+ destTask.getName() + " channel="+tran.channelName+ " params=\""; - if (!simtraces.contains(trace)){ - simtraces.add(trace); + String asynchType = (command.equals("Send") ? "send_async" : "receive_async"); + int msgId=chanId; + if (!msgTimes.containsKey(tran.channelName)){ + msgTimes.put(tran.channelName, new ArrayList<String>()); + } + if (!msgTimes.get(tran.channelName).contains(tran.endTime)){ + // int tmp=msgId-1; + + if (command.equals("Send")){ + if (!channelIDMap.containsKey(tran.channelName)){ + channelIDMap.put(tran.channelName, new ArrayList<Integer>()); + } + channelIDMap.get(tran.channelName).add(msgId); + chanId++; + } + else { + if (channelIDMap.containsKey(tran.channelName) && channelIDMap.get(tran.channelName).size()>0){ + msgId=channelIDMap.get(tran.channelName).remove(0); + } + + } + String trace=""; + if (command.equals("Send")){ + trace = "time=" + tran.endTime+ " block="+ originTask.getName() + " type="+asynchType+ " blockdestination="+ destTask.getName() + " channel="+tran.channelName+" msgid="+ msgId + " params=\""; } + else { + trace = "time=" + tran.endTime+ " block="+ destTask.getName() + " type="+asynchType+ " blockdestination="+ destTask.getName() + " channel="+tran.channelName+" msgid="+ msgId + " params=\""; + } + // System.out.println("sending asynch " + trace); + if (!simtraces.contains(trace)){ + simtraces.add(trace); + if (!msgTimes.containsKey(tran.channelName)){ + msgTimes.put(tran.channelName, new ArrayList<String>()); + } + msgTimes.get(tran.channelName).add(tran.endTime); + } + //} } } + } } - else if (command.equals("Wait")){ - // - } - else if (command.equals("Request")){ + else if ((command.equals("Request") || command.equals("Notified")) && tran.deviceName.contains("CPU")){ TMLRequest req = tmap.getTMLModeling().getRequestByShortName(tran.channelName); if (req!=null){ -// TMLTask originTask = req.getOriginTask(); TMLTask destTask = req.getDestinationTask(); if (destTask!=null){ - String trace = "time=" + tran.endTime+ " block="+ tran.taskName + " type=synchro blockdestination="+ destTask.getName() + " channel="+tran.channelName + " params=\""; - if (!simtraces.contains(trace)){ - simtraces.add(trace); + String asynchType = (command.equals("Request") ? "send_async" : "receive_async"); + int msgId=chanId; + if (!msgTimes.containsKey(tran.channelName)){ + msgTimes.put(tran.channelName, new ArrayList<String>()); + } + if (!msgTimes.get(tran.channelName).contains(tran.endTime)){ + // int tmp=msgId-1; + + if (command.equals("Request")){ + if (!channelIDMap.containsKey(tran.channelName)){ + channelIDMap.put(tran.channelName, new ArrayList<Integer>()); + } + channelIDMap.get(tran.channelName).add(msgId); + chanId++; + } + else { + if (channelIDMap.containsKey(tran.channelName) && channelIDMap.get(tran.channelName).size()>0){ + msgId=channelIDMap.get(tran.channelName).remove(0); + } + + } + String trace=""; + if (command.equals("Request")){ + trace = "time=" + tran.endTime+ " block="+ tran.taskName + " type="+asynchType+ " blockdestination="+ destTask.getName() + " channel="+tran.channelName+" msgid="+ msgId + " params=\""; } + else { + trace = "time=" + tran.endTime+ " block="+ destTask.getName() + " type="+asynchType+ " blockdestination="+ destTask.getName() + " channel="+tran.channelName+" msgid="+ msgId + " params=\""; + } + // System.out.println("sending asynch " + trace); + if (!simtraces.contains(trace)){ + simtraces.add(trace); + if (!msgTimes.containsKey(tran.channelName)){ + msgTimes.put(tran.channelName, new ArrayList<String>()); + } + msgTimes.get(tran.channelName).add(tran.endTime); + } + //} } } - } - else if (command.equals("Notified")){ - // + } } else if (command.contains("Execi")){ String trace="time="+tran.endTime+ " block=" + tran.taskName + " type=state_entering state=exec" + tran.length; diff --git a/src/main/java/ui/interactivesimulation/JFrameTMLSimulationPanel.java b/src/main/java/ui/interactivesimulation/JFrameTMLSimulationPanel.java index 423db8356026c797e4eab3a0e4c6b72b5b28e0fe..d3a55082f0f91ddf160b748142b675ad0fc48149 100644 --- a/src/main/java/ui/interactivesimulation/JFrameTMLSimulationPanel.java +++ b/src/main/java/ui/interactivesimulation/JFrameTMLSimulationPanel.java @@ -135,6 +135,10 @@ public class JFrameTMLSimulationPanel extends JFrame implements ActionListener { //System.out.println("Row table:" + rowTable.toString()); //System.out.println("Value table:" + valueTable.toString()); } + + public JSimulationTMLPanel getSDPanel(){ + return sdpanel; + } private void initActions() { actions = new InteractiveSimulationActions[InteractiveSimulationActions.NB_ACTION]; diff --git a/src/main/java/ui/interactivesimulation/JSimulationTMLPanel.java b/src/main/java/ui/interactivesimulation/JSimulationTMLPanel.java index 04143c93472a07916ffbe4dfdb64ff47b7bd31cd..6cff97da0a1ea742f8f1a63e6240671b1a0d1354 100644 --- a/src/main/java/ui/interactivesimulation/JSimulationTMLPanel.java +++ b/src/main/java/ui/interactivesimulation/JSimulationTMLPanel.java @@ -55,6 +55,8 @@ import java.awt.image.BufferedImage; import java.io.*; import java.util.Hashtable; import java.util.Vector; +import java.util.ArrayList; +import java.util.HashMap; /** * Class JSimulationSDPanel @@ -81,7 +83,7 @@ public class JSimulationTMLPanel extends JPanel implements MouseMotionListener, private boolean spaceBetweenLifeLinesComputed = false; private int spaceAtEnd = 50; private int spaceAtTop = 50; - private int spaceVerticalText = 2; + private int spaceVerticalText = 4; private int spaceHorizontalText = 2; private int verticalLink = 10; @@ -107,6 +109,8 @@ public class JSimulationTMLPanel extends JPanel implements MouseMotionListener, // Or the list is described in the trace (header information) private Vector <String> entityNames; + private HashMap<String, ArrayList<String>> deviceTaskMap = new HashMap<String, ArrayList<String>>(); + private final int NO_MODE = 0; private final int FILE_MODE = 1; private final int STREAM_MODE = 2; @@ -175,6 +179,15 @@ public class JSimulationTMLPanel extends JPanel implements MouseMotionListener, this.repaint(); } + public void setDevices(HashMap<String, ArrayList<String>> map){ + deviceTaskMap = map; + for (String device: deviceTaskMap.keySet()){ + for (String task: deviceTaskMap.get(device)){ + addEntityNameIfApplicable(task); + } + } + } + protected void paintComponent(Graphics g) { super.paintComponent(g); int currentY = spaceAtTop; @@ -225,13 +238,30 @@ public class JSimulationTMLPanel extends JPanel implements MouseMotionListener, private int paintTopElements(Graphics g, int currentX, int currentY) { int w; - for(String name : entityNames) { - g.drawLine(currentX + (spaceBetweenLifeLines/4), currentY, currentX + (3*spaceBetweenLifeLines/4), currentY); - g.drawLine(currentX + (spaceBetweenLifeLines/2), currentY, currentX + (spaceBetweenLifeLines/2), currentY + verticalSpaceUnderBlocks); - w = g.getFontMetrics().stringWidth(name); - g.drawString(name, currentX + ((spaceBetweenLifeLines-w)/2), currentY - spaceVerticalText); - currentX += spaceBetweenLifeLines; - } + if (deviceTaskMap.keySet().size()==0){ + for(String name : entityNames) { + g.drawLine(currentX + (spaceBetweenLifeLines/4), currentY, currentX + (3*spaceBetweenLifeLines/4), currentY); + g.drawLine(currentX + (spaceBetweenLifeLines/2), currentY, currentX + (spaceBetweenLifeLines/2), currentY + verticalSpaceUnderBlocks); + w = g.getFontMetrics().stringWidth(name); + g.drawString(name, currentX + ((spaceBetweenLifeLines-w)/2), currentY - spaceVerticalText); + currentX += spaceBetweenLifeLines; + } + } + else { + for (String device: deviceTaskMap.keySet()){ + if (deviceTaskMap.get(device).size()>0){ + w = g.getFontMetrics().stringWidth(device); + g.drawString(device, currentX + (deviceTaskMap.get(device).size()-1)*((spaceBetweenLifeLines-w)/2), (currentY - spaceVerticalText)/2); + for(String name : deviceTaskMap.get(device)) { + g.drawLine(currentX + (spaceBetweenLifeLines/4), currentY, currentX + (3*spaceBetweenLifeLines/4), currentY); + g.drawLine(currentX + (spaceBetweenLifeLines/2), currentY, currentX + (spaceBetweenLifeLines/2), currentY + verticalSpaceUnderBlocks); + w = g.getFontMetrics().stringWidth(name); + g.drawString(name, currentX + ((spaceBetweenLifeLines-w)/2), currentY - spaceVerticalText); + currentX += spaceBetweenLifeLines; + } + } + } + } maxX = currentX;