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

library fuchsia.bluetooth.control;

using fuchsia.bluetooth;

// Possible values for the LE Appearance property which describes the external
// appearance of a
// device at a high level.
// (See the Bluetooth assigned-numbers document:
// https://www.bluetooth.com/specifications/gatt/viewer?attributeXmlFile=org.bluetooth.characteristic.gap.appearance.xml)
enum Appearance {
  UNKNOWN = 0;
  PHONE = 64;
  COMPUTER = 128;
  WATCH = 192;
  WATCH_SPORTS = 193;
  CLOCK = 256;
  DISPLAY = 320;
  REMOTE_CONTROL = 384;
  EYE_GLASSES = 448;
  TAG = 512;
  KEYRING = 576;
  MEDIA_PLAYER = 640;
  BARCODE_SCANNER = 704;
  THERMOMETER = 768;
  THERMOMETER_EAR = 769;
  HEART_RATE_SENSOR = 832;
  HEART_RATE_SENSOR_BELT = 833;
  BLOOD_PRESSURE = 896;
  BLOOD_PRESSURE_ARM = 897;
  BLOOD_PRESSURE_WRIST = 898;
  HID = 960;
  HID_KEYBOARD = 961;
  HID_MOUSE = 962;
  HID_JOYSTICK = 963;
  HID_GAMEPAD = 964;
  HID_DIGITIZER_TABLET = 965;
  HID_CARD_READER = 966;
  HID_DIGITAL_PEN = 967;
  HID_BARCODE_SCANNER = 968;
  GLUCOSE_METER = 1024;
  RUNNING_WALKING_SENSOR = 1088;
  RUNNING_WALKING_SENSOR_IN_SHOE = 1089;
  RUNNING_WALKING_SENSOR_ON_SHOE = 1090;
  RUNNING_WALKING_SENSOR_ON_HIP = 1091;
  CYCLING = 1152;
  CYCLING_COMPUTER = 1153;
  CYCLING_SPEED_SENSOR = 1154;
  CYCLING_CADENCE_SENSOR = 1155;
  CYCLING_POWER_SENSOR = 1156;
  CYCLING_SPEED_AND_CADENCE_SENSOR = 1157;
  PULSE_OXIMETER = 3136;
  PULSE_OXIMETER_FINGERTIP = 3137;
  PULSE_OXIMETER_WRIST = 3138;
  WEIGHT_SCALE = 3200;
  PERSONAL_MOBILITY = 3264;
  PERSONAL_MOBILITY_WHEELCHAIR = 3265;
  PERSONAL_MOBILITY_SCOOTER = 3266;
  GLUCOSE_MONITOR = 3328;
  SPORTS_ACTIVITY = 5184;
  SPORTS_ACTIVITY_LOCATION_DISPLAY = 5185;
  SPORTS_ACTIVITY_LOCATION_AND_NAV_DISPLAY = 5186;
  SPORTS_ACTIVITY_LOCATION_POD = 5187;
  SPORTS_ACTIVITY_LOCATION_AND_NAV_POD = 5188;
};

enum TechnologyType {
  LOW_ENERGY = 0;
  CLASSIC = 1;
  DUAL_MODE = 2;
};

// Represents a remote BR/EDR, LE, or dual-mode BR/EDR/LE device.
struct RemoteDevice {
  // Uniquely identifies this device on the current system.
  string identifier;

  // Bluetooth device address that identifies this remote device. Clients
  // should display this field to the user when |name| is not available.
  //
  // NOTE: Clients should use the |identifier| field to distinguish between
  // remote devices instead of using their address.
  string address;

  // The Bluetooth technologies that are supported by this device.
  TechnologyType technology;

  // The name of the remote device if present or known.
  string? name;

  // The LE appearance property. Present if this is a LE device and the
  // appearance information was obtained over advertising and/or GATT.
  Appearance appearance;

  // The most recently obtained advertising signal strength for this device.
  fuchsia.bluetooth.Int8? rssi;

  // The most recently obtained transmission power for this device.
  fuchsia.bluetooth.Int8? tx_power;

  // Whether or not a BR/EDR and/or LE connection exists between the local
  // adapter and this device.
  bool connected;

  // Whether or not a bond exists between the local adapter and this device.
  bool bonded;

  // The list of service UUIDs known to be published on this remote device.
  vector<string> service_uuids;
};
