// ===================================================================== // OLEDDisplay.cpp // ===================================================================== #include "OLEDDisplay.h" OLEDDisplay::OLEDDisplay(uint8_t sdaPin, uint8_t sclPin, uint8_t i2cAddr) : _display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET), _sdaPin(sdaPin), _sclPin(sclPin), _i2cAddr(i2cAddr) { } bool OLEDDisplay::begin() { Wire.begin(_sdaPin, _sclPin); if (!_display.begin(SSD1306_SWITCHCAPVCC, _i2cAddr)) { Serial.println(F("[OLED] Không thể khởi tạo màn hình!")); return false; } _display.clearDisplay(); _display.setTextColor(SSD1306_WHITE); _display.display(); Serial.println(F("[OLED] Đã khởi tạo thành công")); return true; } void OLEDDisplay::clear() { _display.clearDisplay(); _display.display(); } void OLEDDisplay::centerText(const char* text, int16_t y) { int16_t x1, y1; uint16_t w, h; _display.getTextBounds(text, 0, 0, &x1, &y1, &w, &h); _display.setCursor((SCREEN_WIDTH - w) / 2, y); _display.print(text); } void OLEDDisplay::showBootScreen(const char* nodeId) { _display.clearDisplay(); _display.setTextSize(1); centerText("ESP32-S3", 10); centerText("LD2453 RADAR", 25); _display.setCursor(0, 45); _display.print("Node: "); _display.println(nodeId); _display.display(); } void OLEDDisplay::showWiFiConnecting(const char* ssid) { _display.clearDisplay(); _display.setTextSize(1); centerText("Ket noi WiFi...", 15); _display.setCursor(0, 35); _display.print("SSID: "); // Cắt SSID nếu quá dài char shortSSID[17]; strncpy(shortSSID, ssid, 16); shortSSID[16] = '\0'; _display.println(shortSSID); _display.display(); } void OLEDDisplay::showWiFiConnected(IPAddress ip) { _display.clearDisplay(); _display.setTextSize(1); centerText("WiFi OK!", 15); _display.setCursor(0, 35); _display.print("IP: "); _display.println(ip); _display.display(); delay(2000); // Hiển thị 2 giây } void OLEDDisplay::showDiagnosticMode() { _display.clearDisplay(); _display.setTextSize(1); centerText("DIAGNOSTIC MODE", 10); centerText("Serial Only", 25); centerText("No WiFi", 40); _display.display(); delay(2000); } void OLEDDisplay::updateRadarInfo(const RadarFrame &frame, const LD2453Stats &stats) { _display.clearDisplay(); _display.setTextSize(1); // Dòng 1: Tiêu đề _display.setCursor(0, 0); _display.print("LD2453 "); if (stats.bytesReceived > 0) { _display.print("RX:"); _display.print(stats.bytesReceived); } else { _display.print("NO DATA"); } // Dòng 2: Frames parsed _display.setCursor(0, 12); _display.print("Frames: "); _display.print(stats.framesParsed); // Dòng 3: Errors _display.setCursor(0, 24); _display.print("Errors: "); _display.print(stats.parseErrors); // Dòng 4: PPS _display.setCursor(0, 36); _display.print("PPS: "); _display.print(stats.packetsPerSecond, 1); // Dòng 5: Target count _display.setCursor(0, 48); _display.print("Targets: "); _display.print(frame.targetCount); // Hiển thị các target nếu có for (uint8_t i = 0; i < frame.targetCount && i < 3; i++) { if (frame.targets[i].valid) { _display.print(" T"); _display.print(i + 1); } } _display.display(); } void OLEDDisplay::updateDetectionSummary(uint8_t targetCount, bool zone1, bool zone2, bool zone3) { _display.clearDisplay(); _display.setTextSize(1); // Tiêu đề _display.setCursor(0, 0); _display.print("DETECTION STATUS"); // Số target phát hiện _display.setCursor(0, 15); _display.setTextSize(2); _display.print("T:"); _display.print(targetCount); // Zones _display.setTextSize(1); _display.setCursor(0, 35); _display.print("Zone1: "); _display.println(zone1 ? "YES" : "NO"); _display.setCursor(0, 45); _display.print("Zone2: "); _display.println(zone2 ? "YES" : "NO"); _display.setCursor(0, 55); _display.print("Zone3: "); _display.println(zone3 ? "YES" : "NO"); _display.display(); } void OLEDDisplay::updateStats(const LD2453Stats &stats) { _display.clearDisplay(); _display.setTextSize(1); // Tiêu đề centerText("LD2453 RADAR", 0); // Thống kê _display.setCursor(0, 15); _display.print("Bytes RX: "); _display.println(stats.bytesReceived); _display.setCursor(0, 27); _display.print("Frames: "); _display.println(stats.framesParsed); _display.setCursor(0, 39); _display.print("Errors: "); _display.println(stats.parseErrors); _display.setCursor(0, 51); _display.print("PPS: "); _display.print(stats.packetsPerSecond, 1); _display.display(); }