void set_status(uint64_t *ping_start_time, uint64_t curr_time) { status_lock(); if (ping_start_time != NULL) *ping_start_time = curr_time; status_unlock(); }
char get_status(uint64_t *ping_start_time, uint64_t curr_time) { char ret = PING_STATUS_STEADY; status_lock(); if (curr_time - *ping_start_time > PING_STEADY_TIME) { ret = PING_STATUS_STEADY; } else { ret = PING_STATUS_START; } status_unlock(); return ret; }
void status_error( unsigned char *codes ) { #ifdef __XMK__ status_lock(); if ( n_error_sets < MAX_ERROR_SETS ) { if (cur_error_set >= n_error_sets) ++cur_error_set; error_list[n_error_sets++] = codes; } status_unlock(); #else set_status(codes[0] | 0x10 ); #endif }
static void *status_thread(void *param) { for (;;) { int cur_value; sleep(500); status_lock(); if ( cur_error_set < n_error_sets ) { cur_value = error_list[cur_error_set][cur_elt]; if ( cur_value == 0 ) { cur_elt = 0; if (++cur_error_set == n_error_sets) { if ( n_status_sets > 0 ) { cur_status_set = 0; } else { cur_error_set = 0; cur_value |= 0x10; } } } else { cur_value |= 0x10; ++cur_elt; } } else if ( cur_status_set < n_status_sets ) { cur_value = status_list[cur_status_set][cur_elt]; if ( cur_value == 0 ) { cur_elt = 0; if (++cur_status_set == n_status_sets) { if ( n_error_sets > 0 ) { cur_error_set = 0; // cur_value |= 0x10; } else { cur_status_set = 0; } } } else { ++cur_elt; } } else if ( n_error_sets > 0 ) { cur_error_set = 0; cur_elt = 0; cur_value = 0x10; } else if ( n_status_sets > 0 ) { cur_status_set = 0; cur_elt = 0; cur_value = 0; } status_unlock(); set_status(cur_value); } }
/* if clear == 0, appends the specified codes */ void status_set( int clear, unsigned char *codes) { #ifdef __XMK__ status_lock(); if ( clear ) { if (cur_status_set < n_status_sets) { cur_status_set = 1; cur_elt = 0; } else { cur_status_set = 1; // future n_status_sets } n_status_sets = 0; } else { if (n_status_sets >= MAX_STATUS_SETS) return; if (cur_status_set >= n_status_sets) ++cur_status_set; } status_list[n_status_sets++] = codes; status_unlock(); #else set_status(codes[0]); #endif }