This commit is contained in:
Adam Honse 2022-12-05 03:29:27 +00:00
parent ead55f4ea6
commit 447e936464
14 changed files with 443 additions and 23 deletions

View file

@ -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);
}

View file

@ -135,6 +135,17 @@ typedef struct
unsigned int * map;
} matrix_map_type;
/*------------------------------------------------------------------*\
| Segment Struct |
\*------------------------------------------------------------------*/
typedef struct
{
std::string name; /* Segment name */
zone_type type; /* Segment type */
unsigned int start_idx; /* Start index within zone */
unsigned int leds_count; /* Number of LEDs in segment*/
} segment;
/*------------------------------------------------------------------*\
| Zone Struct |
\*------------------------------------------------------------------*/
@ -149,6 +160,7 @@ typedef struct
unsigned int leds_min; /* Minimum number of LEDs */
unsigned int leds_max; /* Maximum number of LEDs */
matrix_map_type * matrix_map; /* Matrix map pointer */
std::vector<segment> segments; /* Segments in zone */
} zone;
/*------------------------------------------------------------------*\