1// Copyright 2018 The Fuchsia Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include <hid/ambient-light.h>
6#include <hid/descriptor.h>
7
8// clang-format off
9
10#define HID_USAGE_AMBIENT_LIGHT  HID_USAGE16(0x04D1)
11#define HID_USAGE_INFRARED_LIGHT HID_USAGE16(0x04D7)
12#define HID_USAGE_RED_LIGHT      HID_USAGE16(0x04D8)
13#define HID_USAGE_GREEN_LIGHT    HID_USAGE16(0x04D9)
14#define HID_USAGE_BLUE_LIGHT     HID_USAGE16(0x04DA)
15
16static const uint8_t ambient_light_report_desc[] = {
17    HID_USAGE_PAGE(0x20), // Sensor
18    HID_USAGE(0x41), // Ambient Light
19    HID_COLLECTION_APPLICATION,
20
21
22    // Feature reports
23    HID_REPORT_ID(AMBIENT_LIGHT_RPT_ID_FEATURE),
24
25    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE,
26    HID_LOGICAL_MIN(0),
27    HID_LOGICAL_MAX(5),
28    HID_REPORT_SIZE(8),
29    HID_REPORT_COUNT(1),
30    HID_COLLECTION_LOGICAL,
31        HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_NO_EVENTS,
32        HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_ALL_EVENTS,
33        HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_THRESHOLD_EVENTS,
34        HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_NO_EVENTS_WAKE,
35        HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_ALL_EVENTS_WAKE,
36        HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_THRESHOLD_EVENTS_WAKE,
37        HID_FEATURE(HID_Data_Arr_Abs),
38    HID_END_COLLECTION,
39
40    HID_USAGE_SENSOR_PROPERTY_REPORT_INTERVAL,
41    HID_LOGICAL_MIN(0),
42    HID_LOGICAL_MAX32(0x7FFFFFFF),
43    HID_REPORT_SIZE(32),
44    HID_REPORT_COUNT(1),
45    // Default is HID_USAGE_SENSOR_UNITS_MILLISECOND,
46    HID_UNIT_EXPONENT(0),
47    HID_FEATURE(HID_Data_Var_Abs),
48
49    HID_USAGE_SENSOR_DATA(HID_USAGE_AMBIENT_LIGHT, HID_USAGE_SENSOR_DATA_MOD_THRESHOLD_LOW),
50    HID_LOGICAL_MIN(0x00),
51    HID_LOGICAL_MAX32(0xFFFF),
52    HID_REPORT_SIZE(16),
53    HID_REPORT_COUNT(1),
54    HID_USAGE_SENSOR_GENERIC_UNITS_NOT_SPECIFIED, // Explicitly not Lux
55    HID_FEATURE(HID_Data_Var_Abs),
56
57    HID_USAGE_SENSOR_DATA(HID_USAGE_AMBIENT_LIGHT, HID_USAGE_SENSOR_DATA_MOD_THRESHOLD_HIGH),
58    HID_LOGICAL_MIN(0x00),
59    HID_LOGICAL_MAX32(0xFFFF),
60    HID_REPORT_SIZE(16),
61    HID_REPORT_COUNT(1),
62    HID_USAGE_SENSOR_GENERIC_UNITS_NOT_SPECIFIED, // Explicitly not Lux
63    HID_FEATURE(HID_Data_Var_Abs),
64
65
66    // Input reports
67    HID_REPORT_ID(AMBIENT_LIGHT_RPT_ID_INPUT),
68
69    HID_USAGE_SENSOR_STATE,
70    HID_LOGICAL_MIN(0),
71    HID_LOGICAL_MAX(6),
72    HID_REPORT_SIZE(8),
73    HID_REPORT_COUNT(1),
74    HID_COLLECTION_LOGICAL,
75        HID_USAGE_SENSOR_STATE_UNKNOWN,
76        HID_USAGE_SENSOR_STATE_READY,
77        HID_USAGE_SENSOR_STATE_NOT_AVAILABLE,
78        HID_USAGE_SENSOR_STATE_NO_DATA,
79        HID_USAGE_SENSOR_STATE_INITIALIZING,
80        HID_USAGE_SENSOR_STATE_ACCESS_DENIED,
81        HID_USAGE_SENSOR_STATE_ERROR,
82        HID_INPUT(HID_Const_Arr_Abs),
83    HID_END_COLLECTION,
84
85    HID_USAGE_SENSOR_EVENT,
86    HID_LOGICAL_MIN(0),
87    HID_LOGICAL_MAX(16),
88    HID_REPORT_SIZE(8),
89    HID_REPORT_COUNT(1),
90    HID_COLLECTION_LOGICAL,
91        HID_USAGE_SENSOR_EVENT_UNKNOWN,
92        HID_USAGE_SENSOR_EVENT_STATE_CHANGED,
93        HID_USAGE_SENSOR_EVENT_PROPERTY_CHANGED,
94        HID_USAGE_SENSOR_EVENT_DATA_UPDATED,
95        HID_USAGE_SENSOR_EVENT_POLL_RESPONSE,
96        HID_USAGE_SENSOR_EVENT_CHANGE_SENSITIVITY,
97        HID_USAGE_SENSOR_EVENT_MAX_REACHED,
98        HID_USAGE_SENSOR_EVENT_MIN_REACHED,
99        HID_USAGE_SENSOR_EVENT_HIGH_THRESHOLD_CROSS_UPWARD,
100        HID_USAGE_SENSOR_EVENT_HIGH_THRESHOLD_CROSS_DOWNWARD,
101        HID_USAGE_SENSOR_EVENT_LOW_THRESHOLD_CROSS_UPWARD,
102        HID_USAGE_SENSOR_EVENT_LOW_THRESHOLD_CROSS_DOWNWARD,
103        HID_USAGE_SENSOR_EVENT_ZERO_THRESHOLD_CROSS_UPWARD,
104        HID_USAGE_SENSOR_EVENT_ZERO_THRESHOLD_CROSS_DOWNWARD,
105        HID_USAGE_SENSOR_EVENT_PERIOD_EXCEEDED,
106        HID_USAGE_SENSOR_EVENT_FREQUENCY_EXCEEDED,
107        HID_USAGE_SENSOR_EVENT_COMPLEX_TRIGGER,
108        HID_INPUT(HID_Const_Arr_Abs),
109    HID_END_COLLECTION,
110
111    HID_USAGE_AMBIENT_LIGHT,
112    HID_LOGICAL_MIN(0),
113    HID_LOGICAL_MAX32(0xFFFF),
114    HID_REPORT_SIZE(16),
115    HID_REPORT_COUNT(1),
116    HID_USAGE_SENSOR_GENERIC_UNITS_NOT_SPECIFIED, // Explicitly not Lux
117    HID_INPUT(HID_Data_Var_Abs),
118
119    HID_USAGE_RED_LIGHT,
120    HID_LOGICAL_MIN(0),
121    HID_LOGICAL_MAX32(0xFFFF),
122    HID_REPORT_SIZE(16),
123    HID_REPORT_COUNT(1),
124    HID_USAGE_SENSOR_GENERIC_UNITS_NOT_SPECIFIED, // Explicitly not Lux
125    HID_INPUT(HID_Data_Var_Abs),
126
127    HID_USAGE_BLUE_LIGHT,
128    HID_LOGICAL_MIN(0),
129    HID_LOGICAL_MAX32(0xFFFF),
130    HID_REPORT_SIZE(16),
131    HID_REPORT_COUNT(1),
132    HID_USAGE_SENSOR_GENERIC_UNITS_NOT_SPECIFIED, // Explicitly not Lux
133    HID_INPUT(HID_Data_Var_Abs),
134
135    HID_USAGE_GREEN_LIGHT,
136    HID_LOGICAL_MIN(0),
137    HID_LOGICAL_MAX32(0xFFFF),
138    HID_REPORT_SIZE(16),
139    HID_REPORT_COUNT(1),
140    HID_USAGE_SENSOR_GENERIC_UNITS_NOT_SPECIFIED, // Explicitly not Lux
141    HID_INPUT(HID_Data_Var_Abs),
142
143
144    HID_END_COLLECTION,
145};
146// clang-format on
147
148size_t get_ambient_light_report_desc(const uint8_t** buf) {
149    *buf = ambient_light_report_desc;
150    return sizeof(ambient_light_report_desc);
151}
152