#include #include #ifndef _MILIGHTCLIENT_H #define _MILIGHTCLIENT_H #define MILIGHT_PACKET_LENGTH 7 enum MiLightDeviceType { WHITE = 0xB0, RGBW = 0xB8 }; enum MiLightButton { ALL_ON = 0x01, ALL_OFF = 0x02, GROUP_1_ON = 0x03, GROUP_1_OFF = 0x04, GROUP_2_ON = 0x05, GROUP_2_OFF = 0x06, GROUP_3_ON = 0x07, GROUP_3_OFF = 0x08, GROUP_4_ON = 0x09, GROUP_4_OFF = 0x0A, SPEED_UP = 0x0B, SPEED_DOWN = 0x0C, DISCO_MODE = 0x0D, BRIGHTNESS = 0x0E, COLOR = 0x0F, ALL_MAX_LEVEL = 0x11, ALL_MIN_LEVEL = 0x12, // These are the only mechanism (that I know of) to disable RGB and set the // color to white. GROUP_1_MAX_LEVEL = 0x13, GROUP_1_MIN_LEVEL = 0x14, GROUP_2_MAX_LEVEL = 0x15, GROUP_2_MIN_LEVEL = 0x16, GROUP_3_MAX_LEVEL = 0x17, GROUP_3_MIN_LEVEL = 0x18, GROUP_4_MAX_LEVEL = 0x19, GROUP_4_MIN_LEVEL = 0x1A, }; enum MiLightStatus { ON = 0, OFF = 1 }; struct MiLightPacket { uint8_t deviceType; uint16_t deviceId; uint8_t color; uint8_t brightness; uint8_t groupId; uint8_t button; uint8_t sequenceNum; }; class MiLightClient { public: MiLightClient(MiLightRadio& radio) : radio(radio), sequenceNum(0) {} bool available(); void read(MiLightPacket& packet); void write(MiLightPacket& packet, const unsigned int resendCount = 50); void write( const uint16_t deviceId, const uint16_t color, const uint8_t brightness, const uint8_t groupId, const MiLightButton button ); void updateColor(const uint16_t deviceId, const uint8_t groupId, const uint16_t hue); void updateBrightness(const uint16_t deviceId, const uint8_t groupId, const uint8_t brightness); void updateStatus(const uint16_t deviceId, const uint8_t groupId, MiLightStatus status); void updateColorWhite(const uint16_t deviceId, const uint8_t groupId); void pair(const uint16_t deviceId, const uint8_t groupId); void unpair(const uint16_t deviceId, const uint8_t groupId); void allOn(const uint16_t deviceId); void allOff(const uint16_t deviceId); void pressButton(const uint16_t deviceId, const uint8_t groupId, MiLightButton button); static void deserializePacket(const uint8_t rawPacket[], MiLightPacket& packet); static void serializePacket(uint8_t rawPacket[], const MiLightPacket& packet); private: MiLightRadio& radio; uint8_t sequenceNum; uint8_t nextSequenceNum(); }; #endif