input_report_reader
库通过提供一项通常必需的功能(管理和跟踪想要接收报告的上游驱动程序)来帮助实现输入驱动程序。
库中的 InputReportReaderManager
会创建和管理 InputReportReaders
,从而实现 fuchsia.input.report.InputReportsReader
。该管理器可以将报告发送到所有现有的 InputReportReaders
。
想要从输入设备读取输入报告的上游驱动程序可以通过调用 CreateReader
方法向 InputReportReaderManager
注册。当收到输入报告(无论是采用 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) { // ... } }