#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
+#include <stdbool.h>
struct sercom_data* sercom;
int interrupt = 0;
return x->tv_sec < y->tv_sec;
}
-int miliseconds_since(struct timespec *t)
+bool miliseconds_elapsed_since(struct timespec *t, unsigned miliseconds)
{
struct timespec now, diff;
+ unsigned long long elapsed;
+
+ if (t->tv_sec == 0 && t->tv_nsec == 0)
+ return true; /* Always elapsed after program start */
clock_gettime(CLOCK_MONOTONIC, &now);
- timespec_subtract(&diff, t, &now);
- return diff.tv_sec * 1000 + diff.tv_nsec/1000000;
+ timespec_subtract(&diff, &now, t);
+ elapsed = diff.tv_sec * 1000 + diff.tv_nsec/1000000;
+ return elapsed > miliseconds;
}
break;
}
if (status != last_status ||
- miliseconds_since(&last_sent) > 1000) {
- uoled_display_status(PWR, STATUS_OK);
+ miliseconds_elapsed_since(&last_sent, 1000)) {
+ uoled_display_status(PWR, status);
clock_gettime(CLOCK_MONOTONIC, &last_sent);
}
last_status = status;
}
/* Neni potreba aktualizovat stav na displeji 25x za sekundu */
if (status != last_status ||
- miliseconds_since(&last_sent) > 1000) {
- uoled_display_status(ODO, STATUS_OK);
+ miliseconds_elapsed_since(&last_sent, 1000)) {
+ uoled_display_status(ODO, status);
clock_gettime(CLOCK_MONOTONIC, &last_sent);
}
last_status = status;
}
/* Neni potreba aktualizovat stav na displeji 25x za sekundu */
if (status != last_status ||
- miliseconds_since(&last_sent) > 1000) {
- uoled_display_status(MOT, STATUS_OK);
+ miliseconds_elapsed_since(&last_sent, 1000)) {
+ uoled_display_status(MOT, status);
clock_gettime(CLOCK_MONOTONIC, &last_sent);
}
last_status = status;
break;
}
if (status != last_status ||
- miliseconds_since(&last_sent) > 1000) {
- uoled_display_status(CAM, STATUS_OK);
+ miliseconds_elapsed_since(&last_sent, 1000)) {
+ uoled_display_status(CAM, status);
clock_gettime(CLOCK_MONOTONIC, &last_sent);
}
last_status = status;
break;
}
if (status != last_status ||
- miliseconds_since(&last_sent) > 1000) {
- uoled_display_status(HOK, STATUS_OK);
+ miliseconds_elapsed_since(&last_sent, 1000)) {
+ uoled_display_status(HOK, status);
clock_gettime(CLOCK_MONOTONIC, &last_sent);
}
last_status = status;
struct robottype_orte_data *orte_data = (struct robottype_orte_data *)recvCallBackParam;
switch (info->status) {
case NEW_DATA:
- uoled_display_position(orte_data->est_pos_best.x, orte_data->est_pos_best.y, orte_data->est_pos_best.phi);
status = STATUS_OK;
break;
case DEADLINE:
break;
}
if (status != last_status ||
- miliseconds_since(&last_sent) > 1000) {
- uoled_display_status(ODO, STATUS_OK);
+ miliseconds_elapsed_since(&last_sent, 100)) {
+ uoled_display_status(APP, status);
+ if (status == STATUS_OK)
+ uoled_display_position(orte_data->est_pos_best.x, orte_data->est_pos_best.y, orte_data->est_pos_best.phi);
clock_gettime(CLOCK_MONOTONIC, &last_sent);
}
last_status = status;
break;
}
if (strcmp(status,last_status) != 0 ||
- miliseconds_since(&last_sent) > 1000) {
+ miliseconds_elapsed_since(&last_sent, 1000)) {
uoled_display_fsm(FSM_MAIN, status);
clock_gettime(CLOCK_MONOTONIC, &last_sent);
}
break;
}
if (strcmp(status,last_status) != 0 ||
- miliseconds_since(&last_sent) > 1000) {
+ miliseconds_elapsed_since(&last_sent, 1000)) {
uoled_display_fsm(FSM_ACT, status);
clock_gettime(CLOCK_MONOTONIC, &last_sent);
}
break;
}
if (strcmp(status,last_status) != 0 ||
- miliseconds_since(&last_sent) > 1000) {
+ miliseconds_elapsed_since(&last_sent, 1000)) {
uoled_display_fsm(FSM_MOVE, status);
clock_gettime(CLOCK_MONOTONIC, &last_sent);
}