From eccfcb12597ef40ff872523efe2b24b3e3dbc0a4 Mon Sep 17 00:00:00 2001 From: Adam Honse Date: Thu, 25 Jul 2024 23:11:48 -0500 Subject: [PATCH] Start working on getting segment setting to work over the network --- NetworkClient.cpp | 33 ++++++++ NetworkClient.h | 4 +- NetworkProtocol.h | 2 + RGBController/RGBController.cpp | 80 +++++++++++++++++++ RGBController/RGBController.h | 8 ++ RGBController/RGBController_Network.cpp | 20 +++++ RGBController/RGBController_Network.h | 2 + .../OpenRGBZoneResizeDialog.cpp | 4 +- 8 files changed, 150 insertions(+), 3 deletions(-) diff --git a/NetworkClient.cpp b/NetworkClient.cpp index 149a7a5f3..847899266 100644 --- a/NetworkClient.cpp +++ b/NetworkClient.cpp @@ -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) diff --git a/NetworkClient.h b/NetworkClient.h index e92c815c9..77353f53e 100644 --- a/NetworkClient.h +++ b/NetworkClient.h @@ -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); diff --git a/NetworkProtocol.h b/NetworkProtocol.h index 14aa8e415..05fe1bb13 100644 --- a/NetworkProtocol.h +++ b/NetworkProtocol.h @@ -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() */ diff --git a/RGBController/RGBController.cpp b/RGBController/RGBController.cpp index 83e39ff75..e9890f00d 100644 --- a/RGBController/RGBController.cpp +++ b/RGBController/RGBController.cpp @@ -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) diff --git a/RGBController/RGBController.h b/RGBController/RGBController.h index cd8e2f478..184749972 100644 --- a/RGBController/RGBController.h +++ b/RGBController/RGBController.h @@ -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 | \*---------------------------------------------------------*/ diff --git a/RGBController/RGBController_Network.cpp b/RGBController/RGBController_Network.cpp index 8bc28809a..d3e22deee 100644 --- a/RGBController/RGBController_Network.cpp +++ b/RGBController/RGBController_Network.cpp @@ -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); diff --git a/RGBController/RGBController_Network.h b/RGBController/RGBController_Network.h index acb3a57f5..d7948d528 100644 --- a/RGBController/RGBController_Network.h +++ b/RGBController/RGBController_Network.h @@ -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(); diff --git a/qt/OpenRGBZoneResizeDialog/OpenRGBZoneResizeDialog.cpp b/qt/OpenRGBZoneResizeDialog/OpenRGBZoneResizeDialog.cpp index 290078d65..2a8a53768 100644 --- a/qt/OpenRGBZoneResizeDialog/OpenRGBZoneResizeDialog.cpp +++ b/qt/OpenRGBZoneResizeDialog/OpenRGBZoneResizeDialog.cpp @@ -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; }