Added new state IDLE

This commit is contained in:
Fenoglio 2018-07-07 22:50:05 +02:00
parent bf2176ed83
commit f6132f1c85
2 changed files with 44 additions and 31 deletions

View file

@ -52,12 +52,13 @@ typedef struct transcv_struct{
#define DISPLAY_I2C_ADDRESS 0x3C //Adress of the Display
typedef enum {TIMER_INIT = 0, TIMER_READY, TIMER_STARTED, TIMER_RUNNING , TIMER_CANCELLED, TIMER_STOPPED, TIMER_TIMEDOUT, TIMER_FAIL, TIMER_WAIT} timer_state_e;
typedef enum {TIMER_INIT = 0, TIMER_IDLE, TIMER_READY, TIMER_STARTED, TIMER_RUNNING , TIMER_CANCELLED, TIMER_STOPPED, TIMER_TIMEDOUT, TIMER_FAIL, TIMER_WAIT} timer_state_e;
// READY_LED, WARN_LED, RUN_LED, FAIL_LED
const float LEDStates[][3] =
{
[TIMER_INIT] = {READY_LED_OFF, RUN_LED_OFF, FAIL_LED_OFF},
[TIMER_IDLE] = {READY_LED_ON, RUN_LED_OFF, FAIL_LED_OFF},
[TIMER_READY] = {READY_LED_ON, RUN_LED_OFF, FAIL_LED_OFF},
[TIMER_STARTED] = {READY_LED_ON, RUN_LED_ON, FAIL_LED_OFF},
[TIMER_RUNNING] = {READY_LED_OFF, RUN_LED_ON, FAIL_LED_OFF},
@ -87,10 +88,10 @@ const float LEDStates[][3] =
//--------------------------------------- function declarations ----------------------------------------------
void false_start_isr(void);
void update_screen(timer_state_e timer_state);
void update_screen(timer_state_e state);
void set_state_LEDs(timer_state_e state, boolean warn);
void startSequence(void);
void update_statemassage(timer_state_e timer_state);
void update_statemessage(timer_state_e timer_state);
void failSequence(void);
#endif

View file

@ -176,8 +176,11 @@ void loop(void) {
// set state to new_state
if(timer_state != timer_new_state){
update_statemassage(timer_new_state);
update_statemessage(timer_new_state);
}
update_screen(timer_new_state);
timer_state = timer_new_state;
// set LEDs
@ -185,15 +188,13 @@ void loop(void) {
switch(timer_state){
case TIMER_INIT:
update_screen(timer_state);
// check if we are ready ...
if(counter_time_offset > REQUIRED_NUMBER_MEANVALS){
// check if offset is OK - if not .. set state back to INIT
timer_new_state = TIMER_READY;
timer_new_state = TIMER_IDLE;
}
break;
case TIMER_READY:
update_screen(timer_state);
case TIMER_IDLE:
warn_during_run = false;
if(counter_time_offset < REQUIRED_NUMBER_MEANVALS){
// check if offset is OK - if not .. set state back to INIT
@ -203,8 +204,15 @@ void loop(void) {
// check if the FALSESTATE button is pressed - somebody is ready to run ...
if(digitalRead(FAILSTARTBUTTON_IN) == FAILSTARTBUTTON_PRESSED){
//wait a few milliseconds to prevent keybouncing - this is a very simplistic method here
delay(300);
delay(10);
//read again and check if still active ...
if(digitalRead(FAILSTARTBUTTON_IN) == FAILSTARTBUTTON_PRESSED){
timer_new_state = TIMER_READY;
}
}
}
break;
case TIMER_READY:
if(digitalRead(FAILSTARTBUTTON_IN) == FAILSTARTBUTTON_PRESSED){
// check if the start button was pressed ... there is at least still someone waiting for the run .
if(digitalRead(STARTBUTTON_IN) == STARTBUTTON_PRESSED){
@ -213,18 +221,17 @@ void loop(void) {
timer_new_state = TIMER_STARTED;
}
}
}
else{
timer_new_state = TIMER_IDLE;
}
break;
case TIMER_STARTED:
update_screen(timer_state);
//initialize the start countdown
timer_new_state = TIMER_RUNNING;
startSequence();
break;
case TIMER_RUNNING:
noTone(PIEZO_PIN);
update_screen(timer_state);
if(counter_time_offset < REQUIRED_NUMBER_MEANVALS){
// check if offset is still OK - if not .. set state to TIMER_RUNNING
warn_during_run = true;
@ -243,7 +250,6 @@ void loop(void) {
//calculate the run_time and switch to WAIT
run_time = (radio_data.topbuttonpressedtime - running_time_offset) - start_time;
runner_run_time = runner_start_time - run_time;
update_screen(timer_state);
timer_new_state = TIMER_WAIT;
break;
case TIMER_FAIL:
@ -251,21 +257,18 @@ void loop(void) {
failSequence();
run_time = 99999;
runner_run_time = runner_start_time - start_time;
update_screen(timer_state);
timer_new_state = TIMER_WAIT;
break;
case TIMER_CANCELLED:
// what to do in chancel mode ?
run_time = 99999;
runner_run_time = runner_start_time - start_time;
update_screen(timer_state);
timer_new_state = TIMER_WAIT;
break;
case TIMER_TIMEDOUT:
// time out
run_time = millis() - start_time;
runner_run_time = runner_start_time - start_time;
update_screen(timer_state);
timer_new_state = TIMER_WAIT;
break;
case TIMER_WAIT:
@ -273,7 +276,7 @@ void loop(void) {
detachInterrupt(digitalPinToInterrupt(FAILSTARTBUTTON_IN));
// wait until the chancel button was pressed to go ahead
if(digitalRead(CANCELBUTTON_IN) == CANCELBUTTON_PRESSED){
timer_new_state = TIMER_READY;
timer_new_state = TIMER_IDLE;
}
break;
}
@ -283,11 +286,14 @@ void loop(void) {
//####################### HELPER FUNCTIONS ###########################
void update_statemassage(timer_state_e timer_state){
void update_statemessage(timer_state_e timer_state){
switch(timer_state){
case TIMER_INIT:
Serial.println("*** TIMER_INIT ***");
break;
case TIMER_IDLE:
Serial.println("*** TIMER_IDLE ***");
break;
case TIMER_READY:
Serial.println("*** TIMER_READY ***");
break;
@ -317,7 +323,7 @@ void update_statemassage(timer_state_e timer_state){
}
}
void update_screen(timer_state_e timer_state){
void update_screen(timer_state_e state){
bool scr_update = true;
int ypos = 64-42/2;
String header = "no state";
@ -330,16 +336,21 @@ void update_screen(timer_state_e timer_state){
float curr_time_test = 0.0;
switch(timer_state){
switch(state){
case TIMER_INIT:
header = "Init";
content = "...";
footer = "please wait";
break;
case TIMER_IDLE:
header = "Idle!";
content = "00:00";
footer = "Waiting for climber";
break;
case TIMER_READY:
header = "Ready!";
content = "00:00";
footer = "Waiting for climber";
footer = "Press Startbuton to run ...";
break;
case TIMER_STARTED:
header = "Starting ...";
@ -367,10 +378,11 @@ void update_screen(timer_state_e timer_state){
scr_update = false;
break;
}
if(scr_update == true){
if(timer_new_state != timer_state){
display.clear();
}
if(scr_update == true){
//snprintf( string_to_char, sizeof(string_to_char),"%s", header);
header.toCharArray(header_to_char, sizeof(header_to_char));
content.toCharArray(content_to_char, sizeof(content_to_char));
@ -464,12 +476,12 @@ void false_start_isr(void)
// this will save the time when the runner is really started
Serial.println("** Interrupt service routine started: false_start_ISR **");
runner_start_time = millis();
if(timer_state == TIMER_STARTED & timer_new_state == TIMER_STARTED){
if((timer_state == TIMER_STARTED) & (timer_new_state == TIMER_STARTED)){
timer_new_state = TIMER_FAIL;
detachInterrupt(digitalPinToInterrupt(FAILSTARTBUTTON_IN));
noTone(PIEZO_PIN);
} else {
if(timer_state == TIMER_RUNNING | timer_new_state == TIMER_RUNNING ){
if((timer_state == TIMER_RUNNING) | (timer_new_state == TIMER_RUNNING) ){
// disable this interrupt;
detachInterrupt(digitalPinToInterrupt(FAILSTARTBUTTON_IN));
}