202 lines
5.0 KiB
C++
202 lines
5.0 KiB
C++
// =====================================================================
|
|
// 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();
|
|
}
|