Browse Source

relay: optional pulse time in terminal, default to 0

test/dev
Maxim Prokhorov 1 month ago
parent
commit
0d84c76477
1 changed files with 56 additions and 15 deletions
  1. +56
    -15
      code/espurna/relay.cpp

+ 56
- 15
code/espurna/relay.cpp View File

@ -2887,8 +2887,8 @@ static void _relayCommand(::terminal::CommandContext&& ctx) {
PROGMEM_STRING(PulseCommand, "PULSE");
static void _relayCommandPulse(::terminal::CommandContext&& ctx) {
if (ctx.argv.size() < 3) {
terminalError(ctx, F("PULSE <ID> <TIME> [<TOGGLE>]"));
if (ctx.argv.size() < 2) {
terminalError(ctx, F("PULSE <ID> [<TIME>] [<TOGGLE>]"));
return;
}
@ -2898,31 +2898,71 @@ static void _relayCommandPulse(::terminal::CommandContext&& ctx) {
return;
}
const auto time = espurna::relay::pulse::settings::parse_time(ctx.argv[2]);
if (!time.ok) {
terminalError(ctx, F("Invalid pulse time"));
return;
using namespace espurna::relay;
auto duration = pulse::Duration{ 0 };
if (ctx.argv.size() >= 3) {
const auto parsed = pulse::settings::parse_time(ctx.argv[2]);
if (!parsed.ok) {
terminalError(ctx, F("Invalid pulse time"));
return;
}
duration = pulse::settings::native_duration(parsed);
}
const auto duration = espurna::relay::pulse::settings::native_duration(time);
if (duration.count() == 0) {
pulse::reset(id);
terminalOK(ctx);
return;
}
bool toggle = true;
if (ctx.argv.size() == 4) {
auto* convert= espurna::settings::internal::convert<bool>;
if (ctx.argv.size() >= 4) {
auto* convert = espurna::settings::internal::convert<bool>;
toggle = convert(ctx.argv[3]);
}
const auto status = relayStatus(id);
if (toggle && _relayPulseActive(id, status)) {
terminalError(ctx, F("Pulse already active!"));
auto timer = pulse::schedule(
duration, id,
toggle
? status
: !status);
if (toggle) {
relayToggle(id, true, false);
} else {
(*timer).start();
}
terminalOK(ctx);
}
PROGMEM_STRING(PulseTimersCommand, "PULSE.TIMERS");
static void _relayCommandPulseTimers(::terminal::CommandContext&& ctx) {
using namespace espurna::relay;
if (pulse::internal::timers.empty()) {
terminalError(ctx, STRING_VIEW("no pulse timers").toString());
return;
}
const auto target = toggle ? status : !status;
espurna::relay::pulse::trigger(duration, id, target);
for (auto& timer : pulse::internal::timers) {
espurna::StringView type;
if (relayStatus(timer.id()) == timer.status()) {
type = STRING_VIEW("Stalled");
} else if (static_cast<bool>(timer)) {
type = STRING_VIEW("Active");
} else {
type = STRING_VIEW("Pending");
}
if ((duration.count() > 0) && toggle) {
relayToggle(id, true, false);
ctx.output.printf_P(
PSTR("pulse%zu\t{%.*s Duration=%u Status=#%c}\n"),
type.length(), type.data(),
timer.id(), timer.duration().count(),
timer.status() ? 't' : 'f');
}
terminalOK(ctx);
@ -2998,6 +3038,7 @@ static void _relayCommandUnlock(::terminal::CommandContext&& ctx) {
static constexpr ::terminal::Command RelayCommands[] PROGMEM {
{RelayCommand, _relayCommand},
{PulseCommand, _relayCommandPulse},
{PulseTimersCommand, _relayCommandPulseTimers},
{LockCommand, _relayCommandLock},
{UnlockCommand, _relayCommandUnlock},
};


Loading…
Cancel
Save