/*
 * Copyright (C) 2018 The Android Open Source Project
 *
 * 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
 *
 *      http://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 = "proto2";

option optimize_for = LITE_RUNTIME;

// C++ namespace: bluetooth::metrics::BluetoothMetricsProto
package bluetooth.metrics.BluetoothMetricsProto;

option java_package = "com.android.bluetooth";
option java_outer_classname = "BluetoothMetricsProto";

message BluetoothLog {
  // Session information that gets logged for every BT connection.
  repeated BluetoothSession session = 1;

  // Session information that gets logged for every Pair event.
  repeated PairEvent pair_event = 2;

  // Information for Wake locks.
  repeated WakeEvent wake_event = 3;

  // Scan event information.
  repeated ScanEvent scan_event = 4;

  // Number of bonded devices.
  optional int32 num_bonded_devices = 5;

  // Number of BluetoothSession including discarded ones beyond capacity
  optional int64 num_bluetooth_session = 6;

  // Number of PairEvent including discarded ones beyond capacity
  optional int64 num_pair_event = 7;

  // Number of WakeEvent including discarded ones beyond capacity
  optional int64 num_wake_event = 8;

  // Number of ScanEvent including discarded ones beyond capacity
  optional int64 num_scan_event = 9;

  // Statistics about Bluetooth profile connections
  repeated ProfileConnectionStats profile_connection_stats = 10;

  // Statistics about Headset profile connections
  repeated HeadsetProfileConnectionStats headset_profile_connection_stats = 11;
}

// The information about the device.
message DeviceInfo {
  // Device type.
  enum DeviceType {
    // Type is unknown.
    DEVICE_TYPE_UNKNOWN = 0;

    DEVICE_TYPE_BREDR = 1;

    DEVICE_TYPE_LE = 2;

    DEVICE_TYPE_DUMO = 3;
  }

  // Device class
  // https://cs.corp.google.com/#android/system/bt/stack/include/btm_api.h&q=major_computer.
  optional int32 device_class = 1;

  // Device type.
  optional DeviceType device_type = 2;
}

// Information that gets logged for every Bluetooth connection.
message BluetoothSession {
  // Type of technology used in the connection.
  enum ConnectionTechnologyType {
    CONNECTION_TECHNOLOGY_TYPE_UNKNOWN = 0;

    CONNECTION_TECHNOLOGY_TYPE_LE = 1;

    CONNECTION_TECHNOLOGY_TYPE_BREDR = 2;
  }

  enum DisconnectReasonType {
    UNKNOWN = 0;

    // A metrics dump takes a snapshot of current Bluetooth session and thus
    // is not a real disconnect, but a discontinuation in metrics logging.
    // This enum indicates this situation.
    METRICS_DUMP = 1;

    NEXT_START_WITHOUT_END_PREVIOUS = 2;
  }

  // Duration of the session.
  optional int64 session_duration_sec = 2;

  // Technology type.
  optional ConnectionTechnologyType connection_technology_type = 3;

  // Reason for disconnecting.
  optional string disconnect_reason = 4 [deprecated = true];

  // The information about the device which it is connected to.
  optional DeviceInfo device_connected_to = 5;

  // The information about the RFComm session.
  optional RFCommSession rfcomm_session = 6;

  // The information about the A2DP audio session.
  optional A2DPSession a2dp_session = 7;

  // Numeric reason for disconnecting as defined in metrics.h
  optional DisconnectReasonType disconnect_reason_type = 8;
}

message RFCommSession {
  // bytes transmitted.
  optional int32 rx_bytes = 1;

  // bytes transmitted.
  optional int32 tx_bytes = 2;
}

enum A2dpSourceCodec {
  A2DP_SOURCE_CODEC_UNKNOWN = 0;
  A2DP_SOURCE_CODEC_SBC = 1;
  A2DP_SOURCE_CODEC_AAC = 2;
  A2DP_SOURCE_CODEC_APTX = 3;
  A2DP_SOURCE_CODEC_APTX_HD = 4;
  A2DP_SOURCE_CODEC_LDAC = 5;
}

// Session information that gets logged for A2DP session.
message A2DPSession {
  // Media timer in milliseconds.
  optional int32 media_timer_min_millis = 1;

  // Media timer in milliseconds.
  optional int32 media_timer_max_millis = 2;

  // Media timer in milliseconds.
  optional int32 media_timer_avg_millis = 3;

  // Buffer overruns count.
  optional int32 buffer_overruns_max_count = 4;

  // Buffer overruns total.
  optional int32 buffer_overruns_total = 5;

  // Buffer underruns average.
  optional float buffer_underruns_average = 6;

  // Buffer underruns count.
  optional int32 buffer_underruns_count = 7;

  // Total audio time in this A2DP session
  optional int64 audio_duration_millis = 8;

  // Audio codec used in this A2DP session in A2DP source role
  optional A2dpSourceCodec source_codec = 9;

  // Whether A2DP offload is enabled in this A2DP session
  optional bool is_a2dp_offload = 10;
}

message PairEvent {
  // The reason for disconnecting
  // See: system/bt/stack/include/hcidefs.h, HCI_ERR_CONN_FAILED_ESTABLISHMENT
  optional int32 disconnect_reason = 1;

  // Pair event time
  optional int64 event_time_millis =
      2;  // [(datapol.semantic_type) = ST_TIMESTAMP];

  // The information about the device which it is paired to.
  optional DeviceInfo device_paired_with = 3;
}

message WakeEvent {
  // Information about the wake event type.
  enum WakeEventType {
    UNKNOWN = 0;
    // WakeLock was acquired.
    ACQUIRED = 1;
    // WakeLock was released.
    RELEASED = 2;
  }

  // Information about the wake event type.
  optional WakeEventType wake_event_type = 1;

  // Initiator of the scan. Only the first three names will be stored.
  // e.g. com.company.app
  optional string requestor = 2;

  // Name of the wakelock (e.g. bluedroid_timer).
  optional string name = 3;

  // Time of the event.
  optional int64 event_time_millis =
      4;  // [(datapol.semantic_type) = ST_TIMESTAMP];
}

message ScanEvent {
  // Scan type.
  enum ScanTechnologyType {
    SCAN_TYPE_UNKNOWN = 0;

    SCAN_TECH_TYPE_LE = 1;

    SCAN_TECH_TYPE_BREDR = 2;

    SCAN_TECH_TYPE_BOTH = 3;
  }

  // Scan event type.
  enum ScanEventType {
    // Scan started.
    SCAN_EVENT_START = 0;
    // Scan stopped.
    SCAN_EVENT_STOP = 1;
  }

  // Scan event type.
  optional ScanEventType scan_event_type = 1;

  // Initiator of the scan. Only the first three names will be stored.
  // e.g. com.company.app
  optional string initiator = 2;

  // Technology used for scanning.
  optional ScanTechnologyType scan_technology_type = 3;

  // Number of results returned.
  optional int32 number_results = 4;

  // Time of the event.
  optional int64 event_time_millis =
      5;  // [(datapol.semantic_type) = ST_TIMESTAMP];
}

// Profile IDs defined in BluetoothProfile API class
// Values must match API class values
enum ProfileId {
  PROFILE_UNKNOWN = 0;
  HEADSET = 1;
  A2DP = 2;
  HEALTH = 3;
  HID_HOST = 4;
  PAN = 5;
  PBAP = 6;
  GATT = 7;
  GATT_SERVER = 8;
  MAP = 9;
  SAP = 10;
  A2DP_SINK = 11;
  AVRCP_CONTROLLER = 12;
  AVRCP = 13;
  HEADSET_CLIENT = 16;
  PBAP_CLIENT = 17;
  MAP_CLIENT = 18;
  HID_DEVICE = 19;
  OPP = 20;
  HEARING_AID = 21;
}

// Statistics about Bluetooth profile connections
message ProfileConnectionStats {
  // Profile id defined in BluetoothProfile.java
  optional ProfileId profile_id = 1;

  // Number of times that this profile is connected since last metrics dump
  optional int32 num_times_connected = 2;
}

enum HeadsetProfileType {
  HEADSET_PROFILE_UNKNOWN = 0;
  HSP = 1;
  HFP = 2;
}

// Statistics about headset profile connections
message HeadsetProfileConnectionStats {
  // Type of headset profile connected
  optional HeadsetProfileType headset_profile_type = 1;

  // Number of times this type of headset profile is connected
  optional int32 num_times_connected = 2;
}