blob: 0070f5c716daf04e6953576445ee569becf23037 [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_QEMU_EDU_DRIVERS_QEMU_EDU_H_
#define FUCHSIA_SDK_EXAMPLES_CC_QEMU_EDU_DRIVERS_QEMU_EDU_H_
// [START imports]
#include <lib/async/dispatcher.h>
#include <lib/driver2/namespace.h>
#include <lib/driver2/record_cpp.h>
#include <lib/driver2/structured_logger.h>
#include <lib/fdf/cpp/dispatcher.h>
#include <lib/sys/component/llcpp/outgoing_directory.h>
#include <lib/zx/status.h>
// [END imports]
// [START hw_imports]
#include "edu_device.h"
// [END hw_imports]
// [START fidl_imports]
#include <fidl/fuchsia.examples.qemuedu/cpp/wire.h>
// [END fidl_imports]
// [START namespace_start]
namespace qemu_edu {
// [END namespace_start]
// [START fidl_server]
// FIDL server implementation for the `fuchsia.examples.qemuedu/Device` protocol.
class QemuEduServer : public fidl::WireServer<fuchsia_examples_qemuedu::Device> {
public:
explicit QemuEduServer(driver::Namespace& ns, async_dispatcher_t* dispatcher,
std::weak_ptr<edu_device::QemuEduDevice> device)
: device_(std::move(device)) {
auto logger_result = driver::Logger::Create(ns, dispatcher, "qemu-edu");
ZX_ASSERT(logger_result.is_ok());
logger_ = std::move(*logger_result);
}
void ComputeFactorial(ComputeFactorialRequestView request,
ComputeFactorialCompleter::Sync& completer) override;
void LivenessCheck(LivenessCheckRequestView request,
LivenessCheckCompleter::Sync& completer) override;
// This method is called when a server connection is torn down.
void OnUnbound(fidl::UnbindInfo info,
fidl::ServerEnd<fuchsia_examples_qemuedu::Device> server_end) {
if (info.is_peer_closed()) {
FDF_LOG(DEBUG, "Client disconnected");
} else if (!info.is_user_initiated()) {
FDF_LOG(ERROR, "Client connection unbound: %s", info.status_string());
}
}
private:
driver::Logger logger_;
std::weak_ptr<edu_device::QemuEduDevice> device_;
};
// [END fidl_server]
// [START class_header]
class QemuEduDriver {
// [END class_header]
// [START public_main]
public:
QemuEduDriver(async_dispatcher_t* dispatcher,
fidl::WireSharedClient<fuchsia_driver_framework::Node> node, driver::Namespace ns,
driver::Logger logger)
: outgoing_(component::OutgoingDirectory::Create(dispatcher)),
node_(std::move(node)),
ns_(std::move(ns)),
logger_(std::move(logger)) {}
virtual ~QemuEduDriver() = default;
// Report driver name to driver framework
static constexpr const char* Name() { return "qemu-edu"; }
// Start hook called by driver framework
static zx::status<std::unique_ptr<QemuEduDriver>> Start(
fuchsia_driver_framework::wire::DriverStartArgs& start_args,
fdf::UnownedDispatcher dispatcher,
fidl::WireSharedClient<fuchsia_driver_framework::Node> node, driver::Namespace ns,
driver::Logger logger);
// [END public_main]
// [START private_main]
private:
zx::status<> Run(async_dispatcher* dispatcher,
fidl::ServerEnd<fuchsia_io::Directory> outgoing_dir);
// [END private_main]
// [START fields_main]
component::OutgoingDirectory outgoing_;
fidl::WireSharedClient<fuchsia_driver_framework::Node> node_;
driver::Namespace ns_;
driver::Logger logger_;
// [END fields_main]
// [START fields_hw]
std::shared_ptr<edu_device::QemuEduDevice> device_;
// [END fields_hw]
// [START class_footer]
};
// [END class_footer]
// [START namespace_end]
} // namespace qemu_edu
// [END namespace_end]
#endif // FUCHSIA_SDK_EXAMPLES_CC_QEMU_EDU_DRIVERS_QEMU_EDU_H_