MiLightClient.h 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. #include <functional>
  2. #include <Arduino.h>
  3. #include <MiLightRadio.h>
  4. #include <MiLightRadioFactory.h>
  5. #include <MiLightRemoteConfig.h>
  6. #include <Settings.h>
  7. #include <GroupStateStore.h>
  8. #include <PacketSender.h>
  9. #include <TransitionController.h>
  10. #include <cstring>
  11. #include <map>
  12. #include <set>
  13. #ifndef _MILIGHTCLIENT_H
  14. #define _MILIGHTCLIENT_H
  15. //#define DEBUG_PRINTF
  16. //#define DEBUG_CLIENT_COMMANDS // enable to show each individual change command (like hue, brightness, etc)
  17. #define FS(str) (reinterpret_cast<const __FlashStringHelper*>(str))
  18. namespace RequestKeys {
  19. static const char TRANSITION[] = "transition";
  20. };
  21. namespace TransitionParams {
  22. static const char FIELD[] PROGMEM = "field";
  23. static const char START_VALUE[] PROGMEM = "start_value";
  24. static const char END_VALUE[] PROGMEM = "end_value";
  25. static const char DURATION[] PROGMEM = "duration";
  26. static const char PERIOD[] PROGMEM = "period";
  27. static const char NUM_PERIODS[] PROGMEM = "num_periods";
  28. }
  29. // Used to determine RGB colros that are approximately white
  30. #define RGB_WHITE_THRESHOLD 10
  31. class MiLightClient {
  32. public:
  33. MiLightClient(
  34. RadioSwitchboard& radioSwitchboard,
  35. PacketSender& packetSender,
  36. GroupStateStore* stateStore,
  37. Settings& settings,
  38. TransitionController& transitions
  39. );
  40. ~MiLightClient() { }
  41. typedef std::function<void(void)> EventHandler;
  42. void prepare(const MiLightRemoteConfig* remoteConfig, const uint16_t deviceId = -1, const uint8_t groupId = -1);
  43. void prepare(const MiLightRemoteType type, const uint16_t deviceId = -1, const uint8_t groupId = -1);
  44. void setResendCount(const unsigned int resendCount);
  45. bool available();
  46. size_t read(uint8_t packet[]);
  47. void write(uint8_t packet[]);
  48. void setHeld(bool held);
  49. // Common methods
  50. void updateStatus(MiLightStatus status);
  51. void updateStatus(MiLightStatus status, uint8_t groupId);
  52. void pair();
  53. void unpair();
  54. void command(uint8_t command, uint8_t arg);
  55. void updateMode(uint8_t mode);
  56. void nextMode();
  57. void previousMode();
  58. void modeSpeedDown();
  59. void modeSpeedUp();
  60. void toggleStatus();
  61. // RGBW methods
  62. void updateHue(const uint16_t hue);
  63. void updateBrightness(const uint8_t brightness);
  64. void updateColorWhite();
  65. void updateColorRaw(const uint8_t color);
  66. void enableNightMode();
  67. void updateColor(JsonVariant json);
  68. // CCT methods
  69. void updateTemperature(const uint8_t colorTemperature);
  70. void decreaseTemperature();
  71. void increaseTemperature();
  72. void increaseBrightness();
  73. void decreaseBrightness();
  74. void updateSaturation(const uint8_t saturation);
  75. void update(JsonObject object);
  76. void handleCommand(JsonVariant command);
  77. void handleCommands(JsonArray commands);
  78. bool handleTransition(JsonObject args, JsonDocument& responseObj);
  79. void handleTransition(GroupStateField field, JsonVariant value, float duration);
  80. void handleEffect(const String& effect);
  81. void onUpdateBegin(EventHandler handler);
  82. void onUpdateEnd(EventHandler handler);
  83. size_t getNumRadios() const;
  84. std::shared_ptr<MiLightRadio> switchRadio(size_t radioIx);
  85. std::shared_ptr<MiLightRadio> switchRadio(const MiLightRemoteConfig* remoteConfig);
  86. MiLightRemoteConfig& currentRemoteConfig() const;
  87. // Call to override the number of packet repeats that are sent. Clear with clearRepeatsOverride
  88. void setRepeatsOverride(size_t repeatsOverride);
  89. // Clear the repeats override so that the default is used
  90. void clearRepeatsOverride();
  91. uint8_t parseStatus(JsonObject object);
  92. protected:
  93. struct cmp_str {
  94. bool operator()(char const *a, char const *b) const {
  95. return std::strcmp(a, b) < 0;
  96. }
  97. };
  98. static const std::map<const char*, std::function<void(MiLightClient*, JsonVariant)>, cmp_str> FIELD_SETTERS;
  99. static const char* FIELD_ORDERINGS[];
  100. RadioSwitchboard& radioSwitchboard;
  101. std::vector<std::shared_ptr<MiLightRadio>> radios;
  102. std::shared_ptr<MiLightRadio> currentRadio;
  103. const MiLightRemoteConfig* currentRemote;
  104. EventHandler updateBeginHandler;
  105. EventHandler updateEndHandler;
  106. GroupStateStore* stateStore;
  107. Settings& settings;
  108. PacketSender& packetSender;
  109. TransitionController& transitions;
  110. // If set, override the number of packet repeats used.
  111. size_t repeatsOverride;
  112. void flushPacket();
  113. };
  114. #endif