| // Copyright 2017 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. |
| |
| #pragma once |
| |
| #include <zircon/compiler.h> |
| #include <zircon/types.h> |
| #include <stdbool.h> |
| #include <stdint.h> |
| |
| __BEGIN_CDECLS |
| |
| #define PARADISE_RPT_ID_TOUCH 12 |
| #define PARADISE_RPT_ID_STYLUS 6 |
| |
| #define PARADISE_FINGER_FLAGS_TSWITCH_MASK 0x01 |
| #define PARADISE_FINGER_FLAGS_CONFIDENCE_MASK 0x04 |
| #define paradise_finger_flags_tswitch(b) ((b)&PARADISE_FINGER_FLAGS_TSWITCH_MASK) |
| #define paradise_finger_flags_confidence(b) (!!(((b)&PARADISE_FINGER_FLAGS_CONFIDENCE_MASK) >> 2)) |
| |
| #define PARADISE_X_MAX 10368 |
| #define PARADISE_Y_MAX 6912 |
| |
| typedef struct paradise_finger { |
| uint8_t flags; |
| uint16_t finger_id; |
| |
| uint16_t x; |
| uint16_t y; |
| } __attribute__((packed)) paradise_finger_t; |
| |
| typedef struct paradise_touch { |
| uint8_t rpt_id; |
| uint8_t pad; |
| uint8_t contact_count; |
| |
| paradise_finger_t fingers[5]; |
| uint16_t scan_time; |
| } __attribute__((packed)) paradise_touch_t; |
| |
| typedef struct paradise_finger_v2 { |
| uint8_t flags; |
| uint16_t finger_id; |
| |
| uint8_t width; |
| uint8_t height; |
| |
| uint16_t x; |
| uint16_t y; |
| |
| uint8_t pressure; |
| } __attribute__((packed)) paradise_finger_v2_t; |
| |
| typedef struct paradise_touch_v2 { |
| uint8_t rpt_id; |
| uint8_t pad; |
| uint8_t contact_count; |
| |
| paradise_finger_v2_t fingers[5]; |
| uint16_t scan_time; |
| } __attribute__((packed)) paradise_touch_v2_t; |
| |
| #define PARADISE_STYLUS_STATUS_TSWITCH 0x01 |
| #define PARADISE_STYLUS_STATUS_BARREL 0x02 |
| #define PARADISE_STYLUS_STATUS_ERASER 0x04 |
| #define PARADISE_STYLUS_STATUS_INVERT 0x08 |
| #define PARADISE_STYLUS_STATUS_BARREL2 0x10 |
| #define PARADISE_STYLUS_STATUS_INRANGE 0x20 |
| |
| #define paradise_stylus_status_tswitch(b) (b & PARADISE_STYLUS_STATUS_TSWITCH) |
| #define paradise_stylus_status_barrel(b) (b & PARADISE_STYLUS_STATUS_BARREL) |
| #define paradise_stylus_status_eraser(b) (b & PARADISE_STYLUS_STATUS_ERASER) |
| #define paradise_stylus_status_invert(b) (b & PARADISE_STYLUS_STATUS_INVERT) |
| #define paradise_stylus_status_barrel2(b) (b & PARADISE_STYLUS_STATUS_BARREL2) |
| #define paradise_stylus_status_inrange(b) (b & PARADISE_STYLUS_STATUS_INRANGE) |
| |
| #define PARADISE_STYLUS_X_MAX 25919 |
| #define PARADISE_STYLUS_Y_MAX 17279 |
| |
| typedef struct paradise_stylus { |
| uint8_t rpt_id; |
| uint8_t status; |
| uint16_t x; |
| uint16_t y; |
| uint16_t pressure; |
| uint16_t vendor_defined_ff00_5b; |
| uint32_t tranducer_serial; |
| uint8_t vendor_defined_ff00_00; |
| uint8_t battery_strength; |
| uint8_t x_tilt; |
| uint8_t y_tilt; |
| uint16_t scan_time; |
| } __attribute__((packed)) paradise_stylus_t; |
| |
| const uint8_t* get_paradise_touch_report_desc(size_t* len); |
| bool is_paradise_touch_report_desc(const uint8_t* data, size_t len); |
| |
| const uint8_t* get_paradise_touch_v2_report_desc(size_t* len); |
| bool is_paradise_touch_v2_report_desc(const uint8_t* data, size_t len); |
| |
| const uint8_t* get_paradise_touch_v3_report_desc(size_t* len); |
| bool is_paradise_touch_v3_report_desc(const uint8_t* data, size_t len); |
| |
| zx_status_t setup_paradise_touch(int fd); |
| |
| typedef struct paradise_touchpad_finger_v1 { |
| uint8_t tip_switch : 1; |
| uint8_t in_range : 7; |
| |
| uint16_t id; |
| |
| uint16_t x; |
| uint16_t y; |
| uint16_t width; |
| uint16_t height; |
| uint8_t tip_pressure; |
| } __attribute((packed)) paradise_touchpad_finger_v1_t; |
| |
| typedef struct paradise_touchpad_finger_v2 { |
| uint8_t tip_switch : 1; |
| uint8_t in_range : 7; |
| |
| uint16_t id; |
| |
| uint16_t x; |
| uint16_t y; |
| uint16_t width; |
| uint16_t height; |
| uint8_t tip_pressure; |
| uint16_t azimuth; |
| } __attribute((packed)) paradise_touchpad_finger_v2_t; |
| |
| typedef struct paradise_touchpad_v1 { |
| uint8_t report_id; |
| |
| uint8_t button : 1; |
| uint8_t contact_count : 7; |
| |
| paradise_touchpad_finger_v1_t fingers[5]; |
| } __attribute((packed)) paradise_touchpad_v1_t; |
| |
| typedef struct paradise_touchpad_v2 { |
| uint8_t report_id; |
| |
| uint8_t button : 1; |
| uint8_t contact_count : 7; |
| |
| paradise_touchpad_finger_v2_t fingers[5]; |
| } __attribute((packed)) paradise_touchpad_v2_t; |
| |
| // The following typedef and function are transitional. |
| typedef paradise_touchpad_v2_t paradise_touchpad_t; |
| |
| bool is_paradise_touchpad_report_desc(const uint8_t* data, size_t len); |
| |
| const uint8_t* get_paradise_touchpad_v1_report_desc(size_t* len); |
| bool is_paradise_touchpad_v1_report_desc(const uint8_t* data, size_t len); |
| |
| const uint8_t* get_paradise_touchpad_v2_report_desc(size_t* len); |
| bool is_paradise_touchpad_v2_report_desc(const uint8_t* data, size_t len); |
| |
| zx_status_t setup_paradise_touchpad(int fd); |
| |
| typedef struct paradise_sensor_vector_data { |
| uint8_t sensor_num; |
| int16_t vector[3]; |
| } __attribute__((packed)) paradise_sensor_vector_data_t; |
| |
| typedef struct paradise_sensor_scalar_data { |
| uint8_t sensor_num; |
| uint16_t scalar; |
| } __attribute__((packed)) paradise_sensor_scalar_data_t; |
| |
| const uint8_t* get_paradise_sensor_report_desc(size_t* len); |
| bool is_paradise_sensor_report_desc(const uint8_t* data, size_t len); |
| |
| zx_status_t setup_paradise_sensor(int fd); |
| |
| __END_CDECLS |