#include "SmartDisplay.hpp" #include "SmartTime.hpp" #include "TeaLoadingFrames.h" #include "RfidWaitAnim.h" SmartDisplay::SmartDisplay(Adafruit_SSD1306 *display) { m_display = display; } // Note: This blocks execution. void SmartDisplay::playTeaAnimation() { resetDisplay(); for (int i = 0; i < epd_bitmap_allArray_LEN; i++) { m_display->clearDisplay(); m_display->drawBitmap(0, 0, epd_bitmap_allArray[i], 128, 32, WHITE); m_display->display(); delay(100); } } // Note: This blocks execution. void SmartDisplay::playRfidWaitAnimation(int frame) { frame = frame % epd_bitmap_RfidWait_allArray_LEN; resetDisplay(); m_display->println("Waiting for RFID scan"); m_display->drawBitmap(0, 0, epd_bitmap_RfidWait_allArray[frame], 128, 32, WHITE); m_display->display(); } // Note: First part of tea animation void SmartDisplay::playTeaAnimationPartOne(int xoffset, String line1, String line2, String line3, String line4) { for (int i = 0; i < 6; i++) { resetDisplay(); m_display->println(line1); m_display->println(line2); m_display->println(line3); m_display->println(line4); m_display->drawBitmap(xoffset, 0, epd_bitmap_allArray[i], 128, 32, WHITE); m_display->display(); delay(100); } } void SmartDisplay::wipe() { for (int y = 0; y <= 32; y += 2) { m_display->drawFastHLine(0, y, 128, WHITE); m_display->display(); delay(5); m_display->drawFastHLine(0, y, 128, BLACK); m_display->drawFastHLine(0, y + 1, 128, BLACK); } } // Note: Second part of tea animation void SmartDisplay::playTeaAnimationPartTwo(int xoffset, String line1, String line2, String line3, String line4) { for (int i = 6; i < epd_bitmap_allArray_LEN; i++) { resetDisplay(); m_display->println(line1); m_display->println(line2); m_display->println(line3); m_display->println(line4); m_display->drawBitmap(xoffset, 0, epd_bitmap_allArray[i], 128, 32, WHITE); m_display->display(); delay(100); } } void SmartDisplay::displayLoadingAnimationFrame(int xoffset) { m_display->clearDisplay(); m_display->drawBitmap(xoffset, 0, epd_bitmap_allArray[5], 128, 32, WHITE); m_display->display(); } void SmartDisplay::printTeaConfigScreen(TeaData tea) { resetDisplay(); m_display->println(tea.m_teaName); m_display->setCursor(128 - 35, m_display->getCursorY()); if (tea.m_waterTemp > 0) { m_display->print(tea.m_waterTemp); m_display->drawCircle(m_display->getCursorX() + 4, m_display->getCursorY(), 1, WHITE); m_display->println(" C"); } else { m_display->println(""); } m_display->setTextSize(2); String steepingTime = SmartTime::formatSeconds(tea.m_steepingSeconds); m_display->print(steepingTime); m_display->setTextSize(1); m_display->setCursor(m_display->getCursorX(), m_display->getCursorY() + 7); m_display->println(" min"); m_display->display(); } void SmartDisplay::displayTeaNotes(TeaData tea) { resetDisplay(); m_display->println(tea.m_teaName); m_display->writeFastHLine(0, m_display->getCursorY(), 128, WHITE); m_display->setCursor(m_display->getCursorX(), m_display->getCursorY() + 3); m_display->print(tea.m_teaNotes); m_display->display(); } void SmartDisplay::printTeaSteepingProgressScreen(TeaData tea, int remainingSeconds) { resetDisplay(); m_display->println(tea.m_teaName); // m_display->println("(Steeping)"); m_display->println(); m_display->setTextSize(2); String remainingTime = SmartTime::formatSeconds(remainingSeconds); m_display->print(remainingTime); m_display->setTextSize(1); m_display->setCursor(m_display->getCursorX(), m_display->getCursorY() + 7); m_display->println(" min"); m_display->display(); } void SmartDisplay::printWaitForRFIDScreen() { } void SmartDisplay::printRequestFeedbackScreen(TeaData tea) { resetDisplay(); m_display->println(" Feedback "); m_display->setCursor(0, m_display->getCursorY() + 4); m_display->println("< >"); m_display->setCursor(0, m_display->getCursorY() + 4); m_display->println("shorter ok longer"); m_display->display(); } void SmartDisplay::printAddNewTeaConfigScreen(TeaData tea, u_int *flicker) { resetDisplay(); m_display->println(" New Tea"); m_display->println("Steeping time:"); if (*flicker % 12 == 0) { toggle = !toggle; } if (toggle) { m_display->display(); *flicker += 3; return; } m_display->setTextSize(2); String steepingTime = SmartTime::formatSeconds(tea.m_steepingSeconds); m_display->print(steepingTime); m_display->setTextSize(1); m_display->setCursor(m_display->getCursorX(), m_display->getCursorY() + 7); m_display->println(" min"); m_display->display(); } void SmartDisplay::printMsg(const String &s) { resetDisplay(); m_display->setCursor(0, 10); m_display->println(s); m_display->display(); } void SmartDisplay::printMsg(unsigned long l) { resetDisplay(); m_display->setCursor(0, 10); m_display->println(l); m_display->display(); } void SmartDisplay::printMsgAt(int16_t x, int16_t y, const String &s) { m_display->setCursor(x, y); m_display->println(s); m_display->display(); } void SmartDisplay::resetDisplay() { m_display->clearDisplay(); m_display->setTextColor(WHITE); m_display->setTextSize(1); m_display->setCursor(0, 0); }