001 package dk.deepthought.sidious.gui;
002 
003 import java.util.ArrayList;
004 import java.util.Arrays;
005 import java.util.Collection;
006 import java.util.Collections;
007 import java.util.Stack;
008 
009 import dk.deepthought.sidious.blackboard.BlackBoardEngine;
010 import dk.deepthought.sidious.greenhouse.CO2SetPoint;
011 import dk.deepthought.sidious.greenhouse.ClimaticState;
012 import dk.deepthought.sidious.greenhouse.Greenhouse;
013 import dk.deepthought.sidious.greenhouse.HeaterSetPoint;
014 import dk.deepthought.sidious.greenhouse.ScreenSetPoint;
015 import dk.deepthought.sidious.greenhouse.SensorInput;
016 import dk.deepthought.sidious.greenhouse.WindowSetPoint;
017 import dk.deepthought.sidious.planner.Plan;
018 import dk.deepthought.sidious.planner.PlannerEngine;
019 import dk.deepthought.sidious.planner.graph.Vertex;
020 import dk.deepthought.sidious.rules.ConstrainingRule;
021 import dk.deepthought.sidious.rules.PhotosynthesisRule;
022 import dk.deepthought.sidious.rules.Rule;
023 import dk.deepthought.sidious.rules.TemperatureRule;
024 import dk.deepthought.sidious.services.ServiceEngine;
025 import dk.deepthought.sidious.supportsystem.Adjustable;
026 import dk.deepthought.sidious.supportsystem.Step;
027 import dk.deepthought.sidious.supportsystem.SuperLinkID;
028 import dk.deepthought.sidious.supportsystem.SystemSettings;
029 
030 /**
031  * This class works as the controller for the model-view-controller hook into
032  * the planner.
033  
034  @author Deepthought
035  
036  */
037 public class SidiousController {
038 
039     /**
040      * The displayed GUI.
041      */
042     private Display display;
043 
044     /**
045      * The the current greenhouse to calculate for.
046      */
047     private Greenhouse requester;
048 
049     /**
050      * Constructor.
051      
052      @param mode
053      *            the plan mode to calculate
054      */
055     public SidiousController(PLAN_MODE mode) {
056         switch (mode) {
057         case BIG:
058             bigger();
059             break;
060         case SMALL:
061             small();
062             break;
063 
064         default:
065             break;
066         }
067         display = new Display();
068         display.setController(this);
069     }
070 
071     /**
072      * Calculate the bigger plan.
073      */
074     private void bigger() {
075         SuperLinkID greenhouseID = new SuperLinkID("bigger");
076         // Add adjustables
077         Collection<Adjustable> adjs = new ArrayList<Adjustable>();
078         adjs.add(new HeaterSetPoint(22));
079         adjs.add(new CO2SetPoint(750));
080         adjs.add(new ScreenSetPoint(0));
081         adjs.add(new WindowSetPoint(0));
082         // Add rules
083         Collection<Rule> rules = new ArrayList<Rule>();
084         rules.add(new ConstrainingRule(SystemSettings.getTemperatureID(),
085                 SystemSettings.getHumidityID(), SystemSettings
086                         .getIrradianceID(), SystemSettings.getCO2ID()));
087         rules.add(new TemperatureRule(greenhouseID));
088         rules.add(new PhotosynthesisRule(greenhouseID));
089         // Creating current state
090         SensorInput temperature = new SensorInput(SystemSettings
091                 .getTemperatureID()26);
092         SensorInput hum = new SensorInput(SystemSettings.getHumidityID()10);
093         SensorInput light = new SensorInput(SystemSettings.getIrradianceID(),
094                 800);
095         SensorInput time = new SensorInput(SystemSettings.getTimeID()50);
096         SensorInput co2 = new SensorInput(SystemSettings.getCO2ID()790);
097         ClimaticState source = new ClimaticState(Arrays.asList(temperature,
098                 hum, light, co2, time));
099         // Setting sensors on service engine
100         ServiceEngine.setSensorList(source.getSensors());
101         // Request plan
102         requester = new Greenhouse(greenhouseID, adjs, rules);
103     }
104 
105     /**
106      * Calculate the smaller plan.
107      */
108     private void small() {
109         SuperLinkID greenhouseID = new SuperLinkID("small");
110         Collection<Adjustable> adjs = new ArrayList<Adjustable>();
111         adjs.add(new HeaterSetPoint(25));
112         // Add rules
113         Collection<Rule> rules = new ArrayList<Rule>();
114         TemperatureRule temperatureRule = new TemperatureRule(greenhouseID);
115         rules.add(temperatureRule);
116         rules.add(new ConstrainingRule(SystemSettings.getHumidityID(),
117                 SystemSettings.getTimeID()));
118         // Creating current state
119         SensorInput temperature = new SensorInput(SystemSettings
120                 .getTemperatureID()25);
121         SensorInput hum = new SensorInput(SystemSettings.getHumidityID()50);
122         SensorInput time = new SensorInput(SystemSettings.getTimeID()0);
123         ClimaticState source = new ClimaticState(Arrays.asList(temperature,
124                 hum, time));
125         // Setting sensors on service engine
126         ServiceEngine.setSensorList(source.getSensors());
127         // Request plan
128         requester = new Greenhouse(greenhouseID, adjs, rules);
129     }
130 
131     /**
132      * Starts the calculations.
133      */
134     public void start() {
135         SidiousOutput.getInstance().register(this);
136         BlackBoardEngine.getInstance().requestPlan(requester);
137     }
138 
139     /**
140      * Sets the newly created vertex. Callback method from the model.
141      
142      @param vertex
143      *            the vertex that have been created in the model.
144      */
145     public void vertex(Vertex vertex) {
146         double cost = vertex.g();
147         ClimaticState state = (ClimaticStatevertex.getState();
148         double temperature = 0;
149         double humidity = 0;
150         double co2 = 0;
151         double irradiance = 0;
152         double time = 0;
153         for (SensorInput input : state.getSensors()) {
154             if (input.getID().equals(SystemSettings.getTemperatureID())) {
155                 temperature = input.getValue();
156             else if (input.getID().equals(SystemSettings.getHumidityID())) {
157                 humidity = input.getValue();
158             else if (input.getID().equals(SystemSettings.getCO2ID())) {
159                 co2 = input.getValue();
160             else if (input.getID().equals(SystemSettings.getIrradianceID())) {
161                 irradiance = input.getValue();
162             else if (input.getID().equals(SystemSettings.getTimeID())) {
163                 time = input.getValue();
164             }
165         }
166         display.setVertexAndStateValues(cost, temperature, humidity, co2,
167                 irradiance, time);
168     }
169 
170     /**
171      * Sets the newly generated plan. Callback method from the model.
172      
173      @param plan
174      *            the plan that have been generated in the model.
175      */
176     public void finished(Plan plan) {
177         Stack<Step> steps = plan.getSteps();
178         Collections.reverse(steps);
179         display.finished(steps);
180     }
181 
182     /**
183      * Stop calculating.
184      */
185     public void stop() {
186         PlannerEngine.getInstance().stop(requester.getID());
187     }
188 
189     /**
190      * Enumeration to specify which plan to calculate.
191      
192      @author Deepthought
193      
194      */
195     public static enum PLAN_MODE {
196         SMALL, BIG;
197     }
198 
199     /**
200      * The main method.
201      */
202     public static void main(String[] args) {
203         new SidiousController(PLAN_MODE.BIG);
204     }
205 }