esp-idf-lib/components/apds9930/apds9930.c

changeset 37
50dbb626fbab
parent 21
df8564c9701e
--- a/esp-idf-lib/components/apds9930/apds9930.c	Thu Apr 20 15:19:31 2023 +0200
+++ b/esp-idf-lib/components/apds9930/apds9930.c	Sun Sep 10 17:29:15 2023 +0200
@@ -360,10 +360,18 @@
     float	iac;
 
     float ALSIT = 2.73 * (256 - APDS9930_DEFAULT_ATIME);
-    if ((Ch0 - APDS9930_ALS_B * Ch1) > (APDS9930_ALS_C * Ch0 - APDS9930_ALS_D * Ch1))
-	iac = Ch0 - APDS9930_ALS_B * Ch1;
+    float iac0 = Ch0 - APDS9930_ALS_B * Ch1;
+    float iac1 = APDS9930_ALS_C * Ch0 - APDS9930_ALS_D * Ch1;
+
+    if ((iac0 < 0) && (iac1 < 0)) {
+	/* Overflow, too much light */
+	return 32767.0;
+    }
+
+    if (iac0 > iac1)
+	iac = iac0;
     else
-	iac = APDS9930_ALS_C * Ch0 - APDS9930_ALS_D * Ch1;
+	iac = iac1;
     //float iac  = fmax(Ch0 - APDS9930_ALS_B * Ch1, APDS9930_ALS_C * Ch0 - APDS9930_ALS_D * Ch1);
     if (iac < 0)
 	iac = 0;
@@ -378,10 +386,18 @@
     unsigned long	iac;
 
     unsigned long ALSIT = 2.73 * (256 - APDS9930_DEFAULT_ATIME);
-    if ((Ch0 - APDS9930_ALS_B * Ch1) > (APDS9930_ALS_C * Ch0 - APDS9930_ALS_D * Ch1))
-	iac = Ch0 - APDS9930_ALS_B * Ch1;
+    long iac0 = Ch0 - APDS9930_ALS_B * Ch1;
+    long iac1 = APDS9930_ALS_C * Ch0 - APDS9930_ALS_D * Ch1;
+
+    if ((iac0 < 0) && (iac1 < 0)) {
+        /* Overflow, too much light */
+        return 32767;
+    }
+
+    if (iac0 > iac1)
+	iac = iac0;
     else
-	iac = APDS9930_ALS_C * Ch0 - APDS9930_ALS_D * Ch1;
+	iac = iac1;
     //unsigned long iac  = max(Ch0 - APDS9930_ALS_B * Ch1, APDS9930_ALS_C * Ch0 - APDS9930_ALS_D * Ch1);
 //	if (iac < 0) iac = 0;
     unsigned long lpc  = APDS9930_GA * APDS9930_DF / (ALSIT * x[apds9930_getAmbientLightGain(dev)]);

mercurial