Skip to content

Commit

Permalink
#8: replace busy polling with pthread_cond_wait
Browse files Browse the repository at this point in the history
removed delays from PDA init and PDA get status
  • Loading branch information
ballle98 committed Jul 21, 2019
1 parent 05a6b4e commit 2004f66
Show file tree
Hide file tree
Showing 6 changed files with 156 additions and 39 deletions.
64 changes: 37 additions & 27 deletions aq_programmer.c
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@

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();


Expand All @@ -54,23 +53,21 @@ void *set_aqualink_light_colormode( void *ptr );
void *set_aqualink_PDA_init( void *ptr );
void *set_aqualink_SWG( 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);
bool wait_pda_selected_item();

#define MAX_STACK 20
int _stack_place = 0;
unsigned char _commands[MAX_STACK];
//unsigned char pgm_commands[MAX_STACK];
unsigned char _pgm_command = NUL;

bool _last_sent_was_cmd = false;
static unsigned char _pgm_command = NUL;
static pthread_mutex_t _pgm_command_mutex = PTHREAD_MUTEX_INITIALIZER;
static pthread_cond_t _pgm_command_sent_cond = PTHREAD_COND_INITIALIZER;

// External view of adding to queue
void aq_send_cmd(unsigned char cmd) {
Expand Down Expand Up @@ -99,18 +96,22 @@ int get_aq_cmd_length()

unsigned char pop_aq_cmd(struct aqualinkdata *aq_data)
{
static bool _last_sent_was_cmd = false;

unsigned char cmd = NUL;
//logMessage(LOG_DEBUG, "pop_aq_cmd\n");
// :TODO: is this true for PDA?
// can only send a command every other ack.

if (_last_sent_was_cmd == true) {
if (!pda_mode() && (_last_sent_was_cmd == true)) {
_last_sent_was_cmd= false;
}
else if (aq_data->active_thread.thread_id != 0) {
pthread_mutex_lock(&_pgm_command_mutex);
cmd = _pgm_command;
_pgm_command = NUL;
logMessage(LOG_DEBUG, "pop_aq_cmd '0x%02hhx' (programming)\n", cmd);
pthread_cond_signal(&_pgm_command_sent_cond);
pthread_mutex_unlock(&_pgm_command_mutex);
}
else if (_stack_place > 0) {
cmd = _commands[0];
Expand Down Expand Up @@ -393,7 +394,7 @@ void waitForSingleThreadOrTerminate(struct programmingThreadCtrl *threadCtrl, pr
}


int ret;
int ret = 0;
struct timespec max_wait;
clock_gettime(CLOCK_REALTIME, &max_wait);
max_wait.tv_sec += 30;
Expand Down Expand Up @@ -1192,20 +1193,34 @@ void send_cmd(unsigned char cmd, struct aqualinkdata *aq_data)
}
*/

void send_cmd(unsigned char cmd)
bool send_cmd(unsigned char cmd)
{
int i=0;
// If there is an unsent command, wait.
while ( (_pgm_command != NUL) && ( i++ < 10) ) {
//sleep(1); // NSF Change to smaller time.
//logMessage(LOG_ERR, "******** QUEUE IS FULL ******** delay\n", pgm_command);
delay(500);
}

_pgm_command = cmd;
//delay(200);
bool ret=true;
int pret = 0;
struct timespec max_wait;

clock_gettime(CLOCK_REALTIME, &max_wait);
max_wait.tv_sec += 5;

pthread_mutex_lock(&_pgm_command_mutex);
_pgm_command = cmd;
logMessage(LOG_INFO, "Queue send '0x%02hhx' to controller (programming)\n", _pgm_command);
while (_pgm_command != NUL)
{
if ((pret = pthread_cond_timedwait(&_pgm_command_sent_cond,
&_pgm_command_mutex, &max_wait)))
{
logMessage (LOG_ERR, "send_cmd 0x%02hhx err %s\n",
cmd, strerror(pret));
ret = false;
break;
}
}
if (ret) {
logMessage(LOG_INFO, "sent '0x%02hhx' to controller\n", _pgm_command);
}
pthread_mutex_unlock(&_pgm_command_mutex);
return ret;
}

/*
Expand Down Expand Up @@ -1238,7 +1253,6 @@ bool waitForEitherMessage(struct aqualinkdata *aq_data, char* message1, char* me
{
//logMessage(LOG_DEBUG, "waitForMessage %s %d %d\n",message,numMessageReceived,cmd);
int i=0;
pthread_mutex_init(&aq_data->active_thread.thread_mutex, NULL);
pthread_mutex_lock(&aq_data->active_thread.thread_mutex);
char* msgS1;
char* msgS2;
Expand Down Expand Up @@ -1284,7 +1298,6 @@ bool waitForEitherMessage(struct aqualinkdata *aq_data, char* message1, char* me
}

//logMessage(LOG_DEBUG, "Programming mode: looking for '%s' received message1 '%s'\n",message1,aq_data->last_message);
pthread_cond_init(&aq_data->active_thread.thread_cond, NULL);
pthread_cond_wait(&aq_data->active_thread.thread_cond, &aq_data->active_thread.thread_mutex);
//logMessage(LOG_DEBUG, "Programming mode: loop %d of %d looking for '%s' received message1 '%s'\n",i,numMessageReceived,message1,aq_data->last_message);
}
Expand All @@ -1307,7 +1320,7 @@ bool waitForMessage(struct aqualinkdata *aq_data, char* message, int numMessageR
{
logMessage(LOG_DEBUG, "waitForMessage %s %d\n",message,numMessageReceived);
int i=0;
pthread_mutex_init(&aq_data->active_thread.thread_mutex, NULL);

pthread_mutex_lock(&aq_data->active_thread.thread_mutex);
char* msgS;
char* ptr = NULL;
Expand Down Expand Up @@ -1338,7 +1351,6 @@ bool waitForMessage(struct aqualinkdata *aq_data, char* message, int numMessageR
}

//logMessage(LOG_DEBUG, "Programming mode: looking for '%s' received message '%s'\n",message,aq_data->last_message);
pthread_cond_init(&aq_data->active_thread.thread_cond, NULL);
pthread_cond_wait(&aq_data->active_thread.thread_cond, &aq_data->active_thread.thread_mutex);
//logMessage(LOG_DEBUG, "Programming mode: loop %d of %d looking for '%s' received message '%s'\n",i,numMessageReceived,message,aq_data->last_message);
}
Expand Down Expand Up @@ -1439,7 +1451,6 @@ bool waitForButtonState(struct aqualinkdata *aq_data, aqkey* button, aqledstate
{
//logMessage(LOG_DEBUG, "waitForMessage %s %d %d\n",message,numMessageReceived,cmd);
int i=0;
pthread_mutex_init(&aq_data->active_thread.thread_mutex, NULL);
pthread_mutex_lock(&aq_data->active_thread.thread_mutex);

while( ++i <= numMessageReceived)
Expand All @@ -1452,7 +1463,6 @@ bool waitForButtonState(struct aqualinkdata *aq_data, aqkey* button, aqledstate
}

//logMessage(LOG_DEBUG, "Programming mode: looking for '%s' received message '%s'\n",message,aq_data->last_message);
pthread_cond_init(&aq_data->active_thread.thread_cond, NULL);
pthread_cond_wait(&aq_data->active_thread.thread_cond, &aq_data->active_thread.thread_mutex);
//logMessage(LOG_DEBUG, "Programming mode: loop %d of %d looking for '%s' received message '%s'\n",i,numMessageReceived,message,aq_data->last_message);
}
Expand Down
4 changes: 2 additions & 2 deletions aq_programmer.h
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,8 @@ void aq_send_cmd(unsigned char cmd);
unsigned char pop_aq_cmd(struct aqualinkdata *aq_data);
//bool push_aq_cmd(unsigned char cmd);

//void send_cmd(unsigned char cmd, struct aqualinkdata *aq_data);
bool send_cmd(unsigned char cmd);

//void cancel_menu(struct aqualinkdata *aq_data);

//void *set_aqualink_time( void *ptr );
Expand All @@ -70,7 +71,6 @@ int setpoint_check(int type, int value, struct aqualinkdata *aqdata);
const char *ptypeName(program_type type);

// These shouldn't be here, but just for the PDA AQ PROGRAMMER
void send_cmd(unsigned char cmd);
bool push_aq_cmd(unsigned char cmd);
void waitForSingleThreadOrTerminate(struct programmingThreadCtrl *threadCtrl, program_type type);
void cleanAndTerminateThread(struct programmingThreadCtrl *threadCtrl);
Expand Down
3 changes: 3 additions & 0 deletions aqualinkd.c
Original file line number Diff line number Diff line change
Expand Up @@ -1091,6 +1091,9 @@ void main_loop()

clock_gettime(CLOCK_REALTIME, &_aqualink_data.last_active_time);

pthread_mutex_init(&_aqualink_data.active_thread.thread_mutex, NULL);
pthread_cond_init(&_aqualink_data.active_thread.thread_cond, NULL);

pthread_mutex_init(&_aqualink_data.mutex, NULL);
pthread_cond_init(&_aqualink_data.thread_finished_cond, NULL);

Expand Down
10 changes: 3 additions & 7 deletions pda_aq_programmer.c
Original file line number Diff line number Diff line change
Expand Up @@ -342,12 +342,12 @@ void *set_aqualink_PDA_device_on_off( void *ptr )

// If single config (Spa OR pool) rather than (Spa AND pool) heater is TEMP1 and TEMP2
if (aq_data->single_device == TRUE && device == POOL_HEAT_INDEX) { // rename Heater and Spa
sprintf(device_name,"%-13s\n","TEMP1");
snprintf(device_name, sizeof(device_name), "%-13s\n","TEMP1");
} else if (aq_data->single_device == TRUE && device == SPA_HEAT_INDEX) {// rename Heater and Spa
sprintf(device_name,"%-13s\n","TEMP2");
snprintf(device_name, sizeof(device_name), "%-13s\n","TEMP2");
} else {
//Pad name with spaces so something like "SPA" doesn't match "SPA BLOWER"
sprintf(device_name,"%-13s\n",aq_data->aqbuttons[device].pda_label);
snprintf(device_name, sizeof(device_name), "%-13s\n",aq_data->aqbuttons[device].pda_label);
}

if ( find_pda_menu_item(aq_data, device_name, 13) ) {
Expand Down Expand Up @@ -505,7 +505,6 @@ bool waitForPDAMessageHighlight(struct aqualinkdata *aq_data, int highlighIndex,
if(pda_m_hlightindex() == highlighIndex) return true;

int i=0;
pthread_mutex_init(&aq_data->active_thread.thread_mutex, NULL);
pthread_mutex_lock(&aq_data->active_thread.thread_mutex);

while( ++i <= numMessageReceived)
Expand All @@ -514,7 +513,6 @@ bool waitForPDAMessageHighlight(struct aqualinkdata *aq_data, int highlighIndex,

if (aq_data->last_packet_type == CMD_PDA_HIGHLIGHT && pda_m_hlightindex() == highlighIndex) break;

pthread_cond_init(&aq_data->active_thread.thread_cond, NULL);
pthread_cond_wait(&aq_data->active_thread.thread_cond, &aq_data->active_thread.thread_mutex);
}

Expand All @@ -536,7 +534,6 @@ bool waitForPDAMessageType(struct aqualinkdata *aq_data, unsigned char mtype, in
logMessage(LOG_DEBUG, "waitForPDAMessageType 0x%02hhx\n",mtype);

int i=0;
pthread_mutex_init(&aq_data->active_thread.thread_mutex, NULL);
pthread_mutex_lock(&aq_data->active_thread.thread_mutex);

while( ++i <= numMessageReceived)
Expand All @@ -545,7 +542,6 @@ bool waitForPDAMessageType(struct aqualinkdata *aq_data, unsigned char mtype, in

if (aq_data->last_packet_type == mtype) break;

pthread_cond_init(&aq_data->active_thread.thread_cond, NULL);
pthread_cond_wait(&aq_data->active_thread.thread_cond, &aq_data->active_thread.thread_mutex);
}

Expand Down
Loading

0 comments on commit 2004f66

Please sign in to comment.