// Copyright 2022 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.

#include <lib/hid/descriptor.h>
#include <lib/hid/multi-sensor.h>

// clang-format off

#define HID_USAGE_ACCELERATION_X      HID_USAGE16(0x0453)
#define HID_USAGE_ACCELERATION_Y      HID_USAGE16(0x0454)
#define HID_USAGE_ACCELERATION_Z      HID_USAGE16(0x0455)
#define HID_USAGE_ANGULAR_VELOCITY_X  HID_USAGE16(0x0457)
#define HID_USAGE_ANGULAR_VELOCITY_Y  HID_USAGE16(0x0458)
#define HID_USAGE_ANGULAR_VELOCITY_Z  HID_USAGE16(0x0459)
#define HID_USAGE_MAGNETIC_FLUX_X     HID_USAGE16(0x0485)
#define HID_USAGE_MAGNETIC_FLUX_Y     HID_USAGE16(0x0486)
#define HID_USAGE_MAGNETIC_FLUX_Z     HID_USAGE16(0x0487)
#define HID_USAGE_AMBIENT_LIGHT       HID_USAGE16(0x04D1)

static const uint8_t multi_sensor_report_desc[] = {
    HID_USAGE_PAGE(0x20), // Sensor
    HID_USAGE(0x01),      // Sensor
    HID_COLLECTION_APPLICATION,
        HID_REPORT_ID(ACCELEROMETER_RPT_ID_B),
        // Removing physical range for ease of testing
        // HID_PHYSICAL_MIN32(0xfffffffe),
        // HID_PHYSICAL_MAX32(0x2),
        HID_USAGE_PAGE(0x20),  // Sensor
        HID_USAGE(0x73),       // Motion: Accelerometer 3D
        HID_COLLECTION_PHYSICAL,
            HID_USAGE_PAGE(0x20),  // Sensor
            HID_LOGICAL_MIN16(0x8000),
            HID_LOGICAL_MAX16(0x7fff),
            HID_REPORT_SIZE(16),
            HID_REPORT_COUNT(1),
            HID_USAGE_ACCELERATION_X,
            HID_INPUT(HID_Const_Var_Abs),
            HID_USAGE_ACCELERATION_Y,
            HID_INPUT(HID_Const_Var_Abs),
            HID_USAGE_ACCELERATION_Z,
            HID_INPUT(HID_Const_Var_Abs),
        HID_END_COLLECTION,

        HID_REPORT_ID(GYROMETER_RPT_ID),
        // Removing physical range for ease of testing
        // HID_PHYSICAL_MIN32(0xfffffc18),
        // HID_PHYSICAL_MAX32(0x3e8),
        HID_USAGE_PAGE(0x20),  // Sensor
        HID_USAGE(0x76),       // Motion: Gyrometer 3D
        HID_COLLECTION_PHYSICAL,
            HID_USAGE_PAGE(0x20),  // Sensor
            HID_LOGICAL_MIN16(0x8000),
            HID_LOGICAL_MAX16(0x7fff),
            HID_REPORT_SIZE(16),
            HID_REPORT_COUNT(1),
            HID_USAGE_ANGULAR_VELOCITY_X,
            HID_INPUT(HID_Const_Var_Abs),
            HID_USAGE_ANGULAR_VELOCITY_Y,
            HID_INPUT(HID_Const_Var_Abs),
            HID_USAGE_ANGULAR_VELOCITY_Z,
            HID_INPUT(HID_Const_Var_Abs),
        HID_END_COLLECTION,

        HID_REPORT_ID(COMPASS_RPT_ID),
        // Removing physical range for ease of testing
        // HID_PHYSICAL_MIN32(0xffec7800),
        // HID_PHYSICAL_MAX32(0x138800),
        HID_USAGE_PAGE(0x20),  // Sensor
        HID_USAGE(0x83),       // Orientation: Compass 3D
        HID_COLLECTION_PHYSICAL,
            HID_USAGE_PAGE(0x20),  // Sensor
            HID_LOGICAL_MIN16(0x8000),
            HID_LOGICAL_MAX16(0x7fff),
            HID_UNIT_EXPONENT(0xd),
            HID_REPORT_SIZE(16),
            HID_REPORT_COUNT(1),
            HID_USAGE_MAGNETIC_FLUX_X,
            HID_INPUT(HID_Const_Var_Abs),
            HID_USAGE_MAGNETIC_FLUX_Y,
            HID_INPUT(HID_Const_Var_Abs),
            HID_USAGE_MAGNETIC_FLUX_Z,
            HID_INPUT(HID_Const_Var_Abs),
        HID_END_COLLECTION,
    HID_END_COLLECTION,

    HID_USAGE_PAGE(0x20), // Sensor
    HID_USAGE(0x01),      // Sensor
    HID_COLLECTION_APPLICATION,
        HID_REPORT_ID(ACCELEROMETER_RPT_ID_A),
        // Removing physical range for ease of testing
        // HID_PHYSICAL_MIN32(0xfffffffe),
        // HID_PHYSICAL_MAX32(0x2),
        HID_USAGE_PAGE(0x20),  // Sensor
        HID_USAGE(0x73),       // Motion: Accelerometer 3D
        HID_COLLECTION_PHYSICAL,
            HID_USAGE_PAGE(0x20),  // Sensor
            HID_LOGICAL_MIN16(0x8000),
            HID_LOGICAL_MAX16(0x7fff),
            HID_REPORT_SIZE(16),
            HID_REPORT_COUNT(1),
            HID_USAGE_ACCELERATION_X,
            HID_INPUT(HID_Const_Var_Abs),
            HID_USAGE_ACCELERATION_Y,
            HID_INPUT(HID_Const_Var_Abs),
            HID_USAGE_ACCELERATION_Z,
            HID_INPUT(HID_Const_Var_Abs),
        HID_END_COLLECTION,

        HID_REPORT_ID(ILLUMINANCE_RPT_ID),
        // Removing physical range for ease of testing
        // HID_PHYSICAL_MIN32(0),
        // HID_PHYSICAL_MAX32(0x1770),
        HID_USAGE_PAGE(0x20),  // Sensor
        HID_USAGE(0x41),       // Light: Ambient Light
        HID_COLLECTION_PHYSICAL,
            HID_USAGE_PAGE(0x20),  // Sensor
            HID_LOGICAL_MIN(0),
            HID_LOGICAL_MAX16(0x7fff),
            HID_REPORT_SIZE(16),
            HID_REPORT_COUNT(1),
            HID_USAGE_AMBIENT_LIGHT,
            HID_INPUT(HID_Const_Var_Abs),
        HID_END_COLLECTION,
    HID_END_COLLECTION,
};
// clang-format on

size_t get_multi_sensor_report_desc(const uint8_t** buf) {
  *buf = multi_sensor_report_desc;
  return sizeof(multi_sensor_report_desc);
}
