2018-07-06 23:56:33 +02:00
2018-07-11 13:30:57 +02:00
# ifndef speedclock_H
# define speedclock_H
2018-07-06 23:56:33 +02:00
2018-07-24 18:35:58 +02:00
# define STATS_PLOTS_EVERY_MS 1000 // plots statistical values all number of milli seconds .... 0 menas no plot
2018-07-07 18:47:18 +02:00
//-------------- defines for the radio devices NRF24 ---------------------------------------------------------
# define STATION_SEL0 9 // this 9 for Nano
# define STATION_SEL1 10 // this 10 for Nano
2018-07-06 23:56:33 +02:00
2018-07-08 13:44:57 +02:00
typedef enum { BASESTATION = 0 , TOPSTATION } radio_type_e ;
2018-07-06 23:56:33 +02:00
# 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
2018-07-23 18:28:40 +02:00
# define RF24_PA_LEVEL RF24_PA_LOW // sending power level RF24_PA_LOW, RF24_PA_HIGH????
2018-07-06 23:56:33 +02:00
2018-07-07 18:47:18 +02:00
//--------------- defines for the I2C
//#define SCL A5 // I2C clock pin
2018-07-08 13:44:57 +02:00
//#define SDA A4 // I2C data pin
2018-07-07 18:47:18 +02:00
2018-07-06 23:56:33 +02:00
//--------------- define the structure and type of data that sender and receiver will exchange ----------------
typedef struct transcv_struct {
2018-07-08 13:44:57 +02:00
unsigned long topstationtime ; // the top station sends its time (millis()) continously to the base station
2018-07-24 16:57:35 +02:00
volatile unsigned long topbuttonpressedtime ; // the top station sends the time in millis() when the button was pressed - this is already the calculated time
2018-07-06 23:56:33 +02:00
} transcv_s ;
2018-07-17 13:12:58 +02:00
# 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.
2018-07-23 18:28:40 +02:00
# define CONN_TIMEOUT 5000 // if there was no data received from the TOPSTATION for that amount of time - the connection is flagged as lost
2018-07-17 13:12:58 +02:00
2018-07-24 14:32:00 +02:00
# define KEY_BOUNCE_MS 50 // the time we use to avoid keybouncing ...
# define KEY_LONGPRESSED_MS 1000
2018-07-24 18:35:58 +02:00
# define KEY_TOGGLE_MS 500 // the time between to key actions ...
2018-07-24 14:32:00 +02:00
# define BUTTON_NOTPRESSED HIGH
# define BUTTON_PRESSED LOW
# define BUTTON_LONGPRESSED 3
typedef enum { BUTTON_STOPCANCEL = 0 , BUTTON_START , BUTTON_FAIL , NO_LAST_BUTTON } button_number_e ;
const uint8_t BUTTONPins [ NO_LAST_BUTTON ] = {
[ BUTTON_STOPCANCEL ] = 2 , // stop/cancel button input pin
[ BUTTON_START ] = 4 , // start button input pin
[ BUTTON_FAIL ] = 3 , // stop button input pin
} ;
2018-07-06 23:56:33 +02:00
2018-07-24 16:57:35 +02:00
# define MIN_DELAY_BETWEEN_PRESSED_MS 500 // this defines the time in milliseconds before the button is expected to be pressed again. We do this to avaoid keybouncing
2018-07-06 23:56:33 +02:00
2018-07-07 18:47:18 +02:00
# define PIEZO_PIN 6 // piezo speaker
2018-07-07 19:27:47 +02:00
# define DISPLAY_I2C_ADDRESS 0x3C //Adress of the Display
2018-07-06 23:56:33 +02:00
2018-07-24 18:35:58 +02:00
typedef enum { TIMER_INIT = 0 , TIMER_NOCONNECTION , TIMER_IDLE , TIMER_READY , TIMER_STARTED , TIMER_RUNNING , TIMER_CANCELLED , TIMER_STOPPED , TIMER_TIMEDOUT , TIMER_FAIL , TIMER_WAIT , TIMER_SETTINGS } timer_state_e ;
typedef enum { MODE_COMPETE = 0 , MODE_TRAINING , MODE_CALIBRATION , NO_LAST_MODE } timer_mode_e ; // compete - full mode with false start detector, training - no false start detection, calibration - parellel wired connection between top and base to kalibrate the offset calculation of the wireless connection
const char timer_mode_short [ NO_LAST_MODE ] = { [ MODE_COMPETE ] = ' F ' , [ MODE_TRAINING ] = ' T ' , [ MODE_CALIBRATION ] = ' C ' } ;
const String timer_mode_string [ NO_LAST_MODE ] = { [ MODE_COMPETE ] = " Competetion " , [ MODE_TRAINING ] = " Training " , [ MODE_CALIBRATION ] = " Calibration " } ;
2018-07-23 18:28:40 +02:00
# define LED_BLINK_ALL_MS 500 // LED set to BLINK will change there state every number of milli seconds specified here
2018-07-08 13:44:57 +02:00
// READY_LED, WARN_LED, RUN_LED, FAIL_LED
2018-07-23 18:28:40 +02:00
typedef enum { READY_LED = 0 , RUN_LED , FAIL_LED , WARN_LED , NO_LAST_LED } led_number_e ; // leave NO_LAST_LED as last element - its our marker ...
const uint8_t LEDPins [ NO_LAST_LED ] = {
[ READY_LED ] = A2 , // green ready LED
[ RUN_LED ] = A0 , // blue run LED
[ FAIL_LED ] = A3 , // red fail LED
[ WARN_LED ] = A1 // yellow warn LED
} ;
typedef enum { LED_OFF = 0 , LED_ON , LED_BLINK } led_state_e ;
const uint8_t LEDStates [ ] [ NO_LAST_LED ] =
2018-07-06 23:56:33 +02:00
{
2018-07-24 18:35:58 +02:00
[ TIMER_INIT ] = { [ READY_LED ] = LED_OFF , [ RUN_LED ] = LED_OFF , [ FAIL_LED ] = LED_BLINK , [ WARN_LED ] = LED_OFF } , // 0
[ TIMER_NOCONNECTION ] = { [ READY_LED ] = LED_OFF , [ RUN_LED ] = LED_OFF , [ FAIL_LED ] = LED_ON , [ WARN_LED ] = LED_OFF } , // 1
[ TIMER_IDLE ] = { [ READY_LED ] = LED_ON , [ RUN_LED ] = LED_OFF , [ FAIL_LED ] = LED_OFF , [ WARN_LED ] = LED_OFF } , // 2
[ TIMER_READY ] = { [ READY_LED ] = LED_BLINK , [ RUN_LED ] = LED_OFF , [ FAIL_LED ] = LED_OFF , [ WARN_LED ] = LED_OFF } , // 3
[ TIMER_STARTED ] = { [ READY_LED ] = LED_ON , [ RUN_LED ] = LED_ON , [ FAIL_LED ] = LED_OFF , [ WARN_LED ] = LED_OFF } , // 4
[ TIMER_RUNNING ] = { [ READY_LED ] = LED_OFF , [ RUN_LED ] = LED_ON , [ FAIL_LED ] = LED_OFF , [ WARN_LED ] = LED_OFF } , // 5
[ TIMER_CANCELLED ] = { [ READY_LED ] = LED_OFF , [ RUN_LED ] = LED_OFF , [ FAIL_LED ] = LED_ON , [ WARN_LED ] = LED_OFF } , // 6
[ TIMER_STOPPED ] = { [ READY_LED ] = LED_ON , [ RUN_LED ] = LED_ON , [ FAIL_LED ] = LED_OFF , [ WARN_LED ] = LED_OFF } , // 7
[ TIMER_TIMEDOUT ] = { [ READY_LED ] = LED_OFF , [ RUN_LED ] = LED_ON , [ FAIL_LED ] = LED_ON , [ WARN_LED ] = LED_OFF } , // 8
[ TIMER_FAIL ] = { [ READY_LED ] = LED_OFF , [ RUN_LED ] = LED_BLINK , [ FAIL_LED ] = LED_ON , [ WARN_LED ] = LED_OFF } , // 9
[ TIMER_WAIT ] = { [ READY_LED ] = LED_ON , [ RUN_LED ] = LED_ON , [ FAIL_LED ] = LED_ON , [ WARN_LED ] = LED_ON } , // 10
[ TIMER_SETTINGS ] = { [ READY_LED ] = LED_OFF , [ RUN_LED ] = LED_OFF , [ FAIL_LED ] = LED_OFF , [ WARN_LED ] = LED_ON } // 11
2018-07-07 18:47:18 +02:00
} ;
2018-07-06 23:56:33 +02:00
2018-07-08 01:34:57 +02:00
# define MAX_DIFFERENCE_OFFSET_MS 100 // 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 100 // we need at least this number of meanvalues to be ready to start a run
2018-07-23 18:28:40 +02:00
# define MAX_ALLOWED_FAILED_OFFSETS 10 // if more than this number of offsets are out of the specified MAX_DIFFERENCE_OFFSET_MS value, offset calcultion will be restarted
2018-07-07 18:47:18 +02:00
2018-07-17 13:12:58 +02:00
# define STARTSEQ_STEPS 4
const uint8_t STARTSEQ_NOTES [ ] = { 0 , 392 , 392 , 1047 } ; // tone frequence
const uint16_t STARTSEQ_DURATION [ ] = { 0 , 200 , 200 , 100 } ; // tone duration in milliseconds
const unsigned long STARTSEQ_PAUSE [ ] = { 1000000 , 1000000 , 1000000 , 100000 } ; // pause between tones in microseconds
2018-07-08 13:44:57 +02:00
# define STARTSEQ_LENGTH_MS 3100 // the length of the start sequence from the time the button was pressed ... includes the 3 tones
2018-07-07 18:47:18 +02:00
2018-07-23 18:28:40 +02:00
# define FAILSEQ_STEPS 2
const uint8_t FAILSEQ_NOTES [ ] = { 49 , 49 } ; // tone frequence
const uint16_t FAILSEQ_DURATION [ ] = { 300 , 300 } ; // tone duration in milliseconds
const unsigned long FAILSEQ_PAUSE [ ] = { 400000 , 400000 } ; // pause between tones in microseconds
2018-07-07 18:47:18 +02:00
# define TIMER_MAX_TIME 99999
# define TIMER_TIMEOUT 20000
//--------------------------------------- function declarations ----------------------------------------------
2018-07-09 16:45:37 +02:00
void receive_values ( void ) ;
2018-07-07 18:47:18 +02:00
void false_start_isr ( void ) ;
2018-07-07 22:50:05 +02:00
void update_screen ( timer_state_e state ) ;
2018-07-07 18:47:18 +02:00
void set_state_LEDs ( timer_state_e state , boolean warn ) ;
void startSequence ( void ) ;
2018-07-07 22:50:05 +02:00
void update_statemessage ( timer_state_e timer_state ) ;
2018-07-07 18:47:18 +02:00
void failSequence ( void ) ;
2018-07-07 23:51:35 +02:00
void wait ( unsigned long ms ) ;
2018-07-17 13:12:58 +02:00
void start_isr ( void ) ;
2018-07-24 14:32:00 +02:00
void update_buttons ( void ) ;
2018-07-24 16:57:35 +02:00
void send_values ( void ) ;
void stop_isr ( void ) ;
2018-07-24 14:32:00 +02:00
2018-07-06 23:56:33 +02:00
# endif