M module-bsp/CMakeLists.txt => module-bsp/CMakeLists.txt +3 -0
@@ 23,6 23,9 @@ target_sources(
drivers/pwm/DriverPWM.cpp
drivers/semc/DriverSEMC.cpp
drivers/usdhc/DriverUSDHC.cpp
+
+ PUBLIC
+ hal/temperature_source/TemperatureSource.hpp
)
add_board_subdirectory(board)
M module-bsp/board/linux/CMakeLists.txt => module-bsp/board/linux/CMakeLists.txt +1 -0
@@ 23,6 23,7 @@ target_sources(module-bsp
vibrator/vibrator.cpp
watchdog/software_watchdog.cpp
watchdog/watchdog.cpp
+ hal/temperature_source/TemperatureSource.cpp
${CMAKE_CURRENT_BINARY_DIR}/eink-config.h
)
A module-bsp/board/linux/hal/temperature_source/TemperatureSource.cpp => module-bsp/board/linux/hal/temperature_source/TemperatureSource.cpp +32 -0
@@ 0,0 1,32 @@
+// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
+// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md
+
+#include <module-bsp/hal/temperature_source/TemperatureSource.hpp>
+#include <hal/GenericFactory.hpp>
+
+namespace hal::temperature
+{
+
+ class LinuxTemperatureSource : public AbstractTemperatureSource
+ {
+ public:
+ Result read()
+ {
+ temperature += 1.0;
+ if (temperature > limitUp) {
+ temperature = limitDown;
+ }
+ return temperature;
+ }
+
+ private:
+ static constexpr AbstractTemperatureSource::Temperature limitUp = 10.0;
+ static constexpr AbstractTemperatureSource::Temperature limitDown = -10.0;
+ AbstractTemperatureSource::Temperature temperature{};
+ };
+
+ std::shared_ptr<AbstractTemperatureSource> AbstractTemperatureSource::Factory::create()
+ {
+ return hal::impl::factory<LinuxTemperatureSource, AbstractTemperatureSource>();
+ }
+} // namespace hal::temperature
M module-bsp/board/rt1051/bellpx/CMakeLists.txt => module-bsp/board/rt1051/bellpx/CMakeLists.txt +4 -0
@@ 8,6 8,10 @@ target_include_directories(
target_sources(
module-bsp
+
+ PRIVATE
+ hal/temperature_source/TemperatureSource.cpp
+
PUBLIC
eink-config.h
)
A module-bsp/board/rt1051/bellpx/hal/temperature_source/TemperatureSource.cpp => module-bsp/board/rt1051/bellpx/hal/temperature_source/TemperatureSource.cpp +23 -0
@@ 0,0 1,23 @@
+// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
+// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md
+
+#include <module-bsp/hal/temperature_source/TemperatureSource.hpp>
+#include <hal/GenericFactory.hpp>
+
+namespace hal::temperature
+{
+
+ class RT1051TemperatureSource : public AbstractTemperatureSource
+ {
+ public:
+ Result read() override
+ {
+ return hal::temperature::AbstractTemperatureSource::Result();
+ }
+ };
+
+ std::shared_ptr<AbstractTemperatureSource> AbstractTemperatureSource::Factory::create()
+ {
+ return hal::impl::factory<RT1051TemperatureSource, AbstractTemperatureSource>();
+ }
+} // namespace hal::temperature
A module-bsp/hal/GenericFactory.hpp => module-bsp/hal/GenericFactory.hpp +24 -0
@@ 0,0 1,24 @@
+// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
+// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md
+
+#pragma once
+
+#include <module-os/CriticalSectionGuard.hpp>
+
+#include <memory>
+
+namespace hal::impl
+{
+ template <typename TDerived, typename TInterface, typename... Args>
+ inline std::shared_ptr<TInterface> factory(Args... args)
+ {
+ const auto criticalSection = cpp_freertos::CriticalSectionGuard{};
+ static std::weak_ptr<TDerived> singleton;
+ auto inst = singleton.lock();
+ if (not inst) {
+ inst = std::make_shared<TDerived>(args...);
+ singleton = inst;
+ }
+ return inst;
+ }
+} // namespace hal::impl
M module-bsp/hal/temperature_source/TemperatureSource.hpp => module-bsp/hal/temperature_source/TemperatureSource.hpp +14 -5
@@ 3,15 3,24 @@
#pragma once
+#include <memory>
#include <optional>
-namespace bsp::hal
+namespace hal::temperature
{
- class TemperatureSource
+ class AbstractTemperatureSource
{
public:
- using Temperature = float; ///< Celsius degrees
- using Result = std::optional<Temperature>;
+ struct Factory
+ {
+ static std::shared_ptr<AbstractTemperatureSource> create();
+ };
+
+ virtual ~AbstractTemperatureSource() = default;
+
+ using Temperature = float; ///< Celsius degrees
+ using Result = std::optional<Temperature>;
+
virtual Result read() = 0;
};
-} // namespace bsp::hal
+} // namespace hal::temperature