perf: Unroll display update loop to prevent blocking the main logic.

This commit is contained in:
2026-03-09 22:18:07 -07:00
parent a2ad5d244e
commit 10d19a5e58

View File

@ -36,7 +36,6 @@ int comp1_size = 512; // Range: 0 to 1024
int comp2_shift = 0; // Range: -512 to 512 int comp2_shift = 0; // Range: -512 to 512
int comp2_size = 512; // Range: 0 to 1024 int comp2_size = 512; // Range: 0 to 1024
// State
bool prev_gate1 = false; bool prev_gate1 = false;
bool prev_gate2 = false; bool prev_gate2 = false;
bool ff_state = false; bool ff_state = false;
@ -356,7 +355,8 @@ void loop() {
gate1 = false; gate1 = false;
} }
} else { } else {
if (cv1_val >= c1_lower + HYSTERESIS && cv1_val <= c1_upper - HYSTERESIS) { if (cv1_val >= c1_lower + HYSTERESIS &&
cv1_val <= c1_upper - HYSTERESIS) {
gate1 = true; gate1 = true;
} }
} }
@ -367,7 +367,8 @@ void loop() {
gate2 = false; gate2 = false;
} }
} else { } else {
if (cv2_val >= c2_lower + HYSTERESIS && cv2_val <= c2_upper - HYSTERESIS) { if (cv2_val >= c2_lower + HYSTERESIS &&
cv2_val <= c2_upper - HYSTERESIS) {
gate2 = true; gate2 = true;
} }
} }
@ -399,29 +400,36 @@ void loop() {
} }
if (current_mode == MODE_COMPARATOR) { if (current_mode == MODE_COMPARATOR) {
if (abs(cv1_val - last_cv1_draw) > 12 || abs(cv2_val - last_cv2_draw) > 12) { if (abs(cv1_val - last_cv1_draw) > 12 ||
abs(cv2_val - last_cv2_draw) > 12) {
needs_redraw = true; needs_redraw = true;
} }
} else if (current_mode == MODE_CALIBRATION) { } else if (current_mode == MODE_CALIBRATION) {
// Need frequent redraws in calibration to see the live target input // Need frequent redraws in calibration to see the live target input
if (abs(cv1_val - last_cv1_draw) >= 2 || abs(cv2_val - last_cv2_draw) >= 2) { if (abs(cv1_val - last_cv1_draw) >= 2 ||
abs(cv2_val - last_cv2_draw) >= 2) {
needs_redraw = true; needs_redraw = true;
} }
} }
// Cap framerate so display I2C calls do not block gate loop // Unroll the display loop so it doesn't block the logic loop
if (needs_redraw && (millis() - last_redraw >= 30)) { static bool is_drawing = false;
if (needs_redraw && !is_drawing && (millis() - last_redraw >= 30)) {
needs_redraw = false; needs_redraw = false;
is_drawing = true;
last_redraw = millis(); last_redraw = millis();
gravity.display.firstPage(); gravity.display.firstPage();
do { }
if (current_mode == MODE_COMPARATOR) {
last_cv1_draw = cv1_val; if (is_drawing) {
last_cv2_draw = cv2_val; if (current_mode == MODE_COMPARATOR) {
UpdateDisplay(cv1_val, cv2_val); last_cv1_draw = cv1_val;
} else { last_cv2_draw = cv2_val;
UpdateCalibrationDisplay(); UpdateDisplay(cv1_val, cv2_val);
} } else {
} while (gravity.display.nextPage()); UpdateCalibrationDisplay();
}
is_drawing = gravity.display.nextPage();
} }
} }