syntax = "proto3";

package automotivegradelinux;

service Radio {
  rpc GetFrequency(GetFrequencyRequest) returns (GetFrequencyResponse) {}
  rpc SetFrequency(SetFrequencyRequest) returns (SetFrequencyResponse) {}  

  rpc GetBand(GetBandRequest) returns (GetBandResponse) {}
  rpc SetBand(SetBandRequest) returns (SetBandResponse) {}  

  rpc GetBandSupported(GetBandSupportedRequest) returns (GetBandSupportedResponse) {}
  rpc GetBandParameters(GetBandParametersRequest) returns (GetBandParametersResponse) {}

  rpc GetStereoMode(GetStereoModeRequest) returns (GetStereoModeResponse) {}
  rpc SetStereoMode(SetStereoModeRequest) returns (SetStereoModeResponse) {}  

  rpc Start(StartRequest) returns (StartResponse) {}
  rpc Stop(StopRequest) returns (StopResponse) {}      

  rpc ScanStart(ScanStartRequest) returns (ScanStartResponse) {}
  rpc ScanStop(ScanStopRequest) returns (ScanStopResponse) {}      

  rpc GetRDS(GetRDSRequest) returns (GetRDSResponse) {}

  rpc GetQuality(GetQualityRequest) returns (GetQualityResponse) {}

  rpc SetAlternativeFrequency(SetAlternativeFrequencyRequest) returns (SetAlternativeFrequencyResponse) {}    

  rpc GetStatusEvents(StatusRequest) returns (stream StatusResponse) {}
}

message GetFrequencyRequest {
}

message GetFrequencyResponse {
  uint32 frequency = 1;
}

message SetFrequencyRequest {
  uint32 frequency = 1;
}

message SetFrequencyResponse {
  uint32 frequency = 1;
}

message GetBandRequest {
}

enum Band {
  BAND_UNSPECIFIED = 0;
  BAND_AM = 1;
  BAND_FM = 2;
  BAND_DBS = 3;
}

message GetBandResponse {
  Band band = 1;
}

message SetBandRequest {
  Band band = 1;
}

message SetBandResponse {
  Band band = 1;
}

message GetBandSupportedRequest {
  Band band = 1;
}

message GetBandSupportedResponse {
  bool supported = 1;
}

message GetBandParametersRequest {
  Band band = 1;
}

message GetBandParametersResponse {
  uint32 min = 1;
  uint32 max = 2;
  uint32 step = 3;
}

enum StereoMode {
  STEREO_MODE_UNSPECIFIED = 0;
  STEREO_MODE_MONO = 1;
  STEREO_MODE_STEREO = 2;
}

message GetStereoModeRequest {
}

message GetStereoModeResponse {
  StereoMode mode = 1;
}

message SetStereoModeRequest {
  StereoMode mode = 1;
}

message SetStereoModeResponse {
  StereoMode mode = 1;
}

message StartRequest {
}

message StartResponse {
}

message StopRequest {
}

message StopResponse {
}

enum ScanDirection {
  SCAN_DIRECTION_UNSPECIFIED = 0;
  SCAN_DIRECTION_FORWARD = 1;
  SCAN_DIRECTION_BACKWARD = 2;
}

message ScanStartRequest {
  ScanDirection direction = 1;
}

message ScanStartResponse {
}

message ScanStopRequest {
}

message ScanStopResponse {
}

message GetRDSRequest {
}

// NOTE: This is a placeholder and will be revised!
message GetRDSResponse {
  string name = 1;
  string radio_text = 2;
  string alternatives = 3;
  string minute = 4;
  string hour = 5;
  string day = 6;
  string month = 7;
  string year = 8;
  string pi = 9;
  string pty = 10;
  string ta = 11;
  string tp = 12;
  string ms = 13;
}

message GetQualityRequest {
}

message GetQualityResponse {
}

message SetAlternativeFrequencyRequest {
  uint32 frequency = 1;
}

message SetAlternativeFrequencyResponse {
  uint32 frequency = 1;
}

message StatusRequest {
}

message BandStatus {
  Band band = 1;
}

message FrequencyStatus {
  uint32 frequency = 1;
}

message PlayStatus {
  bool playing = 1;
}

message ScanStatus {
  bool station_found = 1;
}

message StereoStatus {
  StereoMode mode = 1;
}

message StatusResponse {
  oneof status {
    BandStatus band = 1;
    FrequencyStatus frequency = 2;
    PlayStatus play = 3;
    StereoStatus stereo = 4;
    ScanStatus scan = 5;
  }
}