GroupState.h 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. #include <stddef.h>
  2. #include <inttypes.h>
  3. #include <MiLightConstants.h>
  4. #include <MiLightRadioConfig.h>
  5. #include <GroupStateField.h>
  6. #include <ArduinoJson.h>
  7. #ifndef _GROUP_STATE_H
  8. #define _GROUP_STATE_H
  9. struct BulbId {
  10. uint16_t deviceId;
  11. uint8_t groupId;
  12. MiLightRemoteType deviceType;
  13. BulbId();
  14. BulbId(const BulbId& other);
  15. BulbId(const uint16_t deviceId, const uint8_t groupId, const MiLightRemoteType deviceType);
  16. bool operator==(const BulbId& other);
  17. void operator=(const BulbId& other);
  18. };
  19. enum BulbMode {
  20. BULB_MODE_WHITE,
  21. BULB_MODE_COLOR,
  22. BULB_MODE_SCENE,
  23. BULB_MODE_NIGHT
  24. };
  25. static const char* BULB_MODE_NAMES[] = {
  26. "white",
  27. "color",
  28. "scene",
  29. "night"
  30. };
  31. class GroupState {
  32. public:
  33. GroupState();
  34. bool isSetField(GroupStateField field) const;
  35. // 1 bit
  36. bool isSetState() const;
  37. MiLightStatus getState() const;
  38. bool setState(const MiLightStatus on);
  39. // 7 bits
  40. bool isSetBrightness() const;
  41. uint8_t getBrightness() const;
  42. bool setBrightness(uint8_t brightness);
  43. // 8 bits
  44. bool isSetHue() const;
  45. uint16_t getHue() const;
  46. bool setHue(uint16_t hue);
  47. // 7 bits
  48. bool isSetSaturation() const;
  49. uint8_t getSaturation() const;
  50. bool setSaturation(uint8_t saturation);
  51. // 5 bits
  52. bool isSetMode() const;
  53. bool isSetEffect() const;
  54. uint8_t getMode() const;
  55. bool setMode(uint8_t mode);
  56. // 7 bits
  57. bool isSetKelvin() const;
  58. uint8_t getKelvin() const;
  59. uint16_t getMireds() const;
  60. bool setKelvin(uint8_t kelvin);
  61. bool setMireds(uint16_t mireds);
  62. // 3 bits
  63. bool isSetBulbMode() const;
  64. BulbMode getBulbMode() const;
  65. bool setBulbMode(BulbMode mode);
  66. // 1 bit
  67. bool isSetNightMode() const;
  68. bool isNightMode() const;
  69. bool setNightMode(bool nightMode);
  70. bool isDirty() const;
  71. inline bool setDirty();
  72. bool clearDirty();
  73. bool isMqttDirty() const;
  74. inline bool setMqttDirty();
  75. bool clearMqttDirty();
  76. bool patch(const JsonObject& state);
  77. void applyField(JsonObject& state, GroupStateField field);
  78. void applyState(JsonObject& state, GroupStateField* fields, size_t numFields);
  79. void load(Stream& stream);
  80. void dump(Stream& stream) const;
  81. static const GroupState& defaultState(MiLightRemoteType remoteType);
  82. private:
  83. static const size_t DATA_BYTES = 2;
  84. union Data {
  85. uint32_t data[DATA_BYTES];
  86. struct Fields {
  87. uint32_t
  88. _state : 1,
  89. _brightness : 7,
  90. _hue : 8,
  91. _saturation : 7,
  92. _mode : 4,
  93. _bulbMode : 3,
  94. _isSetState : 1,
  95. _isSetHue : 1;
  96. uint32_t
  97. _kelvin : 7,
  98. _isSetBrightness : 1,
  99. _isSetSaturation : 1,
  100. _isSetMode : 1,
  101. _isSetKelvin : 1,
  102. _isSetBulbMode : 1,
  103. _brightnessColor : 7,
  104. _brightnessMode : 7,
  105. _isSetBrightnessColor : 1,
  106. _isSetBrightnessMode : 1,
  107. _dirty : 1,
  108. _mqttDirty : 1,
  109. _isSetNightMode : 1,
  110. _isNightMode : 1,
  111. : 2;
  112. } fields;
  113. };
  114. Data state;
  115. void applyColor(JsonObject& state, uint8_t r, uint8_t g, uint8_t b);
  116. void applyColor(JsonObject& state);
  117. };
  118. extern const BulbId DEFAULT_BULB_ID;
  119. #endif