input_report_reader
库有助于实现
来为输入驱动程序提供以下一项普遍要求的功能:管理和
跟踪希望接收报告的上游驱动程序。
库中的 InputReportReaderManager
会创建和管理 InputReportReaders
,
实现 fuchsia.input.report.InputReportsReader
。管理员可以
报告给所有现有的 InputReportReaders
。
希望从输入设备读取输入报告的上游驱动程序可向
InputReportReaderManager
:通过调用 CreateReader
方法。收到输入报告时
(无论是以 HID 报告的形式还是通过轮询等方式读取设备数据),报告
使用 SendReportToAllReaders
方法推送给所有注册读者。此报告为
之后翻译成了fuchsia_input_report::InputReport
当 InputReportReaderManager
实例被销毁,所有现有 InputReportReaders
都将被释放。
使用方法
以下步骤详细介绍了如何在输入设备上使用输入报告阅读器库:
定义一个类,用于存储需要报告的所有数据(此结构体必须声明 所需的
ToFidlInputReport
方法),例如:struct MyExampleMouseReport { zx::time event_time; int64_t x; int64_t y; void ToFidlInputReport(fidl::WireTableBuilder<::fuchsia_input_report::wire::InputReport>& input_report, fidl::AnyArena& allocator); }
实现
ToFidlInputReport
方法,例如:void MyExampleMouseReport::ToFidlInputReport( fidl::WireTableBuilder<::fuchsia_input_report::wire::InputReport>& input_report, fidl::AnyArena& allocator) { auto mouse_input_rpt = fuchsia_input_report::wire::MouseInputReport::Builder(allocator); mouse_input_rpt.movement_x(x); mouse_input_rpt.movement_y(y); input_report.mouse(mouse_input_rpt.Build()); input_report.event_time(event_time.get()); }
在输入设备中,声明一个模板化的
InputReportReaderManager
实例 您的结构体,例如:input_report_reader::InputReportReaderManager<MyExampleMouseReport> readers_;
收到报告后,解析报告,然后填写
MyExampleMouseReport
,然后调用SendReportToAllReaders
方法,例如:readers_.SendReportToAllReaders(report);
在
fuchsia.input.report.InputDevice.GetInputReportsReader
的实现中, 调用CreateReader
方法,例如:void MyExampleInputDevice::GetInputReportsReader(GetInputReportsReaderRequestView request, GetInputReportsReaderCompleter::Sync& completer) { auto status = readers_.CreateReader(dispatcher_, std::move(request->reader)); if (status != ZX_OK) { // ... } }