#include #include #include #include #include #ifndef _MILIGHTCLIENT_H #define _MILIGHTCLIENT_H #define MILIGHT_PACKET_LENGTH 7 #define MILIGHT_CCT_INTERVALS 10 #define MILIGHT_DEFAULT_RESEND_COUNT 10 class MiLightRadioStack { public: MiLightRadioStack(RF24& rf, const MiLightRadioConfig& config) : type(config.type) { nrf = new PL1167_nRF24(rf); radio = new MiLightRadio(*nrf, config); } ~MiLightRadioStack() { delete radio; delete nrf; } inline MiLightRadio* getRadio() { return this->radio; } const MiLightRadioType& type; private: PL1167_nRF24 *nrf; MiLightRadio *radio; }; class MiLightClient { public: static uint8_t const V2_OFFSETS[][4]; MiLightClient(uint8_t cePin, uint8_t csnPin) : sequenceNum(0), rf(RF24(cePin, csnPin)), resendCount(MILIGHT_DEFAULT_RESEND_COUNT) { rgbwRadio = new MiLightRadioStack(rf, MilightRgbwConfig); cctRadio = new MiLightRadioStack(rf, MilightCctConfig); rgbCctRadio = new MiLightRadioStack(rf, MilightRgbCctConfig); } ~MiLightClient() { delete rgbwRadio; delete cctRadio; delete rgbCctRadio; } void begin() { rgbwRadio->getRadio()->begin(); cctRadio->getRadio()->begin(); rgbCctRadio->getRadio()->begin(); } void setResendCount(const unsigned int resendCount); bool available(const MiLightRadioType radioType); void read(const MiLightRadioType radioType, uint8_t packet[]); void write(const MiLightRadioConfig& radioConfig, uint8_t packet[]); void writeRgbw( const uint16_t deviceId, const uint8_t color, const uint8_t brightness, const uint8_t groupId, const uint8_t button ); void writeCct( const uint16_t deviceId, const uint8_t groupId, const uint8_t button ); void writeRgbCct(const uint16_t deviceId, const uint8_t command, const uint8_t arg, const uint8_t group ); // Common methods void updateStatus(const MiLightRadioType type, const uint16_t deviceId, const uint8_t groupId, MiLightStatus status); void pair(const MiLightRadioType type, const uint16_t deviceId, const uint8_t groupId); void unpair(const MiLightRadioType type, const uint16_t deviceId, const uint8_t groupId); void allOn(const MiLightRadioType type, const uint16_t deviceId); void allOff(const MiLightRadioType type, const uint16_t deviceId); void pressButton(const MiLightRadioType type, const uint16_t deviceId, const uint8_t groupId, uint8_t button); // RGBW methods void updateHue(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 updateColorWhite(const uint16_t deviceId, const uint8_t groupId); void updateColorRaw(const uint16_t deviceId, const uint8_t groupId, const uint16_t color); // CCT methods void updateTemperature(const uint16_t deviceId, const uint8_t groupId, const uint8_t colorTemperature); void decreaseTemperature(const uint16_t deviceId, const uint8_t groupId); void increaseTemperature(const uint16_t deviceId, const uint8_t groupId); void updateCctBrightness(const uint16_t deviceId, const uint8_t groupId, const uint8_t brightness); void decreaseCctBrightness(const uint16_t deviceId, const uint8_t groupId); void increaseCctBrightness(const uint16_t deviceId, const uint8_t groupId); MiLightRadio* getRadio(const MiLightRadioType type); static uint8_t getCctStatusButton(uint8_t groupId, MiLightStatus status); static MiLightRadioType getRadioType(const String& typeName); static const MiLightRadioConfig& getRadioConfig(const String& typeName); void formatPacket(MiLightRadioConfig& config, uint8_t* packet, char* buffer); private: RF24 rf; MiLightRadioStack* rgbwRadio; MiLightRadioStack* cctRadio; MiLightRadioStack* rgbCctRadio; MiLightRadioType currentRadio; uint8_t sequenceNum; uint8_t nextSequenceNum(); unsigned int resendCount; static void encodeV2Packet(uint8_t* packet); static uint8_t xorKey(uint8_t key); static uint8_t encodeByte(uint8_t byte, uint8_t s1, uint8_t xorKey, uint8_t s2); }; #endif