输入报告阅读器库

input_report_reader 库有助于实现 来为输入驱动程序提供以下一项普遍要求的功能:管理和 跟踪希望接收报告的上游驱动程序。

库中的 InputReportReaderManager 会创建和管理 InputReportReaders, 实现 fuchsia.input.report.InputReportsReader。管理员可以 报告给所有现有的 InputReportReaders

希望从输入设备读取输入报告的上游驱动程序可向 InputReportReaderManager:通过调用 CreateReader 方法。收到输入报告时 (无论是以 HID 报告的形式还是通过轮询等方式读取设备数据),报告 使用 SendReportToAllReaders 方法推送给所有注册读者。此报告为 之后翻译成了fuchsia_input_report::InputReportInputReportReaderManager 实例被销毁,所有现有 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) {
         // ...
      }
    }