diff --git a/Controllers/RazerController/RGBController_RazerKraken.cpp b/Controllers/RazerController/RGBController_RazerKraken.cpp index 2db5f4f15..f99100dd8 100644 --- a/Controllers/RazerController/RGBController_RazerKraken.cpp +++ b/Controllers/RazerController/RGBController_RazerKraken.cpp @@ -37,16 +37,25 @@ RGBController_RazerKraken::RGBController_RazerKraken(RazerKrakenController* cont Static.colors.resize(1); modes.push_back(Static); - // Breathing disabled, not yet implemented - //mode Breathing; - //Breathing.name = "Breathing"; - //Breathing.value = RAZER_KRAKEN_MODE_BREATHING; - //Breathing.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_RANDOM_COLOR; - //Breathing.color_mode = MODE_COLORS_MODE_SPECIFIC; - //Breathing.colors_min = 1; - //Breathing.colors_max = 2; - //Breathing.colors.resize(1); - //modes.push_back(Breathing); + mode Breathing; + Breathing.name = "Breathing"; + Breathing.value = RAZER_KRAKEN_MODE_BREATHING; + Breathing.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR; + Breathing.color_mode = MODE_COLORS_MODE_SPECIFIC; + Breathing.colors_min = 1; + /*---------------------------------------------------------*\ + | Razer Kraken 7.1 Chroma only does single color breathing | + \*---------------------------------------------------------*/ + if(device_list[controller->GetDeviceIndex()]->pid == RAZER_KRAKEN_PID) + { + Breathing.colors_max = 1; + } + else + { + Breathing.colors_max = 3; + } + Breathing.colors.resize(1); + modes.push_back(Breathing); mode SpectrumCycle; SpectrumCycle.name = "Spectrum Cycle"; @@ -187,17 +196,56 @@ void RGBController_RazerKraken::DeviceUpdateMode() break; case RAZER_KRAKEN_MODE_STATIC: - if(modes[active_mode].colors.size() == 1) + if(modes[active_mode].color_mode == MODE_COLORS_MODE_SPECIFIC) { - unsigned char red = RGBGetRValue(modes[active_mode].colors[0]); - unsigned char grn = RGBGetGValue(modes[active_mode].colors[0]); - unsigned char blu = RGBGetBValue(modes[active_mode].colors[0]); + if(modes[active_mode].colors.size() == 1) + { + unsigned char red = RGBGetRValue(modes[active_mode].colors[0]); + unsigned char grn = RGBGetGValue(modes[active_mode].colors[0]); + unsigned char blu = RGBGetBValue(modes[active_mode].colors[0]); - controller->SetModeStatic(red, grn, blu); + controller->SetModeStatic(red, grn, blu); + } } break; case RAZER_KRAKEN_MODE_BREATHING: + if(modes[active_mode].color_mode == MODE_COLORS_MODE_SPECIFIC) + { + if(modes[active_mode].colors.size() == 1) + { + unsigned char red = RGBGetRValue(modes[active_mode].colors[0]); + unsigned char grn = RGBGetGValue(modes[active_mode].colors[0]); + unsigned char blu = RGBGetBValue(modes[active_mode].colors[0]); + + controller->SetModeBreathingOneColor(red, grn, blu); + } + else if(modes[active_mode].colors.size() == 2) + { + unsigned char red1 = RGBGetRValue(modes[active_mode].colors[0]); + unsigned char grn1 = RGBGetGValue(modes[active_mode].colors[0]); + unsigned char blu1 = RGBGetBValue(modes[active_mode].colors[0]); + unsigned char red2 = RGBGetRValue(modes[active_mode].colors[1]); + unsigned char grn2 = RGBGetGValue(modes[active_mode].colors[1]); + unsigned char blu2 = RGBGetBValue(modes[active_mode].colors[1]); + + controller->SetModeBreathingTwoColors(red1, grn1, blu1, red2, grn2, blu2); + } + else if(modes[active_mode].colors.size() == 3) + { + unsigned char red1 = RGBGetRValue(modes[active_mode].colors[0]); + unsigned char grn1 = RGBGetGValue(modes[active_mode].colors[0]); + unsigned char blu1 = RGBGetBValue(modes[active_mode].colors[0]); + unsigned char red2 = RGBGetRValue(modes[active_mode].colors[1]); + unsigned char grn2 = RGBGetGValue(modes[active_mode].colors[1]); + unsigned char blu2 = RGBGetBValue(modes[active_mode].colors[1]); + unsigned char red3 = RGBGetRValue(modes[active_mode].colors[2]); + unsigned char grn3 = RGBGetGValue(modes[active_mode].colors[2]); + unsigned char blu3 = RGBGetBValue(modes[active_mode].colors[2]); + + controller->SetModeBreathingThreeColors(red1, grn1, blu1, red2, grn2, blu2, red3, grn3, blu3); + } + } break; case RAZER_KRAKEN_MODE_SPECTRUM_CYCLE: diff --git a/Controllers/RazerController/RazerKrakenController.cpp b/Controllers/RazerController/RazerKrakenController.cpp index c08ba9875..3245f0bd4 100644 --- a/Controllers/RazerController/RazerKrakenController.cpp +++ b/Controllers/RazerController/RazerKrakenController.cpp @@ -95,6 +95,21 @@ std::string RazerKrakenController::GetSerialString() return(razer_get_serial()); } +void RazerKrakenController::SetModeBreathingOneColor(unsigned char red, unsigned char grn, unsigned char blu) +{ + razer_set_mode_breathing_one_color(red, grn, blu); +} + +void RazerKrakenController::SetModeBreathingTwoColors(unsigned char r1, unsigned char g1, unsigned char b1, unsigned char r2, unsigned char g2, unsigned char b2) +{ + razer_set_mode_breathing_two_colors(r1, g1, b1, r2, g2, b2); +} + +void RazerKrakenController::SetModeBreathingThreeColors(unsigned char r1, unsigned char g1, unsigned char b1, unsigned char r2, unsigned char g2, unsigned char b2, unsigned char r3, unsigned char g3, unsigned char b3) +{ + razer_set_mode_breathing_three_colors(r1, g1, b1, r2, g2, b2, r3, g3, b3); +} + void RazerKrakenController::SetModeCustom(unsigned char red, unsigned char grn, unsigned char blu) { razer_set_mode_custom(red, grn, blu); @@ -140,6 +155,15 @@ razer_kraken_request_report RazerKrakenController::razer_kraken_create_report(un return new_report; } +razer_kraken_effect_byte RazerKrakenController::razer_kraken_create_effect_byte() +{ + razer_kraken_effect_byte effect_byte; + + memset(&effect_byte, 0, sizeof(razer_kraken_effect_byte)); + + return effect_byte; +} + /*---------------------------------------------------------------------------------*\ | Get functions (request information from device) | \*---------------------------------------------------------------------------------*/ @@ -188,11 +212,86 @@ std::string RazerKrakenController::razer_get_serial() | Set functions (send information to device) | \*---------------------------------------------------------------------------------*/ +void RazerKrakenController::razer_set_mode_breathing_one_color(unsigned char red, unsigned char grn, unsigned char blu) +{ + razer_kraken_request_report rgb_report = razer_kraken_create_report(0x04, 0x40, 0x03, breathing_address[0]); + razer_kraken_request_report effect_report = razer_kraken_create_report(0x04, 0x40, 0x01, led_mode_address); + razer_kraken_effect_byte effect_byte = razer_kraken_create_effect_byte(); + + rgb_report.arguments[0] = red; + rgb_report.arguments[1] = grn; + rgb_report.arguments[2] = blu; + + effect_byte.bits.on_off_static = 1; + effect_byte.bits.single_colour_breathing = 1; + effect_byte.bits.sync = 1; + effect_report.arguments[0] = effect_byte.value; + + razer_usb_send(&rgb_report); + razer_usb_send(&effect_report); +} + +void RazerKrakenController::razer_set_mode_breathing_two_colors(unsigned char r1, unsigned char g1, unsigned char b1, unsigned char r2, unsigned char g2, unsigned char b2) +{ + razer_kraken_request_report rgb_report_1 = razer_kraken_create_report(0x04, 0x40, 0x03, breathing_address[1]); + razer_kraken_request_report rgb_report_2 = razer_kraken_create_report(0x04, 0x40, 0x03, breathing_address[1] + 4); + razer_kraken_request_report effect_report = razer_kraken_create_report(0x04, 0x40, 0x01, led_mode_address); + razer_kraken_effect_byte effect_byte = razer_kraken_create_effect_byte(); + + rgb_report_1.arguments[0] = r1; + rgb_report_1.arguments[1] = g1; + rgb_report_1.arguments[2] = b1; + + rgb_report_2.arguments[0] = r2; + rgb_report_2.arguments[1] = g2; + rgb_report_2.arguments[2] = b2; + + effect_byte.bits.on_off_static = 1; + effect_byte.bits.two_colour_breathing = 1; + effect_byte.bits.sync = 1; + effect_report.arguments[0] = effect_byte.value; + + razer_usb_send(&rgb_report_1); + razer_usb_send(&rgb_report_2); + razer_usb_send(&effect_report); +} + +void RazerKrakenController::razer_set_mode_breathing_three_colors(unsigned char r1, unsigned char g1, unsigned char b1, unsigned char r2, unsigned char g2, unsigned char b2, unsigned char r3, unsigned char g3, unsigned char b3) +{ + razer_kraken_request_report rgb_report_1 = razer_kraken_create_report(0x04, 0x40, 0x03, breathing_address[1]); + razer_kraken_request_report rgb_report_2 = razer_kraken_create_report(0x04, 0x40, 0x03, breathing_address[1] + 4); + razer_kraken_request_report rgb_report_3 = razer_kraken_create_report(0x04, 0x40, 0x03, breathing_address[1] + 8); + razer_kraken_request_report effect_report = razer_kraken_create_report(0x04, 0x40, 0x01, led_mode_address); + razer_kraken_effect_byte effect_byte = razer_kraken_create_effect_byte(); + + rgb_report_1.arguments[0] = r1; + rgb_report_1.arguments[1] = g1; + rgb_report_1.arguments[2] = b1; + + rgb_report_2.arguments[0] = r2; + rgb_report_2.arguments[1] = g2; + rgb_report_2.arguments[2] = b2; + + rgb_report_3.arguments[0] = r3; + rgb_report_3.arguments[1] = g3; + rgb_report_3.arguments[2] = b3; + + effect_byte.bits.on_off_static = 1; + effect_byte.bits.three_colour_breathing = 1; + effect_byte.bits.sync = 1; + effect_report.arguments[0] = effect_byte.value; + + razer_usb_send(&rgb_report_1); + razer_usb_send(&rgb_report_2); + razer_usb_send(&rgb_report_3); + razer_usb_send(&effect_report); +} + void RazerKrakenController::razer_set_mode_custom(unsigned char red, unsigned char grn, unsigned char blu) { razer_kraken_request_report rgb_report = razer_kraken_create_report(0x04, 0x40, 3, custom_address); razer_kraken_request_report effect_report = razer_kraken_create_report(0x04, 0x40, 0x01, led_mode_address); - razer_kraken_effect_byte effect_byte; + razer_kraken_effect_byte effect_byte = razer_kraken_create_effect_byte(); effect_byte.value = 0; @@ -219,7 +318,7 @@ void RazerKrakenController::razer_set_mode_custom(unsigned char red, unsigned ch void RazerKrakenController::razer_set_mode_none() { razer_kraken_request_report report = razer_kraken_create_report(0x04, 0x40, 0x01, led_mode_address); - razer_kraken_effect_byte effect_byte; + razer_kraken_effect_byte effect_byte = razer_kraken_create_effect_byte(); effect_byte.value = 0; @@ -234,7 +333,7 @@ void RazerKrakenController::razer_set_mode_none() void RazerKrakenController::razer_set_mode_spectrum_cycle() { razer_kraken_request_report report = razer_kraken_create_report(0x04, 0x40, 0x01, led_mode_address); - razer_kraken_effect_byte effect_byte; + razer_kraken_effect_byte effect_byte = razer_kraken_create_effect_byte(); effect_byte.value = 0; @@ -250,7 +349,7 @@ void RazerKrakenController::razer_set_mode_static(unsigned char red, unsigned ch { razer_kraken_request_report rgb_report = razer_kraken_create_report(0x04, 0x40, 3, breathing_address[0]); razer_kraken_request_report effect_report = razer_kraken_create_report(0x04, 0x40, 0x01, led_mode_address); - razer_kraken_effect_byte effect_byte; + razer_kraken_effect_byte effect_byte = razer_kraken_create_effect_byte(); effect_byte.value = 0; diff --git a/Controllers/RazerController/RazerKrakenController.h b/Controllers/RazerController/RazerKrakenController.h index b16b75fd2..6d815d1b7 100644 --- a/Controllers/RazerController/RazerKrakenController.h +++ b/Controllers/RazerController/RazerKrakenController.h @@ -72,6 +72,9 @@ public: std::string GetName(); std::string GetSerialString(); + void SetModeBreathingOneColor(unsigned char red, unsigned char grn, unsigned char blu); + void SetModeBreathingTwoColors(unsigned char r1, unsigned char g1, unsigned char b1, unsigned char r2, unsigned char g2, unsigned char b2); + void SetModeBreathingThreeColors(unsigned char r1, unsigned char g1, unsigned char b1, unsigned char r2, unsigned char g2, unsigned char b2, unsigned char r3, unsigned char g3, unsigned char b3); void SetModeCustom(unsigned char red, unsigned char grn, unsigned char blu); void SetModeOff(); void SetModeSpectrumCycle(); @@ -111,13 +114,14 @@ private: | Private functions based on OpenRazer | \*---------------------------------------------------------*/ razer_kraken_request_report razer_kraken_create_report(unsigned char report_id, unsigned char destination, unsigned char length, unsigned short address); - - razer_kraken_request_report razer_create_mode_spectrum_cycle_kraken_report(unsigned char variable_storage, unsigned char led_id); - + razer_kraken_effect_byte razer_kraken_create_effect_byte(); + std::string razer_get_firmware(); std::string razer_get_serial(); - void razer_set_mode_breathing(); + void razer_set_mode_breathing_one_color(unsigned char red, unsigned char grn, unsigned char blu); + void razer_set_mode_breathing_two_colors(unsigned char r1, unsigned char g1, unsigned char b1, unsigned char r2, unsigned char g2, unsigned char b2); + void razer_set_mode_breathing_three_colors(unsigned char r1, unsigned char g1, unsigned char b1, unsigned char r2, unsigned char g2, unsigned char b2, unsigned char r3, unsigned char g3, unsigned char b3); void razer_set_mode_custom(unsigned char red, unsigned char grn, unsigned char blu); void razer_set_mode_none(); void razer_set_mode_spectrum_cycle();