// // Created by robtor on 10.01.23. // #ifndef FLOATPUMP_RELAYCHANNEL_H #define FLOATPUMP_RELAYCHANNEL_H #include "stm32f4xx_hal.h" namespace floatpump { namespace io { class RelayChannel { public: enum state { ON, OFF }; RelayChannel(GPIO_TypeDef *gpio, uint16_t pin, bool inverted = false, state initial = state::OFF): m_gpio(gpio), m_gpio_pin(pin), m_inverted(inverted) { if(initial == state::ON) switchRelay(state::ON); }; void switchRelay(state st) { uint32_t elapesd = HAL_GetTick() - m_lastTick; if(st == state::ON && m_state == state::OFF && getRemainingCooldown() == 0) { //Check if cooldown expired and enable Relay if true HAL_GPIO_WritePin(m_gpio, m_gpio_pin, (m_inverted) ? GPIO_PIN_RESET : GPIO_PIN_SET); m_state = state::ON; } else if(st == state::OFF && m_state == state::ON) { //Store last tick value when turning off //Always offer turning off! m_lastTick = HAL_GetTick(); HAL_GPIO_WritePin(m_gpio, m_gpio_pin, (m_inverted) ? GPIO_PIN_SET : GPIO_PIN_RESET); m_state = state::OFF; } } void setCooldown(uint16_t ms) { m_cooldown = ms; } uint16_t getRemainingCooldown() { uint32_t elapsed = (HAL_GetTick() - m_lastTick); if(elapsed <= m_cooldown) return m_cooldown - (HAL_GetTick() - m_lastTick); else return 0; } private: GPIO_TypeDef *m_gpio; uint16_t m_gpio_pin; uint16_t m_cooldown = 0; uint32_t m_lastTick = 0; bool m_inverted = false; state m_state = state::OFF; }; } // floatpump } // io #endif //FLOATPUMP_RELAYCHANNEL_H