123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325 |
- #include <Arduino.h>
- #include "Statemachine.h"
-
- Statemachine::DigitBuffer::DigitBuffer(int _size) {
- size = _size;
- pos = 0;
- digits = new int[size];
- }
-
- Statemachine::DigitBuffer::~DigitBuffer() {
- delete digits;
- }
-
- bool Statemachine::DigitBuffer::spaceLeft(void) {
- return (pos < size);
- }
-
- bool Statemachine::DigitBuffer::hasDigits(void) {
- return (pos > 0);
- }
-
- int Statemachine::DigitBuffer::countDigits(void) {
- return pos;
- }
-
- void Statemachine::DigitBuffer::addDigit(int d) {
- if (spaceLeft()) {
- digits[pos] = d;
- pos++;
- }
- }
-
- void Statemachine::DigitBuffer::removeDigit(void) {
- if (hasDigits()) {
- pos--;
- }
- }
-
- void Statemachine::DigitBuffer::clear(void) {
- pos = 0;
- }
-
- uint32_t Statemachine::DigitBuffer::getNumber(void) {
- uint32_t fact = 1;
- uint32_t sum = 0;
- for (int i = (pos - 1); i >= 0; i--) {
- sum += digits[i] * fact;
- fact *= 10;
- }
- return sum;
- }
-
- Statemachine::Statemachine(print_fn _print, backspace_fn _backspace)
- : db(7) {
- state = init;
- print = _print;
- backspace = _backspace;
-
- selected_id = 0;
- selected_time = 0;
- }
-
- void Statemachine::begin(void) {
- switch_to(init);
- }
-
- void Statemachine::input(int n) {
- if (state == init) {
- switch_to(menu);
- } else if (state == menu) {
- if (n == 1) {
- switch_to(menu_auto);
- } else if (n == 2) {
- switch_to(menu_pumps);
- } else if (n == 3) {
- switch_to(menu_valves);
- } else if ((n == -1) || (n == -2)) {
- switch_to(init);
- }
- } else if (state == menu_auto) {
- if ((n == -1) || (n == -2)) {
- switch_to(menu);
- } else if (n == 1) {
- // water only
-
- } else if (n == 2) {
- // with fertilizer
-
- }
- } else if (state == menu_auto_mode) {
- switch_to(menu);
- } else if (state == menu_auto_go) {
- switch_to(menu);
- } else if (state == menu_auto_done) {
- switch_to(menu);
- } else if (state == menu_pumps) {
- if (n == -1) {
- if (db.hasDigits()) {
- backspace();
- db.removeDigit();
- } else {
- switch_to(menu);
- }
- } else if (n == -2) {
- if (!db.hasDigits()) {
- return;
- }
-
- selected_id = number_input();
-
- // TODO validate
- switch_to(menu_pumps_time);
- } else {
- if (db.spaceLeft()) {
- db.addDigit(n);
- } else {
- backspace();
- }
- }
- } else if (state == menu_pumps_time) {
- if (n == -1) {
- if (db.hasDigits()) {
- backspace();
- db.removeDigit();
- } else {
- switch_to(menu_pumps);
- }
- } else if (n == -2) {
- if (!db.hasDigits()) {
- return;
- }
-
- selected_time = number_input();
-
- // TODO validate
- switch_to(menu_pumps_go);
- } else {
- if (db.spaceLeft()) {
- db.addDigit(n);
- } else {
- backspace();
- }
- }
- } else if (state == menu_pumps_go) {
- switch_to(menu);
- } else if (state == menu_pumps_running) {
- switch_to(menu);
- } else if (state == menu_pumps_done) {
- switch_to(menu);
- } else if (state == menu_valves) {
- if (n == -1) {
- if (db.hasDigits()) {
- backspace();
- db.removeDigit();
- } else {
- switch_to(menu);
- }
- } else if (n == -2) {
- if (!db.hasDigits()) {
- return;
- }
-
- selected_id = number_input();
-
- // TODO validate
- switch_to(menu_valves_time);
- } else {
- if (db.spaceLeft()) {
- db.addDigit(n);
- } else {
- backspace();
- }
- }
- } else if (state == menu_valves_time) {
- if (n == -1) {
- if (db.hasDigits()) {
- backspace();
- db.removeDigit();
- } else {
- switch_to(menu_valves);
- }
- } else if (n == -2) {
- if (!db.hasDigits()) {
- return;
- }
-
- selected_time = number_input();
-
- // TODO validate
- switch_to(menu_valves_go);
- } else {
- if (db.spaceLeft()) {
- db.addDigit(n);
- } else {
- backspace();
- }
- }
- } else if (state == menu_valves_go) {
- switch_to(menu);
- } else if (state == menu_valves_running) {
- switch_to(menu);
- } else if (state == menu_valves_done) {
- switch_to(menu);
- }
- }
-
- uint32_t Statemachine::number_input(void) {
- for (int i = 0; i < db.countDigits(); i++) {
- backspace();
- }
-
- uint32_t n = db.getNumber();
- db.clear();
-
- Serial.print("Whole number input: ");
- Serial.println(n);
-
- return n;
- }
-
- void Statemachine::act(void) {
-
- }
-
- void Statemachine::switch_to(States s) {
- state = s;
-
- if (s == init) {
- print("- Giess-o-mat V0.1 -",
- "Usage: Enter number",
- "* Delete prev. digit",
- "# Execute input num.",
- -1);
- } else if (s == menu) {
- print("------- Menu -------",
- "1: Automatic program",
- "2: Fertilizer pumps",
- "3: Outlet valves",
- -1);
- } else if (s == menu_auto) {
- print("------- Auto -------",
- "1: Water only",
- "2: With fertilizer",
- "",
- -1);
- } else if (s == menu_auto_mode) {
- print("",
- "",
- "",
- "",
- -1);
- } else if (s == menu_auto_go) {
- print("",
- "",
- "",
- "",
- -1);
- } else if (s == menu_auto_done) {
- print("",
- "",
- "",
- "",
- -1);
- } else if (s == menu_pumps) {
- print("------- Pump -------",
- "Please select pump",
- "(Input 1 to 3)",
- "Pump: ",
- 3);
- } else if (s == menu_pumps_time) {
- print("------ Pump X ------",
- "Please set runtime",
- "(Input in seconds)",
- "Runtime: ",
- 3);
- } else if (s == menu_pumps_go) {
- print("",
- "",
- "",
- "",
- -1);
- } else if (s == menu_pumps_running) {
- print("",
- "",
- "",
- "",
- -1);
- } else if (s == menu_pumps_done) {
- print("",
- "",
- "",
- "",
- -1);
- } else if (s == menu_valves) {
- print("------ Valves ------",
- "Please select valve",
- "(Input 1 to 5)",
- "Valve: ",
- 3);
- } else if (s == menu_valves_time) {
- print("----- Valve XX -----",
- "Please set runtime",
- "(Input in seconds)",
- "Runtime: ",
- 3);
- } else if (s == menu_valves_go) {
- print("",
- "",
- "",
- "",
- -1);
- } else if (s == menu_valves_running) {
- print("",
- "",
- "",
- "",
- -1);
- } else if (s == menu_valves_done) {
- print("",
- "",
- "",
- "",
- -1);
- }
- }
|