|
@@ -1,4 +1,4 @@
|
|
|
-package Connection;
|
|
|
+package connection;
|
|
|
import java.awt.BorderLayout;
|
|
|
import java.awt.Component;
|
|
|
import java.awt.Dimension;
|
|
@@ -15,6 +15,7 @@ import java.util.concurrent.Executors;
|
|
|
import java.util.concurrent.Future;
|
|
|
import java.util.concurrent.ScheduledExecutorService;
|
|
|
import java.util.concurrent.TimeUnit;
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
import javax.swing.BorderFactory;
|
|
|
import javax.swing.ImageIcon;
|
|
@@ -33,8 +34,10 @@ import javax.swing.text.NumberFormatter;
|
|
|
import api.Algorithm;
|
|
|
import classes.AbstractCpsObject;
|
|
|
import classes.CpsUpperNode;
|
|
|
+import classes.HolonElement;
|
|
|
import classes.HolonObject;
|
|
|
import ui.controller.Control;
|
|
|
+import ui.view.Console;
|
|
|
|
|
|
* Easy Connection via Http Request. Repeat Request with a delay.
|
|
|
*
|
|
@@ -50,10 +53,10 @@ public class ConnectPhysical implements Algorithm{
|
|
|
|
|
|
|
|
|
private JPanel content = new JPanel();
|
|
|
- private JTextArea textArea;
|
|
|
- JLabel rotorLabel;
|
|
|
- JLabel room1Label;
|
|
|
- JLabel room2Label;
|
|
|
+ private Console console;
|
|
|
+
|
|
|
+ private JLabel rotorLabel;
|
|
|
+ private JLabel houseLabel;
|
|
|
|
|
|
|
|
|
Future<?> future;
|
|
@@ -80,8 +83,18 @@ public class ConnectPhysical implements Algorithm{
|
|
|
|
|
|
|
|
|
PhysicalLinkWrapper rotor = new PhysicalLinkWrapper(null, HolonObjectStatus.NotSelected, "/rotor/");
|
|
|
- PhysicalLinkWrapper room1 = new PhysicalLinkWrapper(null, HolonObjectStatus.NotSelected, "/room1/");
|
|
|
- PhysicalLinkWrapper room2 = new PhysicalLinkWrapper(null, HolonObjectStatus.NotSelected, "/room2/");
|
|
|
+
|
|
|
+
|
|
|
+ PhysicalLinkWrapper house = new PhysicalLinkWrapper(null, HolonObjectStatus.NotSelected, "notUsed");
|
|
|
+ String room1Address = "/room1/";
|
|
|
+ String room2Address = "/room2/";
|
|
|
+
|
|
|
+ String room1Keyword = "room1";
|
|
|
+ String room2Keyword = "room2";
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
|
|
|
|
|
|
|
|
@@ -109,10 +122,8 @@ public class ConnectPhysical implements Algorithm{
|
|
|
|
|
|
public ConnectPhysical() {
|
|
|
content.setLayout(new BorderLayout());
|
|
|
-
|
|
|
- textArea = new JTextArea();
|
|
|
- textArea.setEditable(false);
|
|
|
- JScrollPane scrollPane = new JScrollPane(textArea);
|
|
|
+ console = new Console();
|
|
|
+ JScrollPane scrollPane = new JScrollPane(console);
|
|
|
JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT,
|
|
|
createOptionPanel() , scrollPane);
|
|
|
splitPane.setResizeWeight(0.0);
|
|
@@ -135,12 +146,12 @@ public class ConnectPhysical implements Algorithm{
|
|
|
|
|
|
|
|
|
JLabel lessInformationLabel = new JLabel("Less information in Console:");
|
|
|
- lessInformationLabel.setBounds(200, 150, 200, 20);
|
|
|
+ lessInformationLabel.setBounds(200, 180, 200, 20);
|
|
|
parameterPanel.add(lessInformationLabel);
|
|
|
|
|
|
JCheckBox lessInformationCheckBox = new JCheckBox();
|
|
|
lessInformationCheckBox.setSelected(false);
|
|
|
- lessInformationCheckBox.setBounds(400, 150, 25, 20);
|
|
|
+ lessInformationCheckBox.setBounds(400, 180, 25, 20);
|
|
|
lessInformationCheckBox.addActionListener(actionEvent -> {
|
|
|
lessInformation = lessInformationCheckBox.isSelected();
|
|
|
});
|
|
@@ -148,15 +159,15 @@ public class ConnectPhysical implements Algorithm{
|
|
|
|
|
|
|
|
|
JLabel delayLabel = new JLabel("Delay:");
|
|
|
- delayLabel.setBounds(200, 180, 50, 20);
|
|
|
+ delayLabel.setBounds(200, 210, 50, 20);
|
|
|
parameterPanel.add(delayLabel);
|
|
|
|
|
|
JLabel delayUnitLabel = new JLabel("[ms]");
|
|
|
- delayUnitLabel.setBounds(300, 180, 50, 20);
|
|
|
+ delayUnitLabel.setBounds(300, 210, 50, 20);
|
|
|
parameterPanel.add(delayUnitLabel);
|
|
|
|
|
|
warningLabel = new JLabel(stringToHtml(stringWithColor("You need to Stop and Run again to affect delay change.", "red")));
|
|
|
- warningLabel.setBounds(200, 210, 400, 20);
|
|
|
+ warningLabel.setBounds(200, 240, 400, 20);
|
|
|
warningLabel.setVisible(false);
|
|
|
parameterPanel.add(warningLabel);
|
|
|
|
|
@@ -175,11 +186,11 @@ public class ConnectPhysical implements Algorithm{
|
|
|
delayTextField.addPropertyChangeListener(actionEvent -> {
|
|
|
delay = Integer.parseInt(delayTextField.getValue().toString());
|
|
|
if(future != null && !future.isCancelled()) {
|
|
|
- println("You need to Stop and Run again to affect this change.");
|
|
|
+ console.println("You need to Stop and Run again to affect this change.");
|
|
|
warningLabel.setVisible(true);
|
|
|
}
|
|
|
});
|
|
|
- delayTextField.setBounds(250, 180, 50, 20);
|
|
|
+ delayTextField.setBounds(250, 210, 50, 20);
|
|
|
parameterPanel.add(delayTextField);
|
|
|
|
|
|
|
|
@@ -188,13 +199,18 @@ public class ConnectPhysical implements Algorithm{
|
|
|
rotorLabel.setBounds(200, 60, 220, 30);
|
|
|
parameterPanel.add(rotorLabel);
|
|
|
|
|
|
- room1Label = new JLabel(stringToHtml("Room1 Status: " + statusToString(room1.status)));
|
|
|
- room1Label.setBounds(200, 90, 220, 30);
|
|
|
- parameterPanel.add(room1Label);
|
|
|
+ houseLabel = new JLabel(stringToHtml("House Status: " + statusToString(house.status)));
|
|
|
+ houseLabel.setBounds(200, 90, 220, 30);
|
|
|
+ parameterPanel.add(houseLabel);
|
|
|
+
|
|
|
+ JLabel keywordsLabel = new JLabel("Room Seperation Keywords: " + room1Keyword + " " + room2Keyword);
|
|
|
+ keywordsLabel.setBounds(200, 120, 320, 30);
|
|
|
+ parameterPanel.add(keywordsLabel);
|
|
|
+
|
|
|
+ JLabel keywordsHintLabel = new JLabel("HolonElements with a name that contains the Keyword count.");
|
|
|
+ keywordsHintLabel.setBounds(200, 135, 450, 30);
|
|
|
+ parameterPanel.add(keywordsHintLabel);
|
|
|
|
|
|
- room2Label = new JLabel(stringToHtml("Room2 Status: " + statusToString(room2.status)));
|
|
|
- room2Label.setBounds(200, 120, 220, 30);
|
|
|
- parameterPanel.add(room2Label);
|
|
|
|
|
|
JButton selectRotorButton = new JButton("Select");
|
|
|
selectRotorButton.setBounds(420,65, 90, 20);
|
|
@@ -203,13 +219,10 @@ public class ConnectPhysical implements Algorithm{
|
|
|
|
|
|
JButton selectRoom1Button = new JButton("Select");
|
|
|
selectRoom1Button.setBounds(420,95, 90, 20);
|
|
|
- selectRoom1Button.addActionListener(actionEvent -> this.selectGroupNode(room1));
|
|
|
+ selectRoom1Button.addActionListener(actionEvent -> this.selectGroupNode(house));
|
|
|
parameterPanel.add(selectRoom1Button);
|
|
|
|
|
|
- JButton selectRoom2Button = new JButton("Select");
|
|
|
- selectRoom2Button.setBounds(420,125, 90, 20);
|
|
|
- selectRoom2Button.addActionListener(actionEvent -> this.selectGroupNode(room2));
|
|
|
- parameterPanel.add(selectRoom2Button);
|
|
|
+
|
|
|
|
|
|
return parameterPanel;
|
|
|
}
|
|
@@ -239,8 +252,7 @@ public class ConnectPhysical implements Algorithm{
|
|
|
|
|
|
private void updateStatusLabels() {
|
|
|
rotorLabel.setText(stringToHtml("Rotor Status: " + statusToString(rotor.status)));
|
|
|
- room1Label.setText(stringToHtml("Room1 Status: " + statusToString(room1.status)));
|
|
|
- room2Label.setText(stringToHtml("Room2 Status: " + statusToString(room2.status)));
|
|
|
+ houseLabel.setText(stringToHtml("House Status: " + statusToString(house.status)));
|
|
|
}
|
|
|
|
|
|
|
|
@@ -248,7 +260,7 @@ public class ConnectPhysical implements Algorithm{
|
|
|
private Component createButtonPanel() {
|
|
|
JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
|
|
|
JButton clearButton = new JButton("Clear Console");
|
|
|
- clearButton.addActionListener(actionEvent -> clear());
|
|
|
+ clearButton.addActionListener(actionEvent -> console.clear());
|
|
|
buttonPanel.add(clearButton);
|
|
|
JButton stopButton = new JButton("Stop");
|
|
|
stopButton.addActionListener(actionEvent -> stop());
|
|
@@ -263,38 +275,38 @@ public class ConnectPhysical implements Algorithm{
|
|
|
private void stop() {
|
|
|
if(future!= null) {
|
|
|
if(future.isCancelled()) {
|
|
|
- println("Is cancelled.");
|
|
|
+ console.println("Is cancelled.");
|
|
|
}
|
|
|
else {
|
|
|
future.cancel(true);
|
|
|
- println("Stopped sending Requests on localhost:2019 ...");
|
|
|
+ console.println("Stopped sending Requests on localhost:2019 ...");
|
|
|
}
|
|
|
}
|
|
|
else {
|
|
|
- println("Not started jet.");
|
|
|
+ console.println("Not started jet.");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
private void initSchedule() {
|
|
|
if(future != null && !future.isCancelled()) {
|
|
|
- println("Is running.");
|
|
|
+ console.println("Is running.");
|
|
|
return;
|
|
|
}
|
|
|
warningLabel.setVisible(false);
|
|
|
- println("Starting sending Requests on localhost:2019");
|
|
|
+ console.println("Starting sending Requests on localhost:2019");
|
|
|
final ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
|
|
|
final Runnable beeper = new Runnable() {
|
|
|
|
|
|
public void run() {
|
|
|
- if(lessInformation)print(".");
|
|
|
+ if(lessInformation)console.print(".");
|
|
|
checkWrapper(rotor);
|
|
|
- checkWrapper(room1);
|
|
|
- checkWrapper(room2);
|
|
|
+ checkWrapperHouseSpecial(house);
|
|
|
}
|
|
|
|
|
|
+
|
|
|
private void checkWrapper(PhysicalLinkWrapper wrapper) {
|
|
|
if(wrapper.status == HolonObjectStatus.Connected) checkConnected(wrapper);
|
|
|
- else if(!lessInformation)println(wrapper.postAddress +" is not connected.");
|
|
|
+ else if(!lessInformation)console.println(wrapper.postAddress +" is not connected.");
|
|
|
}
|
|
|
|
|
|
private void checkConnected(PhysicalLinkWrapper wrapper) {
|
|
@@ -305,19 +317,19 @@ public class ConnectPhysical implements Algorithm{
|
|
|
}
|
|
|
if(wrapper.hObject.getNumberOfElements() > 0) {
|
|
|
int value = Math.round(((float)wrapper.hObject.getNumberOfActiveElements()/(float) wrapper.hObject.getNumberOfElements())*(float) 100);
|
|
|
- sendRequest(wrapper, value);
|
|
|
+ sendRequest(wrapper.postAddress, value);
|
|
|
|
|
|
}else {
|
|
|
- sendRequest(wrapper, 0);
|
|
|
+ sendRequest(wrapper.postAddress, 0);
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
- private void sendRequest(PhysicalLinkWrapper wrapper, int value) {
|
|
|
- if(!lessInformation)println("Send " + "http://localhost:2019" + wrapper.postAddress + value);
|
|
|
- doHttpUrlConnectionAction("http://localhost:2019" + wrapper.postAddress + value);
|
|
|
+ private void sendRequest(String postAddress, int value) {
|
|
|
+ if(!lessInformation)console.println("Send " + "http://localhost:2019" + postAddress + value);
|
|
|
+ doHttpUrlConnectionAction("http://localhost:2019" + postAddress + value);
|
|
|
|
|
|
}
|
|
|
|
|
@@ -344,13 +356,45 @@ public class ConnectPhysical implements Algorithm{
|
|
|
connection.setReadTimeout(1000);
|
|
|
connection.connect();
|
|
|
} catch (MalformedURLException e) {
|
|
|
- println("MalformedURLException");
|
|
|
+ console.println("MalformedURLException");
|
|
|
e.printStackTrace();
|
|
|
} catch (IOException e) {
|
|
|
- println("IOException: Connection refused");
|
|
|
+ console.println("IOException: Connection refused");
|
|
|
e.printStackTrace();
|
|
|
}
|
|
|
}
|
|
|
+ private void checkWrapperHouseSpecial(PhysicalLinkWrapper house) {
|
|
|
+ if(!(house.status == HolonObjectStatus.Connected)) {
|
|
|
+ if(!lessInformation)console.println("House" + " is not connected.");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(house.hObject == null) {
|
|
|
+ house.status = HolonObjectStatus.ObjectDeleted;
|
|
|
+ updateStatusLabels();
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ List<HolonElement> elementsOfRoom1 = house.hObject.getElements().stream().filter(ele -> ele.getEleName().contains(room1Keyword)).collect(Collectors.toList());
|
|
|
+ List<HolonElement> elementsOfRoom2 = house.hObject.getElements().stream().filter(ele -> ele.getEleName().contains(room2Keyword)).collect(Collectors.toList());
|
|
|
+
|
|
|
+ if(elementsOfRoom1.isEmpty()){
|
|
|
+ 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(elementsOfRoom2.isEmpty()){
|
|
|
+ sendRequest(room2Address, 0);
|
|
|
+ }
|
|
|
+ else{
|
|
|
+ int value = Math.round(((float)elementsOfRoom2.stream().filter(ele -> ele.isActive()).count()/(float) elementsOfRoom2.size())*(float) 100);
|
|
|
+ sendRequest(room2Address, value);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
};
|
|
|
future = executorService.scheduleAtFixedRate(beeper, 0, delay, TimeUnit.MILLISECONDS);
|
|
|
}
|
|
@@ -374,7 +418,7 @@ public class ConnectPhysical implements Algorithm{
|
|
|
@SuppressWarnings("unchecked")
|
|
|
Handle<HolonObject> selected = (Handle<HolonObject>) JOptionPane.showInputDialog(content, "Select HolonObject:", "HolonObject?", JOptionPane.OK_OPTION,new ImageIcon(new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB)) , possibilities, "");
|
|
|
if(selected != null) {
|
|
|
- println("Selected: " + selected);
|
|
|
+ console.println("Selected: " + selected);
|
|
|
wrapper.hObject = selected.object;
|
|
|
wrapper.status = HolonObjectStatus.Connected;
|
|
|
updateStatusLabels();
|
|
@@ -401,15 +445,7 @@ public class ConnectPhysical implements Algorithm{
|
|
|
this.control = control;
|
|
|
}
|
|
|
|
|
|
- private void clear() {
|
|
|
- textArea.setText("");
|
|
|
- }
|
|
|
- private void print(String message) {
|
|
|
- textArea.append(message);
|
|
|
- }
|
|
|
- private void println(String message) {
|
|
|
- textArea.append(message + "\n");
|
|
|
- }
|
|
|
+
|
|
|
|
|
|
|
|
|
|