#pragma once #include #include #include "dac.hpp" #include "display.hpp" #include "gpio_expander.hpp" #include "storage.hpp" #include "touchwheel.hpp" namespace drivers { class DriverCache { private: std::unique_ptr gpios_; std::weak_ptr dac_; std::weak_ptr display_; std::weak_ptr storage_; std::weak_ptr touchwheel_; // TODO(jacqueline): Haptics, samd std::mutex mutex_; template auto Acquire(std::weak_ptr ptr, F factory) -> std::shared_ptr { std::shared_ptr acquired = ptr.lock(); if (acquired) { return acquired; } std::lock_guard lock(mutex_); acquired = ptr.lock(); if (acquired) { return acquired; } acquired.reset(factory()); ptr = acquired; return acquired; } public: DriverCache(); ~DriverCache(); auto AcquireGpios() -> GpioExpander*; auto AcquireDac() -> std::shared_ptr; auto AcquireDisplay() -> std::shared_ptr; auto AcquireStorage() -> std::shared_ptr; auto AcquireTouchWheel() -> std::shared_ptr; }; } // namespace drivers