#include "RedragonK556Controller.h" #include RedragonK556Controller::RedragonK556Controller(hid_device* dev_handle) { dev = dev_handle; } void RedragonK556Controller::SetKeyboardColors ( unsigned char * color_data, unsigned int size ) { unsigned int packet_size = 0; unsigned int packet_offset = 0; while(size > 0) { if(size >= REDRAGON_K556_MAX_PACKET_SIZE) { packet_size = REDRAGON_K556_MAX_PACKET_SIZE; } else { packet_size = size; } SendKeyboardData ( &color_data[packet_offset], packet_size, packet_offset ); size -= packet_size; packet_offset += packet_size; } } /*-------------------------------------------------------------------------------------------------*\ | Private packet sending functions. | \*-------------------------------------------------------------------------------------------------*/ void RedragonK556Controller::ComputeChecksum ( char usb_buf[64] ) { unsigned short checksum = 0; for(unsigned int byte_idx = 0x03; byte_idx < 64; byte_idx++) { checksum += usb_buf[byte_idx]; } usb_buf[0x01] = checksum & 0xFF; usb_buf[0x02] = checksum >> 8; } void RedragonK556Controller::SendKeyboardBegin() { char usb_buf[64]; /*-----------------------------------------------------*\ | Zero out buffer | \*-----------------------------------------------------*/ memset(usb_buf, 0x00, sizeof(usb_buf)); /*-----------------------------------------------------*\ | Set up Keyboard Begin (0x01) packet | | Note: Not computing checksum as packet contents are | | fixed | \*-----------------------------------------------------*/ usb_buf[0x00] = 0x04; usb_buf[0x01] = 0x01; usb_buf[0x02] = 0x00; usb_buf[0x03] = 0x01; /*-----------------------------------------------------*\ | Send packet | \*-----------------------------------------------------*/ hid_write(dev, (unsigned char *)usb_buf, 64); hid_read(dev, (unsigned char *)usb_buf, 64); } void RedragonK556Controller::SendKeyboardEnd() { char usb_buf[64]; /*-----------------------------------------------------*\ | Zero out buffer | \*-----------------------------------------------------*/ memset(usb_buf, 0x00, sizeof(usb_buf)); /*-----------------------------------------------------*\ | Set up Keyboard End (0x02) packet | | Note: Not computing checksum as packet contents are | | fixed | \*-----------------------------------------------------*/ usb_buf[0x00] = 0x04; usb_buf[0x01] = 0x02; usb_buf[0x02] = 0x00; usb_buf[0x03] = 0x02; /*-----------------------------------------------------*\ | Send packet | \*-----------------------------------------------------*/ hid_write(dev, (unsigned char *)usb_buf, 64); hid_read(dev, (unsigned char *)usb_buf, 64); } void RedragonK556Controller::SendKeyboardData ( unsigned char * data, unsigned char data_size, unsigned short data_offset ) { char usb_buf[64]; /*-----------------------------------------------------*\ | Zero out buffer | \*-----------------------------------------------------*/ memset(usb_buf, 0x00, sizeof(usb_buf)); /*-----------------------------------------------------*\ | Set up Keyboard Color Data (0x11) packet | \*-----------------------------------------------------*/ usb_buf[0x00] = 0x04; usb_buf[0x03] = 0x11; usb_buf[0x04] = data_size; usb_buf[0x05] = data_offset & 0x00FF; usb_buf[0x06] = data_offset >> 8; /*-----------------------------------------------------*\ | Copy in data bytes | \*-----------------------------------------------------*/ memcpy(&usb_buf[0x08], data, data_size); /*-----------------------------------------------------*\ | Compute Checksum | \*-----------------------------------------------------*/ ComputeChecksum(usb_buf); /*-----------------------------------------------------*\ | Send packet | \*-----------------------------------------------------*/ hid_write(dev, (unsigned char *)usb_buf, 64); hid_read(dev, (unsigned char *)usb_buf, 64); } void RedragonK556Controller::SendKeyboardMode ( unsigned char mode ) { char usb_buf[64]; /*-----------------------------------------------------*\ | Zero out buffer | \*-----------------------------------------------------*/ memset(usb_buf, 0x00, sizeof(usb_buf)); /*-----------------------------------------------------*\ | Set up Keyboard Parameter (0x06) packet | \*-----------------------------------------------------*/ usb_buf[0x00] = 0x04; usb_buf[0x03] = 0x06; usb_buf[0x04] = 0x01; usb_buf[0x08] = mode; /*-----------------------------------------------------*\ | Compute Checksum | \*-----------------------------------------------------*/ ComputeChecksum(usb_buf); /*-----------------------------------------------------*\ | Send packet | \*-----------------------------------------------------*/ hid_write(dev, (unsigned char *)usb_buf, 64); hid_read(dev, (unsigned char *)usb_buf, 64); }