MiLightClient.h 2.6 KB

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