
#ifndef Remote_Control_transceiver_H
#define Remote_Control_transceiver_H

//-------------- defines for the radio devices NRF24 ---------------------------------------------------------

#define STATION_SEL0 9   // this 9 for Nano
#define STATION_SEL1 10   // this 10 for Nano

typedef enum {BASESTATION = 0, TOPSTATION} radio_type_e;      
#define RF24_CNS 7    // this is 7 for the Nano, D4 for the ESP
#define RF24_CE 8     // this is 8 for the Nano, D3 for the ESP

//--------------- defines for the I2C
//#define SCL A5      // I2C clock pin
//#define SDA A4      // I2C data pin 

//--------------- define the structure and type of data that sender and receiver will exchange ----------------

typedef struct transcv_struct{
  unsigned long topstationtime;         // the top station sends its time (millis()) continously to the base station 
  unsigned long topbuttonpressedtime;   // the top station sends the time in millis() when the button was pressed - this is already the calculated time  
}transcv_s;


#define STOPBUTTON_IN 2                   // this is the input for the button
#define STOPBUTTON_PRESSED HIGH           // this the signal level the top button will be at as soon as pressed
#define MIN_DELAY_BETWEEN_PRESSED_MS 1000 // this defines the time in milliseconds before the button is expected to be pressed again. We do this to avaoid keybouncing
#define MIN_DELAY_BETWEEN_SEND_MS 1000    // this defines the time in milliseconds before the next set of data will be send to the base station - except the button was pressed.

#define STARTBUTTON_IN 4                  // start button
#define STARTBUTTON_PRESSED LOW
#define CANCELBUTTON_IN 2                // chancle button
#define CANCELBUTTON_PRESSED LOW
#define FAILSTARTBUTTON_IN 3              // fail start button 
#define FAILSTARTBUTTON_PRESSED LOW

#define PIEZO_PIN 6                      // piezo speaker

#define WARN_LED A1                       // yellow warn LED
#define WARN_LED_ON HIGH
#define WARN_LED_OFF LOW
#define FAIL_LED A3                       // red fail LED
#define FAIL_LED_ON HIGH
#define FAIL_LED_OFF LOW
#define READY_LED A2                      // green ready LED
#define READY_LED_ON HIGH
#define READY_LED_OFF LOW
#define RUN_LED A0                        // blue run LED
#define RUN_LED_ON HIGH
#define RUN_LED_OFF LOW

#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; 

// READY_LED, WARN_LED, RUN_LED, FAIL_LED 
const float LEDStates[][3] = 
{
  [TIMER_INIT]      = {READY_LED_OFF, 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},
  [TIMER_CANCELLED]  = {READY_LED_OFF, RUN_LED_OFF, FAIL_LED_ON},
  [TIMER_STOPPED]   = {READY_LED_ON, RUN_LED_ON, FAIL_LED_OFF},
  [TIMER_TIMEDOUT]  = {READY_LED_OFF, RUN_LED_ON, FAIL_LED_ON},
  [TIMER_FAIL]      = {READY_LED_OFF, RUN_LED_OFF, FAIL_LED_ON}
};

#define MAX_DIFFERENCE_OFFSET_MS 10       // 0,001sec is the maximum offset we allow between the current offset and the mean offset. if it is more - restart offset calculation
#define REQUIRED_NUMBER_MEANVALS 10      // we need at least this number of meanvalues to be ready to start a run

#define STARTSEQ_LENGTH_MS 3100          // the length of the start sequence from the time the button was pressed ... includes the 3 tones 
#define STARTSEQ_STARTPAUSE_MS 1000
#define STARTSEQ_TONEPAUSE_MS 800
#define STARTSEQ_TON_1_2_LENGTH_MS 200
#define STARTSEQ_TON_1_2_FREQUENCY NOTE_G4
#define STARTSEQ_TON_3_LENGTH_MS 100
#define STARTSEQ_TON_3_FREQUENCY NOTE_C6

#define FAILSEQ_TONEPAUSE_MS 400
#define FAILSEQ_TON_LENGTH_MS 300
#define FAILSEQ_TON_FREQUENCY NOTE_G1

#define TIMER_MAX_TIME 99999
#define TIMER_TIMEOUT 20000

//--------------------------------------- function declarations ----------------------------------------------
void false_start_isr(void);
void update_screen(timer_state_e timer_state);
void set_state_LEDs(timer_state_e state, boolean warn);
void startSequence(void);
void update_statemassage(timer_state_e timer_state);
void failSequence(void);
#endif


