소스 검색

v6 udp rgb commands

Chris Mullins 8 년 전
부모
커밋
a954b53102
2개의 변경된 파일59개의 추가작업 그리고 5개의 파일을 삭제
  1. 45 4
      lib/Udp/V6MiLightUdpServer.cpp
  2. 14 1
      lib/Udp/V6MiLightUdpServer.h

+ 45 - 4
lib/Udp/V6MiLightUdpServer.cpp

@@ -126,8 +126,49 @@ void V6MiLightUdpServer::sendResponse(uint16_t sessionId, uint8_t* responseBuffe
   socket.endPacket();
 }
 
-bool V6MiLightUdpServer::handleV1BulbCommand(uint8_t group, uint32_t _cmd, uint32_t _arg) {
-  // Makes more sense to use V5 protocol for now.
+bool V6MiLightUdpServer::handleRgbBulbCommand(uint8_t group, uint32_t _cmd, uint32_t _arg) {
+  const uint8_t cmd = _cmd & 0xFF;
+  const uint8_t arg = _arg >> 24;
+  
+  client->prepare(MilightRgbConfig, deviceId, 0);
+  
+  if (cmd == V2_RGB_COMMAND_PREFIX) {
+    switch (arg) {
+      case V2_RGB_ON:
+        client->updateStatus(ON);
+        break;
+        
+      case V2_RGB_OFF:
+        client->updateStatus(OFF);
+        break;
+        
+      case V2_RGB_BRIGHTNESS_DOWN:
+        client->decreaseBrightness();
+        break;
+        
+      case V2_RGB_BRIGHTNESS_UP:
+        client->increaseBrightness();
+        break;
+        
+      case V2_RGB_MODE_DOWN:
+        client->previousMode();
+        break;
+        
+      case V2_RGB_MODE_UP:
+        client->nextMode();
+        break;
+        
+      case V2_RGB_SPEED_DOWN:
+        client->modeSpeedDown();
+        break;
+        
+      case V2_RGB_SPEED_UP:
+        client->modeSpeedUp();
+        break;
+    }
+  } else if (cmd == V2_RGB_COLOR_PREFIX) {
+    client->updateColorRaw(arg);
+  }
 }
 
 bool V6MiLightUdpServer::handleV2BulbCommand(uint8_t group, uint32_t _cmd, uint32_t _arg) {
@@ -190,8 +231,8 @@ void V6MiLightUdpServer::handleCommand(
   
   if ((cmdHeader & 0x0800) == 0x0800) {
     handled = handleV2BulbCommand(group, cmdHeader, cmdArg);
-  } else if ((cmdHeader & 0x0700) == 0x0700) {
-    handled = handleV1BulbCommand(group, cmdHeader, cmdArg);
+  } else if ((cmdHeader & 0x0500) == 0x0500) {
+    handled = handleRgbBulbCommand(group, cmdHeader, cmdArg);
   }
   
   if (handled) {

+ 14 - 1
lib/Udp/V6MiLightUdpServer.h

@@ -21,6 +21,19 @@ enum V2CommandIds {
   V2_KELVIN = 0x05
 };
 
+enum RgbCommandIds {
+  V2_RGB_COMMAND_PREFIX  = 0x02,
+  V2_RGB_COLOR_PREFIX    = 0x01,
+  V2_RGB_BRIGHTNESS_DOWN = 0x01,
+  V2_RGB_BRIGHTNESS_UP   = 0x02,
+  V2_RGB_SPEED_DOWN      = 0x03,
+  V2_RGB_SPEED_UP        = 0x04,
+  V2_RGB_MODE_DOWN       = 0x05,
+  V2_RGB_MODE_UP         = 0x06,
+  V2_RGB_ON              = 0x09,
+  V2_RGB_OFF             = 0x0A
+};
+
 struct V6Session {
   V6Session(IPAddress ipAddr, uint16_t port, uint16_t sessionId)
     : ipAddr(ipAddr),
@@ -81,7 +94,7 @@ protected:
     uint8_t checksum
   );
   
-  bool handleV1BulbCommand(
+  bool handleRgbBulbCommand(
     uint8_t group,
     uint32_t cmd,
     uint32_t cmdArg