Skip to content

Commit 012cb5e

Browse files
Fix segment creation and modification over the network protocol
1 parent e634a77 commit 012cb5e

File tree

9 files changed

+261
-3
lines changed

9 files changed

+261
-3
lines changed

NetworkClient.cpp

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -609,6 +609,8 @@ void NetworkClient::ProcessReply_ControllerData(unsigned int data_size, char * d
609609
for(unsigned int i = 0; i < server_controllers[dev_idx]->zones.size(); i++)
610610
{
611611
server_controllers[dev_idx]->zones[i].leds_count = new_controller->zones[i].leds_count;
612+
server_controllers[dev_idx]->zones[i].segments.clear();
613+
server_controllers[dev_idx]->zones[i].segments = new_controller->zones[i].segments;
612614
}
613615
server_controllers[dev_idx]->SetupColors();
614616

@@ -754,6 +756,39 @@ void NetworkClient::SendRequest_ProtocolVersion()
754756
send_in_progress.unlock();
755757
}
756758

759+
void NetworkClient::SendRequest_RGBController_ClearSegments(unsigned int dev_idx, int zone)
760+
{
761+
if(change_in_progress)
762+
{
763+
return;
764+
}
765+
766+
NetPacketHeader request_hdr;
767+
int request_data[1];
768+
769+
InitNetPacketHeader(&request_hdr, dev_idx, NET_PACKET_ID_RGBCONTROLLER_CLEARSEGMENTS, sizeof(request_data));
770+
771+
request_data[0] = zone;
772+
773+
send(client_sock, (char *)&request_hdr, sizeof(NetPacketHeader), MSG_NOSIGNAL);
774+
send(client_sock, (char *)&request_data, sizeof(request_data), MSG_NOSIGNAL);
775+
}
776+
777+
void NetworkClient::SendRequest_RGBController_AddSegment(unsigned int dev_idx, unsigned char * data, unsigned int size)
778+
{
779+
if(change_in_progress)
780+
{
781+
return;
782+
}
783+
784+
NetPacketHeader request_hdr;
785+
786+
InitNetPacketHeader(&request_hdr, dev_idx, NET_PACKET_ID_RGBCONTROLLER_ADDSEGMENT, size);
787+
788+
send(client_sock, (char *)&request_hdr, sizeof(NetPacketHeader), MSG_NOSIGNAL);
789+
send(client_sock, (char *)data, size, 0);
790+
}
791+
757792
void NetworkClient::SendRequest_RGBController_ResizeZone(unsigned int dev_idx, int zone, int new_size)
758793
{
759794
if(change_in_progress)

NetworkClient.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ class NetworkClient
4848
void ListenThreadFunction();
4949

5050
void WaitOnControllerData();
51-
51+
5252
void ProcessReply_ControllerCount(unsigned int data_size, char * data);
5353
void ProcessReply_ControllerData(unsigned int data_size, char * data, unsigned int dev_idx);
5454
void ProcessReply_ProtocolVersion(unsigned int data_size, char * data);
@@ -61,6 +61,8 @@ class NetworkClient
6161
void SendRequest_ControllerData(unsigned int dev_idx);
6262
void SendRequest_ProtocolVersion();
6363

64+
void SendRequest_RGBController_ClearSegments(unsigned int dev_idx, int zone);
65+
void SendRequest_RGBController_AddSegment(unsigned int dev_idx, unsigned char * data, unsigned int size);
6466
void SendRequest_RGBController_ResizeZone(unsigned int dev_idx, int zone, int new_size);
6567

6668
void SendRequest_RGBController_UpdateLEDs(unsigned int dev_idx, unsigned char * data, unsigned int size);

NetworkProtocol.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,8 @@ enum
7474
| RGBController class functions |
7575
\*----------------------------------------------------------------------------------------------------------*/
7676
NET_PACKET_ID_RGBCONTROLLER_RESIZEZONE = 1000, /* RGBController::ResizeZone() */
77+
NET_PACKET_ID_RGBCONTROLLER_CLEARSEGMENTS = 1001, /* RGBController::ClearSegments() */
78+
NET_PACKET_ID_RGBCONTROLLER_ADDSEGMENT = 1002, /* RGBController::AddSegment() */
7779

7880
NET_PACKET_ID_RGBCONTROLLER_UPDATELEDS = 1050, /* RGBController::UpdateLEDs() */
7981
NET_PACKET_ID_RGBCONTROLLER_UPDATEZONELEDS = 1051, /* RGBController::UpdateZoneLEDs() */

NetworkServer.cpp

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -932,6 +932,39 @@ void NetworkServer::ListenThreadFunction(NetworkClientInfo * client_info)
932932
}
933933
break;
934934
}
935+
break;
936+
937+
case NET_PACKET_ID_RGBCONTROLLER_CLEARSEGMENTS:
938+
if(data == NULL)
939+
{
940+
break;
941+
}
942+
943+
if((header.pkt_dev_idx < controllers.size()) && (header.pkt_size == sizeof(int)))
944+
{
945+
int zone;
946+
947+
memcpy(&zone, data, sizeof(int));
948+
949+
controllers[header.pkt_dev_idx]->zones[zone].segments.clear();
950+
}
951+
break;
952+
953+
case NET_PACKET_ID_RGBCONTROLLER_ADDSEGMENT:
954+
{
955+
/*---------------------------------------------------------*\
956+
| Verify the mode description size (first 4 bytes of data) |
957+
| matches the packet size in the header |
958+
\*---------------------------------------------------------*/
959+
if(header.pkt_size == *((unsigned int*)data))
960+
{
961+
if(header.pkt_dev_idx < controllers.size())
962+
{
963+
controllers[header.pkt_dev_idx]->SetSegmentDescription((unsigned char *)data);
964+
}
965+
}
966+
}
967+
break;
935968
}
936969

937970
delete[] data;

RGBController/RGBController.cpp

Lines changed: 152 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1723,6 +1723,148 @@ void RGBController::SetSingleLEDColorDescription(unsigned char* data_buf)
17231723
memcpy(&colors[led_idx], &data_buf[sizeof(led_idx)], sizeof(RGBColor));
17241724
}
17251725

1726+
unsigned char * RGBController::GetSegmentDescription(int zone, segment new_segment)
1727+
{
1728+
unsigned int data_ptr = 0;
1729+
unsigned int data_size = 0;
1730+
1731+
/*---------------------------------------------------------*\
1732+
| Length of data size |
1733+
\*---------------------------------------------------------*/
1734+
data_size += sizeof(data_size);
1735+
1736+
/*---------------------------------------------------------*\
1737+
| Length of zone index |
1738+
\*---------------------------------------------------------*/
1739+
data_size += sizeof(zone);
1740+
1741+
/*---------------------------------------------------------*\
1742+
| Length of segment name string |
1743+
\*---------------------------------------------------------*/
1744+
data_size += sizeof(unsigned short);
1745+
1746+
/*---------------------------------------------------------*\
1747+
| Segment name string data |
1748+
\*---------------------------------------------------------*/
1749+
data_size += strlen(new_segment.name.c_str()) + 1;
1750+
1751+
data_size += sizeof(new_segment.type);
1752+
data_size += sizeof(new_segment.start_idx);
1753+
data_size += sizeof(new_segment.leds_count);
1754+
1755+
/*---------------------------------------------------------*\
1756+
| Create data buffer |
1757+
\*---------------------------------------------------------*/
1758+
unsigned char *data_buf = new unsigned char[data_size];
1759+
1760+
/*---------------------------------------------------------*\
1761+
| Copy in data size |
1762+
\*---------------------------------------------------------*/
1763+
memcpy(&data_buf[data_ptr], &data_size, sizeof(data_size));
1764+
data_ptr += sizeof(data_size);
1765+
1766+
/*---------------------------------------------------------*\
1767+
| Copy in zone index |
1768+
\*---------------------------------------------------------*/
1769+
memcpy(&data_buf[data_ptr], &zone, sizeof(zone));
1770+
data_ptr += sizeof(zone);
1771+
1772+
/*---------------------------------------------------------*\
1773+
| Length of segment name string |
1774+
\*---------------------------------------------------------*/
1775+
unsigned short segment_name_length = strlen(new_segment.name.c_str()) + 1;
1776+
1777+
memcpy(&data_buf[data_ptr], &segment_name_length, sizeof(segment_name_length));
1778+
data_ptr += sizeof(segment_name_length);
1779+
1780+
/*---------------------------------------------------------*\
1781+
| Segment name string data |
1782+
\*---------------------------------------------------------*/
1783+
strcpy((char *)&data_buf[data_ptr], new_segment.name.c_str());
1784+
data_ptr += segment_name_length;
1785+
1786+
/*---------------------------------------------------------*\
1787+
| Segment type data |
1788+
\*---------------------------------------------------------*/
1789+
memcpy(&data_buf[data_ptr], &new_segment.type, sizeof(new_segment.type));
1790+
data_ptr += sizeof(new_segment.type);
1791+
1792+
/*---------------------------------------------------------*\
1793+
| Segment start index data |
1794+
\*---------------------------------------------------------*/
1795+
memcpy(&data_buf[data_ptr], &new_segment.start_idx, sizeof(new_segment.start_idx));
1796+
data_ptr += sizeof(new_segment.start_idx);
1797+
1798+
/*---------------------------------------------------------*\
1799+
| Segment LED count data |
1800+
\*---------------------------------------------------------*/
1801+
memcpy(&data_buf[data_ptr], &new_segment.leds_count, sizeof(new_segment.leds_count));
1802+
data_ptr += sizeof(new_segment.leds_count);
1803+
1804+
return(data_buf);
1805+
}
1806+
1807+
void RGBController::SetSegmentDescription(unsigned char* data_buf)
1808+
{
1809+
unsigned int data_ptr = sizeof(unsigned int);
1810+
1811+
/*---------------------------------------------------------*\
1812+
| Copy in zone index |
1813+
\*---------------------------------------------------------*/
1814+
unsigned int zone_idx;
1815+
memcpy(&zone_idx, &data_buf[data_ptr], sizeof(zone_idx));
1816+
data_ptr += sizeof(zone_idx);
1817+
1818+
/*---------------------------------------------------------*\
1819+
| Length of segment name string |
1820+
\*---------------------------------------------------------*/
1821+
unsigned short segment_name_length;
1822+
memcpy(&segment_name_length, &data_buf[data_ptr], sizeof(segment_name_length));
1823+
data_ptr += sizeof(segment_name_length);
1824+
1825+
/*---------------------------------------------------------*\
1826+
| Segment name string data |
1827+
\*---------------------------------------------------------*/
1828+
char * segment_name = new char[segment_name_length];
1829+
memcpy(segment_name, &data_buf[data_ptr], segment_name_length);
1830+
data_ptr += segment_name_length;
1831+
1832+
/*---------------------------------------------------------*\
1833+
| Segment type data |
1834+
\*---------------------------------------------------------*/
1835+
zone_type segment_type;
1836+
memcpy(&segment_type, &data_buf[data_ptr], sizeof(segment_type));
1837+
data_ptr += sizeof(segment_type);
1838+
1839+
/*---------------------------------------------------------*\
1840+
| Segment start index data |
1841+
\*---------------------------------------------------------*/
1842+
unsigned int segment_start_idx;
1843+
memcpy(&segment_start_idx, &data_buf[data_ptr], sizeof(segment_start_idx));
1844+
data_ptr += sizeof(segment_start_idx);
1845+
1846+
/*---------------------------------------------------------*\
1847+
| Segment LED count data |
1848+
\*---------------------------------------------------------*/
1849+
unsigned int segment_leds_count;
1850+
memcpy(&segment_leds_count, &data_buf[data_ptr], sizeof(segment_leds_count));
1851+
data_ptr += sizeof(segment_leds_count);
1852+
1853+
/*---------------------------------------------------------*\
1854+
| Add new segment |
1855+
\*---------------------------------------------------------*/
1856+
segment new_segment;
1857+
1858+
new_segment.name = segment_name;
1859+
new_segment.type = segment_type;
1860+
new_segment.start_idx = segment_start_idx;
1861+
new_segment.leds_count = segment_leds_count;
1862+
1863+
AddSegment(zone_idx, new_segment);
1864+
1865+
delete[] segment_name;
1866+
}
1867+
17261868
void RGBController::SetupColors()
17271869
{
17281870
unsigned int total_led_count;
@@ -1970,6 +2112,16 @@ void RGBController::DeviceSaveMode()
19702112
\*-------------------------------------------------*/
19712113
}
19722114

2115+
void RGBController::ClearSegments(int zone)
2116+
{
2117+
zones[zone].segments.clear();
2118+
}
2119+
2120+
void RGBController::AddSegment(int zone, segment new_segment)
2121+
{
2122+
zones[zone].segments.push_back(new_segment);
2123+
}
2124+
19732125
std::string device_type_to_str(device_type type)
19742126
{
19752127
switch(type)

RGBController/RGBController.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,9 @@ class RGBControllerInterface
276276

277277
virtual void DeviceCallThreadFunction() = 0;
278278

279+
virtual void ClearSegments(int zone) = 0;
280+
virtual void AddSegment(int zone, segment new_segment) = 0;
281+
279282
/*---------------------------------------------------------*\
280283
| Functions to be implemented in device implementation |
281284
\*---------------------------------------------------------*/
@@ -357,6 +360,9 @@ class RGBController : public RGBControllerInterface
357360
unsigned char * GetSingleLEDColorDescription(int led);
358361
void SetSingleLEDColorDescription(unsigned char* data_buf);
359362

363+
unsigned char * GetSegmentDescription(int zone, segment new_segment);
364+
void SetSegmentDescription(unsigned char* data_buf);
365+
360366
void RegisterUpdateCallback(RGBControllerCallback new_callback, void * new_callback_arg);
361367
void UnregisterUpdateCallback(void * callback_arg);
362368
void ClearCallbacks();
@@ -371,6 +377,9 @@ class RGBController : public RGBControllerInterface
371377

372378
void DeviceCallThreadFunction();
373379

380+
void ClearSegments(int zone);
381+
void AddSegment(int zone, segment new_segment);
382+
374383
/*---------------------------------------------------------*\
375384
| Functions to be implemented in device implementation |
376385
\*---------------------------------------------------------*/

RGBController/RGBController_Network.cpp

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,29 @@ void RGBController_Network::SetupZones()
2525
//Don't send anything, this function should only process on host
2626
}
2727

28+
void RGBController_Network::ClearSegments(int zone)
29+
{
30+
client->SendRequest_RGBController_ClearSegments(dev_idx, zone);
31+
32+
client->SendRequest_ControllerData(dev_idx);
33+
client->WaitOnControllerData();
34+
}
35+
36+
void RGBController_Network::AddSegment(int zone, segment new_segment)
37+
{
38+
unsigned char * data = GetSegmentDescription(zone, new_segment);
39+
unsigned int size;
40+
41+
memcpy(&size, &data[0], sizeof(unsigned int));
42+
43+
client->SendRequest_RGBController_AddSegment(dev_idx, data, size);
44+
45+
delete[] data;
46+
47+
client->SendRequest_ControllerData(dev_idx);
48+
client->WaitOnControllerData();
49+
}
50+
2851
void RGBController_Network::ResizeZone(int zone, int new_size)
2952
{
3053
client->SendRequest_RGBController_ResizeZone(dev_idx, zone, new_size);

RGBController/RGBController_Network.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ class RGBController_Network : public RGBController
2222

2323
void SetupZones();
2424

25+
void ClearSegments(int zone);
26+
void AddSegment(int zone, segment new_segment);
2527
void ResizeZone(int zone, int new_size);
2628

2729
void DeviceUpdateLEDs();

qt/OpenRGBZoneResizeDialog/OpenRGBZoneResizeDialog.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ int Ui::OpenRGBZoneResizeDialog::show()
183183
{
184184
edit_dev->ResizeZone(edit_zone_idx, ret_val);
185185

186-
edit_dev->zones[edit_zone_idx].segments.clear();
186+
edit_dev->ClearSegments(edit_zone_idx);
187187

188188
unsigned int start_idx = 0;
189189

@@ -195,7 +195,7 @@ int Ui::OpenRGBZoneResizeDialog::show()
195195
new_segment.start_idx = start_idx;
196196
new_segment.leds_count = ((QLineEdit*)ui->SegmentsTreeWidget->itemWidget(ui->SegmentsTreeWidget->topLevelItem(item_idx), 1))->text().toInt();
197197

198-
edit_dev->zones[edit_zone_idx].segments.push_back(new_segment);
198+
edit_dev->AddSegment(edit_zone_idx, new_segment);
199199

200200
start_idx += new_segment.leds_count;
201201
}

0 commit comments

Comments
 (0)