#include "menu.h" Menu::Menu() : lcd(0x3F, 16, 2), enc(ENCPIN1, ENCPIN2, ENCBTNPIN) { Wire.begin(4, 5); lcd.init(); lcd.backlight(); pinMode(BRBPIN, INPUT_PULLUP); pinMode(LEDPIN, OUTPUT); } void Menu::setMenuPage(Page page) { switch (page) { case PRELOAD: case PIZZA_SELECT: lcd.cursor_off(); menuPage = page; break; case DOUGH_SELECT: if (menuPage != PIZZA_SELECT && menuPage != SIZE_SELECT) return; selectedDough = Pizzas::TRADITIONAL; pizzaSizesIndex = 0; menuPage = page; initVariations(); break; case SIZE_SELECT: if (menuPage != DOUGH_SELECT) return; menuPage = page; break; case CONFIRMATION: if (menuPage != SIZE_SELECT) return; menuPage = page; break; case PLACING_ORDER: { if (menuPage != CONFIRMATION) return; lcd.cursor_off(); Pizzas::Variation var = pizzaSizes[pizzaSizesIndex]; selectedPizzaId = var.id; menuPage = page; break; } case TRACKING: if (menuPage != PLACING_ORDER) return; menuPage = page; break; } draw(); }; void Menu::setTrackingStatus(TrackingStatus new_status) { if (trackingStatus == new_status) return; trackingStatus = new_status; draw(); } void Menu::updateIndex() { if (menuPage != PIZZA_SELECT) return; drawIndex(); } void Menu::initVariations() { Pizzas::Pizza pizza = pizzas.get(curentPizzaIndex); for (int i = 0; i < 4; i++) pizzaSizes[i] = {}; pizzaSizesIndex = 0; uint8_t sizesCount; for (int i=0; i= len) { new_str[i+1] = '\0'; break; } } } return new_str; } void Menu::drawPrice(uint16_t price) { lcd.setCursor(0, 1); lcd.print(price, DEC); lcd.print("RUB "); } void Menu::drawSizes() { lcd.setCursor(0, 1); for (int i=0; i<4; i++) { Pizzas::Variation pizza = pizzaSizes[i]; if (pizza.id) { lcd.print(pizza.size, DEC); } else { lcd.print(" "); } lcd.print(" "); } } void Menu::drawIndex() { uint8_t curentPizza = curentPizzaIndex + 1; uint8_t totalPizzas = pizzas.get_count(); lcd.setCursor(11, 1); if (curentPizza < 10) lcd.print(" "); if (totalPizzas < 10) lcd.print(" "); lcd.print(curentPizza, DEC); lcd.print("/"); lcd.print(totalPizzas, DEC); } void Menu::drawTrackingStatus() { lcd.setCursor(0, 1); if (trackingStatus == UNKNOWN) { lcd.print("Получение..."); } else { lcd.print(trackingStatusStrings[trackingStatus]); } } void Menu::drawDough(Pizzas::Dough dough) { switch (dough) { case Pizzas::TRADITIONAL: lcd.print("обычн"); break; case Pizzas::THIN: lcd.print("тонк"); break; } lcd.print(" "); } void Menu::drawPriceShort(uint16_t price) { lcd.setCursor(11, 0); for (int d=1000; price 500) { animationState = !animationState; animationTick = millis(); draw(); } break; case DOUGH_SELECT: case SIZE_SELECT: if (millis() - animationTick > 300) { if (animationState) { lcd.cursor_on(); } else { lcd.cursor_off(); } animationState = !animationState; animationTick = millis(); } break; } } void Menu::draw() { switch (menuPage) { case WIFI_CONNECT: lcd.setCursor(0, 0); if (animationState) { lcd.print("WIFI CONNECTING "); } else { lcd.print("WIFI CONNECTING."); } break; case PRELOAD: lcd.clear(); lcd.setCursor(0, 0); lcd.print("Загрузка питс..."); break; case PIZZA_SELECT: { Pizzas::Pizza pizza = pizzas.get(curentPizzaIndex); lcd.clear(); drawPizzaName(pizza.name); drawPrice(pizza.price); drawIndex(); digitalWrite(LEDPIN, LOW); brbflag = false; break; } case DOUGH_SELECT: { lcd.clear(); lcd.setCursor(0, 0); drawDough(Pizzas::TRADITIONAL); drawDough(Pizzas::THIN); Pizzas::Variation var = pizzaSizes[pizzaSizesIndex]; drawPriceShort(var.price); drawSizes(); uint8_t cursor = (selectedDough == Pizzas::TRADITIONAL) ? 0 : 6; lcd.setCursor(cursor, 0); break; } case SIZE_SELECT: lcd.clear(); lcd.setCursor(0, 0); drawDough(selectedDough); drawSizes(); drawSizeSelectUpdate(); break; case CONFIRMATION: { Pizzas::Pizza pizza = pizzas.get(curentPizzaIndex); Pizzas::Variation var = pizzaSizes[pizzaSizesIndex]; lcd.clear(); drawPizzaName(pizza.name); drawVariation(var); digitalWrite(LEDPIN, HIGH); delay(3000); brbflag = false; break; } case PLACING_ORDER: lcd.clear(); lcd.setCursor(0, 0); lcd.print("Заказываем..."); digitalWrite(LEDPIN, LOW); break; case TRACKING: lcd.clear(); lcd.setCursor(0, 0); lcd.print("Статус:"); drawTrackingStatus(); break; } }