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