// 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;
};
