Merge pull request #492 from locnho/pda-ps6-home-first-fix

Fix PDA PS6 menu navigation issue
pull/494/head
sfeakes 2026-02-05 17:17:12 -06:00 committed by GitHub
commit 3af81d8624
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 53 additions and 2 deletions

View File

@ -630,6 +630,12 @@ void init_parameters (struct aqconfig * parms)
_cfgParams[_numCfgParams].value_type = CFG_BOOL;
_cfgParams[_numCfgParams].name = CFG_N_pda_sleep_mode;
_cfgParams[_numCfgParams].default_value = (void *)&_dcfg_true;
_numCfgParams++;
_cfgParams[_numCfgParams].value_ptr = &_aqconfig_.pda_force_home_onprogram;
_cfgParams[_numCfgParams].value_type = CFG_BOOL;
_cfgParams[_numCfgParams].name = CFG_N_pda_force_home_onprogram;
_cfgParams[_numCfgParams].default_value = (void *)&_dcfg_false;
#endif
// Sensor poll time
@ -1905,6 +1911,10 @@ void check_print_config (struct aqualinkdata *aqdata)
_cfgParams[i].config_mask |= CFG_GREYED_OUT;
_cfgParams[i].config_mask |= CFG_READONLY;
}
if ( strcmp(_cfgParams[i].name, CFG_N_pda_force_home_onprogram) == 0 && !isPDA_PANEL) {
_cfgParams[i].config_mask |= CFG_GREYED_OUT;
_cfgParams[i].config_mask |= CFG_READONLY;
}
rsm_nchar_replace(name, MAX_PRINTLEN, _cfgParams[i].name, "_", " ");
switch (_cfgParams[i].value_type) {

View File

@ -98,6 +98,7 @@ struct aqconfig
bool override_freeze_protect;
#ifdef AQ_PDA
bool pda_sleep_mode;
bool pda_force_home_onprogram;
#endif
bool convert_mqtt_temp;
@ -297,6 +298,7 @@ int _numCfgParams;
#define CFG_N_pda_sleep_mode "pda_sleep_mode"
#define CFG_N_convert_mqtt_temp "mqtt_convert_temp_to_c"
#define CFG_N_light_programming_interface "light_programming_interface"
#define CFG_N_pda_force_home_onprogram "pda_force_home_onprogram"
#define CFG_N_report_zero_spa_temp "report_zero_spa_temp"
#define CFG_N_report_zero_pool_temp "report_zero_pool_temp"
@ -342,4 +344,4 @@ int _numCfgParams;
//#define CFG_V_UOM "[\"°C\", \"°F\", \"K\", \"Hz\", \"GHz\", \"Pa\", \"0x41\", \"hPa\", \"bar\", \"mbar\", \"inHg\", \"psi\", \"L\", \"mL\", \"m³\", \"ft³\", \"fl. oz.\", \"m³/h\", \"ft³/m\"]"
#endif
#endif

View File

@ -71,6 +71,7 @@ void waitfor_pda_queue2empty() {
waitfor_queue2empty();
}
void send_pda_cmd(unsigned char cmd) {
//LOG(PDA_LOG, LOG_DEBUG, "PDA command %d\n", cmd);
send_cmd(cmd);
}
unsigned char pop_pda_cmd(struct aqualinkdata *aqdata){
@ -111,6 +112,7 @@ bool push_pda_cmd(unsigned char cmd) {
}
void send_pda_cmd(unsigned char cmd) {
if (waitfor_pda_queue2empty()) {
//LOG(PDA_LOG, LOG_DEBUG, "PDA command %d\n", cmd);
push_pda_cmd(cmd);
}
}
@ -479,7 +481,6 @@ bool goto_pda_menu(struct aqualinkdata *aqdata, pda_menu_type menu) {
waitForPDAMessageType(aqdata,CMD_PDA_HIGHLIGHT,15);
}
while (ret && (pda_m_type() != menu) && cnt <= 5) {
switch (menu) {
case PM_HOME:
@ -618,6 +619,27 @@ bool goto_pda_menu(struct aqualinkdata *aqdata, pda_menu_type menu) {
return true;
}
void goto_pda_home_first(struct aqualinkdata *aqdata)
{
if (!_aqconfig_.pda_force_home_onprogram)
return;
// Before start programming sequence, go back to home menu. Otherwise may get timing issue.
// AquaLinkD may send SELECT at EQUIPMNET menu while PDA just switched to the status page.
// In such case, the SELECT will be ignored.
send_pda_cmd(KEY_PDA_BACK);
if (!waitForPDAnextMenu(aqdata)) {
LOG(PDA_LOG,LOG_ERR, "PDA goto menu: can't find HOME menu\n");
}
//
// Wait for another menu. PDA may going back to the home menu while the KEY_PDA_BACK
// is still being transmitted. As such, wait for second time in case the menu received
// is from the PDA going back to menu. At which point, there should be a second
// menu coming. Otherwse, the code proceeds and may be selecting at the main menu and turn
// off the pool equipment.
waitForPDAnextMenu(aqdata);
}
#ifdef NEW_AQ_PROGRAMMER
void *set_aqualink_PDA_device_on_off( void *ptr )
{
@ -638,6 +660,8 @@ void *set_aqualink_PDA_device_on_off( void *ptr )
LOG(PDA_LOG,LOG_INFO, "PDA Device On/Off, device '%s', state %d\n",button->label,state);
goto_pda_home_first(aqdata); // if enabled
if (! goto_pda_menu(aqdata, PM_EQUIPTMENT_CONTROL)) {
LOG(PDA_LOG,LOG_ERR, "PDA Device On/Off :- can't find EQUIPTMENT CONTROL menu\n");
cleanAndTerminateThread(threadCtrl);
@ -732,6 +756,8 @@ void *set_aqualink_PDA_device_on_off( void *ptr )
LOG(PDA_LOG,LOG_INFO, "PDA Device On/Off, device '%s', state %d\n",aqdata->aqbuttons[device].label,state);
goto_pda_home_first(aqdata); // if enabled
if (! goto_pda_menu(aqdata, PM_EQUIPTMENT_CONTROL)) {
LOG(PDA_LOG,LOG_ERR, "PDA Device On/Off :- can't find EQUIPTMENT CONTROL menu\n");
cleanAndTerminateThread(threadCtrl);
@ -892,6 +918,8 @@ void *set_aqualink_PDA_light_mode( void *ptr )
LOG(PDA_LOG, LOG_INFO, "PDA Light Programming #: Received %d, on button: %s, color light type: %d, name '%s'\n", mode, button->label, typ, mode_name);
}
goto_pda_home_first(aqdata); // if enabled
if (! goto_pda_menu(aqdata, PM_EQUIPTMENT_CONTROL)) {
LOG(PDA_LOG,LOG_ERR, "PDA light Programming :- can't find EQUIPTMENT CONTROL menu\n");
cleanAndTerminateThread(threadCtrl);
@ -995,6 +1023,7 @@ void *get_aqualink_PDA_device_status( void *ptr )
waitForSingleThreadOrTerminate(threadCtrl, AQ_PDA_DEVICE_STATUS);
goto_pda_home_first(aqdata); // if enabled
goto_pda_menu(aqdata, PM_HOME);
if (! loopover_devices(aqdata)) {
@ -1149,6 +1178,7 @@ void *get_PDA_aqualink_pool_spa_heater_temps( void *ptr )
struct aqualinkdata *aqdata = threadCtrl->aqdata;
waitForSingleThreadOrTerminate(threadCtrl, AQ_PDA_GET_POOL_SPA_HEATER_TEMPS);
goto_pda_home_first(aqdata); // if enabled
_get_PDA_aqualink_pool_spa_heater_temps(aqdata);
cleanAndTerminateThread(threadCtrl);
return ptr;
@ -1161,6 +1191,7 @@ void *get_PDA_freeze_protect_temp( void *ptr )
struct aqualinkdata *aqdata = threadCtrl->aqdata;
waitForSingleThreadOrTerminate(threadCtrl, AQ_PDA_GET_FREEZE_PROTECT_TEMP);
goto_pda_home_first(aqdata); // if enabled
_get_PDA_freeze_protect_temp(aqdata);
cleanAndTerminateThread(threadCtrl);
return ptr;
@ -1366,6 +1397,8 @@ void *set_PDA_aqualink_SWG_setpoint(void *ptr) {
int val = atoi((char*)threadCtrl->thread_args);
#endif
goto_pda_home_first(aqdata); // if enabled
val = setpoint_check(SWG_SETPOINT, val, aqdata);
if (! goto_pda_menu(aqdata, PM_AQUAPURE)) {
@ -1497,6 +1530,7 @@ void *set_PDA_aqualink_boost(void *ptr)
int val = atoi((char*)threadCtrl->thread_args);
#endif
goto_pda_home_first(aqdata); // if enabled
if (! goto_pda_menu(aqdata, PM_BOOST)) {
LOG(PDA_LOG,LOG_ERR, "Error finding BOOST menu\n");
return false;
@ -1581,6 +1615,7 @@ void *set_aqualink_PDA_pool_heater_temps( void *ptr )
int val = atoi((char*)threadCtrl->thread_args);
#endif
goto_pda_home_first(aqdata); // if enabled
val = setpoint_check(POOL_HTR_SETPOINT, val, aqdata);
set_PDA_aqualink_heater_setpoint(aqdata, val, true);
@ -1607,6 +1642,7 @@ void *set_aqualink_PDA_spa_heater_temps( void *ptr )
int val = atoi((char*)threadCtrl->thread_args);
#endif
goto_pda_home_first(aqdata); // if enabled
val = setpoint_check(SPA_HTR_SETPOINT, val, aqdata);
set_PDA_aqualink_heater_setpoint(aqdata, val, false);
@ -1635,6 +1671,7 @@ void *set_aqualink_PDA_freeze_protectsetpoint( void *ptr )
#endif
goto_pda_home_first(aqdata); // if enabled
val = setpoint_check(FREEZE_SETPOINT, val, aqdata);
if (_PDA_Type != PDA) {
@ -1666,6 +1703,7 @@ void *set_PDA_aqualink_time( void *ptr )
waitForSingleThreadOrTerminate(threadCtrl, AQ_PDA_SET_TIME);
goto_pda_home_first(aqdata); // if enabled
if (! goto_pda_menu(aqdata, PM_SET_TIME)) {
LOG(PDA_LOG,LOG_ERR, "Error finding set time menu\n");
goto f_end;
@ -1750,6 +1788,7 @@ void *get_PDA_aqualink_aux_labels( void *ptr ) {
LOG(PDA_LOG,LOG_INFO, "Finding PDA labels, (BETA ONLY)\n");
goto_pda_home_first(aqdata); // if enabled
if (! goto_pda_menu(aqdata, PM_AUX_LABEL)) {
LOG(PDA_LOG,LOG_ERR, "Error finding aux label menu\n");
goto f_end;