#include "Board.h" #include #include #include #include "Config.h" namespace { Arduino_DataBus* bus = new Arduino_ESP32SPI( config::kTftDc, config::kTftCs, config::kSpiSck, config::kSpiMosi, config::kSpiMiso); // The panel is natively 222x480. Rotation 1 gives the reader a 480x222 canvas. Arduino_GFX* makeDisplay() { return new Arduino_ST7796(bus, config::kTftReset, 1, true, 222, 480, 49, 0); } } // namespace bool Board::begin() { display_ = makeDisplay(); if (!display_->begin()) { return false; } display_->fillScreen(BLACK); pinMode(config::kBacklight, OUTPUT); setBrightness(config::kNormalBrightness); return true; } bool Board::beginSd() { SPI.begin(config::kSpiSck, config::kSpiMiso, config::kSpiMosi); return SD.begin(config::kSdCs, SPI); } void Board::drawWord(const String& word) { if (display_ == nullptr) return; display_->fillScreen(BLACK); const size_t glyphs = word.length() == 0 ? 1 : word.length(); uint16_t calculatedScale = 480 / (glyphs * 6); // MVP font supports printable ASCII text. if (calculatedScale < 2) calculatedScale = 2; if (calculatedScale > 12) calculatedScale = 12; const uint8_t scale = calculatedScale; const int16_t width = glyphs * 6 * scale; const int16_t height = 8 * scale; int16_t x = (display_->width() - width) / 2; if (x < 0) x = 0; display_->setTextColor(WHITE); display_->setTextSize(scale); display_->setCursor(x, (display_->height() - height) / 2); display_->print(word); } void Board::setBrightness(uint8_t level) { level = constrain(level, 0, 16); #ifdef TDS3P_V1_0 ledcSetup(1, 1000, 8); ledcAttachPin(config::kBacklight, 1); ledcWrite(1, map(level, 0, 16, 0, 255)); #else // v1.1 uses a 16-step constant-current driver, not PWM. if (level == 0) { digitalWrite(config::kBacklight, LOW); delay(3); brightness_ = 0; return; } if (brightness_ == 0) { digitalWrite(config::kBacklight, HIGH); brightness_ = 16; delayMicroseconds(30); } const uint8_t from = 16 - brightness_; const uint8_t to = 16 - level; const uint8_t pulses = (16 + to - from) % 16; for (uint8_t i = 0; i < pulses; ++i) { digitalWrite(config::kBacklight, LOW); digitalWrite(config::kBacklight, HIGH); } brightness_ = level; #endif } void Board::displayOff() { setBrightness(0); } void Board::displayOn() { setBrightness(config::kNormalBrightness); }