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 = (ClimaticState) vertex.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 }
|