From a407902b0600ca0b2b26c91a4597c856d16e4b26 Mon Sep 17 00:00:00 2001
From: mark9064 <30447455+mark9064@users.noreply.github.com>
Date: Tue, 23 Apr 2024 00:16:19 +0100
Subject: [PATCH] aod: avoid spinning DisplayApp under high LVGL load

---
 src/displayapp/DisplayApp.cpp | 16 +++++++++-------
 1 file changed, 9 insertions(+), 7 deletions(-)

diff --git a/src/displayapp/DisplayApp.cpp b/src/displayapp/DisplayApp.cpp
index bc9a57bc..f5a92117 100644
--- a/src/displayapp/DisplayApp.cpp
+++ b/src/displayapp/DisplayApp.cpp
@@ -242,14 +242,16 @@ void DisplayApp::Refresh() {
         // If not true, then wait that amount of time
         queueTimeout = CalculateSleepTime();
         if (queueTimeout == 0) {
-          // Keep running the task handler if it still has things to draw
-          while (!lv_task_handler()) {
+          // Only advance the tick count when LVGL is done
+          // Otherwise keep running the task handler while it still has things to draw
+          // Note: under high graphics load, LVGL will always have more work to do
+          if (lv_task_handler() > 0) {
+            // Drop frames that we've missed if drawing/event handling took way longer than expected
+            while (queueTimeout == 0) {
+              alwaysOnTickCount += 1;
+              queueTimeout = CalculateSleepTime();
+            }
           };
-          // Drop frames that we've missed if the loop took way longer than expected to execute
-          while (queueTimeout == 0) {
-            alwaysOnTickCount += 1;
-            queueTimeout = CalculateSleepTime();
-          }
         }
       } else {
         queueTimeout = portMAX_DELAY;