Fork of the espurna firmware for `mhsw` switches
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

160 lines
2.6 KiB

/*
LED MODULE
Copyright (C) 2016-2019 by Xose Pérez <xose dot perez at gmail dot com>
*/
#pragma once
#include "espurna.h"
#include <vector>
constexpr size_t LedsMax { 8ul };
enum class LedMode {
Manual,
WiFi,
Follow,
FollowInverse,
FindMe,
FindMeWiFi,
On,
Off,
Relay,
RelayWiFi
};
enum class LedDelayMode {
Finite,
Infinite,
None
};
struct LedDelay {
LedDelay() = delete;
constexpr LedDelay(unsigned long on_ms, unsigned long off_ms, unsigned char repeats) :
_mode(repeats ? LedDelayMode::Finite : LedDelayMode::Infinite),
_on(microsecondsToClockCycles(on_ms * 1000)),
_off(microsecondsToClockCycles(off_ms * 1000)),
_repeats(repeats)
{}
constexpr LedDelay(unsigned long on_ms, unsigned long off_ms) :
LedDelay(on_ms, off_ms, 0)
{}
LedDelayMode mode() const {
return _mode;
}
unsigned long on() const {
return _on;
}
unsigned long off() const {
return _off;
}
unsigned char repeats() const {
return _repeats;
}
bool repeat() {
if (_repeats) {
--_repeats;
}
return _repeats;
}
private:
LedDelayMode _mode;
unsigned long _on;
unsigned long _off;
unsigned char _repeats;
};
struct LedPattern {
using Delays = std::vector<LedDelay>;
LedPattern() = default;
LedPattern(const Delays& delays);
void start();
void stop();
bool started();
bool ready();
Delays delays;
Delays queue;
unsigned long clock_last;
unsigned long clock_delay;
};
struct led_t {
led_t() = delete;
led_t(unsigned char pin, bool inverse, LedMode mode) :
_pin(pin),
_inverse(inverse),
_mode(mode)
{
init();
}
unsigned char pin() const {
return _pin;
}
LedMode mode() const {
return _mode;
}
void mode(LedMode mode) {
_mode = mode;
}
bool inverse() const {
return _inverse;
}
LedPattern& pattern() {
return _pattern;
}
void init();
void start() {
_pattern.stop();
}
bool started() {
return _pattern.started();
}
void stop() {
_pattern.stop();
}
bool status();
bool status(bool new_status);
bool toggle();
private:
unsigned char _pin;
bool _inverse;
LedMode _mode;
LedPattern _pattern;
};
size_t ledCount();
void ledUpdate(bool do_update);
bool ledStatus(size_t id, bool status);
bool ledStatus(size_t id);
void ledSetup();