Browse Source

#76: addded usage of flexible devices, global option whether flexibility should be done, updating the HolonElement-table after a change (Caution: the last only for single selection)

I. Dix 7 years ago
parent
commit
cf3d796533

+ 18 - 1
src/classes/HolonElement.java

@@ -221,6 +221,11 @@ public class HolonElement {
      */
     public void setActive(boolean active) {
         this.active = active;
+
+        if (!active && flexible) {
+            setEnergy(0);
+            setEnergyAt(0);
+        }
     }
 
     /**
@@ -337,7 +342,7 @@ public class HolonElement {
             // move the energy to actually used energy and set flexible amount to 0
             if (getFlexibleEnergyAvailable() != 0) {
                 setEnergy(getFlexibleEnergyAvailable());
-                setEnergyAt(getFlexibleEnergyAvailable());
+                setEnergyAt(getEnergy());
             }
             setFlexibleEnergyAvailable(0);
         }
@@ -378,4 +383,16 @@ public class HolonElement {
     public void setSaving(Pair<String, String> saving) {
         this.saving = saving;
     }
+
+
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append("[HolonElement: ");
+        sb.append("id=").append(id).append(", eleName=").append(eleName).append(", amount=").append(amount)
+                .append(", active=").append(active).append(", flexible=").append(flexible)
+                .append(", energy used=").append(energy).append(", flexible energy available=").append(flexibleEnergyAvailable);
+        sb.append("]");
+
+        return sb.toString();
+    }
 }

+ 1 - 1
src/classes/HolonObject.java

@@ -131,7 +131,7 @@ public class HolonObject extends AbstractCpsObject {
         float temp = 0;
         for (HolonElement e : getElements()) {
             if (e.isActive()) {
-                temp = temp + e.getTotalEnergy();
+                temp += e.getTotalEnergy();
             }
         }
         currentEnergy = temp;

+ 29 - 13
src/ui/controller/SimulationManager.java

@@ -25,6 +25,8 @@ public class SimulationManager {
     private HashMap<Integer, Float> tagTable = new HashMap<>();
     private FlexiblePane flexPane;
 
+    private HashMap<HolonElement, Float> flexDevicesTurnedOnThisTurn = new HashMap<>();
+
     /**
      * Constructor.
      *
@@ -58,10 +60,14 @@ public class SimulationManager {
             float minConsumption = calculateMinimumEnergy(singleSubNet, timeStep);
 
             // --------------- use flexible devices ---------------
-            // TODO: add global setting, whether the grid should react with flexible devices or whether it should not
-            if (wastedEnergy > 0) {
+            if (wastedEnergy > 0 && model.useFlexibleDevices()) {
                 turnOnFlexibleDevices(singleSubNet, wastedEnergy);
 
+                if (!flexDevicesTurnedOnThisTurn.isEmpty()) {
+                    System.out.println("The following devices were turned on in this turn: ");
+                    System.out.println(flexDevicesTurnedOnThisTurn.toString());
+                }
+
                 // recompute after having examined/turned on all flexible devices
                 production = calculateEnergy("prod", singleSubNet, timeStep);
                 consumption = calculateEnergy("cons", singleSubNet, timeStep);
@@ -120,20 +126,29 @@ public class SimulationManager {
         for (HolonObject holonOb : subNet.getObjects()) {
             for (HolonElement holonEl : holonOb.getElements()) {
                 // if this element is flexible
-                float energyOfElement = holonEl.getEnergy();
-                if (holonEl.isFlexible() && energyOfElement < 0) {
-//                    if (energyOfElement <= wastedEnergy) {
-//                        holonEl.setActive(true);
-//                        wastedEnergy += energyOfElement;
-//                    }else{
-//                    }
-
-//                    System.out.println("el.getEnergy(): " + holonEl.getEnergy());
-//                    System.out.println("wasted: " + wastedEnergy);
+                float actuallyUsedEnergy = holonEl.isActive() ? holonEl.getEnergy() : 0;
+                float energyAvailable = holonEl.getFlexibleEnergyAvailable() - actuallyUsedEnergy;
+                if (holonEl.isFlexible() && energyAvailable < 0) {
+                    // if there is more wasted Energy than energy that this device can give
+                    if (Math.abs(energyAvailable) <= Math.abs(wastedEnergy)) {
+                        holonEl.setActive(true);
+                        wastedEnergy += energyAvailable;
+                        holonEl.setEnergy(energyAvailable);
+                        flexDevicesTurnedOnThisTurn.put(holonEl, energyAvailable);
+                    }
+                    // else if we just need to turn on part of the flexible energy available
+                    else {
+                        holonEl.setActive(true);
+                        float energyNeeded = -wastedEnergy;
+                        wastedEnergy += energyNeeded;   // should give 0, but was kept this was for consistency
+                        holonEl.setEnergy(energyNeeded);
+                        flexDevicesTurnedOnThisTurn.put(holonEl, energyNeeded);
+                    }
+
+                    System.out.println("One element was turned on, wastedEnergy after: " + wastedEnergy + "\n");
                 }
             }
         }
-//        System.out.println();
     }
 
     /**
@@ -519,6 +534,7 @@ public class SimulationManager {
     public void reset() {
         objectsToHandle = new ArrayList<>();
         copyObjects(model.getObjectsOnCanvas());
+        flexDevicesTurnedOnThisTurn = new HashMap<>();
     }
 
     /**

+ 13 - 2
src/ui/model/Model.java

@@ -61,10 +61,13 @@ public class Model {
     private int autoSaveNr = -1;
     // number of max simultaneous autosaves
     private int numberOfSaves = 35;
-    // if the simulation is running and has not been reseted
+    // whether the simulation is running and has not been reseted
     private boolean isSimRunning = false;
-    // if the console log of the program should be displayed
+    // whether the console log of the program should be displayed
     private boolean showConsoleLog = true;
+    // whether the console log of the program should be displayed
+    private boolean useFlexibleDevices = true;
+
     /*
      * Array of all categories in the model. It is set by default with the
      * categories ENERGY, BUILDINGS and COMPONENTS
@@ -891,7 +894,15 @@ public class Model {
      */
     public void setShowConsoleLog(boolean showConsoleLog) {
         this.showConsoleLog = showConsoleLog;
+    }
+
+
+    public boolean useFlexibleDevices() {
+        return this.useFlexibleDevices;
+    }
 
+    public void setUseFlexibleDevices(boolean useFlexibleDevices) {
+        this.useFlexibleDevices = useFlexibleDevices;
     }
 
     /**

+ 25 - 16
src/ui/view/GUI.java

@@ -45,6 +45,7 @@ public class GUI implements CategoryListener {
     private final JMenu mnNewMenuView = new JMenu("View");
     private final JMenu mnHelp = new JMenu("Help");
     private final JCheckBox consoleLogCheckBox = new JCheckBox("Show program console log");
+    private final JCheckBox useFlexibleDevicesCheckBox = new JCheckBox("Automatically use flexible devices");
     private final JMenuItem mntmOpen = new JMenuItem("Open");
     private final JMenuItem mntmNew = new JMenuItem("New");
     private final JMenuItem mntmSave = new JMenuItem("Save");
@@ -158,10 +159,10 @@ public class GUI implements CategoryListener {
     private final JMenuItem mntmEditShowedInformation = new JMenuItem("Edit showed Information");
     private final JMenuItem mntmResetCategory = new JMenuItem("Reset Categories");
     private final JMenu mnLanguage = new JMenu("Language");
-    private final String[] columnNamesMulti = {"Object", "Nr.", "Device", "Energy", "Flexibility", "Quantity", "Activated",
-            "Flex. activated"};
-    private final String[] columnNamesSingle = {"Nr.", "Device", "Energy", "Flexibility", "Quantity", "Activated",
-            "Flex. activated"};
+    private final String[] columnNamesMulti = {"Object", "Nr.", "Device", "Energy", "Flexible Energy Available",
+            "Quantity", "Activated", "Flexible"};
+    private final String[] columnNamesSingle = {"Nr.", "Device", "Energy", "Flexible Energy Available", "Quantity",
+            "Activated", "Flexible"};
     private final ArrayList<PropertyTable> tables = new ArrayList<>();
     private final String[] comboBoxCat = {"Category", "Object", "Switch"};
     private final UpdateController updCon;
@@ -624,6 +625,11 @@ public class GUI implements CategoryListener {
         consoleLogCheckBox.setSelected(true);
         consoleLogCheckBox.addActionListener(arg0 -> controller.setShowConsoleLog(consoleLogCheckBox.isSelected()));
 
+        mnNewMenuOptions.add(useFlexibleDevicesCheckBox);
+        useFlexibleDevicesCheckBox.setSelected(true);
+        useFlexibleDevicesCheckBox.addActionListener(
+                actionEvent -> model.setUseFlexibleDevices(useFlexibleDevicesCheckBox.isSelected()));
+
         menuBar.add(mnNewMenuView);
 
         mnNewMenuView.add(mntmCanvasSize);
@@ -1018,29 +1024,29 @@ public class GUI implements CategoryListener {
                     int selectedValueX = (int) Math.floor(xThis / (model.getTableHolonElement().getWidth() / 7));
                     int selectedValueBX = (int) Math.floor(xBThis / (model.getTableHolonElement().getWidth() / 7));
                     if (updCon.getActualCps() != null && updCon.getActualCps().getClass() == HolonObject.class) {
+                        HolonElement eleTemp;
+
                         // For active column (boolean with a checkbox)
                         if (selectedValueBX == 5) {
-                            HolonElement eleBTemp = updCon
+                            eleTemp = updCon
                                     .getActualHolonElement((HolonObject) updCon.getActualCps(), yBMouse, 0, tables);
                             String newBStuff = model.getSingleTable().getValueAt(selectedValueBY, selectedValueBX)
                                     .toString();
                             Boolean bTemp = Boolean.parseBoolean(newBStuff);
-                            eleBTemp.setActive(bTemp);
+                            eleTemp.setActive(bTemp);
+
                         } // For activeFlex column (boolean with a checkbox)
                         else if (selectedValueBX == 6) {
-                            HolonElement eleBTemp = updCon
+                            eleTemp = updCon
                                     .getActualHolonElement((HolonObject) updCon.getActualCps(), yBMouse, 0, tables);
                             String newBStuff = model.getSingleTable().getValueAt(selectedValueBY, selectedValueBX)
                                     .toString();
                             Boolean bTemp = Boolean.parseBoolean(newBStuff);
-                            eleBTemp.setFlexible(bTemp);
-
-                            // set energy/flexibility/active cells anew, if flexible was clicked
-                            setTableNewCellsAfterFlexibilityClick(bTemp, eleBTemp, selectedValueBY);
+                            eleTemp.setFlexible(bTemp);
 
                         } else {
                             // Update of HolonElement
-                            HolonElement eleTemp = updCon.getActualHolonElement((HolonObject) updCon.getActualCps(),
+                            eleTemp = updCon.getActualHolonElement((HolonObject) updCon.getActualCps(),
                                     yMouse, 0, tables);
                             String newStuff = model.getSingleTable().getValueAt(selectedValueY, selectedValueX)
                                     .toString();
@@ -1062,6 +1068,9 @@ public class GUI implements CategoryListener {
                                 eleTemp.setAmount(iTemp);
                             }
                         }
+
+                        // set all cells anew, if anything was changed
+                        updateElementTableAfterChange(eleTemp, selectedValueBY);
                     }
                 }
                 updCon.refreshTableProperties(model.getPropertyTable());
@@ -2237,10 +2246,10 @@ public class GUI implements CategoryListener {
      * @param eleBTemp
      * @param selectedValueBY
      */
-    private void setTableNewCellsAfterFlexibilityClick(boolean bTemp, HolonElement eleBTemp, int selectedValueBY) {
-        if (bTemp) {
-            model.getSingleTable().setValueAt(Boolean.FALSE, selectedValueBY, 5);
-        }
+    private void updateElementTableAfterChange(HolonElement eleBTemp, int selectedValueBY) {
+        model.getSingleTable().setValueAt(eleBTemp.isFlexible(), selectedValueBY, 6);
+        model.getSingleTable().setValueAt(eleBTemp.isActive(), selectedValueBY, 5);
+        model.getSingleTable().setValueAt(eleBTemp.getAmount(), selectedValueBY, 4);
         model.getSingleTable().setValueAt(eleBTemp.getFlexibleEnergyAvailable(), selectedValueBY, 3);
         model.getSingleTable().setValueAt(eleBTemp.getEnergy(), selectedValueBY, 2);
     }