From 60e6541d0990bbbe105b12b44d1f0d15592e047f Mon Sep 17 00:00:00 2001 From: sfeakes Date: Fri, 14 Jun 2024 17:11:57 -0500 Subject: [PATCH] Refactor & Code Cleanup --- Dockerfile | 59 - Makefile | 63 +- allbutton.c | 697 +++++++++++ allbutton.h | 8 + allbutton_aq_programmer.c | 1359 +++++++++++++++++++++ allbutton_aq_programmer.h | 26 + aq_panel.c | 128 +- aq_programmer.c | 2299 +++++------------------------------ aq_programmer.h | 39 +- aq_serial.c | 61 + aq_serial.h | 4 + aq_timer.c | 12 +- aqualink.h | 2 +- aqualinkd.c | 787 +----------- config.c | 7 +- config.h | 1 + devices_pentair.c | 4 + docker/buildx.sh | 6 + hassio.c | 21 +- iaqtouch_aq_programmer.c | 1 + net_services.c | 16 - pda.c | 1 + pda_aq_programmer.c | 382 +++++- pda_aq_programmer.h | 37 +- release/aqualinkd-arm64 | Bin 520064 -> 529040 bytes release/aqualinkd-armhf | Bin 505112 -> 513968 bytes release/serial_logger-arm64 | Bin 68064 -> 72280 bytes release/serial_logger-armhf | Bin 58308 -> 58460 bytes serial_logger.c | 43 +- time.out | 600 --------- version.h | 2 +- 31 files changed, 2959 insertions(+), 3706 deletions(-) delete mode 100644 Dockerfile create mode 100644 allbutton.c create mode 100644 allbutton.h create mode 100644 allbutton_aq_programmer.c create mode 100644 allbutton_aq_programmer.h delete mode 100644 time.out diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index 8a3954bf..00000000 --- a/Dockerfile +++ /dev/null @@ -1,59 +0,0 @@ -##################################### -# -# Build container -# The most basic build for aqualinkd latest version -##################################### - -FROM debian:bookworm AS aqualinkd-build - -#VOLUME ["/aqualinkd-build"] - -RUN apt-get update && \ - apt-get -y install build-essential libsystemd-dev - -# Seup working dir -RUN mkdir /home/AqualinkD -WORKDIR /home/AqualinkD - -# Get latest release -RUN curl -sL $(curl -s https://api.github.com/repos/sfeakes/AqualinkD/releases/latest | grep "tarball_url" | cut -d'"' -f4) | tar xz --strip-components=1 - -# Build aqualinkd -RUN make clean && \ - make container - -##################################### -# -# Runtime container -# -##################################### - -FROM debian:bookworm-slim AS aqualinkd - -#ARG AQUALINKD_VERSION - -RUN apt-get update && \ - apt-get install -y cron curl && \ - apt-get clean - -# Set cron to read local.d -RUN sed -i '/EXTRA_OPTS=.-l./s/^#//g' /etc/default/cron - -# Add Open Container Initiative (OCI) annotations. -# See: https://github.com/opencontainers/image-spec/blob/main/annotations.md - -LABEL org.opencontainers.image.title="AqualinkD" -LABEL org.opencontainers.image.url="https://hub.docker.com/repository/docker/sfeakes/aqualinkd/general" -LABEL org.opencontainers.image.source="https://github.com/sfeakes/AqualinkD" -LABEL org.opencontainers.image.documentation="https://github.com/sfeakes/AqualinkD" -#LABEL org.opencontainers.image.version=$AQUALINKD_VERSION - - -COPY --from=aqualinkd-build /home/AqualinkD/release/aqualinkd /usr/local/bin/aqualinkd -COPY --from=aqualinkd-build /home/AqualinkD/release/serial_logger /usr/local/bin/serial_logger -COPY --from=aqualinkd-build /home/AqualinkD/web/ /var/www/aqualinkd/ -COPY --from=aqualinkd-build /home/AqualinkD/release/aqualinkd.conf /etc/aqualinkd.conf -#COPY --from=aqualinkd-build /home/AqualinkD/docker/aqualinkd-docker.cmd /usr/local/bin/aqualinkd-docker -RUN curl -s -o /usr/local/bin/aqualinkd-docker https://raw.githubusercontent.com/sfeakes/AqualinkD/master/extras/aqualinkd-docker.cmd - -CMD ["sh", "-c", "/usr/local/bin/aqualinkd-docker"] diff --git a/Makefile b/Makefile index 520e64c3..634b5d80 100755 --- a/Makefile +++ b/Makefile @@ -80,7 +80,7 @@ endif # Main source files -SRCS = aqualinkd.c utils.c config.c aq_serial.c aq_panel.c aq_programmer.c net_services.c json_messages.c rs_msg_utils.c\ +SRCS = aqualinkd.c utils.c config.c aq_serial.c aq_panel.c aq_programmer.c allbutton.c allbutton_aq_programmer.c net_services.c json_messages.c rs_msg_utils.c\ devices_jandy.c packetLogger.c devices_pentair.c color_lights.c serialadapter.c aq_timer.c aq_scheduler.c web_config.c\ serial_logger.c mongoose.c hassio.c simulator.c timespec_subtract.c @@ -140,10 +140,14 @@ SL_SRC = serial_logger.c aq_serial.c utils.c packetLogger.c rs_msg_utils.c times #MG_SRC = mongoose.c # Build durectories +SRC_DIR := ./ OBJ_DIR := ./build DBG_OBJ_DIR := $(OBJ_DIR)/debug SL_OBJ_DIR := $(OBJ_DIR)/slog +INCLUDES := -I$(SRC_DIR) + +# define path for obj files per architecture OBJ_DIR_ARMHF := $(OBJ_DIR)/armhf OBJ_DIR_ARM64 := $(OBJ_DIR)/arm64 OBJ_DIR_AMD64 := $(OBJ_DIR)/amd64 @@ -151,18 +155,37 @@ SL_OBJ_DIR_ARMHF := $(OBJ_DIR_ARMHF)/slog SL_OBJ_DIR_ARM64 := $(OBJ_DIR_ARM64)/slog SL_OBJ_DIR_AMD64 := $(OBJ_DIR_AMD64)/slog -# Object files -OBJ_FILES := $(patsubst %.c,$(OBJ_DIR)/%.o,$(SRCS)) -DBG_OBJ_FILES := $(patsubst %.c,$(DBG_OBJ_DIR)/%.o,$(DBG_SRC)) -SL_OBJ_FILES := $(patsubst %.c,$(SL_OBJ_DIR)/%.o,$(SL_SRC)) +# append path to source +SRCS := $(patsubst %.c,$(SRC_DIR)/%.c,$(SRCS)) +DBG_SRC := $(patsubst %.c,$(SRC_DIR)/%.c,$(DBG_SRC)) +SL_SRC := $(patsubst %.c,$(SRC_DIR)/%.c,$(SL_SRC)) + +# append path to obj files per architecture +OBJ_FILES := $(patsubst $(SRC_DIR)/%.c,$(OBJ_DIR)/%.o,$(SRCS)) +DBG_OBJ_FILES := $(patsubst $(SRC_DIR)/%.c,$(DBG_OBJ_DIR)/%.o,$(DBG_SRC)) +SL_OBJ_FILES := $(patsubst $(SRC_DIR)/%.c,$(SL_OBJ_DIR)/%.o,$(SL_SRC)) + +OBJ_FILES_ARMHF := $(patsubst $(SRC_DIR)/%.c,$(OBJ_DIR_ARMHF)/%.o,$(SRCS)) +OBJ_FILES_ARM64 := $(patsubst $(SRC_DIR)/%.c,$(OBJ_DIR_ARM64)/%.o,$(SRCS)) +OBJ_FILES_AMD64 := $(patsubst $(SRC_DIR)/%.c,$(OBJ_DIR_AMD64)/%.o,$(SRCS)) + +SL_OBJ_FILES_ARMHF := $(patsubst $(SRC_DIR)/%.c,$(SL_OBJ_DIR_ARMHF)/%.o,$(SL_SRC)) +SL_OBJ_FILES_ARM64 := $(patsubst $(SRC_DIR)/%.c,$(SL_OBJ_DIR_ARM64)/%.o,$(SL_SRC)) +SL_OBJ_FILES_AMD64 := $(patsubst $(SRC_DIR)/%.c,$(SL_OBJ_DIR_AMD64)/%.o,$(SL_SRC)) + +#OBJ_FILES := $(patsubst %.c,$(OBJ_DIR)/%.o,$(SRCS)) +#DBG_OBJ_FILES := $(patsubst %.c,$(DBG_OBJ_DIR)/%.o,$(DBG_SRC)) +#SL_OBJ_FILES := $(patsubst %.c,$(SL_OBJ_DIR)/%.o,$(SL_SRC)) + +#OBJ_FILES_ARMHF := $(patsubst %.c,$(OBJ_DIR_ARMHF)/%.o,$(SRCS)) +#OBJ_FILES_ARM64 := $(patsubst %.c,$(OBJ_DIR_ARM64)/%.o,$(SRCS)) +#OBJ_FILES_AMD64 := $(patsubst %.c,$(OBJ_DIR_AMD64)/%.o,$(SRCS)) + +#SL_OBJ_FILES_ARMHF := $(patsubst %.c,$(SL_OBJ_DIR_ARMHF)/%.o,$(SL_SRC)) +#SL_OBJ_FILES_ARM64 := $(patsubst %.c,$(SL_OBJ_DIR_ARM64)/%.o,$(SL_SRC)) +#SL_OBJ_FILES_AMD64 := $(patsubst %.c,$(SL_OBJ_DIR_AMD64)/%.o,$(SL_SRC)) -OBJ_FILES_ARMHF := $(patsubst %.c,$(OBJ_DIR_ARMHF)/%.o,$(SRCS)) -OBJ_FILES_ARM64 := $(patsubst %.c,$(OBJ_DIR_ARM64)/%.o,$(SRCS)) -OBJ_FILES_AMD64 := $(patsubst %.c,$(OBJ_DIR_AMD64)/%.o,$(SRCS)) -SL_OBJ_FILES_ARMHF := $(patsubst %.c,$(SL_OBJ_DIR_ARMHF)/%.o,$(SL_SRC)) -SL_OBJ_FILES_ARM64 := $(patsubst %.c,$(SL_OBJ_DIR_ARM64)/%.o,$(SL_SRC)) -SL_OBJ_FILES_AMD64 := $(patsubst %.c,$(SL_OBJ_DIR_AMD64)/%.o,$(SL_SRC)) #MG_OBJ_FILES := $(patsubst %.c,$(OBJ_DIR)/%.o,$(MG_SRC)) # define the executable file @@ -252,31 +275,31 @@ install: # Rules to compile -$(OBJ_DIR)/%.o: %.c | $(OBJ_DIR) +$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c | $(OBJ_DIR) $(CC) $(CFLAGS) $(INCLUDES) -c -o $@ $< -$(DBG_OBJ_DIR)/%.o: %.c | $(DBG_OBJ_DIR) +$(DBG_OBJ_DIR)/%.o: $(SRC_DIR)/%.c | $(DBG_OBJ_DIR) $(CC) $(DBG_CFLAGS) $(INCLUDES) -c -o $@ $< -$(SL_OBJ_DIR)/%.o: %.c | $(SL_OBJ_DIR) +$(SL_OBJ_DIR)/%.o: $(SRC_DIR)/%.c | $(SL_OBJ_DIR) $(CC) $(CFLAGS) $(INCLUDES) -c -o $@ $< -$(OBJ_DIR_ARMHF)/%.o: %.c | $(OBJ_DIR_ARMHF) +$(OBJ_DIR_ARMHF)/%.o: $(SRC_DIR)/%.c | $(OBJ_DIR_ARMHF) $(CC) $(CFLAGS) $(INCLUDES) -c -o $@ $< -$(SL_OBJ_DIR_ARMHF)/%.o: %.c | $(SL_OBJ_DIR_ARMHF) +$(SL_OBJ_DIR_ARMHF)/%.o: $(SRC_DIR)/%.c | $(SL_OBJ_DIR_ARMHF) $(CC) $(CFLAGS) $(INCLUDES) -c -o $@ $< -$(OBJ_DIR_ARM64)/%.o: %.c | $(OBJ_DIR_ARM64) +$(OBJ_DIR_ARM64)/%.o: $(SRC_DIR)/%.c | $(OBJ_DIR_ARM64) $(CC) $(CFLAGS) $(INCLUDES) -c -o $@ $< -$(SL_OBJ_DIR_ARM64)/%.o: %.c | $(SL_OBJ_DIR_ARM64) +$(SL_OBJ_DIR_ARM64)/%.o: $(SRC_DIR)/%.c | $(SL_OBJ_DIR_ARM64) $(CC) $(CFLAGS) $(INCLUDES) -c -o $@ $< -$(OBJ_DIR_AMD64)/%.o: %.c | $(OBJ_DIR_AMD64) +$(OBJ_DIR_AMD64)/%.o: $(SRC_DIR)/%.c | $(OBJ_DIR_AMD64) $(CC) $(CFLAGS) $(INCLUDES) -c -o $@ $< -$(SL_OBJ_DIR_AMD64)/%.o: %.c | $(SL_OBJ_DIR_AMD64) +$(SL_OBJ_DIR_AMD64)/%.o: $(SRC_DIR)/%.c | $(SL_OBJ_DIR_AMD64) $(CC) $(CFLAGS) $(INCLUDES) -c -o $@ $< # Rules to link diff --git a/allbutton.c b/allbutton.c new file mode 100644 index 00000000..5154aa9e --- /dev/null +++ b/allbutton.c @@ -0,0 +1,697 @@ +#define _GNU_SOURCE 1 // for strcasestr & strptime +#include +#include +#include + +#include "aqualink.h" +#include "allbutton.h" +#include "rs_msg_utils.h" +#include "devices_jandy.h" +#include "allbutton_aq_programmer.h" + +void processLEDstate(struct aqualinkdata *aq_data) +{ + + int i = 0; + int byte; + int bit; + + for (byte = 0; byte < 5; byte++) + { + for (bit = 0; bit < 8; bit += 2) + { + if (((aq_data->raw_status[byte] >> (bit + 1)) & 1) == 1) + aq_data->aqualinkleds[i].state = FLASH; + else if (((aq_data->raw_status[byte] >> bit) & 1) == 1) + aq_data->aqualinkleds[i].state = ON; + else + aq_data->aqualinkleds[i].state = OFF; + + //LOG(ALLB_LOG,LOG_DEBUG,"Led %d state %d",i+1,aq_data->aqualinkleds[i].state); + i++; + } + } + // Reset enabled state for heaters, as they take 2 led states + if (aq_data->aqualinkleds[POOL_HTR_LED_INDEX - 1].state == OFF && aq_data->aqualinkleds[POOL_HTR_LED_INDEX].state == ON) + aq_data->aqualinkleds[POOL_HTR_LED_INDEX - 1].state = ENABLE; + + if (aq_data->aqualinkleds[SPA_HTR_LED_INDEX - 1].state == OFF && aq_data->aqualinkleds[SPA_HTR_LED_INDEX].state == ON) + aq_data->aqualinkleds[SPA_HTR_LED_INDEX - 1].state = ENABLE; + + if (aq_data->aqualinkleds[SOLAR_HTR_LED_INDEX - 1].state == OFF && aq_data->aqualinkleds[SOLAR_HTR_LED_INDEX].state == ON) + aq_data->aqualinkleds[SOLAR_HTR_LED_INDEX - 1].state = ENABLE; + /* + for (i=0; i < TOTAL_BUTTONS; i++) { + LOG(ALLB_LOG,LOG_NOTICE, "%s = %d", aq_data->aqbuttons[i].name, aq_data->aqualinkleds[i].state); + } +*/ +} + +void setUnits(char *msg, struct aqualinkdata *aq_data) +{ + char buf[AQ_MSGLEN*3]; + + rsm_strncpy(buf, (unsigned char *)msg, AQ_MSGLEN*3, AQ_MSGLONGLEN); + + //ascii(buf, msg); + LOG(ALLB_LOG,LOG_DEBUG, "Getting temp units from message '%s', looking at '%c'\n", buf, buf[strlen(buf) - 1]); + + if (msg[strlen(msg) - 1] == 'F') + aq_data->temp_units = FAHRENHEIT; + else if (msg[strlen(msg) - 1] == 'C') + aq_data->temp_units = CELSIUS; + else + aq_data->temp_units = UNKNOWN; + + LOG(ALLB_LOG,LOG_INFO, "Temp Units set to %d (F=0, C=1, Unknown=2)\n", aq_data->temp_units); +} + +// Defined as int16_t so 16 bits to mask +#define MSG_FREEZE (1 << 0) // 1 +#define MSG_SERVICE (1 << 1) // 1 +#define MSG_SWG (1 << 2) +#define MSG_BOOST (1 << 3) +#define MSG_TIMEOUT (1 << 4) +#define MSG_RS13BUTTON (1 << 5) +#define MSG_RS14BUTTON (1 << 6) +#define MSG_RS15BUTTON (1 << 7) +#define MSG_RS16BUTTON (1 << 8) +#define MSG_BATTERY_LOW (1 << 9) +#define MSG_SWG_DEVICE (1 << 10) + +#ifdef AQ_RS16 +int16_t RS16_endswithLEDstate(char *msg, struct aqualinkdata *aq_data) +{ + char *sp; + int i; + aqledstate state = LED_S_UNKNOWN; + + //if (_aqconfig_.rs_panel_size < 16) + if (PANEL_SIZE() < 16) + return false; + + sp = strrchr(msg, ' '); + + if( sp == NULL ) + return false; + + if (strncasecmp(sp, " on", 3) == 0) + state = ON; + else if (strncasecmp(sp, " off", 4) == 0) + state = OFF; + else if (strncasecmp(sp, " enabled", 8) == 0) // Total guess, need to check + state = ENABLE; + else if (strncasecmp(sp, " no idea", 8) == 0) // need to figure out these states + state = FLASH; + + if (state == LED_S_UNKNOWN) + return false; + + // Only need to start at Aux B5->B8 (12-15) + // Loop over only aqdata->aqbuttons[13] to aqdata->aqbuttons[16] + for (i = aq_data->rs16_vbutton_start; i <= aq_data->rs16_vbutton_end; i++) { + //TOTAL_BUTTONS + if ( stristr(msg, aq_data->aqbuttons[i].label) != NULL) { + aq_data->aqbuttons[i].led->state = state; + LOG(ALLB_LOG,LOG_INFO, "Set %s to %d\n", aq_data->aqbuttons[i].label, aq_data->aqbuttons[i].led->state); + // Return true should be the result, but in the if we want to continue to display message + //return true; + if (i == 13) + return MSG_RS13BUTTON; + else if (i == 14) + return MSG_RS14BUTTON; + else if (i == 15) + return MSG_RS15BUTTON; + else if (i == 16) + return MSG_RS16BUTTON; + else + { + LOG(ALLB_LOG,LOG_ERR, "RS16 Button Set error %s to %d, %d is out of scope\n", aq_data->aqbuttons[i].label, aq_data->aqbuttons[i].led->state, i); + return false; + } + + } + } + + return false; +} +#endif + +void _processMessage(char *message, struct aqualinkdata *aq_data, bool reset); + +void processMessage(char *message, struct aqualinkdata *aq_data) +{ + _processMessage(message, aq_data, false); +} +void processMessageReset(struct aqualinkdata *aq_data) +{ + _processMessage(NULL, aq_data, true); +} +void _processMessage(char *message, struct aqualinkdata *aq_data, bool reset) +{ + char *msg; + static bool _initWithRS = false; + //static bool _gotREV = false; + //static int freeze_msg_count = 0; + //static int service_msg_count = 0; + //static int swg_msg_count = 0; + //static int boost_msg_count = 0; + static int16_t msg_loop = 0; + // NSF replace message with msg +#ifdef AQ_RS16 + int16_t rs16; +#endif + + //msg = stripwhitespace(message); + //strcpy(aq_data->last_message, msg); + //LOG(ALLB_LOG,LOG_INFO, "RS Message :- '%s'\n", msg); + + + + // Check long messages in this if/elseif block first, as some messages are similar. + // ie "POOL TEMP" and "POOL TEMP IS SET TO" so want correct match first. + // + + //if (stristr(msg, "JANDY AquaLinkRS") != NULL) { + if (!reset) { + msg = stripwhitespace(message); + strcpy(aq_data->last_message, msg); + LOG(ALLB_LOG,LOG_INFO, "RS Message :- '%s'\n", msg); + // Just set this to off, it will re-set since it'll be the only message we get if on + aq_data->service_mode_state = OFF; + } else { + //aq_data->display_message = NULL; + aq_data->last_display_message[0] = ' '; + aq_data->last_display_message[1] = '\0'; + + // Anything that wasn't on during the last set of messages, turn off + if ((msg_loop & MSG_FREEZE) != MSG_FREEZE) + aq_data->frz_protect_state = OFF; + + if ((msg_loop & MSG_SERVICE) != MSG_SERVICE && + (msg_loop & MSG_TIMEOUT) != MSG_TIMEOUT ) { + aq_data->service_mode_state = OFF; // IF we get this message then Service / Timeout is off + } + + if ( ((msg_loop & MSG_SWG_DEVICE) != MSG_SWG_DEVICE) && aq_data->swg_led_state != LED_S_UNKNOWN) { + // No Additional SWG devices messages like "no flow" + if ((msg_loop & MSG_SWG) != MSG_SWG && aq_data->aqbuttons[PUMP_INDEX].led->state == OFF ) + setSWGdeviceStatus(aq_data, ALLBUTTON, SWG_STATUS_OFF); + else + setSWGdeviceStatus(aq_data, ALLBUTTON, SWG_STATUS_ON); + } + + // If no AQUAPURE message, either (no SWG, it's set 0, or it's off). + if ((msg_loop & MSG_SWG) != MSG_SWG && aq_data->swg_led_state != LED_S_UNKNOWN ) { + if (aq_data->swg_percent != 0 || aq_data->swg_led_state == ON) { + // Something is wrong here. Let's check pump, if on set SWG to 0, if off turn SWE off + if ( aq_data->aqbuttons[PUMP_INDEX].led->state == OFF) { + LOG(ALLB_LOG,LOG_INFO, "No AQUAPURE message in cycle, pump is off so setting SWG to off\n"); + setSWGoff(aq_data); + } else { + LOG(ALLB_LOG,LOG_INFO, "No AQUAPURE message in cycle, pump is on so setting SWG to 0%%\n"); + changeSWGpercent(aq_data, 0); + } + } else if (isIAQT_ENABLED == false && isONET_ENABLED == false && READ_RSDEV_SWG == false ) { + //We have no other way to read SWG %=0, so turn SWG on with pump + if ( aq_data->aqbuttons[PUMP_INDEX].led->state == ON) { + LOG(ALLB_LOG,LOG_INFO, "No AQUAPURE message in cycle, pump is off so setting SWG to off\n"); + //changeSWGpercent(aq_data, 0); + setSWGenabled(aq_data); + } + } + // NSF Need something to catch startup when SWG=0 so we set it to enabeled. + // when other ways/protocols to detect SWG=0 are turned off. + } + /* + // AQUAPURE=0 we never get that message on ALLBUTTON so don't turn off unless filter pump if off + if ((msg_loop & MSG_SWG) != MSG_SWG && aq_data->aqbuttons[PUMP_INDEX].led->state == OFF ) { + //aq_data->ar_swg_status = SWG_STATUS_OFF; + setSWGoff(aq_data); + } + */ + if ((msg_loop & MSG_BOOST) != MSG_BOOST) { + aq_data->boost = false; + aq_data->boost_msg[0] = '\0'; + aq_data->boost_duration = 0; + //if (aq_data->swg_percent >= 101) + // aq_data->swg_percent = 0; + } + + if ((msg_loop & MSG_BATTERY_LOW) != MSG_BATTERY_LOW) + aq_data->battery = OK; + +#ifdef AQ_RS16 + //if ( _aqconfig_.rs_panel_size >= 16) { + //if ( (int)PANEL_SIZE >= 16) { // NSF No idea why this fails on RS-4, but it does. Come back and find out why + if ( PANEL_SIZE() >= 16 ) { + //printf("Panel size %d What the fuck am I doing here\n",PANEL_SIZE()); + if ((msg_loop & MSG_RS13BUTTON) != MSG_RS13BUTTON) + aq_data->aqbuttons[13].led->state = OFF; + if ((msg_loop & MSG_RS14BUTTON) != MSG_RS14BUTTON) + aq_data->aqbuttons[14].led->state = OFF; + if ((msg_loop & MSG_RS15BUTTON) != MSG_RS15BUTTON) + aq_data->aqbuttons[15].led->state = OFF; + if ((msg_loop & MSG_RS16BUTTON) != MSG_RS16BUTTON) + aq_data->aqbuttons[16].led->state = OFF; + } +#endif + msg_loop = 0; + return; + } + + if (stristr(msg, LNG_MSG_BATTERY_LOW) != NULL) + { + aq_data->battery = LOW; + msg_loop |= MSG_BATTERY_LOW; + strcpy(aq_data->last_display_message, msg); // Also display the message on web UI + } + else if (stristr(msg, LNG_MSG_POOL_TEMP_SET) != NULL) + { + //LOG(ALLB_LOG,LOG_DEBUG, "**************** pool htr long message: %s", &message[20]); + aq_data->pool_htr_set_point = atoi(message + 20); + + if (aq_data->temp_units == UNKNOWN) + setUnits(msg, aq_data); + } + else if (stristr(msg, LNG_MSG_SPA_TEMP_SET) != NULL) + { + //LOG(ALLB_LOG,LOG_DEBUG, "spa htr long message: %s", &message[19]); + aq_data->spa_htr_set_point = atoi(message + 19); + + if (aq_data->temp_units == UNKNOWN) + setUnits(msg, aq_data); + } + else if (stristr(msg, LNG_MSG_FREEZE_PROTECTION_SET) != NULL) + { + //LOG(ALLB_LOG,LOG_DEBUG, "frz protect long message: %s", &message[28]); + aq_data->frz_protect_set_point = atoi(message + 28); + aq_data->frz_protect_state = ENABLE; + + if (aq_data->temp_units == UNKNOWN) + setUnits(msg, aq_data); + } + else if (strncasecmp(msg, MSG_AIR_TEMP, MSG_AIR_TEMP_LEN) == 0) + { + aq_data->air_temp = atoi(msg + MSG_AIR_TEMP_LEN); + + if (aq_data->temp_units == UNKNOWN) + setUnits(msg, aq_data); + } + else if (strncasecmp(msg, MSG_POOL_TEMP, MSG_POOL_TEMP_LEN) == 0) + { + aq_data->pool_temp = atoi(msg + MSG_POOL_TEMP_LEN); + + if (aq_data->temp_units == UNKNOWN) + setUnits(msg, aq_data); + } + else if (strncasecmp(msg, MSG_SPA_TEMP, MSG_SPA_TEMP_LEN) == 0) + { + aq_data->spa_temp = atoi(msg + MSG_SPA_TEMP_LEN); + + if (aq_data->temp_units == UNKNOWN) + setUnits(msg, aq_data); + } + // NSF If get water temp rather than pool or spa in some cases, then we are in Pool OR Spa ONLY mode + else if (strncasecmp(msg, MSG_WATER_TEMP, MSG_WATER_TEMP_LEN) == 0) + { + aq_data->pool_temp = atoi(msg + MSG_WATER_TEMP_LEN); + aq_data->spa_temp = atoi(msg + MSG_WATER_TEMP_LEN); + if (aq_data->temp_units == UNKNOWN) + setUnits(msg, aq_data); + + if (isSINGLE_DEV_PANEL != true) + { + changePanelToMode_Only(); + LOG(ALLB_LOG,LOG_ERR, "AqualinkD set to 'Combo Pool & Spa' but detected 'Only Pool OR Spa' panel, please change config\n"); + } + } + else if (stristr(msg, LNG_MSG_WATER_TEMP1_SET) != NULL) + { + aq_data->pool_htr_set_point = atoi(message + 28); + + if (aq_data->temp_units == UNKNOWN) + setUnits(msg, aq_data); + + if (isSINGLE_DEV_PANEL != true) + { + changePanelToMode_Only(); + LOG(ALLB_LOG,LOG_ERR, "AqualinkD set to 'Combo Pool & Spa' but detected 'Only Pool OR Spa' panel, please change config\n"); + } + } + else if (stristr(msg, LNG_MSG_WATER_TEMP2_SET) != NULL) + { + aq_data->spa_htr_set_point = atoi(message + 27); + + if (aq_data->temp_units == UNKNOWN) + setUnits(msg, aq_data); + + if (isSINGLE_DEV_PANEL != true) + { + changePanelToMode_Only(); + LOG(ALLB_LOG,LOG_ERR, "AqualinkD set to 'Combo Pool & Spa' but detected 'Only Pool OR Spa' panel, please change config\n"); + } + } + else if (stristr(msg, LNG_MSG_SERVICE_ACTIVE) != NULL) + { + if (aq_data->service_mode_state == OFF) + LOG(ALLB_LOG,LOG_NOTICE, "AqualinkD set to Service Mode\n"); + aq_data->service_mode_state = ON; + msg_loop |= MSG_SERVICE; + //service_msg_count = 0; + } + else if (stristr(msg, LNG_MSG_TIMEOUT_ACTIVE) != NULL) + { + if (aq_data->service_mode_state == OFF) + LOG(ALLB_LOG,LOG_NOTICE, "AqualinkD set to Timeout Mode\n"); + aq_data->service_mode_state = FLASH; + msg_loop |= MSG_TIMEOUT; + //service_msg_count = 0; + } + else if (stristr(msg, LNG_MSG_FREEZE_PROTECTION_ACTIVATED) != NULL) + { + msg_loop |= MSG_FREEZE; + aq_data->frz_protect_state = ON; + //freeze_msg_count = 0; + strcpy(aq_data->last_display_message, msg); // Also display the message on web UI + } + /* // Not sure when to do with these for the moment, so no need to compile in the test. + else if (stristr(msg, LNG_MSG_CHEM_FEED_ON) != NULL) { + } + else if (stristr(msg, LNG_MSG_CHEM_FEED_OFF) != NULL) { + } + */ + else if (msg[2] == '/' && msg[5] == '/' && msg[8] == ' ') + { // date in format '08/29/16 MON' + strcpy(aq_data->date, msg); + } + else if (stristr(msg, MSG_SWG_PCT) != NULL) + { + if (strncasecmp(msg, MSG_SWG_PCT, MSG_SWG_PCT_LEN) == 0 && strncasecmp(msg, "AQUAPURE HRS", 12) != 0) { + changeSWGpercent(aq_data, atoi(msg + MSG_SWG_PCT_LEN)); + } + else if (strncasecmp(msg, "AQUAPURE HRS", 12) != 0 && strncasecmp(msg, "SET AQUAPURE", 12) != 0) + { + if (strcasestr(msg, MSG_SWG_NO_FLOW) != NULL) + setSWGdeviceStatus(aq_data, ALLBUTTON, SWG_STATUS_NO_FLOW); + else if (strcasestr(msg, MSG_SWG_LOW_SALT) != NULL) + setSWGdeviceStatus(aq_data, ALLBUTTON, SWG_STATUS_LOW_SALT); + else if (strcasestr(msg, MSG_SWG_HIGH_SALT) != NULL) + setSWGdeviceStatus(aq_data, ALLBUTTON, SWG_STATUS_HI_SALT); + else if (strcasestr(msg, MSG_SWG_FAULT) != NULL) + setSWGdeviceStatus(aq_data, ALLBUTTON, SWG_STATUS_GENFAULT); + //setSWGdeviceStatus(aq_data, ALLBUTTON, SWG_STATUS_CHECK_PCB); + + // Any of these messages want to display. + strcpy(aq_data->last_display_message, msg); + + msg_loop |= MSG_SWG_DEVICE; + } + msg_loop |= MSG_SWG; + } + else if (strncasecmp(msg, MSG_SWG_PPM, MSG_SWG_PPM_LEN) == 0) + { + aq_data->swg_ppm = atoi(msg + MSG_SWG_PPM_LEN); + msg_loop |= MSG_SWG; + } + else if ((msg[1] == ':' || msg[2] == ':') && msg[strlen(msg) - 1] == 'M') + { // time in format '9:45 AM' + strcpy(aq_data->time, msg); + // Setting time takes a long time, so don't try until we have all other programmed data. + if (_initWithRS == true && strlen(aq_data->date) > 1 && checkAqualinkTime() != true) + { + LOG(ALLB_LOG,LOG_NOTICE, "RS time is NOT accurate '%s %s', re-setting on controller!\n", aq_data->time, aq_data->date); + aq_programmer(AQ_SET_TIME, NULL, aq_data); + } + else if (_initWithRS == false || _aqconfig_.sync_panel_time == false) + { + LOG(ALLB_LOG,LOG_DEBUG, "RS time '%s %s' not checking\n", aq_data->time, aq_data->date); + } + else if (_initWithRS == true) + { + LOG(ALLB_LOG,LOG_DEBUG, "RS time is accurate '%s %s'\n", aq_data->time, aq_data->date); + } + // If we get a time message before REV, the controller didn't see us as we started too quickly. + /* Don't need to check this anymore with the check for probe before startup. + if (_gotREV == false) + { + LOG(ALLB_LOG,LOG_NOTICE, "Getting control panel information\n", msg); + aq_programmer(AQ_GET_DIAGNOSTICS_MODEL, NULL, aq_data); + _gotREV = true; // Force it to true just incase we don't understand the model# + } + */ + } + else if (strstr(msg, " REV ") != NULL || strstr(msg, " REV. ") != NULL) + { // '8157 REV MMM' + // A master firmware revision message. + strcpy(aq_data->version, msg); + rsm_get_revision(aq_data->revision, aq_data->version, strlen(aq_data->version)); + //_gotREV = true; + LOG(ALLB_LOG,LOG_NOTICE, "Control Panel version %s\n", aq_data->version); + LOG(ALLB_LOG,LOG_NOTICE, "Control Panel revision %s\n", aq_data->revision); + if (_initWithRS == false) + { + //LOG(ALLBUTTON,LOG_NOTICE, "Standard protocol initialization complete\n"); + queueGetProgramData(ALLBUTTON, aq_data); + //queueGetExtendedProgramData(ALLBUTTON, aq_data, _aqconfig_.use_panel_aux_labels); + _initWithRS = true; + } + } + else if (stristr(msg, " TURNS ON") != NULL) + { + LOG(ALLB_LOG,LOG_NOTICE, "Program data '%s'\n", msg); + } + else if (_aqconfig_.override_freeze_protect == TRUE && strncasecmp(msg, "Press Enter* to override Freeze Protection with", 47) == 0) + { + //send_cmd(KEY_ENTER, aq_data); + //aq_programmer(AQ_SEND_CMD, (char *)KEY_ENTER, aq_data); + aq_send_allb_cmd(KEY_ENTER); + } + // Process any button states (fake LED) for RS12 and above keypads + // Text will be button label on or off ie Aux_B2 off or WaterFall off + +#ifdef AQ_RS16 + //else if ( _aqconfig_.rs_panel_size >= 16 && (rs16 = RS16_endswithLEDstate(msg)) != 0 ) + else if (PANEL_SIZE() >= 16 && (rs16 = RS16_endswithLEDstate(msg, aq_data)) != 0 ) + { + msg_loop |= rs16; + // Do nothing, just stop other else if statments executing + // make sure we also display the message. + // Note we only get ON messages here, Off messages will not be sent if something else turned it off + // use the Onetouch or iAqua equiptment page for off. + strcpy(aq_data->last_display_message, msg); + } +#endif + else if (((msg[4] == ':') || (msg[6] == ':')) && (strncasecmp(msg, "AUX", 3) == 0) ) + { // Should probable check we are in programming mode. + // 'Aux3: No Label' + // 'Aux B1: No Label' + int labelid; + int ni = 3; + if (msg[4] == 'B') { ni = 5; } + labelid = atoi(msg + ni); + if (labelid > 0 && _aqconfig_.use_panel_aux_labels == true) + { + if (ni == 5) + labelid = labelid + 8; + else + labelid = labelid + 1; + // Aux1: on panel = Button 3 in aqualinkd (button 2 in array) + if (strncasecmp(msg+ni+3, "No Label", 8) != 0) { + aq_data->aqbuttons[labelid].label = prittyString(cleanalloc(msg+ni+2)); + LOG(ALLB_LOG,LOG_NOTICE, "AUX ID %s label set to '%s'\n", aq_data->aqbuttons[labelid].name, aq_data->aqbuttons[labelid].label); + } else { + LOG(ALLB_LOG,LOG_NOTICE, "AUX ID %s has no control panel label using '%s'\n", aq_data->aqbuttons[labelid].name, aq_data->aqbuttons[labelid].label); + } + //aq_data->aqbuttons[labelid + 1].label = cleanalloc(msg + 5); + } + } + // BOOST POOL 23:59 REMAINING + else if ( (strncasecmp(msg, "BOOST POOL", 10) == 0) && (strcasestr(msg, "REMAINING") != NULL) ) { + // Ignore messages if in programming mode. We get one of these turning off for some strange reason. + if (in_programming_mode(aq_data) == false) { + snprintf(aq_data->boost_msg, 6, "%s", &msg[11]); + aq_data->boost_duration = rsm_HHMM2min(aq_data->boost_msg); + aq_data->boost = true; + msg_loop |= MSG_BOOST; + msg_loop |= MSG_SWG; + //convert_boost_to_duration(aq_data->boost_msg) + //if (aq_data->ar_swg_status != SWG_STATUS_ON) {aq_data->ar_swg_status = SWG_STATUS_ON;} + if (aq_data->swg_percent != 101) {changeSWGpercent(aq_data, 101);} + //boost_msg_count = 0; + //if (aq_data->active_thread.thread_id == 0) + strcpy(aq_data->last_display_message, msg); // Also display the message on web UI if not in programming mode + } + } + else + { + LOG(ALLB_LOG,LOG_DEBUG_SERIAL, "Ignoring '%s'\n", msg); + //aq_data->display_message = msg; + //if (in_programming_mode(aq_data) == false && aq_data->simulate_panel == false && + if (in_programming_mode(aq_data) == false && + stristr(msg, "JANDY AquaLinkRS") == NULL && + //stristr(msg, "PUMP O") == NULL &&// Catch 'PUMP ON' and 'PUMP OFF' but not 'PUMP WILL TURN ON' + strncasecmp(msg, "PUMP O", 6) != 0 &&// Catch 'PUMP ON' and 'PUMP OFF' but not 'PUMP WILL TURN ON' + stristr(msg, "MAINTAIN") == NULL && // Catch 'MAINTAIN TEMP IS OFF' + stristr(msg, "0 PSI") == NULL /* // Catch some erronious message on test harness + stristr(msg, "CLEANER O") == NULL && + stristr(msg, "SPA O") == NULL && + stristr(msg, "AUX") == NULL*/ + ) + { // Catch all AUX1 AUX5 messages + //aq_data->display_last_message = true; + strcpy(aq_data->last_display_message, msg); + //rsm_strncpy(aq_data->last_display_message, (unsigned char *)msg, AQ_MSGLONGLEN, AQ_MSGLONGLEN); + } + } + + // Send every message if we are in simulate panel mode + //if (aq_data->simulate_panel) + // strcpy(aq_data->last_display_message, msg); + //rsm_strncpy(aq_data->last_display_message, (unsigned char *)msg, AQ_MSGLONGLEN, AQ_MSGLONGLEN); + //ascii(aq_data->last_display_message, msg); + + + //LOG(ALLB_LOG,LOG_INFO, "RS Message loop :- '%d'\n", msg_loop); + + // We processed the next message, kick any threads waiting on the message. +//printf ("Message kicking\n"); + + + kick_aq_program_thread(aq_data, ALLBUTTON); +} + +bool process_allbutton_packet(unsigned char *packet, int length, struct aqualinkdata *aq_data) +{ + bool rtn = false; + //static unsigned char last_packet[AQ_MAXPKTLEN]; + static unsigned char last_checksum; + static char message[AQ_MSGLONGLEN + 1]; + static int processing_long_msg = 0; + + // Check packet against last check if different. + // Should only use the checksum, not whole packet since it's status messages. + /* + if ( packet[PKT_CMD] == CMD_STATUS && (memcmp(packet, last_packet, length) == 0)) + { + LOG(ALLB_LOG,LOG_DEBUG_SERIAL, "RS Received duplicate, ignoring.\n", length); + return rtn; + } + else + { + memcpy(last_packet, packet, length); + aq_data->last_packet_type = packet[PKT_CMD]; + rtn = true; + } + */ + + aq_data->last_packet_type = packet[PKT_CMD]; + + + if ( packet[PKT_CMD] == CMD_STATUS && packet[length-3] == last_checksum && ! in_programming_mode(aq_data) ) + { + LOG(ALLB_LOG,LOG_DEBUG_SERIAL, "RS Received duplicate, ignoring.\n", length); + return false; + } + else + { + last_checksum = packet[length-3]; + rtn = true; + } + + if (processing_long_msg > 0 && packet[PKT_CMD] != CMD_MSG_LONG) + { + processing_long_msg = 0; + //LOG(ALLB_LOG,LOG_ERR, "RS failed to receive complete long message, received '%s'\n",message); + //LOG(ALLB_LOG,LOG_DEBUG, "RS didn't finished receiving of MSG_LONG '%s'\n",message); + processMessage(message, aq_data); + } + + LOG(ALLB_LOG,LOG_DEBUG_SERIAL, "RS Received packet type 0x%02hhx length %d.\n", packet[PKT_CMD], length); + + switch (packet[PKT_CMD]) + { + case CMD_ACK: + //LOG(ALLB_LOG,LOG_DEBUG_SERIAL, "RS Received ACK length %d.\n", length); + break; + case CMD_STATUS: + //LOG(ALLB_LOG,LOG_DEBUG_SERIAL, "RS Received STATUS length %d.\n", length); + memcpy(aq_data->raw_status, packet + 4, AQ_PSTLEN); + processLEDstate(aq_data); + if (aq_data->aqbuttons[PUMP_INDEX].led->state == OFF) + { + aq_data->pool_temp = TEMP_UNKNOWN; + aq_data->spa_temp = TEMP_UNKNOWN; + //aq_data->spa_temp = _aqconfig_.report_zero_spa_temp?-18:TEMP_UNKNOWN; + } + else if (aq_data->aqbuttons[SPA_INDEX].led->state == OFF && isSINGLE_DEV_PANEL != true) + { + //aq_data->spa_temp = _aqconfig_.report_zero_spa_temp?-18:TEMP_UNKNOWN; + aq_data->spa_temp = TEMP_UNKNOWN; + } + else if (aq_data->aqbuttons[SPA_INDEX].led->state == ON && isSINGLE_DEV_PANEL != true) + { + aq_data->pool_temp = TEMP_UNKNOWN; + } + + // COLOR MODE programming relies on state changes, so let any threads know + //if (aq_data->active_thread.ptype == AQ_SET_LIGHTPROGRAM_MODE) { + if ( in_light_programming_mode(aq_data) ) { + kick_aq_program_thread(aq_data, ALLBUTTON); + } + break; + case CMD_MSG: + case CMD_MSG_LONG: + { + int index = packet[PKT_DATA]; // Will get 0x00 for complete message, 0x01 for start on long message 0x05 last of long message + //printf("RSM received message at index %d '%.*s'\n",index,AQ_MSGLEN,(char *)packet + PKT_DATA + 1); + if (index <= 1){ + memset(message, 0, AQ_MSGLONGLEN + 1); + //strncpy(message, (char *)packet + PKT_DATA + 1, AQ_MSGLEN); + rsm_strncpy(message, packet + PKT_DATA + 1, AQ_MSGLONGLEN, AQ_MSGLEN); + processing_long_msg = index; + //LOG(ALLB_LOG,LOG_ERR, "Message %s\n",message); + } else { + //strncpy(&message[(processing_long_msg * AQ_MSGLEN)], (char *)packet + PKT_DATA + 1, AQ_MSGLEN); + //rsm_strncpy(&message[(processing_long_msg * AQ_MSGLEN)], (unsigned char *)packet + PKT_DATA + 1, AQ_MSGLONGLEN, AQ_MSGLEN); + rsm_strncpy(&message[( (index-1) * AQ_MSGLEN)], (unsigned char *)packet + PKT_DATA + 1, AQ_MSGLONGLEN, AQ_MSGLEN); + //LOG(ALLB_LOG,LOG_ERR, "Long Message %s\n",message); + if (++processing_long_msg != index) { + LOG(ALLB_LOG,LOG_DEBUG, "Long message index %d doesn't match buffer %d\n",index,processing_long_msg); + //printf("RSM Long message index %d doesn't match buffer %d\n",index,processing_long_msg); + } + #ifdef PROCESS_INCOMPLETE_MESSAGES + kick_aq_program_thread(aq_data, ALLBUTTON); + #endif + } + + if (index == 0 || index == 5) { + //printf("RSM process message '%s'\n",message); + + // MOVED FROM LINE 701 see if less errors + //kick_aq_program_thread(aq_data, ALLBUTTON); + + LOG(ALLB_LOG,LOG_DEBUG, "Processing Message - '%s'\n",message); + processMessage(message, aq_data); // This will kick thread + } + + } + break; + case CMD_PROBE: + LOG(ALLB_LOG,LOG_DEBUG, "RS Received PROBE length %d.\n", length); + //LOG(ALLB_LOG,LOG_INFO, "Synch'ing with Aqualink master device...\n"); + rtn = false; + break; + case CMD_MSG_LOOP_ST: + LOG(ALLB_LOG,LOG_INFO, "RS Received message loop start\n"); + processMessageReset(aq_data); + rtn = false; + break; + default: + LOG(ALLB_LOG,LOG_INFO, "RS Received unknown packet, 0x%02hhx\n", packet[PKT_CMD]); + rtn = false; + break; + } + + return rtn; +} \ No newline at end of file diff --git a/allbutton.h b/allbutton.h new file mode 100644 index 00000000..ed01660c --- /dev/null +++ b/allbutton.h @@ -0,0 +1,8 @@ +#ifndef ALLBUTTON_H_ +#define ALLBUTTON_H_ + + + +bool process_allbutton_packet(unsigned char *packet, int length, struct aqualinkdata *aq_data); + +#endif //ALLBUTTON_H_ \ No newline at end of file diff --git a/allbutton_aq_programmer.c b/allbutton_aq_programmer.c new file mode 100644 index 00000000..8d47bdba --- /dev/null +++ b/allbutton_aq_programmer.c @@ -0,0 +1,1359 @@ +#include +#include +#include +#include +#include +#include + +#include "aqualink.h" +#include "allbutton_aq_programmer.h" +#include "utils.h" +#include "aq_programmer.h" +#include "aq_serial.h" +#include "color_lights.h" +#include "devices_jandy.h" + +bool waitForButtonState(struct aqualinkdata *aq_data, aqkey* button, aqledstate state, int numMessageReceived); +bool waitForMessage(struct aqualinkdata *aq_data, char* message, int numMessageReceived); +bool waitForEitherMessage(struct aqualinkdata *aq_data, char* message1, char* message2, int numMessageReceived); + +bool select_sub_menu_item(struct aqualinkdata *aq_data, char* item_string); +bool select_menu_item(struct aqualinkdata *aq_data, char* item_string); + +void send_cmd(unsigned char cmd); +void cancel_menu(); + +void waitfor_queue2empty(); +void longwaitfor_queue2empty(); + +int _expectNextMessage = 0; +unsigned char _allb_last_sent_command = NUL; + +#define MAX_STACK 20 +int _allb_stack_place = 0; +unsigned char _allb_commands[MAX_STACK]; +//unsigned char pgm_allb_commands[MAX_STACK]; +unsigned char _allb_pgm_command = NUL; +//unsigned char _ot_allb_pgm_command = NUL; + +bool _last_sent_was_cmd = false; + +bool push_allb_cmd(unsigned char cmd); + +// External view of adding to queue +//void aq_send_cmd(unsigned char cmd) { +void aq_send_allb_cmd(unsigned char cmd) { + push_allb_cmd(cmd); +} + +bool push_allb_cmd(unsigned char cmd) { + + //LOG(ALLB_LOG, LOG_NOTICE, "push_aq_cmd '0x%02hhx'\n", cmd); + + if (_allb_stack_place < MAX_STACK) { + _allb_commands[_allb_stack_place] = cmd; + _allb_stack_place++; + } else { + LOG(ALLB_LOG, LOG_ERR, "Command queue overflow, too many unsent commands to RS control panel\n"); + return false; + } + + return true; +} + +int get_allb_queue_length() +{ + return _allb_stack_place; +} + + + +unsigned char pop_allb_cmd(struct aqualinkdata *aq_data) +{ + unsigned char cmd = NUL; + + if ( _expectNextMessage > 0 && + (aq_data->last_packet_type == CMD_MSG || aq_data->last_packet_type == CMD_MSG_LONG || aq_data->last_packet_type == CMD_MSG_LOOP_ST)) + { + _expectNextMessage=0; + } else if (_expectNextMessage > 3) { + // NSF Should probably check this is a status command AND we are in programming mode. + LOG(ALLB_LOG, LOG_ERR, "Did not receive expected reply from last RS SEND command, resending '0x%02hhx'\n", _allb_last_sent_command); + _expectNextMessage=0; + return _allb_last_sent_command; + } else if (_expectNextMessage > 0) { + _expectNextMessage++; + } + + // Only send commands on status messages and is we are not in programming mode. + // In programming move, we don't use the queue. + // Are we in programming mode and it's not ONETOUCH programming mode + if (in_programming_mode(aq_data) && ( in_ot_programming_mode(aq_data) == false && in_iaqt_programming_mode(aq_data) == false )) { + //if (aq_data->active_thread.thread_id != 0) { + if ( _allb_pgm_command != NUL && aq_data->last_packet_type == CMD_STATUS) { + cmd = _allb_pgm_command; + _allb_pgm_command = NUL; + LOG(ALLB_LOG, LOG_DEBUG_SERIAL, "RS SEND cmd '0x%02hhx' (programming)\n", cmd); + } else if (_allb_pgm_command != NUL) { + LOG(ALLB_LOG, LOG_DEBUG_SERIAL, "RS Waiting to send cmd '0x%02hhx' (programming)\n", _allb_pgm_command); + } else { + LOG(ALLB_LOG, LOG_DEBUG_SERIAL, "RS SEND cmd '0x%02hhx' empty queue (programming)\n", cmd); + } + } else if (_allb_stack_place > 0 && aq_data->last_packet_type == CMD_STATUS ) { + cmd = _allb_commands[0]; + _allb_stack_place--; + LOG(ALLB_LOG, LOG_DEBUG_SERIAL, "RS SEND cmd '0x%02hhx'\n", cmd); + //LOG(ALLB_LOG, LOG_NOTICE, "pop_cmd '0x%02hhx'\n", cmd); + memmove(&_allb_commands[0], &_allb_commands[1], sizeof(unsigned char) * _allb_stack_place ) ; + } else { + LOG(ALLB_LOG, LOG_DEBUG_SERIAL, "RS SEND cmd '0x%02hhx'\n", cmd); + } + +//printf("RSM sending cmd '0x%02hhx' in reply to '0x%02hhx'\n",cmd,aq_data->last_packet_type); + + if (cmd == KEY_ENTER || cmd == KEY_RIGHT || cmd == KEY_LEFT || cmd == KEY_MENU ) { //KEY_CANCEL KEY_HOLD KEY_OVERRIDE + _expectNextMessage=1; + _allb_last_sent_command = cmd; + } + + return cmd; +} + + + +bool setAqualinkNumericField_new(struct aqualinkdata *aq_data, char *value_label, int value, int increment); +bool setAqualinkNumericField(struct aqualinkdata *aq_data, char *value_label, int value) +{ + return setAqualinkNumericField_new(aq_data, value_label, value, 1); +} +bool setAqualinkNumericField_new(struct aqualinkdata *aq_data, char *value_label, int value, int increment) +{ + LOG(ALLB_LOG, LOG_DEBUG,"Setting menu item '%s' to %d\n",value_label, value); + //char leading[10]; // description of the field (POOL, SPA, FRZ) + int current_val=-1; // integer value of the current set point + //char trailing[10]; // the degrees and scale + char searchBuf[20]; + + sprintf(searchBuf, "^%s", value_label); + int val_len = strlen(value_label); + int i=0; + do + { + if (waitForMessage(aq_data, searchBuf, 4) != true) { + LOG(ALLB_LOG, LOG_WARNING, "AQ_Programmer Could not set numeric input '%s', not found\n",value_label); + cancel_menu(); + return false; + } +//LOG(ALLB_LOG, LOG_DEBUG,"WAITING for kick value=%d\n",current_val); + //sscanf(aq_data->last_message, "%s %d%s", leading, ¤t_val, trailing); + //sscanf(aq_data->last_message, "%*[^0123456789]%d", ¤t_val); + sscanf(&aq_data->last_message[val_len], "%*[^0123456789]%d", ¤t_val); + LOG(ALLB_LOG, LOG_DEBUG, "%s set to %d, looking for %d\n",value_label,current_val,value); + + if(value > current_val) { + // Increment the field. + sprintf(searchBuf, "%s %d", value_label, current_val+increment); + send_cmd(KEY_RIGHT); + } + else if(value < current_val) { + // Decrement the field. + sprintf(searchBuf, "%s %d", value_label, current_val-increment); + send_cmd(KEY_LEFT); + } + else { + // Just send ENTER. We are at the right value. + sprintf(searchBuf, "%s %d", value_label, current_val); + send_cmd(KEY_ENTER); + } + + if (i++ >= 100) { + LOG(ALLB_LOG, LOG_WARNING, "AQ_Programmer Could not set numeric input '%s', to '%d'\n",value_label,value); + send_cmd(KEY_ENTER); + break; + } + } while(value != current_val); + + return true; +} + + + +bool OLD_setAqualinkNumericField_OLD(struct aqualinkdata *aq_data, char *value_label, int value) +{ // Works for everything but not SWG + LOG(ALLB_LOG, LOG_DEBUG,"Setting menu item '%s' to %d\n",value_label, value); + char leading[10]; // description of the field (POOL, SPA, FRZ) + int current_val; // integer value of the current set point + char trailing[10]; // the degrees and scale + char searchBuf[20]; + + sprintf(searchBuf, "^%s", value_label); + + do + { + if (waitForMessage(aq_data, searchBuf, 3) != true) { + LOG(ALLB_LOG, LOG_WARNING, "AQ_Programmer Could not set numeric input '%s', not found\n",value_label); + cancel_menu(); + return false; + } +//LOG(ALLB_LOG, LOG_DEBUG,"WAITING for kick value=%d\n",current_val); + sscanf(aq_data->last_message, "%s %d%s", leading, ¤t_val, trailing); + LOG(ALLB_LOG, LOG_DEBUG, "%s set to %d, looking for %d\n",value_label,current_val,value); + + if(value > current_val) { + // Increment the field. + sprintf(searchBuf, "%s %d", value_label, current_val+1); + send_cmd(KEY_RIGHT); + } + else if(value < current_val) { + // Decrement the field. + sprintf(searchBuf, "%s %d", value_label, current_val-1); + send_cmd(KEY_LEFT); + } + else { + // Just send ENTER. We are at the right value. + sprintf(searchBuf, "%s %d", value_label, current_val); + send_cmd(KEY_ENTER); + } + } while(value != current_val); + + return true; +} +/* +void *threadded_send_cmd( void *ptr ) +{ + struct programmingThreadCtrl *threadCtrl; + threadCtrl = (struct programmingThreadCtrl *) ptr; + struct aqualinkdata *aq_data = threadCtrl->aq_data; + + waitForSingleThreadOrTerminate(threadCtrl, AQ_SEND_CMD); + + send_cmd( (unsigned char)*threadCtrl->thread_args, aq_data); + + cleanAndTerminateThread(threadCtrl); + + return ptr; +} +*/ + +void *set_allbutton_boost( void *ptr ) +{ + struct programmingThreadCtrl *threadCtrl; + threadCtrl = (struct programmingThreadCtrl *) ptr; + struct aqualinkdata *aq_data = threadCtrl->aq_data; + + waitForSingleThreadOrTerminate(threadCtrl, AQ_SET_BOOST); + /* + menu + +BOOST POOL + +PRESS ENTER* TO START BOOST POOL + + + + +BOOST POOL 23:59 REMAINING + + +menu + +BOOST POOL + +STOP BOOST POOL + + */ + int val = atoi((char*)threadCtrl->thread_args); + + LOG(ALLB_LOG, LOG_DEBUG, "programming BOOST to %s\n", val==true?"On":"Off"); + + if ( select_menu_item(aq_data, "BOOST POOL") != true ) { + LOG(ALLB_LOG, LOG_WARNING, "Could not select BOOST POOL menu\n"); + cancel_menu(); + cleanAndTerminateThread(threadCtrl); + return ptr; + } + + if (val==true) { + waitForMessage(threadCtrl->aq_data, "TO START BOOST POOL", 5); + send_cmd(KEY_ENTER); + longwaitfor_queue2empty(); + } else { + int wait_messages = 5; + int i=0; + while( i++ < wait_messages) + { + waitForMessage(aq_data, "STOP BOOST POOL", 1); + if (stristr(aq_data->last_message, "STOP BOOST POOL") != NULL) { + // This is a really bad hack, message sequence is out for boost for some reason, so as soon as we see stop message, force enter key. + //_allb_pgm_command = KEY_ENTER; + send_cmd(KEY_ENTER); + LOG(ALLB_LOG, LOG_DEBUG, "**** FOUND STOP BOOST POOL ****\n"); + //waitfor_queue2empty(); + break; + } else { + LOG(ALLB_LOG, LOG_DEBUG, "Find item in Menu: loop %d of %d looking for 'STOP BOOST POOL' received message '%s'\n",i,wait_messages,aq_data->last_message); + delay(200); + if (stristr(aq_data->last_message, "STOP BOOST POOL") != NULL) { + //_allb_pgm_command = KEY_ENTER; + send_cmd(KEY_ENTER); + LOG(ALLB_LOG, LOG_DEBUG, "**** FOUND STOP BOOST POOL ****\n"); + break; + } + send_cmd(KEY_RIGHT); + //printf("WAIT\n"); + longwaitfor_queue2empty(); + //printf("FINISHED WAIT\n"); + } + //waitfor_queue2empty(); + //waitForMessage(aq_data, NULL, 1); + } + if (i < wait_messages) { + // Takes ages to see bost is off from menu, to set it here. + setSWGboost(aq_data, false); + } + /* + // Extra message overcome. + send_cmd(KEY_RIGHT); + waitfor_queue2empty(); + if ( select_sub_menu_item(aq_data, "STOP BOOST POOL") != true ) { + LOG(ALLB_LOG, LOG_WARNING, "Could not select STOP BOOST POOL menu\n"); + cancel_menu(); + cleanAndTerminateThread(threadCtrl); + return ptr; + }*/ + //send_cmd(KEY_ENTER); + } + + waitForMessage(aq_data,NULL, 1); + + cleanAndTerminateThread(threadCtrl); + + // just stop compiler error, ptr is not valid as it's just been freed + return ptr; +} + + +void *set_allbutton_SWG( void *ptr ) +{ + struct programmingThreadCtrl *threadCtrl; + threadCtrl = (struct programmingThreadCtrl *) ptr; + struct aqualinkdata *aq_data = threadCtrl->aq_data; + + waitForSingleThreadOrTerminate(threadCtrl, AQ_SET_SWG_PERCENT); + + int val = atoi((char*)threadCtrl->thread_args); + val = setpoint_check(SWG_SETPOINT, val, aq_data); + + //LOG(ALLB_LOG, LOG_NOTICE, "programming SWG percent to %d\n", val); + + if ( select_menu_item(aq_data, "SET AQUAPURE") != true ) { + LOG(ALLB_LOG, LOG_WARNING, "Could not select SET AQUAPURE menu\n"); + LOG(ALLB_LOG, LOG_ERR, "%s failed\n", ptypeName( aq_data->active_thread.ptype ) ); + cancel_menu(); + cleanAndTerminateThread(threadCtrl); + return ptr; + } + + // If spa is on, set SWG for spa, if not set SWG for pool + if (aq_data->aqbuttons[SPA_INDEX].led->state != OFF) { + if (select_sub_menu_item(aq_data, "SET SPA SP") != true) { + LOG(ALLB_LOG, LOG_WARNING, "Could not select SWG setpoint menu for SPA\n"); + LOG(ALLB_LOG, LOG_ERR, "%s failed\n", ptypeName( aq_data->active_thread.ptype ) ); + cancel_menu(); + cleanAndTerminateThread(threadCtrl); + return ptr; + } + setAqualinkNumericField_new(aq_data, "SPA SP", val, 5); + } else { + if (select_sub_menu_item(aq_data, "SET POOL SP") != true) { + LOG(ALLB_LOG, LOG_WARNING, "Could not select SWG setpoint menu\n"); + LOG(ALLB_LOG, LOG_ERR, "%s failed\n", ptypeName( aq_data->active_thread.ptype ) ); + cancel_menu(); + cleanAndTerminateThread(threadCtrl); + return ptr; + } + setAqualinkNumericField_new(aq_data, "POOL SP", val, 5); + } + + // Let everyone know we set SWG, if it failed we will update on next message, unless it's 0. + setSWGpercent(aq_data, val); // Don't use chageSWGpercent as we are in programming mode. + +/* + if (select_sub_menu_item(aq_data, "SET POOL SP") != true) { + LOG(ALLB_LOG, LOG_WARNING, "Could not select SWG setpoint menu\n"); + cancel_menu(aq_data); + cleanAndTerminateThread(threadCtrl); + return ptr; + } + + setAqualinkNumericField_new(aq_data, "POOL SP", val, 5); +*/ + // usually miss this message, not sure why, but wait anyway to make sure programming has ended + // NSF have see the below message RS Message :- + // 'Pool set to 20%' + // 'POOL SP IS SET TO 20%' + waitForMessage(threadCtrl->aq_data, "SET TO", 1); + //waitForMessage(threadCtrl->aq_data, "POOL SP IS SET TO", 1); + + // Since we read % directly from RS message, wait for another few messages that way + // We won't registed a SWG bounce, since we already told clients SWG was at new % before programming started + waitForMessage(threadCtrl->aq_data, NULL, 1); + + cleanAndTerminateThread(threadCtrl); + + // just stop compiler error, ptr is not valid as it's just been freed + return ptr; +} + + + +void *get_allbutton_aux_labels( void *ptr ) +{ + struct programmingThreadCtrl *threadCtrl; + threadCtrl = (struct programmingThreadCtrl *) ptr; + struct aqualinkdata *aq_data = threadCtrl->aq_data; + + waitForSingleThreadOrTerminate(threadCtrl, AQ_GET_AUX_LABELS); + + if ( select_menu_item(aq_data, "REVIEW") != true ) { + LOG(ALLB_LOG, LOG_WARNING, "Could not select REVIEW menu\n"); + LOG(ALLB_LOG, LOG_ERR, "%s failed\n", ptypeName( aq_data->active_thread.ptype ) ); + cancel_menu(); + cleanAndTerminateThread(threadCtrl); + return ptr; + } + + if (select_sub_menu_item(aq_data, "AUX LABELS") != true) { + LOG(ALLB_LOG, LOG_WARNING, "Could not select AUX LABELS menu\n"); + LOG(ALLB_LOG, LOG_ERR, "%s failed\n", ptypeName( aq_data->active_thread.ptype ) ); + cancel_menu(); + cleanAndTerminateThread(threadCtrl); + return ptr; + } + + waitForMessage(aq_data, NULL, 5); // Receive 5 messages + + cleanAndTerminateThread(threadCtrl); + + // just stop compiler error, ptr is not valid as it's just been freed + return ptr; +} + +void *set_allbutton_light_colormode( void *ptr ) +{ + int i; + struct programmingThreadCtrl *threadCtrl; + threadCtrl = (struct programmingThreadCtrl *) ptr; + struct aqualinkdata *aq_data = threadCtrl->aq_data; + + waitForSingleThreadOrTerminate(threadCtrl, AQ_SET_LIGHTCOLOR_MODE); + + char *buf = (char*)threadCtrl->thread_args; + const char *mode_name; + int val = atoi(&buf[0]); + int btn = atoi(&buf[5]); + int typ = atoi(&buf[10]); + bool use_current_mode = false; + + if (btn < 0 || btn >= aq_data->total_buttons ) { + LOG(ALLB_LOG, LOG_ERR, "Can't program light mode on button %d\n", btn); + cleanAndTerminateThread(threadCtrl); + return ptr; + } + + aqkey *button = &aq_data->aqbuttons[btn]; + unsigned char code = button->code; + + //LOG(ALLB_LOG, LOG_NOTICE, "Light Programming #: %d, on button: %s, color light type: %d\n", val, button->label, typ); + + if (val <= 0) { + use_current_mode = true; + LOG(ALLB_LOG, LOG_INFO, "Light Programming #: %d, on button: %s, color light type: %d, using current mode\n", val, button->label, typ); + } else { + mode_name = light_mode_name(typ, val-1, ALLBUTTON); + use_current_mode = false; + if (mode_name == NULL) { + LOG(ALLB_LOG, LOG_ERR, "Light Programming #: %d, on button: %s, color light type: %d, couldn't find mode name '%s'\n", val, button->label, typ, mode_name); + cleanAndTerminateThread(threadCtrl); + return ptr; + } else { + LOG(ALLB_LOG, LOG_INFO, "Light Programming #: %d, on button: %s, color light type: %d, name '%s'\n", val, button->label, typ, mode_name); + } + } +/* + // Simply turn the light off if value is 0 + if (val <= 0) { + if ( button->led->state == ON ) { + send_cmd(code); + } + cleanAndTerminateThread(threadCtrl); + return ptr; + } +*/ + // Needs to start programming sequence with light off + if ( button->led->state == ON ) { + LOG(ALLB_LOG, LOG_INFO, "Light Programming Initial state on, turning off\n"); + send_cmd(code); + waitfor_queue2empty(); + if ( !waitForMessage(threadCtrl->aq_data, "OFF", 5)) // Message like 'Aux3 Off' + LOG(ALLB_LOG, LOG_ERR, "Light Programming didn't receive OFF message\n"); + } + + // Now turn on and wait for the message "color mode name<>*" + send_cmd(code); + waitfor_queue2empty(); + i=0; + int waitCounter=12; + + do{ + LOG(ALLB_LOG, LOG_INFO,"Light program wait for message\n"); + if ( !waitForMessage(threadCtrl->aq_data, "~*", waitCounter)) + LOG(ALLB_LOG, LOG_ERR, "Light Programming didn't receive color light mode message\n"); + + // Wait for less messages after first try. We get a lot of repeat messages before the one we need. + waitCounter = 3; + + if (use_current_mode) { + LOG(ALLB_LOG, LOG_INFO, "Light Programming using color mode %s\n",aq_data->last_message); + send_cmd(KEY_ENTER); + waitfor_queue2empty(); + break; + } else if (strncasecmp(aq_data->last_message, mode_name, strlen(mode_name)) == 0) { + LOG(ALLB_LOG, LOG_INFO, "Light Programming found color mode %s\n",mode_name); + send_cmd(KEY_ENTER); + waitfor_queue2empty(); + break; + } + + send_cmd(KEY_RIGHT); + waitfor_queue2empty(); + // Just clear current message before waiting for next, since the test in the do can't distinguish + // as both messages end in "~*" + waitForMessage(threadCtrl->aq_data, NULL, 1); + + i++; + } while (i <= LIGHT_COLOR_OPTIONS); + + if (i == LIGHT_COLOR_OPTIONS) { + LOG(ALLB_LOG, LOG_ERR, "Light Programming didn't receive color light mode message for '%s'\n",use_current_mode?"light program":mode_name); + } + + cleanAndTerminateThread(threadCtrl); + + // just stop compiler error, ptr is not valid as it's just been freed + return ptr; +} + + +void *set_allbutton_light_programmode( void *ptr ) +{ + int i; + struct programmingThreadCtrl *threadCtrl; + threadCtrl = (struct programmingThreadCtrl *) ptr; + struct aqualinkdata *aq_data = threadCtrl->aq_data; + + waitForSingleThreadOrTerminate(threadCtrl, AQ_SET_LIGHTPROGRAM_MODE); + + char *buf = (char*)threadCtrl->thread_args; + int val = atoi(&buf[0]); + int btn = atoi(&buf[5]); + int iOn = atoi(&buf[10]); + int iOff = atoi(&buf[15]); + float pmode = atof(&buf[20]); + + if (btn < 0 || btn >= aq_data->total_buttons ) { + LOG(ALLB_LOG, LOG_ERR, "Can't program light mode on button %d\n", btn); + cleanAndTerminateThread(threadCtrl); + return ptr; + } + + aqkey *button = &aq_data->aqbuttons[btn]; + unsigned char code = button->code; + + LOG(ALLB_LOG, LOG_INFO, "Light Programming #: %d, on button: %s, with pause mode: %f (initial on=%d, initial off=%d)\n", val, button->label, pmode, iOn, iOff); + + // Simply turn the light off if value is 0 + if (val <= 0) { + if ( button->led->state == ON ) { + send_cmd(code); + } + cleanAndTerminateThread(threadCtrl); + return ptr; + } + + const int seconds = 1000; + // Needs to start programming sequence with light on, if off we need to turn on for 15 seconds + // before we can send the next off. + if ( button->led->state != ON ) { + LOG(ALLB_LOG, LOG_INFO, "Light Programming Initial state off, turning on for %d seconds\n",iOn); + send_cmd(code); + delay(iOn * seconds); + } + + LOG(ALLB_LOG, LOG_INFO, "Light Programming turn off for %d seconds\n",iOff); + // Now need to turn off for between 11 and 14 seconds to reset light. + send_cmd(code); + delay(iOff * seconds); + + // Now light is reset, pulse the appropiate number of times to advance program. + LOG(ALLB_LOG, LOG_INFO, "Light Programming button pulsing on/off %d times\n", val); + + // Program light in safe mode (slowley), or quick mode + if (pmode > 0) { + for (i = 1; i < (val * 2); i++) { + LOG(ALLB_LOG, LOG_INFO, "Light Programming button press number %d - %s of %d\n", i, i % 2 == 0 ? "Off" : "On", val); + send_cmd(code); + waitfor_queue2empty(); + delay(pmode * seconds); // 0.3 works, but using 0.4 to be safe + } + } else { + for (i = 1; i < val; i++) { + const int dt = 0.5; // Time to wait after receiving conformation of light on/off + LOG(ALLB_LOG, LOG_INFO, "Light Programming button press number %d - %s of %d\n", i, "ON", val); + send_cmd(code); + waitForButtonState(aq_data, button, ON, 2); + delay(dt * seconds); + LOG(ALLB_LOG, LOG_INFO, "Light Programming button press number %d - %s of %d\n", i, "OFF", val); + send_cmd(code); + waitForButtonState(aq_data, button, OFF, 2); + delay(dt * seconds); + } + LOG(ALLB_LOG, LOG_INFO, "Finished - Light Programming button press number %d - %s of %d\n", i, "ON", val); + send_cmd(code); + waitfor_queue2empty(); + } + //waitForButtonState(aq_data, &aq_data->aqbuttons[btn], ON, 2); + + cleanAndTerminateThread(threadCtrl); + + // just stop compiler error, ptr is not valid as it's just been freed + return ptr; +} +void *set_allbutton_pool_heater_temps( void *ptr ) +{ + struct programmingThreadCtrl *threadCtrl; + threadCtrl = (struct programmingThreadCtrl *) ptr; + struct aqualinkdata *aq_data = threadCtrl->aq_data; + char *name; + char *menu_name; + waitForSingleThreadOrTerminate(threadCtrl, AQ_SET_POOL_HEATER_TEMP); + + int val = atoi((char*)threadCtrl->thread_args); + /* + if (val > HEATER_MAX) { + val = HEATER_MAX; + } else if ( val < MEATER_MIN) { + val = MEATER_MIN; + } + */ + val = setpoint_check(POOL_HTR_SETOINT, val, aq_data); + + // NSF IF in TEMP1 / TEMP2 mode, we need C range of 1 to 40 is 2 to 40 for TEMP1, 1 to 39 TEMP2 + if (isSINGLE_DEV_PANEL){ + name = "TEMP1"; + menu_name = "SET TEMP1"; + } else { + name = "POOL"; + menu_name = "SET POOL TEMP"; + } + + LOG(ALLB_LOG, LOG_DEBUG, "Setting pool heater setpoint to %d\n", val); + //setAqualinkTemp(aq_data, "SET TEMP", "SET POOL TEMP", NULL, "POOL", val); + + if ( select_menu_item(aq_data, "SET TEMP") != true ) { + LOG(ALLB_LOG, LOG_WARNING, "Could not select SET TEMP menu\n"); + LOG(ALLB_LOG, LOG_ERR, "%s failed\n", ptypeName( aq_data->active_thread.ptype ) ); + cancel_menu(); + cleanAndTerminateThread(threadCtrl); + return ptr; + } + + //if (select_sub_menu_item(aq_data, "SET POOL TEMP") != true) { + if (select_sub_menu_item(aq_data, menu_name) != true) { + LOG(ALLB_LOG, LOG_WARNING, "Could not select SET POOL TEMP menu\n"); + LOG(ALLB_LOG, LOG_ERR, "%s failed\n", ptypeName( aq_data->active_thread.ptype ) ); + cancel_menu(); + cleanAndTerminateThread(threadCtrl); + return ptr; + } + + if (isSINGLE_DEV_PANEL){ + // Need to get pass this message 'TEMP1 MUST BE SET HIGHER THAN TEMP2' + // and get this message 'TEMP1 20�C ~*' + // Before going to numeric field. + waitForMessage(threadCtrl->aq_data, "MUST BE SET", 5); + send_cmd(KEY_LEFT); + while (stristr(aq_data->last_message, "MUST BE SET") != NULL) { + delay(500); + } + } + + //setAqualinkNumericField(aq_data, "POOL", val); + setAqualinkNumericField(aq_data, name, val); + + // usually miss this message, not sure why, but wait anyway to make sure programming has ended + waitForMessage(threadCtrl->aq_data, "POOL TEMP IS SET TO", 1); + cleanAndTerminateThread(threadCtrl); + + // just stop compiler error, ptr is not valid as it's just been freed + return ptr; +} +void *set_allbutton_spa_heater_temps( void *ptr ) +{ + struct programmingThreadCtrl *threadCtrl; + threadCtrl = (struct programmingThreadCtrl *) ptr; + struct aqualinkdata *aq_data = threadCtrl->aq_data; + + waitForSingleThreadOrTerminate(threadCtrl, AQ_SET_SPA_HEATER_TEMP); + + int val = atoi((char*)threadCtrl->thread_args); + char *name; + char *menu_name; + /* + if (val > HEATER_MAX) { + val = HEATER_MAX; + } else if ( val < MEATER_MIN) { + val = MEATER_MIN; + }*/ + val = setpoint_check(SPA_HTR_SETOINT, val, aq_data); + + // NSF IF in TEMP1 / TEMP2 mode, we need C range of 1 to 40 is 2 to 40 for TEMP1, 1 to 39 TEMP2 + + if (isSINGLE_DEV_PANEL){ + name = "TEMP2"; + menu_name = "SET TEMP2"; + } else { + name = "SPA"; + menu_name = "SET SPA TEMP"; + } + + LOG(ALLB_LOG, LOG_DEBUG, "Setting spa heater setpoint to %d\n", val); + + //setAqualinkTemp(aq_data, "SET TEMP", "SET SPA TEMP", NULL, "SPA", val); + if ( select_menu_item(aq_data, "SET TEMP") != true ) { + LOG(ALLB_LOG, LOG_WARNING, "Could not select SET TEMP menu\n"); + LOG(ALLB_LOG, LOG_ERR, "%s failed\n", ptypeName( aq_data->active_thread.ptype ) ); + cancel_menu(); + cleanAndTerminateThread(threadCtrl); + return ptr; + } + + //if (select_sub_menu_item(aq_data, "SET SPA TEMP") != true) { + if (select_sub_menu_item(aq_data, menu_name) != true) { + LOG(ALLB_LOG, LOG_WARNING, "Could not select SET SPA TEMP menu\n"); + LOG(ALLB_LOG, LOG_ERR, "%s failed\n", ptypeName( aq_data->active_thread.ptype ) ); + cancel_menu(); + cleanAndTerminateThread(threadCtrl); + return ptr; + } + + if (isSINGLE_DEV_PANEL){ + // Need to get pass this message 'TEMP2 MUST BE SET LOWER THAN TEMP1' + // and get this message 'TEMP2 20�C ~*' + // Before going to numeric field. + waitForMessage(threadCtrl->aq_data, "MUST BE SET", 5); + send_cmd(KEY_LEFT); + while (stristr(aq_data->last_message, "MUST BE SET") != NULL) { + delay(500); + } + } + + //setAqualinkNumericField(aq_data, "SPA", val); + setAqualinkNumericField(aq_data, name, val); + + // usually miss this message, not sure why, but wait anyway to make sure programming has ended + waitForMessage(threadCtrl->aq_data, "SPA TEMP IS SET TO", 1); + cleanAndTerminateThread(threadCtrl); + + // just stop compiler error, ptr is not valid as it's just been freed + return ptr; +} + +void *set_allbutton_freeze_heater_temps( void *ptr ) +{ + struct programmingThreadCtrl *threadCtrl; + threadCtrl = (struct programmingThreadCtrl *) ptr; + struct aqualinkdata *aq_data = threadCtrl->aq_data; + + waitForSingleThreadOrTerminate(threadCtrl, AQ_SET_FRZ_PROTECTION_TEMP); + + int val = atoi((char*)threadCtrl->thread_args); + /* + if (val > FREEZE_PT_MAX) { + val = FREEZE_PT_MAX; + } else if ( val < FREEZE_PT_MIN) { + val = FREEZE_PT_MIN; + } + */ + val = setpoint_check(FREEZE_SETPOINT, val, aq_data); + + LOG(ALLB_LOG, LOG_DEBUG, "Setting sfreeze protection to %d\n", val); + + //setAqualinkTemp(aq_data, "SYSTEM SETUP", "FRZ PROTECT", "TEMP SETTING", "FRZ", val); + if ( select_menu_item(aq_data, "SYSTEM SETUP") != true ) { + LOG(ALLB_LOG, LOG_WARNING, "Could not select SYSTEM SETUP menu\n"); + LOG(ALLB_LOG, LOG_ERR, "%s failed\n", ptypeName( aq_data->active_thread.ptype ) ); + cancel_menu(); + cleanAndTerminateThread(threadCtrl); + return ptr; + } + + if (select_sub_menu_item(aq_data, "FRZ PROTECT") != true) { + LOG(ALLB_LOG, LOG_WARNING, "Could not select FRZ PROTECT menu\n"); + LOG(ALLB_LOG, LOG_ERR, "%s failed\n", ptypeName( aq_data->active_thread.ptype ) ); + cancel_menu(); + cleanAndTerminateThread(threadCtrl); + return ptr; + } + + if (select_sub_menu_item(aq_data, "TEMP SETTING") != true) { + LOG(ALLB_LOG, LOG_WARNING, "Could not select TEMP SETTING menu\n"); + LOG(ALLB_LOG, LOG_ERR, "%s failed\n", ptypeName( aq_data->active_thread.ptype ) ); + cancel_menu(); + cleanAndTerminateThread(threadCtrl); + return ptr; + } + + setAqualinkNumericField(aq_data, "FRZ", val); + + waitForMessage(threadCtrl->aq_data, "FREEZE PROTECTION IS SET TO", 3); + cleanAndTerminateThread(threadCtrl); + + // just stop compiler error, ptr is not valid as it's just been freed + return ptr; +} + +void *set_allbutton_time( void *ptr ) +{ + struct programmingThreadCtrl *threadCtrl; + threadCtrl = (struct programmingThreadCtrl *) ptr; + struct aqualinkdata *aq_data = threadCtrl->aq_data; + + waitForSingleThreadOrTerminate(threadCtrl, AQ_SET_TIME); + //LOG(ALLB_LOG, LOG_NOTICE, "Setting time on aqualink\n"); + + time_t now = time(0); // get time now + struct tm *result = localtime(&now); + char hour[20]; + + // Add 10 seconds to time since this can take a while to program. + // 10 to 20 seconds whould be right, but since there are no seconds we can set, add 30 seconds to get close to minute. + // Should probably set this to program the next minute then wait before hitting the final enter command. + result->tm_sec += 30; + mktime(result); + + if (result->tm_hour == 0) + sprintf(hour, "HOUR 12 AM"); + else if (result->tm_hour <= 11) + sprintf(hour, "HOUR %d AM", result->tm_hour); // Need to fix compiler warning on new GCC, but %2d or %.2d does NOT give correct string + else if (result->tm_hour == 12) + sprintf(hour, "HOUR 12 PM"); + else // Must be 13 or more + sprintf(hour, "HOUR %d PM", result->tm_hour - 12); + + + LOG(ALLB_LOG, LOG_DEBUG, "Setting time to %d/%d/%d %d:%d\n", result->tm_mon + 1, result->tm_mday, result->tm_year + 1900, result->tm_hour + 1, result->tm_min); + + if ( select_menu_item(aq_data, "SET TIME") != true ) { + LOG(ALLB_LOG, LOG_WARNING, "Could not select SET TIME menu\n"); + LOG(ALLB_LOG, LOG_ERR, "%s failed\n", ptypeName( aq_data->active_thread.ptype ) ); + cancel_menu(); + cleanAndTerminateThread(threadCtrl); + return ptr; + } + + setAqualinkNumericField(aq_data, "YEAR", result->tm_year + 1900); + setAqualinkNumericField(aq_data, "MONTH", result->tm_mon + 1); + setAqualinkNumericField(aq_data, "DAY", result->tm_mday); + //setAqualinkNumericFieldExtra(aq_data, "HOUR", 11, "PM"); + select_sub_menu_item(aq_data, hour); // This will keep looping until it finds the right message + setAqualinkNumericField(aq_data, "MINUTE", result->tm_min); + + send_cmd(KEY_ENTER); + + cleanAndTerminateThread(threadCtrl); + + // just stop compiler error, ptr is not valid as it's just been freed + return ptr; +} + +void *get_allbutton_diag_model( void *ptr ) +{ + struct programmingThreadCtrl *threadCtrl; + threadCtrl = (struct programmingThreadCtrl *) ptr; + struct aqualinkdata *aq_data = threadCtrl->aq_data; + + waitForSingleThreadOrTerminate(threadCtrl, AQ_GET_DIAGNOSTICS_MODEL); + + if ( select_menu_item(aq_data, "SYSTEM SETUP") != true ) { + LOG(ALLB_LOG, LOG_WARNING, "Could not select HELP menu\n"); + LOG(ALLB_LOG, LOG_ERR, "%s failed\n", ptypeName( aq_data->active_thread.ptype ) ); + cancel_menu(); + cleanAndTerminateThread(threadCtrl); + return ptr; + } + + if (select_sub_menu_item(aq_data, "DIAGNOSTICS") != true) { + LOG(ALLB_LOG, LOG_WARNING, "Could not select DIAGNOSTICS menu\n"); + LOG(ALLB_LOG, LOG_ERR, "%s failed\n", ptypeName( aq_data->active_thread.ptype ) ); + cancel_menu(); + cleanAndTerminateThread(threadCtrl); + return ptr; + } + + waitForMessage(aq_data, NULL, 8); // Receive 8 messages + //8157 REV MMM | BATTERY OK | Cal: -27 0 6 | CONTROL PANEL #1 | CONTROL PANEL #3 | WATER SENSOR OK | AIR SENSOR OK | SOLAR SENSOR OPENED + cleanAndTerminateThread(threadCtrl); + + // just stop compiler error, ptr is not valid as it's just been freed + return ptr; +} + +void *get_allbutton_pool_spa_heater_temps( void *ptr ) +{ +//LOG(ALLB_LOG, LOG_DEBUG, "Could not select TEMP SET menu\n"); + struct programmingThreadCtrl *threadCtrl; + threadCtrl = (struct programmingThreadCtrl *) ptr; + struct aqualinkdata *aq_data = threadCtrl->aq_data; + + waitForSingleThreadOrTerminate(threadCtrl, AQ_GET_POOL_SPA_HEATER_TEMPS); + //LOG(ALLB_LOG, LOG_NOTICE, "Getting pool & spa heat setpoints from aqualink\n"); + + if ( select_menu_item(aq_data, "REVIEW") != true ) { + LOG(ALLB_LOG, LOG_WARNING, "Could not select REVIEW menu\n"); + LOG(ALLB_LOG, LOG_ERR, "Can't get heater setpoints from Control Panel\n"); + cancel_menu(); + cleanAndTerminateThread(threadCtrl); + return ptr; + } + + if (select_sub_menu_item(aq_data, "TEMP SET") != true) { + LOG(ALLB_LOG, LOG_WARNING, "Could not select TEMP SET menu\n"); + LOG(ALLB_LOG, LOG_ERR, "Can't get heater setpoints from Control Panel\n"); + cancel_menu(); + cleanAndTerminateThread(threadCtrl); + return ptr; + } + + // Should receive 'POOL TEMP IS SET TO xx' then 'SPA TEMP IS SET TO xx' then 'MAINTAIN TEMP IS (OFF|ON)' + // wait for the last message + waitForMessage(threadCtrl->aq_data, "MAINTAIN TEMP IS", 5); + + //cancel_menu(threadCtrl->aq_data); + cleanAndTerminateThread(threadCtrl); + + // just stop compiler error, ptr is not valid as it's just been freed + return ptr; +} + +void *get_allbutton_freeze_protect_temp( void *ptr ) +{ + struct programmingThreadCtrl *threadCtrl; + threadCtrl = (struct programmingThreadCtrl *) ptr; + struct aqualinkdata *aq_data = threadCtrl->aq_data; + + waitForSingleThreadOrTerminate(threadCtrl, AQ_GET_FREEZE_PROTECT_TEMP); + //LOG(ALLB_LOG, LOG_NOTICE, "Getting freeze protection setpoints\n"); + + if ( select_menu_item(aq_data, "REVIEW") != true ) { + LOG(ALLB_LOG, LOG_WARNING, "Could not select REVIEW menu\n"); + LOG(ALLB_LOG, LOG_ERR, "Can't get freeze setpoints from Control Panel\n"); + cancel_menu(); + cleanAndTerminateThread(threadCtrl); + return ptr; + } + + if (select_sub_menu_item(aq_data, "FRZ PROTECT") != true) { + LOG(ALLB_LOG, LOG_WARNING, "Could not select FRZ PROTECT menu\n"); + LOG(ALLB_LOG, LOG_ERR, "Can't get freeze setpoints from Control Panel\n"); + cancel_menu(); + cleanAndTerminateThread(threadCtrl); + return ptr; + } + + waitForMessage(aq_data, "FREEZE PROTECTION IS SET TO", 6); // Changed from 3 to wait for multiple items to be listed + //cancel_menu(aq_data); + cleanAndTerminateThread(threadCtrl); + + // just stop compiler error, ptr is not valid as it's just been freed + return ptr; +} + +bool get_aqualink_program_for_button(struct aqualinkdata *aq_data, unsigned char cmd) +{ + int rtnStringsWait = 7; + + if (! waitForMessage(aq_data, "SELECT DEVICE TO REVIEW or PRESS ENTER TO END", rtnStringsWait)) + return false; + + LOG(ALLB_LOG, LOG_DEBUG, "Send key '%d'\n",cmd); + send_cmd(cmd); + return waitForEitherMessage(aq_data, "NOT SET", "TURNS ON", rtnStringsWait); +} + +void *get_allbutton_programs( void *ptr ) +{ + struct programmingThreadCtrl *threadCtrl; + threadCtrl = (struct programmingThreadCtrl *) ptr; + struct aqualinkdata *aq_data = threadCtrl->aq_data; + char keys[10] = {KEY_PUMP, KEY_SPA, KEY_AUX1, KEY_AUX2, KEY_AUX3, KEY_AUX4, KEY_AUX5}; // KEY_AUX6 & KEY_AUX7 kill programming mode + + waitForSingleThreadOrTerminate(threadCtrl, AQ_GET_PROGRAMS); + + if ( select_menu_item(aq_data, "REVIEW") != true ) { + //LOG(ALLB_LOG, LOG_WARNING, "Could not select REVIEW menu\n"); + cancel_menu(); + cleanAndTerminateThread(threadCtrl); + return ptr; + } + + if (select_sub_menu_item(aq_data, "PROGRAMS") != true) { + //LOG(ALLB_LOG, LOG_WARNING, "Could not select PROGRAMS menu\n"); + cancel_menu(); + cleanAndTerminateThread(threadCtrl); + return ptr; + } + + unsigned int i; + + for (i=0; i < strlen(keys); i++) { + //LOG(ALLB_LOG, LOG_DEBUG, "**** START program for key in loop %d\n",i); + if (! get_aqualink_program_for_button(aq_data, keys[i])) { + //LOG(ALLB_LOG, LOG_DEBUG, "**** Didn't find program for key in loop %d\n",i); + //cancel_menu(aq_data); + cleanAndTerminateThread(threadCtrl); + return ptr; + } + //LOG(ALLB_LOG, LOG_DEBUG, "**** Found program for key in loop %d\n",i); + } + + + if (waitForMessage(aq_data, "SELECT DEVICE TO REVIEW or PRESS ENTER TO END", 6)) { + //LOG(ALLB_LOG, LOG_DEBUG, "Send key ENTER\n"); + send_cmd(KEY_ENTER); + } else { + //LOG(ALLB_LOG, LOG_DEBUG, "Send CANCEL\n"); + cancel_menu(); + } + + //cancel_menu(aq_data); + cleanAndTerminateThread(threadCtrl); + + // just stop compiler error, ptr is not valid as it's just been freed + return ptr; +} + +/* +void send_cmd(unsigned char cmd, struct aqualinkdata *aq_data) +{ + push_aq_cmd(cmd); + LOG(ALLB_LOG, LOG_INFO, "Queue send '0x%02hhx' to controller\n", cmd); +} +*/ + + + +void _waitfor_queue2empty(bool longwait) +{ + int i=0; + + if (_allb_pgm_command != NUL) { + LOG(ALLB_LOG, LOG_DEBUG, "Waiting for queue to empty\n"); + } else { + LOG(ALLB_LOG, LOG_DEBUG, "Queue empty!\n"); + return; + } + + while ( (_allb_pgm_command != NUL) && ( i++ < (PROGRAMMING_POLL_COUNTER*(longwait?2:1) ) ) ) { + delay(PROGRAMMING_POLL_DELAY_TIME); + } + + if (_allb_pgm_command != NUL) { + LOG(ALLB_LOG, LOG_WARNING, "Send command Queue did not empty, timeout\n"); + } else { + LOG(ALLB_LOG, LOG_DEBUG, "Queue now empty!\n"); + } + +} + +void waitfor_queue2empty() +{ + _waitfor_queue2empty(false); +} +void longwaitfor_queue2empty() +{ + _waitfor_queue2empty(true); +} + +void send_cmd(unsigned char cmd) +{ + waitfor_queue2empty(); + + _allb_pgm_command = cmd; + //delay(200); + + LOG(ALLB_LOG, LOG_INFO, "Queue send '0x%02hhx' to controller (programming)\n", _allb_pgm_command); +} +void force_queue_delete() +{ + if (_allb_pgm_command != NUL) + LOG(ALLB_LOG, LOG_INFO, "Really bad coding, don't use this in release\n"); + + _allb_pgm_command = NUL; +} + + +void cancel_menu() +{ + send_cmd(KEY_CANCEL); +} + +/* +* added functionality, if start of string is ^ use that as must start with in comparison +*/ + +bool waitForEitherMessage(struct aqualinkdata *aq_data, char* message1, char* message2, int numMessageReceived) +{ + //LOG(ALLB_LOG, LOG_DEBUG, "waitForMessage %s %d %d\n",message,numMessageReceived,cmd); + waitfor_queue2empty(); // MAke sure the last command was sent + int i=0; + pthread_mutex_lock(&aq_data->active_thread.thread_mutex); + char* msgS1 = ""; + char* msgS2 = ""; + char* ptr = NULL; + + + if (message1 != NULL) { + if (message1[0] == '^') + msgS1 = &message1[1]; + else + msgS1 = message1; + } + if (message2 != NULL) { + if (message2[0] == '^') + msgS2 = &message2[1]; + else + msgS2 = message2; + } + + while( ++i <= numMessageReceived) + { + LOG(ALLB_LOG, LOG_DEBUG, "loop %d of %d looking for '%s' OR '%s' received message1 '%s'\n",i,numMessageReceived,message1,message2,aq_data->last_message); + + if (message1 != NULL) { + ptr = stristr(aq_data->last_message, msgS1); + if (ptr != NULL) { // match + LOG(ALLB_LOG, LOG_DEBUG, "String MATCH '%s'\n", msgS1); + if (msgS1 == message1) // match & don't care if first char + break; + else if (ptr == aq_data->last_message) // match & do care if first char + break; + } + } + if (message2 != NULL) { + ptr = stristr(aq_data->last_message, msgS2); + if (ptr != NULL) { // match + LOG(ALLB_LOG, LOG_DEBUG, "String MATCH '%s'\n", msgS2); + if (msgS2 == message2) // match & don't care if first char + break; + else if (ptr == aq_data->last_message) // match & do care if first char + break; + } + } + + //LOG(ALLB_LOG, LOG_DEBUG, "looking for '%s' received message1 '%s'\n",message1,aq_data->last_message); + pthread_cond_wait(&aq_data->active_thread.thread_cond, &aq_data->active_thread.thread_mutex); + //LOG(ALLB_LOG, LOG_DEBUG, "loop %d of %d looking for '%s' received message1 '%s'\n",i,numMessageReceived,message1,aq_data->last_message); + } + + pthread_mutex_unlock(&aq_data->active_thread.thread_mutex); + + if (message1 != NULL && message2 != NULL && ptr == NULL) { + //logmessage1(LOG_ERR, "Could not select MENU of Aqualink control panel\n"); + LOG(ALLB_LOG, LOG_ERR, "Did not find '%s'\n",message1); + return false; + } + LOG(ALLB_LOG, LOG_DEBUG, "Found message1 '%s' or '%s' in '%s'\n",message1,message2,aq_data->last_message); + + return true; +} + + + +bool waitForMessage(struct aqualinkdata *aq_data, char* message, int numMessageReceived) +{ + LOG(ALLB_LOG, LOG_DEBUG, "waitForMessage %s %d\n",message,numMessageReceived); + // NSF Need to come back to this, as it stops on test enviornment but not real panel, so must be speed related. + //waitfor_queue2empty(); // MAke sure the last command was sent + + int i=0; + pthread_mutex_lock(&aq_data->active_thread.thread_mutex); + char* msgS; + char* ptr = NULL; + + if (message != NULL) { + if (message[0] == '^') + msgS = &message[1]; + else + msgS = message; + } + + while( ++i <= numMessageReceived) + { + if (message != NULL) + LOG(ALLB_LOG, LOG_DEBUG, "loop %d of %d looking for '%s', last message received '%s'\n",i,numMessageReceived,message,aq_data->last_message); + else + LOG(ALLB_LOG, LOG_DEBUG, "loop %d of %d waiting for next message, last message received '%s'\n",i,numMessageReceived,aq_data->last_message); + + if (message != NULL) { + ptr = stristr(aq_data->last_message, msgS); + if (ptr != NULL) { // match + LOG(ALLB_LOG, LOG_DEBUG, "String MATCH\n"); + if (msgS == message) // match & don't care if first char + break; + else if (ptr == aq_data->last_message) // match & do care if first char + break; + } + } + + //LOG(ALLB_LOG, LOG_DEBUG, "looking for '%s' received message '%s'\n",message,aq_data->last_message); + //LOG(ALLB_LOG, LOG_DEBUG, "*** pthread_cond_wait() sleep\n"); + pthread_cond_wait(&aq_data->active_thread.thread_cond, &aq_data->active_thread.thread_mutex); + //LOG(ALLB_LOG, LOG_DEBUG, "*** pthread_cond_wait() wake\n"); + //LOG(ALLB_LOG, LOG_DEBUG, "loop %d of %d looking for '%s' received message '%s'\n",i,numMessageReceived,message,aq_data->last_message); + } + + pthread_mutex_unlock(&aq_data->active_thread.thread_mutex); + + if (message != NULL && ptr == NULL) { + //LOG(ALLB_LOG, LOG_ERR, "Could not select MENU of Aqualink control panel\n"); + LOG(ALLB_LOG, LOG_DEBUG, "did not find '%s'\n",message); + return false; + } else if (message != NULL) + LOG(ALLB_LOG, LOG_DEBUG, "found message '%s' in '%s'\n",message,aq_data->last_message); + else + LOG(ALLB_LOG, LOG_DEBUG, "waited for %d message(s)\n",numMessageReceived); + + return true; +} + +bool select_menu_item(struct aqualinkdata *aq_data, char* item_string) +{ + char* expectedMsg = "PRESS ENTER* TO SELECT"; + //char* expectedMsg = "PROGRAM"; + int wait_messages = 5; + bool found = false; + int tries = 0; + // Select the MENU and wait to get the RS8 respond. + + while (found == false && tries <= 3) { + send_cmd(KEY_MENU); + found = waitForMessage(aq_data, expectedMsg, wait_messages); + tries++; + } + + if (found == false) + return false; + + // NSF This isn't needed and seems to cause issue on some controllers. + //send_cmd(KEY_ENTER, aq_data); + //waitForMessage(aq_data, NULL, 1); + + return select_sub_menu_item(aq_data, item_string); +} +/* +bool select_menu_item(struct aqualinkdata *aq_data, char* item_string) +{ + char* expectedMsg = "PRESS ENTER* TO SELECT"; + int wait_messages = 6; + //int i=0; + + // Select the MENU and wait to get the RS8 respond. + send_cmd(KEY_MENU, aq_data); + + if (waitForMessage(aq_data, expectedMsg, wait_messages) == false) + return false; + + send_cmd(KEY_ENTER, aq_data); + waitForMessage(aq_data, NULL, 1); + + // Blindly wait for next message + //sendCmdWaitForReturn(aq_data, KEY_ENTER); + // Can't determin the first response + //delay(500); + + return select_sub_menu_item(aq_data, item_string); +} +*/ + +//bool select_sub_menu_item(char* item_string, struct aqualinkdata *aq_data) +bool select_sub_menu_item(struct aqualinkdata *aq_data, char* item_string) +{ + int wait_messages = 28; + int i=0; + + waitfor_queue2empty(); + + while( (stristr(aq_data->last_message, item_string) == NULL) && ( i++ < wait_messages) ) + { + LOG(ALLB_LOG, LOG_DEBUG, "Find item in Menu: loop %d of %d looking for '%s' received message '%s'\n",i,wait_messages,item_string,aq_data->last_message); + send_cmd(KEY_RIGHT); + waitfor_queue2empty(); // ADDED BACK MAY 2023 setting time warked better + //waitForMessage(aq_data, NULL, 1); + waitForMessage(aq_data, item_string, 1); + } + + if (stristr(aq_data->last_message, item_string) == NULL) { + LOG(ALLB_LOG, LOG_ERR, "Could not find menu item '%s'\n",item_string); + return false; + } + + LOG(ALLB_LOG, LOG_DEBUG, "Find item in Menu: loop %d of %d FOUND menu item '%s', sending ENTER command\n",i,wait_messages, item_string); + // Enter the mode specified by the argument. + + + send_cmd(KEY_ENTER); + + + waitForMessage(aq_data, NULL, 1); + + + //sendCmdWaitForReturn(aq_data, KEY_ENTER); + + return true; + +} + +// NSF Need to test this, then use it for the color change mode. + +bool waitForButtonState(struct aqualinkdata *aq_data, aqkey* button, aqledstate state, int numMessageReceived) +{ + //LOG(ALLB_LOG, LOG_DEBUG, "waitForMessage %s %d %d\n",message,numMessageReceived,cmd); + int i=0; + pthread_mutex_lock(&aq_data->active_thread.thread_mutex); + + while( ++i <= numMessageReceived) + { + LOG(ALLB_LOG, LOG_DEBUG, "loop %d of %d looking for state change to '%d' for '%s' \n",i,numMessageReceived,button->led->state,button->name); + + if (button->led->state == state) { + LOG(ALLB_LOG, LOG_INFO, "Button State =%d for %s\n",state,button->name); + break; + } + + //LOG(ALLB_LOG, LOG_DEBUG, "looking for '%s' received message '%s'\n",message,aq_data->last_message); + pthread_cond_wait(&aq_data->active_thread.thread_cond, &aq_data->active_thread.thread_mutex); + //LOG(ALLB_LOG, LOG_DEBUG, "loop %d of %d looking for '%s' received message '%s'\n",i,numMessageReceived,message,aq_data->last_message); + } + + pthread_mutex_unlock(&aq_data->active_thread.thread_mutex); + + if (numMessageReceived >= i) { + //LOG(ALLB_LOG, LOG_ERR, "Could not select MENU of Aqualink control panel\n"); + LOG(ALLB_LOG, LOG_DEBUG, "did not find state '%d' for '%s'\n",button->led->state,button->name); + return false; + } + LOG(ALLB_LOG, LOG_DEBUG, "found state '%d' for '%s'\n",button->led->state,button->name); + + return true; +} \ No newline at end of file diff --git a/allbutton_aq_programmer.h b/allbutton_aq_programmer.h new file mode 100644 index 00000000..e41f5f24 --- /dev/null +++ b/allbutton_aq_programmer.h @@ -0,0 +1,26 @@ +#ifndef ALLBUTTON_PROGRAMMER_H_ +#define ALLBUTTON_PROGRAMMER_H_ + + +void *set_allbutton_pool_heater_temps( void *ptr ); +void *set_allbutton_spa_heater_temps( void *ptr ); +void *set_allbutton_freeze_heater_temps( void *ptr ); +void *set_allbutton_time( void *ptr ); +void *get_allbutton_pool_spa_heater_temps( void *ptr ); +void *get_allbutton_programs( void *ptr ); +void *get_allbutton_freeze_protect_temp( void *ptr ); +void *get_allbutton_diag_model( void *ptr ); +void *get_allbutton_aux_labels( void *ptr ); +//void *threadded_send_cmd( void *ptr ); +void *set_allbutton_light_programmode( void *ptr ); +void *set_allbutton_light_colormode( void *ptr ); +void *set_allbutton_SWG( void *ptr ); +void *set_allbutton_boost( void *ptr ); + +unsigned char pop_allb_cmd(struct aqualinkdata *aq_data); + + + +void aq_send_allb_cmd(unsigned char cmd); + +#endif //ALLBUTTON_PROGRAMMER_H_ \ No newline at end of file diff --git a/aq_panel.c b/aq_panel.c index 011bc9e0..6a2154a5 100644 --- a/aq_panel.c +++ b/aq_panel.c @@ -23,6 +23,7 @@ #include "aq_panel.h" #include "serialadapter.h" #include "aq_timer.h" +#include "allbutton_aq_programmer.h" void initPanelButtons(struct aqualinkdata *aqdata, bool rspda, int size, bool combo, bool dual); void programDeviceLightMode(struct aqualinkdata *aqdata, int value, int button); @@ -627,20 +628,22 @@ bool setDeviceState(struct aqualinkdata *aqdata, int deviceIndex, bool isON, req // since allbutton (default) is stateless, and rssaadapter is statefull, use rssaadapter for any domoricz requests set_aqualink_rssadapter_aux_state(deviceIndex, isON); } else { - aq_send_cmd(button->code); + aq_send_allb_cmd(button->code); } // Pre set device to state, next status will correct if state didn't take, but this will stop multiple ON messages setting on/off -#ifdef PRESTATE_ONOFF - if ((button->code == KEY_POOL_HTR || button->code == KEY_SPA_HTR || - button->code == KEY_SOLAR_HTR) && - isON > 0) { - button->led->state = ENABLE; // if heater and set to on, set pre-status to enable. +//#ifdef PRESTATE_ONOFF + if (_aqconfig_.device_pre_state) { + if ((button->code == KEY_POOL_HTR || button->code == KEY_SPA_HTR || + button->code == KEY_SOLAR_HTR) && + isON > 0) { + button->led->state = ENABLE; // if heater and set to on, set pre-status to enable. //_aqualink_data->updated = true; - } else if (isRSSA_ENABLED || ((button->special_mask & PROGRAM_LIGHT) != PROGRAM_LIGHT)) { - button->led->state = (isON == false ? OFF : ON); // as long as it's not programmable light , pre-set to on/off + } else if (isRSSA_ENABLED || ((button->special_mask & PROGRAM_LIGHT) != PROGRAM_LIGHT)) { + button->led->state = (isON == false ? OFF : ON); // as long as it's not programmable light , pre-set to on/off //_aqualink_data->updated = true; + } } -#endif +//#endif } } return TRUE; @@ -781,114 +784,7 @@ bool panel_device_request(struct aqualinkdata *aqdata, action_type type, int dev return TRUE; } -/* -bool create_panel_request(struct aqualinkdata *aqdata, netRequest requester, int buttonIndex, int value, bool timer) { - - // if value = 0 is OFF, - // if value = 1 is ON if (timer = false). - // if value > 0 (timer should be true, and vaue is duration). - if ((_aqualink_data->aqbuttons[buttonIndex].led->state == OFF && value == 0) || - (value > 0 && (_aqualink_data->aqbuttons[buttonIndex].led->state == ON || _aqualink_data->aqbuttons[buttonIndex].led->state == FLASH || - _aqualink_data->aqbuttons[buttonIndex].led->state == ENABLE))) { - LOG(NET_LOG, LOG_INFO, "%s: received '%s' for '%s', already '%s', Ignoring\n", actionName[requester], (value == 0 ? "OFF" : "ON"), _aqualink_data->aqbuttons[buttonIndex].name, (value == 0 ? "OFF" : "ON")); - //return false; - } else { - LOG(NET_LOG, LOG_INFO, "%s: received '%s' for '%s', turning '%s'\n", actionName[requester], (value == 0 ? "OFF" : "ON"), _aqualink_data->aqbuttons[buttonIndex].name, (value == 0 ? "OFF" : "ON")); -#ifdef AQ_PDA - if (isPDA_PANEL) { - char msg[PTHREAD_ARG]; - sprintf(msg, "%-5d%-5d", buttonIndex, (value == 0 ? OFF : ON)); - aq_programmer(AQ_PDA_DEVICE_ON_OFF, msg, _aqualink_data); - } else -#endif - { - // Check for panel programmable light. if so simple ON isn't going to work well - // Could also add "light mode" check, as this is only valid for panel configured light not aqualinkd configured light. - if ((_aqualink_data->aqbuttons[buttonIndex].special_mask & PROGRAM_LIGHT) == PROGRAM_LIGHT && _aqualink_data->aqbuttons[buttonIndex].led->state == OFF) { - // OK Programable light, and no light mode selected. Now let's work out best way to turn it on. serial_adapter protocol will to it without questions, - // all other will require programmig. - if (isRSSA_ENABLED) { - set_aqualink_rssadapter_aux_state(buttonIndex, true); - } else { - set_light_mode("0", buttonIndex); // 0 means use current light mode - } - } else { - aq_send_cmd(_aqualink_data->aqbuttons[buttonIndex].code); - } -// Pre set device to state, next status will correct if state didn't take, but this will stop multiple ON messages setting on/off -#ifdef PRESTATE_ONOFF - if ((_aqualink_data->aqbuttons[buttonIndex].code == KEY_POOL_HTR || _aqualink_data->aqbuttons[buttonIndex].code == KEY_SPA_HTR || - _aqualink_data->aqbuttons[buttonIndex].code == KEY_SOLAR_HTR) && - value > 0) { - _aqualink_data->aqbuttons[buttonIndex].led->state = ENABLE; // if heater and set to on, set pre-status to enable. - //_aqualink_data->updated = true; - } else if (isRSSA_ENABLED || ((_aqualink_data->aqbuttons[buttonIndex].special_mask & PROGRAM_LIGHT) != PROGRAM_LIGHT)) { - _aqualink_data->aqbuttons[buttonIndex].led->state = (value == 0 ? OFF : ON); // as long as it's not programmable light , pre-set to on/off - //_aqualink_data->updated = true; - } -#endif - } - } - - // If it's a timer, start the timer - if (timer) { - start_timer(_aqualink_data, &_aqualink_data->aqbuttons[buttonIndex], value); - } - - return true; -} - -void create_program_request(netRequest requester, action_type type, int value, int id) // id is only valid for PUMP RPM -{ - if (_aqualink_data->unactioned.type != NO_ACTION && type != _aqualink_data->unactioned.type) - LOG(NET_LOG,LOG_ERR, "%s: About to overwrite unactioned panel program\n",actionName[requester]); - - if (type == POOL_HTR_SETOINT || type == SPA_HTR_SETOINT || type == FREEZE_SETPOINT || type == SWG_SETPOINT ) { - _aqualink_data->unactioned.value = setpoint_check(type, value, _aqualink_data); - if (value != _aqualink_data->unactioned.value) - LOG(NET_LOG,LOG_NOTICE, "%s: requested setpoint value %d is invalid, change to %d\n",actionName[requester], value, _aqualink_data->unactioned.value); - } else if (type == PUMP_RPM) { - //_aqualink_data->unactioned.value = RPM_check(_aqualink_data->pumps[id].pumpType , value, _aqualink_data); - _aqualink_data->unactioned.value = value; - //if (value != _aqualink_data->unactioned.value) - // LOG(NET_LOG,LOG_NOTICE, "%s: requested Pump value %d is invalid, change to %d\n",actionName[requester], value, _aqualink_data->unactioned.value); - } else if (type == PUMP_VSPROGRAM) { - //_aqualink_data->unactioned.value = value; - //if (value != _aqualink_data->unactioned.value) - LOG(NET_LOG,LOG_ERR, "%s: requested Pump vsp program is not implimented yet\n",actionName[requester], value, _aqualink_data->unactioned.value); - } else { - // SWG_BOOST & PUMP_RPM - _aqualink_data->unactioned.value = value; - } - - _aqualink_data->unactioned.type = type; - _aqualink_data->unactioned.id = id; // This is only valid for pump. - - if (requester == NET_MQTT) // We can get multiple MQTT requests from some, so this will wait for last one to come in. - time(&_aqualink_data->unactioned.requested); - else - _aqualink_data->unactioned.requested = 0; - - -} - -#ifdef AQ_PDA -void create_PDA_on_off_request(aqkey *button, bool isON) -{ - int i; - char msg[PTHREAD_ARG]; - - for (i=0; i < _aqualink_data->total_buttons; i++) { - if (_aqualink_data->aqbuttons[i].code == button->code) { - sprintf(msg, "%-5d%-5d", i, (isON? ON : OFF)); - aq_programmer(AQ_PDA_DEVICE_ON_OFF, msg, _aqualink_data); - break; - } - } -} -#endif -*/ diff --git a/aq_programmer.c b/aq_programmer.c index fa01a58b..b9d9f0c5 100644 --- a/aq_programmer.c +++ b/aq_programmer.c @@ -26,6 +26,7 @@ #include "utils.h" #include "aq_programmer.h" #include "aq_serial.h" +#include "allbutton_aq_programmer.h" #ifdef AQ_PDA #include "pda.h" @@ -46,185 +47,72 @@ #include "timespec_subtract.h" #endif -bool select_sub_menu_item(struct aqualinkdata *aq_data, char* item_string); -bool select_menu_item(struct aqualinkdata *aq_data, char* item_string); -//void send_cmd(unsigned char cmd, struct aqualinkdata *aq_data); -void cancel_menu(); - - -void *set_aqualink_pool_heater_temps( void *ptr ); -void *set_aqualink_spa_heater_temps( void *ptr ); -void *set_aqualink_freeze_heater_temps( void *ptr ); -void *set_aqualink_time( void *ptr ); -void *get_aqualink_pool_spa_heater_temps( void *ptr ); -void *get_aqualink_programs( void *ptr ); -void *get_freeze_protect_temp( void *ptr ); -void *get_aqualink_diag_model( void *ptr ); -void *get_aqualink_aux_labels( void *ptr ); -//void *threadded_send_cmd( void *ptr ); -void *set_aqualink_light_programmode( void *ptr ); -void *set_aqualink_light_colormode( void *ptr ); -void *set_aqualink_SWG( void *ptr ); -void *set_aqualink_boost( void *ptr ); -/* -void *set_aqualink_onetouch_pump_rpm( void *ptr ); -void *set_aqualink_onetouch_macro( void *ptr ); -void *get_aqualink_onetouch_setpoints( void *ptr ); -*/ - -//void *get_aqualink_PDA_device_status( void *ptr ); -//void *set_aqualink_PDA_device_on_off( void *ptr ); - -bool waitForButtonState(struct aqualinkdata *aq_data, aqkey* button, aqledstate state, int numMessageReceived); - -//bool waitForMessage(struct aqualinkdata *aq_data, char* message, int numMessageReceived); -bool waitForEitherMessage(struct aqualinkdata *aq_data, char* message1, char* message2, int numMessageReceived); - -bool push_aq_cmd(unsigned char cmd); -//void waitfor_queue2empty(); -//void longwaitfor_queue2empty(); - void _aq_programmer(program_type r_type, char *args, struct aqualinkdata *aq_data, bool allowOveride); -#define MAX_STACK 20 -int _stack_place = 0; -unsigned char _commands[MAX_STACK]; -//unsigned char pgm_commands[MAX_STACK]; -unsigned char _pgm_command = NUL; -//unsigned char _ot_pgm_command = NUL; - -bool _last_sent_was_cmd = false; - -// External view of adding to queue -void aq_send_cmd(unsigned char cmd) { - push_aq_cmd(cmd); -} - -/* -void ot_send_cmd(unsigned char cmd) { - _ot_pgm_command = cmd; -} - -unsigned char pop_ot_cmd(unsigned char receive_type) -{ - unsigned char cmd = NUL; - - if (receive_type == CMD_STATUS) { - cmd = _ot_pgm_command; - _ot_pgm_command = NUL; - } - - return cmd; -} -*/ -bool push_aq_cmd(unsigned char cmd) { - - //LOG(PROG_LOG, LOG_NOTICE, "push_aq_cmd '0x%02hhx'\n", cmd); - - if (_stack_place < MAX_STACK) { - _commands[_stack_place] = cmd; - _stack_place++; - } else { - LOG(PROG_LOG, LOG_ERR, "Command queue overflow, too many unsent commands to RS control panel\n"); - return false; - } - - return true; -} - -int get_aq_cmd_length() -{ - return _stack_place; -} - -int _expectNextMessage = 0; -unsigned char _last_sent_command = NUL; - -unsigned char pop_aq_cmd(struct aqualinkdata *aq_data) -{ - unsigned char cmd = NUL; - - if ( _expectNextMessage > 0 && - (aq_data->last_packet_type == CMD_MSG || aq_data->last_packet_type == CMD_MSG_LONG || aq_data->last_packet_type == CMD_MSG_LOOP_ST)) - { - _expectNextMessage=0; - } else if (_expectNextMessage > 3) { - // NSF Should probably check this is a status command AND we are in programming mode. - LOG(PROG_LOG, LOG_ERR, "Did not receive expected reply from last RS SEND command, resending '0x%02hhx'\n", _last_sent_command); - _expectNextMessage=0; - return _last_sent_command; - } else if (_expectNextMessage > 0) { - _expectNextMessage++; - } - - // Only send commands on status messages - // Are we in programming mode and it's not ONETOUCH programming mode - if (in_programming_mode(aq_data) && ( in_ot_programming_mode(aq_data) == false && in_iaqt_programming_mode(aq_data) == false )) { - //if (aq_data->active_thread.thread_id != 0) { - if ( _pgm_command != NUL && aq_data->last_packet_type == CMD_STATUS) { - cmd = _pgm_command; - _pgm_command = NUL; - LOG(PROG_LOG, LOG_DEBUG_SERIAL, "RS SEND cmd '0x%02hhx' (programming)\n", cmd); - } else if (_pgm_command != NUL) { - LOG(PROG_LOG, LOG_DEBUG_SERIAL, "RS Waiting to send cmd '0x%02hhx' (programming)\n", _pgm_command); - } else { - LOG(PROG_LOG, LOG_DEBUG_SERIAL, "RS SEND cmd '0x%02hhx' empty queue (programming)\n", cmd); - } - } else if (_stack_place > 0 && aq_data->last_packet_type == CMD_STATUS ) { - cmd = _commands[0]; - _stack_place--; - LOG(PROG_LOG, LOG_DEBUG_SERIAL, "RS SEND cmd '0x%02hhx'\n", cmd); - //LOG(PROG_LOG, LOG_NOTICE, "pop_cmd '0x%02hhx'\n", cmd); - memmove(&_commands[0], &_commands[1], sizeof(unsigned char) * _stack_place ) ; - } else { - LOG(PROG_LOG, LOG_DEBUG_SERIAL, "RS SEND cmd '0x%02hhx'\n", cmd); - } - -//printf("RSM sending cmd '0x%02hhx' in reply to '0x%02hhx'\n",cmd,aq_data->last_packet_type); - - if (cmd == KEY_ENTER || cmd == KEY_RIGHT || cmd == KEY_LEFT || cmd == KEY_MENU ) { //KEY_CANCEL KEY_HOLD KEY_OVERRIDE - _expectNextMessage=1; - _last_sent_command = cmd; - } - - return cmd; -} - +// Lookup table for programming function to protocal we will use for programming panel +// Should be one function per program_type enum. /* - -unsigned char pop_aq_cmd_OLD(struct aqualinkdata *aq_data) -{ - unsigned char cmd = NUL; - // Only send commands on status messages - // Are we in programming mode - if (aq_data->active_thread.thread_id != 0) { - if ( (_pgm_command == KEY_MENU && aq_data->last_packet_type == CMD_STATUS) || - // Need to not the key_menu below - ( _pgm_command != NUL && (aq_data->last_packet_type == CMD_STATUS || aq_data->last_packet_type == CMD_MSG_LONG) )) { - cmd = _pgm_command; - _pgm_command = NUL; - LOG(PROG_LOG, LOG_DEBUG, "RS SEND cmd '0x%02hhx' (programming)\n", cmd); - } else if (_pgm_command != NUL) { - LOG(PROG_LOG, LOG_DEBUG, "RS Waiting to send cmd '0x%02hhx' (programming)\n", _pgm_command); - } else { - LOG(PROG_LOG, LOG_DEBUG, "RS SEND cmd '0x%02hhx' empty queue (programming)\n", cmd); - } - } else if (_stack_place > 0 && aq_data->last_packet_type == CMD_STATUS ) { - cmd = _commands[0]; - _stack_place--; - LOG(PROG_LOG, LOG_DEBUG, "RS SEND cmd '0x%02hhx'\n", cmd); - memmove(&_commands[0], &_commands[1], sizeof(unsigned char) * _stack_place ) ; - } else { - LOG(PROG_LOG, LOG_DEBUG, "RS SEND cmd '0x%02hhx'\n", cmd); - } - -//printf("RSM sending cmd '0x%02hhx' in reply to '0x%02hhx'\n",cmd,aq_data->last_packet_type); - - return cmd; -} + static void * (*_prog_functions[])(void *ptr) = { */ - +typedef void *(*func_ptr)(void *ptr); + +const func_ptr _prog_functions[AQP_RSSADAPTER_MAX] = { + [AQ_GET_POOL_SPA_HEATER_TEMPS] = get_allbutton_pool_spa_heater_temps, + [AQ_GET_FREEZE_PROTECT_TEMP] = get_allbutton_freeze_protect_temp, + [AQ_SET_TIME] = set_allbutton_time, + [AQ_SET_POOL_HEATER_TEMP] = set_allbutton_pool_heater_temps, + [AQ_SET_SPA_HEATER_TEMP] = set_allbutton_spa_heater_temps, + [AQ_SET_FRZ_PROTECTION_TEMP] = set_allbutton_freeze_heater_temps, + [AQ_GET_DIAGNOSTICS_MODEL] = get_allbutton_diag_model, + [AQ_GET_PROGRAMS] = get_allbutton_programs, + [AQ_SET_LIGHTPROGRAM_MODE] = set_allbutton_light_programmode, + [AQ_SET_LIGHTCOLOR_MODE] = set_allbutton_light_colormode, + [AQ_SET_SWG_PERCENT] = set_allbutton_SWG, + [AQ_GET_AUX_LABELS] = get_allbutton_aux_labels, + [AQ_SET_BOOST] = set_allbutton_boost, + [AQ_SET_ONETOUCH_PUMP_RPM] = set_aqualink_onetouch_pump_rpm, + [AQ_GET_ONETOUCH_FREEZEPROTECT] = get_aqualink_onetouch_freezeprotect, + [AQ_GET_ONETOUCH_SETPOINTS] = get_aqualink_onetouch_setpoints, + [AQ_SET_ONETOUCH_TIME] = set_aqualink_onetouch_time, + [AQ_SET_ONETOUCH_BOOST] = set_aqualink_onetouch_boost, + [AQ_SET_ONETOUCH_SWG_PERCENT] = set_aqualink_onetouch_swg_percent, + [AQ_SET_ONETOUCH_POOL_HEATER_TEMP]= set_aqualink_onetouch_pool_heater_temp, + [AQ_SET_ONETOUCH_SPA_HEATER_TEMP] = set_aqualink_onetouch_spa_heater_temp, + [AQ_SET_ONETOUCH_FREEZEPROTECT] = set_aqualink_onetouch_freezeprotect, + [AQ_SET_IAQTOUCH_PUMP_RPM] = set_aqualink_iaqtouch_pump_rpm, + [AQ_GET_IAQTOUCH_VSP_ASSIGNMENT] = set_aqualink_iaqtouch_vsp_assignments, + [AQ_GET_IAQTOUCH_SETPOINTS] = get_aqualink_iaqtouch_setpoints, + [AQ_GET_IAQTOUCH_FREEZEPROTECT] = get_aqualink_iaqtouch_freezeprotect, + [AQ_GET_IAQTOUCH_AUX_LABELS] = get_aqualink_iaqtouch_aux_labels, + [AQ_SET_IAQTOUCH_SWG_PERCENT] = set_aqualink_iaqtouch_swg_percent, + [AQ_SET_IAQTOUCH_SWG_BOOST] = set_aqualink_iaqtouch_swg_boost, + [AQ_SET_IAQTOUCH_POOL_HEATER_TEMP]= set_aqualink_iaqtouch_pool_heater_temp, + [AQ_SET_IAQTOUCH_SPA_HEATER_TEMP] = set_aqualink_iaqtouch_spa_heater_temp, + [AQ_SET_IAQTOUCH_SET_TIME] = set_aqualink_iaqtouch_time, + [AQ_SET_IAQTOUCH_PUMP_VS_PROGRAM] = set_aqualink_iaqtouch_pump_vs_program, + [AQ_SET_IAQTOUCH_LIGHTCOLOR_MODE] = set_aqualink_iaqtouch_light_colormode, + [AQ_SET_IAQTOUCH_DEVICE_ON_OFF] = set_aqualink_iaqtouch_device_on_off, + [AQ_PDA_INIT] = set_aqualink_PDA_init, + [AQ_PDA_WAKE_INIT] = set_aqualink_PDA_wakeinit, + [AQ_PDA_DEVICE_STATUS] = get_aqualink_PDA_device_status, + [AQ_PDA_DEVICE_ON_OFF] = set_aqualink_PDA_device_on_off, + [AQ_PDA_SET_BOOST] = set_PDA_aqualink_boost, + [AQ_PDA_SET_SWG_PERCENT] = set_PDA_aqualink_SWG_setpoint, + [AQ_PDA_GET_AUX_LABELS] = get_PDA_aqualink_aux_labels, + [AQ_PDA_SET_POOL_HEATER_TEMPS] = set_aqualink_PDA_pool_heater_temps, + [AQ_PDA_SET_SPA_HEATER_TEMPS] = set_aqualink_PDA_spa_heater_temps, + [AQ_PDA_SET_FREEZE_PROTECT_TEMP] = set_aqualink_PDA_freeze_protectsetpoint, + [AQ_PDA_SET_TIME] = set_PDA_aqualink_time, + //[AQ_PDA_GET_POOL_SPA_HEATER_TEMPS]= get_aqualink_PDA_pool_spa_heater_temps, + [AQ_PDA_GET_FREEZE_PROTECT_TEMP] = get_PDA_aqualink_pool_spa_heater_temps + /* + [AQ_PDA_SET_BOOST] = set_PDA_aqualink_boost + [AQ_PDA_SET_SWG_PERCENT] = set_PDA_aqualink_SWG_setpoint + [AQ_PDA_GET_AUX_LABELS] = get_PDA_aqualink_aux_labels + */ + +}; int roundTo(int num, int denominator) { @@ -416,61 +304,7 @@ void queueGetProgramData(emulation_type source_type, struct aqualinkdata *aq_dat } } -void queueGetProgramData_OLD(emulation_type source_type, struct aqualinkdata *aq_data) -{ - // Wait for onetouch if enabeled. - //if ( source_type == ALLBUTTON && ( onetouch_enabled() == false || extended_device_id_programming() == false ) ) { - if ( source_type == RSSADAPTER ) { - aq_programmer(AQ_GET_RSSADAPTER_SETPOINTS, NULL, aq_data); - } else if ( source_type == ALLBUTTON && ( isEXTP_ENABLED == false || (isONET_ENABLED == false && isIAQT_ENABLED == false)) ) { - aq_send_cmd(NUL); - if (!isRSSA_ENABLED) { - aq_programmer(AQ_GET_POOL_SPA_HEATER_TEMPS, NULL, aq_data); - } - aq_programmer(AQ_GET_FREEZE_PROTECT_TEMP, NULL, aq_data); - if (_aqconfig_.use_panel_aux_labels) { - aq_programmer(AQ_GET_AUX_LABELS, NULL, aq_data); - } -#ifdef AQ_ONETOUCH - } else if ( source_type == ONETOUCH) { - if (!isRSSA_ENABLED) { - aq_programmer(AQ_GET_ONETOUCH_FREEZEPROTECT, NULL, aq_data); - } else { - aq_programmer(AQ_GET_ONETOUCH_SETPOINTS, NULL, aq_data); // This get's freeze & heaters, we should just get freeze if isRSSA_ENABLED - } - if (_aqconfig_.use_panel_aux_labels) - aq_programmer(AQ_GET_AUX_LABELS, NULL, aq_data); -#endif -#ifdef AQ_IAQTOUCH - } else if ( source_type == IAQTOUCH) { - //if (!isRSSA_ENABLED) - aq_programmer(AQ_GET_IAQTOUCH_SETPOINTS, NULL, aq_data); // This get's freeze & heaters, we should just get freeze if isRSSA_ENABLED - if (_aqconfig_.use_panel_aux_labels) - aq_programmer(AQ_GET_AUX_LABELS, NULL, aq_data); - //aq_programmer(AQ_GET_IAQTOUCH_AUX_LABELS, NULL, aq_data); // This is not working yet -#endif -#ifdef AQ_PDA - } else if ( source_type == AQUAPDA) { - aq_programmer(AQ_PDA_INIT, NULL, aq_data); -#endif - } -} -/* -void queueGetProgramData(emulation_type source_type, struct aqualinkdata *aq_data) -{ - queueGetExtendedProgramData(source_type, aq_data, false); -} -*/ -/* -void kick_aq_program_thread(struct aqualinkdata *aq_data) -{ - if (aq_data->active_thread.thread_id != 0) { - LOG(PROG_LOG, LOG_DEBUG, "Kicking thread %d,%p message '%s'\n",aq_data->active_thread.ptype, aq_data->active_thread.thread_id,aq_data->last_message); - pthread_cond_broadcast(&aq_data->active_thread.thread_cond); - } -} -*/ bool in_light_programming_mode(struct aqualinkdata *aq_data) { if ( ( aq_data->active_thread.thread_id != 0 ) && @@ -520,34 +354,49 @@ bool in_iaqt_programming_mode(struct aqualinkdata *aq_data) return false; } -/* -Don't need this at the moment, it's kind-a inverse of above two functions - bool in_allb_programming_mode(struct aqualinkdata *aq_data) { - if ( ( aq_data->active_thread.thread_id != 0 ) && - ( aq_data->active_thread.ptype == AQ_GET_POOL_SPA_HEATER_TEMPS || - aq_data->active_thread.ptype == AQ_GET_FREEZE_PROTECT_TEMP || - aq_data->active_thread.ptype == AQ_SET_TIME || - aq_data->active_thread.ptype == AQ_SET_POOL_HEATER_TEMP || - aq_data->active_thread.ptype == AQ_SET_SPA_HEATER_TEMP || - aq_data->active_thread.ptype == AQ_SET_FRZ_PROTECTION_TEMP || - aq_data->active_thread.ptype == AQ_GET_DIAGNOSTICS_MODEL || - aq_data->active_thread.ptype == AQ_GET_PROGRAMS || - aq_data->active_thread.ptype == AQ_SET_LIGHTPROGRAM_MODE || - aq_data->active_thread.ptype == AQ_SET_LIGHTCOLOR_MODE || - aq_data->active_thread.ptype == AQ_SET_SWG_PERCENT || - aq_data->active_thread.ptype == AQ_GET_AUX_LABELS || - aq_data->active_thread.ptype == AQ_SET_BOOST || - aq_data->active_thread.ptype == AQ_SET_PUMP_RPM || - aq_data->active_thread.ptype == AQ_SET_PUMP_VS_PROGRAM) - ) { - return true; + if ( aq_data->active_thread.thread_id != 0 && + aq_data->active_thread.ptype >= AQP_ALLBUTTON_MIN && + aq_data->active_thread.ptype <= AQP_ALLBUTTONL_MAX) { + return true; } - return false; } -*/ + +// May need to re-think. if we are in PDA mode and using IAQTOUCH should we +// return PAD or IAQTOUCH +emulation_type get_programming_mode(program_type type) +{ + if (type >= AQP_ALLBUTTON_MIN && + type <= AQP_ALLBUTTONL_MAX) { + return ALLBUTTON; + } + if (type >= AQP_IAQTOUCH_MIN && + type <= AQP_IAQTOUCH_MAX) { + return IAQTOUCH; + } + if (type >= AQP_ONETOUCH_MIN && + type <= AQP_ONETOUCH_MAX) { + return ONETOUCH; + } + if (type >= AQP_PDA_MIN && + type <= AQP_PDA_MAX) { + return AQUAPDA; + } + return SIM_NONE; +} + +emulation_type get_current_programming_mode(struct aqualinkdata *aq_data) +{ + if ( !in_programming_mode(aq_data) ) { + return SIM_NONE; + } + + return get_programming_mode(aq_data->active_thread.ptype); +} + + bool in_programming_mode(struct aqualinkdata *aq_data) { if ( aq_data->active_thread.thread_id != 0 ) { @@ -590,61 +439,6 @@ void _aq_programmer(program_type r_type, char *args, struct aqualinkdata *aq_dat { struct programmingThreadCtrl *programmingthread = malloc(sizeof(struct programmingThreadCtrl)); - -/* - Seemed like a good idea to use lookuptable, but need to figure out a way to check program_type actually exists in array, - - //void* (*pf[])(void *ptr) = {get_freeze_protect_temp, get_freeze_protect_temp, get_freeze_protect_temp}; - //static const void * (*fun_lookup[])(void *ptr) = { - static void * (*function_lookup[])(void *ptr) = { - [AQ_GET_POOL_SPA_HEATER_TEMPS] = get_aqualink_pool_spa_heater_temps, - [AQ_GET_FREEZE_PROTECT_TEMP] = get_freeze_protect_temp, - [AQ_SET_TIME] = set_aqualink_time, - [AQ_SET_POOL_HEATER_TEMP] = set_aqualink_pool_heater_temps, - [AQ_SET_SPA_HEATER_TEMP] = set_aqualink_spa_heater_temps, - [AQ_SET_FRZ_PROTECTION_TEMP] = set_aqualink_freeze_heater_temps, - [AQ_GET_DIAGNOSTICS_MODEL] = get_aqualink_diag_model, - [AQ_GET_PROGRAMS] = get_aqualink_programs, - [AQ_SET_LIGHTPROGRAM_MODE] = set_aqualink_light_programmode, - [AQ_SET_LIGHTCOLOR_MODE] = set_aqualink_light_colormode, - [AQ_SET_SWG_PERCENT] = set_aqualink_SWG, - [AQ_GET_AUX_LABELS] = get_aqualink_aux_labels, - [AQ_SET_BOOST] = set_aqualink_boost, -#ifdef AQ_PDA - [AQ_PDA_INIT] = set_aqualink_PDA_init, - [AQ_PDA_DEVICE_STATUS] = get_aqualink_PDA_device_status, - [AQ_PDA_DEVICE_ON_OFF] = set_aqualink_PDA_device_on_off, - [AQ_PDA_WAKE_INIT] = set_aqualink_PDA_wakeinit, -#endif -#ifdef AQ_ONETOUCH - //[AQ_SET_PUMP_RPM] = , - //[AQ_SET_PUMP_VS_PROGRAM] = , - //[AQ_SET_ONETOUCH_MACRO] = , - [AQ_SET_ONETOUCH_PUMP_RPM] = set_aqualink_onetouch_pump_rpm, - [AQ_GET_ONETOUCH_SETPOINTS] = get_aqualink_onetouch_setpoints, - [AQ_SET_ONETOUCH_POOL_HEATER_TEMP] = set_aqualink_onetouch_pool_heater_temp, - [AQ_SET_ONETOUCH_SPA_HEATER_TEMP] = set_aqualink_onetouch_spa_heater_temp, - [AQ_SET_ONETOUCH_FREEZEPROTECT] = set_aqualink_onetouch_freezeprotect, - [AQ_SET_ONETOUCH_TIME] = set_aqualink_onetouch_time, - [AQ_SET_ONETOUCH_BOOST] = set_aqualink_onetouch_boost, - [AQ_SET_ONETOUCH_SWG_PERCENT] = set_aqualink_onetouch_swg_percent, -#endif -#ifdef AQ_IAQTOUCH - [AQ_SET_IAQTOUCH_PUMP_RPM] = set_aqualink_iaqtouch_pump_rpm, - [AQ_SET_IAQTOUCH_PUMP_VS_PROGRAM] = set_aqualink_iaqtouch_pump_vs_program, - [AQ_GET_IAQTOUCH_VSP_ASSIGNMENT] = set_aqualink_iaqtouch_vsp_assignments, - [AQ_GET_IAQTOUCH_SETPOINTS] = get_aqualink_iaqtouch_setpoints, - [AQ_GET_IAQTOUCH_AUX_LABELS] = get_aqualink_iaqtouch_aux_labels, - [AQ_SET_IAQTOUCH_SWG_PERCENT] = set_aqualink_iaqtouch_swg_percent, - [AQ_SET_IAQTOUCH_SWG_BOOST] = set_aqualink_iaqtouch_swg_boost, - [AQ_SET_IAQTOUCH_POOL_HEATER_TEMP] = set_aqualink_iaqtouch_pool_heater_temp, - [AQ_SET_IAQTOUCH_SPA_HEATER_TEMP] = set_aqualink_iaqtouch_spa_heater_temp, - [AQ_SET_IAQTOUCH_SET_TIME] = set_aqualink_iaqtouch_time, -#endif - [AQ_SET_BOOST] = set_aqualink_boost - }; -*/ - program_type type = r_type; // RS SerialAdapter is quickest for changing thermostat temps, so use that if enabeled. @@ -750,24 +544,53 @@ void _aq_programmer(program_type r_type, char *args, struct aqualinkdata *aq_dat // Check we are doing something valid request if (isPDA_PANEL && !isPDA_IAQT) { - pda_reset_sleep(); - if (type != AQ_PDA_INIT && - type != AQ_PDA_WAKE_INIT && - type != AQ_PDA_DEVICE_STATUS && - type != AQ_SET_POOL_HEATER_TEMP && - type != AQ_SET_SPA_HEATER_TEMP && - type != AQ_SET_SWG_PERCENT && - type != AQ_PDA_DEVICE_ON_OFF && + switch (r_type){ + case AQ_SET_POOL_HEATER_TEMP: + type = AQ_PDA_SET_POOL_HEATER_TEMPS; + break; + case AQ_SET_SPA_HEATER_TEMP: + type = AQ_PDA_SET_SPA_HEATER_TEMPS; + break; + case AQ_SET_SWG_PERCENT: + type = AQ_PDA_SET_SWG_PERCENT; + break; + case AQ_PDA_DEVICE_ON_OFF: + break; + case AQ_GET_POOL_SPA_HEATER_TEMPS: + type = AQ_PDA_GET_POOL_SPA_HEATER_TEMPS; + break; + case AQ_GET_FREEZE_PROTECT_TEMP: + type = AQ_PDA_GET_FREEZE_PROTECT_TEMP; + break; + case AQ_SET_FRZ_PROTECTION_TEMP: + type = AQ_PDA_SET_FREEZE_PROTECT_TEMP; + break; + case AQ_SET_BOOST: + type = AQ_PDA_SET_BOOST; + break; + case AQ_SET_TIME: + type = AQ_PDA_SET_TIME; + break; #ifdef BETA_PDA_AUTOLABEL - type != AQ_GET_AUX_LABELS && + case AQ_GET_AUX_LABELS: + type = AQ_PDA_AUX_LABELS: + break; #endif - type != AQ_GET_POOL_SPA_HEATER_TEMPS && - type != AQ_SET_FRZ_PROTECTION_TEMP && - type != AQ_SET_BOOST && - type != AQ_SET_TIME) { - LOG(PROG_LOG, LOG_ERR, "Selected Programming mode '%d' not supported with PDA mode control panel\n",type); + default: + type = r_type; + break; + } + if (get_programming_mode(type) != AQUAPDA ) { + LOG(PROG_LOG, LOG_ERR, "Selected Programming mode '%s' '%d' not supported with PDA control panel\n",ptypeName(type),type); return; - } + } + pda_reset_sleep(); + } else if (isPDA_PANEL && isPDA_IAQT) + { + if ( get_programming_mode(type) != IAQTOUCH) { + LOG(PROG_LOG, LOG_ERR, "Selected Programming mode '%s' '%d' not supported with PDA control panel in iAqualinkTouch mode\n",ptypeName(type),type); + return; + } } #endif @@ -776,6 +599,7 @@ void _aq_programmer(program_type r_type, char *args, struct aqualinkdata *aq_dat type = r_type; } + LOG(PROG_LOG, LOG_NOTICE, "Starting programming thread '%s'\n",ptypeName(type)); programmingthread->aq_data = aq_data; @@ -785,28 +609,6 @@ void _aq_programmer(program_type r_type, char *args, struct aqualinkdata *aq_dat strncpy(programmingthread->thread_args, args, sizeof(programmingthread->thread_args)-1); switch(type) { - /* - case AQ_SEND_CMD: - LOG(PROG_LOG, LOG_INFO, "Queue send '0x%02hhx' to controller\n", &args[0]); - - unsigned char cmd = (unsigned char) &args[0]; - if (cmd == NUL) { - LOG(PROG_LOG, LOG_INFO, "Queue send '0x%02hhx' to controller (NEW)\n", cmd); - push_aq_cmd( cmd ); - } else { - LOG(PROG_LOG, LOG_INFO, "Queue send '0x%02hhx' to controller (OLD)\n", cmd); - push_aq_cmd((unsigned char)*args); - }*/ - //LOG(PROG_LOG, LOG_INFO, "Queue send '0x%02hhx' to controller\n", (unsigned char)*args); - /* - if(aq_data->active_thread.thread_id == 0) { // No need to thread a plane send if no active threads - send_cmd( (unsigned char)*args, aq_data); - } else if( pthread_create( &programmingthread->thread_id , NULL , threadded_send_cmd, (void*)programmingthread) < 0) { - LOG(PROG_LOG, LOG_ERR, "could not create thread\n"); - return; - } - */ - //break; case AQ_GET_RSSADAPTER_SETPOINTS: get_aqualink_rssadapter_setpoints(); return; // No need to create this as thread. @@ -827,1689 +629,113 @@ void _aq_programmer(program_type r_type, char *args, struct aqualinkdata *aq_dat increase_aqualink_rssadapter_spa_setpoint(args, aq_data); return; // No need to create this as thread. break; - case AQ_GET_POOL_SPA_HEATER_TEMPS: - if( pthread_create( &programmingthread->thread_id , NULL , get_aqualink_pool_spa_heater_temps, (void*)programmingthread) < 0) { + default: + // Should check that _prog_functions[type] is valid. + if( pthread_create( &programmingthread->thread_id , NULL , _prog_functions[type], (void*)programmingthread) < 0) { LOG(PROG_LOG, LOG_ERR, "could not create thread\n"); return; } - break; - case AQ_GET_FREEZE_PROTECT_TEMP: - if( pthread_create( &programmingthread->thread_id , NULL , get_freeze_protect_temp, (void*)programmingthread) < 0) { - LOG(PROG_LOG, LOG_ERR, "could not create thread\n"); - return; - } - break; - case AQ_SET_TIME: - if( pthread_create( &programmingthread->thread_id , NULL , set_aqualink_time, (void*)programmingthread) < 0) { - LOG(PROG_LOG, LOG_ERR, "could not create thread\n"); - return; - } - break; - case AQ_SET_POOL_HEATER_TEMP: - if( pthread_create( &programmingthread->thread_id , NULL , set_aqualink_pool_heater_temps, (void*)programmingthread) < 0) { - LOG(PROG_LOG, LOG_ERR, "could not create thread\n"); - return; - } - break; - case AQ_SET_SPA_HEATER_TEMP: - if( pthread_create( &programmingthread->thread_id , NULL , set_aqualink_spa_heater_temps, (void*)programmingthread) < 0) { - LOG(PROG_LOG, LOG_ERR, "could not create thread\n"); - return; - } - break; - case AQ_SET_FRZ_PROTECTION_TEMP: - if( pthread_create( &programmingthread->thread_id , NULL , set_aqualink_freeze_heater_temps, (void*)programmingthread) < 0) { - LOG(PROG_LOG, LOG_ERR, "could not create thread\n"); - return; - } - break; - case AQ_GET_DIAGNOSTICS_MODEL: - if( pthread_create( &programmingthread->thread_id , NULL , get_aqualink_diag_model, (void*)programmingthread) < 0) { - LOG(PROG_LOG, LOG_ERR, "could not create thread\n"); - return; - } - break; - case AQ_GET_PROGRAMS: - if( pthread_create( &programmingthread->thread_id , NULL , get_aqualink_programs, (void*)programmingthread) < 0) { - LOG(PROG_LOG, LOG_ERR, "could not create thread\n"); - return; - } - break; - case AQ_SET_LIGHTPROGRAM_MODE: - if( pthread_create( &programmingthread->thread_id , NULL , set_aqualink_light_programmode, (void*)programmingthread) < 0) { - LOG(PROG_LOG, LOG_ERR, "could not create thread\n"); - return; - } - break; - case AQ_SET_LIGHTCOLOR_MODE: - if( pthread_create( &programmingthread->thread_id , NULL , set_aqualink_light_colormode, (void*)programmingthread) < 0) { - LOG(PROG_LOG, LOG_ERR, "could not create thread\n"); - return; - } - break; - case AQ_SET_SWG_PERCENT: - if( pthread_create( &programmingthread->thread_id , NULL , set_aqualink_SWG, (void*)programmingthread) < 0) { - LOG(PROG_LOG, LOG_ERR, "could not create thread\n"); - return; - } - break; - case AQ_GET_AUX_LABELS: - if( pthread_create( &programmingthread->thread_id , NULL , get_aqualink_aux_labels, (void*)programmingthread) < 0) { - LOG(PROG_LOG, LOG_ERR, "could not create thread\n"); - return; - } - break; - case AQ_SET_BOOST: - if( pthread_create( &programmingthread->thread_id , NULL , set_aqualink_boost, (void*)programmingthread) < 0) { - LOG(PROG_LOG, LOG_ERR, "could not create thread\n"); - return; - } - break; -#ifdef AQ_ONETOUCH - case AQ_SET_ONETOUCH_PUMP_RPM: - if( pthread_create( &programmingthread->thread_id , NULL , set_aqualink_onetouch_pump_rpm, (void*)programmingthread) < 0) { - LOG(PROG_LOG, LOG_ERR, "could not create thread\n"); - return; - } - break; - case AQ_GET_ONETOUCH_FREEZEPROTECT: - if( pthread_create( &programmingthread->thread_id , NULL , get_aqualink_onetouch_freezeprotect, (void*)programmingthread) < 0) { - LOG(PROG_LOG, LOG_ERR, "could not create thread\n"); - return; - } - break; - case AQ_GET_ONETOUCH_SETPOINTS: - if( pthread_create( &programmingthread->thread_id , NULL , get_aqualink_onetouch_setpoints, (void*)programmingthread) < 0) { - LOG(PROG_LOG, LOG_ERR, "could not create thread\n"); - return; - } - break; - case AQ_SET_ONETOUCH_TIME: - if( pthread_create( &programmingthread->thread_id , NULL , set_aqualink_onetouch_time, (void*)programmingthread) < 0) { - LOG(PROG_LOG, LOG_ERR, "could not create thread\n"); - return; - } - break; - case AQ_SET_ONETOUCH_BOOST: - if( pthread_create( &programmingthread->thread_id , NULL , set_aqualink_onetouch_boost, (void*)programmingthread) < 0) { - LOG(PROG_LOG, LOG_ERR, "could not create thread\n"); - return; - } - break; - case AQ_SET_ONETOUCH_SWG_PERCENT: - if( pthread_create( &programmingthread->thread_id , NULL , set_aqualink_onetouch_swg_percent, (void*)programmingthread) < 0) { - LOG(PROG_LOG, LOG_ERR, "could not create thread\n"); - return; - } - break; - case AQ_SET_ONETOUCH_POOL_HEATER_TEMP: - if( pthread_create( &programmingthread->thread_id , NULL , set_aqualink_onetouch_pool_heater_temp, (void*)programmingthread) < 0) { - LOG(PROG_LOG, LOG_ERR, "could not create thread\n"); - return; - } - break; - case AQ_SET_ONETOUCH_SPA_HEATER_TEMP: - if( pthread_create( &programmingthread->thread_id , NULL , set_aqualink_onetouch_spa_heater_temp, (void*)programmingthread) < 0) { - LOG(PROG_LOG, LOG_ERR, "could not create thread\n"); - return; - } - break; - case AQ_SET_ONETOUCH_FREEZEPROTECT: - if( pthread_create( &programmingthread->thread_id , NULL , set_aqualink_onetouch_freezeprotect, (void*)programmingthread) < 0) { - LOG(PROG_LOG, LOG_ERR, "could not create thread\n"); - return; - } - break; -#endif -#ifdef AQ_IAQTOUCH - case AQ_SET_IAQTOUCH_PUMP_RPM: - if( pthread_create( &programmingthread->thread_id , NULL , set_aqualink_iaqtouch_pump_rpm, (void*)programmingthread) < 0) { - LOG(PROG_LOG, LOG_ERR, "could not create thread\n"); - return; - } - break; - case AQ_GET_IAQTOUCH_VSP_ASSIGNMENT: - if( pthread_create( &programmingthread->thread_id , NULL , set_aqualink_iaqtouch_vsp_assignments, (void*)programmingthread) < 0) { - LOG(PROG_LOG, LOG_ERR, "could not create thread\n"); - return; - } - break; - case AQ_GET_IAQTOUCH_SETPOINTS: - if( pthread_create( &programmingthread->thread_id , NULL , get_aqualink_iaqtouch_setpoints, (void*)programmingthread) < 0) { - LOG(PROG_LOG, LOG_ERR, "could not create thread\n"); - return; - } - break; - case AQ_GET_IAQTOUCH_FREEZEPROTECT: - if( pthread_create( &programmingthread->thread_id , NULL , get_aqualink_iaqtouch_freezeprotect, (void*)programmingthread) < 0) { - LOG(PROG_LOG, LOG_ERR, "could not create thread\n"); - return; - } - break; - case AQ_GET_IAQTOUCH_AUX_LABELS: - if( pthread_create( &programmingthread->thread_id , NULL , get_aqualink_iaqtouch_aux_labels, (void*)programmingthread) < 0) { - LOG(PROG_LOG, LOG_ERR, "could not create thread\n"); - return; - } - break; - case AQ_SET_IAQTOUCH_SWG_PERCENT: - if( pthread_create( &programmingthread->thread_id , NULL , set_aqualink_iaqtouch_swg_percent, (void*)programmingthread) < 0) { - LOG(PROG_LOG, LOG_ERR, "could not create thread\n"); - return; - } - break; - case AQ_SET_IAQTOUCH_SWG_BOOST: - if( pthread_create( &programmingthread->thread_id , NULL , set_aqualink_iaqtouch_swg_boost, (void*)programmingthread) < 0) { - LOG(PROG_LOG, LOG_ERR, "could not create thread\n"); - return; - } - break; - case AQ_SET_IAQTOUCH_POOL_HEATER_TEMP: - if( pthread_create( &programmingthread->thread_id , NULL , set_aqualink_iaqtouch_pool_heater_temp, (void*)programmingthread) < 0) { - LOG(PROG_LOG, LOG_ERR, "could not create thread\n"); - return; - } - break; - case AQ_SET_IAQTOUCH_SPA_HEATER_TEMP: - if( pthread_create( &programmingthread->thread_id , NULL , set_aqualink_iaqtouch_spa_heater_temp, (void*)programmingthread) < 0) { - LOG(PROG_LOG, LOG_ERR, "could not create thread\n"); - return; - } - break; - case AQ_SET_IAQTOUCH_SET_TIME: - if( pthread_create( &programmingthread->thread_id , NULL , set_aqualink_iaqtouch_time, (void*)programmingthread) < 0) { - LOG(PROG_LOG, LOG_ERR, "could not create thread\n"); - return; - } - break; - case AQ_SET_IAQTOUCH_PUMP_VS_PROGRAM: - if( pthread_create( &programmingthread->thread_id , NULL , set_aqualink_iaqtouch_pump_vs_program, (void*)programmingthread) < 0) { - LOG(PROG_LOG, LOG_ERR, "could not create thread\n"); - return; - } - break; - case AQ_SET_IAQTOUCH_LIGHTCOLOR_MODE: - if( pthread_create( &programmingthread->thread_id , NULL , set_aqualink_iaqtouch_light_colormode, (void*)programmingthread) < 0) { - LOG(PROG_LOG, LOG_ERR, "could not create thread\n"); - return; - } - break; -#endif -#ifdef AQ_PDA - case AQ_PDA_INIT: - if( pthread_create( &programmingthread->thread_id , NULL , set_aqualink_PDA_init, (void*)programmingthread) < 0) { - LOG(PROG_LOG, LOG_ERR, "could not create thread\n"); - return; - } - break; - case AQ_PDA_WAKE_INIT: - if( pthread_create( &programmingthread->thread_id , NULL , set_aqualink_PDA_wakeinit, (void*)programmingthread) < 0) { - LOG(PROG_LOG, LOG_ERR, "could not create thread\n"); - return; - } - break; - case AQ_PDA_DEVICE_STATUS: - if( pthread_create( &programmingthread->thread_id , NULL , get_aqualink_PDA_device_status, (void*)programmingthread) < 0) { - LOG(PROG_LOG, LOG_ERR, "could not create thread\n"); - return; - } - break; - case AQ_PDA_DEVICE_ON_OFF: - if( pthread_create( &programmingthread->thread_id , NULL , set_aqualink_PDA_device_on_off, (void*)programmingthread) < 0) { - LOG(PROG_LOG, LOG_ERR, "could not create thread\n"); - return; - } - break; - case AQ_SET_IAQTOUCH_DEVICE_ON_OFF: - if( pthread_create( &programmingthread->thread_id , NULL , set_aqualink_iaqtouch_device_on_off, (void*)programmingthread) < 0) { - LOG(PROG_LOG, LOG_ERR, "could not create thread\n"); - return; - } - break; - #endif - - default: - LOG(PROG_LOG, LOG_ERR, "Didn't understand programming mode type\n"); - break; - } - - if ( programmingthread->thread_id != 0 ) { - //LOG(PROG_LOG, LOG_DEBUG, "********* DID pthread_detach %d\n",programmingthread->thread_id); - pthread_detach(programmingthread->thread_id); - } else { - //LOG(PROG_LOG, LOG_DEBUG, "********* DID NOT pthread_detach\n"); - } -} - - -void waitForSingleThreadOrTerminate(struct programmingThreadCtrl *threadCtrl, program_type type) -{ - //static int tries = 120; - int tries = 120; - static int waitTime = 1; - int i=0; - - i = 0; - while (get_aq_cmd_length() > 0 && ( i++ <= tries) ) { - LOG(PROG_LOG, LOG_DEBUG, "Thread %p (%s) sleeping, waiting command queue to empty\n", &threadCtrl->thread_id, ptypeName(type)); - sleep(waitTime); - } - if (i >= tries) { - LOG(PROG_LOG, LOG_ERR, "Thread %p (%s) timeout waiting, ending\n",&threadCtrl->thread_id,ptypeName(type)); - free(threadCtrl); - pthread_exit(0); - } - - while ( (threadCtrl->aq_data->active_thread.thread_id != 0) && ( i++ <= tries) ) { - //LOG(PROG_LOG, LOG_DEBUG, "Thread %d sleeping, waiting for thread %d to finish\n", threadCtrl->thread_id, threadCtrl->aq_data->active_thread.thread_id); - LOG(PROG_LOG, LOG_DEBUG, "Thread %p (%s) sleeping, waiting for thread %p (%s) to finish\n", - &threadCtrl->thread_id, ptypeName(type), - threadCtrl->aq_data->active_thread.thread_id, ptypeName(threadCtrl->aq_data->active_thread.ptype)); - sleep(waitTime); - } - - if (i >= tries) { - //LOG(PROG_LOG, LOG_ERR, "Thread %d timeout waiting, ending\n",threadCtrl->thread_id); - LOG(PROG_LOG, LOG_ERR, "Thread (%s) %p timeout waiting for thread (%s) %p to finish\n", - ptypeName(type), &threadCtrl->thread_id, ptypeName(threadCtrl->aq_data->active_thread.ptype), - threadCtrl->aq_data->active_thread.thread_id); - free(threadCtrl); - pthread_exit(0); - } - - // Clear out any messages to the UI. - threadCtrl->aq_data->last_display_message[0] = '\0'; - threadCtrl->aq_data->active_thread.thread_id = &threadCtrl->thread_id; - threadCtrl->aq_data->active_thread.ptype = type; - - #ifdef AQ_DEBUG - clock_gettime(CLOCK_REALTIME, &threadCtrl->aq_data->start_active_time); - #endif - - LOG(PROG_LOG, LOG_INFO, "Programming: %s, %d\n", ptypeName(threadCtrl->aq_data->active_thread.ptype), threadCtrl->aq_data->active_thread.ptype); - - LOG(PROG_LOG, LOG_DEBUG, "Thread %d,%p is active (%s)\n", - threadCtrl->aq_data->active_thread.ptype, - threadCtrl->aq_data->active_thread.thread_id, - ptypeName(threadCtrl->aq_data->active_thread.ptype)); -} - -void cleanAndTerminateThread(struct programmingThreadCtrl *threadCtrl) -{ - waitfor_queue2empty(); - #ifndef AQ_DEBUG - LOG(PROG_LOG, LOG_DEBUG, "Thread %d,%p (%s) finished\n",threadCtrl->aq_data->active_thread.ptype, threadCtrl->thread_id,ptypeName(threadCtrl->aq_data->active_thread.ptype)); - #else - struct timespec elapsed; - clock_gettime(CLOCK_REALTIME, &threadCtrl->aq_data->last_active_time); - timespec_subtract(&elapsed, &threadCtrl->aq_data->last_active_time, &threadCtrl->aq_data->start_active_time); - LOG(PROG_LOG, LOG_NOTICE, "Thread %d,%p (%s) finished in %d.%03ld sec\n", - threadCtrl->aq_data->active_thread.ptype, - threadCtrl->aq_data->active_thread.thread_id, - ptypeName(threadCtrl->aq_data->active_thread.ptype), - elapsed.tv_sec, elapsed.tv_nsec / 1000000L); - #endif - - // Quick delay to allow for last message to be sent. - delay(500); - threadCtrl->aq_data->active_thread.thread_id = 0; - threadCtrl->aq_data->active_thread.ptype = AQP_NULL; - threadCtrl->thread_id = 0; - // Force update, change display message - threadCtrl->aq_data->updated = true; - free(threadCtrl); - pthread_exit(0); -} - -bool setAqualinkNumericField_new(struct aqualinkdata *aq_data, char *value_label, int value, int increment); -bool setAqualinkNumericField(struct aqualinkdata *aq_data, char *value_label, int value) -{ - return setAqualinkNumericField_new(aq_data, value_label, value, 1); -} -bool setAqualinkNumericField_new(struct aqualinkdata *aq_data, char *value_label, int value, int increment) -{ - LOG(ALLB_LOG, LOG_DEBUG,"Setting menu item '%s' to %d\n",value_label, value); - //char leading[10]; // description of the field (POOL, SPA, FRZ) - int current_val=-1; // integer value of the current set point - //char trailing[10]; // the degrees and scale - char searchBuf[20]; - - sprintf(searchBuf, "^%s", value_label); - int val_len = strlen(value_label); - int i=0; - do - { - if (waitForMessage(aq_data, searchBuf, 4) != true) { - LOG(ALLB_LOG, LOG_WARNING, "AQ_Programmer Could not set numeric input '%s', not found\n",value_label); - cancel_menu(); - return false; - } -//LOG(ALLB_LOG, LOG_DEBUG,"WAITING for kick value=%d\n",current_val); - //sscanf(aq_data->last_message, "%s %d%s", leading, ¤t_val, trailing); - //sscanf(aq_data->last_message, "%*[^0123456789]%d", ¤t_val); - sscanf(&aq_data->last_message[val_len], "%*[^0123456789]%d", ¤t_val); - LOG(ALLB_LOG, LOG_DEBUG, "%s set to %d, looking for %d\n",value_label,current_val,value); - - if(value > current_val) { - // Increment the field. - sprintf(searchBuf, "%s %d", value_label, current_val+increment); - send_cmd(KEY_RIGHT); - } - else if(value < current_val) { - // Decrement the field. - sprintf(searchBuf, "%s %d", value_label, current_val-increment); - send_cmd(KEY_LEFT); - } - else { - // Just send ENTER. We are at the right value. - sprintf(searchBuf, "%s %d", value_label, current_val); - send_cmd(KEY_ENTER); - } - - if (i++ >= 100) { - LOG(ALLB_LOG, LOG_WARNING, "AQ_Programmer Could not set numeric input '%s', to '%d'\n",value_label,value); - send_cmd(KEY_ENTER); - break; - } - } while(value != current_val); - - return true; -} - - - -bool OLD_setAqualinkNumericField_OLD(struct aqualinkdata *aq_data, char *value_label, int value) -{ // Works for everything but not SWG - LOG(ALLB_LOG, LOG_DEBUG,"Setting menu item '%s' to %d\n",value_label, value); - char leading[10]; // description of the field (POOL, SPA, FRZ) - int current_val; // integer value of the current set point - char trailing[10]; // the degrees and scale - char searchBuf[20]; - - sprintf(searchBuf, "^%s", value_label); - - do - { - if (waitForMessage(aq_data, searchBuf, 3) != true) { - LOG(ALLB_LOG, LOG_WARNING, "AQ_Programmer Could not set numeric input '%s', not found\n",value_label); - cancel_menu(); - return false; - } -//LOG(ALLB_LOG, LOG_DEBUG,"WAITING for kick value=%d\n",current_val); - sscanf(aq_data->last_message, "%s %d%s", leading, ¤t_val, trailing); - LOG(ALLB_LOG, LOG_DEBUG, "%s set to %d, looking for %d\n",value_label,current_val,value); - - if(value > current_val) { - // Increment the field. - sprintf(searchBuf, "%s %d", value_label, current_val+1); - send_cmd(KEY_RIGHT); - } - else if(value < current_val) { - // Decrement the field. - sprintf(searchBuf, "%s %d", value_label, current_val-1); - send_cmd(KEY_LEFT); - } - else { - // Just send ENTER. We are at the right value. - sprintf(searchBuf, "%s %d", value_label, current_val); - send_cmd(KEY_ENTER); - } - } while(value != current_val); - - return true; -} -/* -void *threadded_send_cmd( void *ptr ) -{ - struct programmingThreadCtrl *threadCtrl; - threadCtrl = (struct programmingThreadCtrl *) ptr; - struct aqualinkdata *aq_data = threadCtrl->aq_data; - - waitForSingleThreadOrTerminate(threadCtrl, AQ_SEND_CMD); - - send_cmd( (unsigned char)*threadCtrl->thread_args, aq_data); - - cleanAndTerminateThread(threadCtrl); - - return ptr; -} -*/ - -void *set_aqualink_boost( void *ptr ) -{ - struct programmingThreadCtrl *threadCtrl; - threadCtrl = (struct programmingThreadCtrl *) ptr; - struct aqualinkdata *aq_data = threadCtrl->aq_data; - - waitForSingleThreadOrTerminate(threadCtrl, AQ_SET_BOOST); - /* - menu - -BOOST POOL - -PRESS ENTER* TO START BOOST POOL - - - - -BOOST POOL 23:59 REMAINING - - -menu - -BOOST POOL - -STOP BOOST POOL - - */ - int val = atoi((char*)threadCtrl->thread_args); - -#ifdef AQ_PDA - if (isPDA_PANEL) { - set_PDA_aqualink_boost(aq_data, val); - cleanAndTerminateThread(threadCtrl); - return ptr; - } -#endif - - LOG(ALLB_LOG, LOG_DEBUG, "programming BOOST to %s\n", val==true?"On":"Off"); - - if ( select_menu_item(aq_data, "BOOST POOL") != true ) { - LOG(ALLB_LOG, LOG_WARNING, "Could not select BOOST POOL menu\n"); - cancel_menu(); - cleanAndTerminateThread(threadCtrl); - return ptr; - } - - if (val==true) { - waitForMessage(threadCtrl->aq_data, "TO START BOOST POOL", 5); - send_cmd(KEY_ENTER); - longwaitfor_queue2empty(); - } else { - int wait_messages = 5; - int i=0; - while( i++ < wait_messages) - { - waitForMessage(aq_data, "STOP BOOST POOL", 1); - if (stristr(aq_data->last_message, "STOP BOOST POOL") != NULL) { - // This is a really bad hack, message sequence is out for boost for some reason, so as soon as we see stop message, force enter key. - //_pgm_command = KEY_ENTER; - send_cmd(KEY_ENTER); - LOG(ALLB_LOG, LOG_DEBUG, "**** FOUND STOP BOOST POOL ****\n"); - //waitfor_queue2empty(); - break; - } else { - LOG(ALLB_LOG, LOG_DEBUG, "Find item in Menu: loop %d of %d looking for 'STOP BOOST POOL' received message '%s'\n",i,wait_messages,aq_data->last_message); - delay(200); - if (stristr(aq_data->last_message, "STOP BOOST POOL") != NULL) { - //_pgm_command = KEY_ENTER; - send_cmd(KEY_ENTER); - LOG(ALLB_LOG, LOG_DEBUG, "**** FOUND STOP BOOST POOL ****\n"); - break; - } - send_cmd(KEY_RIGHT); - //printf("WAIT\n"); - longwaitfor_queue2empty(); - //printf("FINISHED WAIT\n"); - } - //waitfor_queue2empty(); - //waitForMessage(aq_data, NULL, 1); - } - if (i < wait_messages) { - // Takes ages to see bost is off from menu, to set it here. - setSWGboost(aq_data, false); - } - /* - // Extra message overcome. - send_cmd(KEY_RIGHT); - waitfor_queue2empty(); - if ( select_sub_menu_item(aq_data, "STOP BOOST POOL") != true ) { - LOG(ALLB_LOG, LOG_WARNING, "Could not select STOP BOOST POOL menu\n"); - cancel_menu(); - cleanAndTerminateThread(threadCtrl); - return ptr; - }*/ - //send_cmd(KEY_ENTER); - } - - waitForMessage(aq_data,NULL, 1); - - cleanAndTerminateThread(threadCtrl); - - // just stop compiler error, ptr is not valid as it's just been freed - return ptr; -} - - -void *set_aqualink_SWG( void *ptr ) -{ - struct programmingThreadCtrl *threadCtrl; - threadCtrl = (struct programmingThreadCtrl *) ptr; - struct aqualinkdata *aq_data = threadCtrl->aq_data; - - waitForSingleThreadOrTerminate(threadCtrl, AQ_SET_SWG_PERCENT); - - int val = atoi((char*)threadCtrl->thread_args); - val = setpoint_check(SWG_SETPOINT, val, aq_data); - -#ifdef AQ_PDA - if (isPDA_PANEL) { - set_PDA_aqualink_SWG_setpoint(aq_data, val); - cleanAndTerminateThread(threadCtrl); - return ptr; - } -#endif - - //LOG(ALLB_LOG, LOG_NOTICE, "programming SWG percent to %d\n", val); - - if ( select_menu_item(aq_data, "SET AQUAPURE") != true ) { - LOG(ALLB_LOG, LOG_WARNING, "Could not select SET AQUAPURE menu\n"); - LOG(ALLB_LOG, LOG_ERR, "%s failed\n", ptypeName( aq_data->active_thread.ptype ) ); - cancel_menu(); - cleanAndTerminateThread(threadCtrl); - return ptr; - } - - // If spa is on, set SWG for spa, if not set SWG for pool - if (aq_data->aqbuttons[SPA_INDEX].led->state != OFF) { - if (select_sub_menu_item(aq_data, "SET SPA SP") != true) { - LOG(ALLB_LOG, LOG_WARNING, "Could not select SWG setpoint menu for SPA\n"); - LOG(ALLB_LOG, LOG_ERR, "%s failed\n", ptypeName( aq_data->active_thread.ptype ) ); - cancel_menu(); - cleanAndTerminateThread(threadCtrl); - return ptr; - } - setAqualinkNumericField_new(aq_data, "SPA SP", val, 5); - } else { - if (select_sub_menu_item(aq_data, "SET POOL SP") != true) { - LOG(ALLB_LOG, LOG_WARNING, "Could not select SWG setpoint menu\n"); - LOG(ALLB_LOG, LOG_ERR, "%s failed\n", ptypeName( aq_data->active_thread.ptype ) ); - cancel_menu(); - cleanAndTerminateThread(threadCtrl); - return ptr; - } - setAqualinkNumericField_new(aq_data, "POOL SP", val, 5); - } - - // Let everyone know we set SWG, if it failed we will update on next message, unless it's 0. - setSWGpercent(aq_data, val); // Don't use chageSWGpercent as we are in programming mode. - -/* - if (select_sub_menu_item(aq_data, "SET POOL SP") != true) { - LOG(ALLB_LOG, LOG_WARNING, "Could not select SWG setpoint menu\n"); - cancel_menu(aq_data); - cleanAndTerminateThread(threadCtrl); - return ptr; - } - - setAqualinkNumericField_new(aq_data, "POOL SP", val, 5); -*/ - // usually miss this message, not sure why, but wait anyway to make sure programming has ended - // NSF have see the below message RS Message :- - // 'Pool set to 20%' - // 'POOL SP IS SET TO 20%' - waitForMessage(threadCtrl->aq_data, "SET TO", 1); - //waitForMessage(threadCtrl->aq_data, "POOL SP IS SET TO", 1); - - // Since we read % directly from RS message, wait for another few messages that way - // We won't registed a SWG bounce, since we already told clients SWG was at new % before programming started - waitForMessage(threadCtrl->aq_data, NULL, 1); - - cleanAndTerminateThread(threadCtrl); - - // just stop compiler error, ptr is not valid as it's just been freed - return ptr; -} - - - -void *get_aqualink_aux_labels( void *ptr ) -{ - struct programmingThreadCtrl *threadCtrl; - threadCtrl = (struct programmingThreadCtrl *) ptr; - struct aqualinkdata *aq_data = threadCtrl->aq_data; - - waitForSingleThreadOrTerminate(threadCtrl, AQ_GET_AUX_LABELS); - -#ifdef AQ_PDA - if (isPDA_PANEL) { - get_PDA_aqualink_aux_labels(aq_data); - cleanAndTerminateThread(threadCtrl); - return ptr; - } -#endif - - if ( select_menu_item(aq_data, "REVIEW") != true ) { - LOG(ALLB_LOG, LOG_WARNING, "Could not select REVIEW menu\n"); - LOG(ALLB_LOG, LOG_ERR, "%s failed\n", ptypeName( aq_data->active_thread.ptype ) ); - cancel_menu(); - cleanAndTerminateThread(threadCtrl); - return ptr; - } - - if (select_sub_menu_item(aq_data, "AUX LABELS") != true) { - LOG(ALLB_LOG, LOG_WARNING, "Could not select AUX LABELS menu\n"); - LOG(ALLB_LOG, LOG_ERR, "%s failed\n", ptypeName( aq_data->active_thread.ptype ) ); - cancel_menu(); - cleanAndTerminateThread(threadCtrl); - return ptr; - } - - waitForMessage(aq_data, NULL, 5); // Receive 5 messages - - cleanAndTerminateThread(threadCtrl); - - // just stop compiler error, ptr is not valid as it's just been freed - return ptr; -} - -void *set_aqualink_light_colormode( void *ptr ) -{ - int i; - struct programmingThreadCtrl *threadCtrl; - threadCtrl = (struct programmingThreadCtrl *) ptr; - struct aqualinkdata *aq_data = threadCtrl->aq_data; - - waitForSingleThreadOrTerminate(threadCtrl, AQ_SET_LIGHTCOLOR_MODE); - - char *buf = (char*)threadCtrl->thread_args; - const char *mode_name; - int val = atoi(&buf[0]); - int btn = atoi(&buf[5]); - int typ = atoi(&buf[10]); - bool use_current_mode = false; - - if (btn < 0 || btn >= aq_data->total_buttons ) { - LOG(ALLB_LOG, LOG_ERR, "Can't program light mode on button %d\n", btn); - cleanAndTerminateThread(threadCtrl); - return ptr; - } - - aqkey *button = &aq_data->aqbuttons[btn]; - unsigned char code = button->code; - - //LOG(ALLB_LOG, LOG_NOTICE, "Light Programming #: %d, on button: %s, color light type: %d\n", val, button->label, typ); - - if (val <= 0) { - use_current_mode = true; - LOG(ALLB_LOG, LOG_INFO, "Light Programming #: %d, on button: %s, color light type: %d, using current mode\n", val, button->label, typ); - } else { - mode_name = light_mode_name(typ, val-1, ALLBUTTON); - use_current_mode = false; - if (mode_name == NULL) { - LOG(ALLB_LOG, LOG_ERR, "Light Programming #: %d, on button: %s, color light type: %d, couldn't find mode name '%s'\n", val, button->label, typ, mode_name); - cleanAndTerminateThread(threadCtrl); - return ptr; - } else { - LOG(ALLB_LOG, LOG_INFO, "Light Programming #: %d, on button: %s, color light type: %d, name '%s'\n", val, button->label, typ, mode_name); - } - } -/* - // Simply turn the light off if value is 0 - if (val <= 0) { - if ( button->led->state == ON ) { - send_cmd(code); - } - cleanAndTerminateThread(threadCtrl); - return ptr; - } -*/ - // Needs to start programming sequence with light off - if ( button->led->state == ON ) { - LOG(ALLB_LOG, LOG_INFO, "Light Programming Initial state on, turning off\n"); - send_cmd(code); - waitfor_queue2empty(); - if ( !waitForMessage(threadCtrl->aq_data, "OFF", 5)) // Message like 'Aux3 Off' - LOG(ALLB_LOG, LOG_ERR, "Light Programming didn't receive OFF message\n"); - } - - // Now turn on and wait for the message "color mode name<>*" - send_cmd(code); - waitfor_queue2empty(); - i=0; - int waitCounter=12; - - do{ - LOG(ALLB_LOG, LOG_INFO,"Light program wait for message\n"); - if ( !waitForMessage(threadCtrl->aq_data, "~*", waitCounter)) - LOG(ALLB_LOG, LOG_ERR, "Light Programming didn't receive color light mode message\n"); - - // Wait for less messages after first try. We get a lot of repeat messages before the one we need. - waitCounter = 3; - - if (use_current_mode) { - LOG(ALLB_LOG, LOG_INFO, "Light Programming using color mode %s\n",aq_data->last_message); - send_cmd(KEY_ENTER); - waitfor_queue2empty(); - break; - } else if (strncasecmp(aq_data->last_message, mode_name, strlen(mode_name)) == 0) { - LOG(ALLB_LOG, LOG_INFO, "Light Programming found color mode %s\n",mode_name); - send_cmd(KEY_ENTER); - waitfor_queue2empty(); - break; - } - - send_cmd(KEY_RIGHT); - waitfor_queue2empty(); - // Just clear current message before waiting for next, since the test in the do can't distinguish - // as both messages end in "~*" - waitForMessage(threadCtrl->aq_data, NULL, 1); - - i++; - } while (i <= LIGHT_COLOR_OPTIONS); - - if (i == LIGHT_COLOR_OPTIONS) { - LOG(ALLB_LOG, LOG_ERR, "Light Programming didn't receive color light mode message for '%s'\n",use_current_mode?"light program":mode_name); - } - - cleanAndTerminateThread(threadCtrl); - - // just stop compiler error, ptr is not valid as it's just been freed - return ptr; -} - - -void *set_aqualink_light_programmode( void *ptr ) -{ - int i; - struct programmingThreadCtrl *threadCtrl; - threadCtrl = (struct programmingThreadCtrl *) ptr; - struct aqualinkdata *aq_data = threadCtrl->aq_data; - - waitForSingleThreadOrTerminate(threadCtrl, AQ_SET_LIGHTPROGRAM_MODE); - - char *buf = (char*)threadCtrl->thread_args; - int val = atoi(&buf[0]); - int btn = atoi(&buf[5]); - int iOn = atoi(&buf[10]); - int iOff = atoi(&buf[15]); - float pmode = atof(&buf[20]); - - if (btn < 0 || btn >= aq_data->total_buttons ) { - LOG(ALLB_LOG, LOG_ERR, "Can't program light mode on button %d\n", btn); - cleanAndTerminateThread(threadCtrl); - return ptr; - } - - aqkey *button = &aq_data->aqbuttons[btn]; - unsigned char code = button->code; - - LOG(ALLB_LOG, LOG_INFO, "Light Programming #: %d, on button: %s, with pause mode: %f (initial on=%d, initial off=%d)\n", val, button->label, pmode, iOn, iOff); - - // Simply turn the light off if value is 0 - if (val <= 0) { - if ( button->led->state == ON ) { - send_cmd(code); - } - cleanAndTerminateThread(threadCtrl); - return ptr; - } - - const int seconds = 1000; - // Needs to start programming sequence with light on, if off we need to turn on for 15 seconds - // before we can send the next off. - if ( button->led->state != ON ) { - LOG(ALLB_LOG, LOG_INFO, "Light Programming Initial state off, turning on for %d seconds\n",iOn); - send_cmd(code); - delay(iOn * seconds); - } - - LOG(ALLB_LOG, LOG_INFO, "Light Programming turn off for %d seconds\n",iOff); - // Now need to turn off for between 11 and 14 seconds to reset light. - send_cmd(code); - delay(iOff * seconds); - - // Now light is reset, pulse the appropiate number of times to advance program. - LOG(ALLB_LOG, LOG_INFO, "Light Programming button pulsing on/off %d times\n", val); - - // Program light in safe mode (slowley), or quick mode - if (pmode > 0) { - for (i = 1; i < (val * 2); i++) { - LOG(ALLB_LOG, LOG_INFO, "Light Programming button press number %d - %s of %d\n", i, i % 2 == 0 ? "Off" : "On", val); - send_cmd(code); - waitfor_queue2empty(); - delay(pmode * seconds); // 0.3 works, but using 0.4 to be safe - } - } else { - for (i = 1; i < val; i++) { - const int dt = 0.5; // Time to wait after receiving conformation of light on/off - LOG(ALLB_LOG, LOG_INFO, "Light Programming button press number %d - %s of %d\n", i, "ON", val); - send_cmd(code); - waitForButtonState(aq_data, button, ON, 2); - delay(dt * seconds); - LOG(ALLB_LOG, LOG_INFO, "Light Programming button press number %d - %s of %d\n", i, "OFF", val); - send_cmd(code); - waitForButtonState(aq_data, button, OFF, 2); - delay(dt * seconds); - } - LOG(ALLB_LOG, LOG_INFO, "Finished - Light Programming button press number %d - %s of %d\n", i, "ON", val); - send_cmd(code); - waitfor_queue2empty(); - } - //waitForButtonState(aq_data, &aq_data->aqbuttons[btn], ON, 2); - - cleanAndTerminateThread(threadCtrl); - - // just stop compiler error, ptr is not valid as it's just been freed - return ptr; -} -void *set_aqualink_pool_heater_temps( void *ptr ) -{ - struct programmingThreadCtrl *threadCtrl; - threadCtrl = (struct programmingThreadCtrl *) ptr; - struct aqualinkdata *aq_data = threadCtrl->aq_data; - char *name; - char *menu_name; - waitForSingleThreadOrTerminate(threadCtrl, AQ_SET_POOL_HEATER_TEMP); - - int val = atoi((char*)threadCtrl->thread_args); - /* - if (val > HEATER_MAX) { - val = HEATER_MAX; - } else if ( val < MEATER_MIN) { - val = MEATER_MIN; - } - */ - val = setpoint_check(POOL_HTR_SETOINT, val, aq_data); - -#ifdef AQ_PDA - if (isPDA_PANEL) { - set_PDA_aqualink_heater_setpoint(aq_data, val, true); - cleanAndTerminateThread(threadCtrl); - return ptr; - } -#endif - - // NSF IF in TEMP1 / TEMP2 mode, we need C range of 1 to 40 is 2 to 40 for TEMP1, 1 to 39 TEMP2 - if (isSINGLE_DEV_PANEL){ - name = "TEMP1"; - menu_name = "SET TEMP1"; - } else { - name = "POOL"; - menu_name = "SET POOL TEMP"; - } - - LOG(ALLB_LOG, LOG_DEBUG, "Setting pool heater setpoint to %d\n", val); - //setAqualinkTemp(aq_data, "SET TEMP", "SET POOL TEMP", NULL, "POOL", val); - - if ( select_menu_item(aq_data, "SET TEMP") != true ) { - LOG(ALLB_LOG, LOG_WARNING, "Could not select SET TEMP menu\n"); - LOG(ALLB_LOG, LOG_ERR, "%s failed\n", ptypeName( aq_data->active_thread.ptype ) ); - cancel_menu(); - cleanAndTerminateThread(threadCtrl); - return ptr; - } - - //if (select_sub_menu_item(aq_data, "SET POOL TEMP") != true) { - if (select_sub_menu_item(aq_data, menu_name) != true) { - LOG(ALLB_LOG, LOG_WARNING, "Could not select SET POOL TEMP menu\n"); - LOG(ALLB_LOG, LOG_ERR, "%s failed\n", ptypeName( aq_data->active_thread.ptype ) ); - cancel_menu(); - cleanAndTerminateThread(threadCtrl); - return ptr; - } - - if (isSINGLE_DEV_PANEL){ - // Need to get pass this message 'TEMP1 MUST BE SET HIGHER THAN TEMP2' - // and get this message 'TEMP1 20�C ~*' - // Before going to numeric field. - waitForMessage(threadCtrl->aq_data, "MUST BE SET", 5); - send_cmd(KEY_LEFT); - while (stristr(aq_data->last_message, "MUST BE SET") != NULL) { - delay(500); - } - } - - //setAqualinkNumericField(aq_data, "POOL", val); - setAqualinkNumericField(aq_data, name, val); - - // usually miss this message, not sure why, but wait anyway to make sure programming has ended - waitForMessage(threadCtrl->aq_data, "POOL TEMP IS SET TO", 1); - cleanAndTerminateThread(threadCtrl); - - // just stop compiler error, ptr is not valid as it's just been freed - return ptr; -} -void *set_aqualink_spa_heater_temps( void *ptr ) -{ - struct programmingThreadCtrl *threadCtrl; - threadCtrl = (struct programmingThreadCtrl *) ptr; - struct aqualinkdata *aq_data = threadCtrl->aq_data; - - waitForSingleThreadOrTerminate(threadCtrl, AQ_SET_SPA_HEATER_TEMP); - - int val = atoi((char*)threadCtrl->thread_args); - char *name; - char *menu_name; - /* - if (val > HEATER_MAX) { - val = HEATER_MAX; - } else if ( val < MEATER_MIN) { - val = MEATER_MIN; - }*/ - val = setpoint_check(SPA_HTR_SETOINT, val, aq_data); - -#ifdef AQ_PDA - if (isPDA_PANEL) { - set_PDA_aqualink_heater_setpoint(aq_data, val, false); - cleanAndTerminateThread(threadCtrl); - return ptr; - } -#endif - // NSF IF in TEMP1 / TEMP2 mode, we need C range of 1 to 40 is 2 to 40 for TEMP1, 1 to 39 TEMP2 - - if (isSINGLE_DEV_PANEL){ - name = "TEMP2"; - menu_name = "SET TEMP2"; - } else { - name = "SPA"; - menu_name = "SET SPA TEMP"; - } - - LOG(ALLB_LOG, LOG_DEBUG, "Setting spa heater setpoint to %d\n", val); - - //setAqualinkTemp(aq_data, "SET TEMP", "SET SPA TEMP", NULL, "SPA", val); - if ( select_menu_item(aq_data, "SET TEMP") != true ) { - LOG(ALLB_LOG, LOG_WARNING, "Could not select SET TEMP menu\n"); - LOG(ALLB_LOG, LOG_ERR, "%s failed\n", ptypeName( aq_data->active_thread.ptype ) ); - cancel_menu(); - cleanAndTerminateThread(threadCtrl); - return ptr; - } - - //if (select_sub_menu_item(aq_data, "SET SPA TEMP") != true) { - if (select_sub_menu_item(aq_data, menu_name) != true) { - LOG(ALLB_LOG, LOG_WARNING, "Could not select SET SPA TEMP menu\n"); - LOG(ALLB_LOG, LOG_ERR, "%s failed\n", ptypeName( aq_data->active_thread.ptype ) ); - cancel_menu(); - cleanAndTerminateThread(threadCtrl); - return ptr; - } - - if (isSINGLE_DEV_PANEL){ - // Need to get pass this message 'TEMP2 MUST BE SET LOWER THAN TEMP1' - // and get this message 'TEMP2 20�C ~*' - // Before going to numeric field. - waitForMessage(threadCtrl->aq_data, "MUST BE SET", 5); - send_cmd(KEY_LEFT); - while (stristr(aq_data->last_message, "MUST BE SET") != NULL) { - delay(500); - } - } - - //setAqualinkNumericField(aq_data, "SPA", val); - setAqualinkNumericField(aq_data, name, val); - - // usually miss this message, not sure why, but wait anyway to make sure programming has ended - waitForMessage(threadCtrl->aq_data, "SPA TEMP IS SET TO", 1); - cleanAndTerminateThread(threadCtrl); - - // just stop compiler error, ptr is not valid as it's just been freed - return ptr; -} - -void *set_aqualink_freeze_heater_temps( void *ptr ) -{ - struct programmingThreadCtrl *threadCtrl; - threadCtrl = (struct programmingThreadCtrl *) ptr; - struct aqualinkdata *aq_data = threadCtrl->aq_data; - - waitForSingleThreadOrTerminate(threadCtrl, AQ_SET_FRZ_PROTECTION_TEMP); - - int val = atoi((char*)threadCtrl->thread_args); - /* - if (val > FREEZE_PT_MAX) { - val = FREEZE_PT_MAX; - } else if ( val < FREEZE_PT_MIN) { - val = FREEZE_PT_MIN; - } - */ - val = setpoint_check(FREEZE_SETPOINT, val, aq_data); - - LOG(ALLB_LOG, LOG_DEBUG, "Setting sfreeze protection to %d\n", val); - -#ifdef AQ_PDA - if (isPDA_PANEL) { - set_PDA_aqualink_freezeprotect_setpoint(aq_data, val); - cleanAndTerminateThread(threadCtrl); - return ptr; - } -#endif - //setAqualinkTemp(aq_data, "SYSTEM SETUP", "FRZ PROTECT", "TEMP SETTING", "FRZ", val); - if ( select_menu_item(aq_data, "SYSTEM SETUP") != true ) { - LOG(ALLB_LOG, LOG_WARNING, "Could not select SYSTEM SETUP menu\n"); - LOG(ALLB_LOG, LOG_ERR, "%s failed\n", ptypeName( aq_data->active_thread.ptype ) ); - cancel_menu(); - cleanAndTerminateThread(threadCtrl); - return ptr; - } - - if (select_sub_menu_item(aq_data, "FRZ PROTECT") != true) { - LOG(ALLB_LOG, LOG_WARNING, "Could not select FRZ PROTECT menu\n"); - LOG(ALLB_LOG, LOG_ERR, "%s failed\n", ptypeName( aq_data->active_thread.ptype ) ); - cancel_menu(); - cleanAndTerminateThread(threadCtrl); - return ptr; - } - - if (select_sub_menu_item(aq_data, "TEMP SETTING") != true) { - LOG(ALLB_LOG, LOG_WARNING, "Could not select TEMP SETTING menu\n"); - LOG(ALLB_LOG, LOG_ERR, "%s failed\n", ptypeName( aq_data->active_thread.ptype ) ); - cancel_menu(); - cleanAndTerminateThread(threadCtrl); - return ptr; - } - - setAqualinkNumericField(aq_data, "FRZ", val); - - waitForMessage(threadCtrl->aq_data, "FREEZE PROTECTION IS SET TO", 3); - cleanAndTerminateThread(threadCtrl); - - // just stop compiler error, ptr is not valid as it's just been freed - return ptr; -} - -void *set_aqualink_time( void *ptr ) -{ - struct programmingThreadCtrl *threadCtrl; - threadCtrl = (struct programmingThreadCtrl *) ptr; - struct aqualinkdata *aq_data = threadCtrl->aq_data; - - waitForSingleThreadOrTerminate(threadCtrl, AQ_SET_TIME); - //LOG(ALLB_LOG, LOG_NOTICE, "Setting time on aqualink\n"); - -#ifdef AQ_PDA - if (isPDA_PANEL) { - set_PDA_aqualink_time(aq_data); - cleanAndTerminateThread(threadCtrl); - return ptr; - } -#endif - - time_t now = time(0); // get time now - struct tm *result = localtime(&now); - char hour[20]; - - // Add 10 seconds to time since this can take a while to program. - // 10 to 20 seconds whould be right, but since there are no seconds we can set, add 30 seconds to get close to minute. - // Should probably set this to program the next minute then wait before hitting the final enter command. - result->tm_sec += 30; - mktime(result); - - if (result->tm_hour == 0) - sprintf(hour, "HOUR 12 AM"); - else if (result->tm_hour <= 11) - sprintf(hour, "HOUR %d AM", result->tm_hour); // Need to fix compiler warning on new GCC, but %2d or %.2d does NOT give correct string - else if (result->tm_hour == 12) - sprintf(hour, "HOUR 12 PM"); - else // Must be 13 or more - sprintf(hour, "HOUR %d PM", result->tm_hour - 12); - - - LOG(ALLB_LOG, LOG_DEBUG, "Setting time to %d/%d/%d %d:%d\n", result->tm_mon + 1, result->tm_mday, result->tm_year + 1900, result->tm_hour + 1, result->tm_min); - - if ( select_menu_item(aq_data, "SET TIME") != true ) { - LOG(ALLB_LOG, LOG_WARNING, "Could not select SET TIME menu\n"); - LOG(ALLB_LOG, LOG_ERR, "%s failed\n", ptypeName( aq_data->active_thread.ptype ) ); - cancel_menu(); - cleanAndTerminateThread(threadCtrl); - return ptr; - } - - setAqualinkNumericField(aq_data, "YEAR", result->tm_year + 1900); - setAqualinkNumericField(aq_data, "MONTH", result->tm_mon + 1); - setAqualinkNumericField(aq_data, "DAY", result->tm_mday); - //setAqualinkNumericFieldExtra(aq_data, "HOUR", 11, "PM"); - select_sub_menu_item(aq_data, hour); // This will keep looping until it finds the right message - setAqualinkNumericField(aq_data, "MINUTE", result->tm_min); - - send_cmd(KEY_ENTER); - - cleanAndTerminateThread(threadCtrl); - - // just stop compiler error, ptr is not valid as it's just been freed - return ptr; -} - -void *get_aqualink_diag_model( void *ptr ) -{ - struct programmingThreadCtrl *threadCtrl; - threadCtrl = (struct programmingThreadCtrl *) ptr; - struct aqualinkdata *aq_data = threadCtrl->aq_data; - - waitForSingleThreadOrTerminate(threadCtrl, AQ_GET_DIAGNOSTICS_MODEL); - - if ( select_menu_item(aq_data, "SYSTEM SETUP") != true ) { - LOG(ALLB_LOG, LOG_WARNING, "Could not select HELP menu\n"); - LOG(ALLB_LOG, LOG_ERR, "%s failed\n", ptypeName( aq_data->active_thread.ptype ) ); - cancel_menu(); - cleanAndTerminateThread(threadCtrl); - return ptr; - } - - if (select_sub_menu_item(aq_data, "DIAGNOSTICS") != true) { - LOG(ALLB_LOG, LOG_WARNING, "Could not select DIAGNOSTICS menu\n"); - LOG(ALLB_LOG, LOG_ERR, "%s failed\n", ptypeName( aq_data->active_thread.ptype ) ); - cancel_menu(); - cleanAndTerminateThread(threadCtrl); - return ptr; - } - - waitForMessage(aq_data, NULL, 8); // Receive 8 messages - //8157 REV MMM | BATTERY OK | Cal: -27 0 6 | CONTROL PANEL #1 | CONTROL PANEL #3 | WATER SENSOR OK | AIR SENSOR OK | SOLAR SENSOR OPENED - cleanAndTerminateThread(threadCtrl); - - // just stop compiler error, ptr is not valid as it's just been freed - return ptr; -} - -void *get_aqualink_pool_spa_heater_temps( void *ptr ) -{ -//LOG(ALLB_LOG, LOG_DEBUG, "Could not select TEMP SET menu\n"); - struct programmingThreadCtrl *threadCtrl; - threadCtrl = (struct programmingThreadCtrl *) ptr; - struct aqualinkdata *aq_data = threadCtrl->aq_data; - - waitForSingleThreadOrTerminate(threadCtrl, AQ_GET_POOL_SPA_HEATER_TEMPS); - //LOG(ALLB_LOG, LOG_NOTICE, "Getting pool & spa heat setpoints from aqualink\n"); - -#ifdef AQ_PDA - if (isPDA_PANEL) { - if (!get_PDA_aqualink_pool_spa_heater_temps(aq_data)) { - LOG(ALLB_LOG, LOG_ERR, "Error Getting PDA pool & spa heater setpoints\n"); - } - cleanAndTerminateThread(threadCtrl); - return ptr; - } -#endif - - if ( select_menu_item(aq_data, "REVIEW") != true ) { - LOG(ALLB_LOG, LOG_WARNING, "Could not select REVIEW menu\n"); - LOG(ALLB_LOG, LOG_ERR, "Can't get heater setpoints from Control Panel\n"); - cancel_menu(); - cleanAndTerminateThread(threadCtrl); - return ptr; - } - - if (select_sub_menu_item(aq_data, "TEMP SET") != true) { - LOG(ALLB_LOG, LOG_WARNING, "Could not select TEMP SET menu\n"); - LOG(ALLB_LOG, LOG_ERR, "Can't get heater setpoints from Control Panel\n"); - cancel_menu(); - cleanAndTerminateThread(threadCtrl); - return ptr; - } - - // Should receive 'POOL TEMP IS SET TO xx' then 'SPA TEMP IS SET TO xx' then 'MAINTAIN TEMP IS (OFF|ON)' - // wait for the last message - waitForMessage(threadCtrl->aq_data, "MAINTAIN TEMP IS", 5); - - //cancel_menu(threadCtrl->aq_data); - cleanAndTerminateThread(threadCtrl); - - // just stop compiler error, ptr is not valid as it's just been freed - return ptr; -} - -void *get_freeze_protect_temp( void *ptr ) -{ - struct programmingThreadCtrl *threadCtrl; - threadCtrl = (struct programmingThreadCtrl *) ptr; - struct aqualinkdata *aq_data = threadCtrl->aq_data; - - waitForSingleThreadOrTerminate(threadCtrl, AQ_GET_FREEZE_PROTECT_TEMP); - //LOG(ALLB_LOG, LOG_NOTICE, "Getting freeze protection setpoints\n"); - -#ifdef AQ_PDA - if (isPDA_PANEL) { - if (! get_PDA_freeze_protect_temp(aq_data)) { - LOG(ALLB_LOG, LOG_ERR, "Error Getting PDA freeze protection setpoints\n"); - } - cleanAndTerminateThread(threadCtrl); - return ptr; - } -#endif - - if ( select_menu_item(aq_data, "REVIEW") != true ) { - LOG(ALLB_LOG, LOG_WARNING, "Could not select REVIEW menu\n"); - LOG(ALLB_LOG, LOG_ERR, "Can't get freeze setpoints from Control Panel\n"); - cancel_menu(); - cleanAndTerminateThread(threadCtrl); - return ptr; - } - - if (select_sub_menu_item(aq_data, "FRZ PROTECT") != true) { - LOG(ALLB_LOG, LOG_WARNING, "Could not select FRZ PROTECT menu\n"); - LOG(ALLB_LOG, LOG_ERR, "Can't get freeze setpoints from Control Panel\n"); - cancel_menu(); - cleanAndTerminateThread(threadCtrl); - return ptr; - } - - waitForMessage(aq_data, "FREEZE PROTECTION IS SET TO", 6); // Changed from 3 to wait for multiple items to be listed - //cancel_menu(aq_data); - cleanAndTerminateThread(threadCtrl); - - // just stop compiler error, ptr is not valid as it's just been freed - return ptr; -} - -bool get_aqualink_program_for_button(struct aqualinkdata *aq_data, unsigned char cmd) -{ - int rtnStringsWait = 7; - - if (! waitForMessage(aq_data, "SELECT DEVICE TO REVIEW or PRESS ENTER TO END", rtnStringsWait)) - return false; - - LOG(ALLB_LOG, LOG_DEBUG, "Send key '%d'\n",cmd); - send_cmd(cmd); - return waitForEitherMessage(aq_data, "NOT SET", "TURNS ON", rtnStringsWait); -} - -void *get_aqualink_programs( void *ptr ) -{ - struct programmingThreadCtrl *threadCtrl; - threadCtrl = (struct programmingThreadCtrl *) ptr; - struct aqualinkdata *aq_data = threadCtrl->aq_data; - char keys[10] = {KEY_PUMP, KEY_SPA, KEY_AUX1, KEY_AUX2, KEY_AUX3, KEY_AUX4, KEY_AUX5}; // KEY_AUX6 & KEY_AUX7 kill programming mode - - waitForSingleThreadOrTerminate(threadCtrl, AQ_GET_PROGRAMS); - - if ( select_menu_item(aq_data, "REVIEW") != true ) { - //LOG(ALLB_LOG, LOG_WARNING, "Could not select REVIEW menu\n"); - cancel_menu(); - cleanAndTerminateThread(threadCtrl); - return ptr; - } - - if (select_sub_menu_item(aq_data, "PROGRAMS") != true) { - //LOG(ALLB_LOG, LOG_WARNING, "Could not select PROGRAMS menu\n"); - cancel_menu(); - cleanAndTerminateThread(threadCtrl); - return ptr; - } - - unsigned int i; - - for (i=0; i < strlen(keys); i++) { - //LOG(ALLB_LOG, LOG_DEBUG, "**** START program for key in loop %d\n",i); - if (! get_aqualink_program_for_button(aq_data, keys[i])) { - //LOG(ALLB_LOG, LOG_DEBUG, "**** Didn't find program for key in loop %d\n",i); - //cancel_menu(aq_data); - cleanAndTerminateThread(threadCtrl); - return ptr; - } - //LOG(ALLB_LOG, LOG_DEBUG, "**** Found program for key in loop %d\n",i); - } - - - if (waitForMessage(aq_data, "SELECT DEVICE TO REVIEW or PRESS ENTER TO END", 6)) { - //LOG(ALLB_LOG, LOG_DEBUG, "Send key ENTER\n"); - send_cmd(KEY_ENTER); - } else { - //LOG(ALLB_LOG, LOG_DEBUG, "Send CANCEL\n"); - cancel_menu(); - } - - //cancel_menu(aq_data); - cleanAndTerminateThread(threadCtrl); - - // just stop compiler error, ptr is not valid as it's just been freed - return ptr; -} - -/* -void send_cmd(unsigned char cmd, struct aqualinkdata *aq_data) -{ - push_aq_cmd(cmd); - LOG(ALLB_LOG, LOG_INFO, "Queue send '0x%02hhx' to controller\n", cmd); -} -*/ - - - -void _waitfor_queue2empty(bool longwait) -{ - int i=0; - - if (_pgm_command != NUL) { - LOG(ALLB_LOG, LOG_DEBUG, "Waiting for queue to empty\n"); - } else { - LOG(ALLB_LOG, LOG_DEBUG, "Queue empty!\n"); - return; - } - - while ( (_pgm_command != NUL) && ( i++ < (PROGRAMMING_POLL_COUNTER*(longwait?2:1) ) ) ) { - delay(PROGRAMMING_POLL_DELAY_TIME); - } - -/* - //while ( (_pgm_command != NUL) && ( i++ < (30*(longwait?2:1) ) ) ) { - while ( (_pgm_command != NUL) && ( i++ < (50*(longwait?2:1) ) ) ) { - //sleep(1); // NSF Change to smaller time. - //LOG(ALLB_LOG, LOG_DEBUG, "******** QUEUE IS FULL ******** delay\n"); - delay(50); - } -*/ - if (_pgm_command != NUL) { - #ifdef AQ_PDA - if (isPDA_PANEL) { - // Wait for longer in PDA mode since it's slower. - while ( (_pgm_command != NUL) && ( i++ < (150*(longwait?2:1)) ) ) { - delay(100); - } - } - #endif - LOG(ALLB_LOG, LOG_WARNING, "Send command Queue did not empty, timeout\n"); - } else { - LOG(ALLB_LOG, LOG_DEBUG, "Queue now empty!\n"); - } - -} - -void waitfor_queue2empty() -{ - _waitfor_queue2empty(false); -} -void longwaitfor_queue2empty() -{ - _waitfor_queue2empty(true); -} - -void send_cmd(unsigned char cmd) -{ - waitfor_queue2empty(); - - _pgm_command = cmd; - //delay(200); - - LOG(ALLB_LOG, LOG_INFO, "Queue send '0x%02hhx' to controller (programming)\n", _pgm_command); -} -void force_queue_delete() -{ - if (_pgm_command != NUL) - LOG(ALLB_LOG, LOG_INFO, "Really bad coding, don't use this in release\n"); - - _pgm_command = NUL; -} - -/* -void send_cmd(unsigned char cmd, struct aqualinkdata *aq_data) -{ - int i=0; - // If there is an unsent command, wait. - while ( (aq_data->aq_command != NUL) && ( i++ < 10) ) { - //sleep(1); // NSF Change to smaller time. - delay(500); - } - - aq_data->aq_command = cmd; - //delay(200); - - LOG(ALLB_LOG, LOG_INFO, "Queue send '0x%02hhx' to controller\n", aq_data->aq_command); -} -*/ - -void cancel_menu() -{ - send_cmd(KEY_CANCEL); -} - -/* -* added functionality, if start of string is ^ use that as must start with in comparison -*/ - -bool waitForEitherMessage(struct aqualinkdata *aq_data, char* message1, char* message2, int numMessageReceived) -{ - //LOG(ALLB_LOG, LOG_DEBUG, "waitForMessage %s %d %d\n",message,numMessageReceived,cmd); - waitfor_queue2empty(); // MAke sure the last command was sent - int i=0; - pthread_mutex_lock(&aq_data->active_thread.thread_mutex); - char* msgS1 = ""; - char* msgS2 = ""; - char* ptr = NULL; - - - if (message1 != NULL) { - if (message1[0] == '^') - msgS1 = &message1[1]; - else - msgS1 = message1; - } - if (message2 != NULL) { - if (message2[0] == '^') - msgS2 = &message2[1]; - else - msgS2 = message2; - } - - while( ++i <= numMessageReceived) - { - LOG(ALLB_LOG, LOG_DEBUG, "loop %d of %d looking for '%s' OR '%s' received message1 '%s'\n",i,numMessageReceived,message1,message2,aq_data->last_message); - - if (message1 != NULL) { - ptr = stristr(aq_data->last_message, msgS1); - if (ptr != NULL) { // match - LOG(ALLB_LOG, LOG_DEBUG, "String MATCH '%s'\n", msgS1); - if (msgS1 == message1) // match & don't care if first char - break; - else if (ptr == aq_data->last_message) // match & do care if first char - break; - } - } - if (message2 != NULL) { - ptr = stristr(aq_data->last_message, msgS2); - if (ptr != NULL) { // match - LOG(ALLB_LOG, LOG_DEBUG, "String MATCH '%s'\n", msgS2); - if (msgS2 == message2) // match & don't care if first char - break; - else if (ptr == aq_data->last_message) // match & do care if first char - break; - } - } - - //LOG(ALLB_LOG, LOG_DEBUG, "looking for '%s' received message1 '%s'\n",message1,aq_data->last_message); - pthread_cond_wait(&aq_data->active_thread.thread_cond, &aq_data->active_thread.thread_mutex); - //LOG(ALLB_LOG, LOG_DEBUG, "loop %d of %d looking for '%s' received message1 '%s'\n",i,numMessageReceived,message1,aq_data->last_message); - } - - pthread_mutex_unlock(&aq_data->active_thread.thread_mutex); - - if (message1 != NULL && message2 != NULL && ptr == NULL) { - //logmessage1(LOG_ERR, "Could not select MENU of Aqualink control panel\n"); - LOG(ALLB_LOG, LOG_ERR, "Did not find '%s'\n",message1); - return false; - } - LOG(ALLB_LOG, LOG_DEBUG, "Found message1 '%s' or '%s' in '%s'\n",message1,message2,aq_data->last_message); - - return true; -} - - - -bool waitForMessage(struct aqualinkdata *aq_data, char* message, int numMessageReceived) -{ - LOG(ALLB_LOG, LOG_DEBUG, "waitForMessage %s %d\n",message,numMessageReceived); - // NSF Need to come back to this, as it stops on test enviornment but not real panel, so must be speed related. - //waitfor_queue2empty(); // MAke sure the last command was sent - - int i=0; - pthread_mutex_lock(&aq_data->active_thread.thread_mutex); - char* msgS; - char* ptr = NULL; - - if (message != NULL) { - if (message[0] == '^') - msgS = &message[1]; - else - msgS = message; - } - - while( ++i <= numMessageReceived) - { - if (message != NULL) - LOG(ALLB_LOG, LOG_DEBUG, "loop %d of %d looking for '%s', last message received '%s'\n",i,numMessageReceived,message,aq_data->last_message); - else - LOG(ALLB_LOG, LOG_DEBUG, "loop %d of %d waiting for next message, last message received '%s'\n",i,numMessageReceived,aq_data->last_message); - - if (message != NULL) { - ptr = stristr(aq_data->last_message, msgS); - if (ptr != NULL) { // match - LOG(ALLB_LOG, LOG_DEBUG, "String MATCH\n"); - if (msgS == message) // match & don't care if first char - break; - else if (ptr == aq_data->last_message) // match & do care if first char - break; - } - } - - //LOG(ALLB_LOG, LOG_DEBUG, "looking for '%s' received message '%s'\n",message,aq_data->last_message); - //LOG(ALLB_LOG, LOG_DEBUG, "*** pthread_cond_wait() sleep\n"); - pthread_cond_wait(&aq_data->active_thread.thread_cond, &aq_data->active_thread.thread_mutex); - //LOG(ALLB_LOG, LOG_DEBUG, "*** pthread_cond_wait() wake\n"); - //LOG(ALLB_LOG, LOG_DEBUG, "loop %d of %d looking for '%s' received message '%s'\n",i,numMessageReceived,message,aq_data->last_message); - } - - pthread_mutex_unlock(&aq_data->active_thread.thread_mutex); - - if (message != NULL && ptr == NULL) { - //LOG(ALLB_LOG, LOG_ERR, "Could not select MENU of Aqualink control panel\n"); - LOG(ALLB_LOG, LOG_DEBUG, "did not find '%s'\n",message); - return false; - } else if (message != NULL) - LOG(ALLB_LOG, LOG_DEBUG, "found message '%s' in '%s'\n",message,aq_data->last_message); - else - LOG(ALLB_LOG, LOG_DEBUG, "waited for %d message(s)\n",numMessageReceived); - - return true; -} - -bool select_menu_item(struct aqualinkdata *aq_data, char* item_string) -{ - char* expectedMsg = "PRESS ENTER* TO SELECT"; - //char* expectedMsg = "PROGRAM"; - int wait_messages = 5; - bool found = false; - int tries = 0; - // Select the MENU and wait to get the RS8 respond. - - while (found == false && tries <= 3) { - send_cmd(KEY_MENU); - found = waitForMessage(aq_data, expectedMsg, wait_messages); - tries++; - } - - if (found == false) - return false; - - // NSF This isn't needed and seems to cause issue on some controllers. - //send_cmd(KEY_ENTER, aq_data); - //waitForMessage(aq_data, NULL, 1); - - return select_sub_menu_item(aq_data, item_string); -} -/* -bool select_menu_item(struct aqualinkdata *aq_data, char* item_string) -{ - char* expectedMsg = "PRESS ENTER* TO SELECT"; - int wait_messages = 6; - //int i=0; - - // Select the MENU and wait to get the RS8 respond. - send_cmd(KEY_MENU, aq_data); - - if (waitForMessage(aq_data, expectedMsg, wait_messages) == false) - return false; - - send_cmd(KEY_ENTER, aq_data); - waitForMessage(aq_data, NULL, 1); - - // Blindly wait for next message - //sendCmdWaitForReturn(aq_data, KEY_ENTER); - // Can't determin the first response - //delay(500); - - return select_sub_menu_item(aq_data, item_string); -} -*/ - -//bool select_sub_menu_item(char* item_string, struct aqualinkdata *aq_data) -bool select_sub_menu_item(struct aqualinkdata *aq_data, char* item_string) -{ - int wait_messages = 28; - int i=0; - - waitfor_queue2empty(); - - while( (stristr(aq_data->last_message, item_string) == NULL) && ( i++ < wait_messages) ) - { - LOG(ALLB_LOG, LOG_DEBUG, "Find item in Menu: loop %d of %d looking for '%s' received message '%s'\n",i,wait_messages,item_string,aq_data->last_message); - send_cmd(KEY_RIGHT); - waitfor_queue2empty(); // ADDED BACK MAY 2023 setting time warked better - //waitForMessage(aq_data, NULL, 1); - waitForMessage(aq_data, item_string, 1); - } - - if (stristr(aq_data->last_message, item_string) == NULL) { - LOG(ALLB_LOG, LOG_ERR, "Could not find menu item '%s'\n",item_string); - return false; - } - - LOG(ALLB_LOG, LOG_DEBUG, "Find item in Menu: loop %d of %d FOUND menu item '%s', sending ENTER command\n",i,wait_messages, item_string); - // Enter the mode specified by the argument. - - - send_cmd(KEY_ENTER); - - - waitForMessage(aq_data, NULL, 1); - - - //sendCmdWaitForReturn(aq_data, KEY_ENTER); - - return true; - -} - -// NSF Need to test this, then use it for the color change mode. - -bool waitForButtonState(struct aqualinkdata *aq_data, aqkey* button, aqledstate state, int numMessageReceived) -{ - //LOG(ALLB_LOG, LOG_DEBUG, "waitForMessage %s %d %d\n",message,numMessageReceived,cmd); - int i=0; - pthread_mutex_lock(&aq_data->active_thread.thread_mutex); - - while( ++i <= numMessageReceived) - { - LOG(ALLB_LOG, LOG_DEBUG, "loop %d of %d looking for state change to '%d' for '%s' \n",i,numMessageReceived,button->led->state,button->name); - - if (button->led->state == state) { - LOG(ALLB_LOG, LOG_INFO, "Button State =%d for %s\n",state,button->name); - break; - } - - //LOG(ALLB_LOG, LOG_DEBUG, "looking for '%s' received message '%s'\n",message,aq_data->last_message); - pthread_cond_wait(&aq_data->active_thread.thread_cond, &aq_data->active_thread.thread_mutex); - //LOG(ALLB_LOG, LOG_DEBUG, "loop %d of %d looking for '%s' received message '%s'\n",i,numMessageReceived,message,aq_data->last_message); - } - - pthread_mutex_unlock(&aq_data->active_thread.thread_mutex); - - if (numMessageReceived >= i) { - //LOG(ALLB_LOG, LOG_ERR, "Could not select MENU of Aqualink control panel\n"); - LOG(ALLB_LOG, LOG_DEBUG, "did not find state '%d' for '%s'\n",button->led->state,button->name); - return false; - } - LOG(ALLB_LOG, LOG_DEBUG, "found state '%d' for '%s'\n",button->led->state,button->name); - - return true; -} - -const char *ptypeName(program_type type) -{ - switch (type) { - case AQ_GET_POOL_SPA_HEATER_TEMPS: - return "Get Heater setpoints"; - break; + break; + + } + + if ( programmingthread->thread_id != 0 ) { + //LOG(PROG_LOG, LOG_DEBUG, "********* DID pthread_detach %d\n",programmingthread->thread_id); + pthread_detach(programmingthread->thread_id); + } else { + //LOG(PROG_LOG, LOG_DEBUG, "********* DID NOT pthread_detach\n"); + } +} + + +void waitForSingleThreadOrTerminate(struct programmingThreadCtrl *threadCtrl, program_type type) +{ + //static int tries = 120; + int tries = 120; + static int waitTime = 1; + int i=0; +/* + i = 0; + while (get_aq_cmd_length() > 0 && ( i++ <= tries) ) { + LOG(PROG_LOG, LOG_DEBUG, "Thread %p (%s) sleeping, waiting command queue to empty\n", &threadCtrl->thread_id, ptypeName(type)); + sleep(waitTime); + } + if (i >= tries) { + LOG(PROG_LOG, LOG_ERR, "Thread %p (%s) timeout waiting, ending\n",&threadCtrl->thread_id,ptypeName(type)); + free(threadCtrl); + pthread_exit(0); + } +*/ + while ( (threadCtrl->aq_data->active_thread.thread_id != 0) && ( i++ <= tries) ) { + //LOG(PROG_LOG, LOG_DEBUG, "Thread %d sleeping, waiting for thread %d to finish\n", threadCtrl->thread_id, threadCtrl->aq_data->active_thread.thread_id); + LOG(PROG_LOG, LOG_DEBUG, "Thread %p (%s) sleeping, waiting for thread %p (%s) to finish\n", + &threadCtrl->thread_id, ptypeName(type), + threadCtrl->aq_data->active_thread.thread_id, ptypeName(threadCtrl->aq_data->active_thread.ptype)); + sleep(waitTime); + } + + if (i >= tries) { + //LOG(PROG_LOG, LOG_ERR, "Thread %d timeout waiting, ending\n",threadCtrl->thread_id); + LOG(PROG_LOG, LOG_ERR, "Thread (%s) %p timeout waiting for thread (%s) %p to finish\n", + ptypeName(type), &threadCtrl->thread_id, ptypeName(threadCtrl->aq_data->active_thread.ptype), + threadCtrl->aq_data->active_thread.thread_id); + free(threadCtrl); + pthread_exit(0); + } + + // Clear out any messages to the UI. + threadCtrl->aq_data->last_display_message[0] = '\0'; + threadCtrl->aq_data->active_thread.thread_id = &threadCtrl->thread_id; + threadCtrl->aq_data->active_thread.ptype = type; + + #ifdef AQ_DEBUG + clock_gettime(CLOCK_REALTIME, &threadCtrl->aq_data->start_active_time); + #endif + + LOG(PROG_LOG, LOG_INFO, "Programming: %s, %d\n", ptypeName(threadCtrl->aq_data->active_thread.ptype), threadCtrl->aq_data->active_thread.ptype); + + LOG(PROG_LOG, LOG_DEBUG, "Thread %d,%p is active (%s)\n", + threadCtrl->aq_data->active_thread.ptype, + threadCtrl->aq_data->active_thread.thread_id, + ptypeName(threadCtrl->aq_data->active_thread.ptype)); +} + +void cleanAndTerminateThread(struct programmingThreadCtrl *threadCtrl) +{ + //waitfor_queue2empty(); + #ifndef AQ_DEBUG + LOG(PROG_LOG, LOG_DEBUG, "Thread %d,%p (%s) finished\n",threadCtrl->aq_data->active_thread.ptype, threadCtrl->thread_id,ptypeName(threadCtrl->aq_data->active_thread.ptype)); + #else + struct timespec elapsed; + clock_gettime(CLOCK_REALTIME, &threadCtrl->aq_data->last_active_time); + timespec_subtract(&elapsed, &threadCtrl->aq_data->last_active_time, &threadCtrl->aq_data->start_active_time); + LOG(PROG_LOG, LOG_NOTICE, "Thread %d,%p (%s) finished in %d.%03ld sec\n", + threadCtrl->aq_data->active_thread.ptype, + threadCtrl->aq_data->active_thread.thread_id, + ptypeName(threadCtrl->aq_data->active_thread.ptype), + elapsed.tv_sec, elapsed.tv_nsec / 1000000L); + #endif + + // Quick delay to allow for last message to be sent. + delay(500); + threadCtrl->aq_data->active_thread.thread_id = 0; + threadCtrl->aq_data->active_thread.ptype = AQP_NULL; + threadCtrl->thread_id = 0; + // Force update, change display message + threadCtrl->aq_data->updated = true; + free(threadCtrl); + pthread_exit(0); +} + + + + +const char *ptypeName(program_type type) +{ + switch (type) { + case AQ_GET_POOL_SPA_HEATER_TEMPS: + return "Get Heater setpoints"; + break; case AQ_GET_FREEZE_PROTECT_TEMP: return "Get Freeze protect"; break; @@ -2647,6 +873,33 @@ const char *ptypeName(program_type type) case AQ_PDA_WAKE_INIT: return "PDA init after wake"; break; + case AQ_PDA_SET_BOOST: + return "Set PDA SWG Boost"; + break; + case AQ_PDA_SET_SWG_PERCENT: + return "Set PDA SWG Percent"; + break; + case AQ_PDA_GET_AUX_LABELS: + return "Get PDA Lebels"; + break; + case AQ_PDA_SET_POOL_HEATER_TEMPS: + return "Set PDA Pool Heater"; + break; + case AQ_PDA_SET_SPA_HEATER_TEMPS: + return "Set PDA Spa Heater"; + break; + case AQ_PDA_SET_FREEZE_PROTECT_TEMP: + return "Set PDA Freese protect"; + break; + case AQ_PDA_SET_TIME: + return "Set PDA time"; + break; + case AQ_PDA_GET_POOL_SPA_HEATER_TEMPS: + return "Get PDA heater setpoints"; + break; + case AQ_PDA_GET_FREEZE_PROTECT_TEMP: + return "Get PDA freeze protect"; + break; #endif case AQP_NULL: default: diff --git a/aq_programmer.h b/aq_programmer.h index de93a31a..87d9d60d 100644 --- a/aq_programmer.h +++ b/aq_programmer.h @@ -41,6 +41,7 @@ typedef enum emulation_type{ typedef enum { AQP_NULL = -1, + // ********* Generic Programming options, these are Allbutton by Default AQ_GET_POOL_SPA_HEATER_TEMPS, AQ_GET_FREEZE_PROTECT_TEMP, AQ_SET_TIME, @@ -48,24 +49,30 @@ typedef enum { AQ_SET_SPA_HEATER_TEMP, AQ_SET_FRZ_PROTECTION_TEMP, AQ_GET_DIAGNOSTICS_MODEL, - //AQ_SEND_CMD, AQ_GET_PROGRAMS, AQ_SET_LIGHTPROGRAM_MODE, AQ_SET_LIGHTCOLOR_MODE, AQ_SET_SWG_PERCENT, - AQ_PDA_DEVICE_STATUS, - AQ_PDA_DEVICE_ON_OFF, AQ_GET_AUX_LABELS, AQ_SET_BOOST, AQ_SET_PUMP_RPM, AQ_SET_PUMP_VS_PROGRAM, - // ******** Delimiter make sure to change MAX/MIN below - // NSF Need to add Specific ALL Button ones here - // ******** Delimiter make sure to change MAX/MIN below - // NSF Need to add ALL Specific PDA ones here + // ******** PDA Delimiter make sure to change MAX/MIN below AQ_PDA_INIT, AQ_PDA_WAKE_INIT, - // ******** Delimiter make sure to change MAX/MIN below + AQ_PDA_DEVICE_STATUS, + AQ_PDA_DEVICE_ON_OFF, + AQ_PDA_AUX_LABELS, + AQ_PDA_SET_BOOST, + AQ_PDA_SET_SWG_PERCENT, + AQ_PDA_GET_AUX_LABELS, + AQ_PDA_SET_POOL_HEATER_TEMPS, + AQ_PDA_SET_SPA_HEATER_TEMPS, + AQ_PDA_SET_FREEZE_PROTECT_TEMP, + AQ_PDA_SET_TIME, + AQ_PDA_GET_POOL_SPA_HEATER_TEMPS, + AQ_PDA_GET_FREEZE_PROTECT_TEMP, + // ******** OneTouch Delimiter make sure to change MAX/MIN below AQ_SET_ONETOUCH_PUMP_RPM, AQ_SET_ONETOUCH_MACRO, AQ_GET_ONETOUCH_SETPOINTS, @@ -76,7 +83,7 @@ typedef enum { AQ_SET_ONETOUCH_TIME, AQ_SET_ONETOUCH_BOOST, AQ_SET_ONETOUCH_SWG_PERCENT, - // ******** Delimiter make sure to change MAX/MIN below + // ******** iAqalink Touch Delimiter make sure to change MAX/MIN below AQ_SET_IAQTOUCH_PUMP_RPM, AQ_SET_IAQTOUCH_PUMP_VS_PROGRAM, AQ_GET_IAQTOUCH_VSP_ASSIGNMENT, @@ -91,7 +98,7 @@ typedef enum { AQ_SET_IAQTOUCH_SET_TIME, AQ_SET_IAQTOUCH_DEVICE_ON_OFF, AQ_SET_IAQTOUCH_LIGHTCOLOR_MODE, - // ******** Delimiter make sure to change MAX/MIN below + // ******** RS Serial Adapter Delimiter make sure to change MAX/MIN below AQ_GET_RSSADAPTER_SETPOINTS, AQ_SET_RSSADAPTER_POOL_HEATER_TEMP, AQ_SET_RSSADAPTER_SPA_HEATER_TEMP, @@ -103,11 +110,11 @@ typedef enum { #define AQP_GENERIC_MIN AQ_GET_POOL_SPA_HEATER_TEMPS #define AQP_GENERIC_MAX AQ_SET_PUMP_VS_PROGRAM -#define AQP_ALLBUTTON_MIN AQP_NULL -#define AQP_ALLBUTTONL_MAX AQP_NULL +#define AQP_ALLBUTTON_MIN AQ_GET_POOL_SPA_HEATER_TEMPS +#define AQP_ALLBUTTONL_MAX AQ_SET_BOOST #define AQP_PDA_MIN AQ_PDA_INIT -#define AQP_PDA_MAX AQ_PDA_WAKE_INIT +#define AQP_PDA_MAX AQ_SET_ONETOUCH_SWG_PERCENT #define AQP_ONETOUCH_MIN AQ_SET_ONETOUCH_PUMP_RPM #define AQP_ONETOUCH_MAX AQ_SET_ONETOUCH_SWG_PERCENT @@ -145,10 +152,10 @@ bool in_iaqt_programming_mode(struct aqualinkdata *aq_data); bool in_swg_programming_mode(struct aqualinkdata *aq_data); bool in_light_programming_mode(struct aqualinkdata *aq_data); bool in_allb_programming_mode(struct aqualinkdata *aq_data); -void aq_send_cmd(unsigned char cmd); +//void aq_send_cmd(unsigned char cmd); void queueGetProgramData(emulation_type source_type, struct aqualinkdata *aq_data); //void queueGetExtendedProgramData(emulation_type source_type, struct aqualinkdata *aq_data, bool labels); -unsigned char pop_aq_cmd(struct aqualinkdata *aq_data); +//unsigned char pop_aq_cmd(struct aqualinkdata *aq_data); void waitForSingleThreadOrTerminate(struct programmingThreadCtrl *threadCtrl, program_type type); void cleanAndTerminateThread(struct programmingThreadCtrl *threadCtrl); @@ -164,7 +171,7 @@ void cleanAndTerminateThread(struct programmingThreadCtrl *threadCtrl); //void *set_aqualink_time( void *ptr ); //void *get_aqualink_pool_spa_heater_temps( void *ptr ); -int get_aq_cmd_length(); +//int get_aq_cmd_length(); int setpoint_check(int type, int value, struct aqualinkdata *aqdata); int RPM_check(pump_type type, int value, struct aqualinkdata *aqdata); //int RPM_check(int type, int value, struct aqualinkdata *aqdata); diff --git a/aq_serial.c b/aq_serial.c index 55d5820c..6801106d 100644 --- a/aq_serial.c +++ b/aq_serial.c @@ -61,7 +61,68 @@ static struct timespec last_serial_read_time; void send_packet(int fd, unsigned char *packet, int length); //unsigned char getProtocolType(unsigned char* packet); +emulation_type getJandyDeviceType(unsigned char ID) { + + // Using emulation_type from aqprogrammer. At some point may merge into one + // and call device type + + if (ID >= 0x08 && ID <= 0x0B) + return ALLBUTTON; + if (ID >= 0x40 && ID <= 0x43) + return ONETOUCH; + if (ID >= 0x48 && ID <= 0x4B) + return RSSADAPTER; + if (ID >= 0x60 && ID <= 0x63) + return AQUAPDA; + if (ID >= 0x30 && ID <= 0x33) + return IAQTOUCH; +/* + if (ID >= 0x00 && ID <= 0x03) + return MASTER; + if (ID >= 0x50 && ID <= 0x53) + return SWG; + if (ID >= 0x20 && ID <= 0x23) + return SPA_R; + if (ID >= 0x38 && ID <= 0x3B) + return LX_HEATER; + if (ID >= 0x58 && ID <= 0x5B) + return PC_DOCK; + if (ID >= 0x68 && ID <= 0x6B) + return JXI_HEATER; + //if (ID >= 0x70 && ID <= 0x73) + if (ID >= 0x78 && ID <= 0x7B) + return EPUMP; + if (ID >= 0x80 && ID <= 0x83) + return CHEM; + //if (ID == 0x08) + // return KEYPAD; +*/ + return SIM_NONE; +} + +const char *getJandyDeviceName(emulation_type etype) { + switch(etype){ + case ALLBUTTON: + return "AllButton"; + break; + case ONETOUCH: + return "OneTouch"; + break; + case RSSADAPTER: + return "RS SerialAdapter"; + break; + case IAQTOUCH: + return "iAqualinkTouch"; + break; + case AQUAPDA: + return "PDA"; + break; + default: + return "Unknown"; + break; + } +} const char* get_pentair_packet_type(unsigned char* packet , int length) { diff --git a/aq_serial.h b/aq_serial.h index a2bac42c..bdda06f1 100644 --- a/aq_serial.h +++ b/aq_serial.h @@ -5,6 +5,10 @@ #include #include +#include "aq_programmer.h" // Need this for function getJandyDeviceType due to enum defined their. +emulation_type getJandyDeviceType(unsigned char ID); +const char *getJandyDeviceName(emulation_type etype); + #define CONNECTION_ERROR "ERROR No connection to RS control panel" #ifdef AQ_MANAGER #define CONNECTION_RUNNING_SLOG "Running serial_logger, this will take some time" diff --git a/aq_timer.c b/aq_timer.c index 9f1db6e0..69161cd0 100644 --- a/aq_timer.c +++ b/aq_timer.c @@ -136,9 +136,7 @@ void *timer_worker( void *ptr ) if ((tmthread->button->special_mask & PROGRAM_LIGHT) == PROGRAM_LIGHT && in_light_programming_mode(tmthread->aq_data)) { LOG(TIMR_LOG, LOG_NOTICE, "Not turning on '%s' as programmer is\n",tmthread->button->name); } else { - // crap way to do this, need to use net_service logic in teh future, but should never actually get here LOG(TIMR_LOG, LOG_NOTICE, "turning on '%s'\n",tmthread->button->name); - //aq_send_cmd(tmthread->button->code); panel_device_request(tmthread->aq_data, ON_OFF, tmthread->deviceIndex, false, NET_TIMER); } } @@ -166,15 +164,7 @@ void *timer_worker( void *ptr ) if (tmthread->button->led->state != OFF) { LOG(TIMR_LOG, LOG_INFO, "Timer waking turning '%s' off\n",tmthread->button->name); -/* -#ifdef AQ_PDA - if (isPDA_PANEL) - create_PDA_on_off_request(tmthread->button, false); - else -#endif - aq_send_cmd(tmthread->button->code); -*/ - panel_device_request(tmthread->aq_data, ON_OFF, tmthread->deviceIndex, false, NET_TIMER); + panel_device_request(tmthread->aq_data, ON_OFF, tmthread->deviceIndex, false, NET_TIMER); } else { LOG(TIMR_LOG, LOG_INFO, "Timer waking '%s' is already off\n",tmthread->button->name); } diff --git a/aqualink.h b/aqualink.h index f63e3287..ce8d64a7 100644 --- a/aqualink.h +++ b/aqualink.h @@ -33,7 +33,7 @@ // The below will change state of devices before that are actually set on the control panel, this helps // with duplicate messages that come in quick succession that can catch the state before it happens. -#define PRESTATE_ONOFF +//#define PRESTATE_ONOFF #define PRESTATE_SWG_SETPOINT //#define PRESTATE_HEATER_SETPOINT // This one is not implimented yet diff --git a/aqualinkd.c b/aqualinkd.c index de048e5d..4ccff97a 100644 --- a/aqualinkd.c +++ b/aqualinkd.c @@ -43,6 +43,8 @@ #include "pda_aq_programmer.h" #include "packetLogger.h" #include "devices_jandy.h" +#include "allbutton.h" +#include "allbutton_aq_programmer.h" #include "onetouch.h" #include "onetouch_aq_programmer.h" #include "iaqtouch.h" @@ -125,44 +127,7 @@ void intHandler(int sig_num) #endif } -void processLEDstate() -{ - - int i = 0; - int byte; - int bit; - - for (byte = 0; byte < 5; byte++) - { - for (bit = 0; bit < 8; bit += 2) - { - if (((_aqualink_data.raw_status[byte] >> (bit + 1)) & 1) == 1) - _aqualink_data.aqualinkleds[i].state = FLASH; - else if (((_aqualink_data.raw_status[byte] >> bit) & 1) == 1) - _aqualink_data.aqualinkleds[i].state = ON; - else - _aqualink_data.aqualinkleds[i].state = OFF; - - //LOG(AQUA_LOG,LOG_DEBUG,"Led %d state %d",i+1,_aqualink_data.aqualinkleds[i].state); - i++; - } - } - // Reset enabled state for heaters, as they take 2 led states - if (_aqualink_data.aqualinkleds[POOL_HTR_LED_INDEX - 1].state == OFF && _aqualink_data.aqualinkleds[POOL_HTR_LED_INDEX].state == ON) - _aqualink_data.aqualinkleds[POOL_HTR_LED_INDEX - 1].state = ENABLE; - - if (_aqualink_data.aqualinkleds[SPA_HTR_LED_INDEX - 1].state == OFF && _aqualink_data.aqualinkleds[SPA_HTR_LED_INDEX].state == ON) - _aqualink_data.aqualinkleds[SPA_HTR_LED_INDEX - 1].state = ENABLE; - - if (_aqualink_data.aqualinkleds[SOLAR_HTR_LED_INDEX - 1].state == OFF && _aqualink_data.aqualinkleds[SOLAR_HTR_LED_INDEX].state == ON) - _aqualink_data.aqualinkleds[SOLAR_HTR_LED_INDEX - 1].state = ENABLE; - /* - for (i=0; i < TOTAL_BUTTONS; i++) { - LOG(AQUA_LOG,LOG_NOTICE, "%s = %d", _aqualink_data.aqbuttons[i].name, _aqualink_data.aqualinkleds[i].state); - } -*/ -} - +// Should move to panel. bool checkAqualinkTime() { static time_t last_checked = 0; @@ -270,672 +235,6 @@ bool checkAqualinkTime() } -void setUnits(char *msg) -{ - char buf[AQ_MSGLEN*3]; - - rsm_strncpy(buf, (unsigned char *)msg, AQ_MSGLEN*3, AQ_MSGLONGLEN); - - //ascii(buf, msg); - LOG(AQUA_LOG,LOG_DEBUG, "Getting temp units from message '%s', looking at '%c'\n", buf, buf[strlen(buf) - 1]); - - if (msg[strlen(msg) - 1] == 'F') - _aqualink_data.temp_units = FAHRENHEIT; - else if (msg[strlen(msg) - 1] == 'C') - _aqualink_data.temp_units = CELSIUS; - else - _aqualink_data.temp_units = UNKNOWN; - - LOG(AQUA_LOG,LOG_INFO, "Temp Units set to %d (F=0, C=1, Unknown=2)\n", _aqualink_data.temp_units); -} - -// Defined as int16_t so 16 bits to mask -#define MSG_FREEZE (1 << 0) // 1 -#define MSG_SERVICE (1 << 1) // 1 -#define MSG_SWG (1 << 2) -#define MSG_BOOST (1 << 3) -#define MSG_TIMEOUT (1 << 4) -#define MSG_RS13BUTTON (1 << 5) -#define MSG_RS14BUTTON (1 << 6) -#define MSG_RS15BUTTON (1 << 7) -#define MSG_RS16BUTTON (1 << 8) -#define MSG_BATTERY_LOW (1 << 9) -#define MSG_SWG_DEVICE (1 << 10) -/* -#define SET_FLAG(n, f) ((n) |= (f)) -#define CHK_FLAG(n, f) ((n) & (f)) -*/ -#ifdef AQ_RS16 -int16_t RS16_endswithLEDstate(char *msg) -{ - char *sp; - int i; - aqledstate state = LED_S_UNKNOWN; - - //if (_aqconfig_.rs_panel_size < 16) - if (PANEL_SIZE() < 16) - return false; - - sp = strrchr(msg, ' '); - - if( sp == NULL ) - return false; - - if (strncasecmp(sp, " on", 3) == 0) - state = ON; - else if (strncasecmp(sp, " off", 4) == 0) - state = OFF; - else if (strncasecmp(sp, " enabled", 8) == 0) // Total guess, need to check - state = ENABLE; - else if (strncasecmp(sp, " no idea", 8) == 0) // need to figure out these states - state = FLASH; - - if (state == LED_S_UNKNOWN) - return false; - - // Only need to start at Aux B5->B8 (12-15) - // Loop over only aqdata->aqbuttons[13] to aqdata->aqbuttons[16] - for (i = _aqualink_data.rs16_vbutton_start; i <= _aqualink_data.rs16_vbutton_end; i++) { - //TOTAL_BUTTONS - if ( stristr(msg, _aqualink_data.aqbuttons[i].label) != NULL) { - _aqualink_data.aqbuttons[i].led->state = state; - LOG(AQUA_LOG,LOG_INFO, "Set %s to %d\n", _aqualink_data.aqbuttons[i].label, _aqualink_data.aqbuttons[i].led->state); - // Return true should be the result, but in the if we want to continue to display message - //return true; - if (i == 13) - return MSG_RS13BUTTON; - else if (i == 14) - return MSG_RS14BUTTON; - else if (i == 15) - return MSG_RS15BUTTON; - else if (i == 16) - return MSG_RS16BUTTON; - else - { - LOG(AQUA_LOG,LOG_ERR, "RS16 Button Set error %s to %d, %d is out of scope\n", _aqualink_data.aqbuttons[i].label, _aqualink_data.aqbuttons[i].led->state, i); - return false; - } - - } - } - - return false; -} -#endif - - - -void _processMessage(char *message, bool reset); - -void processMessage(char *message) -{ - _processMessage(message, false); -} -void processMessageReset() -{ - _processMessage(NULL, true); -} -void _processMessage(char *message, bool reset) -{ - char *msg; - static bool _initWithRS = false; - //static bool _gotREV = false; - //static int freeze_msg_count = 0; - //static int service_msg_count = 0; - //static int swg_msg_count = 0; - //static int boost_msg_count = 0; - static int16_t msg_loop = 0; - static aqledstate default_frz_protect_state = OFF; - // NSF replace message with msg -#ifdef AQ_RS16 - int16_t rs16; -#endif - - //msg = stripwhitespace(message); - //strcpy(_aqualink_data.last_message, msg); - //LOG(ALLB_LOG,LOG_INFO, "RS Message :- '%s'\n", msg); - - - - // Check long messages in this if/elseif block first, as some messages are similar. - // ie "POOL TEMP" and "POOL TEMP IS SET TO" so want correct match first. - // - - //if (stristr(msg, "JANDY AquaLinkRS") != NULL) { - if (!reset) { - msg = stripwhitespace(message); - strcpy(_aqualink_data.last_message, msg); - LOG(ALLB_LOG,LOG_INFO, "RS Message :- '%s'\n", msg); - // Just set this to off, it will re-set since it'll be the only message we get if on - _aqualink_data.service_mode_state = OFF; - } else { - //_aqualink_data.display_message = NULL; - _aqualink_data.last_display_message[0] = ' '; - _aqualink_data.last_display_message[1] = '\0'; - - // Anything that wasn't on during the last set of messages, turn off - if ((msg_loop & MSG_FREEZE) != MSG_FREEZE) - _aqualink_data.frz_protect_state = default_frz_protect_state; - - if ((msg_loop & MSG_SERVICE) != MSG_SERVICE && - (msg_loop & MSG_TIMEOUT) != MSG_TIMEOUT ) { - _aqualink_data.service_mode_state = OFF; // IF we get this message then Service / Timeout is off - } - - if ( ((msg_loop & MSG_SWG_DEVICE) != MSG_SWG_DEVICE) && _aqualink_data.swg_led_state != LED_S_UNKNOWN) { - // No Additional SWG devices messages like "no flow" - if ((msg_loop & MSG_SWG) != MSG_SWG && _aqualink_data.aqbuttons[PUMP_INDEX].led->state == OFF ) - setSWGdeviceStatus(&_aqualink_data, ALLBUTTON, SWG_STATUS_OFF); - else - setSWGdeviceStatus(&_aqualink_data, ALLBUTTON, SWG_STATUS_ON); - } - - // If no AQUAPURE message, either (no SWG, it's set 0, or it's off). - if ((msg_loop & MSG_SWG) != MSG_SWG && _aqualink_data.swg_led_state != LED_S_UNKNOWN ) { - if (_aqualink_data.swg_percent != 0 || _aqualink_data.swg_led_state == ON) { - // Something is wrong here. Let's check pump, if on set SWG to 0, if off turn SWE off - if ( _aqualink_data.aqbuttons[PUMP_INDEX].led->state == OFF) { - LOG(ALLB_LOG,LOG_INFO, "No AQUAPURE message in cycle, pump is off so setting SWG to off\n"); - setSWGoff(&_aqualink_data); - } else { - LOG(ALLB_LOG,LOG_INFO, "No AQUAPURE message in cycle, pump is on so setting SWG to 0%%\n"); - changeSWGpercent(&_aqualink_data, 0); - } - } else if (isIAQT_ENABLED == false && isONET_ENABLED == false && READ_RSDEV_SWG == false ) { - //We have no other way to read SWG %=0, so turn SWG on with pump - if ( _aqualink_data.aqbuttons[PUMP_INDEX].led->state == ON) { - LOG(ALLB_LOG,LOG_INFO, "No AQUAPURE message in cycle, pump is off so setting SWG to off\n"); - //changeSWGpercent(&_aqualink_data, 0); - setSWGenabled(&_aqualink_data); - } - } - // NSF Need something to catch startup when SWG=0 so we set it to enabeled. - // when other ways/protocols to detect SWG=0 are turned off. - } - /* - // AQUAPURE=0 we never get that message on ALLBUTTON so don't turn off unless filter pump if off - if ((msg_loop & MSG_SWG) != MSG_SWG && _aqualink_data.aqbuttons[PUMP_INDEX].led->state == OFF ) { - //_aqualink_data.ar_swg_status = SWG_STATUS_OFF; - setSWGoff(&_aqualink_data); - } - */ - if ((msg_loop & MSG_BOOST) != MSG_BOOST) { - _aqualink_data.boost = false; - _aqualink_data.boost_msg[0] = '\0'; - _aqualink_data.boost_duration = 0; - //if (_aqualink_data.swg_percent >= 101) - // _aqualink_data.swg_percent = 0; - } - - if ((msg_loop & MSG_BATTERY_LOW) != MSG_BATTERY_LOW) - _aqualink_data.battery = OK; - -#ifdef AQ_RS16 - //if ( _aqconfig_.rs_panel_size >= 16) { - //if ( (int)PANEL_SIZE >= 16) { // NSF No idea why this fails on RS-4, but it does. Come back and find out why - if ( PANEL_SIZE() >= 16 ) { - //printf("Panel size %d What the fuck am I doing here\n",PANEL_SIZE()); - if ((msg_loop & MSG_RS13BUTTON) != MSG_RS13BUTTON) - _aqualink_data.aqbuttons[13].led->state = OFF; - if ((msg_loop & MSG_RS14BUTTON) != MSG_RS14BUTTON) - _aqualink_data.aqbuttons[14].led->state = OFF; - if ((msg_loop & MSG_RS15BUTTON) != MSG_RS15BUTTON) - _aqualink_data.aqbuttons[15].led->state = OFF; - if ((msg_loop & MSG_RS16BUTTON) != MSG_RS16BUTTON) - _aqualink_data.aqbuttons[16].led->state = OFF; - } -#endif - msg_loop = 0; - return; - } - - if (stristr(msg, LNG_MSG_BATTERY_LOW) != NULL) - { - _aqualink_data.battery = LOW; - msg_loop |= MSG_BATTERY_LOW; - strcpy(_aqualink_data.last_display_message, msg); // Also display the message on web UI - } - else if (stristr(msg, LNG_MSG_POOL_TEMP_SET) != NULL) - { - //LOG(AQUA_LOG,LOG_DEBUG, "**************** pool htr long message: %s", &message[20]); - _aqualink_data.pool_htr_set_point = atoi(message + 20); - - if (_aqualink_data.temp_units == UNKNOWN) - setUnits(msg); - } - else if (stristr(msg, LNG_MSG_SPA_TEMP_SET) != NULL) - { - //LOG(AQUA_LOG,LOG_DEBUG, "spa htr long message: %s", &message[19]); - _aqualink_data.spa_htr_set_point = atoi(message + 19); - - if (_aqualink_data.temp_units == UNKNOWN) - setUnits(msg); - } - else if (stristr(msg, LNG_MSG_FREEZE_PROTECTION_SET) != NULL) - { - //LOG(AQUA_LOG,LOG_DEBUG, "frz protect long message: %s", &message[28]); - _aqualink_data.frz_protect_set_point = atoi(message + 28); - _aqualink_data.frz_protect_state = ENABLE; - default_frz_protect_state = ENABLE; - - if (_aqualink_data.temp_units == UNKNOWN) - setUnits(msg); - } - else if (strncasecmp(msg, MSG_AIR_TEMP, MSG_AIR_TEMP_LEN) == 0) - { - _aqualink_data.air_temp = atoi(msg + MSG_AIR_TEMP_LEN); - - if (_aqualink_data.temp_units == UNKNOWN) - setUnits(msg); - } - else if (strncasecmp(msg, MSG_POOL_TEMP, MSG_POOL_TEMP_LEN) == 0) - { - _aqualink_data.pool_temp = atoi(msg + MSG_POOL_TEMP_LEN); - - if (_aqualink_data.temp_units == UNKNOWN) - setUnits(msg); - } - else if (strncasecmp(msg, MSG_SPA_TEMP, MSG_SPA_TEMP_LEN) == 0) - { - _aqualink_data.spa_temp = atoi(msg + MSG_SPA_TEMP_LEN); - - if (_aqualink_data.temp_units == UNKNOWN) - setUnits(msg); - } - // NSF If get water temp rather than pool or spa in some cases, then we are in Pool OR Spa ONLY mode - else if (strncasecmp(msg, MSG_WATER_TEMP, MSG_WATER_TEMP_LEN) == 0) - { - _aqualink_data.pool_temp = atoi(msg + MSG_WATER_TEMP_LEN); - _aqualink_data.spa_temp = atoi(msg + MSG_WATER_TEMP_LEN); - if (_aqualink_data.temp_units == UNKNOWN) - setUnits(msg); - - if (isSINGLE_DEV_PANEL != true) - { - changePanelToMode_Only(); - LOG(ALLB_LOG,LOG_ERR, "AqualinkD set to 'Combo Pool & Spa' but detected 'Only Pool OR Spa' panel, please change config\n"); - } - } - else if (stristr(msg, LNG_MSG_WATER_TEMP1_SET) != NULL) - { - _aqualink_data.pool_htr_set_point = atoi(message + 28); - - if (_aqualink_data.temp_units == UNKNOWN) - setUnits(msg); - - if (isSINGLE_DEV_PANEL != true) - { - changePanelToMode_Only(); - LOG(ALLB_LOG,LOG_ERR, "AqualinkD set to 'Combo Pool & Spa' but detected 'Only Pool OR Spa' panel, please change config\n"); - } - } - else if (stristr(msg, LNG_MSG_WATER_TEMP2_SET) != NULL) - { - _aqualink_data.spa_htr_set_point = atoi(message + 27); - - if (_aqualink_data.temp_units == UNKNOWN) - setUnits(msg); - - if (isSINGLE_DEV_PANEL != true) - { - changePanelToMode_Only(); - LOG(ALLB_LOG,LOG_ERR, "AqualinkD set to 'Combo Pool & Spa' but detected 'Only Pool OR Spa' panel, please change config\n"); - } - } - else if (stristr(msg, LNG_MSG_SERVICE_ACTIVE) != NULL) - { - if (_aqualink_data.service_mode_state == OFF) - LOG(ALLB_LOG,LOG_NOTICE, "AqualinkD set to Service Mode\n"); - _aqualink_data.service_mode_state = ON; - msg_loop |= MSG_SERVICE; - //service_msg_count = 0; - } - else if (stristr(msg, LNG_MSG_TIMEOUT_ACTIVE) != NULL) - { - if (_aqualink_data.service_mode_state == OFF) - LOG(ALLB_LOG,LOG_NOTICE, "AqualinkD set to Timeout Mode\n"); - _aqualink_data.service_mode_state = FLASH; - msg_loop |= MSG_TIMEOUT; - //service_msg_count = 0; - } - else if (stristr(msg, LNG_MSG_FREEZE_PROTECTION_ACTIVATED) != NULL) - { - msg_loop |= MSG_FREEZE; - _aqualink_data.frz_protect_state = ON; - //freeze_msg_count = 0; - strcpy(_aqualink_data.last_display_message, msg); // Also display the message on web UI - } - /* // Not sure when to do with these for the moment, so no need to compile in the test. - else if (stristr(msg, LNG_MSG_CHEM_FEED_ON) != NULL) { - } - else if (stristr(msg, LNG_MSG_CHEM_FEED_OFF) != NULL) { - } - */ - else if (msg[2] == '/' && msg[5] == '/' && msg[8] == ' ') - { // date in format '08/29/16 MON' - strcpy(_aqualink_data.date, msg); - } - else if (stristr(msg, MSG_SWG_PCT) != NULL) - { - if (strncasecmp(msg, MSG_SWG_PCT, MSG_SWG_PCT_LEN) == 0 && strncasecmp(msg, "AQUAPURE HRS", 12) != 0) { - changeSWGpercent(&_aqualink_data, atoi(msg + MSG_SWG_PCT_LEN)); - } - else if (strncasecmp(msg, "AQUAPURE HRS", 12) != 0 && strncasecmp(msg, "SET AQUAPURE", 12) != 0) - { - if (strcasestr(msg, MSG_SWG_NO_FLOW) != NULL) - setSWGdeviceStatus(&_aqualink_data, ALLBUTTON, SWG_STATUS_NO_FLOW); - else if (strcasestr(msg, MSG_SWG_LOW_SALT) != NULL) - setSWGdeviceStatus(&_aqualink_data, ALLBUTTON, SWG_STATUS_LOW_SALT); - else if (strcasestr(msg, MSG_SWG_HIGH_SALT) != NULL) - setSWGdeviceStatus(&_aqualink_data, ALLBUTTON, SWG_STATUS_HI_SALT); - else if (strcasestr(msg, MSG_SWG_FAULT) != NULL) - setSWGdeviceStatus(&_aqualink_data, ALLBUTTON, SWG_STATUS_GENFAULT); - //setSWGdeviceStatus(&_aqualink_data, ALLBUTTON, SWG_STATUS_CHECK_PCB); - - // Any of these messages want to display. - strcpy(_aqualink_data.last_display_message, msg); - - msg_loop |= MSG_SWG_DEVICE; - } - msg_loop |= MSG_SWG; - } - else if (strncasecmp(msg, MSG_SWG_PPM, MSG_SWG_PPM_LEN) == 0) - { - _aqualink_data.swg_ppm = atoi(msg + MSG_SWG_PPM_LEN); - msg_loop |= MSG_SWG; - } - else if ((msg[1] == ':' || msg[2] == ':') && msg[strlen(msg) - 1] == 'M') - { // time in format '9:45 AM' - strcpy(_aqualink_data.time, msg); - // Setting time takes a long time, so don't try until we have all other programmed data. - if (_initWithRS == true && strlen(_aqualink_data.date) > 1 && checkAqualinkTime() != true) - { - LOG(ALLB_LOG,LOG_NOTICE, "RS time is NOT accurate '%s %s', re-setting on controller!\n", _aqualink_data.time, _aqualink_data.date); - aq_programmer(AQ_SET_TIME, NULL, &_aqualink_data); - } - else if (_initWithRS == false || _aqconfig_.sync_panel_time == false) - { - LOG(ALLB_LOG,LOG_DEBUG, "RS time '%s %s' not checking\n", _aqualink_data.time, _aqualink_data.date); - } - else if (_initWithRS == true) - { - LOG(ALLB_LOG,LOG_DEBUG, "RS time is accurate '%s %s'\n", _aqualink_data.time, _aqualink_data.date); - } - // If we get a time message before REV, the controller didn't see us as we started too quickly. - /* Don't need to check this anymore with the check for probe before startup. - if (_gotREV == false) - { - LOG(AQUA_LOG,LOG_NOTICE, "Getting control panel information\n", msg); - aq_programmer(AQ_GET_DIAGNOSTICS_MODEL, NULL, &_aqualink_data); - _gotREV = true; // Force it to true just incase we don't understand the model# - } - */ - } - else if (strstr(msg, " REV ") != NULL || strstr(msg, " REV. ") != NULL) - { // '8157 REV MMM' - // A master firmware revision message. - strcpy(_aqualink_data.version, msg); - rsm_get_revision(_aqualink_data.revision, _aqualink_data.version, strlen(_aqualink_data.version)); - //_gotREV = true; - LOG(ALLB_LOG,LOG_NOTICE, "Control Panel version %s\n", _aqualink_data.version); - LOG(ALLB_LOG,LOG_NOTICE, "Control Panel revision %s\n", _aqualink_data.revision); - if (_initWithRS == false) - { - //LOG(ALLBUTTON,LOG_NOTICE, "Standard protocol initialization complete\n"); - queueGetProgramData(ALLBUTTON, &_aqualink_data); - //queueGetExtendedProgramData(ALLBUTTON, &_aqualink_data, _aqconfig_.use_panel_aux_labels); - _initWithRS = true; - } - } - else if (stristr(msg, " TURNS ON") != NULL) - { - LOG(ALLB_LOG,LOG_NOTICE, "Program data '%s'\n", msg); - } - else if (_aqconfig_.override_freeze_protect == TRUE && strncasecmp(msg, "Press Enter* to override Freeze Protection with", 47) == 0) - { - //send_cmd(KEY_ENTER, aq_data); - //aq_programmer(AQ_SEND_CMD, (char *)KEY_ENTER, &_aqualink_data); - aq_send_cmd(KEY_ENTER); - } - // Process any button states (fake LED) for RS12 and above keypads - // Text will be button label on or off ie Aux_B2 off or WaterFall off - -#ifdef AQ_RS16 - //else if ( _aqconfig_.rs_panel_size >= 16 && (rs16 = RS16_endswithLEDstate(msg)) != 0 ) - else if (PANEL_SIZE() >= 16 && (rs16 = RS16_endswithLEDstate(msg)) != 0 ) - { - msg_loop |= rs16; - // Do nothing, just stop other else if statments executing - // make sure we also display the message. - // Note we only get ON messages here, Off messages will not be sent if something else turned it off - // use the Onetouch or iAqua equiptment page for off. - strcpy(_aqualink_data.last_display_message, msg); - } -#endif - else if (((msg[4] == ':') || (msg[6] == ':')) && (strncasecmp(msg, "AUX", 3) == 0) ) - { // Should probable check we are in programming mode. - // 'Aux3: No Label' - // 'Aux B1: No Label' - int labelid; - int ni = 3; - if (msg[4] == 'B') { ni = 5; } - labelid = atoi(msg + ni); - if (labelid > 0 && _aqconfig_.use_panel_aux_labels == true) - { - if (ni == 5) - labelid = labelid + 8; - else - labelid = labelid + 1; - // Aux1: on panel = Button 3 in aqualinkd (button 2 in array) - if (strncasecmp(msg+ni+3, "No Label", 8) != 0) { - _aqualink_data.aqbuttons[labelid].label = prittyString(cleanalloc(msg+ni+2)); - LOG(ALLB_LOG,LOG_NOTICE, "AUX ID %s label set to '%s'\n", _aqualink_data.aqbuttons[labelid].name, _aqualink_data.aqbuttons[labelid].label); - } else { - LOG(ALLB_LOG,LOG_NOTICE, "AUX ID %s has no control panel label using '%s'\n", _aqualink_data.aqbuttons[labelid].name, _aqualink_data.aqbuttons[labelid].label); - } - //_aqualink_data.aqbuttons[labelid + 1].label = cleanalloc(msg + 5); - } - } - // BOOST POOL 23:59 REMAINING - else if ( (strncasecmp(msg, "BOOST POOL", 10) == 0) && (strcasestr(msg, "REMAINING") != NULL) ) { - // Ignore messages if in programming mode. We get one of these turning off for some strange reason. - if (in_programming_mode(&_aqualink_data) == false) { - snprintf(_aqualink_data.boost_msg, 6, "%s", &msg[11]); - _aqualink_data.boost_duration = rsm_HHMM2min(_aqualink_data.boost_msg); - _aqualink_data.boost = true; - msg_loop |= MSG_BOOST; - msg_loop |= MSG_SWG; - //convert_boost_to_duration(_aqualink_data.boost_msg) - //if (_aqualink_data.ar_swg_status != SWG_STATUS_ON) {_aqualink_data.ar_swg_status = SWG_STATUS_ON;} - if (_aqualink_data.swg_percent != 101) {changeSWGpercent(&_aqualink_data, 101);} - //boost_msg_count = 0; - //if (_aqualink_data.active_thread.thread_id == 0) - strcpy(_aqualink_data.last_display_message, msg); // Also display the message on web UI if not in programming mode - } - } - else - { - LOG(ALLB_LOG,LOG_DEBUG_SERIAL, "Ignoring '%s'\n", msg); - //_aqualink_data.display_message = msg; - //if (in_programming_mode(&_aqualink_data) == false && _aqualink_data.simulate_panel == false && - if (in_programming_mode(&_aqualink_data) == false && - stristr(msg, "JANDY AquaLinkRS") == NULL && - //stristr(msg, "PUMP O") == NULL &&// Catch 'PUMP ON' and 'PUMP OFF' but not 'PUMP WILL TURN ON' - strncasecmp(msg, "PUMP O", 6) != 0 &&// Catch 'PUMP ON' and 'PUMP OFF' but not 'PUMP WILL TURN ON' - stristr(msg, "MAINTAIN") == NULL && // Catch 'MAINTAIN TEMP IS OFF' - stristr(msg, "0 PSI") == NULL /* // Catch some erronious message on test harness - stristr(msg, "CLEANER O") == NULL && - stristr(msg, "SPA O") == NULL && - stristr(msg, "AUX") == NULL*/ - ) - { // Catch all AUX1 AUX5 messages - //_aqualink_data.display_last_message = true; - strcpy(_aqualink_data.last_display_message, msg); - //rsm_strncpy(_aqualink_data.last_display_message, (unsigned char *)msg, AQ_MSGLONGLEN, AQ_MSGLONGLEN); - } - } - - // Send every message if we are in simulate panel mode - //if (_aqualink_data.simulate_panel) - // strcpy(_aqualink_data.last_display_message, msg); - //rsm_strncpy(_aqualink_data.last_display_message, (unsigned char *)msg, AQ_MSGLONGLEN, AQ_MSGLONGLEN); - //ascii(_aqualink_data.last_display_message, msg); - - - //LOG(ALLB_LOG,LOG_INFO, "RS Message loop :- '%d'\n", msg_loop); - - // We processed the next message, kick any threads waiting on the message. -//printf ("Message kicking\n"); - - - kick_aq_program_thread(&_aqualink_data, ALLBUTTON); -} - -bool process_packet(unsigned char *packet, int length) -{ - bool rtn = false; - //static unsigned char last_packet[AQ_MAXPKTLEN]; - static unsigned char last_checksum; - static char message[AQ_MSGLONGLEN + 1]; - static int processing_long_msg = 0; - - LOG(ALLB_LOG,LOG_DEBUG_SERIAL, "process_packer()\n", length); - - // Check packet against last check if different. - // Should only use the checksum, not whole packet since it's status messages. - /* - if ( packet[PKT_CMD] == CMD_STATUS && (memcmp(packet, last_packet, length) == 0)) - { - LOG(ALLB_LOG,LOG_DEBUG_SERIAL, "RS Received duplicate, ignoring.\n", length); - return rtn; - } - else - { - memcpy(last_packet, packet, length); - _aqualink_data.last_packet_type = packet[PKT_CMD]; - rtn = true; - } - */ - - _aqualink_data.last_packet_type = packet[PKT_CMD]; - -#ifdef AQ_PDA - if (isPDA_PANEL) - { - if (isPDA_IAQT) { - return false; - } - return process_pda_packet(packet, length); - } -#endif - - if ( packet[PKT_CMD] == CMD_STATUS && packet[length-3] == last_checksum && ! in_programming_mode(&_aqualink_data) ) - { - LOG(ALLB_LOG,LOG_DEBUG_SERIAL, "RS Received duplicate, ignoring.\n", length); - return false; - } - else - { - last_checksum = packet[length-3]; - rtn = true; - } - - if (processing_long_msg > 0 && packet[PKT_CMD] != CMD_MSG_LONG) - { - processing_long_msg = 0; - //LOG(AQUA_LOG,LOG_ERR, "RS failed to receive complete long message, received '%s'\n",message); - //LOG(AQUA_LOG,LOG_DEBUG, "RS didn't finished receiving of MSG_LONG '%s'\n",message); - processMessage(message); - } - - LOG(ALLB_LOG,LOG_DEBUG_SERIAL, "RS Received packet type 0x%02hhx length %d.\n", packet[PKT_CMD], length); - - switch (packet[PKT_CMD]) - { - case CMD_ACK: - //LOG(ALLB_LOG,LOG_DEBUG_SERIAL, "RS Received ACK length %d.\n", length); - break; - case CMD_STATUS: - //LOG(ALLB_LOG,LOG_DEBUG_SERIAL, "RS Received STATUS length %d.\n", length); - memcpy(_aqualink_data.raw_status, packet + 4, AQ_PSTLEN); - processLEDstate(); - if (_aqualink_data.aqbuttons[PUMP_INDEX].led->state == OFF) - { - _aqualink_data.pool_temp = TEMP_UNKNOWN; - _aqualink_data.spa_temp = TEMP_UNKNOWN; - //_aqualink_data.spa_temp = _aqconfig_.report_zero_spa_temp?-18:TEMP_UNKNOWN; - } - else if (_aqualink_data.aqbuttons[SPA_INDEX].led->state == OFF && isSINGLE_DEV_PANEL != true) - { - //_aqualink_data.spa_temp = _aqconfig_.report_zero_spa_temp?-18:TEMP_UNKNOWN; - _aqualink_data.spa_temp = TEMP_UNKNOWN; - } - else if (_aqualink_data.aqbuttons[SPA_INDEX].led->state == ON && isSINGLE_DEV_PANEL != true) - { - _aqualink_data.pool_temp = TEMP_UNKNOWN; - } - - // COLOR MODE programming relies on state changes, so let any threads know - //if (_aqualink_data.active_thread.ptype == AQ_SET_LIGHTPROGRAM_MODE) { - if ( in_light_programming_mode(&_aqualink_data) ) { - kick_aq_program_thread(&_aqualink_data, ALLBUTTON); - } - break; - case CMD_MSG: - case CMD_MSG_LONG: - { - int index = packet[PKT_DATA]; // Will get 0x00 for complete message, 0x01 for start on long message 0x05 last of long message - //printf("RSM received message at index %d '%.*s'\n",index,AQ_MSGLEN,(char *)packet + PKT_DATA + 1); - if (index <= 1){ - memset(message, 0, AQ_MSGLONGLEN + 1); - //strncpy(message, (char *)packet + PKT_DATA + 1, AQ_MSGLEN); - rsm_strncpy(message, packet + PKT_DATA + 1, AQ_MSGLONGLEN, AQ_MSGLEN); - processing_long_msg = index; - //LOG(ALLB_LOG,LOG_ERR, "Message %s\n",message); - } else { - //strncpy(&message[(processing_long_msg * AQ_MSGLEN)], (char *)packet + PKT_DATA + 1, AQ_MSGLEN); - //rsm_strncpy(&message[(processing_long_msg * AQ_MSGLEN)], (unsigned char *)packet + PKT_DATA + 1, AQ_MSGLONGLEN, AQ_MSGLEN); - rsm_strncpy(&message[( (index-1) * AQ_MSGLEN)], (unsigned char *)packet + PKT_DATA + 1, AQ_MSGLONGLEN, AQ_MSGLEN); - //LOG(ALLB_LOG,LOG_ERR, "Long Message %s\n",message); - if (++processing_long_msg != index) { - LOG(ALLB_LOG,LOG_DEBUG, "Long message index %d doesn't match buffer %d\n",index,processing_long_msg); - //printf("RSM Long message index %d doesn't match buffer %d\n",index,processing_long_msg); - } - #ifdef PROCESS_INCOMPLETE_MESSAGES - kick_aq_program_thread(&_aqualink_data, ALLBUTTON); - #endif - } - - if (index == 0 || index == 5) { - //printf("RSM process message '%s'\n",message); - - // MOVED FROM LINE 701 see if less errors - //kick_aq_program_thread(&_aqualink_data, ALLBUTTON); - - LOG(ALLB_LOG,LOG_DEBUG, "Processing Message - '%s'\n",message); - processMessage(message); // This will kick thread - } - - } - break; - case CMD_PROBE: - LOG(ALLB_LOG,LOG_DEBUG, "RS Received PROBE length %d.\n", length); - //LOG(AQUA_LOG,LOG_INFO, "Synch'ing with Aqualink master device...\n"); - rtn = false; - break; - case CMD_MSG_LOOP_ST: - LOG(ALLB_LOG,LOG_INFO, "RS Received message loop start\n"); - processMessageReset(); - rtn = false; - break; - default: - LOG(ALLB_LOG,LOG_INFO, "RS Received unknown packet, 0x%02hhx\n", packet[PKT_CMD]); - rtn = false; - break; - } - - return rtn; -} void action_delayed_request() { @@ -1344,6 +643,9 @@ int startup(char *self, char *cfgFile) if (_aqconfig_.frame_delay > 0) LOG(AQUA_LOG,LOG_NOTICE, "RS485 Frame delay = %dms\n", _aqconfig_.frame_delay); + if (!_aqconfig_.device_pre_state) // Default is on, so only disply if off. + LOG(AQUA_LOG,LOG_NOTICE, "Preset Device State = %s\n", bool2text(_aqconfig_.device_pre_state)); + #ifdef AQ_NO_THREAD_NETSERVICE if (_aqconfig_.thread_netservices) LOG(AQUA_LOG,LOG_NOTICE, "Thread Network Services = %s\n", bool2text(_aqconfig_.thread_netservices)); @@ -1416,7 +718,7 @@ void caculate_ack_packet(int rs_fd, unsigned char *packet_buffer, emulation_type { switch (source) { case ALLBUTTON: - send_extended_ack(rs_fd, (packet_buffer[PKT_CMD]==CMD_MSG_LONG?ACK_SCREEN_BUSY_SCROLL:ACK_NORMAL), pop_aq_cmd(&_aqualink_data)); + send_extended_ack(rs_fd, (packet_buffer[PKT_CMD]==CMD_MSG_LONG?ACK_SCREEN_BUSY_SCROLL:ACK_NORMAL), pop_allb_cmd(&_aqualink_data)); //DEBUG_TIMER_STOP(_rs_packet_timer,AQUA_LOG,"AllButton Emulation type Processed packet in"); break; case RSSADAPTER: @@ -1453,7 +755,7 @@ void caculate_ack_packet(int rs_fd, unsigned char *packet_buffer, emulation_type LOG(PDA_LOG,LOG_DEBUG, "PDA Aqualink daemon in sleep mode\n"); return; } else { - send_extended_ack(rs_fd, ACK_PDA, pop_aq_cmd(&_aqualink_data)); + send_extended_ack(rs_fd, ACK_PDA, pop_pda_cmd(&_aqualink_data)); } //DEBUG_TIMER_STOP(_rs_packet_timer,AQUA_LOG,"PDA Emulation type Processed packet in"); break; @@ -1903,56 +1205,43 @@ void main_loop() } } - - if (packet_length > 0 && packet_buffer[PKT_DEST] == _aqconfig_.device_id && getProtocolType(packet_buffer) == JANDY) + // Process and packets of devices we are acting as + if (packet_length > 0 && getProtocolType(packet_buffer) == JANDY && + (packet_buffer[PKT_DEST] == _aqconfig_.device_id || + packet_buffer[PKT_DEST] == _aqconfig_.rssa_device_id || + packet_buffer[PKT_DEST] == _aqconfig_.extended_device_id )) { - if (getLogLevel(AQUA_LOG) >= LOG_DEBUG) { - LOG(AQUA_LOG,LOG_DEBUG, "RS received packet of type %s length %d\n", get_packet_type(packet_buffer, packet_length), packet_length); - //logPacketRead(packet_buffer, packet_length); - } - _aqualink_data.updated = process_packet(packet_buffer, packet_length); - -#ifdef AQ_PDA - if (isPDA_PANEL) { - // If we are in simulator mode, the sim has already send the ack - if (isPDA_IAQT) { - //printf("****PDA IAQT Code\n"); + switch(getJandyDeviceType(packet_buffer[PKT_DEST])){ + case ALLBUTTON: + _aqualink_data.updated = process_allbutton_packet(packet_buffer, packet_length, &_aqualink_data); + caculate_ack_packet(rs_fd, packet_buffer, ALLBUTTON); + break; + case RSSADAPTER: + _aqualink_data.updated = process_rssadapter_packet(packet_buffer, packet_length, &_aqualink_data); + caculate_ack_packet(rs_fd, packet_buffer, RSSADAPTER); + break; + case IAQTOUCH: _aqualink_data.updated = process_iaqtouch_packet(packet_buffer, packet_length, &_aqualink_data); - _aqualink_data.updated = true; // FORCE UPDATE SINCE THIS IS NOT WORKING YET caculate_ack_packet(rs_fd, packet_buffer, IAQTOUCH); - if (checkAqualinkTime() == false) // Need to do this better. - {aq_programmer(AQ_SET_TIME, NULL, &_aqualink_data);} - } - else /*if (_aqualink_data.simulator_active == SIM_NONE)*/ { + break; + case ONETOUCH: + _aqualink_data.updated = process_onetouch_packet(packet_buffer, packet_length, &_aqualink_data); + caculate_ack_packet(rs_fd, packet_buffer, ONETOUCH); + break; + case AQUAPDA: + _aqualink_data.updated = process_pda_packet(packet_buffer, packet_length); caculate_ack_packet(rs_fd, packet_buffer, AQUAPDA); - } + break; + default: + break; } - else -#endif - caculate_ack_packet(rs_fd, packet_buffer, ALLBUTTON); - - DEBUG_TIMER_STOP(_rs_packet_timer,AQUA_LOG,"AllButton Emulation Processed packet in"); - } - else if (packet_length > 0 && isRSSA_ENABLED && packet_buffer[PKT_DEST] == _aqconfig_.rssa_device_id && getProtocolType(packet_buffer) == JANDY) { - _aqualink_data.updated = process_rssadapter_packet(packet_buffer, packet_length, &_aqualink_data); - caculate_ack_packet(rs_fd, packet_buffer, RSSADAPTER); - DEBUG_TIMER_STOP(_rs_packet_timer,AQUA_LOG,"SerialAdapter Emulation Processed packet in"); - } -#ifdef AQ_ONETOUCH - else if (packet_length > 0 && isONET_ENABLED && packet_buffer[PKT_DEST] == _aqconfig_.extended_device_id && getProtocolType(packet_buffer) == JANDY) { - _aqualink_data.updated = process_onetouch_packet(packet_buffer, packet_length, &_aqualink_data); - caculate_ack_packet(rs_fd, packet_buffer, ONETOUCH); - DEBUG_TIMER_STOP(_rs_packet_timer,AQUA_LOG,"OneTouch Emulation Processed packet in"); - } +#ifdef AQ_TM_DEBUG + char message[128]; + sprintf(message,"%s Emulation Processed packet in",getJandyDeviceName(getJandyDeviceType(packet_buffer[PKT_DEST]))); + DEBUG_TIMER_STOP(_rs_packet_timer,AQUA_LOG,message); #endif -#ifdef AQ_IAQTOUCH - else if (packet_length > 0 && isIAQT_ENABLED && packet_buffer[PKT_DEST] == _aqconfig_.extended_device_id && getProtocolType(packet_buffer) == JANDY) { - _aqualink_data.updated = process_iaqtouch_packet(packet_buffer, packet_length, &_aqualink_data); - caculate_ack_packet(rs_fd, packet_buffer, IAQTOUCH); - DEBUG_TIMER_STOP(_rs_packet_timer,AQUA_LOG,"AquaTouch Emulation Processed packet in"); } -#endif - //else if (packet_length > 0 && _aqconfig_.read_all_devices == true) + // Process any packets to readonly devices. else if (packet_length > 0 && _aqconfig_.read_RS485_devmask > 0) { if (getProtocolType(packet_buffer) == JANDY) diff --git a/config.c b/config.c index 9f224cf7..edf64143 100644 --- a/config.c +++ b/config.c @@ -148,6 +148,7 @@ void init_parameters (struct aqconfig * parms) parms->enable_scheduler = true; parms->ftdi_low_latency = true; parms->frame_delay = 0; + parms->device_pre_state = true; generate_mqtt_id(parms->mqtt_ID, MQTT_ID_LEN); } @@ -635,7 +636,11 @@ bool setConfigValue(struct aqualinkdata *aqdata, char *param, char *value) { } else if (strncasecmp (param, "rs485_frame_delay", 17) == 0) { _aqconfig_.frame_delay = strtoul(value, NULL, 10); rtn=true; - } + } else if (strncasecmp (param, "device_pre_state", 16) == 0) { + _aqconfig_.device_pre_state = text2bool(value); + rtn=true; + } + else if (strncasecmp(param, "button_", 7) == 0) { // Check we have inichalized panel information, if not use any settings we may have if (_aqconfig_.paneltype_mask == 0) diff --git a/config.h b/config.h index 65db5988..193f9bbf 100644 --- a/config.h +++ b/config.h @@ -100,6 +100,7 @@ struct aqconfig bool enable_scheduler; bool ftdi_low_latency; int frame_delay; + bool device_pre_state; #ifdef AQ_NO_THREAD_NETSERVICE int rs_poll_speed; // Need to remove bool thread_netservices; // Need to remove diff --git a/devices_pentair.c b/devices_pentair.c index e3f6570c..d8c391e5 100644 --- a/devices_pentair.c +++ b/devices_pentair.c @@ -114,6 +114,10 @@ bool processPentairPacket(unsigned char *packet, int packet_length, struct aqual /* VSP Pump Status. + Mode 0=local control, 1=remote control + DriveState = no idea + Pressure Curve = see manual + Status = below (packet[PEN_HI_B_STATUS] * 256) + packet[PEN_LO_B_STATUS]; // Below was pulled from another project. 0 doesn;t seem to be accurate. diff --git a/docker/buildx.sh b/docker/buildx.sh index fb8755b4..1d3ec0ce 100755 --- a/docker/buildx.sh +++ b/docker/buildx.sh @@ -1,6 +1,9 @@ #!/bin/bash # # Script to build arm64 & amd64 containers that are published to docker.io +# +# This should never be used, unless you want to deploy AqualinkD docker containers to docer.io +# It's here incase someone taked over this repo because I'm no longer around # IMAGE=aqualinkd @@ -54,6 +57,9 @@ if echo $DOCKER_TAGS | grep -q $VERSION; then fi fi +# Login first +# cat ~sf/.docker.token | docker login --username sfeakes --password-stdin + echo "Building Docker container for $IMAGE using branch $VERSION" docker buildx build --platform=linux/amd64,linux/arm64 \ --file Dockerfile.buildx \ diff --git a/hassio.c b/hassio.c index 43553ac6..44badcc8 100644 --- a/hassio.c +++ b/hassio.c @@ -105,6 +105,10 @@ const char *HASSIO_SWG_DISCOVER = "{" "}"; // Use Fan for VSP +// Need to change the max / min. These do NOT lomit the slider in hassio, only the MQTT limits. +// So the 0-100% should be 600-3450 RPM and 15-130 GPM (ie 1% would = 600 & 0%=off) +// (value-600) / (3450-600) * 100 +// (value) / 100 * (3450-600) + 600 const char *HASSIO_VSP_DISCOVER = "{" "\"device\": {" HASS_DEVICE "}," "\"availability\": {" HASS_AVAILABILITY "}," @@ -119,10 +123,10 @@ const char *HASSIO_VSP_DISCOVER = "{" "\"payload_off\": \"0\"," "\"percentage_command_topic\": \"%s/%s/%s/set\"," // aqualinkd,filter_pump , RPM|GPM "\"percentage_state_topic\": \"%s/%s/%s\"," // aqualinkd,filter_pump , RPM|GPM - "\"percentage_value_template\": \"{{ ((value | float(0) / %d) * 100) | int }}\"," // 3450|130 - "\"percentage_command_template\": \"{{ ((value | float(0) / 100) * %d) | int }}\"," // 3450|130 + "\"percentage_value_template\": \"{{ (((value | float(0) - %d) / %d) * 100) | int }}\"," // 600, (3450-600) + "\"percentage_command_template\": \"{{ ((value | float(0) / 100) * %d) + %d | int }}\"," // (3450-130), 600 "\"speed_range_max\": \"100\"," - "\"speed_range_min\": \"%d\"," // 18|12 600rpm|15gpm + "\"speed_range_min\": \"0\"," // 18|12 600rpm|15gpm "\"qos\": 1," "\"retain\": false" "}"; @@ -414,17 +418,19 @@ void publish_mqtt_hassio_discover(struct aqualinkdata *aqdata, struct mg_connect // VSP Pumps for (i=0; i < aqdata->num_pumps; i++) { int maxspeed=3450; // Min is 600 - int percent_min=18; // 600 as % of max + int minspeed=600; // 600 as % of max char units[4]; sprintf(units, "RPM"); if ( aqdata->pumps[i].pumpType == VFPUMP ) { maxspeed=130; // Min is 15 - percent_min=12; // 15 as % of max + minspeed=15; // 15 as % of max sprintf(units, "GPM"); } // Create a FAN for pump against the button it' assigned to // In the future maybe change this to the pump# or change the sensors to button??? + // Need to change the max / min. These do NOT lomit the slider in hassio, only the MQTT limits. + // So the 0-100% should be 600-3450 RPM and 15-130 GPM (ie 1% would = 600 & 0%=off) sprintf(msg, HASSIO_VSP_DISCOVER, _aqconfig_.mqtt_aq_topic, aqdata->pumps[i].button->name,units, @@ -434,9 +440,8 @@ void publish_mqtt_hassio_discover(struct aqualinkdata *aqdata, struct mg_connect _aqconfig_.mqtt_aq_topic,aqdata->pumps[i].button->name, _aqconfig_.mqtt_aq_topic,aqdata->pumps[i].button->name,units, _aqconfig_.mqtt_aq_topic,aqdata->pumps[i].button->name,units, - maxspeed, - maxspeed, - percent_min); + minspeed, (maxspeed - minspeed), + (maxspeed - minspeed), minspeed); sprintf(topic, "%s/fan/aqualinkd/aqualinkd_%s_%s/config", _aqconfig_.mqtt_hass_discover_topic, aqdata->pumps[i].button->name, units); send_mqtt(nc, topic, msg); diff --git a/iaqtouch_aq_programmer.c b/iaqtouch_aq_programmer.c index bc07bfc7..76a69a4a 100644 --- a/iaqtouch_aq_programmer.c +++ b/iaqtouch_aq_programmer.c @@ -836,6 +836,7 @@ void *get_aqualink_iaqtouch_freezeprotect( void *ptr ) int frz = rsm_atoi(iaqtGetMessageLine(0)); if (frz >= 0) { aq_data->frz_protect_set_point = frz; + aq_data->frz_protect_state = ON; LOG(IAQT_LOG,LOG_NOTICE, "IAQ Touch Freeze Protection setpoint %d\n",frz); } diff --git a/net_services.c b/net_services.c index b0964170..b962391c 100644 --- a/net_services.c +++ b/net_services.c @@ -1041,10 +1041,6 @@ uriAtype action_URI(request_source from, const char *URI, int uri_length, float } else if (strncmp(ri1, "simcmd", 10) == 0 && from == NET_WS) { // Only valid from websocket. simulator_send_cmd((unsigned char)value); return uActioned; - /* - } else if (strncmp(ri1, "rawcommand", 10) == 0 && from == NET_WS) { // Only valid from websocket. - aq_send_cmd((unsigned char)value); - return uActioned;*/ #ifdef AQ_MANAGER } else if (strncmp(ri1, "aqmanager", 9) == 0 && from == NET_WS) { // Only valid from websocket. return uAQmanager; @@ -1740,18 +1736,6 @@ void action_domoticz_mqtt_message(struct mg_connection *nc, struct mg_mqtt_messa LOG(NET_LOG,LOG_INFO, "MQTT: DZ: received '%s' for '%s', turning '%s'\n", (nvalue==DZ_OFF?"OFF":"ON"), _aqualink_data->aqbuttons[i].name,(nvalue==DZ_OFF?"OFF":"ON")); //create_panel_request(NET_DZMQTT, i, (nvalue == DZ_OFF?0:1), false); panel_device_request(_aqualink_data, ON_OFF, i, (nvalue == DZ_OFF?0:1), NET_DZMQTT); - /* -#ifdef AQ_PDA - if (isPDA_PANEL) { - char msg[PTHREAD_ARG]; - sprintf(msg, "%-5d%-5d",i, (nvalue == DZ_OFF?OFF:ON) ); - aq_programmer(AQ_PDA_DEVICE_ON_OFF, msg, _aqualink_data); - } else -#endif - { - aq_send_cmd(_aqualink_data->aqbuttons[i].code); - } - */ } } break; // no need to continue in for loop, we found button. diff --git a/pda.c b/pda.c index 052706cf..fa38ae6a 100644 --- a/pda.c +++ b/pda.c @@ -810,6 +810,7 @@ bool process_pda_packet(unsigned char *packet, int length) static bool equiptment_update_loop = false; static bool read_equiptment_menu = false; + _aqualink_data->last_packet_type = packet[PKT_CMD]; process_pda_menu_packet(packet, length, in_programming_mode(_aqualink_data)); diff --git a/pda_aq_programmer.c b/pda_aq_programmer.c index 20c66a64..d3232881 100644 --- a/pda_aq_programmer.c +++ b/pda_aq_programmer.c @@ -51,8 +51,122 @@ bool loopover_devices(struct aqualinkdata *aq_data); bool find_pda_menu_item(struct aqualinkdata *aq_data, char *menuText, int charlimit); bool select_pda_menu_item(struct aqualinkdata *aq_data, char *menuText, bool waitForNextMenu); +bool _get_PDA_aqualink_pool_spa_heater_temps(struct aqualinkdata *aq_data); +bool _get_PDA_freeze_protect_temp(struct aqualinkdata *aq_data); + static pda_type _PDA_Type; +//#define USE_ALLBUTTON_QUEUE + +#ifndef USE_ALLBUTTON_QUEUE +/* Forcing all these to allbutton for the moment */ +void waitfor_queue2empty(); +void send_cmd(unsigned char cmd); +unsigned char pop_allb_cmd(struct aqualinkdata *aq_data); +int get_allb_queue_length(); + +void waitfor_pda_queue2empty() { + waitfor_queue2empty(); +} +void send_pda_cmd(unsigned char cmd) { + send_cmd(cmd); +} +unsigned char pop_pda_cmd(struct aqualinkdata *aq_data){ + return pop_allb_cmd(aq_data); +} +int get_pda_queue_length(){ + return get_allb_queue_length(); +} + +#else + +// Use out own queue. +// This is NOT working correctly, need to come back and fix + +#define MAX_STACK 20 +int _pda_cmdstack_place = 0; +unsigned char _pda_cmd_queue[MAX_STACK]; +unsigned char _pda_command = NUL; + +bool waitfor_pda_queue2empty(); + +int get_pda_queue_length(){ + return _pda_cmdstack_place; +} + +bool push_pda_cmd(unsigned char cmd) { + _pda_command = cmd; + /* + if (_pda_cmdstack_place < MAX_STACK) { + _pda_cmd_queue[_pda_cmdstack_place] = cmd; + _pda_cmdstack_place++; + } else { + LOG(PDA_LOG, LOG_ERR, "Command queue overflow, too many unsent commands to RS control panel\n"); + return false; + } + */ + return true; +} +void send_pda_cmd(unsigned char cmd) { + if (waitfor_pda_queue2empty()) { + push_pda_cmd(cmd); + } +} + +unsigned char pop_pda_cmd(struct aqualinkdata *aq_data) +{ + unsigned char cmd = NUL; + + if (_pda_command != NUL && aq_data->last_packet_type == CMD_STATUS) { + cmd = _pda_command; + _pda_command = NUL; + } +/* + // Only send commands on status messages + if (get_pda_queue_length() > 0 && aq_data->last_packet_type == CMD_STATUS) { + cmd = _pda_cmd_queue[0]; + _pda_cmdstack_place--; + LOG(PDA_LOG, LOG_DEBUG_SERIAL, "RS SEND cmd '0x%02hhx'\n", cmd); + memmove(&_pda_cmd_queue[0], &_pda_cmd_queue[1], sizeof(unsigned char) * _pda_cmdstack_place ) ; + } +*/ + return cmd; +} + + +bool waitfor_pda_queue2empty() { + int i=0; + + if (_pda_command != NUL) { + LOG(PDA_LOG, LOG_DEBUG, "Waiting for queue to empty\n"); + } + + while ( (_pda_command != NUL) && ( i++ < PROGRAMMING_POLL_COUNTER) ) { + delay(100); + } +/* + if (get_pda_queue_length() > 0) { + LOG(PDA_LOG, LOG_DEBUG, "Waiting for queue to empty\n"); + } + + while ( (get_pda_queue_length() > 0) && ( i++ < PROGRAMMING_POLL_COUNTER) ) { + delay(100); + } +*/ + if (i >= PROGRAMMING_POLL_COUNTER) { + LOG(PDA_LOG, LOG_ERR, "Send command Queue did not empty, timeout\n"); + return false; + } + + return true; +} + +#endif + + + + + /* // Each RS message / call to this function is around 0.2 seconds apart //#define MAX_ACK_FOR_THREAD 200 // ~40 seconds (Init takes 30) @@ -141,7 +255,7 @@ bool loopover_devices(struct aqualinkdata *aq_data) { // Should look for message "ALL OFF", that's end of device list. for (i=0; i < 18 && (index = pda_find_m_index("ALL OFF")) == -1 ; i++) { - send_cmd(KEY_PDA_DOWN); + send_pda_cmd(KEY_PDA_DOWN); //waitForMessage(aq_data, NULL, 1); waitForPDAMessageTypes(aq_data,CMD_PDA_HIGHLIGHT,CMD_MSG_LONG,8); } @@ -180,7 +294,7 @@ bool find_pda_menu_item(struct aqualinkdata *aq_data, char *menuText, int charli if (strncasecmp(pda_m_line(9)," ^^ MORE", 10) == 0) { int j; for(j=0; j < 20; j++) { - send_cmd(KEY_PDA_DOWN); + send_pda_cmd(KEY_PDA_DOWN); //delay(500); //wait_for_empty_cmd_buffer(); //waitForPDAMessageType(aq_data,CMD_PDA_HIGHLIGHT,2); @@ -285,26 +399,26 @@ bool find_pda_menu_item(struct aqualinkdata *aq_data, char *menuText, int charli if ((min_index != -1) && ((index - i) > (i - min_index + max_index - index + 1))) { cnt = i - min_index + max_index - index + 1; for (i=0; i < cnt; i++) { - waitfor_queue2empty(); - send_cmd(KEY_PDA_UP); + waitfor_pda_queue2empty(); + send_pda_cmd(KEY_PDA_UP); } } else { for (i=pda_m_hlightindex(); i < index; i++) { - waitfor_queue2empty(); - send_cmd(KEY_PDA_DOWN); + waitfor_pda_queue2empty(); + send_pda_cmd(KEY_PDA_DOWN); } } } else if (i > index) { if ((min_index != -1) && ((i - index) > (index - min_index + max_index - i + 1))) { cnt = i - min_index + max_index - index + 1; for (i=0; i < cnt; i++) { - waitfor_queue2empty(); - send_cmd(KEY_PDA_UP); + waitfor_pda_queue2empty(); + send_pda_cmd(KEY_PDA_UP); } } else { for (i=pda_m_hlightindex(); i > index; i--) { - waitfor_queue2empty(); - send_cmd(KEY_PDA_UP); + waitfor_pda_queue2empty(); + send_pda_cmd(KEY_PDA_UP); } } } @@ -325,7 +439,7 @@ bool _select_pda_menu_item(struct aqualinkdata *aq_data, char *menuText, bool wa //int matchType = loose?-1:1; int matchType = loose?-1:strlen(menuText); // NSF Not way to check this. (release 2.2.0 introduced this with the line above) if ( find_pda_menu_item(aq_data, menuText, matchType) ) { - send_cmd(KEY_PDA_SELECT); + send_pda_cmd(KEY_PDA_SELECT); LOG(PDA_LOG,LOG_DEBUG, "PDA Device programmer selected menu item '%s'\n",menuText); if (waitForNextMenu) @@ -353,7 +467,7 @@ bool goto_pda_menu(struct aqualinkdata *aq_data, pda_menu_type menu) { if (pda_m_type() == PM_FW_VERSION) { LOG(PDA_LOG,LOG_DEBUG, "goto_pda_menu at FW version menu\n"); - send_cmd(KEY_PDA_BACK); + send_pda_cmd(KEY_PDA_BACK); if (! waitForPDAnextMenu(aq_data)) { LOG(PDA_LOG,LOG_ERR, "PDA Device programmer wait for next menu failed\n"); } @@ -366,14 +480,14 @@ bool goto_pda_menu(struct aqualinkdata *aq_data, pda_menu_type menu) { while (ret && (pda_m_type() != menu) && cnt <= 5) { switch (menu) { case PM_HOME: - send_cmd(KEY_PDA_BACK); + send_pda_cmd(KEY_PDA_BACK); ret = waitForPDAnextMenu(aq_data); break; case PM_EQUIPTMENT_CONTROL: if (pda_m_type() == PM_HOME) { ret = select_pda_menu_item(aq_data, "EQUIPMENT ON/OFF", true); } else { - send_cmd(KEY_PDA_BACK); + send_pda_cmd(KEY_PDA_BACK); ret = waitForPDAnextMenu(aq_data); } break; @@ -383,7 +497,7 @@ bool goto_pda_menu(struct aqualinkdata *aq_data, pda_menu_type menu) { } else if (pda_m_type() == PM_MAIN) { ret = select_pda_menu_item(aq_data, "PALM OPTIONS", true); } else { - send_cmd(KEY_PDA_BACK); + send_pda_cmd(KEY_PDA_BACK); ret = waitForPDAnextMenu(aq_data); } break; @@ -396,7 +510,7 @@ bool goto_pda_menu(struct aqualinkdata *aq_data, pda_menu_type menu) { } else if (pda_m_type() == PM_SYSTEM_SETUP) { ret = select_pda_menu_item(aq_data, "LABEL AUX", true); } else { - send_cmd(KEY_PDA_BACK); + send_pda_cmd(KEY_PDA_BACK); ret = waitForPDAnextMenu(aq_data); } } else { @@ -410,7 +524,7 @@ bool goto_pda_menu(struct aqualinkdata *aq_data, pda_menu_type menu) { } else if (pda_m_type() == PM_MAIN) { ret = select_pda_menu_item(aq_data, "SYSTEM SETUP", true); } else { - send_cmd(KEY_PDA_BACK); + send_pda_cmd(KEY_PDA_BACK); ret = waitForPDAnextMenu(aq_data); } } else { @@ -426,7 +540,7 @@ bool goto_pda_menu(struct aqualinkdata *aq_data, pda_menu_type menu) { } else if (pda_m_type() == PM_SYSTEM_SETUP) { ret = select_pda_menu_item(aq_data, "FREEZE PROTECT", true); } else { - send_cmd(KEY_PDA_BACK); + send_pda_cmd(KEY_PDA_BACK); ret = waitForPDAnextMenu(aq_data); } } else { @@ -439,7 +553,7 @@ bool goto_pda_menu(struct aqualinkdata *aq_data, pda_menu_type menu) { } else if (pda_m_type() == PM_MAIN) { ret = select_pda_menu_item(aq_data, "SET AquaPure", true); } else { - send_cmd(KEY_PDA_BACK); + send_pda_cmd(KEY_PDA_BACK); ret = waitForPDAnextMenu(aq_data); } break; @@ -450,7 +564,7 @@ bool goto_pda_menu(struct aqualinkdata *aq_data, pda_menu_type menu) { ret = select_pda_menu_item_loose(aq_data, "BOOST", true); //ret = select_pda_menu_item(aq_data, "BOOST", true); } else { - send_cmd(KEY_PDA_BACK); + send_pda_cmd(KEY_PDA_BACK); ret = waitForPDAnextMenu(aq_data); } //printf("****MENU SELECT RETURN %d*****\n",ret); @@ -471,7 +585,7 @@ bool goto_pda_menu(struct aqualinkdata *aq_data, pda_menu_type menu) { //waitForPDAMessageTypesOrMenu(aq_data,CMD_PDA_HIGHLIGHT,CMD_PDA_HIGHLIGHTCHARS,20,"press ANY key",8); } } else { - send_cmd(KEY_PDA_BACK); + send_pda_cmd(KEY_PDA_BACK); ret = waitForPDAnextMenu(aq_data); } break; @@ -481,7 +595,7 @@ bool goto_pda_menu(struct aqualinkdata *aq_data, pda_menu_type menu) { } else if (pda_m_type() == PM_MAIN) { ret = select_pda_menu_item(aq_data, "SET TIME", true); } else { - send_cmd(KEY_PDA_BACK); + send_pda_cmd(KEY_PDA_BACK); ret = waitForPDAnextMenu(aq_data); } break; @@ -541,23 +655,23 @@ void *set_aqualink_PDA_device_on_off( void *ptr ) } // NSF Added this since DEBUG hitting wrong command - //waitfor_queue2empty(); + //waitfor_pda_queue2empty(); if ( find_pda_menu_item(aq_data, device_name, 13) ) { if (aq_data->aqbuttons[device].led->state != state) { //printf("*** Select State ***\n"); LOG(PDA_LOG,LOG_INFO, "PDA Device On/Off, found device '%s', changing state\n",aq_data->aqbuttons[device].label,state); force_queue_delete(); // NSF This is a bad thing to do. Need to fix this - send_cmd(KEY_PDA_SELECT); - while (get_aq_cmd_length() > 0) { delay(500); } + send_pda_cmd(KEY_PDA_SELECT); + while (get_pda_queue_length() > 0) { delay(500); } // If you are turning on a heater there will be a sub menu to set temp if ((state == ON) && ((device == aq_data->pool_heater_index) || (device == aq_data->spa_heater_index))) { if (! waitForPDAnextMenu(aq_data)) { LOG(PDA_LOG,LOG_ERR, "PDA Device On/Off: %s on - waitForPDAnextMenu\n", aq_data->aqbuttons[device].label); } else { - send_cmd(KEY_PDA_SELECT); - while (get_aq_cmd_length() > 0) { delay(500); } + send_pda_cmd(KEY_PDA_SELECT); + while (get_pda_queue_length() > 0) { delay(500); } if (!waitForPDAMessageType(aq_data,CMD_PDA_HIGHLIGHT,20)) { LOG(PDA_LOG,LOG_ERR, "PDA Device On/Off: %s on - wait for CMD_PDA_HIGHLIGHT\n", aq_data->aqbuttons[device].label); @@ -640,7 +754,7 @@ void *set_aqualink_PDA_init( void *ptr ) //printf("****** Version '%s' ********\n",aq_data->version); LOG(PDA_LOG,LOG_DEBUG, "PDA type=%d, version=%s\n", _PDA_Type, aq_data->version); // don't wait for version menu to time out press back to get to home menu faster - //send_cmd(KEY_PDA_BACK); + //send_pda_cmd(KEY_PDA_BACK); //if (! waitForPDAnextMenu(aq_data)) { // waitForPDAnextMenu waits for highlight chars, which we don't get on normal menu if (! waitForPDAMessageType(aq_data,CMD_PDA_CLEAR,10)) { @@ -657,12 +771,12 @@ void *set_aqualink_PDA_init( void *ptr ) } */ // Get heater setpoints - if (! get_PDA_aqualink_pool_spa_heater_temps(aq_data)) { + if (! _get_PDA_aqualink_pool_spa_heater_temps(aq_data)) { LOG(PDA_LOG,LOG_ERR, "PDA Init :- Error getting heater setpoints\n"); } // Get freeze protect setpoint, AquaPalm doesn't have freeze protect in menu. - if (_PDA_Type != AQUAPALM && ! get_PDA_freeze_protect_temp(aq_data)) { + if (_PDA_Type != AQUAPALM && ! _get_PDA_freeze_protect_temp(aq_data)) { LOG(PDA_LOG,LOG_ERR, "PDA Init :- Error getting freeze setpoints\n"); } @@ -702,7 +816,7 @@ void *set_aqualink_PDA_wakeinit( void *ptr ) } -bool get_PDA_freeze_protect_temp(struct aqualinkdata *aq_data) { +bool _get_PDA_freeze_protect_temp(struct aqualinkdata *aq_data) { if ( _PDA_Type == PDA) { if (! goto_pda_menu(aq_data, PM_FREEZE_PROTECT)) { @@ -710,7 +824,7 @@ bool get_PDA_freeze_protect_temp(struct aqualinkdata *aq_data) { } /* select the freeze protect temp to see which devices are enabled by freeze protect */ - send_cmd(KEY_PDA_SELECT); + send_pda_cmd(KEY_PDA_SELECT); return waitForPDAnextMenu(aq_data); } else { LOG(PDA_LOG,LOG_INFO, "In PDA AquaPalm mode, freezepoints not supported\n"); @@ -718,7 +832,7 @@ bool get_PDA_freeze_protect_temp(struct aqualinkdata *aq_data) { } } -bool get_PDA_aqualink_pool_spa_heater_temps(struct aqualinkdata *aq_data) { +bool _get_PDA_aqualink_pool_spa_heater_temps(struct aqualinkdata *aq_data) { // Get heater setpoints if (! goto_pda_menu(aq_data, PM_SET_TEMP)) { @@ -732,6 +846,30 @@ bool get_PDA_aqualink_pool_spa_heater_temps(struct aqualinkdata *aq_data) { return true; } +void *get_PDA_aqualink_pool_spa_heater_temps( void *ptr ) +{ + struct programmingThreadCtrl *threadCtrl; + threadCtrl = (struct programmingThreadCtrl *) ptr; + struct aqualinkdata *aq_data = threadCtrl->aq_data; + + waitForSingleThreadOrTerminate(threadCtrl, AQ_PDA_GET_POOL_SPA_HEATER_TEMPS); + _get_PDA_aqualink_pool_spa_heater_temps(aq_data); + cleanAndTerminateThread(threadCtrl); + return ptr; +} + +void *get_PDA_freeze_protect_temp( void *ptr ) +{ + struct programmingThreadCtrl *threadCtrl; + threadCtrl = (struct programmingThreadCtrl *) ptr; + struct aqualinkdata *aq_data = threadCtrl->aq_data; + + waitForSingleThreadOrTerminate(threadCtrl, AQ_PDA_GET_FREEZE_PROTECT_TEMP); + _get_PDA_freeze_protect_temp(aq_data); + cleanAndTerminateThread(threadCtrl); + return ptr; +} + bool waitForPDAMessageHighlight(struct aqualinkdata *aq_data, int highlighIndex, int numMessageReceived) { LOG(PDA_LOG,LOG_DEBUG, "waitForPDAMessageHighlight index %d\n",highlighIndex); @@ -818,7 +956,7 @@ bool waitForPDAMessageTypesOrMenu(struct aqualinkdata *aq_data, unsigned char mt { if (gotmenu == false && line > 0 && text != NULL) { if (stristr(pda_m_line(line), text) != NULL) { - send_cmd(KEY_PDA_SELECT); + send_pda_cmd(KEY_PDA_SELECT); gotmenu = true; LOG(PDA_LOG,LOG_DEBUG, "waitForPDAMessageTypesOrMenu saw '%s' and line %d\n",text,line); } @@ -884,48 +1022,74 @@ bool set_PDA_numeric_field_value(struct aqualinkdata *aq_data, int val, int cur_ if (val < cur_val) { LOG(PDA_LOG,LOG_DEBUG, "Numeric selector %s value : lower from %d to %d\n", select_label, cur_val, val); for (i = cur_val; i > val; i=i-step) { - send_cmd(KEY_PDA_DOWN); + send_pda_cmd(KEY_PDA_DOWN); } } else if (val > cur_val) { LOG(PDA_LOG,LOG_DEBUG, "Numeric selector %s value : raise from %d to %d\n", select_label, cur_val, val); for (i = cur_val; i < val; i=i+step) { - send_cmd(KEY_PDA_UP); + send_pda_cmd(KEY_PDA_UP); } } else { LOG(PDA_LOG,LOG_DEBUG, "Numeric selector %s value : already at %d\n", select_label, val); } - send_cmd(KEY_PDA_SELECT); + send_pda_cmd(KEY_PDA_SELECT); LOG(PDA_LOG,LOG_DEBUG, "Numeric selector %s value : set to %d\n", select_label, val); return true; } -bool set_PDA_aqualink_SWG_setpoint(struct aqualinkdata *aq_data, int val) { +//bool set_PDA_aqualink_SWG_setpoint(struct aqualinkdata *aq_data, int val) { +void *set_PDA_aqualink_SWG_setpoint(void *ptr) { + struct programmingThreadCtrl *threadCtrl; + threadCtrl = (struct programmingThreadCtrl *) ptr; + struct aqualinkdata *aq_data = threadCtrl->aq_data; + + waitForSingleThreadOrTerminate(threadCtrl, AQ_PDA_SET_SWG_PERCENT); + + int val = atoi((char*)threadCtrl->thread_args); + val = setpoint_check(SWG_SETPOINT, val, aq_data); + if (! goto_pda_menu(aq_data, PM_AQUAPURE)) { LOG(PDA_LOG,LOG_ERR, "Error finding SWG setpoints menu\n"); - return false; + cleanAndTerminateThread(threadCtrl); + return ptr; } // wait for menu to display to capture current value with process_pda_packet_msg_long_SWG waitForPDAMessageTypes(aq_data,CMD_PDA_HIGHLIGHT,CMD_PDA_HIGHLIGHTCHARS, 10); - +/* if (pda_find_m_index("SET POOL") < 0) { // Single Setpoint Screen - return set_PDA_numeric_field_value(aq_data, val, -1, NULL, 5); - } else if (aq_data->aqbuttons[SPA_INDEX].led->state != OFF) { + set_PDA_numeric_field_value(aq_data, val, -1, NULL, 5); + } else*/ if (aq_data->aqbuttons[SPA_INDEX].led->state != OFF) { // Dual Setpoint Screen with SPA mode enabled // :TODO: aq_data should have 2 swg_precent values and GUI should be updated to // display and modify both values. - return set_PDA_numeric_field_value(aq_data, val, -1, "SET SPA", 5); + set_PDA_numeric_field_value(aq_data, val, -1, "SET SPA", 5); } else { // Dual Setpoint Screen with SPA mode disabled - return set_PDA_numeric_field_value(aq_data, val, -1, "SET POOL", 5); + set_PDA_numeric_field_value(aq_data, val, -1, "SET POOL", 5); } + + waitfor_pda_queue2empty(); + goto_pda_menu(aq_data, PM_HOME); + + cleanAndTerminateThread(threadCtrl); + return ptr; } -bool set_PDA_aqualink_boost(struct aqualinkdata *aq_data, bool val) +//bool set_PDA_aqualink_boost(struct aqualinkdata *aq_data, bool val) +void *set_PDA_aqualink_boost(void *ptr) { + struct programmingThreadCtrl *threadCtrl; + threadCtrl = (struct programmingThreadCtrl *) ptr; + struct aqualinkdata *aq_data = threadCtrl->aq_data; + + waitForSingleThreadOrTerminate(threadCtrl, AQ_PDA_SET_BOOST); + + int val = atoi((char*)threadCtrl->thread_args); + if (! goto_pda_menu(aq_data, PM_BOOST)) { LOG(PDA_LOG,LOG_ERR, "Error finding BOOST menu\n"); return false; @@ -948,9 +1112,14 @@ bool set_PDA_aqualink_boost(struct aqualinkdata *aq_data, bool val) select_pda_menu_item_loose(aq_data, "STOP", false); } - return true; + waitfor_pda_queue2empty(); + goto_pda_menu(aq_data, PM_HOME); + cleanAndTerminateThread(threadCtrl); + return ptr; } + + bool set_PDA_aqualink_heater_setpoint(struct aqualinkdata *aq_data, int val, bool isPool) { char label[10]; int cur_val; @@ -975,7 +1144,7 @@ bool set_PDA_aqualink_heater_setpoint(struct aqualinkdata *aq_data, int val, boo if (val == cur_val) { LOG(PDA_LOG,LOG_INFO, "PDA %s setpoint : temp already %d\n", label, val); - send_cmd(KEY_PDA_BACK); + send_pda_cmd(KEY_PDA_BACK); return true; } @@ -989,26 +1158,92 @@ bool set_PDA_aqualink_heater_setpoint(struct aqualinkdata *aq_data, int val, boo return true; } -bool set_PDA_aqualink_freezeprotect_setpoint(struct aqualinkdata *aq_data, int val) { +void *set_aqualink_PDA_pool_heater_temps( void *ptr ) +{ + struct programmingThreadCtrl *threadCtrl; + threadCtrl = (struct programmingThreadCtrl *) ptr; + struct aqualinkdata *aq_data = threadCtrl->aq_data; + //char *name; + //char *menu_name; + waitForSingleThreadOrTerminate(threadCtrl, AQ_PDA_SET_POOL_HEATER_TEMPS); + + int val = atoi((char*)threadCtrl->thread_args); + val = setpoint_check(POOL_HTR_SETOINT, val, aq_data); + + set_PDA_aqualink_heater_setpoint(aq_data, val, true); + + waitfor_pda_queue2empty(); + goto_pda_menu(aq_data, PM_HOME); + + cleanAndTerminateThread(threadCtrl); + return ptr; +} +void *set_aqualink_PDA_spa_heater_temps( void *ptr ) +{ + struct programmingThreadCtrl *threadCtrl; + threadCtrl = (struct programmingThreadCtrl *) ptr; + struct aqualinkdata *aq_data = threadCtrl->aq_data; + //char *name; + //char *menu_name; + waitForSingleThreadOrTerminate(threadCtrl, AQ_PDA_SET_SPA_HEATER_TEMPS); + + int val = atoi((char*)threadCtrl->thread_args); + val = setpoint_check(SPA_HTR_SETOINT, val, aq_data); + + set_PDA_aqualink_heater_setpoint(aq_data, val, false); + + waitfor_pda_queue2empty(); + goto_pda_menu(aq_data, PM_HOME); + + cleanAndTerminateThread(threadCtrl); + return ptr; +} + +//bool set_PDA_aqualink_freezeprotect_setpoint(struct aqualinkdata *aq_data, int val) { +void *set_aqualink_PDA_freeze_protectsetpoint( void *ptr ) +{ + struct programmingThreadCtrl *threadCtrl; + threadCtrl = (struct programmingThreadCtrl *) ptr; + struct aqualinkdata *aq_data = threadCtrl->aq_data; + + waitForSingleThreadOrTerminate(threadCtrl, AQ_PDA_SET_FREEZE_PROTECT_TEMP); + + int val = atoi((char*)threadCtrl->thread_args); + + val = setpoint_check(FREEZE_SETPOINT, val, aq_data); if (_PDA_Type != PDA) { LOG(PDA_LOG,LOG_INFO, "In PDA AquaPalm mode, freezepoints not supported\n"); - return false; + //return false; } else if (! goto_pda_menu(aq_data, PM_FREEZE_PROTECT)) { LOG(PDA_LOG,LOG_ERR, "Error finding freeze protect setpoints menu\n"); - return false; + //return false; } else if (! set_PDA_numeric_field_value(aq_data, val, aq_data->frz_protect_set_point, NULL, 1)) { LOG(PDA_LOG,LOG_ERR, "Error failed to set freeze protect temp value\n"); - return false; + //return false; } else { - return waitForPDAnextMenu(aq_data); + waitForPDAnextMenu(aq_data); } + + waitfor_pda_queue2empty(); + goto_pda_menu(aq_data, PM_HOME); + + cleanAndTerminateThread(threadCtrl); + return ptr; } -bool set_PDA_aqualink_time(struct aqualinkdata *aq_data) { +//bool set_PDA_aqualink_time(struct aqualinkdata *aq_data) +void *set_PDA_aqualink_time( void *ptr ) +{ + struct programmingThreadCtrl *threadCtrl; + threadCtrl = (struct programmingThreadCtrl *) ptr; + struct aqualinkdata *aq_data = threadCtrl->aq_data; + + waitForSingleThreadOrTerminate(threadCtrl, AQ_PDA_SET_TIME); + if (! goto_pda_menu(aq_data, PM_SET_TIME)) { LOG(PDA_LOG,LOG_ERR, "Error finding set time menu\n"); - return false; + goto f_end; } struct tm tm; struct tm panel_tm; @@ -1034,12 +1269,12 @@ Debug: PDA: PDA Menu Line 9 = to continue. if (strptime(pda_m_line(2), "%t%D %a", &panel_tm) == NULL) { LOG(PDA_LOG,LOG_ERR, "set_PDA_aqualink_time read date (%.*s) failed\n", AQ_MSGLEN, pda_m_line(2)); - return false; + goto f_end; } if (strptime(pda_m_line(3), "%t%I:%M %p", &panel_tm) == NULL) { LOG(PDA_LOG,LOG_ERR, "set_PDA_aqualink_time read time (%.*s) failed\n", AQ_MSGLEN, pda_m_line(3)); - return false; + goto f_end; } panel_tm.tm_isdst = tm.tm_isdst; panel_tm.tm_sec = 0; @@ -1065,13 +1300,26 @@ Debug: PDA: PDA Menu Line 9 = to continue. } waitForPDAnextMenu(aq_data); + waitfor_pda_queue2empty(); + goto_pda_menu(aq_data, PM_HOME); - return true; + f_end: + + cleanAndTerminateThread(threadCtrl); + return ptr; } // Test ine this. -bool get_PDA_aqualink_aux_labels(struct aqualinkdata *aq_data) { -#ifdef BETA_PDA_AUTOLABEL +//bool get_PDA_aqualink_aux_labels(struct aqualinkdata *aq_data) { +void *get_PDA_aqualink_aux_labels( void *ptr ) { + + struct programmingThreadCtrl *threadCtrl; + threadCtrl = (struct programmingThreadCtrl *) ptr; +#ifdef BETA_PDA_AUTOLABEL + struct aqualinkdata *aq_data = threadCtrl->aq_data; + + waitForSingleThreadOrTerminate(threadCtrl, AQ_PDA_GET_AUX_LABELS); + int i=0; char label[10]; @@ -1079,19 +1327,29 @@ bool get_PDA_aqualink_aux_labels(struct aqualinkdata *aq_data) { if (! goto_pda_menu(aq_data, PM_AUX_LABEL)) { LOG(PDA_LOG,LOG_ERR, "Error finding aux label menu\n"); - return false; + goto f_end; } for (i=1;i<8;i++) { sprintf(label, "AUX%d",i); select_pda_menu_item(aq_data, label, true); - send_cmd(KEY_PDA_BACK); + send_pda_cmd(KEY_PDA_BACK); waitForPDAnextMenu(aq_data); } // Read first page of devices and make some assumptions. + + waitfor_pda_queue2empty(); + goto_pda_menu(aq_data, PM_HOME); + + f_end: + +#else + LOG(PDA_LOG,LOG_INFO, "Finding PDA labels, (NOT IMPLIMENTED)\n"); #endif - return true; + + cleanAndTerminateThread(threadCtrl); + return ptr; } /* diff --git a/pda_aq_programmer.h b/pda_aq_programmer.h index 55ea22bd..9d668a04 100644 --- a/pda_aq_programmer.h +++ b/pda_aq_programmer.h @@ -7,30 +7,51 @@ typedef enum pda_type { PDA } pda_type; + + +//void waitfor_pda_queue2empty(); +//void send_pda_cmd(unsigned char cmd); +//unsigned char pop_pda_cmd(struct aqualinkdata *aq_data); + + +unsigned char pop_pda_cmd(struct aqualinkdata *aq_data); + + void *get_aqualink_PDA_device_status( void *ptr ); void *set_aqualink_PDA_device_on_off( void *ptr ); void *set_aqualink_PDA_wakeinit( void *ptr ); void *set_aqualink_PDA_init( void *ptr ); -bool set_PDA_aqualink_heater_setpoint(struct aqualinkdata *aq_data, int val, bool isPool); -bool set_PDA_aqualink_SWG_setpoint(struct aqualinkdata *aq_data, int val); -bool set_PDA_aqualink_freezeprotect_setpoint(struct aqualinkdata *aq_data, int val); +//bool set_PDA_aqualink_heater_setpoint(struct aqualinkdata *aq_data, int val, bool isPool); +//bool set_PDA_aqualink_SWG_setpoint(struct aqualinkdata *aq_data, int val); +void *set_PDA_aqualink_SWG_setpoint(void *ptr); +//bool set_PDA_aqualink_freezeprotect_setpoint(struct aqualinkdata *aq_data, int val); + -bool get_PDA_aqualink_pool_spa_heater_temps(struct aqualinkdata *aq_data); -bool get_PDA_freeze_protect_temp(struct aqualinkdata *aq_data); +void *set_aqualink_PDA_pool_heater_temps( void *ptr ); +void *set_aqualink_PDA_spa_heater_temps( void *ptr ); -bool get_PDA_aqualink_aux_labels(struct aqualinkdata *aq_data); +void *set_aqualink_PDA_freeze_protectsetpoint( void *ptr ); -bool set_PDA_aqualink_boost(struct aqualinkdata *aq_data, bool val); -bool set_PDA_aqualink_time(struct aqualinkdata *aq_data); +//bool get_PDA_aqualink_aux_labels(struct aqualinkdata *aq_data); +void *get_PDA_aqualink_aux_labels( void *ptr ); +void *get_PDA_aqualink_pool_spa_heater_temps( void *ptr ); +//bool set_PDA_aqualink_boost(struct aqualinkdata *aq_data, bool val); +void *set_PDA_aqualink_boost(void *ptr); +//bool set_PDA_aqualink_time(struct aqualinkdata *aq_data); +void *set_PDA_aqualink_time( void *ptr ); + +/* // These are from aq_programmer.c , exposed here for PDA AQ PROGRAMMER void send_cmd(unsigned char cmd); bool push_aq_cmd(unsigned char cmd); bool waitForMessage(struct aqualinkdata *aq_data, char* message, int numMessageReceived); void waitfor_queue2empty(); void longwaitfor_queue2empty(); +*/ + //void pda_programming_thread_check(struct aqualinkdata *aq_data); diff --git a/release/aqualinkd-arm64 b/release/aqualinkd-arm64 index d25f71972f747b29b181f67d2bf837fdba3ccc3c..6abab5c04ba2766f008cf15fb48fb7c63ea548e5 100755 GIT binary patch delta 233464 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 d&p5ePd{|{evI`{wp delta 221230 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

q$8-7;ZZki&_QkST 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℞NvAL|hB{6)Vi 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 pLIn4g`*Ei)O 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 delta 23237 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 diff --git a/release/serial_logger-armhf b/release/serial_logger-armhf index ddfa838301b52987377210731305f46e6b430674..23c01595e2249795bc6c30e67b0bddb6a5f09b38 100755 GIT binary patch delta 17732 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 EUyvb}S^xk5 delta 17575 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 Cn`iR? diff --git a/serial_logger.c b/serial_logger.c index 06c61c40..c3b5fc5a 100644 --- a/serial_logger.c +++ b/serial_logger.c @@ -41,7 +41,7 @@ #define SLOG_MAX 80 #define PACKET_MAX 600 -#define VERSION "serial_logger V2.2" +#define VERSION "serial_logger V2.3" /* typedef enum used { @@ -64,6 +64,7 @@ struct aqconfig _aqconfig_; char _panelType[AQ_MSGLEN]; char _panelRev[AQ_MSGLEN]; +bool _panelPDA = false; typedef struct serial_id_log { unsigned char ID; @@ -259,15 +260,17 @@ char* canUseExtended(unsigned char ID) { return " <-- can use for Aqualinkd (PDA mode only)"; } for (i = 0; i < 4; i++) { - if (ID == _goodONETID[i]) + if (ID == _goodONETID[i] && _panelPDA == false) return " <-- can use for Aqualinkd (Extended Device ID)"; } for (i = 0; i < 4; i++) { - if (ID == _goodIAQTID[i]) + if (ID == _goodIAQTID[i] && _panelPDA == false) return " <-- can use for Aqualinkd (Prefered Extended Device ID)"; + else if (ID == _goodIAQTID[i] && _panelPDA == true) + return " <-- can use for Aqualinkd (PDA mode Expermental only)"; } for (i = 0; i < 2; i++) { - if (ID == _goodRSSAID[i]) + if (ID == _goodRSSAID[i] && _panelPDA == false) return " <-- can use for Aqualinkd (RSSA ID)"; } return ""; @@ -294,6 +297,10 @@ void getPanelInfo(int rs_fd, unsigned char *packet_buffer, int packet_length) else if (msgcnt == 3) rsm_strncpy(_panelType, packet_buffer+4, AQ_MSGLEN, packet_length-5); } + + if (_panelType[1] == 'P' && _panelType[2] == 'D') { // PDA Panel + _panelPDA = true; + } } #ifdef SERIAL_LOGGER @@ -395,7 +402,8 @@ int main(int argc, char *argv[]) { _aqconfig_.log_protocol_packets = false; _aqconfig_.log_raw_bytes = false; _aqconfig_.ftdi_low_latency = true; - + _aqconfig_.frame_delay = 10; + printf("AqualinkD %s\n",VERSION); if (getuid() != 0) { @@ -742,16 +750,21 @@ int _serial_logger(int rs_fd, char *port_name, int logPackets, int logLevel, boo if (slog[i].inuse == true) continue; - if (canUseAllB(slog[i].ID) && (mainID == 0x00 || canUsePDA(mainID))) - mainID = slog[i].ID; - if (canUsePDA(slog[i].ID) && mainID == 0x00) - mainID = slog[i].ID; - else if (canUseRSSA(slog[i].ID) && rssaID == 0x00) - rssaID = slog[i].ID; - else if (canUseONET(slog[i].ID) && extID == 0x00) - extID = slog[i].ID; - else if (canUseIQAT(slog[i].ID) && (extID == 0x00 || canUseONET(extID))) - extID = slog[i].ID; + if (!_panelPDA) { + if (canUseAllB(slog[i].ID) && (mainID == 0x00 || canUsePDA(mainID))) + mainID = slog[i].ID; + if (canUsePDA(slog[i].ID) && mainID == 0x00) + mainID = slog[i].ID; + else if (canUseRSSA(slog[i].ID) && rssaID == 0x00) + rssaID = slog[i].ID; + else if (canUseONET(slog[i].ID) && extID == 0x00) + extID = slog[i].ID; + else if (canUseIQAT(slog[i].ID) && (extID == 0x00 || canUseONET(extID))) + extID = slog[i].ID; + } else { + if (canUsePDA(slog[i].ID) && mainID == 0x00) + mainID = slog[i].ID; + } } LOG(RSSD_LOG, LOG_NOTICE, "Suggested aqualinkd.conf values\n"); diff --git a/time.out b/time.out deleted file mode 100644 index 4f88267b..00000000 --- a/time.out +++ /dev/null @@ -1,600 +0,0 @@ -Debug: RS Serial: Time 0.59 sec (59437865 ns) -Debug: RS Serial: Time 0.10 sec (10919058 ns) -Debug: RS Serial: Time 0.09 sec (09934119 ns) -Debug: RS Serial: Time 0.17 sec (17965098 ns) -Debug: RS Serial: Time 0.07 sec (07933240 ns) -Debug: RS Serial: Time 0.461 sec (461889391 ns) -Debug: RS Serial: Time 0.09 sec (09914193 ns) -Debug: RS Serial: Time 0.12 sec (12930179 ns) -Debug: RS Serial: Time 0.10 sec (10946132 ns) -Debug: RS Serial: Time 0.09 sec (09939767 ns) -Debug: RS Serial: Time 0.17 sec (17943857 ns) -Debug: RS Serial: Time 0.07 sec (07940721 ns) -Debug: RS Serial: Time 0.64 sec (64939477 ns) -Debug: RS Serial: Time 0.10 sec (10928577 ns) -Debug: RS Serial: Time 0.12 sec (12945622 ns) -Debug: RS Serial: Time 0.10 sec (10947262 ns) -Debug: RS Serial: Time 0.09 sec (09933341 ns) -Debug: RS Serial: Time 0.17 sec (17954134 ns) -Debug: RS Serial: Time 0.08 sec (08930290 ns) -Debug: RS Serial: Time 0.462 sec (462875126 ns) -Debug: RS Serial: Time 0.09 sec (09888860 ns) -Debug: RS Serial: Time 0.13 sec (13926859 ns) -Debug: RS Serial: Time 0.09 sec (09938878 ns) -Debug: RS Serial: Time 0.09 sec (09944415 ns) -Debug: RS Serial: Time 0.17 sec (17948098 ns) -Debug: RS Serial: Time 0.08 sec (08928735 ns) -Debug: RS Serial: Time 0.63 sec (63899667 ns) -Debug: RS Serial: Time 0.09 sec (09912563 ns) -Debug: RS Serial: Time 0.13 sec (13953320 ns) -Debug: RS Serial: Time 0.09 sec (09915989 ns) -Debug: RS Serial: Time 0.10 sec (10925226 ns) -Debug: RS Serial: Time 0.16 sec (16950732 ns) -Debug: RS Serial: Time 0.08 sec (08952531 ns) -Debug: RS Serial: Time 0.463 sec (463932706 ns) -Debug: RS Serial: Time 0.09 sec (09847991 ns) -Debug: RS Serial: Time 0.26 sec (26916220 ns) -Debug: RS Serial: Time 0.10 sec (10896133 ns) -Debug: RS Serial: Time 0.13 sec (13942969 ns) -Debug: RS Serial: Time 0.09 sec (09941396 ns) -Debug: RS Serial: Time 0.10 sec (10936465 ns) -Debug: RS Serial: Time 0.16 sec (16949028 ns) -Debug: RS Serial: Time 0.08 sec (08924216 ns) -Debug: RS Serial: Time 0.60 sec (60934255 ns) -Debug: RS Serial: Time 0.09 sec (09926545 ns) -Debug: RS Serial: Time 0.13 sec (13953173 ns) -Debug: RS Serial: Time 0.09 sec (09950711 ns) -Debug: RS Serial: Time 0.10 sec (10964539 ns) -Debug: RS Serial: Time 0.16 sec (16895881 ns) -Debug: RS Serial: Time 0.09 sec (09923582 ns) -Debug: RS Serial: Time 0.62 sec (62950690 ns) -Debug: RS Serial: Time 0.10 sec (10915410 ns) -Debug: RS Serial: Time 0.08 sec (08929772 ns) -Debug: RS Serial: Time 0.61 sec (61924307 ns) -Debug: RS Serial: Time 0.09 sec (09953915 ns) -Debug: RS Serial: Time 0.10 sec (10931521 ns) -Debug: RS Serial: Time 0.16 sec (16944009 ns) -Debug: RS Serial: Time 0.09 sec (09926138 ns) -Debug: RS Serial: Time 0.64 sec (64950808 ns) -Debug: RS Serial: Time 0.09 sec (09962155 ns) -Debug: RS Serial: Time 0.13 sec (13942839 ns) -Debug: RS Serial: Time 0.09 sec (09942452 ns) -Debug: RS Serial: Time 0.10 sec (10958058 ns) -Debug: RS Serial: Time 0.16 sec (16946065 ns) -Debug: RS Serial: Time 0.09 sec (09959840 ns) -Debug: RS Serial: Time 0.62 sec (62955707 ns) -Debug: RS Serial: Time 0.10 sec (10928058 ns) -Debug: RS Serial: Time 0.12 sec (12953307 ns) -Debug: RS Serial: Time 0.09 sec (09964488 ns) -Debug: RS Serial: Time 0.10 sec (10953502 ns) -Debug: RS Serial: Time 0.16 sec (16963398 ns) -Debug: RS Serial: Time 0.09 sec (09928804 ns) -Debug: RS Serial: Time 0.62 sec (62947318 ns) -Debug: RS Serial: Time 0.10 sec (10940836 ns) -Debug: RS Serial: Time 0.12 sec (12956233 ns) -Debug: RS Serial: Time 0.09 sec (09951229 ns) -Debug: RS Serial: Time 0.10 sec (10973298 ns) -Debug: RS Serial: Time 0.16 sec (16955713 ns) -Debug: RS Serial: Time 0.09 sec (09937285 ns) -Debug: RS Serial: Time 0.62 sec (62953874 ns) -Debug: RS Serial: Time 0.10 sec (10948465 ns) -Debug: RS Serial: Time 0.13 sec (13001954 ns) -Debug: RS Serial: Time 0.09 sec (09878953 ns) -Debug: RS Serial: Time 0.10 sec (10947780 ns) -Debug: RS Serial: Time 0.16 sec (16950287 ns) -Debug: RS Serial: Time 0.09 sec (09959118 ns) -Debug: RS Serial: Time 0.62 sec (62957096 ns) -Debug: RS Serial: Time 0.10 sec (10920910 ns) -Debug: RS Serial: Time 0.12 sec (12954474 ns) -Debug: RS Serial: Time 0.09 sec (09957785 ns) -Debug: RS Serial: Time 0.10 sec (10964909 ns) -Debug: RS Serial: Time 0.16 sec (16956398 ns) -Debug: RS Serial: Time 0.09 sec (09937174 ns) -Debug: RS Serial: Time 0.62 sec (62955911 ns) -Debug: RS Serial: Time 0.10 sec (10948725 ns) -Debug: RS Serial: Time 0.12 sec (12963122 ns) -Debug: RS Serial: Time 0.09 sec (09961488 ns) -Debug: RS Serial: Time 0.10 sec (10959539 ns) -Debug: RS Serial: Time 0.16 sec (16977398 ns) -Debug: RS Serial: Time 0.09 sec (09938285 ns) -Debug: RS Serial: Time 0.62 sec (62952077 ns) -Debug: RS Serial: Time 0.10 sec (10960335 ns) -Debug: RS Serial: Time 0.08 sec (08950568 ns) -Debug: RS Serial: Time 0.61 sec (61954767 ns) -Debug: RS Serial: Time 0.09 sec (09911304 ns) -Debug: RS Serial: Time 0.10 sec (10956409 ns) -Debug: RS Serial: Time 0.16 sec (16949916 ns) -Debug: RS Serial: Time 0.08 sec (08947049 ns) -Debug: RS Serial: Time 0.60 sec (60954568 ns) -Debug: RS Serial: Time 0.10 sec (10936910 ns) -Debug: RS Serial: Time 0.12 sec (12932900 ns) -Debug: RS Serial: Time 0.09 sec (09938508 ns) -Debug: RS Serial: Time 0.10 sec (10954113 ns) -Debug: RS Serial: Time 0.17 sec (17947356 ns) -Debug: RS Serial: Time 0.08 sec (08962345 ns) -Debug: RS Serial: Time 0.62 sec (62951132 ns) -Debug: RS Serial: Time 0.10 sec (10952335 ns) -Debug: RS Serial: Time 0.12 sec (12948751 ns) -Debug: RS Serial: Time 0.09 sec (09958507 ns) -Debug: RS Serial: Time 0.10 sec (10960836 ns) -Debug: RS Serial: Time 0.17 sec (17951505 ns) -Debug: RS Serial: Time 0.08 sec (08956660 ns) -Debug: RS Serial: Time 0.62 sec (62955818 ns) -Debug: RS Serial: Time 0.10 sec (10947558 ns) -Debug: RS Serial: Time 0.26 sec (26958849 ns) -Debug: RS Serial: Time 0.09 sec (09946081 ns) -Debug: RS Serial: Time 0.13 sec (13959357 ns) -Debug: RS Serial: Time 0.09 sec (09960452 ns) -Debug: RS Serial: Time 0.10 sec (10964298 ns) -Debug: RS Serial: Time 0.16 sec (16952806 ns) -Debug: RS Serial: Time 0.08 sec (08948679 ns) -Debug: RS Serial: Time 0.60 sec (60949513 ns) -Debug: RS Serial: Time 0.10 sec (10952150 ns) -Debug: RS Serial: Time 0.12 sec (12959880 ns) -Debug: RS Serial: Time 0.09 sec (09914638 ns) -Debug: RS Serial: Time 0.10 sec (10998871 ns) -Debug: RS Serial: Time 0.17 sec (17910320 ns) -Debug: RS Serial: Time 0.08 sec (08955735 ns) -Debug: RS Serial: Time 0.62 sec (62945910 ns) -Debug: RS Serial: Time 0.10 sec (10948447 ns) -Debug: RS Serial: Time 0.12 sec (12948047 ns) -Debug: RS Serial: Time 0.09 sec (09968544 ns) -Debug: RS Serial: Time 0.10 sec (10951947 ns) -Debug: RS Serial: Time 0.17 sec (17954745 ns) -Debug: RS Serial: Time 0.08 sec (08956530 ns) -Debug: RS Serial: Time 0.62 sec (62948540 ns) -Debug: RS Serial: Time 0.10 sec (10942132 ns) -Debug: RS Serial: Time 0.12 sec (12948047 ns) -Debug: RS Serial: Time 0.10 sec (10968613 ns) -Debug: RS Serial: Time 0.09 sec (09963081 ns) -Debug: RS Serial: Time 0.17 sec (17976170 ns) -Debug: RS Serial: Time 0.08 sec (08932920 ns) -Debug: RS Serial: Time 0.62 sec (62911503 ns) -Debug: RS Serial: Time 0.10 sec (10918299 ns) -Debug: RS Serial: Time 0.08 sec (08979567 ns) -Debug: RS Serial: Time 0.61 sec (61869176 ns) -Debug: RS Serial: Time 0.10 sec (10947576 ns) -Debug: RS Serial: Time 0.09 sec (09915619 ns) -Debug: RS Serial: Time 0.16 sec (16978526 ns) -Debug: RS Serial: Time 0.08 sec (08879903 ns) -Debug: RS Serial: Time 0.60 sec (60951160 ns) -Debug: RS Serial: Time 0.10 sec (10942909 ns) -Debug: RS Serial: Time 0.12 sec (12960380 ns) -Debug: RS Serial: Time 0.10 sec (10966909 ns) -Debug: RS Serial: Time 0.09 sec (09951470 ns) -Debug: RS Serial: Time 0.17 sec (17932227 ns) -Debug: RS Serial: Time 0.08 sec (08941919 ns) -Debug: RS Serial: Time 0.26 sec (26955311 ns) -Debug: RS Serial: Time 0.10 sec (10954798 ns) -Debug: RS Serial: Time 0.12 sec (12942789 ns) -Debug: RS Serial: Time 0.10 sec (10948835 ns) -Debug: RS Serial: Time 0.08 sec (08945197 ns) -Debug: RS Serial: Time 0.20 sec (20949360 ns) -Debug: RS Serial: Time 0.17 sec (17943226 ns) -Debug: RS Serial: Time 0.08 sec (08946067 ns) -Debug: RS Serial: Time 0.63 sec (63960775 ns) -Debug: RS Serial: Time 0.10 sec (10913318 ns) -Debug: RS Serial: Time 0.12 sec (12917493 ns) -Debug: RS Serial: Time 0.10 sec (10946299 ns) -Debug: RS Serial: Time 0.26 sec (26928274 ns) -Debug: RS Serial: Time 0.21 sec (21964687 ns) -Debug: RS Serial: Time 0.17 sec (17912819 ns) -Debug: RS Serial: Time 0.08 sec (08932956 ns) -Debug: RS Serial: Time 0.63 sec (63955423 ns) -Debug: RS Serial: Time 0.10 sec (10957150 ns) -Debug: RS Serial: Time 0.12 sec (12970251 ns) -Debug: RS Serial: Time 0.10 sec (10945946 ns) -Debug: RS Serial: Time 0.08 sec (08956326 ns) -Debug: RS Serial: Time 0.20 sec (20955138 ns) -Debug: RS Serial: Time 0.16 sec (16950249 ns) -Debug: RS Serial: Time 0.08 sec (08960919 ns) -Debug: RS Serial: Time 0.63 sec (63963645 ns) -Debug: RS Serial: Time 0.10 sec (10888226 ns) -Debug: RS Serial: Time 0.12 sec (12945381 ns) -Debug: RS Serial: Time 0.10 sec (10956668 ns) -Debug: RS Serial: Time 0.26 sec (26977737 ns) -Debug: RS Serial: Time 0.21 sec (21913652 ns) -Debug: RS Serial: Time 0.16 sec (16960749 ns) -Debug: RS Serial: Time 0.08 sec (08963160 ns) -Debug: RS Serial: Time 0.58 sec (58983336 ns) -Debug: RS Serial: Time 0.59 sec (59798410 ns) -Debug: RS Serial: Time 0.10 sec (10949113 ns) -Debug: RS Serial: Time 0.12 sec (12950807 ns) -Debug: RS Serial: Time 0.10 sec (10965502 ns) -Debug: RS Serial: Time 0.08 sec (08950308 ns) -Debug: RS Serial: Time 0.56 sec (56934902 ns) -Debug: RS Serial: Time 0.16 sec (16948379 ns) -Debug: RS Serial: Time 0.08 sec (08948920 ns) -Debug: RS Serial: Time 0.63 sec (63964015 ns) -Debug: RS Serial: Time 0.10 sec (10923613 ns) -Debug: RS Serial: Time 0.12 sec (12964380 ns) -Debug: RS Serial: Time 0.10 sec (10966834 ns) -Debug: RS Serial: Time 0.08 sec (08948160 ns) -Debug: RS Serial: Time 0.55 sec (55974795 ns) -Debug: RS Serial: Time 0.17 sec (17899339 ns) -Debug: RS Serial: Time 0.07 sec (07947795 ns) -Debug: RS Serial: Time 0.63 sec (63953088 ns) -Debug: RS Serial: Time 0.10 sec (10950705 ns) -Debug: RS Serial: Time 0.26 sec (26956774 ns) -Debug: RS Serial: Time 0.10 sec (10946520 ns) -Debug: RS Serial: Time 0.12 sec (12958547 ns) -Debug: RS Serial: Time 0.10 sec (10959909 ns) -Debug: RS Serial: Time 0.11 sec (11952904 ns) -Debug: RS Serial: Time 0.29 sec (29952536 ns) -Debug: RS Serial: Time 0.07 sec (07956998 ns) -Debug: RS Serial: Time 0.56 sec (56971586 ns) -Debug: RS Serial: Time 0.16 sec (16958749 ns) -Debug: RS Serial: Time 0.08 sec (08926976 ns) -Debug: RS Serial: Time 0.64 sec (64950139 ns) -Debug: RS Serial: Time 0.09 sec (09956932 ns) -Debug: RS Serial: Time 0.12 sec (12959806 ns) -Debug: RS Serial: Time 0.10 sec (10950780 ns) -Debug: RS Serial: Time 0.08 sec (08973660 ns) -Debug: RS Serial: Time 0.55 sec (55932351 ns) -Debug: RS Serial: Time 0.17 sec (17944337 ns) -Debug: RS Serial: Time 0.07 sec (07929203 ns) -Debug: RS Serial: Time 0.64 sec (64952825 ns) -Debug: RS Serial: Time 0.09 sec (09947155 ns) -Debug: RS Serial: Time 0.12 sec (12967861 ns) -Debug: RS Serial: Time 0.10 sec (10944669 ns) -Debug: RS Serial: Time 0.08 sec (08961622 ns) -Debug: RS Serial: Time 0.55 sec (55952758 ns) -Debug: RS Serial: Time 0.17 sec (17959504 ns) -Debug: RS Serial: Time 0.07 sec (07957979 ns) -Debug: RS Serial: Time 0.64 sec (64946380 ns) -Debug: RS Serial: Time 0.09 sec (09957081 ns) -Debug: RS Serial: Time 0.08 sec (08939826 ns) -Debug: RS Serial: Time 0.62 sec (62950982 ns) -Debug: RS Serial: Time 0.09 sec (09932896 ns) -Debug: RS Serial: Time 0.08 sec (08957881 ns) -Debug: RS Serial: Time 0.57 sec (57945210 ns) -Debug: RS Serial: Time 0.17 sec (17946670 ns) -Debug: RS Serial: Time 0.07 sec (07953146 ns) -Debug: RS Serial: Time 0.64 sec (64951064 ns) -Debug: RS Serial: Time 0.09 sec (09931507 ns) -Debug: RS Serial: Time 0.13 sec (13962690 ns) -Debug: RS Serial: Time 0.09 sec (09952655 ns) -Debug: RS Serial: Time 0.08 sec (08954586 ns) -Debug: RS Serial: Time 0.55 sec (55958628 ns) -Debug: RS Serial: Time 0.17 sec (17960688 ns) -Debug: RS Serial: Time 0.07 sec (07940239 ns) -Debug: RS Serial: Time 0.64 sec (64956972 ns) -Debug: RS Serial: Time 0.09 sec (09948414 ns) -Debug: RS Serial: Time 0.13 sec (13958449 ns) -Debug: RS Serial: Time 0.09 sec (09950989 ns) -Debug: RS Serial: Time 0.08 sec (08959456 ns) -Debug: RS Serial: Time 0.55 sec (55951739 ns) -Debug: RS Serial: Time 0.17 sec (17958781 ns) -Debug: RS Serial: Time 0.07 sec (07946813 ns) -Debug: RS Serial: Time 0.64 sec (64950843 ns) -Debug: RS Serial: Time 0.09 sec (09931544 ns) -Debug: RS Serial: Time 0.13 sec (13960153 ns) -Debug: RS Serial: Time 0.09 sec (09932026 ns) -Debug: RS Serial: Time 0.08 sec (08953790 ns) -Debug: RS Serial: Time 0.56 sec (56936087 ns) -Debug: RS Serial: Time 0.16 sec (16937657 ns) -Debug: RS Serial: Time 0.07 sec (07935943 ns) -Debug: RS Serial: Time 0.64 sec (64948231 ns) -Debug: RS Serial: Time 0.09 sec (09945636 ns) -Debug: RS Serial: Time 0.13 sec (13959468 ns) -Debug: RS Serial: Time 0.09 sec (09954081 ns) -Debug: RS Serial: Time 0.08 sec (08962900 ns) -Debug: RS Serial: Time 0.56 sec (56932216 ns) -Debug: RS Serial: Time 0.16 sec (16941009 ns) -Debug: RS Serial: Time 0.08 sec (08957512 ns) -Debug: RS Serial: Time 0.63 sec (63936255 ns) -Debug: RS Serial: Time 0.09 sec (09941100 ns) -Debug: RS Serial: Time 0.13 sec (13965709 ns) -Debug: RS Serial: Time 0.09 sec (09954877 ns) -Debug: RS Serial: Time 0.09 sec (09957118 ns) -Debug: RS Serial: Time 0.53 sec (53915639 ns) -Debug: RS Serial: Time 0.56 sec (56952901 ns) -Debug: RS Serial: Time 0.16 sec (16936731 ns) -Debug: RS Serial: Time 0.08 sec (08956567 ns) -Debug: RS Serial: Time 0.63 sec (63943291 ns) -Debug: RS Serial: Time 0.10 sec (10953464 ns) -Debug: RS Serial: Time 0.12 sec (12934992 ns) -Debug: RS Serial: Time 0.09 sec (09957988 ns) -Debug: RS Serial: Time 0.09 sec (09955784 ns) -Debug: RS Serial: Time 0.55 sec (55954812 ns) -Debug: RS Serial: Time 0.16 sec (16950694 ns) -Debug: RS Serial: Time 0.08 sec (08957622 ns) -Debug: RS Serial: Time 0.63 sec (63929495 ns) -Debug: RS Serial: Time 0.09 sec (09942340 ns) -Debug: RS Serial: Time 0.26 sec (26963661 ns) -Debug: RS Serial: Time 0.10 sec (10923465 ns) -Debug: RS Serial: Time 0.13 sec (13946375 ns) -Debug: RS Serial: Time 0.09 sec (09961062 ns) -Debug: RS Serial: Time 0.10 sec (10949909 ns) -Debug: RS Serial: Time 0.16 sec (16969656 ns) -Debug: RS Serial: Time 0.08 sec (08943326 ns) -Debug: RS Serial: Time 0.60 sec (60968084 ns) -Debug: RS Serial: Time 0.10 sec (10937539 ns) -Debug: RS Serial: Time 0.13 sec (13962727 ns) -Debug: RS Serial: Time 0.09 sec (09960117 ns) -Debug: RS Serial: Time 0.10 sec (10949094 ns) -Debug: RS Serial: Time 0.16 sec (16965619 ns) -Debug: RS Serial: Time 0.09 sec (09946006 ns) -Debug: RS Serial: Time 0.61 sec (61952171 ns) -Debug: RS Serial: Time 0.09 sec (09956173 ns) -Debug: RS Serial: Time 0.13 sec (13966301 ns) -Debug: RS Serial: Time 0.09 sec (09916786 ns) -Debug: RS Serial: Time 0.10 sec (10940465 ns) -Debug: RS Serial: Time 0.16 sec (16950268 ns) -Debug: RS Serial: Time 0.09 sec (09960228 ns) -Debug: RS Serial: Time 0.62 sec (62949871 ns) -Debug: RS Serial: Time 0.10 sec (10949465 ns) -Debug: RS Serial: Time 0.12 sec (12961750 ns) -Debug: RS Serial: Time 0.09 sec (09963228 ns) -Debug: RS Serial: Time 0.10 sec (10950687 ns) -Debug: RS Serial: Time 0.16 sec (16960082 ns) -Debug: RS Serial: Time 0.10 sec (10965057 ns) -Debug: RS Serial: Time 0.61 sec (61975671 ns) -Debug: RS Serial: Time 0.10 sec (10953205 ns) -Debug: RS Serial: Time 0.13 sec (13970652 ns) -Debug: RS Serial: Time 0.09 sec (09951747 ns) -Debug: RS Serial: Time 0.10 sec (10961612 ns) -Debug: RS Serial: Time 0.16 sec (16967730 ns) -Debug: RS Serial: Time 0.09 sec (09960154 ns) -Debug: RS Serial: Time 0.55 sec (55971960 ns) -Debug: RS Serial: Time 0.59 sec (59976903 ns) -Debug: RS Serial: Time 0.10 sec (10865374 ns) -Debug: RS Serial: Time 0.12 sec (12969361 ns) -Debug: RS Serial: Time 0.09 sec (09951432 ns) -Debug: RS Serial: Time 0.10 sec (10950965 ns) -Debug: RS Serial: Time 0.16 sec (16968248 ns) -Debug: RS Serial: Time 0.09 sec (09949525 ns) -Debug: RS Serial: Time 0.63 sec (63948142 ns) -Debug: RS Serial: Time 0.10 sec (10950279 ns) -Debug: RS Serial: Time 0.12 sec (12967139 ns) -Debug: RS Serial: Time 0.09 sec (09945340 ns) -Debug: RS Serial: Time 0.10 sec (10963446 ns) -Debug: RS Serial: Time 0.16 sec (16951823 ns) -Debug: RS Serial: Time 0.09 sec (09954821 ns) -Debug: RS Serial: Time 0.62 sec (62933925 ns) -Debug: RS Serial: Time 0.10 sec (10968260 ns) -Debug: RS Serial: Time 0.12 sec (12949417 ns) -Debug: RS Serial: Time 0.09 sec (09927155 ns) -Debug: RS Serial: Time 0.10 sec (10961927 ns) -Debug: RS Serial: Time 0.16 sec (16960156 ns) -Debug: RS Serial: Time 0.09 sec (09962507 ns) -Debug: RS Serial: Time 0.62 sec (62961332 ns) -Debug: RS Serial: Time 0.10 sec (10936427 ns) -Debug: RS Serial: Time 0.12 sec (12958121 ns) -Debug: RS Serial: Time 0.09 sec (09964284 ns) -Debug: RS Serial: Time 0.10 sec (10950539 ns) -Debug: RS Serial: Time 0.17 sec (17964632 ns) -Debug: RS Serial: Time 0.08 sec (08959067 ns) -Debug: RS Serial: Time 0.62 sec (62951721 ns) -Debug: RS Serial: Time 0.10 sec (10951575 ns) -Debug: RS Serial: Time 0.12 sec (12960435 ns) -Debug: RS Serial: Time 0.09 sec (09960376 ns) -Debug: RS Serial: Time 0.10 sec (10954335 ns) -Debug: RS Serial: Time 0.17 sec (17966503 ns) -Debug: RS Serial: Time 0.08 sec (08958474 ns) -Debug: RS Serial: Time 0.62 sec (62948628 ns) -Debug: RS Serial: Time 0.10 sec (10949557 ns) -Debug: RS Serial: Time 0.12 sec (12956973 ns) -Debug: RS Serial: Time 0.09 sec (09954210 ns) -Debug: RS Serial: Time 0.10 sec (10961260 ns) -Debug: RS Serial: Time 0.17 sec (17958355 ns) -Debug: RS Serial: Time 0.08 sec (08960067 ns) -Debug: RS Serial: Time 0.62 sec (62950962 ns) -Debug: RS Serial: Time 0.10 sec (10958428 ns) -Debug: RS Serial: Time 0.12 sec (12953121 ns) -Debug: RS Serial: Time 0.09 sec (09960839 ns) -Debug: RS Serial: Time 0.10 sec (10963112 ns) -Debug: RS Serial: Time 0.17 sec (17952577 ns) -Debug: RS Serial: Time 0.08 sec (08959826 ns) -Debug: RS Serial: Time 0.56 sec (56948529 ns) -Debug: RS Serial: Time 0.59 sec (59926588 ns) -Debug: RS Serial: Time 0.10 sec (10955390 ns) -Debug: RS Serial: Time 0.12 sec (12957565 ns) -Debug: RS Serial: Time 0.09 sec (09955562 ns) -Debug: RS Serial: Time 0.10 sec (10960908 ns) -Debug: RS Serial: Time 0.17 sec (17951744 ns) -Debug: RS Serial: Time 0.08 sec (08960141 ns) -Debug: RS Serial: Time 0.63 sec (63951734 ns) -Debug: RS Serial: Time 0.10 sec (10936946 ns) -Debug: RS Serial: Time 0.26 sec (26958068 ns) -Debug: RS Serial: Time 0.09 sec (09965431 ns) -Debug: RS Serial: Time 0.13 sec (13952486 ns) -Debug: RS Serial: Time 0.10 sec (10957872 ns) -Debug: RS Serial: Time 0.09 sec (09955636 ns) -Debug: RS Serial: Time 0.16 sec (16971174 ns) -Debug: RS Serial: Time 0.08 sec (08945715 ns) -Debug: RS Serial: Time 0.60 sec (60953805 ns) -Debug: RS Serial: Time 0.10 sec (10950538 ns) -Debug: RS Serial: Time 0.12 sec (12958824 ns) -Debug: RS Serial: Time 0.10 sec (10952298 ns) -Debug: RS Serial: Time 0.09 sec (09959821 ns) -Debug: RS Serial: Time 0.17 sec (17958651 ns) -Debug: RS Serial: Time 0.08 sec (08954381 ns) -Debug: RS Serial: Time 0.62 sec (62965257 ns) -Debug: RS Serial: Time 0.10 sec (10987685 ns) -Debug: RS Serial: Time 0.13 sec (13912913 ns) -Debug: RS Serial: Time 0.10 sec (10962889 ns) -Debug: RS Serial: Time 0.09 sec (09956784 ns) -Debug: RS Serial: Time 0.17 sec (17967743 ns) -Debug: RS Serial: Time 0.08 sec (08954418 ns) -Debug: RS Serial: Time 0.61 sec (61943300 ns) -Debug: RS Serial: Time 0.10 sec (10946076 ns) -Debug: RS Serial: Time 0.12 sec (12978861 ns) -Debug: RS Serial: Time 0.10 sec (10939983 ns) -Debug: RS Serial: Time 0.09 sec (09964173 ns) -Debug: RS Serial: Time 0.17 sec (17944596 ns) -Debug: RS Serial: Time 0.08 sec (08950974 ns) -Debug: RS Serial: Time 0.62 sec (62930203 ns) -Debug: RS Serial: Time 0.10 sec (10943113 ns) -Debug: RS Serial: Time 0.12 sec (12958861 ns) -Debug: RS Serial: Time 0.10 sec (10952464 ns) -Debug: RS Serial: Time 0.09 sec (09963228 ns) -Debug: RS Serial: Time 0.17 sec (17939133 ns) -Debug: RS Serial: Time 0.08 sec (08942252 ns) -Debug: RS Serial: Time 0.62 sec (62952035 ns) -Debug: RS Serial: Time 0.10 sec (10927391 ns) -Debug: RS Serial: Time 0.12 sec (12926880 ns) -Debug: RS Serial: Time 0.10 sec (10967834 ns) -Debug: RS Serial: Time 0.09 sec (09975746 ns) -Debug: RS Serial: Time 0.17 sec (17951632 ns) -Debug: RS Serial: Time 0.08 sec (08948752 ns) -Debug: RS Serial: Time 0.56 sec (56967676 ns) -Debug: RS Serial: Time 0.59 sec (59935680 ns) -Debug: RS Serial: Time 0.10 sec (10950779 ns) -Debug: RS Serial: Time 0.12 sec (12944862 ns) -Debug: RS Serial: Time 0.10 sec (10960853 ns) -Debug: RS Serial: Time 0.09 sec (09956192 ns) -Debug: RS Serial: Time 0.17 sec (17951707 ns) -Debug: RS Serial: Time 0.08 sec (08961789 ns) -Debug: RS Serial: Time 0.63 sec (63955585 ns) -Debug: RS Serial: Time 0.10 sec (10931872 ns) -Debug: RS Serial: Time 0.12 sec (12948917 ns) -Debug: RS Serial: Time 0.10 sec (10956612 ns) -Debug: RS Serial: Time 0.12 sec (12961009 ns) -Debug: RS Serial: Time 0.14 sec (14953610 ns) -Debug: RS Serial: Time 0.58 sec (58959462 ns) -Debug: RS Serial: Time 0.16 sec (16947230 ns) -Debug: RS Serial: Time 0.60 sec (60946193 ns) -Debug: RS Serial: Time 0.15 sec (15944661 ns) -Debug: RS Serial: Time 0.08 sec (08958196 ns) -Debug: RS Serial: Time 0.17 sec (17959984 ns) -Debug: RS Serial: Time 0.07 sec (07943683 ns) -Debug: RS Serial: Time 0.63 sec (63952381 ns) -Debug: RS Serial: Time 0.10 sec (10937317 ns) -Debug: RS Serial: Time 0.12 sec (12942417 ns) -Debug: RS Serial: Time 0.10 sec (10962556 ns) -Debug: RS Serial: Time 0.09 sec (09957154 ns) -Debug: RS Serial: Time 0.17 sec (17952521 ns) -Debug: RS Serial: Time 0.08 sec (08951067 ns) -Debug: RS Serial: Time 0.62 sec (62959071 ns) -Debug: RS Serial: Time 0.10 sec (10950094 ns) -Debug: RS Serial: Time 0.12 sec (12934899 ns) -Debug: RS Serial: Time 0.10 sec (10952667 ns) -Debug: RS Serial: Time 0.09 sec (09959858 ns) -Debug: RS Serial: Time 0.17 sec (17954077 ns) -Debug: RS Serial: Time 0.08 sec (08962159 ns) -Debug: RS Serial: Time 0.62 sec (62939721 ns) -Debug: RS Serial: Time 0.10 sec (10942816 ns) -Debug: RS Serial: Time 0.12 sec (12959899 ns) -Debug: RS Serial: Time 0.10 sec (10961631 ns) -Debug: RS Serial: Time 0.09 sec (09955654 ns) -Debug: RS Serial: Time 0.17 sec (17953836 ns) -Debug: RS Serial: Time 0.08 sec (08963103 ns) -Debug: RS Serial: Time 0.463 sec (463943040 ns) -Debug: RS Serial: Time 0.09 sec (09827139 ns) -Debug: RS Serial: Time 0.26 sec (26962290 ns) -Debug: RS Serial: Time 0.10 sec (10934576 ns) -Debug: RS Serial: Time 0.13 sec (13962782 ns) -Debug: RS Serial: Time 0.09 sec (09950506 ns) -Debug: RS Serial: Time 0.09 sec (09961524 ns) -Debug: RS Serial: Time 0.17 sec (17949096 ns) -Debug: RS Serial: Time 0.07 sec (07956053 ns) -Debug: RS Serial: Time 0.61 sec (61962779 ns) -Debug: RS Serial: Time 0.09 sec (09951617 ns) -Debug: RS Serial: Time 0.13 sec (13972985 ns) -Debug: RS Serial: Time 0.09 sec (09955191 ns) -Debug: RS Serial: Time 0.09 sec (09958969 ns) -Debug: RS Serial: Time 0.17 sec (17941484 ns) -Debug: RS Serial: Time 0.08 sec (08965603 ns) -Debug: RS Serial: Time 0.456 sec (456883334 ns) -Debug: RS Serial: Time 0.60 sec (60906415 ns) -Debug: RS Serial: Time 0.09 sec (09942321 ns) -Debug: RS Serial: Time 0.13 sec (13948523 ns) -Debug: RS Serial: Time 0.09 sec (09968969 ns) -Debug: RS Serial: Time 0.10 sec (10943297 ns) -Debug: RS Serial: Time 0.16 sec (16966099 ns) -Debug: RS Serial: Time 0.07 sec (07948850 ns) -Debug: RS Serial: Time 0.65 sec (65949703 ns) -Debug: RS Serial: Time 0.09 sec (09958173 ns) -Debug: RS Serial: Time 0.13 sec (13952671 ns) -Debug: RS Serial: Time 0.09 sec (09958247 ns) -Debug: RS Serial: Time 0.10 sec (10955316 ns) -Debug: RS Serial: Time 0.16 sec (16963174 ns) -Debug: RS Serial: Time 0.09 sec (09943673 ns) -Debug: RS Serial: Time 0.462 sec (462892078 ns) -Debug: RS Serial: Time 0.09 sec (09931192 ns) -Debug: RS Serial: Time 0.13 sec (13954004 ns) -Debug: RS Serial: Time 0.09 sec (09947118 ns) -Debug: RS Serial: Time 0.10 sec (10959760 ns) -Debug: RS Serial: Time 0.16 sec (16959600 ns) -Debug: RS Serial: Time 0.09 sec (09944598 ns) -Debug: RS Serial: Time 0.62 sec (62906089 ns) -Debug: RS Serial: Time 0.10 sec (10943853 ns) -Debug: RS Serial: Time 0.12 sec (12963416 ns) -Debug: RS Serial: Time 0.09 sec (09963190 ns) -Debug: RS Serial: Time 0.10 sec (10972389 ns) -Debug: RS Serial: Time 0.16 sec (16950100 ns) -Debug: RS Serial: Time 0.09 sec (09958599 ns) -Debug: RS Serial: Time 0.462 sec (462882870 ns) -Debug: RS Serial: Time 0.10 sec (10930908 ns) -Debug: RS Serial: Time 0.25 sec (25963554 ns) -Debug: RS Serial: Time 0.10 sec (10949278 ns) -Debug: RS Serial: Time 0.13 sec (13953541 ns) -Debug: RS Serial: Time 0.09 sec (09961061 ns) -Debug: RS Serial: Time 0.10 sec (10958760 ns) -Debug: RS Serial: Time 0.16 sec (16948063 ns) -Debug: RS Serial: Time 0.08 sec (08962863 ns) -Debug: RS Serial: Time 0.60 sec (60960246 ns) -Debug: RS Serial: Time 0.10 sec (10957204 ns) -Debug: RS Serial: Time 0.12 sec (12939269 ns) -Debug: RS Serial: Time 0.09 sec (09962654 ns) -Debug: RS Serial: Time 0.10 sec (10958890 ns) -Debug: RS Serial: Time 0.16 sec (16956989 ns) -Debug: RS Serial: Time 0.09 sec (09951117 ns) -Debug: RS Serial: Time 0.62 sec (62961347 ns) -Debug: RS Serial: Time 0.10 sec (10934427 ns) -Debug: RS Serial: Time 0.12 sec (12942750 ns) -Debug: RS Serial: Time 0.09 sec (09958136 ns) -Debug: RS Serial: Time 0.10 sec (10938797 ns) -Debug: RS Serial: Time 0.16 sec (16941693 ns) -Debug: RS Serial: Time 0.09 sec (09944488 ns) -Debug: RS Serial: Time 0.56 sec (56941841 ns) -Debug: RS Serial: Time 0.59 sec (59923845 ns) -Debug: RS Serial: Time 0.10 sec (10970241 ns) -Debug: RS Serial: Time 0.12 sec (12940046 ns) -Debug: RS Serial: Time 0.09 sec (09943876 ns) -Debug: RS Serial: Time 0.10 sec (10956186 ns) -Debug: RS Serial: Time 0.17 sec (17965576 ns) -Debug: RS Serial: Time 0.08 sec (08946196 ns) -Debug: RS Serial: Time 0.63 sec (63949564 ns) -Debug: RS Serial: Time 0.10 sec (10936205 ns) -Debug: RS Serial: Time 0.12 sec (12953786 ns) -Debug: RS Serial: Time 0.09 sec (09962654 ns) -Debug: RS Serial: Time 0.10 sec (10949778 ns) -Debug: RS Serial: Time 0.17 sec (17961446 ns) -Debug: RS Serial: Time 0.08 sec (08945474 ns) -Debug: RS Serial: Time 0.62 sec (62968049 ns) -Debug: RS Serial: Time 0.10 sec (10937816 ns) -Debug: RS Serial: Time 0.12 sec (12966361 ns) -Debug: RS Serial: Time 0.09 sec (09959969 ns) -Debug: RS Serial: Time 0.10 sec (10949667 ns) -Debug: RS Serial: Time 0.17 sec (17956002 ns) -Debug: RS Serial: Time 0.08 sec (08957418 ns) -Debug: RS Serial: Time 0.62 sec (62947735 ns) -Debug: RS Serial: Time 0.10 sec (10951334 ns) -Debug: RS Serial: Time 0.12 sec (12962417 ns) -Debug: RS Serial: Time 0.09 sec (09944617 ns) -Debug: RS Serial: Time 0.10 sec (10962556 ns) -Debug: RS Serial: Time 0.17 sec (17945354 ns) -Debug: RS Serial: Time 0.08 sec (08963603 ns) -Debug: RS Serial: Time 0.62 sec (62971198 ns) -Debug: RS Serial: Time 0.10 sec (10948297 ns) -Debug: RS Serial: Time 0.12 sec (12955416 ns) -Debug: RS Serial: Time 0.09 sec (09965950 ns) -Debug: RS Serial: Time 0.10 sec (10952464 ns) -Debug: RS Serial: Time 0.17 sec (17963298 ns) -Debug: RS Serial: Time 0.08 sec (08954437 ns) -Debug: RS Serial: Time 0.62 sec (62976476 ns) -Debug: RS Serial: Time 0.10 sec (10942890 ns) -Debug: RS Serial: Time 0.12 sec (12954083 ns) -Debug: RS Serial: Time 0.10 sec (10891113 ns) -Debug: RS Serial: Time 0.09 sec (09956728 ns) -Debug: RS Serial: Time 0.17 sec (17952372 ns) -Debug: RS Serial: Time 0.08 sec (08953196 ns) -Debug: RS Serial: Time 0.62 sec (62958087 ns) -Debug: RS Serial: Time 0.10 sec (10947223 ns) -Debug: RS Serial: Time 0.12 sec (12998156 ns) -Debug: RS Serial: Time 0.10 sec (10908947 ns) -Debug: RS Serial: Time 0.09 sec (09944839 ns) -Debug: RS Serial: Time 0.17 sec (17942521 ns) -Debug: RS Serial: Time 0.08 sec (08954029 ns) diff --git a/version.h b/version.h index fc236b38..4f13a49d 100644 --- a/version.h +++ b/version.h @@ -2,4 +2,4 @@ #define AQUALINKD_NAME "Aqualink Daemon" #define AQUALINKD_SHORT_NAME "AqualinkD" -#define AQUALINKD_VERSION "2.3.7" +#define AQUALINKD_VERSION "2.3.8 (dev)"