| // 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. | |
| #ifndef SRC_UI_INPUT_DRIVERS_VIRTIO_CPP_INPUT_TOUCH_H_ | |
| #define SRC_UI_INPUT_DRIVERS_VIRTIO_CPP_INPUT_TOUCH_H_ | |
| #include <string> | |
| #include "input_device.h" | |
| namespace virtio { | |
| static constexpr int kMaxTouchPoints = 5; | |
| struct TouchReport { | |
| zx::time event_time = zx::time(ZX_TIME_INFINITE_PAST); | |
| struct Contact { | |
| bool exists = false; | |
| int64_t x = 0; | |
| int64_t y = 0; | |
| }; | |
| std::array<Contact, kMaxTouchPoints> contacts = {}; | |
| void ToFidlInputReport( | |
| fidl::WireTableBuilder<::fuchsia_input_report::wire::InputReport>& input_report, | |
| fidl::AnyArena& allocator) const; | |
| }; | |
| // The HidTouch class translates virtio touchscreen events into HID touchscreen events. It does this | |
| // by making the virtio touchscreen appear exactly like a Google Pixelbook (Eve) touchscreen. There | |
| // is no good reason to use the Google Pixelbook (Eve) touchscreen, other than it is a valid, tested | |
| // report descriptor and it was easier to reuse it than building a new report descriptor from | |
| // scratch. | |
| class HidTouch : public HidDevice<TouchReport> { | |
| public: | |
| HidTouch(virtio_input_absinfo_t x_info, virtio_input_absinfo_t y_info, std::string product_name, | |
| std::string serial_number) | |
| : x_info_(x_info), | |
| y_info_(y_info), | |
| product_name_(std::move(product_name)), | |
| serial_number_(std::move(serial_number)) {} | |
| fuchsia_input_report::wire::DeviceDescriptor GetDescriptor(fidl::AnyArena& allocator) override; | |
| void ReceiveEvent(virtio_input_event_t* event) override; | |
| // These numbers are used by the touch descriptor of the Google Pixelbook (Eve) touchscreen. We | |
| // use these physical sizes to emulate a real touch device on the emulator. | |
| static constexpr int64_t kXPhysicalMaxMicrometer = 259200; | |
| static constexpr int64_t kYPhysicalMaxMicrometer = 172800; | |
| private: | |
| virtio_input_absinfo_t x_info_; | |
| virtio_input_absinfo_t y_info_; | |
| // The index of the current finger that the driver is processing. | |
| // Must be [0..kMaxTouchPoints - 1] for a valid finger or -1 when no finger is being processed. | |
| int active_finger_index_ = -1; | |
| std::string product_name_; | |
| std::string serial_number_; | |
| }; | |
| } // namespace virtio | |
| #endif // SRC_UI_INPUT_DRIVERS_VIRTIO_CPP_INPUT_TOUCH_H_ |