Переглянути джерело

Adds Jitter to Ports & PortEditorPanel for connection fluctuations

Andreas T. Meyer-Berg 5 роки тому
батько
коміт
a62f4c8b28

+ 3 - 0
src/main/java/de/tu_darmstadt/tk/SmartHomeNetworkSim/Main.java

@@ -148,6 +148,7 @@ public class Main {
 			aP = new Port(A,((short) (3*i+1)));
 			aP.setLastTrigger(0);
 			aP.setTriggerInterval(100+(int)(Math.random()*900));
+			aP.setJitter((short) (Math.random()*50));
 			aP.setStatus(Port.SENDING);
 			aP.setConnection(con);
 			protocol.addDeviceOfRole(aP, 3);
@@ -167,6 +168,7 @@ public class Main {
 			bP = new Port(B,((short) (3*i+2)));
 			bP.setLastTrigger(0);
 			bP.setTriggerInterval(10+(int)(Math.random()*190));
+			bP.setJitter((short) (Math.random()*50));
 			bP.setStatus(Port.SENDING);
 			bP.setConnection(con);
 			protocol.addDeviceOfRole(bP, 2);
@@ -184,6 +186,7 @@ public class Main {
 			cP = new Port(C,((short) (3*i+1)));
 			cP.setLastTrigger(0);
 			cP.setTriggerInterval(50+(int)(Math.random()*450));
+			cP.setJitter((short) (Math.random()*50));
 			cP.setStatus(Port.SENDING);
 			cP.setConnection(con);
 			protocol.addDeviceOfRole(cP, 1);

+ 2 - 2
src/main/java/de/tu_darmstadt/tk/SmartHomeNetworkSim/core/ConnectionImplementation.java

@@ -60,10 +60,10 @@ public class ConnectionImplementation implements Connection {
 		returnPackets.addAll(getTerminationPackages(startTime));
 		for(Port p:participants){
 			if(p.getLastTrigger()+p.getTriggerInterval()<startTime && p.getStatus()==Port.SENDING){
-				returnPackets.addAll(protocol.generateNextPakets(p, startTime,Math.random()<packetLossRate));
+				returnPackets.addAll(protocol.generateNextPakets(p, (long) (startTime+p.getJitter()*Math.random()/2),Math.random()<packetLossRate));
 			}
 			while(p.getLastTrigger()+p.getTriggerInterval()<startTime+duration &&p.getStatus()==Port.SENDING)
-				returnPackets.addAll(protocol.generateNextPakets(p, p.getLastTrigger()+p.getTriggerInterval(),Math.random()<packetLossRate));
+				returnPackets.addAll(protocol.generateNextPakets(p, (long) (p.getLastTrigger()+p.getTriggerInterval()+p.getJitter()*(Math.random()-0.5)),Math.random()<packetLossRate));
 		}
 		returnPackets.sort((a,b)->(Long.compare(a.getTimestamp(),b.getTimestamp())));
 		return returnPackets;

+ 25 - 2
src/main/java/de/tu_darmstadt/tk/SmartHomeNetworkSim/core/Port.java

@@ -55,6 +55,11 @@ public class Port {
 	 */
 	private short responseTime;
 
+	/**
+	 * Jitter of the connection of this port. Random fluctuation of delivery times. 
+	 */
+	private short jitter;
+	
 	/**
 	 * Port number of this Port.
 	 */
@@ -71,7 +76,8 @@ public class Port {
 		connection = null;
 		triggerInterval = 1000;
 		lastTrigger = 0;
-		responseTime = 5;
+		jitter = 0;
+		responseTime = 3;
 		this.portNumber = portNumber;
 	}
 	
@@ -183,8 +189,25 @@ public class Port {
 	 */
 	public void setConnection(Connection connection) {
 		this.connection = connection;
+	}	
+	
+	/**
+	 * Return the Jitter of the port, which represents random fluctuations of the delivery times
+	 * @return the Jitter
+	 */
+	public short getJitter() {
+		return jitter;
 	}
-
+	
+	
+	/**
+	 * Set Jitter of the port, which represents random fluctuations of the delivery times
+	 * @param jitter the Jitter to set
+	 */
+	public void setJitter(short jitter) {
+		this.jitter = jitter;
+	}
+	
 	/**
 	 * Returns a String representation for the status byte
 	 * Returns 0:closed, 1:open, 2:sending

+ 33 - 2
src/main/java/de/tu_darmstadt/tk/SmartHomeNetworkSim/view/PortEditorPanel.java

@@ -65,6 +65,10 @@ public class PortEditorPanel extends JPanel
      * Textfield for the last trigger
      */
     private JTextField tfLastTrigger;
+    /**
+     * Textfield for the jitter
+     */
+    private JTextField tfJitter;
     
     /**
      * Creates a new PortEditorPanel, which allows editing of the Ports of toEdit
@@ -171,6 +175,19 @@ public class PortEditorPanel extends JPanel
         tfLastTrigger.addActionListener(this);
         tfLastTrigger.addMouseListener(this);
         
+        JLabel lblJitter = new JLabel("Jitter:");
+        lblJitter.setHorizontalAlignment(SwingConstants.RIGHT);
+        lblJitter.setBounds(20, 180, 102, 16);
+        editPanel.add(lblJitter);
+        
+        tfJitter = new JTextField();
+        tfJitter.setBounds(134, 180, 132, 22);
+        editPanel.add(tfJitter);
+        tfJitter.setColumns(10);
+        tfJitter.addFocusListener(this);
+        tfJitter.addActionListener(this);
+        tfJitter.addMouseListener(this);
+        
         splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,
                                    listScrollPane, pictureScrollPane);
         splitPane.setDividerLocation(60);
@@ -211,6 +228,8 @@ public class PortEditorPanel extends JPanel
     	tfResponseTime.setBackground(Color.WHITE);
     	tfTriggerInterval.setText(""+port.getTriggerInterval());
     	tfTriggerInterval.setBackground(Color.WHITE);
+    	tfJitter.setText(""+port.getJitter());
+    	tfJitter.setBackground(Color.WHITE);
     	cmbStatus.setSelectedIndex(port.getStatus());
     	if(port.getConnection() == null || port.getConnection().getProtocol()==null)
     		lblProtocolName.setText("null");
@@ -255,7 +274,7 @@ public class PortEditorPanel extends JPanel
      * Invalid values are highlighted RED
      */
 	private void checkValueChange() {
-		if(list.getSelectedIndex()==-1||list.getSelectedIndex()>=toEdit.getPorts().size())return;
+		if(list.getSelectedIndex() < 0 || list.getSelectedIndex() >= toEdit.getPorts().size())return;
 		/**
 		 * Port, which is being edited at the moment 
 		 */
@@ -302,7 +321,7 @@ public class PortEditorPanel extends JPanel
 		}
 		
 		//Edit last Trigger
-		if(tfLastTrigger.getText()!=""+toChange.getTriggerInterval()){
+		if(tfLastTrigger.getText()!=""+toChange.getLastTrigger()){
 			try {
 				toChange.setLastTrigger(Long.parseLong(tfLastTrigger.getText()));
 				tfLastTrigger.setBackground(Color.WHITE);
@@ -313,6 +332,18 @@ public class PortEditorPanel extends JPanel
 			tfLastTrigger.setBackground(Color.WHITE);
 		}
 		
+		//Edit Jitter
+		if(tfJitter.getText()!=""+toChange.getJitter()){
+			try {
+				toChange.setJitter(Short.parseShort(tfJitter.getText()));
+				tfJitter.setBackground(Color.WHITE);
+			} catch (Exception e) {
+				tfJitter.setBackground(Color.RED);
+			}
+		}else{
+			tfJitter.setBackground(Color.WHITE);
+		}
+		
 		
 	}