MiLightClient.h 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  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. // Used to indicate that the start value for a transition should be fetched from current state
  34. static const int16_t FETCH_VALUE_FROM_STATE = -1;
  35. MiLightClient(
  36. RadioSwitchboard& radioSwitchboard,
  37. PacketSender& packetSender,
  38. GroupStateStore* stateStore,
  39. Settings& settings,
  40. TransitionController& transitions
  41. );
  42. ~MiLightClient() { }
  43. typedef std::function<void(void)> EventHandler;
  44. void prepare(const MiLightRemoteConfig* remoteConfig, const uint16_t deviceId = -1, const uint8_t groupId = -1);
  45. void prepare(const MiLightRemoteType type, const uint16_t deviceId = -1, const uint8_t groupId = -1);
  46. void setResendCount(const unsigned int resendCount);
  47. bool available();
  48. size_t read(uint8_t packet[]);
  49. void write(uint8_t packet[]);
  50. void setHeld(bool held);
  51. // Common methods
  52. void updateStatus(MiLightStatus status);
  53. void updateStatus(MiLightStatus status, uint8_t groupId);
  54. void pair();
  55. void unpair();
  56. void command(uint8_t command, uint8_t arg);
  57. void updateMode(uint8_t mode);
  58. void nextMode();
  59. void previousMode();
  60. void modeSpeedDown();
  61. void modeSpeedUp();
  62. void toggleStatus();
  63. // RGBW methods
  64. void updateHue(const uint16_t hue);
  65. void updateBrightness(const uint8_t brightness);
  66. void updateColorWhite();
  67. void updateColorRaw(const uint8_t color);
  68. void enableNightMode();
  69. void updateColor(JsonVariant json);
  70. // CCT methods
  71. void updateTemperature(const uint8_t colorTemperature);
  72. void decreaseTemperature();
  73. void increaseTemperature();
  74. void increaseBrightness();
  75. void decreaseBrightness();
  76. void updateSaturation(const uint8_t saturation);
  77. void update(JsonObject object);
  78. void handleCommand(JsonVariant command);
  79. void handleCommands(JsonArray commands);
  80. bool handleTransition(JsonObject args, JsonDocument& responseObj);
  81. void handleTransition(GroupStateField field, JsonVariant value, float duration, int16_t startValue = FETCH_VALUE_FROM_STATE);
  82. void handleEffect(const String& effect);
  83. void onUpdateBegin(EventHandler handler);
  84. void onUpdateEnd(EventHandler handler);
  85. size_t getNumRadios() const;
  86. std::shared_ptr<MiLightRadio> switchRadio(size_t radioIx);
  87. std::shared_ptr<MiLightRadio> switchRadio(const MiLightRemoteConfig* remoteConfig);
  88. MiLightRemoteConfig& currentRemoteConfig() const;
  89. // Call to override the number of packet repeats that are sent. Clear with clearRepeatsOverride
  90. void setRepeatsOverride(size_t repeatsOverride);
  91. // Clear the repeats override so that the default is used
  92. void clearRepeatsOverride();
  93. uint8_t parseStatus(JsonVariant object);
  94. JsonVariant extractStatus(JsonObject object);
  95. protected:
  96. struct cmp_str {
  97. bool operator()(char const *a, char const *b) const {
  98. return std::strcmp(a, b) < 0;
  99. }
  100. };
  101. static const std::map<const char*, std::function<void(MiLightClient*, JsonVariant)>, cmp_str> FIELD_SETTERS;
  102. static const char* FIELD_ORDERINGS[];
  103. RadioSwitchboard& radioSwitchboard;
  104. std::vector<std::shared_ptr<MiLightRadio>> radios;
  105. std::shared_ptr<MiLightRadio> currentRadio;
  106. const MiLightRemoteConfig* currentRemote;
  107. EventHandler updateBeginHandler;
  108. EventHandler updateEndHandler;
  109. GroupStateStore* stateStore;
  110. Settings& settings;
  111. PacketSender& packetSender;
  112. TransitionController& transitions;
  113. // If set, override the number of packet repeats used.
  114. size_t repeatsOverride;
  115. void flushPacket();
  116. };
  117. #endif