Mirror of espurna firmware for wireless switches and more
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.

96 lines
2.2 KiB

  1. /*
  2. Part of MQTT and API modules
  3. Copyright (C) 2020 by Maxim Prokhorov <prokhorov dot max at outlook dot com>
  4. */
  5. #include "espurna.h"
  6. #include "rpc.h"
  7. #include <cstring>
  8. #include "system.h"
  9. #include "utils.h"
  10. namespace espurna {
  11. namespace rpc {
  12. namespace {
  13. PROGMEM_STRING(Reboot, "reboot");
  14. PROGMEM_STRING(Heartbeat, "heartbeat");
  15. PROGMEM_STRING(On, "on");
  16. PROGMEM_STRING(Off, "off");
  17. PROGMEM_STRING(Toggle, "toggle");
  18. void rpcPrepareReset() {
  19. prepareReset(CustomResetReason::Rpc);
  20. }
  21. bool handle_action(StringView action) {
  22. bool result = false;
  23. if (action.equals(Reboot)) {
  24. result = true;
  25. espurnaRegisterOnce(rpcPrepareReset);
  26. } else if (action.equals(Heartbeat)) {
  27. result = true;
  28. systemScheduleHeartbeat();
  29. }
  30. return result;
  31. }
  32. PayloadStatus parse(StringView payload, RpcPayloadCheck check) {
  33. if (!payload.length()) {
  34. return PayloadStatus::Unknown;
  35. }
  36. // Check most commonly used payloads
  37. if (payload.length() == 1) {
  38. switch (*payload.begin()) {
  39. case '0':
  40. return PayloadStatus::Off;
  41. case '1':
  42. return PayloadStatus::On;
  43. case '2':
  44. return PayloadStatus::Toggle;
  45. }
  46. return PayloadStatus::Unknown;
  47. }
  48. // If possible, use externally provided payload checker
  49. if (check) {
  50. const auto result = check(payload);
  51. if (result != PayloadStatus::Unknown) {
  52. return result;
  53. }
  54. }
  55. // Finally, check for "OFF", "ON", "TOGGLE" (both lower and upper cases)
  56. if (payload.equalsIgnoreCase(Off)) {
  57. return PayloadStatus::Off;
  58. } else if (payload.equalsIgnoreCase(On)) {
  59. return PayloadStatus::On;
  60. } else if (payload.equalsIgnoreCase(Toggle)) {
  61. return PayloadStatus::Toggle;
  62. }
  63. return PayloadStatus::Unknown;
  64. }
  65. } // namespace
  66. } // namespace rpc
  67. } // namespace espurna
  68. bool rpcHandleAction(espurna::StringView action) {
  69. return espurna::rpc::handle_action(action);
  70. }
  71. PayloadStatus rpcParsePayload(espurna::StringView payload, RpcPayloadCheck check) {
  72. return espurna::rpc::parse(payload, check);
  73. }
  74. PayloadStatus rpcParsePayload(espurna::StringView payload) {
  75. return espurna::rpc::parse(payload, nullptr);
  76. }