Vajnar commented on code in PR #16491:
URL: https://github.com/apache/nuttx/pull/16491#discussion_r2151660042


##########
arch/risc-v/src/common/espressif/esp_pcnt.c:
##########
@@ -642,8 +646,34 @@ static int esp_pcnt_unit_get_count(struct cap_lowerhalf_s 
*dev, int *ret)
     }
 
   flags = spin_lock_irqsave(&priv->lock);
-  *ret = pcnt_ll_get_count(ctx.dev, priv->unit_id) +
-      priv->accum_value;
+  tmp_count = pcnt_ll_get_count(ctx.dev, priv->unit_id);
+
+  if (priv->config.accum_count)
+    {
+      intr_status = pcnt_ll_get_intr_status(ctx.dev);
+      if (intr_status & PCNT_LL_UNIT_WATCH_EVENT(priv->unit_id))
+        {
+          event_status = pcnt_ll_get_event_status(ctx.dev, priv->unit_id);
+          while (event_status)
+            {
+              int event_id = __builtin_ffs(event_status) - 1;
+              event_status &= (event_status - 1);
+
+              if ((event_id == PCNT_LL_WATCH_EVENT_LOW_LIMIT) && \
+                  (tmp_count >= (priv->config.low_limit / 2)))
+                {
+                  tmp_count += priv->config.low_limit;
+                }
+              else if ((event_id == PCNT_LL_WATCH_EVENT_HIGH_LIMIT) && \
+                       (tmp_count <= (priv->config.high_limit / 2)))
+                {
+                  tmp_count += priv->config.high_limit;
+                }
+            }
+        }
+    }
+
+  *ret = tmp_count + priv->accum_value;

Review Comment:
   > There is important to check clearing conditions in the PCNT hardware. If 
the read of pcnt_ll_get_intr_status() is not changing internal state of the 
peripheral then it is correct. The loop is not necessary because only single 
test for one and another condition is enough.
   
   Hi @ppisa, I removed the loop. Please, check if You agree. I see coding 
style issue in:
   ```
   ~/nuttx/arch/risc-v/src/common/espressif/esp_pcnt.c:662:78: error: Long line 
found
   ~/nuttx/arch/xtensa/src/common/espressif/esp_pcnt.c:699:78: error: Long line 
found
   
   ```
   But I'm not sure if splitting the line helps readability.



##########
arch/risc-v/src/common/espressif/esp_pcnt.c:
##########
@@ -642,8 +646,34 @@ static int esp_pcnt_unit_get_count(struct cap_lowerhalf_s 
*dev, int *ret)
     }
 
   flags = spin_lock_irqsave(&priv->lock);
-  *ret = pcnt_ll_get_count(ctx.dev, priv->unit_id) +
-      priv->accum_value;
+  tmp_count = pcnt_ll_get_count(ctx.dev, priv->unit_id);
+
+  if (priv->config.accum_count)
+    {
+      intr_status = pcnt_ll_get_intr_status(ctx.dev);
+      if (intr_status & PCNT_LL_UNIT_WATCH_EVENT(priv->unit_id))
+        {
+          event_status = pcnt_ll_get_event_status(ctx.dev, priv->unit_id);
+          while (event_status)
+            {
+              int event_id = __builtin_ffs(event_status) - 1;
+              event_status &= (event_status - 1);
+
+              if ((event_id == PCNT_LL_WATCH_EVENT_LOW_LIMIT) && \
+                  (tmp_count >= (priv->config.low_limit / 2)))
+                {
+                  tmp_count += priv->config.low_limit;
+                }
+              else if ((event_id == PCNT_LL_WATCH_EVENT_HIGH_LIMIT) && \
+                       (tmp_count <= (priv->config.high_limit / 2)))
+                {
+                  tmp_count += priv->config.high_limit;
+                }
+            }
+        }
+    }
+
+  *ret = tmp_count + priv->accum_value;

Review Comment:
   > There is important to check clearing conditions in the PCNT hardware. If 
the read of pcnt_ll_get_intr_status() is not changing internal state of the 
peripheral then it is correct. The loop is not necessary because only single 
test for one and another condition is enough.
   
   Hi @ppisa, I removed the loop. Please, check if You agree. I see coding 
style issue in:
   ```
   ~/nuttx/arch/risc-v/src/common/espressif/esp_pcnt.c:662:78: error: Long line 
found
   ~/nuttx/arch/xtensa/src/common/espressif/esp_pcnt.c:699:78: error: Long line 
found
   ```
   But I'm not sure if splitting the line helps readability.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscr...@nuttx.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org

Reply via email to