mirror of https://github.com/sfeakes/AqualinkD.git
ballle98/AqualinkD#42: memcpy-param-overlap in PDA Shift processing
parent
e13deacf5c
commit
fab8a4d035
|
@ -132,21 +132,23 @@ bool waitForPDAnextMenu(struct aqualinkdata *aq_data) {
|
|||
|
||||
bool loopover_devices(struct aqualinkdata *aq_data) {
|
||||
int i;
|
||||
|
||||
int index = -1;
|
||||
if (! goto_pda_menu(aq_data, PM_EQUIPTMENT_CONTROL)) {
|
||||
//logMessage(LOG_ERR, "PDA :- can't find main menu\n");
|
||||
logMessage(LOG_ERR, "loopover_devices :- can't goto PM_EQUIPTMENT_CONTROL menu\n");
|
||||
//cleanAndTerminateThread(threadCtrl);
|
||||
return false;
|
||||
}
|
||||
|
||||
// Should look for message "ALL OFF", that's end of device list.
|
||||
for (i=0; i < 18 && pda_find_m_index("ALL OFF") == -1 ; i++) {
|
||||
for (i=0; i < 18 && (index = pda_find_m_index("ALL OFF")) == -1 ; i++) {
|
||||
send_cmd(KEY_PDA_DOWN);
|
||||
//while (get_aq_cmd_length() > 0) { delay(200); }
|
||||
//waitForPDAMessageType(aq_data,CMD_PDA_HIGHLIGHT,3);
|
||||
waitForMessage(aq_data, NULL, 1);
|
||||
// Wait for highlight change or shift and update of current line
|
||||
waitForPDAMessageTypes(aq_data,CMD_PDA_HIGHLIGHT,CMD_MSG_LONG,8);
|
||||
}
|
||||
if (index == -1) {
|
||||
logMessage(LOG_ERR, "loopover_devices :- can't find ALL OFF\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -170,7 +172,7 @@ bool find_pda_menu_item(struct aqualinkdata *aq_data, char *menuText, int charli
|
|||
send_cmd(KEY_PDA_DOWN);
|
||||
//delay(500);
|
||||
//wait_for_empty_cmd_buffer();
|
||||
waitForPDAMessageType(aq_data,CMD_PDA_HIGHLIGHT,2);
|
||||
waitForPDAMessageTypes(aq_data,CMD_PDA_HIGHLIGHT,CMD_MSG_LONG,8);
|
||||
//waitForMessage(aq_data, NULL, 1);
|
||||
index = (charlimit == 0)?pda_find_m_index(menuText):pda_find_m_index_case(menuText, charlimit);
|
||||
if (index >= 0) {
|
||||
|
@ -183,7 +185,8 @@ bool find_pda_menu_item(struct aqualinkdata *aq_data, char *menuText, int charli
|
|||
return false;
|
||||
}
|
||||
} else {
|
||||
logMessage(LOG_ERR, "PDA Device programmer couldn't find menu item '%s'\n",menuText);
|
||||
logMessage(LOG_ERR, "PDA Device programmer couldn't find menu item '%s' in menu %d index %d\n",
|
||||
menuText, pda_m_type(), index);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
@ -274,7 +277,7 @@ bool select_pda_menu_item(struct aqualinkdata *aq_data, char *menuText, bool wai
|
|||
return true;
|
||||
}
|
||||
|
||||
logMessage(LOG_ERR, "PDA Device programmer couldn't selected menu item '%s' at index %d\n",menuText, index);
|
||||
logMessage(LOG_ERR, "PDA Device programmer couldn't select menu item '%s' menu %d\n",menuText, pda_m_type());
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -303,6 +306,10 @@ bool goto_pda_menu(struct aqualinkdata *aq_data, pda_menu_type menu) {
|
|||
|
||||
while (ret && (pda_m_type() != menu)) {
|
||||
switch (menu) {
|
||||
case PM_HOME:
|
||||
send_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);
|
||||
|
@ -410,7 +417,8 @@ bool goto_pda_menu(struct aqualinkdata *aq_data, pda_menu_type menu) {
|
|||
menu, pda_m_type());
|
||||
}
|
||||
if (pda_m_type() != menu) {
|
||||
logMessage(LOG_ERR, "PDA Device programmer didn't find a requested menu\n");
|
||||
logMessage(LOG_ERR, "PDA Device programmer didn't find a requested menu %d, current %d\n",
|
||||
menu, pda_m_type());
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -441,7 +449,7 @@ void *set_aqualink_PDA_device_on_off( void *ptr )
|
|||
logMessage(LOG_INFO, "PDA Device On/Off, device '%s', state %d\n",aq_data->aqbuttons[device].pda_label,state);
|
||||
|
||||
if (! goto_pda_menu(aq_data, PM_EQUIPTMENT_CONTROL)) {
|
||||
logMessage(LOG_ERR, "PDA Device On/Off :- can't find main menu\n");
|
||||
logMessage(LOG_ERR, "PDA Device On/Off :- can't find EQUIPTMENT CONTROL menu\n");
|
||||
cleanAndTerminateThread(threadCtrl);
|
||||
return ptr;
|
||||
}
|
||||
|
@ -497,8 +505,6 @@ void *set_aqualink_PDA_device_on_off( void *ptr )
|
|||
|
||||
}
|
||||
|
||||
|
||||
|
||||
void *get_aqualink_PDA_device_status( void *ptr )
|
||||
{
|
||||
struct programmingThreadCtrl *threadCtrl;
|
||||
|
@ -576,6 +582,10 @@ void *set_aqualink_PDA_init( void *ptr )
|
|||
logMessage(LOG_ERR, "PDA Init :- Error getting freeze setpoints\n");
|
||||
}
|
||||
|
||||
// shift line test
|
||||
// goto_pda_menu(aq_data,PM_SYSTEM_SETUP);
|
||||
// select_pda_menu_item(aq_data, "SERVICE INFO", true);
|
||||
|
||||
pda_reset_sleep();
|
||||
|
||||
cleanAndTerminateThread(threadCtrl);
|
||||
|
@ -747,7 +757,7 @@ bool set_PDA_numeric_field_value(struct aqualinkdata *aq_data, int val, int *cur
|
|||
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,2);
|
||||
|
|
27
pda_menu.c
27
pda_menu.c
|
@ -169,6 +169,11 @@ Line 0 = EQUIPMENT
|
|||
bool process_pda_menu_packet(unsigned char* packet, int length)
|
||||
{
|
||||
bool rtn = true;
|
||||
signed char first_line;
|
||||
signed char last_line;
|
||||
signed char line_shift;
|
||||
signed char i;
|
||||
|
||||
switch (packet[PKT_CMD]) {
|
||||
case CMD_PDA_CLEAR:
|
||||
_hlightindex = -1;
|
||||
|
@ -200,9 +205,25 @@ bool process_pda_menu_packet(unsigned char* packet, int length)
|
|||
if (getLogLevel() >= LOG_DEBUG){print_menu();}
|
||||
break;
|
||||
case CMD_PDA_SHIFTLINES:
|
||||
memcpy(_menu[1], _menu[2], (PDA_LINES-1) * (AQ_MSGLEN+1) );
|
||||
// press up from top - shift menu down by 1
|
||||
// PDA Shif | HEX: 0x10|0x02|0x62|0x0f|0x01|0x08|0x01|0x8d|0x10|0x03|
|
||||
// press down from bottom - shift menu up by 1
|
||||
// PDA Shif | HEX: 0x10|0x02|0x62|0x0f|0x01|0x08|0xff|0x8b|0x10|0x03|
|
||||
first_line = (signed char)(packet[4]);
|
||||
last_line = (signed char)(packet[5]);
|
||||
line_shift = (signed char)(packet[6]);
|
||||
logMessage(LOG_DEBUG, "\n");
|
||||
if (line_shift < 0) {
|
||||
for (i = first_line-line_shift; i <= last_line; i++) {
|
||||
memcpy(_menu[i+line_shift], _menu[i], AQ_MSGLEN+1);
|
||||
}
|
||||
} else {
|
||||
for (i = last_line; i >= first_line+line_shift; i--) {
|
||||
memcpy(_menu[i], _menu[i-line_shift], AQ_MSGLEN+1);
|
||||
}
|
||||
}
|
||||
if (getLogLevel() >= LOG_DEBUG){print_menu();}
|
||||
break;
|
||||
break;
|
||||
}
|
||||
|
||||
return rtn;
|
||||
|
@ -284,4 +305,4 @@ bool NEW_process_pda_menu_packet_NEW(unsigned char* packet, int length)
|
|||
|
||||
return rtn;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue