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) const; }实现
ToFidlInputReport方法,例如:void MyExampleMouseReport::ToFidlInputReport( fidl::WireTableBuilder<::fuchsia_input_report::wire::InputReport>& input_report, fidl::AnyArena& allocator) const { 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) { // ... } }