Pārlūkot izejas kodu

proper night mode command handling

Chris Mullins 8 gadi atpakaļ
vecāks
revīzija
6ce9997234

+ 4 - 0
lib/MiLight/CctPacketFormatter.cpp

@@ -59,6 +59,10 @@ void CctPacketFormatter::decreaseBrightness() {
   command(CCT_BRIGHTNESS_DOWN, 0);
 }
 
+void CctPacketFormatter::enableNightMode() {
+  command(getCctStatusButton(groupId, OFF) | 0x10, 0);
+}
+
 uint8_t CctPacketFormatter::getCctStatusButton(uint8_t groupId, MiLightStatus status) {
   uint8_t button = 0;
 

+ 8 - 7
lib/MiLight/CctPacketFormatter.h

@@ -1,7 +1,7 @@
 #include <PacketFormatter.h>
 
 #ifndef _CCT_PACKET_FORMATTER_H
-#define _CCT_PACKET_FORMATTER_H 
+#define _CCT_PACKET_FORMATTER_H
 
 #define CCT_COMMAND_INDEX 4
 #define CCT_INTERVALS 10
@@ -28,22 +28,23 @@ public:
   CctPacketFormatter()
     : PacketFormatter(7, 20)
   { }
-  
+
   virtual void updateStatus(MiLightStatus status, uint8_t groupId);
   virtual void command(uint8_t command, uint8_t arg);
-  
+
   virtual void updateTemperature(uint8_t value);
   virtual void increaseTemperature();
   virtual void decreaseTemperature();
-  
+
   virtual void updateBrightness(uint8_t value);
   virtual void increaseBrightness();
   virtual void decreaseBrightness();
-  
+  virtual void enableNightMode();
+
   virtual void format(uint8_t const* packet, char* buffer);
   virtual void initializePacket(uint8_t* packet);
-  
+
   static uint8_t getCctStatusButton(uint8_t groupId, MiLightStatus status);
 };
 
-#endif
+#endif

+ 7 - 2
lib/MiLight/MiLightClient.cpp

@@ -172,6 +172,11 @@ void MiLightClient::updateColorWhite() {
   flushPacket();
 }
 
+void MiLightClient::enableNightMode() {
+  formatter->enableNightMode();
+  flushPacket();
+}
+
 void MiLightClient::pair() {
   formatter->pair();
   flushPacket();
@@ -222,7 +227,7 @@ void MiLightClient::flushPacket() {
 
   // When sending multiple packets, normalize the number of repeats
   if (stream.numPackets > 1) {
-    setResendCount(MILIGHT_DEFAULT_RESEND_COUNT);
+    // setResendCount(MILIGHT_DEFAULT_RESEND_COUNT);
   }
 
   while (stream.hasNext()) {
@@ -233,6 +238,6 @@ void MiLightClient::flushPacket() {
     }
   }
 
-  setResendCount(prevNumRepeats);
+  // setResendCount(prevNumRepeats);
   formatter->reset();
 }

+ 1 - 0
lib/MiLight/MiLightClient.h

@@ -46,6 +46,7 @@ public:
   void updateBrightness(const uint8_t brightness);
   void updateColorWhite();
   void updateColorRaw(const uint8_t color);
+  void enableNightMode();
 
   // CCT methods
   void updateTemperature(const uint8_t colorTemperature);

+ 1 - 0
lib/MiLight/PacketFormatter.cpp

@@ -56,6 +56,7 @@ void PacketFormatter::increaseTemperature() { }
 void PacketFormatter::decreaseTemperature() { }
 void PacketFormatter::increaseBrightness() { }
 void PacketFormatter::decreaseBrightness() { }
+void PacketFormatter::enableNightMode() { }
 
 void PacketFormatter::updateTemperature(uint8_t value) { }
 void PacketFormatter::updateSaturation(uint8_t value) { }

+ 1 - 0
lib/MiLight/PacketFormatter.h

@@ -56,6 +56,7 @@ public:
   virtual void updateBrightness(uint8_t value);
   virtual void increaseBrightness();
   virtual void decreaseBrightness();
+  virtual void enableNightMode();
 
   virtual void updateSaturation(uint8_t value);
 

+ 8 - 1
lib/MiLight/RgbCctPacketFormatter.cpp

@@ -6,6 +6,8 @@
   ((jumpStart > 0 && key >= jumpStart && key <= jumpStart+0x80) ? 0x80 : 0) \
 )
 
+#define GROUP_COMMAND_ARG(status, groupId) ( groupId + (status == OFF ? 5 : 0) )
+
 uint8_t const RgbCctPacketFormatter::V2_OFFSETS[][4] = {
   { 0x45, 0x1F, 0x14, 0x5C }, // request type
   { 0x2B, 0xC9, 0xE3, 0x11 }, // id 1
@@ -49,7 +51,7 @@ void RgbCctPacketFormatter::command(uint8_t command, uint8_t arg) {
 }
 
 void RgbCctPacketFormatter::updateStatus(MiLightStatus status, uint8_t groupId) {
-  command(RGB_CCT_ON, groupId + (status == OFF ? 5 : 0));
+  command(RGB_CCT_ON, GROUP_COMMAND_ARG(status, groupId));
 }
 
 void RgbCctPacketFormatter::modeSpeedDown() {
@@ -99,6 +101,11 @@ void RgbCctPacketFormatter::updateColorWhite() {
   updateTemperature(0);
 }
 
+void RgbCctPacketFormatter::enableNightMode() {
+  uint8_t arg = GROUP_COMMAND_ARG(OFF, groupId);
+  command(RGB_CCT_ON | 0x80, arg);
+}
+
 void RgbCctPacketFormatter::finalizePacket(uint8_t* packet) {
   encodeV2Packet(packet);
 }

+ 10 - 9
lib/MiLight/RgbCctPacketFormatter.h

@@ -6,7 +6,7 @@
 #define V2_OFFSET_JUMP_START 0x54
 
 #ifndef _RGB_CCT_PACKET_FORMATTER_H
-#define _RGB_CCT_PACKET_FORMATTER_H 
+#define _RGB_CCT_PACKET_FORMATTER_H
 
 enum MiLightRgbCctCommand {
   RGB_CCT_ON = 0x01,
@@ -26,14 +26,14 @@ enum MiLightRgbCctArguments {
 class RgbCctPacketFormatter : public PacketFormatter {
 public:
   static uint8_t const V2_OFFSETS[][4] PROGMEM;
-    
+
   RgbCctPacketFormatter()
     : PacketFormatter(9),
       lastMode(0)
   { }
-  
+
   virtual void initializePacket(uint8_t* packet);
-  
+
   virtual void updateStatus(MiLightStatus status, uint8_t group);
   virtual void updateBrightness(uint8_t value);
   virtual void command(uint8_t command, uint8_t arg);
@@ -44,15 +44,16 @@ public:
   virtual void updateSaturation(uint8_t value);
   virtual void format(uint8_t const* packet, char* buffer);
   virtual void unpair();
-  
+  virtual void enableNightMode();
+
   virtual void modeSpeedDown();
   virtual void modeSpeedUp();
   virtual void updateMode(uint8_t mode);
   virtual void nextMode();
   virtual void previousMode();
-  
+
   virtual void finalizePacket(uint8_t* packet);
-    
+
   static void encodeV2Packet(uint8_t* packet);
   static void decodeV2Packet(uint8_t* packet);
   static uint8_t xorKey(uint8_t key);
@@ -60,8 +61,8 @@ public:
   static uint8_t decodeByte(uint8_t byte, uint8_t s1, uint8_t xorKey, uint8_t s2);
 
 protected:
-  
+
   uint8_t lastMode;
 };
 
-#endif
+#endif

+ 4 - 4
lib/MiLight/RgbPacketFormatter.h

@@ -1,7 +1,7 @@
 #include <PacketFormatter.h>
 
 #ifndef _RGB_PACKET_FORMATTER_H
-#define _RGB_PACKET_FORMATTER_H 
+#define _RGB_PACKET_FORMATTER_H
 
 #define RGB_COMMAND_INDEX 4
 #define RGB_COLOR_INDEX 3
@@ -24,7 +24,7 @@ public:
   RgbPacketFormatter()
     : PacketFormatter(6, 20)
   { }
-  
+
   virtual void updateStatus(MiLightStatus status, uint8_t groupId);
   virtual void updateBrightness(uint8_t value);
   virtual void increaseBrightness();
@@ -39,8 +39,8 @@ public:
   virtual void modeSpeedUp();
   virtual void nextMode();
   virtual void previousMode();
-  
+
   virtual void initializePacket(uint8_t* packet);
 };
 
-#endif
+#endif

+ 10 - 2
lib/MiLight/RgbwPacketFormatter.cpp

@@ -1,6 +1,8 @@
 #include <RgbwPacketFormatter.h>
 #include <MiLightButtons.h>
 
+#define STATUS_COMMAND(status, groupId) ( RGBW_GROUP_1_ON + ((groupId - 1)*2) + status )
+
 void RgbwPacketFormatter::initializePacket(uint8_t* packet) {
   size_t packetPtr = 0;
 
@@ -36,8 +38,7 @@ void RgbwPacketFormatter::updateMode(uint8_t mode) {
 }
 
 void RgbwPacketFormatter::updateStatus(MiLightStatus status, uint8_t groupId) {
-  uint8_t button = RGBW_GROUP_1_ON + ((groupId - 1)*2) + status;
-  command(button, 0);
+  command(STATUS_COMMAND(status, groupId), 0);
 }
 
 void RgbwPacketFormatter::updateBrightness(uint8_t value) {
@@ -77,6 +78,13 @@ void RgbwPacketFormatter::updateColorWhite() {
   command(button, 0);
 }
 
+void RgbwPacketFormatter::enableNightMode() {
+  uint8_t button = STATUS_COMMAND(ON, groupId);
+
+  command(button, 0);
+  command(button | 0x10, 0);
+}
+
 void RgbwPacketFormatter::format(uint8_t const* packet, char* buffer) {
   PacketFormatter::formatV1Packet(packet, buffer);
 }

+ 8 - 7
lib/MiLight/RgbwPacketFormatter.h

@@ -1,7 +1,7 @@
 #include <PacketFormatter.h>
 
 #ifndef _RGBW_PACKET_FORMATTER_H
-#define _RGBW_PACKET_FORMATTER_H 
+#define _RGBW_PACKET_FORMATTER_H
 
 enum MiLightRgbwButton {
   RGBW_ALL_ON            = 0x01,
@@ -14,14 +14,14 @@ enum MiLightRgbwButton {
   RGBW_GROUP_3_OFF       = 0x08,
   RGBW_GROUP_4_ON        = 0x09,
   RGBW_GROUP_4_OFF       = 0x0A,
-  RGBW_SPEED_UP          = 0x0B, 
-  RGBW_SPEED_DOWN        = 0x0C, 
+  RGBW_SPEED_UP          = 0x0B,
+  RGBW_SPEED_DOWN        = 0x0C,
   RGBW_DISCO_MODE        = 0x0D,
   RGBW_BRIGHTNESS        = 0x0E,
   RGBW_COLOR             = 0x0F,
   RGBW_ALL_MAX_LEVEL     = 0x11,
   RGBW_ALL_MIN_LEVEL     = 0x12,
-  
+
   // These are the only mechanism (that I know of) to disable RGB and set the
   // color to white.
   RGBW_GROUP_1_MAX_LEVEL = 0x13,
@@ -43,7 +43,7 @@ public:
   RgbwPacketFormatter()
     : PacketFormatter(7)
   { }
-  
+
   virtual void updateStatus(MiLightStatus status, uint8_t groupId);
   virtual void updateBrightness(uint8_t value);
   virtual void command(uint8_t command, uint8_t arg);
@@ -56,8 +56,9 @@ public:
   virtual void modeSpeedUp();
   virtual void nextMode();
   virtual void updateMode(uint8_t mode);
-  
+  virtual void enableNightMode();
+
   virtual void initializePacket(uint8_t* packet);
 };
 
-#endif
+#endif

+ 4 - 0
lib/Udp/V6CctCommandHandler.cpp

@@ -44,6 +44,10 @@ bool V6CctCommandHandler::handleCommand(
         client->increaseTemperature();
         break;
 
+      case V2_CCT_NIGHT_LIGHT:
+        client->enableNightMode();
+        break;
+
       default:
         return false;
     }

+ 1 - 1
lib/Udp/V6RgbCctCommandHandler.cpp

@@ -44,7 +44,7 @@ bool V6RgbCctCommandHandler::handleCommand(
         break;
 
       case V2_RGB_NIGHT_MODE:
-        client->updateBrightness(0);
+        client->enableNightMode();
         break;
 
       case V2_RGB_CCT_SPEED_DOWN:

+ 1 - 2
lib/Udp/V6RgbwCommandHandler.cpp

@@ -43,8 +43,7 @@ bool V6RgbwCommandHandler::handleCommand(
         break;
 
       case V2_RGBW_NIGHT_LIGHT:
-        client->updateColorWhite();
-        client->updateBrightness(0);
+        client->enableNightMode();
         break;
 
       case V2_RGBW_SPEED_DOWN:

+ 4 - 0
lib/WebServer/MiLightHttpServer.cpp

@@ -383,6 +383,10 @@ void MiLightHttpServer::handleRequest(const JsonObject& request) {
       milightClient->updateColorWhite();
     }
 
+    if (request["command"] == "night_mode") {
+      milightClient->enableNightMode();
+    }
+
     if (request["command"] == "level_up") {
       milightClient->increaseBrightness();
     }