From 2ca2fc7cac941b85ba8bc9fd3a995169951a31eb Mon Sep 17 00:00:00 2001 From: Mickael Gaillard Date: Sat, 25 Apr 2020 19:09:53 +0200 Subject: [PATCH] Add web server gesture display Signed-off-by: Mickael Gaillard --- tasmota/xsns_27_apds9960.ino | 115 ++++++++++++++++++++++------------- 1 file changed, 73 insertions(+), 42 deletions(-) diff --git a/tasmota/xsns_27_apds9960.ino b/tasmota/xsns_27_apds9960.ino index 4800a96de..cc673e853 100644 --- a/tasmota/xsns_27_apds9960.ino +++ b/tasmota/xsns_27_apds9960.ino @@ -61,6 +61,8 @@ #define APDS9930_CHIPID_1 0x12 // we will check, if someone got an incorrect sensor #define APDS9930_CHIPID_2 0x39 // there are case reports about "accidentially bought" 9930's +#define APDS9960_GESTURE + /* Gesture parameters */ #define GESTURE_THRESHOLD_OUT 10 #define GESTURE_SENSITIVITY_1 50 @@ -72,13 +74,26 @@ const char APDS9960_TAG[] = "APDS9960"; #ifdef USE_WEBSERVER -const char HTTP_APDS9960_SNS[] PROGMEM = - "{s}" "Red" "{m}%s{e}" - "{s}" "Green" "{m}%s{e}" - "{s}" "Blue" "{m}%s{e}" - "{s}" "Ambient" "{m}%s " D_UNIT_LUX "{e}" - "{s}" "CCT" "{m}%s " "K" "{e}" // calculated color temperature in Kelvin - "{s}" "Proximity" "{m}%s{e}"; // {s} = , {m} = , {e} = +#ifdef APDS9960_GESTURE + +#define D_GESTURE "Gesture" + +const char HTTP_SNS_GESTURE[] PROGMEM = "{s}%s " D_GESTURE "{m}%s{e}"; + +#endif // APDS9960_GESTURE + +#define D_COLOR_RED "Red" +#define D_COLOR_GREEN "Green" +#define D_COLOR_BLUE "Blue" +#define D_PROXIMITY "Proximity" +#define D_CCT "CCT" + +const char HTTP_SNS_COLOR_RED[] PROGMEM = "{s}%s " D_COLOR_RED "{m}%u{e}"; +const char HTTP_SNS_COLOR_GREEN[] PROGMEM = "{s}%s " D_COLOR_GREEN "{m}%u{e}"; +const char HTTP_SNS_COLOR_BLUE[] PROGMEM = "{s}%s " D_COLOR_BLUE "{m}%u{e}"; +const char HTTP_SNS_CCT[] PROGMEM = "{s}%s " D_CCT "{m}%u " "K" "{e}"; +const char HTTP_SNS_PROXIMITY[] PROGMEM = "{s}%s " D_PROXIMITY "{m}%u{e}"; + #endif // USE_WEBSERVER /*********************************************************************************************\ @@ -236,7 +251,15 @@ const char HTTP_APDS9960_SNS[] PROGMEM = #define APDS9960_ERROR 0xFF +#ifdef APDS9960_GESTURE /* Direction definitions */ +const char GESTURE_UP[] PROGMEM = "Up"; +const char GESTURE_DOWN[] PROGMEM = "Down"; +const char GESTURE_LEFT[] PROGMEM = "Left"; +const char GESTURE_RIGHT[] PROGMEM = "Right"; +const char GESTURE_LONG[] PROGMEM = "Long"; +const char GESTURE_NONE[] PROGMEM = "None"; + enum { DIR_NONE, DIR_LEFT, @@ -249,12 +272,14 @@ enum { }; /* State definitions*/ +/* enum { APDS9960_NA_STATE, APDS9960_NEAR_STATE, APDS9960_FAR_STATE, APDS9960_ALL_STATE }; +*/ /* Container for gesture data */ typedef struct gesture_data_type { @@ -268,8 +293,7 @@ typedef struct gesture_data_type { uint8_t out_threshold; } gesture_data_t; -typedef struct gesture_type -{ +typedef struct gesture_type { int16_t ud_delta_ = 0; int16_t lr_delta_ = 0; int16_t ud_count_ = 0; @@ -278,6 +302,8 @@ typedef struct gesture_type int16_t motion_ = DIR_NONE; } gesture_t; +#endif // APDS9960_GESTURE + typedef struct color_data_type { uint16_t a; // measured ambient uint16_t r; // Red @@ -1451,7 +1477,7 @@ int16_t readGesture(void) { fifo_level = I2cRead8(APDS9960_I2C_ADDR, APDS9960_GFLVL); #ifdef USE_DEBUG_DRIVER - AddLog_P2(LOG_LEVEL_DEBUG, PSTR("DRV: FIFO Level : %d"), fifo_level); + AddLog_P2(LOG_LEVEL_DEBUG, PSTR("DRV: FIFO Level : %d"), fifo_level); #endif // USE_DEBUG_DRIVER /* If there's stuff in the FIFO, read it into our data block */ @@ -1705,28 +1731,28 @@ void handleGesture(void) { if (isGestureAvailable()) { switch (readGesture()) { case DIR_UP: - AddLog_P(LOG_LEVEL_DEBUG, PSTR("UP")); - snprintf_P(currentGesture, sizeof(currentGesture), PSTR("Up")); + AddLog_P(LOG_LEVEL_DEBUG, GESTURE_UP); + snprintf_P(currentGesture, sizeof(currentGesture), GESTURE_UP); break; case DIR_DOWN: - AddLog_P(LOG_LEVEL_DEBUG, PSTR("DOWN")); - snprintf_P(currentGesture, sizeof(currentGesture), PSTR("Down")); + AddLog_P(LOG_LEVEL_DEBUG, GESTURE_DOWN); + snprintf_P(currentGesture, sizeof(currentGesture), GESTURE_DOWN); break; case DIR_LEFT: - AddLog_P(LOG_LEVEL_DEBUG, PSTR("LEFT")); - snprintf_P(currentGesture, sizeof(currentGesture), PSTR("Left")); + AddLog_P(LOG_LEVEL_DEBUG, GESTURE_LEFT); + snprintf_P(currentGesture, sizeof(currentGesture), GESTURE_LEFT); break; case DIR_RIGHT: - AddLog_P(LOG_LEVEL_DEBUG, PSTR("RIGHT")); - snprintf_P(currentGesture, sizeof(currentGesture), PSTR("Right")); + AddLog_P(LOG_LEVEL_DEBUG, GESTURE_RIGHT); + snprintf_P(currentGesture, sizeof(currentGesture), GESTURE_RIGHT); break; default: if (APDS9960_overload) { - AddLog_P(LOG_LEVEL_DEBUG, PSTR("LONG")); - snprintf_P(currentGesture, sizeof(currentGesture), PSTR("Long")); + AddLog_P(LOG_LEVEL_DEBUG, GESTURE_LONG); + snprintf_P(currentGesture, sizeof(currentGesture), GESTURE_LONG); } else { - AddLog_P(LOG_LEVEL_DEBUG, PSTR("NONE")); - snprintf_P(currentGesture, sizeof(currentGesture), PSTR("None")); + AddLog_P(LOG_LEVEL_DEBUG, GESTURE_NONE); + snprintf_P(currentGesture, sizeof(currentGesture), GESTURE_NONE); } break; } @@ -1828,40 +1854,45 @@ void APDS9960_show(bool json) { if (!APDS9960type) { return; } if (!gesture_mode && !APDS9960_overload) { - char red_chr[10]; - char green_chr[10]; - char blue_chr[10]; - char ambient_chr[10]; - char cct_chr[10]; - char prox_chr[10]; + uint16_t ambient; readAllColorAndProximityData(); - - sprintf(ambient_chr, "%u", color_data.a/4); - sprintf(red_chr, "%u", color_data.r); - sprintf(green_chr, "%u", color_data.g); - sprintf(blue_chr, "%u", color_data.b); - sprintf(prox_chr, "%u", color_data.p); + ambient = color_data.a/4; /* disableLightSensor(); I2cWrite8(APDS9960_I2C_ADDR, APDS9960_ATIME, DEFAULT_ATIME); // reset to default enableLightSensor();*/ calculateColorTemperature(); // and calculate Lux - sprintf(cct_chr, "%u", color_data.cct); - if (json) { - ResponseAppend_P(PSTR(",\"%s\":{\"Red\":%s,\"Green\":%s,\"Blue\":%s,\"Ambient\":%s,\"CCT\":%s,\"Proximity\":%s}"), - APDS9960_TAG, red_chr, green_chr, blue_chr, ambient_chr, cct_chr, prox_chr); + ResponseAppend_P(PSTR(",\"%s\":{\"Red\":%u,\"Green\":%u,\"Blue\":%u,\"Ambient\":%u,\"CCT\":%s,\"Proximity\":%u}"), + APDS9960_TAG, + color_data.r, + color_data.g, + color_data.b, + ambient, + color_data.cct, + color_data.p); #ifdef USE_WEBSERVER } else { - WSContentSend_PD(HTTP_APDS9960_SNS, red_chr, green_chr, blue_chr, ambient_chr, cct_chr, prox_chr); + WSContentSend_PD(HTTP_SNS_COLOR_RED, APDS9960_TAG, color_data.r); + WSContentSend_PD(HTTP_SNS_COLOR_GREEN, APDS9960_TAG, color_data.g); + WSContentSend_PD(HTTP_SNS_COLOR_BLUE, APDS9960_TAG, color_data.b); +// WSContentSend_PD(HTTP_SNS_ILLUMINANCE, APDS9960_TAG, ambient); + WSContentSend_PD(HTTP_SNS_CCT, APDS9960_TAG, color_data.cct); + WSContentSend_PD(HTTP_SNS_PROXIMITY, APDS9960_TAG, color_data.p); #endif // USE_WEBSERVER } } else { - if (json && (currentGesture[0] != '\0' )) { - ResponseAppend_P(PSTR(",\"%s\":{\"%s\":1}"), APDS9960_TAG, currentGesture); - currentGesture[0] = '\0'; + if (currentGesture[0] != '\0') { + if (json) { + ResponseAppend_P(PSTR(",\"%s\":{\"%s\":1}"), APDS9960_TAG, currentGesture); +#ifdef USE_WEBSERVER + } else { + WSContentSend_PD(HTTP_SNS_GESTURE, APDS9960_TAG, currentGesture); +#endif // USE_WEBSERVER + currentGesture[0] = '\0'; + } } } }