소스 검색

support for brightness, kelvin, saturation

Chris Mullins 8 년 전
부모
커밋
6a80bc111d
3개의 변경된 파일29개의 추가작업 그리고 8개의 파일을 삭제
  1. 2 2
      lib/MiLight/PacketFormatter.h
  2. 22 6
      lib/MiLight/RgbCctPacketFormatter.cpp
  3. 5 0
      lib/MiLight/RgbCctPacketFormatter.h

+ 2 - 2
lib/MiLight/PacketFormatter.h

@@ -71,8 +71,8 @@ public:
 
   static void formatV1Packet(uint8_t const* packet, char* buffer);
 
-  template <typename T>
-  static T rescale(T value, uint8_t newMax, float oldMax = 255.0) {
+  template <typename T, typename V>
+  static T rescale(T value, V newMax, float oldMax = 255.0) {
     return round(value * (newMax / oldMax));
   }
 

+ 22 - 6
lib/MiLight/RgbCctPacketFormatter.cpp

@@ -76,7 +76,7 @@ void RgbCctPacketFormatter::previousMode() {
 }
 
 void RgbCctPacketFormatter::updateBrightness(uint8_t brightness) {
-  command(RGB_CCT_BRIGHTNESS, 0x8F + brightness);
+  command(RGB_CCT_BRIGHTNESS, RGB_CCT_BRIGHTNESS_OFFSET + brightness);
 }
 
 void RgbCctPacketFormatter::updateHue(uint16_t value) {
@@ -85,15 +85,15 @@ void RgbCctPacketFormatter::updateHue(uint16_t value) {
 }
 
 void RgbCctPacketFormatter::updateColorRaw(uint8_t value) {
-  command(RGB_CCT_COLOR, 0x5F + value);
+  command(RGB_CCT_COLOR, RGB_CCT_COLOR_OFFSET + value);
 }
 
 void RgbCctPacketFormatter::updateTemperature(uint8_t value) {
-  command(RGB_CCT_KELVIN, 0x94 - (value*2));
+  command(RGB_CCT_KELVIN, RGB_CCT_KELVIN_OFFSET - (value*2));
 }
 
 void RgbCctPacketFormatter::updateSaturation(uint8_t value) {
-  uint8_t remapped = value + 0xD;
+  uint8_t remapped = value + RGB_CCT_SATURATION_OFFSET;
   command(RGB_CCT_SATURATION, remapped);
 }
 
@@ -119,10 +119,11 @@ void RgbCctPacketFormatter::parsePacket(const uint8_t *packet, JsonObject& resul
   result["group_id"] = packetCopy[7];
   result["device_type"] = "rgb_cct";
 
-  uint8_t command = packetCopy[RGB_CCT_COMMAND_INDEX];
+  uint8_t command = (packetCopy[RGB_CCT_COMMAND_INDEX] & 0x7F);
   uint8_t arg = packetCopy[RGB_CCT_ARGUMENT_INDEX];
 
-  if ((command & 0x7F) == RGB_CCT_ON) {
+  if (command == RGB_CCT_ON) {
+    // Group is not reliably encoded in group byte. Extract from arg byte
     if (arg < 5) {
       result["status"] = "on";
       result["group_id"] = arg;
@@ -130,6 +131,21 @@ void RgbCctPacketFormatter::parsePacket(const uint8_t *packet, JsonObject& resul
       result["status"] = "off";
       result["group_id"] = arg-5;
     }
+  } else if (command == RGB_CCT_COLOR) {
+    uint8_t rescaledColor = (arg - RGB_CCT_COLOR_OFFSET) % 0x100;
+    uint16_t hue = rescale<uint16_t, uint16_t>(rescaledColor, 360, 255.0);
+    result["hue"] = hue;
+  } else if (command == RGB_CCT_KELVIN) {
+    uint8_t temperature = RGB_CCT_KELVIN_OFFSET;
+    temperature -= arg;
+    temperature /= 2;
+    printf("Temperature: %d -> %u\n", arg, temperature);
+    result["temperature"] = temperature;
+  // brightness == saturation
+  } else if (command == RGB_CCT_BRIGHTNESS && arg >= RGB_CCT_BRIGHTNESS_OFFSET) {
+    result["level"] = constrain(arg - RGB_CCT_BRIGHTNESS_OFFSET, 0, 100);
+  } else if (command == RGB_CCT_SATURATION) {
+    result["saturation"] = constrain(arg - RGB_CCT_SATURATION_OFFSET, 0, 100);
   }
 }
 

+ 5 - 0
lib/MiLight/RgbCctPacketFormatter.h

@@ -6,6 +6,11 @@
 #define V2_OFFSET_JUMP_START 0x54
 #define RGB_CCT_PACKET_LEN 9
 
+#define RGB_CCT_COLOR_OFFSET 0x5F
+#define RGB_CCT_BRIGHTNESS_OFFSET 0x8F
+#define RGB_CCT_SATURATION_OFFSET 0xD
+#define RGB_CCT_KELVIN_OFFSET 0x94
+
 #ifndef _RGB_CCT_PACKET_FORMATTER_H
 #define _RGB_CCT_PACKET_FORMATTER_H