|
@@ -87,10 +87,12 @@ static const char *state_names[] = {
|
87
|
87
|
stringify(auto_tank_run),
|
88
|
88
|
stringify(auto_stirr_run),
|
89
|
89
|
stringify(auto_plant),
|
|
90
|
+ stringify(auto_plant_kickstart_run),
|
90
|
91
|
stringify(auto_plant_run),
|
91
|
92
|
stringify(auto_done),
|
92
|
93
|
stringify(fillnwater_plant),
|
93
|
94
|
stringify(fillnwater_tank_run),
|
|
95
|
+ stringify(fillnwater_kickstart_run),
|
94
|
96
|
stringify(fillnwater_plant_run),
|
95
|
97
|
stringify(automation_mode),
|
96
|
98
|
stringify(menu_pumps),
|
|
@@ -203,6 +205,7 @@ void Statemachine::input(int n) {
|
203
|
205
|
plants.startAux(STIRRER_COUNT + i);
|
204
|
206
|
delay(DOOR_LOCK_ON_TIME);
|
205
|
207
|
plants.stopAux(STIRRER_COUNT + i);
|
|
208
|
+ delay(DOOR_LOCK_NEXT_DELAY);
|
206
|
209
|
}
|
207
|
210
|
}
|
208
|
211
|
plants.stopAllAux();
|
|
@@ -315,7 +318,9 @@ void Statemachine::input(int n) {
|
315
|
318
|
switch_to((state == auto_fert_a) ? auto_fert_b : auto_fert_a);
|
316
|
319
|
}
|
317
|
320
|
} else if ((state == auto_fert_run) || (state == auto_tank_run)
|
318
|
|
- || (state == auto_stirr_run)) {
|
|
321
|
+ || (state == auto_stirr_run) || (state == auto_plant_run)
|
|
322
|
+ || (state == auto_plant_kickstart_run)
|
|
323
|
+ || (state == fillnwater_kickstart_run)) {
|
319
|
324
|
plants.abort();
|
320
|
325
|
stop_time = millis();
|
321
|
326
|
switch_to(auto_done);
|
|
@@ -335,15 +340,30 @@ void Statemachine::input(int n) {
|
335
|
340
|
if (!db.hasDigits()) {
|
336
|
341
|
auto wl = plants.getWaterlevel();
|
337
|
342
|
if ((wl != Plants::empty) && (wl != Plants::invalid)) {
|
|
343
|
+ // check if kickstart is required for this
|
|
344
|
+ bool need_kickstart = false;
|
|
345
|
+ for (int i = 0; i < plants.countPlants(); i++) {
|
|
346
|
+ if (selected_plants.isSet(i)) {
|
|
347
|
+ if (plants.getKickstart()->getPinNumber(i) >= 0) {
|
|
348
|
+ need_kickstart = true;
|
|
349
|
+ }
|
|
350
|
+ }
|
|
351
|
+ }
|
|
352
|
+
|
|
353
|
+ // start kickstart/valve as needed
|
338
|
354
|
for (int i = 0; i < plants.countPlants(); i++) {
|
339
|
355
|
if (selected_plants.isSet(i)) {
|
340
|
|
- plants.startPlant(i);
|
|
356
|
+ plants.startPlant(i, need_kickstart);
|
341
|
357
|
}
|
342
|
358
|
}
|
343
|
359
|
|
344
|
360
|
selected_time = MAX_AUTO_PLANT_RUNTIME;
|
345
|
361
|
start_time = millis();
|
346
|
|
- switch_to(auto_plant_run);
|
|
362
|
+ if (need_kickstart) {
|
|
363
|
+ switch_to(auto_plant_kickstart_run);
|
|
364
|
+ } else {
|
|
365
|
+ switch_to(auto_plant_run);
|
|
366
|
+ }
|
347
|
367
|
} else if (wl == Plants::empty) {
|
348
|
368
|
stop_time = millis();
|
349
|
369
|
switch_to(auto_mode_b);
|
|
@@ -372,10 +392,6 @@ void Statemachine::input(int n) {
|
372
|
392
|
backspace();
|
373
|
393
|
}
|
374
|
394
|
}
|
375
|
|
- } else if (state == auto_plant_run) {
|
376
|
|
- plants.abort();
|
377
|
|
- stop_time = millis();
|
378
|
|
- switch_to(auto_done);
|
379
|
395
|
} else if (state == auto_done) {
|
380
|
396
|
switch_to(auto_mode_a);
|
381
|
397
|
} else if (state == menu_pumps) {
|
|
@@ -449,9 +465,20 @@ void Statemachine::input(int n) {
|
449
|
465
|
stop_time = millis();
|
450
|
466
|
auto wl = plants.getWaterlevel();
|
451
|
467
|
if ((wl != Plants::empty) && (wl != Plants::invalid)) {
|
|
468
|
+ // check if kickstart is required for this
|
|
469
|
+ bool need_kickstart = false;
|
452
|
470
|
for (int i = 0; i < plants.countPlants(); i++) {
|
453
|
471
|
if (selected_plants.isSet(i)) {
|
454
|
|
- plants.startPlant(i);
|
|
472
|
+ if (plants.getKickstart()->getPinNumber(i) >= 0) {
|
|
473
|
+ need_kickstart = true;
|
|
474
|
+ }
|
|
475
|
+ }
|
|
476
|
+ }
|
|
477
|
+
|
|
478
|
+ // start kickstart/valve as needed
|
|
479
|
+ for (int i = 0; i < plants.countPlants(); i++) {
|
|
480
|
+ if (selected_plants.isSet(i)) {
|
|
481
|
+ plants.startPlant(i, need_kickstart);
|
455
|
482
|
}
|
456
|
483
|
}
|
457
|
484
|
|
|
@@ -460,7 +487,11 @@ void Statemachine::input(int n) {
|
460
|
487
|
|
461
|
488
|
selected_time = MAX_AUTO_PLANT_RUNTIME;
|
462
|
489
|
start_time = millis();
|
463
|
|
- switch_to(fillnwater_plant_run);
|
|
490
|
+ if (need_kickstart) {
|
|
491
|
+ switch_to(fillnwater_kickstart_run);
|
|
492
|
+ } else {
|
|
493
|
+ switch_to(fillnwater_plant_run);
|
|
494
|
+ }
|
464
|
495
|
} else if (wl == Plants::empty) {
|
465
|
496
|
stop_time = millis();
|
466
|
497
|
switch_to(auto_mode_a);
|
|
@@ -500,9 +531,20 @@ void Statemachine::input(int n) {
|
500
|
531
|
stop_time = millis();
|
501
|
532
|
auto wl = plants.getWaterlevel();
|
502
|
533
|
if ((wl != Plants::empty) && (wl != Plants::invalid)) {
|
|
534
|
+ // check if kickstart is required for this
|
|
535
|
+ bool need_kickstart = false;
|
503
|
536
|
for (int i = 0; i < plants.countPlants(); i++) {
|
504
|
537
|
if (selected_plants.isSet(i)) {
|
505
|
|
- plants.startPlant(i);
|
|
538
|
+ if (plants.getKickstart()->getPinNumber(i) >= 0) {
|
|
539
|
+ need_kickstart = true;
|
|
540
|
+ }
|
|
541
|
+ }
|
|
542
|
+ }
|
|
543
|
+
|
|
544
|
+ // start kickstart/valve as needed
|
|
545
|
+ for (int i = 0; i < plants.countPlants(); i++) {
|
|
546
|
+ if (selected_plants.isSet(i)) {
|
|
547
|
+ plants.startPlant(i, need_kickstart);
|
506
|
548
|
}
|
507
|
549
|
}
|
508
|
550
|
|
|
@@ -510,7 +552,11 @@ void Statemachine::input(int n) {
|
510
|
552
|
|
511
|
553
|
selected_time = MAX_AUTO_PLANT_RUNTIME;
|
512
|
554
|
start_time = millis();
|
513
|
|
- switch_to(fillnwater_plant_run);
|
|
555
|
+ if (need_kickstart) {
|
|
556
|
+ switch_to(fillnwater_kickstart_run);
|
|
557
|
+ } else {
|
|
558
|
+ switch_to(fillnwater_plant_run);
|
|
559
|
+ }
|
514
|
560
|
} else if (wl == Plants::empty) {
|
515
|
561
|
switch_to(auto_mode_a);
|
516
|
562
|
} else if (wl == Plants::invalid) {
|
|
@@ -660,7 +706,8 @@ void Statemachine::input(int n) {
|
660
|
706
|
if (selected_id >= (plants.countPlants() + 1)) {
|
661
|
707
|
plants.openWaterInlet();
|
662
|
708
|
} else {
|
663
|
|
- plants.startPlant(selected_id - 1);
|
|
709
|
+ // TODO support testing kickstart
|
|
710
|
+ plants.startPlant(selected_id - 1, false);
|
664
|
711
|
}
|
665
|
712
|
|
666
|
713
|
switch_to(menu_valves_run);
|
|
@@ -803,7 +850,7 @@ void Statemachine::act(void) {
|
803
|
850
|
switch_to(state);
|
804
|
851
|
}
|
805
|
852
|
}
|
806
|
|
-
|
|
853
|
+
|
807
|
854
|
#ifdef CHECK_SENSORS_VALVE_PUMP_MENU_FULL
|
808
|
855
|
if ((state == menu_pumps_run) || ((state == menu_valves_run) && (selected_id == (plants.countPlants() + 1)))) {
|
809
|
856
|
// check water level state
|
|
@@ -820,7 +867,7 @@ void Statemachine::act(void) {
|
820
|
867
|
}
|
821
|
868
|
}
|
822
|
869
|
#endif // CHECK_SENSORS_VALVE_PUMP_MENU_FULL
|
823
|
|
-
|
|
870
|
+
|
824
|
871
|
#ifdef CHECK_SENSORS_VALVE_PUMP_MENU_EMPTY
|
825
|
872
|
if ((state == menu_valves_run) && (selected_id <= plants.countPlants())) {
|
826
|
873
|
// check water level state
|
|
@@ -837,7 +884,33 @@ void Statemachine::act(void) {
|
837
|
884
|
}
|
838
|
885
|
}
|
839
|
886
|
#endif // CHECK_SENSORS_VALVE_PUMP_MENU_EMPTY
|
840
|
|
-
|
|
887
|
+
|
|
888
|
+ if ((state == auto_plant_kickstart_run) || (state == fillnwater_kickstart_run)) {
|
|
889
|
+ unsigned long runtime = millis() - start_time;
|
|
890
|
+ if ((runtime / 1000UL) >= KICKSTART_RUNTIME) {
|
|
891
|
+ // kickstart is done, switch over to valves
|
|
892
|
+ plants.abort();
|
|
893
|
+ start_time = millis();
|
|
894
|
+
|
|
895
|
+ // start required valves
|
|
896
|
+ for (int i = 0; i < plants.countPlants(); i++) {
|
|
897
|
+ if (selected_plants.isSet(i)) {
|
|
898
|
+ plants.startPlant(i, false);
|
|
899
|
+ }
|
|
900
|
+ }
|
|
901
|
+
|
|
902
|
+ if (state == auto_plant_kickstart_run) {
|
|
903
|
+ switch_to(auto_plant_run);
|
|
904
|
+ } else {
|
|
905
|
+ switch_to(fillnwater_plant_run);
|
|
906
|
+ }
|
|
907
|
+ } else if ((millis() - last_animation_time) >= 500) {
|
|
908
|
+ // update animation if needed
|
|
909
|
+ last_animation_time = millis();
|
|
910
|
+ switch_to(state);
|
|
911
|
+ }
|
|
912
|
+ }
|
|
913
|
+
|
841
|
914
|
if ((state == auto_fert_run) || (state == auto_tank_run) || (state == fillnwater_tank_run)) {
|
842
|
915
|
unsigned long runtime = millis() - start_time;
|
843
|
916
|
if ((runtime / 1000UL) >= selected_time) {
|
|
@@ -847,9 +920,20 @@ void Statemachine::act(void) {
|
847
|
920
|
if (state == fillnwater_tank_run) {
|
848
|
921
|
auto wl = plants.getWaterlevel();
|
849
|
922
|
if ((wl != Plants::empty) && (wl != Plants::invalid)) {
|
|
923
|
+ // check if kickstart is required for this
|
|
924
|
+ bool need_kickstart = false;
|
850
|
925
|
for (int i = 0; i < plants.countPlants(); i++) {
|
851
|
926
|
if (selected_plants.isSet(i)) {
|
852
|
|
- plants.startPlant(i);
|
|
927
|
+ if (plants.getKickstart()->getPinNumber(i) >= 0) {
|
|
928
|
+ need_kickstart = true;
|
|
929
|
+ }
|
|
930
|
+ }
|
|
931
|
+ }
|
|
932
|
+
|
|
933
|
+ // start kickstart/valve as needed
|
|
934
|
+ for (int i = 0; i < plants.countPlants(); i++) {
|
|
935
|
+ if (selected_plants.isSet(i)) {
|
|
936
|
+ plants.startPlant(i, need_kickstart);
|
853
|
937
|
}
|
854
|
938
|
}
|
855
|
939
|
|
|
@@ -857,7 +941,11 @@ void Statemachine::act(void) {
|
857
|
941
|
|
858
|
942
|
selected_time = MAX_AUTO_PLANT_RUNTIME;
|
859
|
943
|
start_time = millis();
|
860
|
|
- switch_to(fillnwater_plant_run);
|
|
944
|
+ if (need_kickstart) {
|
|
945
|
+ switch_to(fillnwater_kickstart_run);
|
|
946
|
+ } else {
|
|
947
|
+ switch_to(fillnwater_plant_run);
|
|
948
|
+ }
|
861
|
949
|
} else if (wl == Plants::empty) {
|
862
|
950
|
stop_time = millis();
|
863
|
951
|
switch_to(auto_done);
|
|
@@ -905,9 +993,20 @@ void Statemachine::act(void) {
|
905
|
993
|
|
906
|
994
|
auto wl = plants.getWaterlevel();
|
907
|
995
|
if ((wl != Plants::empty) && (wl != Plants::invalid)) {
|
|
996
|
+ // check if kickstart is required for this
|
|
997
|
+ bool need_kickstart = false;
|
908
|
998
|
for (int i = 0; i < plants.countPlants(); i++) {
|
909
|
999
|
if (selected_plants.isSet(i)) {
|
910
|
|
- plants.startPlant(i);
|
|
1000
|
+ if (plants.getKickstart()->getPinNumber(i) >= 0) {
|
|
1001
|
+ need_kickstart = true;
|
|
1002
|
+ }
|
|
1003
|
+ }
|
|
1004
|
+ }
|
|
1005
|
+
|
|
1006
|
+ // start kickstart/valve as needed
|
|
1007
|
+ for (int i = 0; i < plants.countPlants(); i++) {
|
|
1008
|
+ if (selected_plants.isSet(i)) {
|
|
1009
|
+ plants.startPlant(i, need_kickstart);
|
911
|
1010
|
}
|
912
|
1011
|
}
|
913
|
1012
|
|
|
@@ -915,7 +1014,11 @@ void Statemachine::act(void) {
|
915
|
1014
|
|
916
|
1015
|
selected_time = MAX_AUTO_PLANT_RUNTIME;
|
917
|
1016
|
start_time = millis();
|
918
|
|
- switch_to(fillnwater_plant_run);
|
|
1017
|
+ if (need_kickstart) {
|
|
1018
|
+ switch_to(fillnwater_kickstart_run);
|
|
1019
|
+ } else {
|
|
1020
|
+ switch_to(fillnwater_plant_run);
|
|
1021
|
+ }
|
919
|
1022
|
} else if (wl == Plants::empty) {
|
920
|
1023
|
stop_time = millis();
|
921
|
1024
|
switch_to(auto_mode_a);
|
|
@@ -1158,6 +1261,21 @@ void Statemachine::switch_to(States s) {
|
1158
|
1261
|
a.c_str(),
|
1159
|
1262
|
b.c_str(),
|
1160
|
1263
|
3);
|
|
1264
|
+ } else if ((s == auto_plant_kickstart_run) || (s == fillnwater_kickstart_run)) {
|
|
1265
|
+ unsigned long runtime = millis() - start_time;
|
|
1266
|
+ String a = String("Time: ") + String(runtime / 1000UL) + String("s / ") + String(KICKSTART_RUNTIME) + String('s');
|
|
1267
|
+
|
|
1268
|
+ unsigned long anim = runtime * 20UL / (KICKSTART_RUNTIME * 1000UL);
|
|
1269
|
+ String b;
|
|
1270
|
+ for (unsigned long i = 0; i < anim; i++) {
|
|
1271
|
+ b += '#';
|
|
1272
|
+ }
|
|
1273
|
+
|
|
1274
|
+ print("---- Kick-Start ----",
|
|
1275
|
+ a.c_str(),
|
|
1276
|
+ b.c_str(),
|
|
1277
|
+ "Hit any key to stop!",
|
|
1278
|
+ -1);
|
1161
|
1279
|
} else if ((s == auto_plant_run) || (s == fillnwater_plant_run)) {
|
1162
|
1280
|
unsigned long runtime = millis() - start_time;
|
1163
|
1281
|
String a = String("Time: ") + String(runtime / 1000UL) + String("s / ") + String(selected_time) + String('s');
|