// Copyright 2023 The Pigweed Authors
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy of
// the License at
//
//     https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations under
// the License.

syntax = "proto3";

package pw.digital_io;

enum DigitalIoState {
  INACTIVE = 0;
  ACTIVE = 1;
}

message DigitalIoEnableRequest {
  // Which line to select.
  uint32 line_index = 1;
  // Whether to enable or disable.
  bool enable = 2;
}

message DigitalIoEnableResponse {}

message DigitalIoSetStateRequest {
  // Which line to select.
  uint32 line_index = 1;
  // Which state to set to.
  DigitalIoState state = 2;
}

message DigitalIoSetStateResponse {}

message DigitalIoGetStateRequest {
  // Which line to select.
  uint32 line_index = 1;
}

message DigitalIoGetStateResponse {
  DigitalIoState state = 1;
}

service DigitalIo {
  rpc Enable(DigitalIoEnableRequest) returns (DigitalIoEnableResponse) {}
  rpc SetState(DigitalIoSetStateRequest) returns (DigitalIoSetStateResponse) {}
  rpc GetState(DigitalIoGetStateRequest) returns (DigitalIoGetStateResponse) {}
}
