From 41c52655194d8ed2b1ffb87d611e671153f9afab Mon Sep 17 00:00:00 2001
From: moon2 <moon2protonmail@protonmail.com>
Date: Mon, 20 Nov 2023 14:08:56 +0100
Subject: [PATCH] captouch: fix false negatives from .calibration_active()

---
 components/flow3r_bsp/flow3r_bsp_ad7147.c   | 8 +++++---
 components/flow3r_bsp/flow3r_bsp_ad7147.h   | 7 ++++---
 components/flow3r_bsp/flow3r_bsp_captouch.c | 4 ++--
 components/flow3r_bsp/flow3r_bsp_captouch.h | 2 --
 4 files changed, 11 insertions(+), 10 deletions(-)

diff --git a/components/flow3r_bsp/flow3r_bsp_ad7147.c b/components/flow3r_bsp/flow3r_bsp_ad7147.c
index f5409a625a..31dd1e809d 100644
--- a/components/flow3r_bsp/flow3r_bsp_ad7147.c
+++ b/components/flow3r_bsp/flow3r_bsp_ad7147.c
@@ -158,17 +158,18 @@ static void _on_data(void *user, uint16_t *data, size_t len) {
     if (chip->seq_position == 0) {
         // Deal with calibration pending flag, possibly starting calibration.
         if (chip->calibration_pending) {
-            if (chip->calibration_cycles == 0) {
+            if (!chip->calibration_active) {
                 ESP_LOGI(TAG, "%s: calibration starting...", chip->name);
                 chip->calibration_cycles = _AD7147_CALIB_CYCLES;
+                chip->calibration_active = true;
             }
             chip->calibration_pending = false;
         }
 
-        if (chip->calibration_cycles > 0) {
+        if (chip->calibration_active) {
             // Deal with active calibration.
             chip->calibration_cycles--;
-            if (chip->calibration_cycles == 0) {
+            if (chip->calibration_cycles <= 0) {
                 // Calibration measurements done. Calculate average amb data for
                 // each channel.
                 for (size_t i = 0; i < chip->nchannels; i++) {
@@ -206,6 +207,7 @@ static void _on_data(void *user, uint16_t *data, size_t len) {
                              chip->name, rerun);
                     chip->calibration_cycles = _AD7147_CALIB_CYCLES;
                 } else {
+                    chip->calibration_active = false;
                     ESP_LOGI(TAG, "%s: calibration done.", chip->name);
                 }
             }
diff --git a/components/flow3r_bsp/flow3r_bsp_ad7147.h b/components/flow3r_bsp/flow3r_bsp_ad7147.h
index 5082a87d06..fa2ff2e2ee 100644
--- a/components/flow3r_bsp/flow3r_bsp_ad7147.h
+++ b/components/flow3r_bsp/flow3r_bsp_ad7147.h
@@ -61,8 +61,9 @@ typedef struct {
     ad7147_hw_t dev;
     bool failed;
 
-    bool calibration_pending;
-    size_t calibration_cycles;
+    volatile bool calibration_pending;
+    volatile bool calibration_active;
+    int8_t calibration_cycles;
 } ad7147_chip_t;
 
 // Call to initialize the chip at a given address. Structure must be zeroed, and
@@ -75,4 +76,4 @@ esp_err_t flow3r_bsp_ad7147_chip_init(ad7147_chip_t *chip,
 
 // Call to poll the chip and perform any necessary actions. Can be called from
 // an interrupt.
-esp_err_t flow3r_bsp_ad7147_chip_process(ad7147_chip_t *chip);
\ No newline at end of file
+esp_err_t flow3r_bsp_ad7147_chip_process(ad7147_chip_t *chip);
diff --git a/components/flow3r_bsp/flow3r_bsp_captouch.c b/components/flow3r_bsp/flow3r_bsp_captouch.c
index 2b84cbeb73..e5a7db385d 100644
--- a/components/flow3r_bsp/flow3r_bsp_captouch.c
+++ b/components/flow3r_bsp/flow3r_bsp_captouch.c
@@ -378,7 +378,7 @@ void flow3r_bsp_captouch_calibrate() {
 }
 
 bool flow3r_bsp_captouch_calibrating() {
-    bool bot = _bot.calibration_pending || _bot.calibration_cycles > 0;
-    bool top = _top.calibration_pending || _top.calibration_cycles > 0;
+    bool bot = _bot.calibration_pending || _bot.calibration_active;
+    bool top = _top.calibration_pending || _top.calibration_active;
     return bot || top;
 }
diff --git a/components/flow3r_bsp/flow3r_bsp_captouch.h b/components/flow3r_bsp/flow3r_bsp_captouch.h
index a8fd1721a0..71c12922ec 100644
--- a/components/flow3r_bsp/flow3r_bsp_captouch.h
+++ b/components/flow3r_bsp/flow3r_bsp_captouch.h
@@ -83,6 +83,4 @@ flow3r_bsp_captouch_petal_pad_state_t *flow3r_bsp_captouch_pad_for_petal(
 void flow3r_bsp_captouch_calibrate();
 
 // Returns true if captouch is currently calibrating.
-//
-// TODO(q3k): this seems glitchy, investigate.
 bool flow3r_bsp_captouch_calibrating();
-- 
GitLab