Fix segment creation and modification over the network protocol
This commit is contained in:
parent
e634a77860
commit
012cb5e62d
9 changed files with 261 additions and 3 deletions
|
|
@ -1723,6 +1723,148 @@ void RGBController::SetSingleLEDColorDescription(unsigned char* data_buf)
|
|||
memcpy(&colors[led_idx], &data_buf[sizeof(led_idx)], sizeof(RGBColor));
|
||||
}
|
||||
|
||||
unsigned char * RGBController::GetSegmentDescription(int zone, segment new_segment)
|
||||
{
|
||||
unsigned int data_ptr = 0;
|
||||
unsigned int data_size = 0;
|
||||
|
||||
/*---------------------------------------------------------*\
|
||||
| Length of data size |
|
||||
\*---------------------------------------------------------*/
|
||||
data_size += sizeof(data_size);
|
||||
|
||||
/*---------------------------------------------------------*\
|
||||
| Length of zone index |
|
||||
\*---------------------------------------------------------*/
|
||||
data_size += sizeof(zone);
|
||||
|
||||
/*---------------------------------------------------------*\
|
||||
| Length of segment name string |
|
||||
\*---------------------------------------------------------*/
|
||||
data_size += sizeof(unsigned short);
|
||||
|
||||
/*---------------------------------------------------------*\
|
||||
| Segment name string data |
|
||||
\*---------------------------------------------------------*/
|
||||
data_size += strlen(new_segment.name.c_str()) + 1;
|
||||
|
||||
data_size += sizeof(new_segment.type);
|
||||
data_size += sizeof(new_segment.start_idx);
|
||||
data_size += sizeof(new_segment.leds_count);
|
||||
|
||||
/*---------------------------------------------------------*\
|
||||
| Create data buffer |
|
||||
\*---------------------------------------------------------*/
|
||||
unsigned char *data_buf = new unsigned char[data_size];
|
||||
|
||||
/*---------------------------------------------------------*\
|
||||
| Copy in data size |
|
||||
\*---------------------------------------------------------*/
|
||||
memcpy(&data_buf[data_ptr], &data_size, sizeof(data_size));
|
||||
data_ptr += sizeof(data_size);
|
||||
|
||||
/*---------------------------------------------------------*\
|
||||
| Copy in zone index |
|
||||
\*---------------------------------------------------------*/
|
||||
memcpy(&data_buf[data_ptr], &zone, sizeof(zone));
|
||||
data_ptr += sizeof(zone);
|
||||
|
||||
/*---------------------------------------------------------*\
|
||||
| Length of segment name string |
|
||||
\*---------------------------------------------------------*/
|
||||
unsigned short segment_name_length = strlen(new_segment.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], new_segment.name.c_str());
|
||||
data_ptr += segment_name_length;
|
||||
|
||||
/*---------------------------------------------------------*\
|
||||
| Segment type data |
|
||||
\*---------------------------------------------------------*/
|
||||
memcpy(&data_buf[data_ptr], &new_segment.type, sizeof(new_segment.type));
|
||||
data_ptr += sizeof(new_segment.type);
|
||||
|
||||
/*---------------------------------------------------------*\
|
||||
| Segment start index data |
|
||||
\*---------------------------------------------------------*/
|
||||
memcpy(&data_buf[data_ptr], &new_segment.start_idx, sizeof(new_segment.start_idx));
|
||||
data_ptr += sizeof(new_segment.start_idx);
|
||||
|
||||
/*---------------------------------------------------------*\
|
||||
| Segment LED count data |
|
||||
\*---------------------------------------------------------*/
|
||||
memcpy(&data_buf[data_ptr], &new_segment.leds_count, sizeof(new_segment.leds_count));
|
||||
data_ptr += sizeof(new_segment.leds_count);
|
||||
|
||||
return(data_buf);
|
||||
}
|
||||
|
||||
void RGBController::SetSegmentDescription(unsigned char* data_buf)
|
||||
{
|
||||
unsigned int data_ptr = sizeof(unsigned int);
|
||||
|
||||
/*---------------------------------------------------------*\
|
||||
| Copy in zone index |
|
||||
\*---------------------------------------------------------*/
|
||||
unsigned int zone_idx;
|
||||
memcpy(&zone_idx, &data_buf[data_ptr], sizeof(zone_idx));
|
||||
data_ptr += sizeof(zone_idx);
|
||||
|
||||
/*---------------------------------------------------------*\
|
||||
| Length of segment name string |
|
||||
\*---------------------------------------------------------*/
|
||||
unsigned short segment_name_length;
|
||||
memcpy(&segment_name_length, &data_buf[data_ptr], sizeof(segment_name_length));
|
||||
data_ptr += sizeof(segment_name_length);
|
||||
|
||||
/*---------------------------------------------------------*\
|
||||
| Segment name string data |
|
||||
\*---------------------------------------------------------*/
|
||||
char * segment_name = new char[segment_name_length];
|
||||
memcpy(segment_name, &data_buf[data_ptr], segment_name_length);
|
||||
data_ptr += segment_name_length;
|
||||
|
||||
/*---------------------------------------------------------*\
|
||||
| Segment type data |
|
||||
\*---------------------------------------------------------*/
|
||||
zone_type segment_type;
|
||||
memcpy(&segment_type, &data_buf[data_ptr], sizeof(segment_type));
|
||||
data_ptr += sizeof(segment_type);
|
||||
|
||||
/*---------------------------------------------------------*\
|
||||
| Segment start index data |
|
||||
\*---------------------------------------------------------*/
|
||||
unsigned int segment_start_idx;
|
||||
memcpy(&segment_start_idx, &data_buf[data_ptr], sizeof(segment_start_idx));
|
||||
data_ptr += sizeof(segment_start_idx);
|
||||
|
||||
/*---------------------------------------------------------*\
|
||||
| Segment LED count data |
|
||||
\*---------------------------------------------------------*/
|
||||
unsigned int segment_leds_count;
|
||||
memcpy(&segment_leds_count, &data_buf[data_ptr], sizeof(segment_leds_count));
|
||||
data_ptr += sizeof(segment_leds_count);
|
||||
|
||||
/*---------------------------------------------------------*\
|
||||
| Add new segment |
|
||||
\*---------------------------------------------------------*/
|
||||
segment new_segment;
|
||||
|
||||
new_segment.name = segment_name;
|
||||
new_segment.type = segment_type;
|
||||
new_segment.start_idx = segment_start_idx;
|
||||
new_segment.leds_count = segment_leds_count;
|
||||
|
||||
AddSegment(zone_idx, new_segment);
|
||||
|
||||
delete[] segment_name;
|
||||
}
|
||||
|
||||
void RGBController::SetupColors()
|
||||
{
|
||||
unsigned int total_led_count;
|
||||
|
|
@ -1970,6 +2112,16 @@ void RGBController::DeviceSaveMode()
|
|||
\*-------------------------------------------------*/
|
||||
}
|
||||
|
||||
void RGBController::ClearSegments(int zone)
|
||||
{
|
||||
zones[zone].segments.clear();
|
||||
}
|
||||
|
||||
void RGBController::AddSegment(int zone, segment new_segment)
|
||||
{
|
||||
zones[zone].segments.push_back(new_segment);
|
||||
}
|
||||
|
||||
std::string device_type_to_str(device_type type)
|
||||
{
|
||||
switch(type)
|
||||
|
|
|
|||
|
|
@ -276,6 +276,9 @@ public:
|
|||
|
||||
virtual void DeviceCallThreadFunction() = 0;
|
||||
|
||||
virtual void ClearSegments(int zone) = 0;
|
||||
virtual void AddSegment(int zone, segment new_segment) = 0;
|
||||
|
||||
/*---------------------------------------------------------*\
|
||||
| Functions to be implemented in device implementation |
|
||||
\*---------------------------------------------------------*/
|
||||
|
|
@ -357,6 +360,9 @@ public:
|
|||
unsigned char * GetSingleLEDColorDescription(int led);
|
||||
void SetSingleLEDColorDescription(unsigned char* data_buf);
|
||||
|
||||
unsigned char * GetSegmentDescription(int zone, segment new_segment);
|
||||
void SetSegmentDescription(unsigned char* data_buf);
|
||||
|
||||
void RegisterUpdateCallback(RGBControllerCallback new_callback, void * new_callback_arg);
|
||||
void UnregisterUpdateCallback(void * callback_arg);
|
||||
void ClearCallbacks();
|
||||
|
|
@ -371,6 +377,9 @@ public:
|
|||
|
||||
void DeviceCallThreadFunction();
|
||||
|
||||
void ClearSegments(int zone);
|
||||
void AddSegment(int zone, segment new_segment);
|
||||
|
||||
/*---------------------------------------------------------*\
|
||||
| Functions to be implemented in device implementation |
|
||||
\*---------------------------------------------------------*/
|
||||
|
|
|
|||
|
|
@ -25,6 +25,29 @@ void RGBController_Network::SetupZones()
|
|||
//Don't send anything, this function should only process on host
|
||||
}
|
||||
|
||||
void RGBController_Network::ClearSegments(int zone)
|
||||
{
|
||||
client->SendRequest_RGBController_ClearSegments(dev_idx, zone);
|
||||
|
||||
client->SendRequest_ControllerData(dev_idx);
|
||||
client->WaitOnControllerData();
|
||||
}
|
||||
|
||||
void RGBController_Network::AddSegment(int zone, segment new_segment)
|
||||
{
|
||||
unsigned char * data = GetSegmentDescription(zone, new_segment);
|
||||
unsigned int size;
|
||||
|
||||
memcpy(&size, &data[0], sizeof(unsigned int));
|
||||
|
||||
client->SendRequest_RGBController_AddSegment(dev_idx, data, size);
|
||||
|
||||
delete[] data;
|
||||
|
||||
client->SendRequest_ControllerData(dev_idx);
|
||||
client->WaitOnControllerData();
|
||||
}
|
||||
|
||||
void RGBController_Network::ResizeZone(int zone, int new_size)
|
||||
{
|
||||
client->SendRequest_RGBController_ResizeZone(dev_idx, zone, new_size);
|
||||
|
|
|
|||
|
|
@ -22,6 +22,8 @@ public:
|
|||
|
||||
void SetupZones();
|
||||
|
||||
void ClearSegments(int zone);
|
||||
void AddSegment(int zone, segment new_segment);
|
||||
void ResizeZone(int zone, int new_size);
|
||||
|
||||
void DeviceUpdateLEDs();
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue