- /*
-
- Part of MQTT and API modules
-
- Copyright (C) 2020 by Maxim Prokhorov <prokhorov dot max at outlook dot com>
-
- */
-
- #include "espurna.h"
- #include "rpc.h"
-
- #include <cstring>
-
- #include "system.h"
- #include "utils.h"
-
- namespace espurna {
- namespace rpc {
- namespace {
-
- PROGMEM_STRING(Reboot, "reboot");
- PROGMEM_STRING(Heartbeat, "heartbeat");
-
- PROGMEM_STRING(On, "on");
- PROGMEM_STRING(Off, "off");
- PROGMEM_STRING(Toggle, "toggle");
-
- void rpcPrepareReset() {
- prepareReset(CustomResetReason::Rpc);
- }
-
- bool handle_action(StringView action) {
- bool result = false;
- if (action.equals(Reboot)) {
- result = true;
- espurnaRegisterOnce(rpcPrepareReset);
- } else if (action.equals(Heartbeat)) {
- result = true;
- systemScheduleHeartbeat();
- }
- return result;
- }
-
- PayloadStatus parse(StringView payload, RpcPayloadCheck check) {
- if (!payload.length()) {
- return PayloadStatus::Unknown;
- }
-
- // Check most commonly used payloads
- if (payload.length() == 1) {
- switch (*payload.begin()) {
- case '0':
- return PayloadStatus::Off;
- case '1':
- return PayloadStatus::On;
- case '2':
- return PayloadStatus::Toggle;
- }
- return PayloadStatus::Unknown;
- }
-
- // If possible, use externally provided payload checker
- if (check) {
- const auto result = check(payload);
- if (result != PayloadStatus::Unknown) {
- return result;
- }
- }
-
- // Finally, check for "OFF", "ON", "TOGGLE" (both lower and upper cases)
- if (payload.equalsIgnoreCase(Off)) {
- return PayloadStatus::Off;
- } else if (payload.equalsIgnoreCase(On)) {
- return PayloadStatus::On;
- } else if (payload.equalsIgnoreCase(Toggle)) {
- return PayloadStatus::Toggle;
- }
-
- return PayloadStatus::Unknown;
- }
-
- } // namespace
- } // namespace rpc
- } // namespace espurna
-
- bool rpcHandleAction(espurna::StringView action) {
- return espurna::rpc::handle_action(action);
- }
-
- PayloadStatus rpcParsePayload(espurna::StringView payload, RpcPayloadCheck check) {
- return espurna::rpc::parse(payload, check);
- }
-
- PayloadStatus rpcParsePayload(espurna::StringView payload) {
- return espurna::rpc::parse(payload, nullptr);
- }
|