From cbf4a7f166893e47ef8381a474777ed9ad3501cb Mon Sep 17 00:00:00 2001 From: Adam Honse Date: Mon, 21 Feb 2022 23:38:41 -0600 Subject: [PATCH] Increment protocol version to 4, add segments to protocol --- NetworkProtocol.h | 3 +- RGBController/RGBController.cpp | 122 ++++++++++++++++++++++++++++++++ 2 files changed, 124 insertions(+), 1 deletion(-) diff --git a/NetworkProtocol.h b/NetworkProtocol.h index a2cc43859..ff11e556f 100644 --- a/NetworkProtocol.h +++ b/NetworkProtocol.h @@ -15,8 +15,9 @@ | 1: Add versioning, vendor string (Release 0.5) | | 2: Add profile controls (Release 0.6) | | 3: Add brightness field to modes (Release 0.7) | +| 4: Add segments field to zones (Release 0.8) | \*-----------------------------------------------------*/ -#define OPENRGB_SDK_PROTOCOL_VERSION 3 +#define OPENRGB_SDK_PROTOCOL_VERSION 4 /*-----------------------------------------------------*\ | Default OpenRGB SDK port is 6742 | diff --git a/RGBController/RGBController.cpp b/RGBController/RGBController.cpp index e25e25b0d..486c49065 100644 --- a/RGBController/RGBController.cpp +++ b/RGBController/RGBController.cpp @@ -137,6 +137,31 @@ unsigned char * RGBController::GetDeviceDescription(unsigned int protocol_versio data_size += sizeof(zone_matrix_len[zone_index]); data_size += zone_matrix_len[zone_index]; + + if(protocol_version >= 4) + { + /*---------------------------------------------------------*\ + | Number of segments in zone | + \*---------------------------------------------------------*/ + data_size += sizeof(unsigned short); + + for(int segment_index = 0; segment_index < zones[zone_index].segments.size(); segment_index++) + { + /*---------------------------------------------------------*\ + | Length of segment name string | + \*---------------------------------------------------------*/ + data_size += sizeof(unsigned short); + + /*---------------------------------------------------------*\ + | Segment name string data | + \*---------------------------------------------------------*/ + data_size += strlen(zones[zone_index].segments[segment_index].name.c_str()) + 1; + + data_size += sizeof(zones[zone_index].segments[segment_index].type); + data_size += sizeof(zones[zone_index].segments[segment_index].start_idx); + data_size += sizeof(zones[zone_index].segments[segment_index].leds_count); + } + } } data_size += sizeof(num_leds); @@ -424,6 +449,55 @@ unsigned char * RGBController::GetDeviceDescription(unsigned int protocol_versio data_ptr += sizeof(zones[zone_index].matrix_map->map[matrix_idx]); } } + + /*---------------------------------------------------------*\ + | Copy in segments | + \*---------------------------------------------------------*/ + if(protocol_version >= 4) + { + unsigned short num_segments = zones[zone_index].segments.size(); + + /*---------------------------------------------------------*\ + | Number of segments in zone | + \*---------------------------------------------------------*/ + memcpy(&data_buf[data_ptr], &num_segments, sizeof(num_segments)); + data_ptr += sizeof(num_segments); + + for(int segment_index = 0; segment_index < num_segments; segment_index++) + { + /*---------------------------------------------------------*\ + | Length of segment name string | + \*---------------------------------------------------------*/ + unsigned short segment_name_length = strlen(zones[zone_index].segments[segment_index].name.c_str()) + 1; + + memcpy(&data_buf[data_ptr], &segment_name_length, sizeof(segment_name_length)); + data_ptr += sizeof(segment_name_length); + + /*---------------------------------------------------------*\ + | Segment name string data | + \*---------------------------------------------------------*/ + strcpy((char *)&data_buf[data_ptr], zones[zone_index].segments[segment_index].name.c_str()); + data_ptr += segment_name_length; + + /*---------------------------------------------------------*\ + | Segment type data | + \*---------------------------------------------------------*/ + memcpy(&data_buf[data_ptr], &zones[zone_index].segments[segment_index].type, sizeof(zones[zone_index].segments[segment_index].type)); + data_ptr += sizeof(zones[zone_index].segments[segment_index].type); + + /*---------------------------------------------------------*\ + | Segment start index data | + \*---------------------------------------------------------*/ + memcpy(&data_buf[data_ptr], &zones[zone_index].segments[segment_index].start_idx, sizeof(zones[zone_index].segments[segment_index].start_idx)); + data_ptr += sizeof(zones[zone_index].segments[segment_index].start_idx); + + /*---------------------------------------------------------*\ + | Segment LED count data | + \*---------------------------------------------------------*/ + memcpy(&data_buf[data_ptr], &zones[zone_index].segments[segment_index].leds_count, sizeof(zones[zone_index].segments[segment_index].leds_count)); + data_ptr += sizeof(zones[zone_index].segments[segment_index].leds_count); + } + } } /*---------------------------------------------------------*\ @@ -784,6 +858,54 @@ void RGBController::ReadDeviceDescription(unsigned char* data_buf, unsigned int new_zone.matrix_map = NULL; } + /*---------------------------------------------------------*\ + | Copy in segments | + \*---------------------------------------------------------*/ + if(protocol_version >= 4) + { + unsigned short num_segments = 0; + + /*---------------------------------------------------------*\ + | Number of segments in zone | + \*---------------------------------------------------------*/ + memcpy(&num_segments, &data_buf[data_ptr], sizeof(num_segments)); + data_ptr += sizeof(num_segments); + + for(int segment_index = 0; segment_index < num_segments; segment_index++) + { + segment new_segment; + + /*---------------------------------------------------------*\ + | Copy in segment name (size+data) | + \*---------------------------------------------------------*/ + unsigned short segmentname_len; + memcpy(&segmentname_len, &data_buf[data_ptr], sizeof(unsigned short)); + data_ptr += sizeof(unsigned short); + + new_segment.name = (char *)&data_buf[data_ptr]; + data_ptr += segmentname_len; + + /*---------------------------------------------------------*\ + | Segment type data | + \*---------------------------------------------------------*/ + memcpy(&new_segment.type, &data_buf[data_ptr], sizeof(new_segment.type)); + data_ptr += sizeof(new_segment.type); + + /*---------------------------------------------------------*\ + | Segment start index data | + \*---------------------------------------------------------*/ + memcpy(&new_segment.start_idx, &data_buf[data_ptr], sizeof(new_segment.start_idx)); + data_ptr += sizeof(new_segment.start_idx); + + /*---------------------------------------------------------*\ + | Segment LED count data | + \*---------------------------------------------------------*/ + memcpy(&new_segment.leds_count, &data_buf[data_ptr], sizeof(new_segment.leds_count)); + data_ptr += sizeof(new_segment.leds_count); + + new_zone.segments.push_back(new_segment); + } + } zones.push_back(new_zone); }