Add speed control for Hue+ and add support for Wings mode

This commit is contained in:
Adam Honse
2020-01-16 20:08:28 -06:00
parent b4de1177e5
commit 50517b5159
3 changed files with 104 additions and 107 deletions

View File

@@ -24,16 +24,17 @@ static void Sleep(unsigned int milliseconds)
HuePlusController::HuePlusController()
{
current_mode = HUE_PLUS_MODE_FIXED;
current_speed = 0;
}
HuePlusController::~HuePlusController()
{
}
void HuePlusController::Initialize(char* port_name)
void HuePlusController::Initialize(char* port)
{
strcpy(led_string, port_name);
strcpy(port_name, port);
serialport = new serial_port(port_name, HUE_PLUS_BAUD);
@@ -41,9 +42,9 @@ void HuePlusController::Initialize(char* port_name)
channel_leds[HUE_PLUS_CHANNEL_2_IDX] = GetLEDsOnChannel(HUE_PLUS_CHANNEL_2);
}
char* HuePlusController::GetLEDString()
char* HuePlusController::GetLocation()
{
return(led_string);
return(port_name);
}
unsigned int HuePlusController::GetLEDsOnChannel(unsigned int channel)
@@ -84,7 +85,13 @@ unsigned int HuePlusController::GetLEDsOnChannel(unsigned int channel)
return(ret_val);
}
void HuePlusController::SetChannelEffect(unsigned int channel, unsigned int mode, std::vector<RGBColor> colors)
void HuePlusController::SetMode(unsigned char mode, unsigned char speed)
{
current_mode = mode;
current_speed = speed;
}
void HuePlusController::SetChannelLEDs(unsigned char channel, std::vector<RGBColor> colors)
{
unsigned char serial_buf[] =
{
@@ -130,7 +137,12 @@ void HuePlusController::SetChannelEffect(unsigned int channel, unsigned int mode
/*-----------------------------------------------------*\
| Set mode in serial packet |
\*-----------------------------------------------------*/
serial_buf[0x02] = mode;
serial_buf[0x02] = current_mode;
/*-----------------------------------------------------*\
| Set speed in serial packet |
\*-----------------------------------------------------*/
serial_buf[0x04] = current_speed;
/*-----------------------------------------------------*\
| Fill in color data |
@@ -148,70 +160,4 @@ void HuePlusController::SetChannelEffect(unsigned int channel, unsigned int mode
serialport->serial_flush_tx();
Sleep(10);
}
void HuePlusController::SetChannelLEDs(unsigned int channel, std::vector<RGBColor> colors)
{
unsigned char serial_buf[] =
{
0x4B, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00
};
/*-----------------------------------------------------*\
| Set channel in serial packet |
\*-----------------------------------------------------*/
serial_buf[0x01] = channel;
/*-----------------------------------------------------*\
| Set mode in serial packet |
\*-----------------------------------------------------*/
serial_buf[0x02] = HUE_PLUS_MODE_FIXED;
/*-----------------------------------------------------*\
| Fill in color data |
\*-----------------------------------------------------*/
for (unsigned int idx = 0; idx < (colors.size() * 3); idx += 3)
{
int pixel_idx = idx / 3;
RGBColor color = colors[pixel_idx];
serial_buf[idx + 5] = RGBGetGValue(color);
serial_buf[idx + 6] = RGBGetRValue(color);
serial_buf[idx + 7] = RGBGetBValue(color);
}
serialport->serial_write((char *)serial_buf, HUE_PLUS_PACKET_SIZE);
serialport->serial_flush_tx();
Sleep(10);
}
}

View File

@@ -39,6 +39,12 @@ enum
HUE_PLUS_CHANNEL_2_IDX = 0x01, /* Channel 2 array index */
};
enum
{
HUE_PLUS_SPEED_MIN = 0x00, /* Slowest speed */
HUE_PLUS_SPEED_MAX = 0x04, /* Fastest speed */
};
enum
{
HUE_PLUS_MODE_FIXED = 0x00, /* Fixed colors mode */
@@ -51,7 +57,8 @@ enum
HUE_PLUS_MODE_BREATHING = 0x07, /* Breathing mode */
HUE_PLUS_MODE_ALERT = 0x08, /* Alert mode */
HUE_PLUS_MODE_CANDLELIGHT = 0x09, /* Candlelight mode */
HUE_PLUS_NUM_MODES /* Number of Hue Plus modes */
HUE_PLUS_MODE_WINGS = 0x0C, /* Wings mode */
HUE_PLUS_MODE_WAVE = 0x0D, /* Wave mode */
};
class HuePlusController
@@ -60,18 +67,20 @@ public:
HuePlusController();
~HuePlusController();
void Initialize(char* port_name);
char* GetLEDString();
void Initialize(char* port);
char* GetLocation();
unsigned int GetLEDsOnChannel(unsigned int channel);
void SetChannelEffect(unsigned int channel, unsigned int mode, std::vector<RGBColor> colors);
void SetChannelLEDs(unsigned int channel, std::vector<RGBColor> colors);
void SetChannelLEDs(unsigned char channel, std::vector<RGBColor> colors);
void SetMode(unsigned char mode, unsigned char speed);
unsigned int channel_leds[HUE_PLUS_NUM_CHANNELS];
private:
char led_string[1024];
char port_name[128];
serial_port *serialport;
char port_name[128];
serial_port *serialport;
unsigned char current_mode;
unsigned char current_speed;
};
#endif

View File

@@ -17,7 +17,7 @@ RGBController_HuePlus::RGBController_HuePlus(HuePlusController* hueplus_ptr)
type = DEVICE_TYPE_LEDSTRIP;
location = hueplus->GetLEDString();
location = hueplus->GetLocation();
mode Direct;
Direct.name = "Direct";
@@ -25,46 +25,68 @@ RGBController_HuePlus::RGBController_HuePlus(HuePlusController* hueplus_ptr)
Direct.flags = MODE_FLAG_HAS_COLOR | MODE_FLAG_PER_LED_COLOR;
modes.push_back(Direct);
mode Fading;
Fading.name = "Fading";
Fading.value = HUE_PLUS_MODE_FADING;
Fading.flags = MODE_FLAG_HAS_COLOR | MODE_FLAG_PER_LED_COLOR;
modes.push_back(Fading);
// Fading mode is currently disabled because it doesn't appear to work
// mode Fading;
// Fading.name = "Fading";
// Fading.value = HUE_PLUS_MODE_FADING;
// Fading.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_COLOR | MODE_FLAG_PER_LED_COLOR;
// Fading.speed_min = HUE_PLUS_SPEED_MIN;
// Fading.speed_max = HUE_PLUS_SPEED_MAX;
// Fading.speed = HUE_PLUS_SPEED_MIN;
// modes.push_back(Fading);
mode SpectrumCycle;
SpectrumCycle.name = "Spectrum Cycle";
SpectrumCycle.value = HUE_PLUS_MODE_SPECTRUM;
SpectrumCycle.flags = 0;
SpectrumCycle.name = "Spectrum Cycle";
SpectrumCycle.value = HUE_PLUS_MODE_SPECTRUM;
SpectrumCycle.flags = MODE_FLAG_HAS_SPEED;
SpectrumCycle.speed_min = HUE_PLUS_SPEED_MIN;
SpectrumCycle.speed_max = HUE_PLUS_SPEED_MAX;
SpectrumCycle.speed = HUE_PLUS_SPEED_MIN;
modes.push_back(SpectrumCycle);
mode Marquee;
Marquee.name = "Marquee";
Marquee.value = HUE_PLUS_MODE_MARQUEE;
Marquee.flags = MODE_FLAG_HAS_COLOR | MODE_FLAG_PER_LED_COLOR;
Marquee.name = "Marquee";
Marquee.value = HUE_PLUS_MODE_MARQUEE;
Marquee.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_COLOR | MODE_FLAG_PER_LED_COLOR;
Marquee.speed_min = HUE_PLUS_SPEED_MIN;
Marquee.speed_max = HUE_PLUS_SPEED_MAX;
Marquee.speed = HUE_PLUS_SPEED_MIN;
modes.push_back(Marquee);
mode CoverMarquee;
CoverMarquee.name = "Cover Marquee";
CoverMarquee.value = HUE_PLUS_MODE_COVER_MARQUEE;
CoverMarquee.flags = MODE_FLAG_HAS_COLOR | MODE_FLAG_PER_LED_COLOR;
CoverMarquee.name = "Cover Marquee";
CoverMarquee.value = HUE_PLUS_MODE_COVER_MARQUEE;
CoverMarquee.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_COLOR | MODE_FLAG_PER_LED_COLOR;
CoverMarquee.speed_min = HUE_PLUS_SPEED_MIN;
CoverMarquee.speed_max = HUE_PLUS_SPEED_MAX;
CoverMarquee.speed = HUE_PLUS_SPEED_MIN;
modes.push_back(CoverMarquee);
mode Alternating;
Alternating.name = "Alternating";
Alternating.value = HUE_PLUS_MODE_ALTERNATING;
Alternating.flags = MODE_FLAG_HAS_COLOR | MODE_FLAG_PER_LED_COLOR;
Alternating.name = "Alternating";
Alternating.value = HUE_PLUS_MODE_ALTERNATING;
Alternating.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_COLOR | MODE_FLAG_PER_LED_COLOR;
Alternating.speed_min = HUE_PLUS_SPEED_MIN;
Alternating.speed_max = HUE_PLUS_SPEED_MAX;
Alternating.speed = HUE_PLUS_SPEED_MIN;
modes.push_back(Alternating);
mode Pulsing;
Pulsing.name = "Pulsing";
Pulsing.value = HUE_PLUS_MODE_PULSING;
Pulsing.flags = MODE_FLAG_HAS_COLOR | MODE_FLAG_PER_LED_COLOR;
Pulsing.name = "Pulsing";
Pulsing.value = HUE_PLUS_MODE_PULSING;
Pulsing.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_COLOR | MODE_FLAG_PER_LED_COLOR;
Pulsing.speed_min = HUE_PLUS_SPEED_MIN;
Pulsing.speed_max = HUE_PLUS_SPEED_MAX;
Pulsing.speed = HUE_PLUS_SPEED_MIN;
modes.push_back(Pulsing);
mode Breathing;
Breathing.name = "Breathing";
Breathing.value = HUE_PLUS_MODE_BREATHING;
Breathing.flags = MODE_FLAG_HAS_COLOR | MODE_FLAG_PER_LED_COLOR;
Breathing.name = "Breathing";
Breathing.value = HUE_PLUS_MODE_BREATHING;
Breathing.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_COLOR | MODE_FLAG_PER_LED_COLOR;
Breathing.speed_min = HUE_PLUS_SPEED_MIN;
Breathing.speed_max = HUE_PLUS_SPEED_MAX;
Breathing.speed = HUE_PLUS_SPEED_MIN;
modes.push_back(Breathing);
mode Alert;
@@ -79,6 +101,25 @@ RGBController_HuePlus::RGBController_HuePlus(HuePlusController* hueplus_ptr)
Candlelight.flags = MODE_FLAG_HAS_COLOR | MODE_FLAG_PER_LED_COLOR;
modes.push_back(Candlelight);
mode Wings;
Wings.name = "Wings";
Wings.value = HUE_PLUS_MODE_WINGS;
Wings.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_COLOR | MODE_FLAG_PER_LED_COLOR;
Wings.speed_min = HUE_PLUS_SPEED_MIN;
Wings.speed_max = HUE_PLUS_SPEED_MAX;
Wings.speed = HUE_PLUS_SPEED_MIN;
modes.push_back(Wings);
// Wave mode is currently disabled because it doesn't appear to work
// mode Wave;
// Wave.name = "Wave";
// Wave.value = HUE_PLUS_MODE_WAVE;
// Wave.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_COLOR | MODE_FLAG_PER_LED_COLOR;
// Wave.speed_min = HUE_PLUS_SPEED_MIN;
// Wave.speed_max = HUE_PLUS_SPEED_MAX;
// Wave.speed = HUE_PLUS_SPEED_MIN;
// modes.push_back(Wave);
/*-------------------------------------------------*\
| Set size of colors array |
\*-------------------------------------------------*/
@@ -156,7 +197,8 @@ void RGBController_HuePlus::SetMode(int mode)
if(channel_colors.size() > 0)
{
hueplus->SetChannelEffect(channel, modes[mode].value, channel_colors);
hueplus->SetMode(modes[mode].value, modes[mode].speed);
hueplus->SetChannelLEDs(channel, channel_colors);
}
}
}