// Copyright 2019 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.input.report;

/// A hardcoded number of max sensor values. This should be increased in the future
/// if we ever see a sensor with more values.
const SENSOR_MAX_VALUES uint32 = 100;

/// Each sensor value has a corresponding SensorType, which explains what the
/// value is measuring in the world.
type SensorType = strict enum : uint32 {
    /// Acceleration on the X axis.
    ACCELEROMETER_X = 1;
    /// Acceleration on the Y axis.
    ACCELEROMETER_Y = 2;
    /// Acceleration on the Z axis.
    ACCELEROMETER_Z = 3;
    /// Strength of the Magnetic Field in the X axis.
    MAGNETOMETER_X = 4;
    /// Strength of the Magnetic Field in the Y axis.
    MAGNETOMETER_Y = 5;
    /// Strength of the Magnetic Field in the Z axis.
    MAGNETOMETER_Z = 6;
    /// Angular Velocity in the X direction moving counter-clockwise.
    GYROSCOPE_X = 7;
    /// Angular Velocity in the Y direction moving counter-clockwise.
    GYROSCOPE_Y = 8;
    /// Angular Velocity in the Z direction moving counter-clockwise.
    GYROSCOPE_Z = 9;
    /// Ambient level of Light.
    LIGHT_ILLUMINANCE = 10;
    /// Ambient level of Red Light.
    LIGHT_RED = 11;
    /// Ambient level of Green Light.
    LIGHT_GREEN = 12;
    /// Ambient level of Blue Light.
    LIGHT_BLUE = 13;
};

/// A `SensorAxis` is a normal `Axis` with an additional `SensorType` to describe what the
/// axis is measuring.
type SensorAxis = struct {
    axis Axis;
    type SensorType;
};

/// Describes the format of the input report that will be sent from the sensor
/// to the device.
type SensorInputDescriptor = table {
    /// Each `SensorAxis` in `values` describes what a sensor is measuring and its range.
    /// These will directly correspond to the values in `SensorReport`.
    1: values vector<SensorAxis>:SENSOR_MAX_VALUES;
};

/// `SensorReportingState` determines when a sensor will send reports.
type SensorReportingState = strict enum : uint32 {
    /// No events will be sent from the sensor.
    REPORT_NO_EVENTS = 1;
    /// All events will be sent from the sensor. For most sensors, this
    /// frequency can be set by `report_interval`.
    REPORT_ALL_EVENTS = 2;
    /// Only events that cross a threshold will be reported.
    REPORT_THRESHOLD_EVENTS = 3;
};

/// Describes the format of the sensor's feature report. Feature reports can be
/// requested from the sensor, or sent to the sensor.
type SensorFeatureDescriptor = table {
    /// Describes the minimum and maximum reporting interval this sensor
    /// supports.
    1: report_interval Axis;
    /// If this is true then SensorFeatureReport supports setting a
    /// SensorReportingState.
    3: supports_reporting_state bool;
    /// Sets the sensitivity for the given `SensorType`.
    2: sensitivity vector<SensorAxis>:SENSOR_MAX_VALUES;
    /// Sets the high threshold values for the given `SensorType`.
    4: threshold_high vector<SensorAxis>:SENSOR_MAX_VALUES;
    /// Sets the low threshold values for the given `SensorType`.
    5: threshold_low vector<SensorAxis>:SENSOR_MAX_VALUES;
    /// Describes the minimum and maximum sampling rate this sensor supports.
    6: sampling_rate Axis;
};

/// The capabilities of a sensor device.
type SensorDescriptor = table {
    1: input SensorInputDescriptor;
    2: feature SensorFeatureDescriptor;
};

/// `SensorReport` gives the values measured by a sensor at a given point in time.
type SensorInputReport = table {
    /// The ordering of `values` will always directly correspond to the ordering of
    /// the values in `SensorDescriptor`.
    1: values vector<int64>:SENSOR_MAX_VALUES;
};

/// A SensorFeatureReport describes the features of a given sensor. If a
/// FeatureReport is sent to the Input Device it sets the configuration of the device.
/// If a FeatureReport is requested from the Input Device it shows the device's
/// current configuration.
type SensorFeatureReport = table {
    /// The time between reports sent by the sensor.
    1: report_interval int64;
    /// This determines when the sensor will send reports.
    3: reporting_state SensorReportingState;
    /// The sensitivity for various `SensorType`. This vector must be given in
    /// the order of the descriptor's `sensitivity` vector.
    2: sensitivity vector<int64>:SENSOR_MAX_VALUES;
    /// The high thresholds for various `SensorType`. This vector must be given in
    /// the order of the descriptor's `threshold_high` vector.
    4: threshold_high vector<int64>:SENSOR_MAX_VALUES;
    /// The low thresholds for various `SensorType`. This vector must be given in
    /// the order of the descriptor's `threshold_low` vector.
    5: threshold_low vector<int64>:SENSOR_MAX_VALUES;
    /// The rate at which the sensor is sampled.
    6: sampling_rate int64;
};
