Przeglądaj źródła

formatter can return stream of packets

Chris Mullins 8 lat temu
rodzic
commit
4ec85acdaa

+ 3 - 2
lib/MiLight/CctPacketFormatter.cpp

@@ -1,7 +1,7 @@
 #include <CctPacketFormatter.h>
 #include <MiLightButtons.h>
 
-void CctPacketFormatter::reset() {
+void CctPacketFormatter::initializePacket(uint8_t* packet) {
   size_t packetPtr = 0;
   
   packet[packetPtr++] = CCT;
@@ -14,7 +14,8 @@ void CctPacketFormatter::reset() {
 }
   
 void CctPacketFormatter::command(uint8_t command, uint8_t arg) {
-  packet[CCT_COMMAND_INDEX] = command;
+  pushPacket();
+  currentPacket[CCT_COMMAND_INDEX] = command;
 }
 
 void CctPacketFormatter::updateStatus(MiLightStatus status, uint8_t groupId) {

+ 2 - 2
lib/MiLight/CctPacketFormatter.h

@@ -8,7 +8,7 @@
 class CctPacketFormatter : public PacketFormatter {
 public:
   CctPacketFormatter()
-    : PacketFormatter(7)
+    : PacketFormatter(7, 20)
   { }
   
   virtual void updateStatus(MiLightStatus status, uint8_t groupId);
@@ -19,7 +19,7 @@ public:
   virtual void decreaseBrightness();
   virtual void format(uint8_t const* packet, char* buffer);
   
-  virtual void reset();
+  virtual void initializePacket(uint8_t* packet);
   
   static uint8_t getCctStatusButton(uint8_t groupId, MiLightStatus status);
 };

+ 15 - 1
lib/MiLight/MiLightClient.cpp

@@ -206,6 +206,20 @@ void MiLightClient::formatPacket(uint8_t* packet, char* buffer) {
 }
     
 void MiLightClient::flushPacket() {
-  write(formatter->buildPacket());
+  Serial.print("Flushing packets");
+  
+  PacketStream& stream = formatter->buildPackets();
+  
+  while (stream.hasNext()) {
+    Serial.print(".");
+    write(stream.next());
+    
+    if (stream.hasNext()) {
+      delay(10);
+    }
+  }
+  
+  Serial.println();
+  
   formatter->reset();
 }

+ 57 - 2
lib/MiLight/PacketFormatter.cpp

@@ -1,5 +1,34 @@
 #include <PacketFormatter.h>
 
+PacketStream::PacketStream()
+    : packetStream(NULL),
+      numPackets(0),
+      packetLength(0),
+      currentPacket(0)
+  { }
+  
+bool PacketStream::hasNext() {
+  return currentPacket < numPackets;
+}
+
+uint8_t* PacketStream::next() {
+  uint8_t* packet = packetStream + (currentPacket * numPackets);
+  currentPacket++;
+  return packet;
+}
+
+PacketFormatter::PacketFormatter(const size_t packetLength, const size_t maxPackets)
+  : packetLength(packetLength),
+    packetBuffer(new uint8_t[packetLength * maxPackets]),
+    numPackets(0),
+    currentPacket(NULL)
+{ 
+  packetStream.packetLength = packetLength;
+  packetStream.packetStream = packetBuffer;
+}
+  
+void PacketFormatter::finalizePacket(uint8_t* packet) { }
+  
 void PacketFormatter::updateStatus(MiLightStatus status) { 
   updateStatus(status, groupId);
 }
@@ -23,9 +52,20 @@ void PacketFormatter::decreaseBrightness() { }
 void PacketFormatter::updateTemperature(uint8_t value) { }
 void PacketFormatter::updateSaturation(uint8_t value) { }
   
-uint8_t* PacketFormatter::buildPacket() {
-  return this->packet;
+void PacketFormatter::pair() { }
+void PacketFormatter::unpair() { }
+  
+PacketStream& PacketFormatter::buildPackets() {
+  if (numPackets > 0) {
+    finalizePacket(currentPacket);
+  }
+  
+  packetStream.numPackets = numPackets;
+  packetStream.currentPacket = 0;
+  
+  return packetStream;
 }
+  
 
 void PacketFormatter::prepare(uint16_t deviceId, uint8_t groupId) {
   this->deviceId = deviceId;
@@ -33,6 +73,21 @@ void PacketFormatter::prepare(uint16_t deviceId, uint8_t groupId) {
   reset();
 }
 
+void PacketFormatter::reset() {
+  this->numPackets = 0;
+  this->currentPacket = currentPacket;
+}
+
+void PacketFormatter::pushPacket() {
+  if (numPackets > 0) {
+    finalizePacket(currentPacket);
+  }
+  
+  currentPacket = packetBuffer + (numPackets * packetLength);
+  numPackets++;
+  initializePacket(currentPacket);
+}
+
 void PacketFormatter::format(uint8_t const* packet, char* buffer) {
   for (int i = 0; i < packetLength; i++) {
     sprintf(buffer, "%02X ", packet[i]);

+ 26 - 8
lib/MiLight/PacketFormatter.h

@@ -5,15 +5,24 @@
 #ifndef _PACKET_FORMATTER_H
 #define _PACKET_FORMATTER_H 
 
+struct PacketStream {
+  PacketStream();
+  
+  uint8_t* next();
+  bool hasNext();
+  
+  uint8_t* packetStream;
+  size_t numPackets;
+  size_t packetLength;
+  size_t currentPacket;
+};
+
 class PacketFormatter {
 public:
-  PacketFormatter(const size_t packetLength) 
-    : packetLength(packetLength),
-      packet(new uint8_t[packetLength])
-  { }
+  PacketFormatter(const size_t packetLength, const size_t maxPackets = 1);
   
   ~PacketFormatter() {
-    delete this->packet;
+    delete this->packetBuffer;
   }
   
   // all
@@ -24,6 +33,8 @@ public:
   virtual void updateMode(uint8_t value);
   virtual void modeSpeedDown();
   virtual void modeSpeedUp();
+  virtual void pair();
+  virtual void unpair();
   
   // rgbw, rgb+cct
   virtual void updateHue(uint16_t value);
@@ -40,9 +51,9 @@ public:
   virtual void updateTemperature(uint8_t value);
   virtual void updateSaturation(uint8_t value);
   
-  virtual void reset() = 0;
+  virtual void reset();
   
-  virtual uint8_t* buildPacket();
+  virtual PacketStream& buildPackets();
   virtual void prepare(uint16_t deviceId, uint8_t groupId);
   virtual void format(uint8_t const* packet, char* buffer);
   
@@ -56,11 +67,18 @@ public:
   size_t getPacketLength() const;
   
 protected:
-  uint8_t* packet;
+  uint8_t* packetBuffer;
+  uint8_t* currentPacket;
   size_t packetLength;
   uint16_t deviceId;
   uint8_t groupId;
   uint8_t sequenceNum;
+  size_t numPackets;
+  PacketStream packetStream;
+  
+  void pushPacket();
+  virtual void initializePacket(uint8_t* packetStart) = 0;
+  virtual void finalizePacket(uint8_t* packet);
 };
 
 #endif

+ 5 - 5
lib/MiLight/RgbCctPacketFormatter.cpp

@@ -17,7 +17,7 @@ uint8_t const RgbCctPacketFormatter::V2_OFFSETS[][4] = {
   { 0xE1, 0x93, 0xB8, 0xE4 }
 };
 
-void RgbCctPacketFormatter::reset() {
+void RgbCctPacketFormatter::initializePacket(uint8_t* packet) {
   size_t packetPtr = 0;
   
   // Always encode with 0x00 key. No utility in varying it.
@@ -34,8 +34,9 @@ void RgbCctPacketFormatter::reset() {
 }
   
 void RgbCctPacketFormatter::command(uint8_t command, uint8_t arg) {
-  packet[RGB_CCT_COMMAND_INDEX] = command;
-  packet[RGB_CCT_ARGUMENT_INDEX] = arg;
+  pushPacket();
+  currentPacket[RGB_CCT_COMMAND_INDEX] = command;
+  currentPacket[RGB_CCT_ARGUMENT_INDEX] = arg;
 }
 
 void RgbCctPacketFormatter::updateStatus(MiLightStatus status, uint8_t groupId) {
@@ -68,9 +69,8 @@ void RgbCctPacketFormatter::updateColorWhite() {
   updateTemperature(0);
 }
   
-uint8_t* RgbCctPacketFormatter::buildPacket() {
+void RgbCctPacketFormatter::finalizePacket(uint8_t* packet) {
   encodeV2Packet(packet);
-  return packet;
 }
 
 uint8_t RgbCctPacketFormatter::xorKey(uint8_t key) {

+ 2 - 2
lib/MiLight/RgbCctPacketFormatter.h

@@ -15,7 +15,7 @@ public:
     : PacketFormatter(9)
   { }
   
-  virtual void reset();
+  virtual void initializePacket(uint8_t* packet);
   
   virtual void updateStatus(MiLightStatus status, uint8_t group);
   virtual void updateBrightness(uint8_t value);
@@ -27,7 +27,7 @@ public:
   virtual void updateSaturation(uint8_t value);
   virtual void format(uint8_t const* packet, char* buffer);
   
-  virtual uint8_t* buildPacket();
+  virtual void finalizePacket(uint8_t* packet);
     
   static void encodeV2Packet(uint8_t* packet);
   static void decodeV2Packet(uint8_t* packet);

+ 4 - 3
lib/MiLight/RgbPacketFormatter.cpp

@@ -1,6 +1,6 @@
 #include <RgbPacketFormatter.h>
 
-void RgbPacketFormatter::reset() {
+void RgbPacketFormatter::initializePacket(uint8_t *packet) {
   size_t packetPtr = 0;
   
   packet[packetPtr++] = RGB;
@@ -16,7 +16,8 @@ void RgbPacketFormatter::updateStatus(MiLightStatus status, uint8_t groupId) {
 }
 
 void RgbPacketFormatter::command(uint8_t command, uint8_t arg) {
-  packet[RGB_COMMAND_INDEX] = command;
+  pushPacket();
+  currentPacket[RGB_COMMAND_INDEX] = command;
 }
   
 void RgbPacketFormatter::updateHue(uint16_t value) {
@@ -25,7 +26,7 @@ void RgbPacketFormatter::updateHue(uint16_t value) {
 }
 
 void RgbPacketFormatter::updateColorRaw(uint8_t value) {
-  packet[RGB_COLOR_INDEX] = value;
+  currentPacket[RGB_COLOR_INDEX] = value;
   command(0, 0);
 }
 

+ 4 - 3
lib/MiLight/RgbPacketFormatter.h

@@ -14,13 +14,14 @@ enum MiLightRgbButton {
   RGB_SPEED_UP        = 0x05,
   RGB_SPEED_DOWN      = 0x06,
   RGB_MODE_UP         = 0x07,
-  RGB_MODE_DOWN       = 0x08
+  RGB_MODE_DOWN       = 0x08,
+  RGB_PAIR            = RGB_SPEED_UP
 };
 
 class RgbPacketFormatter : public PacketFormatter {
 public:
   RgbPacketFormatter()
-    : PacketFormatter(6)
+    : PacketFormatter(6, 20)
   { }
   
   virtual void updateStatus(MiLightStatus status, uint8_t groupId);
@@ -31,7 +32,7 @@ public:
   virtual void updateColorRaw(uint8_t value);
   virtual void format(uint8_t const* packet, char* buffer);
   
-  virtual void reset();
+  virtual void initializePacket(uint8_t* packet);
 };
 
 #endif

+ 6 - 5
lib/MiLight/RgbwPacketFormatter.cpp

@@ -1,7 +1,7 @@
 #include <RgbwPacketFormatter.h>
 #include <MiLightButtons.h>
 
-void RgbwPacketFormatter::reset() {
+void RgbwPacketFormatter::initializePacket(uint8_t* packet) {
   size_t packetPtr = 0;
   
   packet[packetPtr++] = RGBW;
@@ -15,7 +15,7 @@ void RgbwPacketFormatter::reset() {
 
 void RgbwPacketFormatter::updateStatus(MiLightStatus status, uint8_t groupId) {
   uint8_t button = RGBW_GROUP_1_ON + ((groupId - 1)*2) + status;
-  packet[RGBW_COMMAND_INDEX] = button;
+  command(button, 0);
 }
   
 void RgbwPacketFormatter::updateBrightness(uint8_t value) {
@@ -29,11 +29,12 @@ void RgbwPacketFormatter::updateBrightness(uint8_t value) {
   );
   
   command(RGBW_BRIGHTNESS, 0);
-  packet[RGBW_BRIGHTNESS_GROUP_INDEX] |= (packetBrightnessValue << 3);
+  currentPacket[RGBW_BRIGHTNESS_GROUP_INDEX] |= (packetBrightnessValue << 3);
 }
 
 void RgbwPacketFormatter::command(uint8_t command, uint8_t arg) {
-  packet[RGBW_COMMAND_INDEX] = command;
+  pushPacket();
+  currentPacket[RGBW_COMMAND_INDEX] = command;
 }
   
 void RgbwPacketFormatter::updateHue(uint16_t value) {
@@ -42,7 +43,7 @@ void RgbwPacketFormatter::updateHue(uint16_t value) {
 }
 
 void RgbwPacketFormatter::updateColorRaw(uint8_t value) {
-  packet[RGBW_COLOR_INDEX] = value;
+  currentPacket[RGBW_COLOR_INDEX] = value;
   command(RGBW_COLOR, 0);
 }
 

+ 1 - 1
lib/MiLight/RgbwPacketFormatter.h

@@ -21,7 +21,7 @@ public:
   virtual void updateColorWhite();
   virtual void format(uint8_t const* packet, char* buffer);
   
-  virtual void reset();
+  virtual void initializePacket(uint8_t* packet);
 };
 
 #endif