From 8c9ab10128d2312daadd652efcef7bbbd71f1c87 Mon Sep 17 00:00:00 2001 From: Lee Ballard Date: Tue, 31 May 2022 17:04:32 -0500 Subject: [PATCH] ballle98/AqualinkD#65: SWG percentage setting not working for PDA --- aq_programmer.c | 8 +- aqualinkd.c | 2 +- devices_jandy.c | 3 +- pda.c | 72 +++++++++----- pda_aq_programmer.c | 225 ++++++++++++++++++++++++-------------------- 5 files changed, 178 insertions(+), 132 deletions(-) diff --git a/aq_programmer.c b/aq_programmer.c index b27442a..f942413 100644 --- a/aq_programmer.c +++ b/aq_programmer.c @@ -861,6 +861,7 @@ void aq_programmer(program_type r_type, char *args, struct aqualinkdata *aq_data LOG(PROG_LOG, LOG_ERR, "could not create thread\n"); return; } + break; #endif #ifdef AQ_PDA case AQ_PDA_INIT: @@ -1202,10 +1203,9 @@ void *set_aqualink_SWG( void *ptr ) #ifdef AQ_PDA if (isPDA_PANEL) { - if (set_PDA_aqualink_SWG_setpoint(aq_data, val)) - setSWGpercent(aq_data, val); // Don't use chageSWGpercent as we are in programming mode. - cleanAndTerminateThread(threadCtrl); - return ptr; + set_PDA_aqualink_SWG_setpoint(aq_data, val); + cleanAndTerminateThread(threadCtrl); + return ptr; } #endif diff --git a/aqualinkd.c b/aqualinkd.c index 0ac37d9..d35010d 100644 --- a/aqualinkd.c +++ b/aqualinkd.c @@ -899,7 +899,7 @@ void action_delayed_request() { //LOG(AQUA_LOG,LOG_NOTICE, "SWG BOST to %d\n", _aqualink_data.unactioned.value); //if (_aqualink_data.ar_swg_status == SWG_STATUS_OFF) { - if (_aqualink_data.swg_led_state == OFF) { + if ((_aqualink_data.swg_led_state == OFF) && (_aqualink_data.boost == false)) { LOG(AQUA_LOG,LOG_ERR, "SWG is off, can't Boost pool\n"); } else if (_aqualink_data.unactioned.value == _aqualink_data.boost ) { LOG(AQUA_LOG,LOG_ERR, "Request to turn Boost %s ignored, Boost is already %s\n",_aqualink_data.unactioned.value?"On":"Off", _aqualink_data.boost?"On":"Off"); diff --git a/devices_jandy.c b/devices_jandy.c index 957d454..2290469 100644 --- a/devices_jandy.c +++ b/devices_jandy.c @@ -201,6 +201,7 @@ bool setSWGboost(struct aqualinkdata *aqdata, bool on) { } else { aqdata->boost = true; aqdata->swg_percent = 101; + aqdata->swg_led_state = ON; } return true; @@ -401,4 +402,4 @@ Debug: To ePump: Jandy Packet | HEX: 0x10|0x02|0x78|0x44|0x00|0x58|0x1b|0x Debug: To ePump: Jandy Packet | HEX: 0x10|0x02|0x78|0x45|0x00|0x05|0xd4|0x10|0x03| Debug: To ePump: Jandy Packet | HEX: 0x10|0x02|0x78|0x46|0x00|0x00|0x03|0xd3|0x10|0x03| Debug: To ePump: Jandy Packet | HEX: 0x10|0x02|0x78|0x46|0x00|0x04|0x00|0xd4|0x10|0x03| -*/ \ No newline at end of file +*/ diff --git a/pda.c b/pda.c index bfd243f..8472c62 100644 --- a/pda.c +++ b/pda.c @@ -158,10 +158,12 @@ void pass_pda_equiptment_status_item(char *msg) // RPM: 1700 // Watts: 367 // + // EQUIPMENT STATUS // - // - // - // + // BOOST + // 23:59 REMAIN + // SALT 25500 PPM + // FILTER PUMP // Check message for status of device // Loop through all buttons and match the PDA text. @@ -173,6 +175,14 @@ void pass_pda_equiptment_status_item(char *msg) { _aqualink_data->frz_protect_state = ON; } + else if ((index = strcasestr(msg, "BOOST")) != NULL) + { + setSWGboost(_aqualink_data, true); + } + else if ((_aqualink_data->boost) && ((index = strcasestr(msg, "REMAIN")) != NULL)) + { + snprintf(_aqualink_data->boost_msg, sizeof(_aqualink_data->boost_msg), "%s", msg+2); + } else if ((index = strcasestr(msg, MSG_SWG_PCT)) != NULL) { changeSWGpercent(_aqualink_data, atoi(index + strlen(MSG_SWG_PCT))); @@ -323,14 +333,13 @@ void process_pda_packet_msg_long_equipment_control(const char *msg) { LOG(PDA_LOG,LOG_DEBUG, "*** Found EQ CTL Status for %s = '%.*s'\n", _aqualink_data->aqbuttons[i].label, AQ_MSGLEN, msg); set_pda_led(_aqualink_data->aqbuttons[i].led, msg[AQ_MSGLEN - 1]); + // Force SWG off if pump is off. + if ((i==0) && (_aqualink_data->aqbuttons[0].led->state == OFF )) { + setSWGoff(_aqualink_data); + } } } - // Force SWG off if pump is off. - if (_aqualink_data->aqbuttons[0].led->state == OFF ) - setSWGoff(_aqualink_data); - //_aqualink_data->ar_swg_status = SWG_STATUS_OFF; - // NSF I think we need to check TEMP1 and TEMP2 and set Pool HEater and Spa heater directly, to support single device. if (isSINGLE_DEV_PANEL){ if (strcasecmp(stripwhitespace(labelBuff), "TEMP1") == 0) @@ -471,27 +480,33 @@ void process_pda_packet_msg_long_freeze_protect(const char *msg) void process_pda_packet_msg_long_SWG(const char *msg) { - //PDA Line 0 = SET AquaPure - //PDA Line 1 = - //PDA Line 2 = - //PDA Line 3 = SET POOL TO: 45% - //PDA Line 4 = SET SPA TO: 0% + // Single Setpoint + // PDA Line 0 = SET AquaPure + // PDA Line 1 = + // PDA Line 2 = + // PDA Line 3 = SET TO 100% + + // Dual Setpoint + // PDA Line 0 = SET AquaPure + // PDA Line 1 = + // PDA Line 2 = + // PDA Line 3 = SET POOL TO: 45% + // PDA Line 4 = SET SPA TO: 0% // If spa is on, read SWG for spa, if not set SWG for pool - if (_aqualink_data->aqbuttons[SPA_INDEX].led->state != OFF) { - if (strncasecmp(msg, "SET SPA TO:", 11) == 0) - { + if (strncasecmp(msg+3, "SET TO", 6) == 0) { + setSWGpercent(_aqualink_data, atoi(msg + 10)); + LOG(PDA_LOG,LOG_DEBUG, "swg_percent = %d\n", _aqualink_data->swg_percent); + } else if (_aqualink_data->aqbuttons[SPA_INDEX].led->state != OFF) { + if (strncasecmp(msg+1, "SET SPA TO:", 11) == 0) { //_aqualink_data->swg_percent = atoi(msg + 13); - setSWGpercent(_aqualink_data, atoi(msg + 13)); + setSWGpercent(_aqualink_data, atoi(msg + 12)); LOG(PDA_LOG,LOG_DEBUG, "SPA swg_percent = %d\n", _aqualink_data->swg_percent); } - } else { - if (strncasecmp(msg, "SET POOL TO:", 12) == 0) - { + } else if (strncasecmp(msg, "SET POOL TO:", 12) == 0) { //_aqualink_data->swg_percent = atoi(msg + 13); - setSWGpercent(_aqualink_data, atoi(msg + 13)); + setSWGpercent(_aqualink_data, atoi(msg + 12)); LOG(PDA_LOG,LOG_DEBUG, "POOL swg_percent = %d\n", _aqualink_data->swg_percent); - } } } @@ -660,15 +675,20 @@ bool process_pda_packet(unsigned char *packet, int length) // Note: if the last line of the status menu is present it may be cut off if (pda_m_type() == PM_EQUIPTMENT_STATUS) { - if (_aqualink_data->frz_protect_state == ON) + if (_aqualink_data->frz_protect_state == ON) { _aqualink_data->frz_protect_state = ENABLE; - + } //if (_aqualink_data->ar_swg_status == SWG_STATUS_ON) // _aqualink_data->ar_swg_status = SWG_STATUS_OFF; - if (_aqualink_data->swg_led_state == ON) + if (_aqualink_data->swg_led_state == ON) { setSWGenabled(_aqualink_data); - + } + + if (_aqualink_data->boost) { + setSWGboost(_aqualink_data, false); + } + if (pda_m_line(PDA_LINES - 1)[0] == '\0') { for (i = 0; i < _aqualink_data->total_buttons; i++) diff --git a/pda_aq_programmer.c b/pda_aq_programmer.c index 1431026..d536ae0 100644 --- a/pda_aq_programmer.c +++ b/pda_aq_programmer.c @@ -198,6 +198,7 @@ bool find_pda_menu_item(struct aqualinkdata *aq_data, char *menuText, int charli int max_index = -1; int index = -1; int cnt = 0; + bool bLookingForBoost = false; LOG(PDA_LOG,LOG_DEBUG, "PDA Device programmer looking for menu text '%s' (limit=%d)\n",menuText,charlimit); @@ -237,51 +238,83 @@ bool find_pda_menu_item(struct aqualinkdata *aq_data, char *menuText, int charli } if (strncasecmp(pda_m_line(9)," ^^ MORE", 10) != 0) { - if (pda_m_type() == PM_HOME) { - min_index = 4; - max_index = 9; - } else if (pda_m_type() == PM_EQUIPTMENT_CONTROL) { - min_index = 1; - max_index = 9; - } else if (pda_m_type() == PM_MAIN) { - // Line 0 = MAIN MENU - // Line 1 = - // Line 2 = HELP > - // Line 3 = PROGRAM > - // Line 4 = SET TEMP > - // Line 5 = SET TIME > - // Line 6 = PDA OPTIONS > - // Line 7 = SYSTEM SETUP > - // Line 8 = - // Line 9 = - - // Line 0 = MAIN MENU - // Line 1 = HELP > - // Line 2 = PROGRAM > - // Line 3 = SET TEMP > - // Line 4 = SET TIME > - // Line 5 = SET AquaPure > - // Line 6 = PDA OPTIONS > - // Line 7 = SYSTEM SETUP > - // Line 8 = - // Line 9 = BOOST - - // "SET AquaPure" and "BOOST" are only present when filter pump is running - if (strncasecmp(pda_m_line(9)," BOOST ", 16) == 0) { - min_index = 1; - max_index = 8; // to account for 8 missing - if (index == 9) { // looking for boost - index = 8; - } - } else { - min_index = 2; - max_index = 7; + if (pda_m_type() == PM_HOME) { + min_index = 4; + max_index = 9; + } else if (pda_m_type() == PM_EQUIPTMENT_CONTROL) { + min_index = 1; + max_index = 9; + } else if (pda_m_type() == PM_MAIN) { + // Line 0 = MAIN MENU + // Line 1 = + // Line 2 = HELP > + // Line 3 = PROGRAM > + // Line 4 = SET TEMP > + // Line 5 = SET TIME > + // Line 6 = PDA OPTIONS > + // Line 7 = SYSTEM SETUP > + // Line 8 = + // Line 9 = + + // Line 0 = MAIN MENU + // Line 1 = HELP > + // Line 2 = PROGRAM > + // Line 3 = SET TEMP > + // Line 4 = SET TIME > + // Line 5 = SET AquaPure > + // Line 6 = PDA OPTIONS > + // Line 7 = SYSTEM SETUP > + // Line 8 = + // Line 9 = BOOST + + // "SET AquaPure" and "BOOST" are only present when filter pump is running + if (strncasecmp(pda_m_line(9)," BOOST ", 16) == 0) { + min_index = 1; + max_index = 8; // to account for 8 missing + if (index == 9) { // looking for boost + bLookingForBoost = true; + index = 8; } + } else { + min_index = 2; + max_index = 7; } + } else if (pda_m_type() == PM_BOOST) { + // PDA Line 0 = BOOST + // PDA Line 1 = + // PDA Line 2 = Operate the + // PDA Line 3 = AquaPure + // PDA Line 4 = chlorinator + // PDA Line 5 = at 100% + // PDA Line 6 = for 24 hrs. + // PDA Line 7 = + // PDA Line 8 = START + // PDA Line 9 = GO BACK + + // PDA Line 0 = BOOST + // PDA Line 1 = + // PDA Line 2 = + // PDA Line 3 = TIME REMAINING + // PDA Line 4 = 23:59 + // PDA Line 5 = + // PDA Line 6 = + // PDA Line 7 = PAUSE + // PDA Line 8 = RESTART + // PDA Line 9 = STOP + + if (strncasecmp(pda_m_line(9)," STOP", 10) == 0) { + min_index = 7; + max_index = 9; + } else { + min_index = 8; + max_index = 9; + + } + } } - LOG(PDA_LOG,LOG_DEBUG, "find_pda_menu_item i=%d idx=%d min=%d max=%d\n", - i, index, min_index, max_index); + LOG(PDA_LOG,LOG_DEBUG, "find_pda_menu_item i=%d idx=%d min=%d max=%d boost=%d\n", + i, index, min_index, max_index, bLookingForBoost?1:0); if (i < index) { if ((min_index != -1) && ((index - i) > (i - min_index + max_index - index + 1))) { @@ -306,8 +339,7 @@ bool find_pda_menu_item(struct aqualinkdata *aq_data, char *menuText, int charli } } } - - return waitForPDAMessageHighlight(aq_data, index, 10); + return waitForPDAMessageHighlight(aq_data, bLookingForBoost?9:index, 10); } bool _select_pda_menu_item(struct aqualinkdata *aq_data, char *menuText, bool waitForNextMenu, bool loose); @@ -456,7 +488,7 @@ bool goto_pda_menu(struct aqualinkdata *aq_data, pda_menu_type menu) { if (pda_m_type() == PM_HOME) { ret = select_pda_menu_item(aq_data, "MENU", true); } else if (pda_m_type() == PM_MAIN) { - ret = select_pda_menu_item_loose(aq_data, "BOOST", true); + ret = select_pda_menu_item_loose(aq_data, " BOOST", true); } else { send_cmd(KEY_PDA_BACK); ret = waitForPDAnextMenu(aq_data); @@ -842,21 +874,11 @@ bool waitForPDAMessageTypes(struct aqualinkdata *aq_data, unsigned char mtype1, bool set_PDA_numeric_field_value(struct aqualinkdata *aq_data, int val, int cur_val, char *select_label, int step) { int i=0; + LOG(PDA_LOG,LOG_DEBUG, "set_PDA_numeric_field_value %s from %d to %d step %d\n", select_label, cur_val, val, step); if (select_label != NULL) { - // :TODO: Should probably change below to call find_pda_menu_item(), rather than doing it here - // If we lease this, need to limit on the number of loops - //while ( strncasecmp(pda_m_hlight(), select_label, 8) != 0 ) { - while ( strncasecmp(pda_m_hlight(), select_label, strlen(select_label)) != 0 ) { - send_cmd(KEY_PDA_DOWN); - delay(500); // Last message probably was CMD_PDA_HIGHLIGHT, so wait before checking. - waitForPDAMessageType(aq_data,CMD_PDA_HIGHLIGHT,0,500); - if (i > 10) { - LOG(PDA_LOG,LOG_ERR, "PDA numeric selector could not find string '%s'\n", select_label); - return false; - } - i++; + if ( ! select_pda_menu_item(aq_data, select_label, false) ) { + return false; } - send_cmd(KEY_PDA_SELECT); } if (val < cur_val) { @@ -883,13 +905,18 @@ bool set_PDA_aqualink_SWG_setpoint(struct aqualinkdata *aq_data, int val) { if (! goto_pda_menu(aq_data, PM_AQUAPURE)) { LOG(PDA_LOG,LOG_ERR, "Error finding SWG setpoints menu\n"); } - - if (aq_data->aqbuttons[SPA_INDEX].led->state != OFF) + if (pda_find_m_index("SET POOL") < 0) { + // Single Setpoint Screen + return set_PDA_numeric_field_value(aq_data, val, aq_data->swg_percent, 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, aq_data->swg_percent, "SET SPA", 5); - else + } else { + // Dual Setpoint Screen with SPA mode disabled return set_PDA_numeric_field_value(aq_data, val, aq_data->swg_percent, "SET POOL", 5); - - //return true; + } } bool set_PDA_aqualink_boost(struct aqualinkdata *aq_data, bool val) @@ -898,38 +925,22 @@ bool set_PDA_aqualink_boost(struct aqualinkdata *aq_data, bool val) LOG(PDA_LOG,LOG_ERR, "Error finding BOOST menu\n"); return false; } - - - // Should be on the START menu item if (val == true) { // Turn on should just be enter - if (strstr(pda_m_hlight(), "START") != NULL) - send_cmd(KEY_PDA_SELECT); - else { - LOG(PDA_LOG,LOG_ERR, "Error finding BOOST START menu\n"); - return false; - } + select_pda_menu_item_loose(aq_data, "START", false); } else { - /* - // Should be select options PAUSE | RESTART | STOP - int i=0; - for (i=0; i < 6; i++) { - send_cmd(KEY_PDA_DOWN); - waitForPDAMessageTypes(aq_data,CMD_PDA_HIGHLIGHT,CMD_PDA_HIGHLIGHTCHARS,10); - if (strstr(pda_m_hlight(), "STOP") != NULL) { - send_cmd(KEY_PDA_SELECT); - break; - } - } - if (i >= 6) - LOG(PDA_LOG,LOG_ERR, "Error finding BOOST STOP menu\n"); - // Should be select options PAUSE | RESTART | STOP - // so press down twice then select - */ - // NSF This is really crap, but can't get above to work, need to come back and check menu items against selections. - send_cmd(KEY_PDA_DOWN); - send_cmd(KEY_PDA_DOWN); - send_cmd(KEY_PDA_SELECT); + // PDA Line 0 = BOOST + // PDA Line 1 = + // PDA Line 2 = + // PDA Line 3 = TIME REMAINING + // PDA Line 4 = 23:59 + // PDA Line 5 = + // PDA Line 6 = + // PDA Line 7 = PAUSE + // PDA Line 8 = RESTART + // PDA Line 9 = STOP + + select_pda_menu_item_loose(aq_data, "STOP", false); } return true; @@ -1176,16 +1187,30 @@ PDA Line 8 = PDA Line 9 = **************** OPTION 2 FOR THIS MENU ******************** -PDA Line 0 = MAIN MENU -PDA Line 1 = -PDA Line 2 = HELP > -PDA Line 3 = PROGRAM > -PDA Line 4 = SET TEMP > -PDA Line 5 = SET TIME > -PDA Line 6 = PDA OPTIONS > -PDA Line 7 = SYSTEM SETUP > + +PDA Line 0 = MAIN MENU +PDA Line 1 = HELP > +PDA Line 2 = PROGRAM > +PDA Line 3 = SET TEMP > +PDA Line 4 = SET TIME > +PDA Line 5 = SET AquaPure > +PDA Line 6 = PDA OPTIONS > +PDA Line 7 = SYSTEM SETUP > PDA Line 8 = -PDA Line 9 = BOOST +PDA Line 9 = BOOST + + +PDA Line 0 = BOOST +PDA Line 1 = +PDA Line 2 = Operate the +PDA Line 3 = AquaPure +PDA Line 4 = chlorinator +PDA Line 5 = at 100% +PDA Line 6 = for 24 hrs. +PDA Line 7 = +PDA Line 8 = START +PDA Line 9 = GO BACK + ********** Guess at SYSTEM SETUP Menu (not on Rev MMM or before)************