输入报告阅读器库

input_report_reader 库通过提供一项通常必需的功能(管理和跟踪想要接收报告的上游驱动程序)来帮助实现输入驱动程序。

库中的 InputReportReaderManager 会创建和管理 InputReportReaders,从而实现 fuchsia.input.report.InputReportsReader。该管理器可以将报告发送到所有现有的 InputReportReaders

想要从输入设备读取输入报告的上游驱动程序可以通过调用 CreateReader 方法向 InputReportReaderManager 注册。当收到输入报告(无论是采用 HID 报告的形式,还是通过轮询读取的设备读数等)时,系统会使用 SendReportToAllReaders 方法将报告推送到所有已注册的读取器。然后,系统会将报告转换为 fuchsia_input_report::InputReport。当 InputReportReaderManager 实例被销毁时,所有现有 InputReportReaders 都将被释放。

使用方法

以下步骤演示了如何在输入设备中使用输入报告阅读器库:

  1. 定义一个类,用于保存需要报告的所有数据(此结构体必须声明所需的 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);
    }
    
  2. 实现 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());
    }
    
  3. 在输入设备中,在结构体上声明模板化的 InputReportReaderManager 实例,例如:

    input_report_reader::InputReportReaderManager<MyExampleMouseReport> readers_;
    
  4. 收到报告后,解析报告,使用报告数据填写 MyExampleMouseReport,然后调用 SendReportToAllReaders 方法,例如:

    readers_.SendReportToAllReaders(report);
    
  5. 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) {
         // ...
      }
    }