parent
84f45e6045
commit
464a4bf527
@ -0,0 +1,43 @@ |
||||
#include "driver_cache.hpp" |
||||
|
||||
#include <memory> |
||||
#include <mutex> |
||||
|
||||
#include "display.hpp" |
||||
#include "display_init.hpp" |
||||
#include "storage.hpp" |
||||
#include "touchwheel.hpp" |
||||
|
||||
namespace drivers { |
||||
|
||||
DriverCache::DriverCache() : gpios_(std::make_unique<GpioExpander>()) {} |
||||
DriverCache::~DriverCache() {} |
||||
|
||||
auto DriverCache::AcquireGpios() -> GpioExpander* { |
||||
return gpios_.get(); |
||||
} |
||||
|
||||
auto DriverCache::AcquireDac() -> std::shared_ptr<AudioDac> { |
||||
return Acquire(dac_, [&]() -> AudioDac* { |
||||
return AudioDac::create(AcquireGpios()).value_or(nullptr); |
||||
}); |
||||
} |
||||
|
||||
auto DriverCache::AcquireDisplay() -> std::shared_ptr<Display> { |
||||
return Acquire(display_, [&]() -> Display* { |
||||
return Display::create(AcquireGpios(), displays::kST7735R); |
||||
}); |
||||
} |
||||
|
||||
auto DriverCache::AcquireStorage() -> std::shared_ptr<SdStorage> { |
||||
return Acquire(storage_, [&]() -> SdStorage* { |
||||
return SdStorage::create(AcquireGpios()).value_or(nullptr); |
||||
}); |
||||
} |
||||
|
||||
auto DriverCache::AcquireTouchWheel() -> std::shared_ptr<TouchWheel> { |
||||
return Acquire(touchwheel_, |
||||
[&]() -> TouchWheel* { return new TouchWheel(); }); |
||||
} |
||||
|
||||
} // namespace drivers
|
@ -0,0 +1,54 @@ |
||||
#pragma once |
||||
|
||||
#include <memory> |
||||
#include <mutex> |
||||
|
||||
#include "dac.hpp" |
||||
#include "display.hpp" |
||||
#include "gpio_expander.hpp" |
||||
#include "storage.hpp" |
||||
#include "touchwheel.hpp" |
||||
|
||||
namespace drivers { |
||||
|
||||
class DriverCache { |
||||
private: |
||||
std::unique_ptr<GpioExpander> gpios_; |
||||
std::weak_ptr<AudioDac> dac_; |
||||
std::weak_ptr<Display> display_; |
||||
std::weak_ptr<SdStorage> storage_; |
||||
std::weak_ptr<TouchWheel> touchwheel_; |
||||
// TODO(jacqueline): Haptics, samd
|
||||
|
||||
std::mutex mutex_; |
||||
|
||||
template <typename T, typename F> |
||||
auto Acquire(std::weak_ptr<T> ptr, F factory) -> std::shared_ptr<T> { |
||||
std::shared_ptr<T> acquired = ptr.lock(); |
||||
if (acquired) { |
||||
return acquired; |
||||
} |
||||
|
||||
std::lock_guard<std::mutex> 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<AudioDac>; |
||||
auto AcquireDisplay() -> std::shared_ptr<Display>; |
||||
auto AcquireStorage() -> std::shared_ptr<SdStorage>; |
||||
auto AcquireTouchWheel() -> std::shared_ptr<TouchWheel>; |
||||
}; |
||||
|
||||
} // namespace drivers
|
Loading…
Reference in new issue