mirror of
https://github.com/CalcProgrammer1/OpenRGB.git
synced 2026-01-19 04:27:51 -05:00
113 lines
4.2 KiB
C++
113 lines
4.2 KiB
C++
/*-----------------------------------------*\
|
|
| SeagateController.cpp |
|
|
| |
|
|
| Code for Seagate Firecuda External HDD |
|
|
| RGB controller |
|
|
| |
|
|
| Adam Honse (CalcProgrammer1) 6/15/2023 |
|
|
\*-----------------------------------------*/
|
|
|
|
#include "SeagateController.h"
|
|
|
|
SeagateController::SeagateController(int fd, char* 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,
|
|
bool save
|
|
)
|
|
{
|
|
/*-----------------------------------------------------------------------------*\
|
|
| Create buffer to hold RGB control data |
|
|
\*-----------------------------------------------------------------------------*/
|
|
unsigned char data[14] = {0};
|
|
data[0] = 0x0E; // 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] = 0x01;
|
|
if(save)
|
|
{
|
|
data[8] = 0x03; // 0x00 for no save, 0x03 for save
|
|
}
|
|
else
|
|
{
|
|
data[8] = 0x00;
|
|
}
|
|
data[9] = r;
|
|
data[10] = g;
|
|
data[11] = b;
|
|
data[12] = 0xFF;
|
|
data[13] = 0xFF;
|
|
|
|
SendPacket(data, 14);
|
|
}
|
|
|
|
void SeagateController::SendPacket
|
|
(
|
|
void * packet,
|
|
unsigned char packet_sz
|
|
)
|
|
{
|
|
/*-----------------------------------------------------------------------------*\
|
|
| Create buffers to hold header, cdb, and sense |
|
|
\*-----------------------------------------------------------------------------*/
|
|
unsigned char cdb[12];
|
|
unsigned char sense[32];
|
|
sg_io_hdr header;
|
|
|
|
/*-----------------------------------------------------------------------------*\
|
|
| Set up pass through command |
|
|
\*-----------------------------------------------------------------------------*/
|
|
header.interface_id = 'S';
|
|
header.dxfer_direction = SG_DXFER_TO_DEV;
|
|
header.cmd_len = sizeof(cdb);
|
|
header.mx_sb_len = sizeof(sense);
|
|
header.iovec_count = 0;
|
|
header.dxfer_len = packet_sz;
|
|
header.dxferp = packet;
|
|
header.cmdp = cdb;
|
|
header.sbp = sense;
|
|
header.timeout = 20000;
|
|
header.flags = 0;
|
|
|
|
cdb[0] = 0xD2;
|
|
cdb[1] = 0x53;
|
|
cdb[2] = 0x65;
|
|
cdb[3] = 0x74;
|
|
cdb[4] = 0x4C;
|
|
cdb[5] = 0x65;
|
|
cdb[6] = 0x64;
|
|
cdb[7] = 0x00;
|
|
cdb[8] = 0x00;
|
|
cdb[9] = 0x30;
|
|
cdb[10] = packet_sz;
|
|
cdb[11] = 0x00;
|
|
|
|
/*-----------------------------------------------------------------------------*\
|
|
| Send pass through command |
|
|
\*-----------------------------------------------------------------------------*/
|
|
ioctl(fd, SG_IO, &header);
|
|
}
|