1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
|
#include "Machine.h"
#include "Monitor.h"
#include "Clock.h"
#include "SafetyThird.h"
const char statenames[][STATENAMELEN]={STATENAMES};
Machine machine;
void setup() {
machine.init();
}
// POST
void Machine::init(){
monitor.init();
inSafeStateToRun=false;
setState(STATE_SELF_TEST_INIT);
safety.init();
if (state() == STATE_SELF_TEST_INIT) {
inSafeStateToRun=true;
setState(STATE_WARM_UP);
}
monitorTask.set(100L, TASK_FOREVER, &Monitor::run);
machine.todolist.addTask(monitorTask);
monitorTask.enable();
machineTask.set(500L, TASK_FOREVER, &systemInCharge);
machine.todolist.addTask(machineTask);
machineTask.enable();
monitor.registerAction(_TMR_, &TMR);
monitor.registerAction(_TMS_, &TMS);
monitor.registerAction(_TRM_, &TRM);
}
const char * Machine::stateName(int s) { return statenames[s]; };
void loop() {
machine.todolist.execute();
}
void Machine::setState(int newState) {
previousState=currentState;
currentState=newState;
monitor.update("STC","%.04d %s ==> %s",
newState,
stateName(previousState),
stateName(newState));
}
#define ENTERING (machine.previousState!=machine.currentState)
// this is the state machine.
static void systemInCharge(){
static time_t lastUpdate;
switch (machine.state()){
case STATE_OFF:
case STATE_SELF_TEST_INIT:break;
case STATE_WARM_UP:
if (ENTERING) {
safety.redLightVal=RED_FULL_ON;//fix number foo
} else {
machine.setState(STATE_RUN_MODE);
}
break;
case STATE_RUN_MODE:
if (ENTERING) {
lastUpdate=clock.time();
}
time_t delta;
delta=lastUpdate=(clock.time()-lastUpdate);
if ((delta>0)
&& (machine.timerIsRunning)
){
machine.timeRemaining -= (int) delta;
if (machine.timeRemaining<0) {
machine.timeRemaining=0;
}
monitor.update("TRM","%d",machine.timeRemaining);
}
if ((machine.timeRemaining==0)
&& machine.timerIsRunning
){
//pump.Release();
machine.timerIsRunning=false;
monitor.log("-- Job finished --");
machine.timeRemaining=machine.timerSetting;
monitor.update("TRM","%d",machine.timeRemaining);
monitor.update("TMR","%d",machine.timerIsRunning);
}
break;
case STATE_SHUTDOWN:
case STATE_POST_FAILURE:
case STATE_E_SHUTDOWN:
if (ENTERING) {
safety.redLightVal=255;//fix number foo
} else {
machine.setState(STATE_RUN_MODE);
}
break;
case STATE_MANUAL_MODE:
case STATE_DIAGNOSTICS_MODE:break;
case STATE_UNKNOWN_STATE:break;
}
machine.previousState=machine.currentState;
lastUpdate=clock.time();
}
/*----------------------------------------------------------------------
* Monitor Callbacks
*--------------------------------------------------------------------*/
static void TMR (uint8_t kwIndex, uint8_t verb,char *args) {
if (verb == '!') {
bool wasRunning=machine.timerIsRunning;
bool start=machine.timerIsRunning=atoi(args);
if (start) {
//
monitor.log("-- Job (Re)Started --"); //if was notrunning?
} else {
if (wasRunning) {
monitor.log("-- Job Paused --");
}
}
}
monitor.update("TMR","%d",machine.timerIsRunning);
}
static void TMS (uint8_t kwIndex, uint8_t verb,char *args) {
if (verb == '!') {
machine.timeRemaining=machine.timerSetting=atoi(args);
monitor.update("TRM","%d",machine.timeRemaining);
}
monitor.update("TMS","%d",machine.timerSetting);
}
static void TRM (uint8_t kwIndex, uint8_t verb,char *args) {
if (verb == '!') {
machine.timeRemaining=atoi(args);
monitor.update("TRM","%d",machine.timeRemaining);
}
monitor.update("TRM","%d",machine.timeRemaining);
}
|