Browse Source

eworld fixes

egert.rolf@tk.tu-darmstadt.de 5 years ago
parent
commit
2fdd3d8596

+ 7 - 4
src/connection/ConnectHandheld.java

@@ -1,4 +1,4 @@
-package connection;
+package Connection;
 
 import java.awt.BorderLayout;
 import java.awt.Dimension;
@@ -26,9 +26,9 @@ import api.Algorithm;
 import classes.AbstractCpsObject;
 import classes.CpsUpperNode;
 import classes.HolonObject;
-import connection.ConnectPhysical.HolonObjectStatus;
-import connection.ConnectPhysical.PhysicalLinkWrapper;
-import connection.socket.Server;
+import Connection.ConnectPhysical.HolonObjectStatus;
+import Connection.ConnectPhysical.PhysicalLinkWrapper;
+import Connection.socket.Server;
 import ui.controller.Control;
 import ui.view.Console;
 
@@ -184,6 +184,9 @@ public class ConnectHandheld implements Algorithm{
 				console.println("Selected: " + selected);
 				observed = selected.object;
 				holonObjectConnected = true;
+				if(server != null) {
+					server.setObserved(selected.object);
+				}
 				updateSelectionLabel();
 			}
 		}

+ 75 - 10
src/connection/ConnectPhysical.java

@@ -1,4 +1,4 @@
-package connection;
+package Connection;
 import java.awt.BorderLayout;
 import java.awt.Component;
 import java.awt.Dimension;
@@ -57,7 +57,7 @@ public class ConnectPhysical implements Algorithm{
 
 	private JLabel rotorLabel;
 	private JLabel houseLabel;
-	
+	private boolean onlyOnChange = false;
 	//
 	Future<?> future;
 	private boolean lessInformation = false;
@@ -93,7 +93,10 @@ public class ConnectPhysical implements Algorithm{
 	String room2Keyword = "room2";
 
 
-
+	//OnChange
+	int oldValueRotor = -1;
+	int oldValueRoom1 = -1;
+	int oldValueRoom2 = -1;
 
 
 
@@ -157,6 +160,21 @@ public class ConnectPhysical implements Algorithm{
 		});
 		parameterPanel.add(lessInformationCheckBox);
 		
+		JLabel onlyOnChangeLabel = new JLabel("OnlyOnChange:");
+		onlyOnChangeLabel.setBounds(200, 240, 200, 20);
+		parameterPanel.add(onlyOnChangeLabel);	
+		
+		
+		JCheckBox onlyOnChangeCheckBox = new JCheckBox();
+		onlyOnChangeCheckBox.setSelected(false);
+		onlyOnChangeCheckBox.setBounds(400, 240, 25, 20);
+		onlyOnChangeCheckBox.addActionListener(actionEvent -> {
+			onlyOnChange = onlyOnChangeCheckBox.isSelected();
+		});
+		parameterPanel.add(onlyOnChangeCheckBox);
+		
+		
+		
 		
 		JLabel delayLabel = new JLabel("Delay:");
 		delayLabel.setBounds(200, 210, 50, 20);
@@ -167,7 +185,7 @@ public class ConnectPhysical implements Algorithm{
 		parameterPanel.add(delayUnitLabel);	
 		
 		warningLabel = new JLabel(stringToHtml(stringWithColor("You need to Stop and Run again to affect delay change.", "red")));
-		warningLabel.setBounds(200, 240, 400, 20);
+		warningLabel.setBounds(200, 280, 400, 20);
 		warningLabel.setVisible(false);
 		parameterPanel.add(warningLabel);	
 		
@@ -296,6 +314,7 @@ public class ConnectPhysical implements Algorithm{
 		console.println("Starting sending Requests on localhost:2019");
 		final ScheduledExecutorService 	executorService = Executors.newSingleThreadScheduledExecutor();
 		final Runnable beeper = new Runnable() {
+				
 				//RepeatedMethod
 		       	public void run() {
 		       		if(lessInformation)console.print(".");
@@ -316,11 +335,28 @@ public class ConnectPhysical implements Algorithm{
 						return;
 					}
 					if(wrapper.hObject.getNumberOfElements() > 0) {
+						//OnlyForRotor
+						
 						int value = Math.round(((float)wrapper.hObject.getNumberOfActiveElements()/(float) wrapper.hObject.getNumberOfElements())*(float) 100);					
-						sendRequest(wrapper.postAddress, value);
+						if(onlyOnChange) {
+							if(oldValueRotor != value) {
+								sendRequest(wrapper.postAddress, value);
+								oldValueRotor = value; 
+							}
+						}else {
+							sendRequest(wrapper.postAddress, value);
+						}
+						
 						
 					}else {
-						sendRequest(wrapper.postAddress, 0);
+						if(onlyOnChange) {
+							if(oldValueRotor != 0) {
+								sendRequest(wrapper.postAddress, 0);
+								oldValueRotor = 0; 
+							}
+						}else {
+							sendRequest(wrapper.postAddress, 0);
+						}
 					}
 						
 					
@@ -351,6 +387,7 @@ public class ConnectPhysical implements Algorithm{
 				      
 				      // just want to do an HTTP GET here
 				      connection.setRequestMethod("GET");
+				      connection.getResponseCode();
 				     
 				      // give it 15 seconds to respond
 				      connection.setReadTimeout(1000);
@@ -379,18 +416,46 @@ public class ConnectPhysical implements Algorithm{
 					List<HolonElement> elementsOfRoom2 = house.hObject.getElements().stream().filter(ele -> ele.getEleName().contains(room2Keyword)).collect(Collectors.toList());
 					
 					if(elementsOfRoom1.isEmpty()){
-						sendRequest(room1Address, 0);
+						if(onlyOnChange) {
+							if(oldValueRoom1 != 0) {
+								sendRequest(room1Address, 0);
+								oldValueRoom1 = 0; 
+							}
+						}else {
+							sendRequest(room1Address, 0);
+						}
 					}
 					else{
 						int value = Math.round(((float)elementsOfRoom1.stream().filter(ele -> ele.isActive()).count()/(float) elementsOfRoom1.size())*(float) 100);					
-						sendRequest(room1Address, value);
+						if(onlyOnChange) {
+							if(oldValueRoom1 != value) {
+								sendRequest(room1Address, value);
+								oldValueRoom1 = value; 
+							}
+						}else {
+							sendRequest(room1Address, value);
+						}
 					}
 					if(elementsOfRoom2.isEmpty()){
-						sendRequest(room2Address, 0);
+						if(onlyOnChange) {
+							if(oldValueRoom2 != 0) {
+								sendRequest(room2Address, 0);
+								oldValueRoom2 = 0; 
+							}
+						}else {
+							sendRequest(room2Address, 0);
+						}
 					}
 					else{
 						int value = Math.round(((float)elementsOfRoom2.stream().filter(ele -> ele.isActive()).count()/(float) elementsOfRoom2.size())*(float) 100);					
-						sendRequest(room2Address, value);
+						if(onlyOnChange) {
+							if(oldValueRoom2 != value) {
+								sendRequest(room2Address, value);
+								oldValueRoom2 = value; 
+							}
+						}else {
+							sendRequest(room2Address, value);
+						}
 					}
 					
 					

+ 48 - 16
src/connection/socket/Server.java

@@ -1,4 +1,4 @@
-package connection.socket;
+package Connection.socket;
 import java.net.*;
 import java.util.ArrayList;
 import java.util.List;
@@ -21,7 +21,8 @@ public class Server implements Runnable{
     
     
     private HolonObject observed;
-    private HolonObjectModel model;
+	private HolonObjectModel modelField;
+    private HolonObjectModel newModelField;
 	private Control control;
     
     public Server(int port, ui.view.Console console, HolonObject observed, Control control) throws IOException {
@@ -33,8 +34,10 @@ public class Server implements Runnable{
         //Wait for Connection
     	Thread serverThread = new Thread(this);
         serverThread.start();
-            
-            
+        this.modelField = createModel();
+        this.newModelField = createModel();
+        
+        
     }
  
     public void stopServer() throws IOException {
@@ -63,7 +66,7 @@ public class Server implements Runnable{
 			out = new DataOutputStream(clientSocket.getOutputStream());
 			in = new DataInputStream(new BufferedInputStream(clientSocket.getInputStream()));
 			if(observed == null) stopConnection();	
-			createModel();
+			this.modelField = createModel();
 			Thread updateThread = new Thread(new UpdateLoop());
 			updateThread.start();
 			//InputLoop
@@ -95,6 +98,7 @@ public class Server implements Runnable{
 				console.println("Res: [" + inputByte + "] -> SetAmount");
 				int index = in.readInt();
 				int amount = in.readInt();
+				modelField.getElements().get(index).amount = amount;
 				observed.getElements().get(index).setAmount(amount);
 				
 			}else if (inputByte == Command.SetEnable) {
@@ -102,11 +106,13 @@ public class Server implements Runnable{
 				console.println("Res: [" + inputByte + "] -> SetEnable");
 				int index = in.readInt();
 				boolean enabled = in.readBoolean();
+				modelField.getElements().get(index).enabled = enabled;
 				observed.getElements().get(index).setActive(enabled);
 			}else if (inputByte == Command.IncreaseAmount) {
 				if(observed == null) stopConnection();
 				console.println("Res: [" + inputByte + "] -> IncreaseAmount");
 				int index = in.readInt();
+				modelField.getElements().get(index).amount++;
 				HolonElement ele = observed.getElements().get(index);
 				ele.setAmount(ele.getAmount()+1);
 				
@@ -114,6 +120,7 @@ public class Server implements Runnable{
 				if(observed == null) stopConnection();
 				console.println("Res: [" + inputByte + "] -> DecreaseAmount");
 				int index = in.readInt();
+				modelField.getElements().get(index).amount--;
 				HolonElement ele = observed.getElements().get(index);
 				ele.setAmount(ele.getAmount()-1);
 				
@@ -127,12 +134,13 @@ public class Server implements Runnable{
 	}
 	
 	
-	private void createModel() {
-		model = new HolonObjectModel();
+	private HolonObjectModel createModel() {
+		HolonObjectModel model = new HolonObjectModel();
 		int index = 0;
 		for(HolonElement ele :observed.getElements()) {
 			model.add(ele, index++);
 		}
+		return model;
 	}
 	
 	
@@ -158,27 +166,34 @@ public class Server implements Runnable{
 		private void waitOneSecond() {
 			//wait one second
 			try {
-				TimeUnit.SECONDS.sleep(5);
+				TimeUnit.SECONDS.sleep(1);
 			} catch (InterruptedException e) {
 			}
 		}
 
 		private boolean checkForUpdates() {
 			//TODO Delete And CheckforUpdatesReal
-			//-->Test
-			waitOneSecond();
-			createModel();
-			//<--Test
+			newModelField = createModel();
+			if(compareModels(modelField,newModelField)) {
+				return false;
+			}
+			modelField = newModelField;
 			return true;
+			
 		}
-
+		/**
+		 * Returns true if both are the same.
+		 * @param modelField
+		 * @param newModelField
+		 * @return
+		 */
 		private void sendUpdate() {
 			try {
 				if(observed == null) stopConnection();
 				console.println("Send: [" + Command.Update + "] -> Update");
 				out.writeByte(Command.Update);
-				out.writeInt(model.size());
-				for(HolonElementWrapper wrapper : model.getElements()) {
+				out.writeInt(modelField.size());
+				for(HolonElementWrapper wrapper : modelField.getElements()) {
 					out.writeUTF(wrapper.name);
 					out.writeInt(wrapper.amount);
 					out.writeFloat(wrapper.energy);
@@ -193,6 +208,20 @@ public class Server implements Runnable{
 		}
 	}
 	
+	private boolean compareModels(HolonObjectModel model, HolonObjectModel newModel) {
+		if(model.size() != newModel.size()) {
+			return false;
+		}
+		for(int i = 0; i < model.size(); i++) {
+			if(!model.getElements().get(i).equals(newModel.getElements().get(i))) {				
+				return false;
+			}
+		}
+		return true;
+	}
+	public void setObserved(HolonObject observed) {
+		this.observed = observed;
+	}
 	
 	public class Command {
 		//InputCommands
@@ -266,7 +295,10 @@ public class Server implements Runnable{
 			   return false;
 			}
 			HolonElementWrapper element = (HolonElementWrapper) obj;
-			return this.name == element.name &&
+			
+			
+			
+			return this.name.compareTo(element.name) == 0 &&
 				   this.amount == element.amount &&
 				   this.energy == element.energy &&
 				   this.enabled == element.enabled;