MiLightClient.h 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  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. enum MiLightRadioType {
  10. RGBW = 0xB8,
  11. CCT = 0x5A
  12. };
  13. enum MiLightStatus { ON = 0, OFF = 1 };
  14. struct MiLightPacket {
  15. uint8_t deviceType;
  16. uint16_t deviceId;
  17. uint8_t b1;
  18. uint8_t b2;
  19. uint8_t b3;
  20. uint8_t sequenceNum;
  21. };
  22. class MiLightRadioStack {
  23. public:
  24. MiLightRadioStack(RF24& rf, const MiLightRadioConfig& config) {
  25. nrf = new PL1167_nRF24(rf);
  26. radio = new MiLightRadio(*nrf, config);
  27. }
  28. ~MiLightRadioStack() {
  29. delete radio;
  30. delete nrf;
  31. }
  32. inline MiLightRadio* getRadio() {
  33. return this->radio;
  34. }
  35. private:
  36. PL1167_nRF24 *nrf;
  37. MiLightRadio *radio;
  38. };
  39. class MiLightClient {
  40. public:
  41. MiLightClient(uint8_t cePin, uint8_t csnPin)
  42. : sequenceNum(0),
  43. rf(RF24(cePin, csnPin))
  44. {
  45. rgbwRadio = new MiLightRadioStack(rf, MilightRgbwConfig);
  46. cctRadio = new MiLightRadioStack(rf, MilightCctConfig);
  47. }
  48. ~MiLightClient() {
  49. delete rgbwRadio;
  50. delete cctRadio;
  51. }
  52. void begin() {
  53. rgbwRadio->getRadio()->begin();
  54. cctRadio->getRadio()->begin();
  55. }
  56. bool available(const MiLightRadioType radioType);
  57. void read(const MiLightRadioType radioType, MiLightPacket& packet);
  58. void write(const MiLightRadioType radioType, MiLightPacket& packet, const unsigned int resendCount = 50);
  59. void writeRgbw(
  60. const uint16_t deviceId,
  61. const uint8_t color,
  62. const uint8_t brightness,
  63. const uint8_t groupId,
  64. const uint8_t button
  65. );
  66. // Common methods
  67. void updateStatus(const uint16_t deviceId, const uint8_t groupId, MiLightStatus status);
  68. void pair(const uint16_t deviceId, const uint8_t groupId);
  69. void unpair(const uint16_t deviceId, const uint8_t groupId);
  70. void allOn(const uint16_t deviceId);
  71. void allOff(const uint16_t deviceId);
  72. void pressButton(const uint16_t deviceId, const uint8_t groupId, uint8_t button);
  73. // RGBW methods
  74. void updateHue(const uint16_t deviceId, const uint8_t groupId, const uint16_t hue);
  75. void updateBrightness(const uint16_t deviceId, const uint8_t groupId, const uint8_t brightness);
  76. void updateColorWhite(const uint16_t deviceId, const uint8_t groupId);
  77. void updateColorRaw(const uint16_t deviceId, const uint8_t groupId, const uint16_t color);
  78. // CCT methods
  79. void updateColorTemperature(const uint8_t colorTemperature);
  80. MiLightRadio* getRadio(const MiLightRadioType type);
  81. static void deserializePacket(const uint8_t rawPacket[], MiLightPacket& packet);
  82. static void serializePacket(uint8_t rawPacket[], const MiLightPacket& packet);
  83. private:
  84. RF24 rf;
  85. MiLightRadioStack* rgbwRadio;
  86. MiLightRadioStack* cctRadio;
  87. uint8_t sequenceNum;
  88. uint8_t nextSequenceNum();
  89. };
  90. #endif