diff --git a/Controllers/ZalmanZSyncController/RGBController_ZalmanZSync.cpp b/Controllers/ZalmanZSyncController/RGBController_ZalmanZSync.cpp new file mode 100644 index 00000000..694b5050 --- /dev/null +++ b/Controllers/ZalmanZSyncController/RGBController_ZalmanZSync.cpp @@ -0,0 +1,95 @@ +/*-----------------------------------------*\ +| RGBController_ZalmanZSync.cpp | +| | +| Generic RGB Interface for Zalman Z Sync | +| lighting devices | +| | +| Adam Honse (CalcProgrammer1) 1/30/2021 | +\*-----------------------------------------*/ + +#include "RGBController_ZalmanZSync.h" + +RGBController_ZalmanZSync::RGBController_ZalmanZSync(ZalmanZSyncController* controller_ptr) +{ + controller = controller_ptr; + type = DEVICE_TYPE_LEDSTRIP; + name = "Zalman Z Sync Device"; + description = "Zalman Z Sync Device"; + location = controller->GetDeviceLocation(); + serial = controller->GetSerialString(); + + mode Direct; + Direct.name = "Direct"; + Direct.value = 0; + Direct.flags = MODE_FLAG_HAS_PER_LED_COLOR; + Direct.color_mode = MODE_COLORS_PER_LED; + modes.push_back(Direct); + + SetupZones(); +} + +RGBController_ZalmanZSync::~RGBController_ZalmanZSync() +{ + +} + +void RGBController_ZalmanZSync::SetupZones() +{ + for(unsigned int zone_idx = 0; zone_idx < 8; zone_idx++) + { + zone new_zone; + + new_zone.name = "Channel " + std::to_string(zone_idx + 1); + new_zone.type = ZONE_TYPE_LINEAR; + new_zone.leds_min = 24; + new_zone.leds_max = 24; + new_zone.leds_count = 24; + new_zone.matrix_map = NULL; + + zones.push_back(new_zone); + + for(unsigned int led_idx = 0; led_idx < 24; led_idx++) + { + led new_led; + + new_led.name = "LED " + std::to_string(led_idx + 1); + + leds.push_back(new_led); + } + } + + SetupColors(); +} + +void RGBController_ZalmanZSync::ResizeZone(int zone, int new_size) +{ + +} + +void RGBController_ZalmanZSync::DeviceUpdateLEDs() +{ + for(unsigned int zone_idx = 0; zone_idx < 8; zone_idx++) + { + controller->SetLEDs(zone_idx, zones[zone_idx].colors); + } +} + +void RGBController_ZalmanZSync::UpdateZoneLEDs(int zone) +{ + controller->SetLEDs(zone, zones[zone].colors); +} + +void RGBController_ZalmanZSync::UpdateSingleLED(int led) +{ + DeviceUpdateLEDs(); +} + +void RGBController_ZalmanZSync::SetCustomMode() +{ + +} + +void RGBController_ZalmanZSync::DeviceUpdateMode() +{ + +} \ No newline at end of file diff --git a/Controllers/ZalmanZSyncController/RGBController_ZalmanZSync.h b/Controllers/ZalmanZSyncController/RGBController_ZalmanZSync.h new file mode 100644 index 00000000..7ad7bc6e --- /dev/null +++ b/Controllers/ZalmanZSyncController/RGBController_ZalmanZSync.h @@ -0,0 +1,33 @@ +/*-----------------------------------------*\ +| RGBController_ZalmanZSync.h | +| | +| Generic RGB Interface for Zalman Z Sync | +| lighting devices | +| | +| Adam Honse (CalcProgrammer1) 1/30/2021 | +\*-----------------------------------------*/ + +#pragma once +#include "RGBController.h" +#include "ZalmanZSyncController.h" + +class RGBController_ZalmanZSync : public RGBController +{ +public: + RGBController_ZalmanZSync(ZalmanZSyncController* controller_ptr); + ~RGBController_ZalmanZSync(); + + void SetupZones(); + + void ResizeZone(int zone, int new_size); + + void DeviceUpdateLEDs(); + void UpdateZoneLEDs(int zone); + void UpdateSingleLED(int led); + + void SetCustomMode(); + void DeviceUpdateMode(); + +private: + ZalmanZSyncController* controller; +}; \ No newline at end of file diff --git a/Controllers/ZalmanZSyncController/ZalmanZSyncController.cpp b/Controllers/ZalmanZSyncController/ZalmanZSyncController.cpp new file mode 100644 index 00000000..b70915c2 --- /dev/null +++ b/Controllers/ZalmanZSyncController/ZalmanZSyncController.cpp @@ -0,0 +1,80 @@ +#include "ZalmanZSyncController.h" + +ZalmanZSyncController::ZalmanZSyncController(hid_device* dev_handle, const char* path) +{ + dev = dev_handle; + location = path; +} + +ZalmanZSyncController::~ZalmanZSyncController() +{ + +} + +std::string ZalmanZSyncController::GetDeviceLocation() +{ + return("HID: " + location); +} + +std::string ZalmanZSyncController::GetSerialString() +{ + return(""); +} + +void ZalmanZSyncController::SetLEDs(unsigned char channel, RGBColor* colors) +{ + SendDirectFrame(channel, ZALMAN_Z_SYNC_COLOR_CHANNEL_RED, colors); + SendDirectFrame(channel, ZALMAN_Z_SYNC_COLOR_CHANNEL_GREEN, colors); + SendDirectFrame(channel, ZALMAN_Z_SYNC_COLOR_CHANNEL_BLUE, colors); + + SendApply(); +} + +void ZalmanZSyncController::SendApply() +{ + unsigned char usb_buf[65]; + + usb_buf[0] = 0x00; + usb_buf[1] = 0x33; + usb_buf[2] = 0xFF; + + hid_write(dev, usb_buf, 65); +} + +void ZalmanZSyncController::SendDirectFrame(unsigned char channel, unsigned char color_channel, RGBColor* colors) +{ + unsigned char usb_buf[65]; + + usb_buf[0] = 0x00; + usb_buf[1] = 0x32; + usb_buf[2] = channel; + usb_buf[3] = 0x00; + usb_buf[4] = 0x18; + usb_buf[5] = color_channel; + + switch(color_channel) + { + case ZALMAN_Z_SYNC_COLOR_CHANNEL_RED: + for(unsigned int color_idx = 0; color_idx < 24; color_idx++) + { + usb_buf[6 + color_idx] = RGBGetRValue(colors[color_idx]); + } + break; + + case ZALMAN_Z_SYNC_COLOR_CHANNEL_GREEN: + for(unsigned int color_idx = 0; color_idx < 24; color_idx++) + { + usb_buf[6 + color_idx] = RGBGetGValue(colors[color_idx]); + } + break; + + case ZALMAN_Z_SYNC_COLOR_CHANNEL_BLUE: + for(unsigned int color_idx = 0; color_idx < 24; color_idx++) + { + usb_buf[6 + color_idx] = RGBGetBValue(colors[color_idx]); + } + break; + } + + hid_write(dev, usb_buf, 65); +} \ No newline at end of file diff --git a/Controllers/ZalmanZSyncController/ZalmanZSyncController.h b/Controllers/ZalmanZSyncController/ZalmanZSyncController.h new file mode 100644 index 00000000..4880a1dd --- /dev/null +++ b/Controllers/ZalmanZSyncController/ZalmanZSyncController.h @@ -0,0 +1,41 @@ +/*-----------------------------------------*\ +| ZalmanZSyncController.h | +| | +| Definitions and types for Zalman Z Sync | +| lighting controller | +| | +| Adam Honse (CalcProgrammer1) 1/30/2021 | +\*-----------------------------------------*/ + +#include "RGBController.h" + +#include +#include + +#pragma once + +enum +{ + ZALMAN_Z_SYNC_COLOR_CHANNEL_RED = 0x00, + ZALMAN_Z_SYNC_COLOR_CHANNEL_GREEN = 0x01, + ZALMAN_Z_SYNC_COLOR_CHANNEL_BLUE = 0x02, +}; + +class ZalmanZSyncController +{ +public: + ZalmanZSyncController(hid_device* dev_handle, const char* path); + ~ZalmanZSyncController(); + + std::string GetDeviceLocation(); + std::string GetSerialString(); + + void SetLEDs(unsigned char channel, RGBColor* colors); + +private: + hid_device* dev; + std::string location; + + void SendApply(); + void SendDirectFrame(unsigned char channel, unsigned char color_channel, RGBColor* colors); +}; diff --git a/Controllers/ZalmanZSyncController/ZalmanZSyncControllerDetect.cpp b/Controllers/ZalmanZSyncController/ZalmanZSyncControllerDetect.cpp new file mode 100644 index 00000000..312bc364 --- /dev/null +++ b/Controllers/ZalmanZSyncController/ZalmanZSyncControllerDetect.cpp @@ -0,0 +1,32 @@ +#include "Detector.h" +#include "ZalmanZSyncController.h" +#include "RGBController.h" +#include "RGBController_ZalmanZSync.h" +#include +#include + +#define ZALMAN_VID 0x1C57 +#define ZALMAN_Z_SYNC_PID 0x7ED0 + +/******************************************************************************************\ +* * +* DetectZalmanZSyncControllers * +* * +* Detect devices supported by the Zalman Z Sync driver * +* * +\******************************************************************************************/ + +void DetectZalmanZSyncControllers(hid_device_info* info, const std::string& name) +{ + hid_device* dev = hid_open_path(info->path); + + if( dev ) + { + ZalmanZSyncController* controller = new ZalmanZSyncController(dev, info->path); + RGBController_ZalmanZSync* rgb_controller = new RGBController_ZalmanZSync(controller); + rgb_controller->name = name; + ResourceManager::get()->RegisterRGBController(rgb_controller); + } +} /* DetectZalmanZSyncControllers() */ + +REGISTER_HID_DETECTOR("Zalman Z Sync", DetectZalmanZSyncControllers, ZALMAN_VID, ZALMAN_Z_SYNC_PID); diff --git a/OpenRGB.pro b/OpenRGB.pro index a81f3190..6fec9286 100644 --- a/OpenRGB.pro +++ b/OpenRGB.pro @@ -107,6 +107,7 @@ INCLUDEPATH += Controllers/ThermaltakePoseidonZRGBController/ \ Controllers/ThermaltakeRiingController/ \ Controllers/YeelightController/ \ + Controllers/ZalmanZSyncController/ \ RGBController/ \ qt/ @@ -296,6 +297,8 @@ HEADERS += Controllers/ThermaltakeRiingController/RGBController_ThermaltakeRiing.h \ Controllers/YeelightController/YeelightController.h \ Controllers/YeelightController/RGBController_Yeelight.h \ + Controllers/ZalmanZSyncController/ZalmanZSyncController.h \ + Controllers/ZalmanZSyncController/RGBController_ZalmanZSync.h \ RGBController/RGBController.h \ RGBController/RGBController_Dummy.h \ RGBController/RGBController_Network.h \ @@ -535,6 +538,9 @@ SOURCES += Controllers/YeelightController/YeelightController.cpp \ Controllers/YeelightController/YeelightControllerDetect.cpp \ Controllers/YeelightController/RGBController_Yeelight.cpp \ + Controllers/ZalmanZSyncController/ZalmanZSyncController.cpp \ + Controllers/ZalmanZSyncController/ZalmanZSyncControllerDetect.cpp \ + Controllers/ZalmanZSyncController/RGBController_ZalmanZSync.cpp \ RGBController/RGBController.cpp \ RGBController/RGBController_Dummy.cpp \ RGBController/RGBController_Network.cpp \