1 | package dk.deepthought.sidious.gui; |
2 | |
3 | import java.util.ArrayList; |
4 | import java.util.Arrays; |
5 | import java.util.Collection; |
6 | import java.util.Collections; |
7 | import java.util.Stack; |
8 | |
9 | import dk.deepthought.sidious.blackboard.BlackBoardEngine; |
10 | import dk.deepthought.sidious.greenhouse.CO2SetPoint; |
11 | import dk.deepthought.sidious.greenhouse.ClimaticState; |
12 | import dk.deepthought.sidious.greenhouse.Greenhouse; |
13 | import dk.deepthought.sidious.greenhouse.HeaterSetPoint; |
14 | import dk.deepthought.sidious.greenhouse.ScreenSetPoint; |
15 | import dk.deepthought.sidious.greenhouse.SensorInput; |
16 | import dk.deepthought.sidious.greenhouse.WindowSetPoint; |
17 | import dk.deepthought.sidious.planner.Plan; |
18 | import dk.deepthought.sidious.planner.PlannerEngine; |
19 | import dk.deepthought.sidious.planner.graph.Vertex; |
20 | import dk.deepthought.sidious.rules.ConstrainingRule; |
21 | import dk.deepthought.sidious.rules.PhotosynthesisRule; |
22 | import dk.deepthought.sidious.rules.Rule; |
23 | import dk.deepthought.sidious.rules.TemperatureRule; |
24 | import dk.deepthought.sidious.services.ServiceEngine; |
25 | import dk.deepthought.sidious.supportsystem.Adjustable; |
26 | import dk.deepthought.sidious.supportsystem.Step; |
27 | import dk.deepthought.sidious.supportsystem.SuperLinkID; |
28 | import dk.deepthought.sidious.supportsystem.SystemSettings; |
29 | |
30 | /** |
31 | * This class works as the controller for the model-view-controller hook into |
32 | * the planner. |
33 | * |
34 | * @author Deepthought |
35 | * |
36 | */ |
37 | public class SidiousController { |
38 | |
39 | /** |
40 | * The displayed GUI. |
41 | */ |
42 | private Display display; |
43 | |
44 | /** |
45 | * The the current greenhouse to calculate for. |
46 | */ |
47 | private Greenhouse requester; |
48 | |
49 | /** |
50 | * Constructor. |
51 | * |
52 | * @param mode |
53 | * the plan mode to calculate |
54 | */ |
55 | public SidiousController(PLAN_MODE mode) { |
56 | switch (mode) { |
57 | case BIG: |
58 | bigger(); |
59 | break; |
60 | case SMALL: |
61 | small(); |
62 | break; |
63 | |
64 | default: |
65 | break; |
66 | } |
67 | display = new Display(); |
68 | display.setController(this); |
69 | } |
70 | |
71 | /** |
72 | * Calculate the bigger plan. |
73 | */ |
74 | private void bigger() { |
75 | SuperLinkID greenhouseID = new SuperLinkID("bigger"); |
76 | // Add adjustables |
77 | Collection<Adjustable> adjs = new ArrayList<Adjustable>(); |
78 | adjs.add(new HeaterSetPoint(22)); |
79 | adjs.add(new CO2SetPoint(750)); |
80 | adjs.add(new ScreenSetPoint(0)); |
81 | adjs.add(new WindowSetPoint(0)); |
82 | // Add rules |
83 | Collection<Rule> rules = new ArrayList<Rule>(); |
84 | rules.add(new ConstrainingRule(SystemSettings.getTemperatureID(), |
85 | SystemSettings.getHumidityID(), SystemSettings |
86 | .getIrradianceID(), SystemSettings.getCO2ID())); |
87 | rules.add(new TemperatureRule(greenhouseID)); |
88 | rules.add(new PhotosynthesisRule(greenhouseID)); |
89 | // Creating current state |
90 | SensorInput temperature = new SensorInput(SystemSettings |
91 | .getTemperatureID(), 26); |
92 | SensorInput hum = new SensorInput(SystemSettings.getHumidityID(), 10); |
93 | SensorInput light = new SensorInput(SystemSettings.getIrradianceID(), |
94 | 800); |
95 | SensorInput time = new SensorInput(SystemSettings.getTimeID(), 50); |
96 | SensorInput co2 = new SensorInput(SystemSettings.getCO2ID(), 790); |
97 | ClimaticState source = new ClimaticState(Arrays.asList(temperature, |
98 | hum, light, co2, time)); |
99 | // 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 | } |