syntax = "proto3";

package ScStw;

message SoundSettings {
  // Software volume control. Maximum value is 254, default value is 254.
  uint32 volume = 1;
  bool muteInternalSpeaker = 2;
}

message SecuritySettings {
  // If set to true, the bluetooth interface won't be initialized on startup.
  // This can only be changed over a web socket connection to avoid lockout.
  // To be effective, the settings must be stored as default and device must be
  // rebooted!
  bool disableBluetooth = 1;

  // If set to true, the default settings can't be set via bluetooth.
  // This can only be changed over a web socket connection to avoid lockout.
  bool disallowToSetDefaultViaBluetooth = 2;
}

//
// StopwatchSettings
//

// = Competition classic race =
message ManualStartProcedure {
  // If set to true, the stopwatch will play the "Ready" sound before starting
  // when RaceStartCommand is sent.
  bool sayReady = 1;
}

message CompetitionClassicRaceMode {
  ManualStartProcedure manualStartProcedure = 1;
}

// = Training classic race =
message AutomatedStartProcedure {
  bool sayReady = 1;
  // The duration in milliseconds a startpad has to be pressed before the
  // autostart is executed. Maximum value is 10000, default value is 3000.
  int32 standstillDurationBeforeStart = 2;
  // If set to true, the autostart will be executed even if the race is not in
  // IDLE_CLEAR_TO_START state.
  bool autoReset = 3;
}

message StartProcedure {
  oneof startProcedure {
    ManualStartProcedure manualStartProcedure = 1;
    AutomatedStartProcedure automatedStartProcedure = 2;
  }
}

message LaneSettings {
  reserved 1; // Deprecated "letter"
  // If set to true, the lane won't be usable and won't show up in the UI.
  // Can be used if there is only a single lane in the gym.
  // At least one lane must be enabled. Otherwise, the first lane will be
  // enabled!
  bool disabled = 2;
}

message AbortAfterFalseStart {}
message ContinueAfterFalseStart {
  // This time will be assumed as the reaction time when calculating the final
  // time. Maximum value is 10000, default value is 100.
  uint32 assumedReactionTime = 1;
  // If set to true, there will be no false start tone and the normal tone will
  // continue. Also, the indicator of wildcard lanes will continue as normal.
  bool continueStartSequenceAfterFalseStart = 2;
}

message FalseStartBehaviour {
  oneof behaviour {
    AbortAfterFalseStart abortAfterFalseStart = 1;
    ContinueAfterFalseStart continueAfterFalseStart = 2;
  }
}

message FalseStartSettings {
  FalseStartBehaviour behaviour = 1;
  // The duration in milliseconds the false start sound will be played before it
  // is automatically muted. Maximum value is 60000, default value is 2000.
  uint32 soundDuration = 2;
}

message IndicatorSettings {
  // Software brightness control. Maximum value is 254, default value is 254.
  uint32 brightness = 1;
  // If set to true, the indicator will stop blinkng as soon as the false start
  // sound stops (when a false start exists and race is in FINISHED_MUTED
  // state). Otherwise, it will continue blinking until the race is reset.
  bool turnOffWhenFalseStartSoundIsMuted = 2;

  // If set to true, the indicator will turn off when the race is in IDLE state.
  // Otherwise, it will be red.
  bool turnOffWhenIdle = 3;
}

message TrainingClassicRaceMode {
  StartProcedure startProcedure = 1;
  // The number of lanes cannot be changed by the client.
  repeated LaneSettings lanes = 2;
  FalseStartSettings falseStartSettings = 3;
  IndicatorSettings indicatorSettings = 4;
}

message TrainingStartOnReleaseMode { IndicatorSettings indicatorSettings = 1; }

message StopwatchSettings {
  oneof mode {
    CompetitionClassicRaceMode competitionClassicRaceMode = 1;
    TrainingClassicRaceMode trainingClassicRaceMode = 2;
    TrainingStartOnReleaseMode trainingStartOnReleaseMode = 3;
    // TODO CompetitionRelayMode competitionRelayMode = 4;
    // TODO Competition4SpeedMode competition4SpeedMode = 5;
  }
}

message Settings {
  // if the settings are stored as default in the flash memory.
  bool default = 1;

  // DEPRECATED, just kept for compatibility, use StopwatchSettings instead!
  // Will be ignored when StopwatchSettings is set and converted to
  // StopwatchSettings otherwise.
  // For backwards compatibility, this is always set when reading the settings.
  TrainingClassicRaceMode race = 2 [ deprecated = true ];

  SoundSettings sound = 3;
  StopwatchSettings stopwatchSettings = 4;
  SecuritySettings securitySettings = 5;
}