thermferm/simulator.c

changeset 716
5c30c8ef83a8
parent 715
f5d85af156ab
child 724
01e3936f62d4
equal deleted inserted replaced
715:f5d85af156ab 716:5c30c8ef83a8
27 #include "delay.h" 27 #include "delay.h"
28 #include "xutil.h" 28 #include "xutil.h"
29 #include "websocket.h" 29 #include "websocket.h"
30 #include "simulator.h" 30 #include "simulator.h"
31 31
32 int my_simulator_state = 0; 32 int my_simulator_state = THREAD_OFF;
33 int my_simulator_command = THREAD_OFF;
34
33 35
34 #ifdef USE_SIMULATOR 36 #ifdef USE_SIMULATOR
35 37
36 extern sys_config Config; 38 extern sys_config Config;
37 extern const char DEVPRESENT[4][6]; 39 extern const char DEVPRESENT[4][6];
38 40
39 int my_simulator_shutdown = 0;
40 41
41 42
42 static int simulate(void); 43 static int simulate(void);
43 44
44 45
151 payload = xstrcat(payload, simulator->light_address); 152 payload = xstrcat(payload, simulator->light_address);
152 payload = xstrcat(payload, (char *)"\",\"present\":\""); 153 payload = xstrcat(payload, (char *)"\",\"present\":\"");
153 payload = xstrcat(payload, (char *)DEVPRESENT[simulator->light_present]); 154 payload = xstrcat(payload, (char *)DEVPRESENT[simulator->light_present]);
154 payload = xstrcat(payload, (char *)"\",\"power\":"); 155 payload = xstrcat(payload, (char *)"\",\"power\":");
155 sprintf(buf, "%d", simulator->light_power); 156 sprintf(buf, "%d", simulator->light_power);
157 payload = xstrcat(payload, buf);
158 payload = xstrcat(payload, (char *)"},\"door\":{\"address\":\"");
159
160 payload = xstrcat(payload, simulator->door_address);
161 payload = xstrcat(payload, (char *)"\",\"present\":\"");
162 payload = xstrcat(payload, (char *)DEVPRESENT[simulator->door_present]);
163 payload = xstrcat(payload, (char *)"\",\"value\":");
164 sprintf(buf, "%d", simulator->door_value);
165 payload = xstrcat(payload, buf);
166 payload = xstrcat(payload, (char *)"},\"psu\":{\"address\":\"");
167
168 payload = xstrcat(payload, simulator->psu_address);
169 payload = xstrcat(payload, (char *)"\",\"present\":\"");
170 payload = xstrcat(payload, (char *)DEVPRESENT[simulator->psu_present]);
171 payload = xstrcat(payload, (char *)"\",\"value\":");
172 sprintf(buf, "%d", simulator->psu_value);
156 payload = xstrcat(payload, buf); 173 payload = xstrcat(payload, buf);
157 payload = xstrcat(payload, (char *)"},\"frigo_isolation\":"); 174 payload = xstrcat(payload, (char *)"},\"frigo_isolation\":");
158 175
159 sprintf(buf, "%.4f", simulator->frigo_isolation); 176 sprintf(buf, "%.4f", simulator->frigo_isolation);
160 payload = xstrcat(payload, buf); 177 payload = xstrcat(payload, buf);
193 210
194 211
195 212
196 void *my_simulator_loop(void *threadid) 213 void *my_simulator_loop(void *threadid)
197 { 214 {
198 my_simulator_state = 1; 215 my_simulator_command = THREAD_RUN;
199 syslog(LOG_NOTICE, "Thread my_simulator_loop started"); 216 syslog(LOG_NOTICE, "Thread my_simulator_loop started");
200 217
201 /* 218 /*
202 * Run the state machine 219 * Run the state machine
203 */ 220 */
204 simulate(); 221 simulate();
205 222
206 syslog(LOG_NOTICE, "Thread my_simulator_loop stopped"); 223 syslog(LOG_NOTICE, "Thread my_simulator_loop stopped");
207 my_simulator_state = 0;
208 return 0; 224 return 0;
209 } 225 }
210 226
211 227
212 SM_DECL(simulate, (char *)"simulator") 228 SM_DECL(simulate, (char *)"simulator")
213 SM_STATES 229 SM_STATES
214 Init, 230 Init,
231 Pause,
215 Waiting, 232 Waiting,
216 Run, 233 Run,
217 Websocket 234 Websocket
218 SM_NAMES 235 SM_NAMES
219 (char *)"Init", 236 (char *)"Init",
237 (char *)"Pause",
220 (char *)"Waiting", 238 (char *)"Waiting",
221 (char *)"run", 239 (char *)"run",
222 (char *)"Websocket" 240 (char *)"Websocket"
223 SM_EDECL 241 SM_EDECL
224 simulator_list *simulator; 242 simulator_list *simulator;
237 /* 255 /*
238 * Heater and cooler have the air temperature 256 * Heater and cooler have the air temperature
239 */ 257 */
240 simulator->s_heat_temp = simulator->s_cool_temp = simulator->room_temperature; 258 simulator->s_heat_temp = simulator->s_cool_temp = simulator->room_temperature;
241 } 259 }
260 my_simulator_state = THREAD_RUN;
242 SM_PROCEED(Waiting); 261 SM_PROCEED(Waiting);
243 262
263 SM_STATE(Pause)
264
265 my_simulator_state = THREAD_PAUSE;
266 if (my_simulator_command == THREAD_OFF) {
267 SM_SUCCESS;
268 } else if (my_simulator_command == THREAD_RUN) {
269 my_simulator_state = THREAD_RUN;
270 SM_PROCEED(Waiting);
271 }
272 mDelay(50);
273
244 SM_STATE(Waiting) 274 SM_STATE(Waiting)
245 275
246 if (my_simulator_shutdown) { 276 if (my_simulator_command == THREAD_OFF) {
247 SM_SUCCESS; 277 SM_SUCCESS;
248 } 278 } else if (my_simulator_command == THREAD_PAUSE) {
279 SM_PROCEED(Pause);
280 }
281
249 now = time(NULL); 282 now = time(NULL);
250 if (now != last) { 283 if (now != last) {
251 last = now; 284 last = now;
252 seconds++; 285 seconds++;
253 SM_PROCEED(Run); 286 SM_PROCEED(Run);
256 289
257 SM_STATE(Run) 290 SM_STATE(Run)
258 291
259 changed = false; 292 changed = false;
260 for (simulator = Config.simulators; simulator; simulator = simulator->next) { 293 for (simulator = Config.simulators; simulator; simulator = simulator->next) {
261 if (my_simulator_shutdown) { 294 if (my_simulator_command == THREAD_OFF) {
262 SM_SUCCESS; 295 SM_SUCCESS;
296 } else if (my_simulator_command == THREAD_PAUSE) {
297 SM_PROCEED(Pause);
263 } 298 }
264 299
265 /* 300 /*
266 * Copy to duplicates 301 * Copy to duplicates
267 */ 302 */
345 } 380 }
346 SM_PROCEED(Websocket); 381 SM_PROCEED(Websocket);
347 382
348 SM_STATE(Websocket) 383 SM_STATE(Websocket)
349 384
350 if (my_simulator_shutdown) { 385 if (my_simulator_command == THREAD_OFF) {
351 SM_SUCCESS; 386 SM_SUCCESS;
387 } else if (my_simulator_command == THREAD_PAUSE) {
388 SM_PROCEED(Pause);
352 } 389 }
353 if (changed) { 390 if (changed) {
354 simulator_ws(); 391 simulator_ws();
355 changed = false; 392 changed = false;
356 } 393 }
357 SM_PROCEED(Waiting); 394 SM_PROCEED(Waiting);
358 395
359 SM_END 396 SM_END
397
398 my_simulator_state = THREAD_OFF;
399
360 SM_RETURN 400 SM_RETURN
361 401
362 402
363 #endif 403 #endif

mercurial