Browse Source

relay: share dummypin instance

- no need for smartptr when instance is static
- default ctor, set default values in the body
mcspr-patch-1
Maxim Prokhorov 4 years ago
parent
commit
a453aa1296
1 changed files with 32 additions and 42 deletions
  1. +32
    -42
      code/espurna/relay.cpp

+ 32
- 42
code/espurna/relay.cpp View File

@ -46,60 +46,50 @@ struct DummyPin final : public BasePin {
struct relay_t { struct relay_t {
using pin_type = std::unique_ptr<BasePin>;
using pin_type = BasePin;
// Default to empty relay configuration, as we allow switches to exist without real GPIOs
// Share the same dummy pin between different relays, no need to duplicate
relay_t(pin_type&& pin, unsigned char type, pin_type&& reset_pin) :
pin(std::move(pin)),
reset_pin(std::move(reset_pin)),
type(type),
delay_on(0),
delay_off(0),
pulse(RELAY_PULSE_NONE),
pulse_ms(0),
current_status(false),
target_status(false),
lock(RELAY_LOCK_DISABLED),
fw_start(0),
fw_count(0),
change_start(0),
change_delay(0),
report(false),
group_report(false)
{}
static pin_type* DummyPinInstance;
relay_t() :
relay_t(std::make_unique<DummyPin>(GPIO_NONE), RELAY_TYPE_NORMAL, std::make_unique<DummyPin>(GPIO_NONE))
// Default to empty relay configuration, as we allow switches to exist without real GPIOs
relay_t() = default;
relay_t(pin_type* pin_, unsigned char type_, pin_type* reset_pin_) :
pin(pin_),
reset_pin(reset_pin_),
type(type_)
{} {}
pin_type pin; // GPIO pin for the relay
pin_type reset_pin; // GPIO to reset the relay if RELAY_TYPE_LATCHED
pin_type* pin { DummyPinInstance }; // GPIO pin for the relay
pin_type* reset_pin { DummyPinInstance }; // GPIO to reset the relay if RELAY_TYPE_LATCHED
unsigned char type; // RELAY_TYPE_NORMAL, RELAY_TYPE_INVERSE, RELAY_TYPE_LATCHED or RELAY_TYPE_LATCHED_INVERSE
unsigned long delay_on; // Delay to turn relay ON
unsigned long delay_off; // Delay to turn relay OFF
unsigned char pulse; // RELAY_PULSE_NONE, RELAY_PULSE_OFF or RELAY_PULSE_ON
unsigned long pulse_ms; // Pulse length in millis
unsigned char type { RELAY_TYPE_NORMAL }; // RELAY_TYPE_NORMAL, RELAY_TYPE_INVERSE, RELAY_TYPE_LATCHED or RELAY_TYPE_LATCHED_INVERSE
unsigned long delay_on { 0ul }; // Delay to turn relay ON
unsigned long delay_off { 0ul }; // Delay to turn relay OFF
unsigned char pulse { RELAY_PULSE_NONE }; // RELAY_PULSE_NONE, RELAY_PULSE_OFF or RELAY_PULSE_ON
unsigned long pulse_ms { 0ul }; // Pulse length in millis
// Status variables // Status variables
bool current_status; // Holds the current (physical) status of the relay
bool target_status; // Holds the target status
unsigned char lock; // Holds the value of target status, that cannot be changed afterwards. (0 for false, 1 for true, 2 to disable)
unsigned long fw_start; // Flood window start time
unsigned char fw_count; // Number of changes within the current flood window
unsigned long change_start; // Time when relay was scheduled to change
unsigned long change_delay; // Delay until the next change
bool report; // Whether to report to own topic
bool group_report; // Whether to report to group topic
bool current_status { false }; // Holds the current (physical) status of the relay
bool target_status { false }; // Holds the target status
unsigned char lock { RELAY_LOCK_DISABLED }; // Holds the value of target status, that cannot be changed afterwards. (0 for false, 1 for true, 2 to disable)
unsigned long fw_start { 0ul }; // Flood window start time
unsigned char fw_count { 0u }; // Number of changes within the current flood window
unsigned long change_start { 0ul }; // Time when relay was scheduled to change
unsigned long change_delay { 0ul }; // Delay until the next change
bool report { false }; // Whether to report to own topic
bool group_report { false }; // Whether to report to group topic
// Helping objects
// Helper objects
Ticker pulseTicker; // Holds the pulse back timer
Ticker pulseTicker; // Holds the pulse back timer
}; };
BasePin* relay_t::DummyPinInstance = new DummyPin(GPIO_NONE);
std::vector<relay_t> _relays; std::vector<relay_t> _relays;
bool _relayRecursive = false; bool _relayRecursive = false;
size_t _relayDummy = 0; size_t _relayDummy = 0;
@ -1482,9 +1472,9 @@ void _relaySetupAdhoc() {
} }
_relays.emplace_back( _relays.emplace_back(
std::make_unique<gpio_type>(_relayPin(id)),
new gpio_type(pin),
_relayType(id), _relayType(id),
std::make_unique<gpio_type>(_relayResetPin(id))
new gpio_type(_relayResetPin(id))
); );
} }


Loading…
Cancel
Save