forked from allpowerlabs/KS_PowerPallet
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathEngine.pde
220 lines (210 loc) · 7.57 KB
/
Engine.pde
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
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
/*
Engine states: OFF, ON, START
OFF - Ignition and starter are off. No sensor checks are performed.
ON - Ignition is on, starter is off. Oil pressure is monitored.
START - Ignition and starter are on. Oil pressure is not monitored. After
30 seconds in start mode, engine is returned to off state.
*/
struct {
unsigned ignition_pin; // Pin number of ignition
unsigned starter_pin; // Pin number of starter
unsigned grid_tie; // 1 for grid-tie controller
unsigned control_state; // Off, ON, START
timer_s timer; // Control timer
} engine;
void DoEngine() {
strcpy_P(buf, engine_shutdown);
switch (engine_state) {
case ENGINE_OFF:
if (control_state == CONTROL_START) {
TransitionEngine(ENGINE_STARTING);
}
if (grid_tie == 1){
if (EngineShutdownFromAlarm()){
digitalWrite(FET_STARTER,HIGH);
} else {
digitalWrite(FET_STARTER,LOW);
}
}
break;
case ENGINE_ON:
if (control_state == CONTROL_OFF & millis()-control_state_entered > 100) {
Log_p("Key switch turned off"); Logln(buf);
TransitionEngine(ENGINE_SHUTDOWN);
}
if (control_state == CONTROL_START) {
TransitionEngine(ENGINE_STARTING);
}
if (grid_tie != 1) {
if (EngineOilPressureLevel == OIL_P_LOW && millis() - oil_pressure_state > 500 && millis() - engine_state_entered > 3000){
Log_p("Low Oil Pressure, Shutting Down Engine at: ");
Logln(millis() - oil_pressure_state);
setAlarm(ALARM_BAD_OIL_PRESSURE);
TransitionEngine(ENGINE_SHUTDOWN);
}
}
if (P_reactorLevel == OFF & millis() - engine_state_entered > 2500 && grid_tie != 1) { //if reactor is at low vacuum after ten seconds, engine did not catch, so turn off
Log_p("Reactor Pressure Too Low, Engine Shutdown at :");
Logln(millis()-engine_state_entered);
TransitionEngine(ENGINE_SHUTDOWN);
}
if (Press[P_COMB] < -7472) {
Log_p("Reactor Pressure too high (above 30 inch water)"); Logln(buf);
setAlarm(ALARM_HIGH_PCOMB);
TransitionEngine(ENGINE_SHUTDOWN);
}
if (alarm_on[ALARM_HIGH_COOLANT_TEMP] > shutdown[ALARM_HIGH_COOLANT_TEMP]){
Log_p("Engine coolant temp too high"); Logln(buf);
TransitionEngine(ENGINE_SHUTDOWN);
}
if (alarm_on[ALARM_TRED_LOW] > shutdown[ALARM_TRED_LOW]){
Log_p("Reduction zone temp too low"); Logln(buf);
TransitionEngine(ENGINE_SHUTDOWN);
}
if (alarm_on[ALARM_TTRED_HIGH] > shutdown[ALARM_TTRED_HIGH]){
Log_p("Top of reduction zone temp too high"); Logln(buf);
TransitionEngine(ENGINE_SHUTDOWN);
}
if (alarm_on[ALARM_TBRED_HIGH] > shutdown[ALARM_TBRED_HIGH]){
Log_p("Bottom of reduction zone temp too high"); Logln(buf);
TransitionEngine(ENGINE_SHUTDOWN);
}
break;
case ENGINE_STARTING:
if (control_state == CONTROL_OFF & millis()-control_state_entered > 100) {
Log_p("Key switch turned off"); Logln(buf);
TransitionEngine(ENGINE_SHUTDOWN);
}
if (control_state == CONTROL_ON) { // Use starter button in the standard manual control configuration (push button to start, release to stop cranking)
TransitionEngine(ENGINE_ON);
}
break;
case ENGINE_GOV_TUNING:
if (control_state == CONTROL_OFF) {
TransitionEngine(ENGINE_OFF);
}
break;
case ENGINE_SHUTDOWN:
if (grid_tie || (millis() - engine_state_entered > 3500)) { // Don't delay shutdown for grid tie
TransitionEngine(ENGINE_OFF);
}
break;
}
}
void TransitionEngine(int new_state) {
strcpy_P(p_buffer, new_engine_state);
//can look at engine_state for "old" state before transitioning at the end of this method
engine_state_entered = millis();
if (grid_tie == 0){
switch (new_state) {
case ENGINE_OFF:
digitalWrite(FET_IGNITION,LOW);
digitalWrite(FET_STARTER,LOW);
Log(p_buffer); Logln_p("Off");
//TransitionMessage("Engine: Off ");
break;
case ENGINE_ON:
digitalWrite(FET_IGNITION,HIGH);
digitalWrite(FET_STARTER,LOW);
Log(p_buffer); Logln_p("On");
//TransitionMessage("Engine: Running ");
break;
case ENGINE_STARTING:
digitalWrite(FET_IGNITION,HIGH);
digitalWrite(FET_STARTER,HIGH);
Log(p_buffer); Logln_p("Starting");
//TransitionMessage("Engine: Starting ");
break;
case ENGINE_GOV_TUNING:
digitalWrite(FET_IGNITION,HIGH);
digitalWrite(FET_STARTER,LOW);
Log(p_buffer); Logln_p("Governor Tuning");
//TransitionMessage("Engine: Gov Tuning ");
break;
case ENGINE_SHUTDOWN:
// lambda_PID.SetMode(MANUAL);
// SetThrottleAngle(smoothedLambda);
// digitalWrite(FET_IGNITION,LOW);
// digitalWrite(FET_STARTER,LOW);
Log(p_buffer); Logln_p("SHUTDOWN");
//TransitionMessage("Engine: Shutting down");
break;
}
} else { //Engine controlled by Derp Sea for Gridtie
switch (new_state) {
case ENGINE_OFF:
Log(p_buffer); Logln_p("Off");
digitalWrite(FET_STARTER,LOW);
if (EngineShutdownFromAlarm()){
digitalWrite(FET_STARTER,HIGH);
} else {
digitalWrite(FET_STARTER,LOW);
}
break;
case ENGINE_ON:
Log(p_buffer); Logln_p("On");
digitalWrite(FET_IGNITION,LOW);
digitalWrite(FET_STARTER,LOW);
break;
case ENGINE_STARTING:
Log(p_buffer); Logln_p("Starting");
digitalWrite(FET_IGNITION,LOW);
digitalWrite(FET_STARTER,LOW);
break;
case ENGINE_GOV_TUNING: //How is this handled by Derp Sea?
Log(p_buffer); Logln_p("Gov Tuning");
digitalWrite(FET_IGNITION,LOW);
digitalWrite(FET_STARTER,LOW);
break;
case ENGINE_SHUTDOWN:
Log(p_buffer); Logln_p("Shutdown");
digitalWrite(FET_IGNITION,LOW);
digitalWrite(FET_STARTER,LOW);
break;
}
}
engine_state=new_state;
}
void DoOilPressure() {
smoothAnalog(ANA_OIL_PRESSURE);
if (engine_type == 1){ //20k has analog oil pressure reader
//EngineOilPressureValue = getPSI(analogRead(ANA_OIL_PRESSURE));
EngineOilPressureValue = getPSI(smoothed[getAnaArray(ANA_OIL_PRESSURE)]);
if (EngineOilPressureValue <= low_oil_psi && EngineOilPressureLevel != OIL_P_LOW){
EngineOilPressureLevel = OIL_P_LOW;
oil_pressure_state = millis();
}
if (EngineOilPressureValue > low_oil_psi && EngineOilPressureLevel != OIL_P_NORMAL){
EngineOilPressureLevel = OIL_P_NORMAL;
oil_pressure_state = 0;
}
} else {
EngineOilPressureValue = analogRead(ANA_OIL_PRESSURE);
if (EngineOilPressureValue <= 500 && EngineOilPressureLevel != OIL_P_LOW){
EngineOilPressureLevel = OIL_P_LOW;
oil_pressure_state = millis();
}
if (EngineOilPressureValue > 500 && EngineOilPressureLevel != OIL_P_NORMAL){
EngineOilPressureLevel = OIL_P_NORMAL;
oil_pressure_state = 0;
}
}
}
int getPSI(int pressure_reading){ //returns oil pressure in PSI for 20k
return (pressure_reading-512)/-2; //alternately use : analogRead(ANA_OIL_PRESSURE) instead of passing pressure_reading
}
void DoBattery() {
#if ANA_BATT_V != ABSENT
battery_voltage = 0.07528*(analogRead(ANA_BATT_V)-512);
#endif
}
boolean EngineShutdownFromAlarm() {
boolean alarms = false;
for (int i=0; i< ALARM_NUM; i++){
if ((shutdown[i]>0) && (alarm_on[i] >= shutdown[i])){
alarms = true;
break;
}
}
return alarms;
}