blob: 9870eb78028be5f68dbcecfa753b4f3ef931088b [file] [log] [blame]
// Copyright 2022 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef FUCHSIA_SDK_EXAMPLES_CC_INPUT_SAMPLE_H_
#define FUCHSIA_SDK_EXAMPLES_CC_INPUT_SAMPLE_H_
#include <fidl/fuchsia.device.fs/cpp/wire.h>
#include <fidl/fuchsia.driver.framework/cpp/wire.h>
#include <fidl/fuchsia.input.report/cpp/wire.h>
#include <lib/async/dispatcher.h>
#include <lib/driver2/namespace.h>
#include <lib/driver2/structured_logger.h>
#include <lib/fdf/cpp/dispatcher.h>
#include <lib/input_report_reader/reader.h>
#include <lib/sys/component/llcpp/outgoing_directory.h>
#include <lib/zx/status.h>
#include <memory>
#include <mutex>
namespace input_sample {
struct SampleInputReport {
zx::time event_time;
uint8_t buttons = 0;
int8_t rel_x = 0;
int8_t rel_y = 0;
void ToFidlInputReport(
fidl::WireTableBuilder<::fuchsia_input_report::wire::InputReport>& input_report,
fidl::AnyArena& arena);
};
class InputSampleDriver : public fidl::WireServer<fuchsia_input_report::InputDevice> {
public:
InputSampleDriver(async_dispatcher_t* dispatcher,
fidl::WireSharedClient<fuchsia_driver_framework::Node> node, driver::Namespace ns,
driver::Logger logger)
: dispatcher_(dispatcher),
outgoing_(component::OutgoingDirectory::Create(dispatcher)),
node_(std::move(node)),
ns_(std::move(ns)),
logger_(std::move(logger)) {}
virtual ~InputSampleDriver() = default;
static constexpr const char* Name() { return "input-sample"; }
static zx::status<std::unique_ptr<InputSampleDriver>> Start(
fuchsia_driver_framework::wire::DriverStartArgs& start_args,
fdf::UnownedDispatcher dispatcher,
fidl::WireSharedClient<fuchsia_driver_framework::Node> node, driver::Namespace ns,
driver::Logger logger);
void GetInputReportsReader(GetInputReportsReaderRequestView request,
GetInputReportsReaderCompleter::Sync& completer) override;
void GetDescriptor(GetDescriptorRequestView request,
GetDescriptorCompleter::Sync& completer) override;
void SendOutputReport(SendOutputReportRequestView request,
SendOutputReportCompleter::Sync& completer) override {
completer.ReplyError(ZX_ERR_NOT_SUPPORTED);
}
void GetFeatureReport(GetFeatureReportRequestView request,
GetFeatureReportCompleter::Sync& completer) override {
completer.ReplyError(ZX_ERR_NOT_SUPPORTED);
}
void SetFeatureReport(SetFeatureReportRequestView request,
SetFeatureReportCompleter::Sync& completer) override {
completer.ReplyError(ZX_ERR_NOT_SUPPORTED);
}
void GetInputReport(GetInputReportRequestView request,
GetInputReportCompleter::Sync& completer) override {
completer.ReplyError(ZX_ERR_NOT_SUPPORTED);
}
private:
zx::status<> Run(fidl::ServerEnd<fuchsia_io::Directory> outgoing_dir);
void SendFakeReport();
async_dispatcher_t* const dispatcher_;
component::OutgoingDirectory outgoing_;
fidl::WireSharedClient<fuchsia_driver_framework::Node> node_;
driver::Namespace ns_;
driver::Logger logger_;
fidl::WireClient<fuchsia_device_fs::Exporter> exporter_;
input_report_reader::InputReportReaderManager<SampleInputReport> input_report_readers_;
SampleInputReport report_;
};
} // namespace input_sample
#endif // FUCHSIA_SDK_EXAMPLES_CC_INPUT_SAMPLE_H_