| // 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_ |