diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..d8cb326 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "files.associations": { + "string": "cpp" + } +} \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index a9faacb..efc6779 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -17,6 +17,7 @@ const unsigned long displayInterval = 100; // 100 ms String lastEventId = ""; String problems[10]; +String problemDescriptions; int problemCount = 0; int severityCounts[5] = {0}; bool newProblemsDetected = false; @@ -48,6 +49,8 @@ void initSystems() { display.display(); } +int totalProblems = 0; // Variable to store the total number of active problems + void fetchActiveProblems() { WiFiClient client; HTTPClient http; @@ -55,7 +58,7 @@ void fetchActiveProblems() { http.addHeader("Content-Type", "application/json"); // JSON payload - DynamicJsonDocument doc(512); + DynamicJsonDocument doc(1024); doc["jsonrpc"] = "2.0"; doc["method"] = "problem.get"; doc["id"] = 1; @@ -83,6 +86,8 @@ void fetchActiveProblems() { int newProblemCount = 0; memset(severityCounts, 0, sizeof(severityCounts)); // Reset severities + totalProblems = result.size(); // Set total problems count + for (JsonObject problem : result) { String eventId = problem["eventid"].as(); int severity = problem["severity"].as(); @@ -104,6 +109,7 @@ void fetchActiveProblems() { } newProblemCount++; + problemDescriptions += description; } problemCount = newProblemCount; @@ -119,49 +125,39 @@ void fetchActiveProblems() { http.end(); } +int scrollPos = SCREEN_WIDTH; // Global variable to keep track of the scroll position +unsigned long lastScrollTime = 0; // To control the scroll speed +const int scrollDelay = 150; // Delay in milliseconds between scroll updates + void displayProblems() { - static int scrollPos = SCREEN_WIDTH; - static unsigned long lastScrollTime = 0; - - if (millis() - lastDisplayUpdate < displayInterval) { - return; // Skip rendering if the display interval hasn't elapsed - } - lastDisplayUpdate = millis(); - display.clearDisplay(); - - // Header display.setTextSize(1); - display.setCursor(0, 0); - display.print("Problems: "); - display.print(problemCount); + display.setCursor(0,0); + display.print("Total Problems: "); + display.print(totalProblems); // Display total problems - // Display severity counts (S0 to S4) - for (int i = 0; i < 5; i++) { - display.setCursor(0, 10 + (i * 10)); - display.printf("S%d: %d", i, severityCounts[i]); - } + int stateWidth = strlen(problemDescriptions.c_str()) * 12; // Approximate width of the status text in pixels + // Scroll the text to the left + if (!is_display_off) { + if (millis() - lastScrollTime > scrollDelay) { + // Update scroll position + scrollPos -= 11; // Move left by 1 pixel each time - // Scrolling description of the first problem - if (problemCount > 0) { - String problemText = problems[0]; - int16_t x1, y1; - uint16_t textWidth, textHeight; - display.getTextBounds(problemText, 0, 55, &x1, &y1, &textWidth, &textHeight); + lastScrollTime = millis(); - if (millis() - lastScrollTime > 100) { - scrollPos -= 2; - if (scrollPos < -textWidth) { + // If the text has completely scrolled off, reset scroll position to start from the right + if (scrollPos < -stateWidth) { scrollPos = SCREEN_WIDTH; } - lastScrollTime = millis(); } - - display.setTextSize(1); - display.setCursor(scrollPos, 55); - display.print(problemText); } - + // Draw the file name with current scroll position + display.setTextSize(2); + display.setCursor(scrollPos, 54); + display.print(problemDescriptions); + display.setCursor(0, 44); + display.setTextSize(1); + display.display(); } @@ -175,7 +171,7 @@ void loop() { unsigned long currentMillis = millis(); cubeButtonHandler(); - if (currentMillis - lastRefresh >= refreshInterval) { + if (!is_display_off && currentMillis - lastRefresh >= refreshInterval) { lastRefresh = currentMillis; fetchActiveProblems(); }