// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include "DriverPWM.hpp" #include "critical.hpp" #if defined(TARGET_RT1051) #include "board/rt1051/drivers/RT1051DriverPWM.hpp" #elif defined(TARGET_Linux) #else #error "Unsupported target" #endif namespace drivers { std::weak_ptr DriverPWM::pwmDrivers[static_cast(PWMInstances::COUNT)] [static_cast(PWMModules::COUNT)]; std::shared_ptr DriverPWM::Create(drivers::PWMInstances instance, drivers::PWMModules module, const drivers::DriverPWMParams ¶ms) { const auto instanceIndex = static_cast(instance) - static_cast(PWMInstances::OFFSET); const auto moduleIndex = static_cast(module); cpp_freertos::CriticalSection::Enter(); std::shared_ptr inst = pwmDrivers[instanceIndex][moduleIndex].lock(); if (!inst) { #if defined(TARGET_RT1051) inst = std::make_shared(instance, module, params); #elif defined(TARGET_Linux) #else #error "Unsupported target" #endif pwmDrivers[instanceIndex][moduleIndex] = inst; } else { inst->InitNextChannel(params); } cpp_freertos::CriticalSection::Exit(); return inst; } } // namespace drivers