// Copyright 2018 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// gRPC API exposed by the wilco_dtc daemon. Normally the consumer
// of the API is the wilco_dtc_supportd daemon.

syntax = "proto3";

package diagnostics.grpc_api;

service WilcoDtc {
  // Called when a message is sent by the diagnostics UI extension (hosted by
  // the browser).
  rpc HandleMessageFromUi(HandleMessageFromUiRequest)
      returns (HandleMessageFromUiResponse) {}

  // Called when the wilco_dtc_supportd daemon received EC event.
  rpc HandleEcNotification(HandleEcNotificationRequest)
      returns (HandleEcNotificationResponse) {}

  // Called when the wilco_dtc_supportd daemon received power event from powerd
  // daemon and event of the tracking type occured.
  rpc HandlePowerNotification(HandlePowerNotificationRequest)
      returns (HandlePowerNotificationResponse) {}

  // Called when the wilco_dtc_supportd daemon received new configuration data
  // blob, this happens when the device policy, passing this configuration data
  // blob, gets updated.
  // It is only a notification that the configuration data has been changed.
  // The GetConfigurationData needs to be called to retrieve the actual
  // configuration data.
  // NOTE: calling the GetConfigurationData on every startup is highly
  // recommended to retrieve the up-to-date configuration data.
  rpc HandleConfigurationDataChanged(HandleConfigurationDataChangedRequest)
      returns (HandleConfigurationDataChangedResponse) {}

  // Called when the wilco_dtc_supportd daemon received D-Bus signal from
  // bluetooth daemon that bluetooth data has changed.
  rpc HandleBluetoothDataChanged(HandleBluetoothDataChangedRequest)
      returns (HandleBluetoothDataChangedResponse) {}
}

// Parameters for the HandleMessageFromUi RPC.
message HandleMessageFromUiRequest {
  // Message contents, as sent by the diagnostics UI extension. Should be a
  // valid JSON string.
  string json_message = 1;
}

// Return value of the HandleMessageFromUi RPC.
message HandleMessageFromUiResponse {
  // Response message contents, as sent by the wilco_dtc daemon.
  // When set, should be a valid JSON string.
  string response_json_message = 1;
}

// Parameters for the HandleEcNotification RPC.
message HandleEcNotificationRequest {
  // EC notification type.
  //
  // |type| value is located from 0x0000 to 0xFFFF, i.e. only 16 bits used.
  uint32 type = 1;

  // EC notification payload.
  //
  // Originally, EC driver provides |uint16_t| data array which we encode to
  // |payload| (i.e. |uint8_t| array) using little-endian format.
  // For example, [0x0102, 0x1314, 0x2526] will be represented as
  // [0x02, 0x01, 0x14, 0x13, 0x26, 0x25] payload.
  //
  // |payload| size does not exceed 12 bytes.
  bytes payload = 2;
}

// Return value of the HandleEcNotification RPC.
message HandleEcNotificationResponse {}

// Parameters for the HandlePowerNotification RPC.
message HandlePowerNotificationRequest {
  enum PowerEvent {
    EVENT_UNSET = 0;
    // Energy consuming from external power source has been started.
    AC_INSERT = 1;
    // Energy consuming from external power source has been stopped.
    AC_REMOVE = 2;
    // System has received suspend request.
    OS_SUSPEND = 3;
    // System has completed suspend request.
    OS_RESUME = 4;
  };

  // Must not be |EVENT_UNSET|.
  PowerEvent power_event = 1;
}

// Return value of the HandlePowerNotification RPC.
message HandlePowerNotificationResponse {}

// Parameters for the HandleConfigurationDataChanged RPC.
message HandleConfigurationDataChangedRequest {}

// Return value of the HandleConfigurationDataChanged RPC.
message HandleConfigurationDataChangedResponse {}

// Parameters for the HandleBluetoothDataChanged RPC.
message HandleBluetoothDataChangedRequest {
  // Telemetry data of the bluetooth adapter installed in the system.
  message AdapterData {
    // Non-empty bluetooth adapter name (e.g. hci0).
    string adapter_name = 1;
    // Non-empty bluetooth adapter MAC address.
    string adapter_mac_address = 2;

    enum CarrierStatus {
      STATUS_UNSET = 0;
      STATUS_UP = 1;
      STATUS_DOWN = 2;
    }

    // STATUS_UP/STATUS_DOWN carrier status of the device. Must be distinct from
    // |STATUS_UNSET|.
    CarrierStatus carrier_status = 3;

    // Number of connected devices.
    uint32 connected_devices_count = 4;
  }

  // The data for all bluetooth adapters installed in the system.
  repeated AdapterData adapters = 1;
}

// Return value for the HandleBluetoothDataChanged RPC.
message HandleBluetoothDataChangedResponse {}
