 
 // input control byte constants
 #define CONTROL_START_RACE      'R'
+#define CONTROL_START_RACE_ABS  'P' // race with absolute laps timing
 #define CONTROL_END_RACE        'r'
 #define CONTROL_DEC_MIN_LAP     'm'
 #define CONTROL_INC_MIN_LAP     'M'

uint8_t channelIndex = 0;
uint8_t bandIndex = 0;
uint8_t isRaceStarted = 0;
uint8_t isSoundEnabled = 1;
uint8_t isConfigured = 0; //changes to 1 if any input changes the state of the device. it will mean that externally stored preferences should not be applied
uint8_t rssiMonitor = 0;

    } else {
        switch (controlByte) {
            case CONTROL_START_RACE: // start race
                raceStartTime = millis();
                lastMilliseconds = raceStartTime;
                DEBUG_CODE(
                    digitalHigh(serialTimerPin);
                );
                newLapIndex = 0;
                isRaceStarted = 1;
                raceType = 1;
                allowEdgeGeneration = 0;
                playStartRaceTones();
                addToSendQueue(SEND_RACE_STATE);
                isConfigured = 1;
                break;
            case CONTROL_START_RACE_ABS: // start race with absolute laps timing
                raceStartTime = millis();
                lastMilliseconds = raceStartTime;
                newLapIndex = 0;
                isRaceStarted = 1;
                raceType = 2;
                allowEdgeGeneration = 0;
                playStartRaceTones();
                addToSendQueue(SEND_RACE_STATE);
