|
@@ -75,13 +75,17 @@ uint32_t Statemachine::DigitBuffer::getNumber(void) {
|
75
|
75
|
static const char *state_names[] = {
|
76
|
76
|
stringify(init),
|
77
|
77
|
stringify(menu),
|
78
|
|
- stringify(auto_mode),
|
|
78
|
+ stringify(auto_mode_a),
|
|
79
|
+ stringify(auto_mode_b),
|
79
|
80
|
stringify(auto_fert),
|
80
|
81
|
stringify(auto_fert_run),
|
81
|
82
|
stringify(auto_tank_run),
|
82
|
83
|
stringify(auto_plant),
|
83
|
84
|
stringify(auto_plant_run),
|
84
|
85
|
stringify(auto_done),
|
|
86
|
+ stringify(fillnwater_plant),
|
|
87
|
+ stringify(fillnwater_tank_run),
|
|
88
|
+ stringify(fillnwater_plant_run),
|
85
|
89
|
stringify(menu_pumps),
|
86
|
90
|
stringify(menu_pumps_time),
|
87
|
91
|
stringify(menu_pumps_go),
|
|
@@ -123,7 +127,7 @@ void Statemachine::input(int n) {
|
123
|
127
|
switch_to(menu);
|
124
|
128
|
} else if (state == menu) {
|
125
|
129
|
if (n == 1) {
|
126
|
|
- switch_to(auto_mode);
|
|
130
|
+ switch_to(auto_mode_a);
|
127
|
131
|
} else if (n == 2) {
|
128
|
132
|
switch_to(menu_pumps);
|
129
|
133
|
} else if (n == 3) {
|
|
@@ -131,10 +135,13 @@ void Statemachine::input(int n) {
|
131
|
135
|
} else if ((n == -1) || (n == -2)) {
|
132
|
136
|
switch_to(init);
|
133
|
137
|
}
|
134
|
|
- } else if (state == auto_mode) {
|
|
138
|
+ } else if ((state == auto_mode_a) || (state == auto_mode_b)) {
|
135
|
139
|
if (n == 1) {
|
136
|
140
|
switch_to(auto_fert);
|
137
|
141
|
} else if (n == 2) {
|
|
142
|
+ selected_plants.clear();
|
|
143
|
+ switch_to(fillnwater_plant);
|
|
144
|
+ } else if (n == 3) {
|
138
|
145
|
auto wl = plants.getWaterlevel();
|
139
|
146
|
if ((wl != Plants::full) && (wl != Plants::invalid)) {
|
140
|
147
|
plants.openWaterInlet();
|
|
@@ -144,17 +151,19 @@ void Statemachine::input(int n) {
|
144
|
151
|
switch_to(auto_tank_run);
|
145
|
152
|
} else if (wl == Plants::full) {
|
146
|
153
|
stop_time = millis();
|
147
|
|
- switch_to(auto_mode);
|
|
154
|
+ switch_to(auto_mode_a);
|
148
|
155
|
} else if (wl == Plants::invalid) {
|
149
|
156
|
error_condition = "Invalid sensor state";
|
150
|
|
- state = auto_mode;
|
|
157
|
+ state = auto_mode_a;
|
151
|
158
|
switch_to(error);
|
152
|
159
|
}
|
153
|
|
- } else if (n == 3) {
|
|
160
|
+ } else if (n == 4) {
|
154
|
161
|
selected_plants.clear();
|
155
|
162
|
switch_to(auto_plant);
|
156
|
|
- } else if ((n == -1) || (n == -2)) {
|
|
163
|
+ } else if (n == -1) {
|
157
|
164
|
switch_to(menu);
|
|
165
|
+ } else if (n == -2) {
|
|
166
|
+ switch_to((state == auto_mode_a) ? auto_mode_b : auto_mode_a);
|
158
|
167
|
}
|
159
|
168
|
} else if (state == auto_fert) {
|
160
|
169
|
if ((n >= 1) && (n <= 3)) {
|
|
@@ -167,14 +176,14 @@ void Statemachine::input(int n) {
|
167
|
176
|
switch_to(auto_fert_run);
|
168
|
177
|
} else if (wl == Plants::full) {
|
169
|
178
|
stop_time = millis();
|
170
|
|
- switch_to(auto_mode);
|
|
179
|
+ switch_to(auto_mode_a);
|
171
|
180
|
} else if (wl == Plants::invalid) {
|
172
|
181
|
error_condition = "Invalid sensor state";
|
173
|
|
- state = auto_mode;
|
|
182
|
+ state = auto_mode_a;
|
174
|
183
|
switch_to(error);
|
175
|
184
|
}
|
176
|
185
|
} else if ((n == -1) || (n == -2)) {
|
177
|
|
- switch_to(auto_mode);
|
|
186
|
+ switch_to(auto_mode_a);
|
178
|
187
|
}
|
179
|
188
|
} else if (state == auto_fert_run) {
|
180
|
189
|
plants.abort();
|
|
@@ -190,7 +199,7 @@ void Statemachine::input(int n) {
|
190
|
199
|
backspace();
|
191
|
200
|
db.removeDigit();
|
192
|
201
|
} else {
|
193
|
|
- switch_to(auto_mode);
|
|
202
|
+ switch_to(auto_mode_b);
|
194
|
203
|
}
|
195
|
204
|
} else if (n == -2) {
|
196
|
205
|
if (!db.hasDigits()) {
|
|
@@ -207,10 +216,10 @@ void Statemachine::input(int n) {
|
207
|
216
|
switch_to(auto_plant_run);
|
208
|
217
|
} else if (wl == Plants::empty) {
|
209
|
218
|
stop_time = millis();
|
210
|
|
- switch_to(auto_mode);
|
|
219
|
+ switch_to(auto_mode_b);
|
211
|
220
|
} else if (wl == Plants::invalid) {
|
212
|
221
|
error_condition = "Invalid sensor state";
|
213
|
|
- state = auto_mode;
|
|
222
|
+ state = auto_mode_b;
|
214
|
223
|
switch_to(error);
|
215
|
224
|
}
|
216
|
225
|
} else {
|
|
@@ -235,7 +244,7 @@ void Statemachine::input(int n) {
|
235
|
244
|
stop_time = millis();
|
236
|
245
|
switch_to(auto_done);
|
237
|
246
|
} else if (state == auto_done) {
|
238
|
|
- switch_to(auto_mode);
|
|
247
|
+ switch_to(auto_mode_a);
|
239
|
248
|
} else if (state == menu_pumps) {
|
240
|
249
|
if (n == -1) {
|
241
|
250
|
if (db.hasDigits()) {
|
|
@@ -264,6 +273,101 @@ void Statemachine::input(int n) {
|
264
|
273
|
backspace();
|
265
|
274
|
}
|
266
|
275
|
}
|
|
276
|
+ } else if (state == fillnwater_plant) {
|
|
277
|
+ if (n == -1) {
|
|
278
|
+ if (db.hasDigits()) {
|
|
279
|
+ backspace();
|
|
280
|
+ db.removeDigit();
|
|
281
|
+ } else {
|
|
282
|
+ switch_to(auto_mode_a);
|
|
283
|
+ }
|
|
284
|
+ } else if (n == -2) {
|
|
285
|
+ if (!db.hasDigits()) {
|
|
286
|
+ int found = 0;
|
|
287
|
+ for (int i = 0; i < plants.countPlants(); i++) {
|
|
288
|
+ if (selected_plants.isSet(i)) {
|
|
289
|
+ found = 1;
|
|
290
|
+ break;
|
|
291
|
+ }
|
|
292
|
+ }
|
|
293
|
+ if (found != 0) {
|
|
294
|
+ auto wl = plants.getWaterlevel();
|
|
295
|
+ if ((wl != Plants::full) && (wl != Plants::invalid)) {
|
|
296
|
+ plants.openWaterInlet();
|
|
297
|
+ selected_id = plants.countPlants() + 1;
|
|
298
|
+ selected_time = MAX_TANK_FILL_TIME;
|
|
299
|
+ start_time = millis();
|
|
300
|
+ switch_to(fillnwater_tank_run);
|
|
301
|
+ } else if (wl == Plants::full) {
|
|
302
|
+ stop_time = millis();
|
|
303
|
+ auto wl = plants.getWaterlevel();
|
|
304
|
+ if ((wl != Plants::empty) && (wl != Plants::invalid)) {
|
|
305
|
+ for (int i = 0; i < plants.countPlants(); i++) {
|
|
306
|
+ if (selected_plants.isSet(i)) {
|
|
307
|
+ plants.startPlant(i);
|
|
308
|
+ }
|
|
309
|
+ }
|
|
310
|
+
|
|
311
|
+ selected_time = MAX_AUTO_PLANT_RUNTIME;
|
|
312
|
+ start_time = millis();
|
|
313
|
+ switch_to(fillnwater_plant_run);
|
|
314
|
+ } else if (wl == Plants::empty) {
|
|
315
|
+ stop_time = millis();
|
|
316
|
+ switch_to(auto_mode_a);
|
|
317
|
+ } else if (wl == Plants::invalid) {
|
|
318
|
+ error_condition = "Invalid sensor state";
|
|
319
|
+ state = auto_mode_a;
|
|
320
|
+ switch_to(error);
|
|
321
|
+ }
|
|
322
|
+ } else if (wl == Plants::invalid) {
|
|
323
|
+ error_condition = "Invalid sensor state";
|
|
324
|
+ state = auto_mode_a;
|
|
325
|
+ switch_to(error);
|
|
326
|
+ }
|
|
327
|
+ }
|
|
328
|
+ } else {
|
|
329
|
+ selected_id = number_input();
|
|
330
|
+ if ((selected_id <= 0) || (selected_id > plants.countPlants())) {
|
|
331
|
+ error_condition = "Invalid plant ID!";
|
|
332
|
+ switch_to(error);
|
|
333
|
+ } else {
|
|
334
|
+ selected_plants.set(selected_id - 1);
|
|
335
|
+ switch_to(fillnwater_plant);
|
|
336
|
+ }
|
|
337
|
+ }
|
|
338
|
+ } else {
|
|
339
|
+ if (db.spaceLeft()) {
|
|
340
|
+ db.addDigit(n);
|
|
341
|
+ } else {
|
|
342
|
+ backspace();
|
|
343
|
+ }
|
|
344
|
+ }
|
|
345
|
+ } else if (state == fillnwater_tank_run) {
|
|
346
|
+ plants.abort();
|
|
347
|
+ stop_time = millis();
|
|
348
|
+ auto wl = plants.getWaterlevel();
|
|
349
|
+ if ((wl != Plants::empty) && (wl != Plants::invalid)) {
|
|
350
|
+ for (int i = 0; i < plants.countPlants(); i++) {
|
|
351
|
+ if (selected_plants.isSet(i)) {
|
|
352
|
+ plants.startPlant(i);
|
|
353
|
+ }
|
|
354
|
+ }
|
|
355
|
+
|
|
356
|
+ selected_time = MAX_AUTO_PLANT_RUNTIME;
|
|
357
|
+ start_time = millis();
|
|
358
|
+ switch_to(fillnwater_plant_run);
|
|
359
|
+ } else if (wl == Plants::empty) {
|
|
360
|
+ stop_time = millis();
|
|
361
|
+ switch_to(auto_mode_a);
|
|
362
|
+ } else if (wl == Plants::invalid) {
|
|
363
|
+ error_condition = "Invalid sensor state";
|
|
364
|
+ state = auto_mode_a;
|
|
365
|
+ switch_to(error);
|
|
366
|
+ }
|
|
367
|
+ } else if (state == fillnwater_plant_run) {
|
|
368
|
+ plants.abort();
|
|
369
|
+ stop_time = millis();
|
|
370
|
+ switch_to(auto_done);
|
267
|
371
|
} else if (state == menu_pumps_time) {
|
268
|
372
|
if (n == -1) {
|
269
|
373
|
if (db.hasDigits()) {
|
|
@@ -313,9 +417,9 @@ void Statemachine::input(int n) {
|
313
|
417
|
switch_to(menu_pumps_time);
|
314
|
418
|
}
|
315
|
419
|
} else if (state == menu_pumps_run) {
|
316
|
|
- plants.abort();
|
317
|
|
- stop_time = millis();
|
318
|
|
- switch_to(menu_pumps_done);
|
|
420
|
+ plants.abort();
|
|
421
|
+ stop_time = millis();
|
|
422
|
+ switch_to(menu_pumps_done);
|
319
|
423
|
} else if (state == menu_pumps_done) {
|
320
|
424
|
switch_to(menu);
|
321
|
425
|
} else if (state == menu_valves) {
|
|
@@ -477,7 +581,7 @@ void Statemachine::act(void) {
|
477
|
581
|
}
|
478
|
582
|
#endif // CHECK_SENSORS_VALVE_PUMP_MENU_EMPTY
|
479
|
583
|
|
480
|
|
- if ((state == auto_fert_run) || (state == auto_tank_run)) {
|
|
584
|
+ if ((state == auto_fert_run) || (state == auto_tank_run) || (state == fillnwater_tank_run)) {
|
481
|
585
|
unsigned long runtime = millis() - start_time;
|
482
|
586
|
if ((runtime / 1000UL) >= selected_time) {
|
483
|
587
|
// stop if timeout has been reached
|
|
@@ -495,16 +599,38 @@ void Statemachine::act(void) {
|
495
|
599
|
if (wl == Plants::full) {
|
496
|
600
|
plants.abort();
|
497
|
601
|
stop_time = millis();
|
498
|
|
- switch_to(auto_done);
|
|
602
|
+ if (state == fillnwater_tank_run) {
|
|
603
|
+ auto wl = plants.getWaterlevel();
|
|
604
|
+ if ((wl != Plants::empty) && (wl != Plants::invalid)) {
|
|
605
|
+ for (int i = 0; i < plants.countPlants(); i++) {
|
|
606
|
+ if (selected_plants.isSet(i)) {
|
|
607
|
+ plants.startPlant(i);
|
|
608
|
+ }
|
|
609
|
+ }
|
|
610
|
+
|
|
611
|
+ selected_time = MAX_AUTO_PLANT_RUNTIME;
|
|
612
|
+ start_time = millis();
|
|
613
|
+ switch_to(fillnwater_plant_run);
|
|
614
|
+ } else if (wl == Plants::empty) {
|
|
615
|
+ stop_time = millis();
|
|
616
|
+ switch_to(auto_mode_a);
|
|
617
|
+ } else if (wl == Plants::invalid) {
|
|
618
|
+ error_condition = "Invalid sensor state";
|
|
619
|
+ state = auto_mode_a;
|
|
620
|
+ switch_to(error);
|
|
621
|
+ }
|
|
622
|
+ } else {
|
|
623
|
+ switch_to(auto_done);
|
|
624
|
+ }
|
499
|
625
|
} else if (wl == Plants::invalid) {
|
500
|
626
|
plants.abort();
|
501
|
627
|
error_condition = "Invalid sensor state";
|
502
|
|
- state = auto_mode;
|
|
628
|
+ state = auto_mode_a;
|
503
|
629
|
switch_to(error);
|
504
|
630
|
}
|
505
|
631
|
}
|
506
|
|
-
|
507
|
|
- if (state == auto_plant_run) {
|
|
632
|
+
|
|
633
|
+ if ((state == auto_plant_run) || (state == fillnwater_plant_run)) {
|
508
|
634
|
unsigned long runtime = millis() - start_time;
|
509
|
635
|
if ((runtime / 1000UL) >= selected_time) {
|
510
|
636
|
// stop if timeout has been reached
|
|
@@ -516,7 +642,7 @@ void Statemachine::act(void) {
|
516
|
642
|
last_animation_time = millis();
|
517
|
643
|
switch_to(state);
|
518
|
644
|
}
|
519
|
|
-
|
|
645
|
+
|
520
|
646
|
// check water level state
|
521
|
647
|
auto wl = plants.getWaterlevel();
|
522
|
648
|
if (wl == Plants::empty) {
|
|
@@ -526,7 +652,7 @@ void Statemachine::act(void) {
|
526
|
652
|
} else if (wl == Plants::invalid) {
|
527
|
653
|
plants.abort();
|
528
|
654
|
error_condition = "Invalid sensor state";
|
529
|
|
- state = auto_mode;
|
|
655
|
+ state = auto_mode_a;
|
530
|
656
|
switch_to(error);
|
531
|
657
|
}
|
532
|
658
|
}
|
|
@@ -550,11 +676,17 @@ void Statemachine::switch_to(States s) {
|
550
|
676
|
"2: Fertilizer pumps",
|
551
|
677
|
"3: Outlet valves",
|
552
|
678
|
-1);
|
553
|
|
- } else if (s == auto_mode) {
|
554
|
|
- print("------- Auto -------",
|
|
679
|
+ } else if (s == auto_mode_a) {
|
|
680
|
+ print("----- Auto 1/2 -----",
|
555
|
681
|
"1: Add Fertilizer",
|
556
|
|
- "2: Fill Reservoir",
|
557
|
|
- "3: Water a plant",
|
|
682
|
+ "2: Fill 'n' Water",
|
|
683
|
+ "#: Go to page 2/2...",
|
|
684
|
+ -1);
|
|
685
|
+ } else if (s == auto_mode_b) {
|
|
686
|
+ print("----- Auto 2/2 -----",
|
|
687
|
+ "3: Fill Reservoir",
|
|
688
|
+ "4: Water a plant",
|
|
689
|
+ "#: Go to page 1/2...",
|
558
|
690
|
-1);
|
559
|
691
|
} else if (s == auto_fert) {
|
560
|
692
|
print("---- Fertilizer ----",
|
|
@@ -577,7 +709,7 @@ void Statemachine::switch_to(States s) {
|
577
|
709
|
b.c_str(),
|
578
|
710
|
"Hit any key to stop!",
|
579
|
711
|
-1);
|
580
|
|
- } else if (s == auto_tank_run) {
|
|
712
|
+ } else if ((s == auto_tank_run) || (s == fillnwater_tank_run)) {
|
581
|
713
|
unsigned long runtime = millis() - start_time;
|
582
|
714
|
String a = String("Time: ") + String(runtime / 1000UL) + String("s / ") + String(selected_time) + String('s');
|
583
|
715
|
|
|
@@ -592,7 +724,7 @@ void Statemachine::switch_to(States s) {
|
592
|
724
|
b.c_str(),
|
593
|
725
|
"Hit any key to stop!",
|
594
|
726
|
-1);
|
595
|
|
- } else if (s == auto_plant) {
|
|
727
|
+ } else if ((s == auto_plant) || (s == fillnwater_plant)) {
|
596
|
728
|
String a = String("(Input 1 to ") + String(plants.countPlants()) + String(")");
|
597
|
729
|
|
598
|
730
|
print("--- Select Plant ---",
|
|
@@ -600,7 +732,7 @@ void Statemachine::switch_to(States s) {
|
600
|
732
|
a.c_str(),
|
601
|
733
|
"Plant: ",
|
602
|
734
|
3);
|
603
|
|
- } else if (s == auto_plant_run) {
|
|
735
|
+ } else if ((s == auto_plant_run) || (s == fillnwater_plant_run)) {
|
604
|
736
|
unsigned long runtime = millis() - start_time;
|
605
|
737
|
String a = String("Time: ") + String(runtime / 1000UL) + String("s / ") + String(selected_time) + String('s');
|
606
|
738
|
|
|
@@ -626,7 +758,7 @@ void Statemachine::switch_to(States s) {
|
626
|
758
|
|
627
|
759
|
#if defined(PLATFORM_ESP)
|
628
|
760
|
unsigned long runtime = stop_time - start_time;
|
629
|
|
- if (old_state == auto_plant_run) {
|
|
761
|
+ if ((old_state == auto_plant_run) || (old_state == fillnwater_plant_run)) {
|
630
|
762
|
for (int i = 0; i < plants.countPlants(); i++) {
|
631
|
763
|
if (selected_plants.isSet(i)) {
|
632
|
764
|
bool success = wifi_write_database(runtime / 1000, "plant", i + 1);
|
|
@@ -786,5 +918,8 @@ void Statemachine::switch_to(States s) {
|
786
|
918
|
error_condition.c_str(),
|
787
|
919
|
" Press any key...",
|
788
|
920
|
-1);
|
|
921
|
+ } else {
|
|
922
|
+ debug.print("Invalid state ");
|
|
923
|
+ debug.println(s);
|
789
|
924
|
}
|
790
|
925
|
}
|