MiLightClient.h 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. #include <Arduino.h>
  2. #include <MiLightRadio.h>
  3. #include <PL1167_nRF24.h>
  4. #include <RF24.h>
  5. #include <MiLightButtons.h>
  6. #ifndef _MILIGHTCLIENT_H
  7. #define _MILIGHTCLIENT_H
  8. #define MILIGHT_PACKET_LENGTH 7
  9. #define MILIGHT_CCT_INTERVALS 10
  10. enum MiLightRadioType {
  11. UNKNOWN = 0,
  12. RGBW = 0xB8,
  13. CCT = 0x5A
  14. };
  15. enum MiLightStatus { ON = 0, OFF = 1 };
  16. struct MiLightPacket {
  17. uint8_t deviceType;
  18. uint16_t deviceId;
  19. uint8_t b1;
  20. uint8_t b2;
  21. uint8_t b3;
  22. uint8_t sequenceNum;
  23. };
  24. class MiLightRadioStack {
  25. public:
  26. MiLightRadioStack(RF24& rf, const MiLightRadioConfig& config) {
  27. nrf = new PL1167_nRF24(rf);
  28. radio = new MiLightRadio(*nrf, config);
  29. }
  30. ~MiLightRadioStack() {
  31. delete radio;
  32. delete nrf;
  33. }
  34. inline MiLightRadio* getRadio() {
  35. return this->radio;
  36. }
  37. private:
  38. PL1167_nRF24 *nrf;
  39. MiLightRadio *radio;
  40. };
  41. class MiLightClient {
  42. public:
  43. MiLightClient(uint8_t cePin, uint8_t csnPin)
  44. : sequenceNum(0),
  45. rf(RF24(cePin, csnPin))
  46. {
  47. rgbwRadio = new MiLightRadioStack(rf, MilightRgbwConfig);
  48. cctRadio = new MiLightRadioStack(rf, MilightCctConfig);
  49. }
  50. ~MiLightClient() {
  51. delete rgbwRadio;
  52. delete cctRadio;
  53. }
  54. void begin() {
  55. rgbwRadio->getRadio()->begin();
  56. cctRadio->getRadio()->begin();
  57. }
  58. bool available(const MiLightRadioType radioType);
  59. void read(const MiLightRadioType radioType, MiLightPacket& packet);
  60. void write(const MiLightRadioType radioType, MiLightPacket& packet, const unsigned int resendCount = 50);
  61. void writeRgbw(
  62. const uint16_t deviceId,
  63. const uint8_t color,
  64. const uint8_t brightness,
  65. const uint8_t groupId,
  66. const uint8_t button
  67. );
  68. void writeCct(
  69. const uint16_t deviceId,
  70. const uint8_t groupId,
  71. const uint8_t button
  72. );
  73. // Common methods
  74. void updateStatus(const MiLightRadioType type,const uint16_t deviceId, const uint8_t groupId, MiLightStatus status);
  75. void pair(const MiLightRadioType type,const uint16_t deviceId, const uint8_t groupId);
  76. void unpair(const MiLightRadioType type,const uint16_t deviceId, const uint8_t groupId);
  77. void allOn(const MiLightRadioType type,const uint16_t deviceId);
  78. void allOff(const MiLightRadioType type,const uint16_t deviceId);
  79. void pressButton(const MiLightRadioType type, const uint16_t deviceId, const uint8_t groupId, uint8_t button);
  80. // RGBW methods
  81. void updateHue(const uint16_t deviceId, const uint8_t groupId, const uint16_t hue);
  82. void updateBrightness(const uint16_t deviceId, const uint8_t groupId, const uint8_t brightness);
  83. void updateColorWhite(const uint16_t deviceId, const uint8_t groupId);
  84. void updateColorRaw(const uint16_t deviceId, const uint8_t groupId, const uint16_t color);
  85. // CCT methods
  86. void updateTemperature(const uint16_t deviceId, const uint8_t groupId, const uint8_t colorTemperature);
  87. void decreaseTemperature(const uint16_t deviceId, const uint8_t groupId);
  88. void increaseTemperature(const uint16_t deviceId, const uint8_t groupId);
  89. void updateCctBrightness(const uint16_t deviceId, const uint8_t groupId, const uint8_t brightness);
  90. void decreaseCctBrightness(const uint16_t deviceId, const uint8_t groupId);
  91. void increaseCctBrightness(const uint16_t deviceId, const uint8_t groupId);
  92. MiLightRadio* getRadio(const MiLightRadioType type);
  93. static void deserializePacket(const uint8_t rawPacket[], MiLightPacket& packet);
  94. static void serializePacket(uint8_t rawPacket[], const MiLightPacket& packet);
  95. static uint8_t getCctStatusButton(uint8_t groupId, MiLightStatus status);
  96. static MiLightRadioType getRadioType(const String& typeName);
  97. private:
  98. RF24 rf;
  99. MiLightRadioStack* rgbwRadio;
  100. MiLightRadioStack* cctRadio;
  101. uint8_t sequenceNum;
  102. uint8_t nextSequenceNum();
  103. };
  104. #endif