From 0b596e5e0203b86a44335a85f5a4e7c93480dde8 Mon Sep 17 00:00:00 2001 From: Adam Honse Date: Sat, 29 Jul 2023 23:03:37 -0500 Subject: [PATCH] Add flashing and breathing modes to Seagate controller --- .../RGBController_Seagate.cpp | 52 +++++++- .../SeagateController/SeagateController.cpp | 117 +++++++++++++++++- .../SeagateController/SeagateController.h | 29 ++++- 3 files changed, 185 insertions(+), 13 deletions(-) diff --git a/Controllers/SeagateController/RGBController_Seagate.cpp b/Controllers/SeagateController/RGBController_Seagate.cpp index ec2481c6e..817079234 100644 --- a/Controllers/SeagateController/RGBController_Seagate.cpp +++ b/Controllers/SeagateController/RGBController_Seagate.cpp @@ -30,12 +30,26 @@ RGBController_Seagate::RGBController_Seagate(SeagateController* controller_ptr) location = controller->GetLocation(); mode Direct; - Direct.name = "Direct"; - Direct.value = 0; - Direct.flags = MODE_FLAG_HAS_PER_LED_COLOR | MODE_FLAG_MANUAL_SAVE; - Direct.color_mode = MODE_COLORS_PER_LED; + Direct.name = "Direct"; + Direct.value = SEAGATE_MODE_STATIC; + Direct.flags = MODE_FLAG_HAS_PER_LED_COLOR | MODE_FLAG_MANUAL_SAVE; + Direct.color_mode = MODE_COLORS_PER_LED; modes.push_back(Direct); + mode Blink; + Blink.name = "Flashing"; + Blink.value = SEAGATE_MODE_BLINK; + Blink.flags = MODE_FLAG_HAS_PER_LED_COLOR | MODE_FLAG_MANUAL_SAVE; + Blink.color_mode = MODE_COLORS_PER_LED; + modes.push_back(Blink); + + mode Breathing; + Breathing.name = "Breathing"; + Breathing.value = SEAGATE_MODE_BREATHING; + Breathing.flags = MODE_FLAG_HAS_PER_LED_COLOR | MODE_FLAG_MANUAL_SAVE; + Breathing.color_mode = MODE_COLORS_PER_LED; + modes.push_back(Breathing); + SetupZones(); } @@ -92,7 +106,20 @@ void RGBController_Seagate::UpdateSingleLED(int led) unsigned char grn = RGBGetGValue(colors[led]); unsigned char blu = RGBGetBValue(colors[led]); - controller->SetLED(led, red, grn, blu, false); + switch(modes[active_mode].value) + { + case SEAGATE_MODE_STATIC: + controller->SetLEDStatic(led, red, grn, blu, false); + break; + + case SEAGATE_MODE_BLINK: + controller->SetLEDBlink(led, red, grn, blu, false); + break; + + case SEAGATE_MODE_BREATHING: + controller->SetLEDBreathing(led, red, grn, blu, false); + break; + } } void RGBController_Seagate::DeviceUpdateMode() @@ -107,6 +134,19 @@ void RGBController_Seagate::DeviceSaveMode() unsigned char grn = RGBGetGValue(colors[led_idx]); unsigned char blu = RGBGetBValue(colors[led_idx]); - controller->SetLED(led_idx, red, grn, blu, true); + switch(modes[active_mode].value) + { + case SEAGATE_MODE_STATIC: + controller->SetLEDStatic(led_idx, red, grn, blu, true); + break; + + case SEAGATE_MODE_BLINK: + controller->SetLEDBlink(led_idx, red, grn, blu, true); + break; + + case SEAGATE_MODE_BREATHING: + controller->SetLEDBreathing(led_idx, red, grn, blu, true); + break; + } } } diff --git a/Controllers/SeagateController/SeagateController.cpp b/Controllers/SeagateController/SeagateController.cpp index 4488416e8..f38335d25 100644 --- a/Controllers/SeagateController/SeagateController.cpp +++ b/Controllers/SeagateController/SeagateController.cpp @@ -26,7 +26,7 @@ std::string SeagateController::GetLocation() return("SCSI: " + str); } -void SeagateController::SetLED +void SeagateController::SetLEDBlink ( unsigned char led_id, unsigned char r, @@ -38,7 +38,99 @@ void SeagateController::SetLED /*-----------------------------------------------------------------------------*\ | Create buffer to hold RGB control data | \*-----------------------------------------------------------------------------*/ - unsigned char data[14] = {0}; + unsigned char data[0x10] = {0}; + data[0] = 0x10; /* size of data packet */ + data[1] = 0x00; + data[2] = 0x01; + data[3] = 0x09; + data[4] = 0x01; + data[5] = 0x06; + data[6] = led_id; + data[7] = SEAGATE_MODE_BLINK; + if(save) + { + data[8] = 0x03; /* 0x00 for no save, 0x03 for */ + /* save */ + } + else + { + data[8] = 0x00; + } + data[9] = 0x10; + data[10] = 0x10; + data[11] = r; + data[12] = g; + data[13] = b; + data[14] = 0xFF; + data[15] = 0xFF; + + /*-----------------------------------------------------------------------------*\ + | Send packet | + \*-----------------------------------------------------------------------------*/ + SendPacket(data, 0x10); +} + +void SeagateController::SetLEDBreathing + ( + unsigned char led_id, + unsigned char r, + unsigned char g, + unsigned char b, + bool save + ) +{ + /*-----------------------------------------------------------------------------*\ + | Create buffer to hold RGB control data | + \*-----------------------------------------------------------------------------*/ + unsigned char data[0x14] = {0}; + data[0] = 0x14; /* size of data packet */ + data[1] = 0x00; + data[2] = 0x01; + data[3] = 0x09; + data[4] = 0x01; + data[5] = 0x06; + data[6] = led_id; + data[7] = SEAGATE_MODE_BREATHING; + if(save) + { + data[8] = 0x03; /* 0x00 for no save, 0x03 for */ + /* save */ + } + else + { + data[8] = 0x00; + } + data[9] = 0x0F; + data[10] = 0x0F; + data[11] = 0x0F; + data[12] = 0x0F; + data[13] = r; + data[14] = g; + data[15] = b; + data[16] = 0xFF; + data[17] = 0xFF; + data[18] = 0xFF; + data[19] = 0x00; + + /*-----------------------------------------------------------------------------*\ + | Send packet | + \*-----------------------------------------------------------------------------*/ + SendPacket(data, 0x14); +} + +void SeagateController::SetLEDStatic + ( + unsigned char led_id, + unsigned char r, + unsigned char g, + unsigned char b, + bool save + ) +{ + /*-----------------------------------------------------------------------------*\ + | Create buffer to hold RGB control data | + \*-----------------------------------------------------------------------------*/ + unsigned char data[0x0E] = {0}; data[0] = 0x0E; /* size of data packet */ data[1] = 0x00; data[2] = 0x01; @@ -46,7 +138,7 @@ void SeagateController::SetLED data[4] = 0x01; data[5] = 0x06; data[6] = led_id; - data[7] = 0x01; + data[7] = SEAGATE_MODE_STATIC; if(save) { data[8] = 0x03; /* 0x00 for no save, 0x03 for */ @@ -62,6 +154,18 @@ void SeagateController::SetLED data[12] = 0xFF; data[13] = 0xFF; + /*-----------------------------------------------------------------------------*\ + | Send packet | + \*-----------------------------------------------------------------------------*/ + SendPacket(data, 0x0E); +} + +void SeagateController::SendPacket + ( + unsigned char * packet, + unsigned char packet_sz + ) +{ /*-----------------------------------------------------------------------------*\ | Create buffer to hold CDB | \*-----------------------------------------------------------------------------*/ @@ -76,7 +180,7 @@ void SeagateController::SetLED cdb[7] = 0x00; cdb[8] = 0x00; cdb[9] = 0x30; - cdb[10] = 14; /* length of data packet */ + cdb[10] = packet_sz; cdb[11] = 0x00; /*-----------------------------------------------------------------------------*\ @@ -84,5 +188,8 @@ void SeagateController::SetLED \*-----------------------------------------------------------------------------*/ unsigned char sense[32] = {0}; - scsi_write(dev, data, 14, cdb, 12, sense, 32); + /*-----------------------------------------------------------------------------*\ + | Write SCSI packet | + \*-----------------------------------------------------------------------------*/ + scsi_write(dev, packet, packet_sz, cdb, 12, sense, 32); } diff --git a/Controllers/SeagateController/SeagateController.h b/Controllers/SeagateController/SeagateController.h index de130f9ef..5c27a166e 100644 --- a/Controllers/SeagateController/SeagateController.h +++ b/Controllers/SeagateController/SeagateController.h @@ -12,6 +12,13 @@ #include #include "scsiapi.h" +enum +{ + SEAGATE_MODE_STATIC = 0x01, /* Static mode */ + SEAGATE_MODE_BLINK = 0x02, /* Blink mode */ + SEAGATE_MODE_BREATHING = 0x03, /* Breathing mode */ +}; + class SeagateController { public: @@ -20,7 +27,25 @@ public: std::string GetLocation(); - void SetLED + void SetLEDBlink + ( + unsigned char led_id, + unsigned char r, + unsigned char g, + unsigned char b, + bool save + ); + + void SetLEDBreathing + ( + unsigned char led_id, + unsigned char r, + unsigned char g, + unsigned char b, + bool save + ); + + void SetLEDStatic ( unsigned char led_id, unsigned char r, @@ -35,7 +60,7 @@ private: void SendPacket ( - void * packet, + unsigned char * packet, unsigned char packet_sz ); };