MiLightClient.h 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. #include <Arduino.h>
  2. #include <MiLightRadio.h>
  3. #include <PL1167_nRF24.h>
  4. #include <RF24.h>
  5. #ifndef _MILIGHTCLIENT_H
  6. #define _MILIGHTCLIENT_H
  7. #define MILIGHT_PACKET_LENGTH 7
  8. enum MiLightDeviceType {
  9. WHITE = 0xB0,
  10. RGBW = 0xB8
  11. };
  12. enum MiLightButton {
  13. ALL_ON = 0x01,
  14. ALL_OFF = 0x02,
  15. GROUP_1_ON = 0x03,
  16. GROUP_1_OFF = 0x04,
  17. GROUP_2_ON = 0x05,
  18. GROUP_2_OFF = 0x06,
  19. GROUP_3_ON = 0x07,
  20. GROUP_3_OFF = 0x08,
  21. GROUP_4_ON = 0x09,
  22. GROUP_4_OFF = 0x0A,
  23. SPEED_UP = 0x0B,
  24. SPEED_DOWN = 0x0C,
  25. DISCO_MODE = 0x0D,
  26. BRIGHTNESS = 0x0E,
  27. COLOR = 0x0F,
  28. ALL_MAX_LEVEL = 0x11,
  29. ALL_MIN_LEVEL = 0x12,
  30. // These are the only mechanism (that I know of) to disable RGB and set the
  31. // color to white.
  32. GROUP_1_MAX_LEVEL = 0x13,
  33. GROUP_1_MIN_LEVEL = 0x14,
  34. GROUP_2_MAX_LEVEL = 0x15,
  35. GROUP_2_MIN_LEVEL = 0x16,
  36. GROUP_3_MAX_LEVEL = 0x17,
  37. GROUP_3_MIN_LEVEL = 0x18,
  38. GROUP_4_MAX_LEVEL = 0x19,
  39. GROUP_4_MIN_LEVEL = 0x1A,
  40. };
  41. enum MiLightStatus { ON = 0, OFF = 1 };
  42. struct MiLightPacket {
  43. uint8_t deviceType;
  44. uint16_t deviceId;
  45. uint8_t color;
  46. uint8_t brightness;
  47. uint8_t groupId;
  48. uint8_t button;
  49. uint8_t sequenceNum;
  50. };
  51. class MiLightClient {
  52. public:
  53. MiLightClient(uint8_t cePin, uint8_t csnPin, MiLightRadioConfig& config) :
  54. sequenceNum(0) {
  55. rf = new RF24(cePin, csnPin);
  56. prf = new PL1167_nRF24(*rf);
  57. radio = new MiLightRadio(*prf, config);
  58. }
  59. ~MiLightClient() {
  60. delete rf;
  61. delete prf;
  62. delete radio;
  63. }
  64. void begin() {
  65. radio->begin();
  66. }
  67. bool available();
  68. void read(MiLightPacket& packet);
  69. void write(MiLightPacket& packet, const unsigned int resendCount = 50);
  70. void write(
  71. const uint16_t deviceId,
  72. const uint8_t color,
  73. const uint8_t brightness,
  74. const uint8_t groupId,
  75. const MiLightButton button
  76. );
  77. void updateColorRaw(const uint16_t deviceId, const uint8_t groupId, const uint16_t color);
  78. void updateHue(const uint16_t deviceId, const uint8_t groupId, const uint16_t hue);
  79. void updateBrightness(const uint16_t deviceId, const uint8_t groupId, const uint8_t brightness);
  80. void updateStatus(const uint16_t deviceId, const uint8_t groupId, MiLightStatus status);
  81. void updateColorWhite(const uint16_t deviceId, const uint8_t groupId);
  82. void pair(const uint16_t deviceId, const uint8_t groupId);
  83. void unpair(const uint16_t deviceId, const uint8_t groupId);
  84. void allOn(const uint16_t deviceId);
  85. void allOff(const uint16_t deviceId);
  86. void pressButton(const uint16_t deviceId, const uint8_t groupId, MiLightButton button);
  87. static void deserializePacket(const uint8_t rawPacket[], MiLightPacket& packet);
  88. static void serializePacket(uint8_t rawPacket[], const MiLightPacket& packet);
  89. private:
  90. RF24 *rf;
  91. PL1167_nRF24 *prf;
  92. MiLightRadio* radio;
  93. uint8_t sequenceNum;
  94. uint8_t nextSequenceNum();
  95. };
  96. #endif