Kaynağa Gözat

move step updates into packet formatters, DRY

Chris Mullins 8 yıl önce
ebeveyn
işleme
3475c1f09b

+ 18 - 0
lib/MiLight/CctPacketFormatter.cpp

@@ -12,6 +12,24 @@ void CctPacketFormatter::initializePacket(uint8_t* packet) {
   packet[packetPtr++] = sequenceNum;
   packet[packetPtr++] = sequenceNum++;
 }
+
+void CctPacketFormatter::updateBrightness(uint8_t value) {
+  valueByStepFunction(
+    &PacketFormatter::increaseBrightness,
+    &PacketFormatter::decreaseBrightness,
+    CCT_INTERVALS,
+    value / CCT_INTERVALS
+  );
+}
+
+void CctPacketFormatter::updateTemperature(uint8_t value) {
+  valueByStepFunction(
+    &PacketFormatter::increaseTemperature,
+    &PacketFormatter::decreaseTemperature,
+    CCT_INTERVALS,
+    value / CCT_INTERVALS
+  );
+}
   
 void CctPacketFormatter::command(uint8_t command, uint8_t arg) {
   pushPacket();

+ 5 - 0
lib/MiLight/CctPacketFormatter.h

@@ -4,6 +4,7 @@
 #define _CCT_PACKET_FORMATTER_H 
 
 #define CCT_COMMAND_INDEX 4
+#define CCT_INTERVALS 10
 
 class CctPacketFormatter : public PacketFormatter {
 public:
@@ -13,8 +14,12 @@ public:
   
   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 format(uint8_t const* packet, char* buffer);

+ 19 - 36
lib/MiLight/MiLightClient.cpp

@@ -67,6 +67,14 @@ void MiLightClient::write(uint8_t packet[]) {
     return;
   }
   
+#ifdef DEBUG_PRINTF
+  printf("Sending packet: ");
+  for (int i = 0; i < currentRadio->config.getPacketLength(); i++) {
+    printf("%02X", packet[i]);
+  }
+  printf("\n");
+#endif
+  
   for (int i = 0; i < this->resendCount; i++) {
     currentRadio->getRadio()->write(packet, currentRadio->config.getPacketLength());
   }
@@ -83,24 +91,8 @@ void MiLightClient::updateHue(const uint16_t hue) {
 }
 
 void MiLightClient::updateBrightness(const uint8_t brightness) {
-  const MiLightRadioType type = currentRadio->config.type;
-  
-  if (type == CCT || type == RGB) {
-    const unsigned int oldResend = resendCount;
-    setResendCount(MILIGHT_DEFAULT_RESEND_COUNT);
-    
-    for (int i = 0; i < MILIGHT_CCT_INTERVALS; i++) {
-      decreaseBrightness();
-    }
-    for (int i = 0; i < brightness/(100/MILIGHT_CCT_INTERVALS); i++) {
-      increaseBrightness();
-    }  
-    
-    setResendCount(oldResend);
-  } else {
-    formatter->updateBrightness(brightness);
-    flushPacket();
-  }
+  formatter->updateBrightness(brightness);
+  flushPacket();
 }
     
 void MiLightClient::updateStatus(MiLightStatus status, uint8_t groupId) {
@@ -176,24 +168,8 @@ void MiLightClient::decreaseTemperature() {
 }
 
 void MiLightClient::updateTemperature(const uint8_t temperature) {
-  MiLightRadioType type = currentRadio->config.type;
-  
-  if (type == CCT) {
-    const unsigned int oldResend = resendCount;
-    setResendCount(MILIGHT_DEFAULT_RESEND_COUNT);
-    
-    for (int i = 0; i < MILIGHT_CCT_INTERVALS; i++) {
-      decreaseTemperature();
-    }
-    for (int i = 0; i < temperature/(100/MILIGHT_CCT_INTERVALS); i++) {
-      increaseTemperature();
-    }  
-    
-    setResendCount(oldResend);
-  } else {
-    formatter->updateTemperature(temperature);
-    flushPacket();
-  }
+  formatter->updateTemperature(temperature);
+  flushPacket();
 }
 
 void MiLightClient::command(uint8_t command, uint8_t arg) {
@@ -207,6 +183,12 @@ void MiLightClient::formatPacket(uint8_t* packet, char* buffer) {
     
 void MiLightClient::flushPacket() {
   PacketStream& stream = formatter->buildPackets();
+  const size_t prevNumRepeats = this->resendCount;
+  
+  // When sending multiple packets, normalize the number of repeats
+  if (stream.numPackets > 1) {
+    setResendCount(MILIGHT_DEFAULT_RESEND_COUNT);
+  }
   
   while (stream.hasNext()) {
     write(stream.next());
@@ -216,5 +198,6 @@ void MiLightClient::flushPacket() {
     }
   }
   
+  setResendCount(prevNumRepeats);
   formatter->reset();
 }

+ 2 - 1
lib/MiLight/MiLightClient.h

@@ -8,7 +8,8 @@
 #ifndef _MILIGHTCLIENT_H
 #define _MILIGHTCLIENT_H
 
-#define MILIGHT_CCT_INTERVALS 10
+// #define DEBUG_PRINTF
+
 #define MILIGHT_DEFAULT_RESEND_COUNT 10
 
 class MiLightClient {

+ 10 - 1
lib/MiLight/PacketFormatter.cpp

@@ -12,7 +12,7 @@ bool PacketStream::hasNext() {
 }
 
 uint8_t* PacketStream::next() {
-  uint8_t* packet = packetStream + (currentPacket * numPackets);
+  uint8_t* packet = packetStream + (currentPacket * packetLength);
   currentPacket++;
   return packet;
 }
@@ -66,6 +66,15 @@ PacketStream& PacketFormatter::buildPackets() {
   return packetStream;
 }
   
+void PacketFormatter::valueByStepFunction(StepFunction increase, StepFunction decrease, uint8_t numSteps, uint8_t value) {
+  for (size_t i = 0; i < numSteps; i++) {
+    (this->*decrease)();
+  }
+  
+  for (size_t i = 0; i < value; i++) {
+    (this->*increase)();
+  }
+}
 
 void PacketFormatter::prepare(uint16_t deviceId, uint8_t groupId) {
   this->deviceId = deviceId;

+ 5 - 0
lib/MiLight/PacketFormatter.h

@@ -1,5 +1,6 @@
 #include <Arduino.h>
 #include <inttypes.h>
+#include <functional>
 #include <MiLightButtons.h>
 
 #ifndef _PACKET_FORMATTER_H
@@ -25,6 +26,8 @@ public:
     delete this->packetBuffer;
   }
   
+  typedef void (PacketFormatter::*StepFunction)();
+  
   // all
   void updateStatus(MiLightStatus status);
   virtual void updateStatus(MiLightStatus status, uint8_t groupId);
@@ -77,6 +80,8 @@ protected:
   PacketStream packetStream;
   
   void pushPacket();
+  void valueByStepFunction(StepFunction increase, StepFunction decrease, uint8_t numSteps, uint8_t value);
+  
   virtual void initializePacket(uint8_t* packetStart) = 0;
   virtual void finalizePacket(uint8_t* packet);
 };

+ 9 - 0
lib/MiLight/RgbPacketFormatter.cpp

@@ -30,6 +30,15 @@ void RgbPacketFormatter::updateColorRaw(uint8_t value) {
   command(0, 0);
 }
 
+void RgbPacketFormatter::updateBrightness(uint8_t value) {
+  valueByStepFunction(
+    &PacketFormatter::increaseBrightness,
+    &PacketFormatter::decreaseBrightness,
+    RGB_INTERVALS,
+    value / RGB_INTERVALS
+  );
+}
+
 void RgbPacketFormatter::increaseBrightness() {
   command(RGB_BRIGHTNESS_UP, 0);
 }

+ 2 - 0
lib/MiLight/RgbPacketFormatter.h

@@ -5,6 +5,7 @@
 
 #define RGB_COMMAND_INDEX 4
 #define RGB_COLOR_INDEX 3
+#define RGB_INTERVALS 10
 
 enum MiLightRgbButton {
   RGB_OFF             = 0x01,
@@ -25,6 +26,7 @@ public:
   { }
   
   virtual void updateStatus(MiLightStatus status, uint8_t groupId);
+  virtual void updateBrightness(uint8_t value);
   virtual void increaseBrightness();
   virtual void decreaseBrightness();
   virtual void command(uint8_t command, uint8_t arg);