Custom mode implemented (saves to hardware)

This commit is contained in:
Adam Honse
2023-07-15 23:39:16 -05:00
parent b31ba21830
commit b8519487f8
3 changed files with 74 additions and 44 deletions

View File

@@ -29,7 +29,7 @@ RGBController_Seagate::RGBController_Seagate(SeagateController* controller_ptr)
location = controller->GetLocation();
mode Direct;
Direct.name = "Direct";
Direct.name = "Custom";
Direct.value = 0;
Direct.flags = MODE_FLAG_HAS_PER_LED_COLOR;
Direct.color_mode = MODE_COLORS_PER_LED;
@@ -46,18 +46,21 @@ RGBController_Seagate::~RGBController_Seagate()
void RGBController_Seagate::SetupZones()
{
zone led_zone;
led_zone.name = "RGB Light";
led_zone.name = "LED Strip";
led_zone.type = ZONE_TYPE_SINGLE;
led_zone.leds_min = 1;
led_zone.leds_max = 1;
led_zone.leds_count = 1;
led_zone.leds_min = 6;
led_zone.leds_max = 6;
led_zone.leds_count = 6;
led_zone.matrix_map = NULL;
zones.push_back(led_zone);
led new_led;
new_led.name = "RGB Light";
for(unsigned int led_idx = 0; led_idx < zones[0].leds_count; led_idx++)
{
led new_led;
new_led.name = "LED Strip LED";
leds.push_back(new_led);
leds.push_back(new_led);
}
SetupColors();
}
@@ -71,11 +74,10 @@ void RGBController_Seagate::ResizeZone(int /*zone*/, int /*new_size*/)
void RGBController_Seagate::DeviceUpdateLEDs()
{
unsigned char red = RGBGetRValue(colors[0]);
unsigned char grn = RGBGetGValue(colors[0]);
unsigned char blu = RGBGetBValue(colors[0]);
//controller->SetRGB(red, grn, blu);
for(unsigned int led_idx = 0; led_idx < leds.size(); led_idx++)
{
UpdateSingleLED(led_idx);
}
}
void RGBController_Seagate::UpdateZoneLEDs(int /*zone*/)
@@ -83,12 +85,16 @@ void RGBController_Seagate::UpdateZoneLEDs(int /*zone*/)
DeviceUpdateLEDs();
}
void RGBController_Seagate::UpdateSingleLED(int /*led*/)
void RGBController_Seagate::UpdateSingleLED(int led)
{
DeviceUpdateLEDs();
unsigned char red = RGBGetRValue(colors[led]);
unsigned char grn = RGBGetGValue(colors[led]);
unsigned char blu = RGBGetBValue(colors[led]);
controller->SetLED(led, red, grn, blu);
}
void RGBController_Seagate::DeviceUpdateMode()
{
}

View File

@@ -14,38 +14,63 @@
SeagateController::SeagateController(HANDLE fd, wchar_t* path)
{
this->nvme_fd = fd;
this->path = path;
this->fd = fd;
this->path = path;
}
SeagateController::~SeagateController()
{
}
std::string SeagateController::GetLocation()
{
std::string str(path.begin(), path.end());
return("SCSI: " + str);
}
void SeagateController::SetLED
(
unsigned char led_id,
unsigned char r,
unsigned char g,
unsigned char b
)
{
/*-----------------------------------------------------------------------------*\
| Create buffer to hold SCSI_PASS_THROUGH_DIRECT |
| Size must be enough for the SCSI_PASS_THROUGH_DIRECT struct plus the sense |
| data. Size of 80 bytes taken from captured data |
\*-----------------------------------------------------------------------------*/
unsigned char buffer[80] = {0};
/*-----------------------------------------------------------------------------*\
| Create buffer to hold STORAGE_PROTOCOL_COMMAND |
| Size must be enough for the STORAGE_PROTOCOL_COMMAND struct plus the command |
| data. Subtract sizeof(DWORD) as the Command field in the structure overlaps |
| the actual command data. |
| Create buffer to hold RGB control data |
\*-----------------------------------------------------------------------------*/
unsigned char data[14] = {0};
unsigned char buffer[80] = {0};
unsigned char data[14] = {0};
data[0] = 0x0E;
data[1] = 0x00;
data[2] = 0x01;
data[3] = 0x09;
data[4] = 0x01;
data[5] = 0x06;
data[6] = 0x00;
data[6] = led_id;
data[7] = 0x01;
data[8] = 0x03;
data[9] = 0x00;
data[10] = 0x15;
data[11] = 0xFF;
data[9] = r;
data[10] = g;
data[11] = b;
data[12] = 0x00;
data[13] = 0xFF;
/*-----------------------------------------------------------------------------*\
| Create STORAGE_PROTOCOL_COMMAND pointer and point it to the buffer |
| Create PSCSI_PASS_THROUGH_DIRECT pointer and point it to the buffer |
\*-----------------------------------------------------------------------------*/
PSCSI_PASS_THROUGH_DIRECT command = (PSCSI_PASS_THROUGH_DIRECT)buffer;
/*-----------------------------------------------------------------------------*\
| Set up pass through command |
\*-----------------------------------------------------------------------------*/
command->Length = sizeof(SCSI_PASS_THROUGH_DIRECT);
command->ScsiStatus = 0x00;
command->PathId = 0x00;
@@ -72,16 +97,8 @@ SeagateController::SeagateController(HANDLE fd, wchar_t* path)
command->Cdb[10] = 0x0E;
command->Cdb[11] = 0x00;
DeviceIoControl(nvme_fd, IOCTL_SCSI_PASS_THROUGH_DIRECT, command, 80, command, 80, NULL, NULL);
}
SeagateController::~SeagateController()
{
}
std::string SeagateController::GetLocation()
{
std::string str(path.begin(), path.end());
return("SCSI: " + str);
/*-----------------------------------------------------------------------------*\
| Send pass through command |
\*-----------------------------------------------------------------------------*/
DeviceIoControl(fd, IOCTL_SCSI_PASS_THROUGH_DIRECT, command, 80, command, 80, NULL, NULL);
}

View File

@@ -22,8 +22,15 @@ public:
std::string GetLocation();
void SetLED
(
unsigned char led_id,
unsigned char r,
unsigned char g,
unsigned char b
);
private:
HANDLE nvme_fd;
HANDLE fd;
std::wstring path;
int a;
};