diff --git a/Controllers/HuePlusController/HuePlusController.cpp b/Controllers/HuePlusController/HuePlusController.cpp index 7ade9a02d..a53d3aa67 100644 --- a/Controllers/HuePlusController/HuePlusController.cpp +++ b/Controllers/HuePlusController/HuePlusController.cpp @@ -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 colors) +void HuePlusController::SetMode(unsigned char mode, unsigned char speed) +{ + current_mode = mode; + current_speed = speed; +} + +void HuePlusController::SetChannelLEDs(unsigned char channel, std::vector 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 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); -} +} \ No newline at end of file diff --git a/Controllers/HuePlusController/HuePlusController.h b/Controllers/HuePlusController/HuePlusController.h index 41e62ab35..fa5ce65de 100644 --- a/Controllers/HuePlusController/HuePlusController.h +++ b/Controllers/HuePlusController/HuePlusController.h @@ -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 colors); - void SetChannelLEDs(unsigned int channel, std::vector colors); + void SetChannelLEDs(unsigned char channel, std::vector 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 diff --git a/RGBController/RGBController_HuePlus.cpp b/RGBController/RGBController_HuePlus.cpp index ef9cb3166..fcd6bb923 100644 --- a/RGBController/RGBController_HuePlus.cpp +++ b/RGBController/RGBController_HuePlus.cpp @@ -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); } } }