Browse Source

relay: refactor inline getSetting into functions

pull/2471/head
Maxim Prokhorov 2 years ago
parent
commit
1522087112
2 changed files with 413 additions and 317 deletions
  1. +413
    -69
      code/espurna/relay.cpp
  2. +0
    -248
      code/espurna/relay_config.h

+ 413
- 69
code/espurna/relay.cpp View File

@ -28,8 +28,248 @@ Copyright (C) 2016-2019 by Xose Pérez <xose dot perez at gmail dot com>
#include "utils.h"
#include "ws.h"
#include "libs/BasePin.h"
#include "relay_config.h"
// -----------------------------------------------------------------------------
namespace relay {
namespace {
namespace build {
constexpr unsigned long saveDelay() {
return RELAY_SAVE_DELAY;
}
constexpr size_t dummyCount() {
return DUMMY_RELAY_COUNT;
}
constexpr int syncMode() {
return RELAY_SYNC;
}
constexpr float floodWindow() {
return RELAY_FLOOD_WINDOW;
}
static_assert(floodWindow() >= 0.0f, "");
constexpr unsigned long floodWindowMs() {
return static_cast<unsigned long>(floodWindow() * 1000.0f);
}
constexpr unsigned long floodChanges() {
return RELAY_FLOOD_CHANGES;
}
constexpr unsigned long interlockDelay() {
return RELAY_DELAY_INTERLOCK;
}
constexpr float pulseTime(size_t index) {
return (
(index == 0) ? RELAY1_PULSE_TIME :
(index == 1) ? RELAY2_PULSE_TIME :
(index == 2) ? RELAY3_PULSE_TIME :
(index == 3) ? RELAY4_PULSE_TIME :
(index == 4) ? RELAY5_PULSE_TIME :
(index == 5) ? RELAY6_PULSE_TIME :
(index == 6) ? RELAY7_PULSE_TIME :
(index == 7) ? RELAY8_PULSE_TIME : RELAY_PULSE_TIME
);
}
static_assert(pulseTime(0) >= 0.0f, "");
static_assert(pulseTime(1) >= 0.0f, "");
static_assert(pulseTime(2) >= 0.0f, "");
static_assert(pulseTime(3) >= 0.0f, "");
static_assert(pulseTime(4) >= 0.0f, "");
static_assert(pulseTime(5) >= 0.0f, "");
static_assert(pulseTime(6) >= 0.0f, "");
static_assert(pulseTime(7) >= 0.0f, "");
constexpr RelayPulse pulseMode(size_t index) {
return (
(index == 0) ? RELAY1_PULSE_MODE :
(index == 1) ? RELAY2_PULSE_MODE :
(index == 2) ? RELAY3_PULSE_MODE :
(index == 3) ? RELAY4_PULSE_MODE :
(index == 4) ? RELAY5_PULSE_MODE :
(index == 5) ? RELAY6_PULSE_MODE :
(index == 6) ? RELAY7_PULSE_MODE :
(index == 7) ? RELAY8_PULSE_MODE : RELAY_PULSE_NONE
);
}
constexpr unsigned long delayOn(size_t index) {
return (
(index == 0) ? RELAY1_DELAY_ON :
(index == 1) ? RELAY2_DELAY_ON :
(index == 2) ? RELAY3_DELAY_ON :
(index == 3) ? RELAY4_DELAY_ON :
(index == 4) ? RELAY5_DELAY_ON :
(index == 5) ? RELAY6_DELAY_ON :
(index == 6) ? RELAY7_DELAY_ON :
(index == 7) ? RELAY8_DELAY_ON : 0ul
);
}
constexpr unsigned long delayOff(size_t index) {
return (
(index == 0) ? RELAY1_DELAY_OFF :
(index == 1) ? RELAY2_DELAY_OFF :
(index == 2) ? RELAY3_DELAY_OFF :
(index == 3) ? RELAY4_DELAY_OFF :
(index == 4) ? RELAY5_DELAY_OFF :
(index == 5) ? RELAY6_DELAY_OFF :
(index == 6) ? RELAY7_DELAY_OFF :
(index == 7) ? RELAY8_DELAY_OFF : 0ul
);
}
constexpr unsigned char pin(size_t index) {
return (
(index == 0) ? RELAY1_PIN :
(index == 1) ? RELAY2_PIN :
(index == 2) ? RELAY3_PIN :
(index == 3) ? RELAY4_PIN :
(index == 4) ? RELAY5_PIN :
(index == 5) ? RELAY6_PIN :
(index == 6) ? RELAY7_PIN :
(index == 7) ? RELAY8_PIN : GPIO_NONE
);
}
constexpr RelayType type(size_t index) {
return (
(index == 0) ? RELAY1_TYPE :
(index == 1) ? RELAY2_TYPE :
(index == 2) ? RELAY3_TYPE :
(index == 3) ? RELAY4_TYPE :
(index == 4) ? RELAY5_TYPE :
(index == 5) ? RELAY6_TYPE :
(index == 6) ? RELAY7_TYPE :
(index == 7) ? RELAY8_TYPE : RELAY_TYPE_NORMAL
);
}
constexpr GpioType pinType(size_t index) {
return (
(index == 0) ? RELAY1_PIN_TYPE :
(index == 1) ? RELAY2_PIN_TYPE :
(index == 2) ? RELAY3_PIN_TYPE :
(index == 3) ? RELAY4_PIN_TYPE :
(index == 4) ? RELAY5_PIN_TYPE :
(index == 5) ? RELAY6_PIN_TYPE :
(index == 6) ? RELAY7_PIN_TYPE :
(index == 7) ? RELAY8_PIN_TYPE : GPIO_TYPE_NONE
);
}
constexpr unsigned char resetPin(size_t index) {
return (
(index == 0) ? RELAY1_RESET_PIN :
(index == 1) ? RELAY2_RESET_PIN :
(index == 2) ? RELAY3_RESET_PIN :
(index == 3) ? RELAY4_RESET_PIN :
(index == 4) ? RELAY5_RESET_PIN :
(index == 5) ? RELAY6_RESET_PIN :
(index == 6) ? RELAY7_RESET_PIN :
(index == 7) ? RELAY8_RESET_PIN : GPIO_NONE
);
}
constexpr int bootMode(size_t index) {
return (
(index == 0) ? RELAY1_BOOT_MODE :
(index == 1) ? RELAY2_BOOT_MODE :
(index == 2) ? RELAY3_BOOT_MODE :
(index == 3) ? RELAY4_BOOT_MODE :
(index == 4) ? RELAY5_BOOT_MODE :
(index == 5) ? RELAY6_BOOT_MODE :
(index == 6) ? RELAY7_BOOT_MODE :
(index == 7) ? RELAY8_BOOT_MODE : RELAY_BOOT_OFF
);
}
constexpr RelayProvider provider(size_t index) {
return (
(index == 0) ? (RELAY1_PROVIDER) :
(index == 1) ? (RELAY2_PROVIDER) :
(index == 2) ? (RELAY3_PROVIDER) :
(index == 3) ? (RELAY4_PROVIDER) :
(index == 4) ? (RELAY5_PROVIDER) :
(index == 5) ? (RELAY6_PROVIDER) :
(index == 6) ? (RELAY7_PROVIDER) :
(index == 7) ? (RELAY8_PROVIDER) : RELAY_PROVIDER_NONE
);
}
constexpr RelayMqttTopicMode mqttTopicMode(size_t index) {
return (
(index == 0) ? (RELAY1_MQTT_TOPIC_MODE) :
(index == 1) ? (RELAY2_MQTT_TOPIC_MODE) :
(index == 2) ? (RELAY3_MQTT_TOPIC_MODE) :
(index == 3) ? (RELAY4_MQTT_TOPIC_MODE) :
(index == 4) ? (RELAY5_MQTT_TOPIC_MODE) :
(index == 5) ? (RELAY6_MQTT_TOPIC_MODE) :
(index == 6) ? (RELAY7_MQTT_TOPIC_MODE) :
(index == 7) ? (RELAY8_MQTT_TOPIC_MODE) : RELAY_MQTT_TOPIC_MODE
);
}
const __FlashStringHelper* payloadOn() {
return F(RELAY_MQTT_ON);
}
const __FlashStringHelper* payloadOff() {
return F(RELAY_MQTT_OFF);
}
const __FlashStringHelper* payloadToggle() {
return F(RELAY_MQTT_TOGGLE);
}
constexpr const char* mqttTopicSub(size_t index) {
return (
(index == 0) ? (RELAY1_MQTT_TOPIC_SUB) :
(index == 1) ? (RELAY2_MQTT_TOPIC_SUB) :
(index == 2) ? (RELAY3_MQTT_TOPIC_SUB) :
(index == 3) ? (RELAY4_MQTT_TOPIC_SUB) :
(index == 4) ? (RELAY5_MQTT_TOPIC_SUB) :
(index == 5) ? (RELAY6_MQTT_TOPIC_SUB) :
(index == 6) ? (RELAY7_MQTT_TOPIC_SUB) :
(index == 7) ? (RELAY8_MQTT_TOPIC_SUB) : ""
);
}
constexpr const char* mqttTopicPub(size_t index) {
return (
(index == 0) ? (RELAY1_MQTT_TOPIC_PUB) :
(index == 1) ? (RELAY2_MQTT_TOPIC_PUB) :
(index == 2) ? (RELAY3_MQTT_TOPIC_PUB) :
(index == 3) ? (RELAY4_MQTT_TOPIC_PUB) :
(index == 4) ? (RELAY5_MQTT_TOPIC_PUB) :
(index == 5) ? (RELAY6_MQTT_TOPIC_PUB) :
(index == 6) ? (RELAY7_MQTT_TOPIC_PUB) :
(index == 7) ? (RELAY8_MQTT_TOPIC_PUB) : ""
);
}
constexpr PayloadStatus mqttDisconnectionStatus(size_t index) {
return (
(index == 0) ? (RELAY1_MQTT_DISCONNECT_STATUS) :
(index == 1) ? (RELAY2_MQTT_DISCONNECT_STATUS) :
(index == 2) ? (RELAY3_MQTT_DISCONNECT_STATUS) :
(index == 3) ? (RELAY4_MQTT_DISCONNECT_STATUS) :
(index == 4) ? (RELAY5_MQTT_DISCONNECT_STATUS) :
(index == 5) ? (RELAY6_MQTT_DISCONNECT_STATUS) :
(index == 6) ? (RELAY7_MQTT_DISCONNECT_STATUS) :
(index == 7) ? (RELAY8_MQTT_DISCONNECT_STATUS) : RELAY_MQTT_DISCONNECT_NONE
);
}
} // namespace build
} // namespace
} // namespace relay
namespace {
@ -205,6 +445,129 @@ String serialize(RelayMaskHelper mask) {
} // namespace internal
} // namespace settings
namespace relay {
namespace {
namespace settings {
String name(size_t index) {
return getSetting({"relayName", index});
}
RelayProvider provider(size_t index) {
return getSetting({"relayProv", index}, build::provider(index));
}
RelayType type(size_t index) {
return getSetting({"relayType", index}, build::type(index));
}
GpioType pinType(size_t index) {
return getSetting({"relayGpioType", index}, build::pinType(index));
}
unsigned char pin(size_t index) {
return getSetting({"relayGpio", index}, build::pin(index));
}
unsigned char resetPin(size_t index) {
return getSetting({"relayResetGpio", index}, build::resetPin(index));
}
int bootMode(size_t index) {
return getSetting({"relayBoot", index}, build::bootMode(index));
}
RelayMaskHelper bootMask() {
static RelayMaskHelper defaultMask;
return getSetting("relayBootMask", defaultMask);
}
void bootMask(const String& mask) {
setSetting("relayBootMask", mask);
}
void bootMask(const RelayMaskHelper& mask) {
bootMask(::settings::internal::serialize(mask));
}
RelayPulse pulseMode(size_t index) {
return getSetting({"relayPulse", index}, build::pulseMode(index));
}
// TODO: stronger type for time, time as ms, delays, etc.
float pulseTime(size_t index) {
return getSetting({"relayTime", index}, build::pulseTime(index));
}
unsigned long pulseTimeMs(size_t index) {
return static_cast<unsigned long>(1000.0f * pulseTime(index));
}
unsigned long delayOn(size_t index) {
return getSetting({"relayDelayOn", index}, build::delayOn(index));
}
unsigned long delayOff(size_t index) {
return getSetting({"relayDelayOff", index}, build::delayOff(index));
}
float floodWindow() {
return getSetting("relayFloodTime", build::floodWindow());
}
unsigned long floodWindowMs() {
return 1000.0f * floodWindow();
}
unsigned long floodChanges() {
return getSetting("relayFloodChanges", build::floodChanges());
}
unsigned long interlockDelay() {
return getSetting("relayIlkDelay", build::interlockDelay());
}
int syncMode() {
return getSetting("relaySync", build::syncMode());
}
String payloadOn() {
return getSetting("relayPayloadOn", build::payloadOn());
}
String payloadOff() {
return getSetting("relayPayloadOff", build::payloadOff());
}
String payloadToggle() {
return getSetting("relayPayloadToggle", build::payloadToggle());
}
String mqttTopicSub(size_t index) {
return getSetting({"relayTopicSub", index}, build::mqttTopicSub(index));
}
String mqttTopicPub(size_t index) {
return getSetting({"relayTopicPub", index}, build::mqttTopicPub(index));
}
RelayMqttTopicMode mqttTopicMode(size_t index) {
return getSetting({"relayTopicMode", index}, build::mqttTopicMode(index));
}
PayloadStatus mqttDisconnectionStatus(size_t index) {
return getSetting({"relayMqttDisc", index}, build::mqttDisconnectionStatus(index));
}
size_t dummyCount() {
return getSetting("relayDummy", build::dummyCount());
}
} // namespace settings
} // namespace
} // namespace relay
// -----------------------------------------------------------------------------
// RELAY CONTROL
// -----------------------------------------------------------------------------
@ -297,9 +660,9 @@ void _relayWsReport() {
#if MQTT_SUPPORT || API_SUPPORT
String _relay_rpc_payload_on;
String _relay_rpc_payload_off;
String _relay_rpc_payload_toggle;
String _relay_payload_on;
String _relay_payload_off;
String _relay_payload_toggle;
#endif // MQTT_SUPPORT || API_SUPPORT
@ -762,19 +1125,6 @@ inline void _relayMaskRtcmem(const RelayMaskHelper& mask) {
_relayMaskRtcmem(mask.toUnsigned());
}
RelayMaskHelper _relayMaskSettings() {
static RelayMaskHelper defaultMask;
return getSetting("relayBootMask", defaultMask);
}
void _relayMaskSettings(const String& mask) {
setSetting("relayBootMask", mask);
}
inline void _relayMaskSettings(const RelayMaskHelper& mask) {
_relayMaskSettings(settings::internal::serialize(mask));
}
} // namespace
// Pulse timers (timer after ON or OFF event)
@ -813,8 +1163,8 @@ void relayPulse(size_t id) {
if ((mode == RelayPulse::On) != relay.current_status) {
relay.pulseTicker->once_ms(ms, relayToggle, id);
// Reconfigure after dynamic pulse
relay.pulse = getSetting({"relayPulse", id},relay::build::pulseMode(id));
relay.pulse_ms = static_cast<unsigned long>(1000.0f * getSetting({"relayTime", id}, relay::build::pulseTime(id)));
relay.pulse = relay::settings::pulseMode(id);
relay.pulse_ms = relay::settings::pulseTimeMs(id);
DEBUG_MSG_P(PSTR("[RELAY] Scheduling relay #%u back in %lums (pulse)\n"), id, ms);
}
@ -1009,7 +1359,7 @@ void relaySave(bool persist) {
// Nevertheless, we store the value in the EEPROM buffer so it will be written
// on the next commit.
if (persist) {
_relayMaskSettings(mask);
relay::settings::bootMask(mask);
eepromCommit(); // TODO: should this respect settings auto-save?
}
}
@ -1039,11 +1389,11 @@ size_t relayCount() {
PayloadStatus relayParsePayload(const char * payload) {
#if MQTT_SUPPORT || API_SUPPORT
return rpcParsePayload(payload, [](const char* payload) {
if (_relay_rpc_payload_off.equals(payload)) {
if (_relay_payload_off.equals(payload)) {
return PayloadStatus::Off;
} else if (_relay_rpc_payload_on.equals(payload)) {
} else if (_relay_payload_on.equals(payload)) {
return PayloadStatus::On;
} else if (_relay_rpc_payload_toggle.equals(payload)) {
} else if (_relay_payload_toggle.equals(payload)) {
return PayloadStatus::Toggle;
}
@ -1094,12 +1444,10 @@ void _relaySettingsMigrate(int version) {
}
void _relayBoot(size_t index, const RelayMaskHelper& mask) {
const auto boot_mode = getSetting({"relayBoot", index}, relay::build::bootMode(index));
auto status = false;
auto lock = RelayLock::None;
switch (boot_mode) {
switch (relay::settings::bootMode(index)) {
case RELAY_BOOT_SAME:
status = mask[index];
break;
@ -1139,7 +1487,7 @@ void _relayBoot(size_t index, const RelayMaskHelper& mask) {
void _relayBootAll() {
auto mask = rtcmemStatus()
? _relayMaskRtcmem()
: _relayMaskSettings();
: relay::settings::bootMask();
bool log { false };
@ -1162,26 +1510,24 @@ void _relayBootAll() {
void _relayConfigure() {
auto relays = _relays.size();
for (decltype(relays) id = 0; id < relays; ++id) {
_relays[id].pulse = getSetting({"relayPulse", id}, relay::build::pulseMode(id));
_relays[id].pulse_ms = static_cast<unsigned long>(1000.0f * getSetting({"relayTime", id}, relay::build::pulseTime(id)));
_relays[id].pulse = relay::settings::pulseMode(id);
_relays[id].pulse_ms = relay::settings::pulseTimeMs(id);
_relays[id].delay_on = getSetting({"relayDelayOn", id}, relay::build::delayOn(id));
_relays[id].delay_off = getSetting({"relayDelayOff", id}, relay::build::delayOff(id));
_relays[id].delay_on = relay::settings::delayOn(id);
_relays[id].delay_off = relay::settings::delayOff(id);
}
_relay_flood_window = (1000.0f * getSetting("relayFloodTime", relay::build::floodWindow()));
_relay_flood_changes = getSetting("relayFloodChanges", relay::build::floodChanges());
_relay_flood_window = relay::settings::floodWindowMs();
_relay_flood_changes = relay::settings::floodChanges();
_relay_delay_interlock = getSetting("relayIlkDelay", relay::build::interlockDelay());
_relay_sync_mode = getSetting("relaySync", relay::build::syncMode());
_relay_delay_interlock = relay::settings::interlockDelay();
_relay_sync_mode = relay::settings::syncMode();
#if MQTT_SUPPORT || API_SUPPORT
settingsProcessConfig({
{_relay_rpc_payload_on, "relayPayloadOn", relay::build::mqttPayloadOn()},
{_relay_rpc_payload_off, "relayPayloadOff", relay::build::mqttPayloadOff()},
{_relay_rpc_payload_toggle, "relayPayloadToggle", relay::build::mqttPayloadToggle()},
});
#endif // MQTT_SUPPORT
#if MQTT_SUPPORT || API_SUPPORT
_relay_payload_on = relay::settings::payloadOn();
_relay_payload_off = relay::settings::payloadOff();
_relay_payload_toggle = relay::settings::payloadToggle();
#endif // MQTT_SUPPORT
}
} // namespace
@ -1220,17 +1566,15 @@ void _relayWebSocketUpdate(JsonObject& root) {
void _relayWebSocketRelayConfig(JsonArray& relay, size_t id) {
relay.add(_relays[id].provider->id());
relay.add(static_cast<uint8_t>(getSetting({"relayProv", id}, relay::build::provider(id))));
relay.add(getSetting({"relayName", id}));
relay.add(getSetting({"relayBoot", id}, relay::build::bootMode(id)));
relay.add(static_cast<uint8_t>(relay::settings::provider(id)));
relay.add(relay::settings::name(id));
relay.add(relay::settings::bootMode(id));
#if MQTT_SUPPORT
relay.add(getSetting({"relayTopicSub", id}, relay::build::mqttTopicSub(id)));
relay.add(getSetting({"relayTopicPub", id}, relay::build::mqttTopicPub(id)));
relay.add(static_cast<uint8_t>(getSetting({"relayTopicMode", id},
relay::build::mqttTopicMode(id))));
relay.add(static_cast<uint8_t>(getSetting({"relayMqttDisc", id},
relay::build::mqttDisconnectionStatus(id))));
relay.add(relay::settings::mqttTopicSub(id));
relay.add(relay::settings::mqttTopicPub(id));
relay.add(static_cast<uint8_t>(relay::settings::mqttTopicMode(id)));
relay.add(static_cast<uint8_t>(relay::settings::mqttDisconnectionStatus(id)));
#endif
relay.add(static_cast<uint8_t>(_relays[id].pulse));
@ -1279,8 +1623,8 @@ void _relayWebSocketOnVisible(JsonObject& root) {
if (relayCount() > 1) {
root["multirelayVisible"] = 1;
root["relaySync"] = static_cast<uint8_t>(getSetting("relaySync", relay::build::syncMode()));
root["relayIlkDelay"] = getSetting("relayIlkDelay", relay::build::interlockDelay());
root["relaySync"] = relay::settings::syncMode();
root["relayIlkDelay"] = relay::settings::interlockDelay();
}
root["relayVisible"] = 1;
@ -1390,25 +1734,25 @@ void relaySetupAPI() {
#if MQTT_SUPPORT || API_SUPPORT
const String& relayPayloadOn() {
return _relay_rpc_payload_on;
return _relay_payload_on;
}
const String& relayPayloadOff() {
return _relay_rpc_payload_off;
return _relay_payload_off;
}
const String& relayPayloadToggle() {
return _relay_rpc_payload_toggle;
return _relay_payload_toggle;
}
const char* relayPayload(PayloadStatus status) {
switch (status) {
case PayloadStatus::Off:
return _relay_rpc_payload_off.c_str();
return _relay_payload_off.c_str();
case PayloadStatus::On:
return _relay_rpc_payload_on.c_str();
return _relay_payload_on.c_str();
case PayloadStatus::Toggle:
return _relay_rpc_payload_toggle.c_str();
return _relay_payload_toggle.c_str();
case PayloadStatus::Unknown:
break;
}
@ -1582,14 +1926,14 @@ void _relayMqttSubscribeCustomTopics() {
}
void _relayMqttPublishCustomTopic(size_t id) {
const String topic = getSetting({"relayTopicPub", id}, relay::build::mqttTopicPub(id));
const String topic = relay::settings::mqttTopicPub(id);
if (!topic.length()) {
return;
}
auto status = _relayPayloadStatus(id);
auto mode = getSetting({"relayTopicMode", id}, relay::build::mqttTopicMode(id));
auto mode = relay::settings::mqttTopicMode(id);
if (mode == RelayMqttTopicMode::Inverse) {
status = _relayInvertStatus(status);
}
@ -1882,7 +2226,7 @@ void _relayProcess(bool mode) {
relayPulse(id);
{
const auto boot_mode = getSetting({"relayBoot", id}, relay::build::bootMode(id));
const auto boot_mode = relay::settings::bootMode(id);
_relay_save_timer.once_ms(relay::build::saveDelay(), relaySave,
(RELAY_BOOT_SAME == boot_mode) || (RELAY_BOOT_TOGGLE == boot_mode));
}
@ -1988,9 +2332,9 @@ struct RelayGpioProviderCfg {
RelayGpioProviderCfg _relayGpioProviderCfg(size_t index) {
return {
gpioBase(getSetting({"relayGpioType", index}, relay::build::pinType(index))),
getSetting({"relayGpio", index}, relay::build::pin(index)),
getSetting({"relayResetGpio", index}, relay::build::resetPin(index))};
gpioBase(relay::settings::pinType(index)),
relay::settings::pin(index),
relay::settings::resetPin(index)};
}
std::unique_ptr<GpioProvider> _relayGpioProvider(size_t index, RelayType type) {
@ -2010,8 +2354,8 @@ std::unique_ptr<GpioProvider> _relayGpioProvider(size_t index, RelayType type) {
}
RelayProviderBasePtr _relaySetupProvider(size_t index) {
auto provider = getSetting({"relayProv", index}, relay::build::provider(index));
auto type = getSetting({"relayType", index}, relay::build::type(index));
auto provider = relay::settings::provider(index);
auto type = relay::settings::type(index);
RelayProviderBasePtr result;
@ -2054,7 +2398,7 @@ void _relaySetup() {
_relays.emplace_back(std::move(impl));
}
relaySetupDummy(getSetting("relayDummy", relay::build::dummyCount()));
relaySetupDummy(relay::settings::dummyCount());
}
} // namespace


+ 0
- 248
code/espurna/relay_config.h View File

@ -1,248 +0,0 @@
/*
RELAY MODULE
*/
#pragma once
#include "espurna.h"
namespace relay {
namespace build {
constexpr unsigned long saveDelay() {
return RELAY_SAVE_DELAY;
}
constexpr size_t dummyCount() {
return DUMMY_RELAY_COUNT;
}
constexpr int syncMode() {
return RELAY_SYNC;
}
constexpr float floodWindow() {
return RELAY_FLOOD_WINDOW;
}
static_assert(floodWindow() >= 0.0f, "");
constexpr unsigned long floodWindowMs() {
return static_cast<unsigned long>(floodWindow() * 1000.0f);
}
constexpr unsigned long floodChanges() {
return RELAY_FLOOD_CHANGES;
}
constexpr unsigned long interlockDelay() {
return RELAY_DELAY_INTERLOCK;
}
constexpr float pulseTime(size_t index) {
return (
(index == 0) ? RELAY1_PULSE_TIME :
(index == 1) ? RELAY2_PULSE_TIME :
(index == 2) ? RELAY3_PULSE_TIME :
(index == 3) ? RELAY4_PULSE_TIME :
(index == 4) ? RELAY5_PULSE_TIME :
(index == 5) ? RELAY6_PULSE_TIME :
(index == 6) ? RELAY7_PULSE_TIME :
(index == 7) ? RELAY8_PULSE_TIME : RELAY_PULSE_TIME
);
}
static_assert(pulseTime(0) >= 0.0f, "");
static_assert(pulseTime(1) >= 0.0f, "");
static_assert(pulseTime(2) >= 0.0f, "");
static_assert(pulseTime(3) >= 0.0f, "");
static_assert(pulseTime(4) >= 0.0f, "");
static_assert(pulseTime(5) >= 0.0f, "");
static_assert(pulseTime(6) >= 0.0f, "");
static_assert(pulseTime(7) >= 0.0f, "");
constexpr RelayPulse pulseMode(size_t index) {
return (
(index == 0) ? RELAY1_PULSE_MODE :
(index == 1) ? RELAY2_PULSE_MODE :
(index == 2) ? RELAY3_PULSE_MODE :
(index == 3) ? RELAY4_PULSE_MODE :
(index == 4) ? RELAY5_PULSE_MODE :
(index == 5) ? RELAY6_PULSE_MODE :
(index == 6) ? RELAY7_PULSE_MODE :
(index == 7) ? RELAY8_PULSE_MODE : RELAY_PULSE_NONE
);
}
constexpr unsigned long delayOn(size_t index) {
return (
(index == 0) ? RELAY1_DELAY_ON :
(index == 1) ? RELAY2_DELAY_ON :
(index == 2) ? RELAY3_DELAY_ON :
(index == 3) ? RELAY4_DELAY_ON :
(index == 4) ? RELAY5_DELAY_ON :
(index == 5) ? RELAY6_DELAY_ON :
(index == 6) ? RELAY7_DELAY_ON :
(index == 7) ? RELAY8_DELAY_ON : 0ul
);
}
constexpr unsigned long delayOff(size_t index) {
return (
(index == 0) ? RELAY1_DELAY_OFF :
(index == 1) ? RELAY2_DELAY_OFF :
(index == 2) ? RELAY3_DELAY_OFF :
(index == 3) ? RELAY4_DELAY_OFF :
(index == 4) ? RELAY5_DELAY_OFF :
(index == 5) ? RELAY6_DELAY_OFF :
(index == 6) ? RELAY7_DELAY_OFF :
(index == 7) ? RELAY8_DELAY_OFF : 0ul
);
}
constexpr unsigned char pin(size_t index) {
return (
(index == 0) ? RELAY1_PIN :
(index == 1) ? RELAY2_PIN :
(index == 2) ? RELAY3_PIN :
(index == 3) ? RELAY4_PIN :
(index == 4) ? RELAY5_PIN :
(index == 5) ? RELAY6_PIN :
(index == 6) ? RELAY7_PIN :
(index == 7) ? RELAY8_PIN : GPIO_NONE
);
}
constexpr RelayType type(size_t index) {
return (
(index == 0) ? RELAY1_TYPE :
(index == 1) ? RELAY2_TYPE :
(index == 2) ? RELAY3_TYPE :
(index == 3) ? RELAY4_TYPE :
(index == 4) ? RELAY5_TYPE :
(index == 5) ? RELAY6_TYPE :
(index == 6) ? RELAY7_TYPE :
(index == 7) ? RELAY8_TYPE : RELAY_TYPE_NORMAL
);
}
constexpr GpioType pinType(size_t index) {
return (
(index == 0) ? RELAY1_PIN_TYPE :
(index == 1) ? RELAY2_PIN_TYPE :
(index == 2) ? RELAY3_PIN_TYPE :
(index == 3) ? RELAY4_PIN_TYPE :
(index == 4) ? RELAY5_PIN_TYPE :
(index == 5) ? RELAY6_PIN_TYPE :
(index == 6) ? RELAY7_PIN_TYPE :
(index == 7) ? RELAY8_PIN_TYPE : GPIO_TYPE_NONE
);
}
constexpr unsigned char resetPin(size_t index) {
return (
(index == 0) ? RELAY1_RESET_PIN :
(index == 1) ? RELAY2_RESET_PIN :
(index == 2) ? RELAY3_RESET_PIN :
(index == 3) ? RELAY4_RESET_PIN :
(index == 4) ? RELAY5_RESET_PIN :
(index == 5) ? RELAY6_RESET_PIN :
(index == 6) ? RELAY7_RESET_PIN :
(index == 7) ? RELAY8_RESET_PIN : GPIO_NONE
);
}
constexpr int bootMode(size_t index) {
return (
(index == 0) ? RELAY1_BOOT_MODE :
(index == 1) ? RELAY2_BOOT_MODE :
(index == 2) ? RELAY3_BOOT_MODE :
(index == 3) ? RELAY4_BOOT_MODE :
(index == 4) ? RELAY5_BOOT_MODE :
(index == 5) ? RELAY6_BOOT_MODE :
(index == 6) ? RELAY7_BOOT_MODE :
(index == 7) ? RELAY8_BOOT_MODE : RELAY_BOOT_OFF
);
}
constexpr RelayProvider provider(size_t index) {
return (
(index == 0) ? (RELAY1_PROVIDER) :
(index == 1) ? (RELAY2_PROVIDER) :
(index == 2) ? (RELAY3_PROVIDER) :
(index == 3) ? (RELAY4_PROVIDER) :
(index == 4) ? (RELAY5_PROVIDER) :
(index == 5) ? (RELAY6_PROVIDER) :
(index == 6) ? (RELAY7_PROVIDER) :
(index == 7) ? (RELAY8_PROVIDER) : RELAY_PROVIDER_NONE
);
}
constexpr RelayMqttTopicMode mqttTopicMode(size_t index) {
return (
(index == 0) ? (RELAY1_MQTT_TOPIC_MODE) :
(index == 1) ? (RELAY2_MQTT_TOPIC_MODE) :
(index == 2) ? (RELAY3_MQTT_TOPIC_MODE) :
(index == 3) ? (RELAY4_MQTT_TOPIC_MODE) :
(index == 4) ? (RELAY5_MQTT_TOPIC_MODE) :
(index == 5) ? (RELAY6_MQTT_TOPIC_MODE) :
(index == 6) ? (RELAY7_MQTT_TOPIC_MODE) :
(index == 7) ? (RELAY8_MQTT_TOPIC_MODE) : RELAY_MQTT_TOPIC_MODE
);
}
constexpr const char* const mqttPayloadOn() {
return RELAY_MQTT_ON;
}
constexpr const char* const mqttPayloadOff() {
return RELAY_MQTT_OFF;
}
constexpr const char* const mqttPayloadToggle() {
return RELAY_MQTT_TOGGLE;
}
constexpr const char* const mqttTopicSub(size_t index) {
return (
(index == 0) ? (RELAY1_MQTT_TOPIC_SUB) :
(index == 1) ? (RELAY2_MQTT_TOPIC_SUB) :
(index == 2) ? (RELAY3_MQTT_TOPIC_SUB) :
(index == 3) ? (RELAY4_MQTT_TOPIC_SUB) :
(index == 4) ? (RELAY5_MQTT_TOPIC_SUB) :
(index == 5) ? (RELAY6_MQTT_TOPIC_SUB) :
(index == 6) ? (RELAY7_MQTT_TOPIC_SUB) :
(index == 7) ? (RELAY8_MQTT_TOPIC_SUB) : ""
);
}
constexpr const char* const mqttTopicPub(size_t index) {
return (
(index == 0) ? (RELAY1_MQTT_TOPIC_PUB) :
(index == 1) ? (RELAY2_MQTT_TOPIC_PUB) :
(index == 2) ? (RELAY3_MQTT_TOPIC_PUB) :
(index == 3) ? (RELAY4_MQTT_TOPIC_PUB) :
(index == 4) ? (RELAY5_MQTT_TOPIC_PUB) :
(index == 5) ? (RELAY6_MQTT_TOPIC_PUB) :
(index == 6) ? (RELAY7_MQTT_TOPIC_PUB) :
(index == 7) ? (RELAY8_MQTT_TOPIC_PUB) : ""
);
}
constexpr PayloadStatus mqttDisconnectionStatus(size_t index) {
return (
(index == 0) ? (RELAY1_MQTT_DISCONNECT_STATUS) :
(index == 1) ? (RELAY2_MQTT_DISCONNECT_STATUS) :
(index == 2) ? (RELAY3_MQTT_DISCONNECT_STATUS) :
(index == 3) ? (RELAY4_MQTT_DISCONNECT_STATUS) :
(index == 4) ? (RELAY5_MQTT_DISCONNECT_STATUS) :
(index == 5) ? (RELAY6_MQTT_DISCONNECT_STATUS) :
(index == 6) ? (RELAY7_MQTT_DISCONNECT_STATUS) :
(index == 7) ? (RELAY8_MQTT_DISCONNECT_STATUS) : RELAY_MQTT_DISCONNECT_NONE
);
}
} // namespace build
} // namespace relay

Loading…
Cancel
Save