| // Copyright 2020 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_HID_INPUT_REPORT_INPUT_REPORTS_READER_H_ |
| #define SRC_UI_INPUT_DRIVERS_HID_INPUT_REPORT_INPUT_REPORTS_READER_H_ |
| |
| #include <fuchsia/input/report/llcpp/fidl.h> |
| #include <lib/async-loop/cpp/loop.h> |
| #include <lib/async-loop/default.h> |
| #include <lib/fidl/llcpp/buffer_then_heap_allocator.h> |
| |
| #include <fbl/mutex.h> |
| #include <fbl/ring_buffer.h> |
| |
| #include "src/ui/input/lib/hid-input-report/device.h" |
| |
| namespace hid_input_report_dev { |
| |
| namespace fuchsia_input_report = ::llcpp::fuchsia::input::report; |
| |
| class InputReportsReader; |
| |
| class InputReportBase { |
| public: |
| virtual void RemoveReaderFromList(InputReportsReader* reader) = 0; |
| }; |
| |
| class InputReportsReader : public ::llcpp::fuchsia::input::report::InputReportsReader::Interface { |
| public: |
| // The InputReportBase has to exist for the lifetime of the InputReportsReader. |
| // The pointer to InputReportBase is unowned. |
| // InputReportsReader will be freed by InputReportBase. |
| static std::unique_ptr<InputReportsReader> Create(InputReportBase* base, uint32_t reader_id, |
| async_dispatcher_t* dispatcher, |
| zx::channel req); |
| |
| explicit InputReportsReader(InputReportBase* base, uint32_t reader_id) |
| : reader_id_(reader_id), base_(base) {} |
| |
| void ReceiveReport(const uint8_t* report, size_t report_size, zx_time_t time, |
| hid_input_report::Device* device); |
| |
| // FIDL functions. |
| void ReadInputReports(ReadInputReportsCompleter::Sync& completer) override; |
| |
| private: |
| // This is the static size that is used to allocate this instance's InputReports that |
| // are stored in `reports_data`. This amount of memory is allocated with the driver |
| // when the driver is initialized. If the `InputReports` go over this limit the |
| // rest of the memory will be heap allocated as unique pointers. |
| static constexpr size_t kFidlReportBufferSize = 8192; |
| |
| void SendReportsToWaitingRead() __TA_REQUIRES(readers_lock_); |
| |
| const uint32_t reader_id_; |
| fbl::Mutex readers_lock_; |
| std::optional<InputReportsReader::ReadInputReportsCompleter::Async> waiting_read_ |
| __TA_GUARDED(readers_lock_); |
| std::optional<fidl::ServerBindingRef<llcpp::fuchsia::input::report::InputReportsReader>> binding_ |
| __TA_GUARDED(readers_lock_); |
| fidl::BufferThenHeapAllocator<kFidlReportBufferSize> report_allocator_ |
| __TA_GUARDED(readers_lock_); |
| fbl::RingBuffer<fuchsia_input_report::InputReport, fuchsia_input_report::MAX_DEVICE_REPORT_COUNT> |
| reports_data_ __TA_GUARDED(readers_lock_); |
| |
| InputReportBase* base_; |
| }; |
| |
| } // namespace hid_input_report_dev |
| |
| #endif // SRC_UI_INPUT_DRIVERS_HID_INPUT_REPORT_INPUT_REPORTS_READER_H_ |