Start working on getting segment setting to work over the network

This commit is contained in:
Adam Honse
2024-07-25 23:11:48 -05:00
parent b75719128e
commit eccfcb1259
8 changed files with 150 additions and 3 deletions

View File

@@ -754,6 +754,39 @@ void NetworkClient::SendRequest_ProtocolVersion()
send_in_progress.unlock();
}
void NetworkClient::SendRequest_RGBController_ClearSegments(unsigned int dev_idx, int zone)
{
if(change_in_progress)
{
return;
}
NetPacketHeader request_hdr;
int request_data[1];
InitNetPacketHeader(&request_hdr, dev_idx, NET_PACKET_ID_RGBCONTROLLER_CLEARSEGMENTS, sizeof(request_data));
request_data[0] = zone;
send(client_sock, (char *)&request_hdr, sizeof(NetPacketHeader), MSG_NOSIGNAL);
send(client_sock, (char *)&request_data, sizeof(request_data), MSG_NOSIGNAL);
}
void NetworkClient::SendRequest_RGBController_AddSegment(unsigned int dev_idx, unsigned char * data, unsigned int size)
{
if(change_in_progress)
{
return;
}
NetPacketHeader request_hdr;
InitNetPacketHeader(&request_hdr, dev_idx, NET_PACKET_ID_RGBCONTROLLER_ADDSEGMENT, size);
send(client_sock, (char *)&request_hdr, sizeof(NetPacketHeader), MSG_NOSIGNAL);
send(client_sock, (char *)data, size, 0);
}
void NetworkClient::SendRequest_RGBController_ResizeZone(unsigned int dev_idx, int zone, int new_size)
{
if(change_in_progress)

View File

@@ -48,7 +48,7 @@ public:
void ListenThreadFunction();
void WaitOnControllerData();
void ProcessReply_ControllerCount(unsigned int data_size, char * data);
void ProcessReply_ControllerData(unsigned int data_size, char * data, unsigned int dev_idx);
void ProcessReply_ProtocolVersion(unsigned int data_size, char * data);
@@ -61,6 +61,8 @@ public:
void SendRequest_ControllerData(unsigned int dev_idx);
void SendRequest_ProtocolVersion();
void SendRequest_RGBController_ClearSegments(unsigned int dev_idx, int zone);
void SendRequest_RGBController_AddSegment(unsigned int dev_idx, unsigned char * data, unsigned int size);
void SendRequest_RGBController_ResizeZone(unsigned int dev_idx, int zone, int new_size);
void SendRequest_RGBController_UpdateLEDs(unsigned int dev_idx, unsigned char * data, unsigned int size);

View File

@@ -74,6 +74,8 @@ enum
| RGBController class functions |
\*----------------------------------------------------------------------------------------------------------*/
NET_PACKET_ID_RGBCONTROLLER_RESIZEZONE = 1000, /* RGBController::ResizeZone() */
NET_PACKET_ID_RGBCONTROLLER_CLEARSEGMENTS = 1001, /* RGBController::ClearSegments() */
NET_PACKET_ID_RGBCONTROLLER_ADDSEGMENT = 1002, /* RGBController::AddSegment() */
NET_PACKET_ID_RGBCONTROLLER_UPDATELEDS = 1050, /* RGBController::UpdateLEDs() */
NET_PACKET_ID_RGBCONTROLLER_UPDATEZONELEDS = 1051, /* RGBController::UpdateZoneLEDs() */

View File

@@ -2156,6 +2156,76 @@ void RGBController::SetSingleLEDColorDescription(unsigned char* data_buf)
memcpy(&colors[led_idx], &data_buf[sizeof(led_idx)], sizeof(RGBColor));
}
unsigned char * RGBController::GetSegmentDescription(int zone, int segment)
{
unsigned int data_ptr = 0;
unsigned int data_size = 0;
/*---------------------------------------------------------*\
| Length of data size |
\*---------------------------------------------------------*/
data_size += sizeof(data_size);
/*---------------------------------------------------------*\
| Length of segment name string |
\*---------------------------------------------------------*/
data_size += sizeof(unsigned short);
/*---------------------------------------------------------*\
| Segment name string data |
\*---------------------------------------------------------*/
data_size += strlen(zones[zone].segments[segment].name.c_str()) + 1;
data_size += sizeof(zones[zone].segments[segment].type);
data_size += sizeof(zones[zone].segments[segment].start_idx);
data_size += sizeof(zones[zone].segments[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);
/*---------------------------------------------------------*\
| Length of segment name string |
\*---------------------------------------------------------*/
unsigned short segment_name_length = strlen(zones[zone].segments[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], zones[zone].segments[segment].name.c_str());
data_ptr += segment_name_length;
/*---------------------------------------------------------*\
| Segment type data |
\*---------------------------------------------------------*/
memcpy(&data_buf[data_ptr], &zones[zone].segments[segment].type, sizeof(zones[zone].segments[segment].type));
data_ptr += sizeof(zones[zone].segments[segment].type);
/*---------------------------------------------------------*\
| Segment start index data |
\*---------------------------------------------------------*/
memcpy(&data_buf[data_ptr], &zones[zone].segments[segment].start_idx, sizeof(zones[zone].segments[segment].start_idx));
data_ptr += sizeof(zones[zone].segments[segment].start_idx);
/*---------------------------------------------------------*\
| Segment LED count data |
\*---------------------------------------------------------*/
memcpy(&data_buf[data_ptr], &zones[zone].segments[segment].leds_count, sizeof(zones[zone].segments[segment].leds_count));
data_ptr += sizeof(zones[zone].segments[segment].leds_count);
return(data_buf);
}
void RGBController::SetupColors()
{
unsigned int total_led_count;
@@ -2403,6 +2473,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)

View File

@@ -307,6 +307,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 |
\*---------------------------------------------------------*/
@@ -387,6 +390,8 @@ public:
unsigned char * GetSingleLEDColorDescription(int led);
void SetSingleLEDColorDescription(unsigned char* data_buf);
unsigned char * GetSegmentDescription(int zone, int segment);
void RegisterUpdateCallback(RGBControllerCallback new_callback, void * new_callback_arg);
void UnregisterUpdateCallback(void * callback_arg);
void ClearCallbacks();
@@ -401,6 +406,9 @@ public:
void DeviceCallThreadFunction();
void ClearSegments(int zone);
void AddSegment(int zone, segment new_segment);
/*---------------------------------------------------------*\
| Functions to be implemented in device implementation |
\*---------------------------------------------------------*/

View File

@@ -25,6 +25,26 @@ 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, (zones[zone].segments.size() - 1));
unsigned int size;
memcpy(&size, &data[0], sizeof(unsigned int));
client->SendRequest_RGBController_AddSegment(dev_idx, data, size);
delete[] data;
}
void RGBController_Network::ResizeZone(int zone, int new_size)
{
client->SendRequest_RGBController_ResizeZone(dev_idx, zone, new_size);

View File

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

View File

@@ -183,7 +183,7 @@ int Ui::OpenRGBZoneResizeDialog::show()
{
edit_dev->ResizeZone(edit_zone_idx, ret_val);
edit_dev->zones[edit_zone_idx].segments.clear();
edit_dev->ClearSegments(edit_zone_idx);
unsigned int start_idx = 0;
@@ -195,7 +195,7 @@ int Ui::OpenRGBZoneResizeDialog::show()
new_segment.start_idx = start_idx;
new_segment.leds_count = ((QLineEdit*)ui->SegmentsTreeWidget->itemWidget(ui->SegmentsTreeWidget->topLevelItem(item_idx), 1))->text().toInt();
edit_dev->zones[edit_zone_idx].segments.push_back(new_segment);
edit_dev->AddSegment(edit_zone_idx, new_segment);
start_idx += new_segment.leds_count;
}