diff --git a/NetworkClient.cpp b/NetworkClient.cpp index e442c015..e33528bc 100644 --- a/NetworkClient.cpp +++ b/NetworkClient.cpp @@ -289,7 +289,7 @@ void NetworkClient::SendRequest_RGBController_ResizeZone(unsigned int dev_idx, i port.tcp_client_write((char *)&reply_data, sizeof(reply_data)); } -void NetworkClient::SendRequest_RGBController_UpdateLEDs(unsigned int dev_idx) +void NetworkClient::SendRequest_RGBController_UpdateLEDs(unsigned int dev_idx, unsigned char * data, unsigned int size) { NetPacketHeader reply_hdr; @@ -300,15 +300,15 @@ void NetworkClient::SendRequest_RGBController_UpdateLEDs(unsigned int dev_idx) reply_hdr.pkt_dev_idx = dev_idx; reply_hdr.pkt_id = NET_PACKET_ID_RGBCONTROLLER_UPDATELEDS; - reply_hdr.pkt_size = 0; + reply_hdr.pkt_size = size; port.tcp_client_write((char *)&reply_hdr, sizeof(NetPacketHeader)); + port.tcp_client_write((char *)data, size); } -void NetworkClient::SendRequest_RGBController_UpdateZoneLEDs(unsigned int dev_idx, int zone) +void NetworkClient::SendRequest_RGBController_UpdateZoneLEDs(unsigned int dev_idx, unsigned char * data, unsigned int size) { NetPacketHeader reply_hdr; - int reply_data[1]; reply_hdr.pkt_magic[0] = 'O'; reply_hdr.pkt_magic[1] = 'R'; @@ -317,18 +317,15 @@ void NetworkClient::SendRequest_RGBController_UpdateZoneLEDs(unsigned int dev_id reply_hdr.pkt_dev_idx = dev_idx; reply_hdr.pkt_id = NET_PACKET_ID_RGBCONTROLLER_UPDATEZONELEDS; - reply_hdr.pkt_size = sizeof(reply_data); - - reply_data[0] = zone; + reply_hdr.pkt_size = size; port.tcp_client_write((char *)&reply_hdr, sizeof(NetPacketHeader)); - port.tcp_client_write((char *)&reply_data, sizeof(reply_data)); + port.tcp_client_write((char *)data, size); } -void NetworkClient::SendRequest_RGBController_UpdateSingleLED(unsigned int dev_idx, int led) +void NetworkClient::SendRequest_RGBController_UpdateSingleLED(unsigned int dev_idx, unsigned char * data, unsigned int size) { NetPacketHeader reply_hdr; - int reply_data[1]; reply_hdr.pkt_magic[0] = 'O'; reply_hdr.pkt_magic[1] = 'R'; @@ -337,12 +334,10 @@ void NetworkClient::SendRequest_RGBController_UpdateSingleLED(unsigned int dev_i reply_hdr.pkt_dev_idx = dev_idx; reply_hdr.pkt_id = NET_PACKET_ID_RGBCONTROLLER_UPDATESINGLELED; - reply_hdr.pkt_size = sizeof(reply_data); - - reply_data[0] = led; + reply_hdr.pkt_size = size; port.tcp_client_write((char *)&reply_hdr, sizeof(NetPacketHeader)); - port.tcp_client_write((char *)&reply_data, sizeof(reply_data)); + port.tcp_client_write((char *)data, size); } void NetworkClient::SendRequest_RGBController_SetCustomMode(unsigned int dev_idx) diff --git a/NetworkClient.h b/NetworkClient.h index beb056c1..a0f62538 100644 --- a/NetworkClient.h +++ b/NetworkClient.h @@ -20,9 +20,9 @@ public: void SendRequest_RGBController_ResizeZone(unsigned int dev_idx, int zone, int new_size); - void SendRequest_RGBController_UpdateLEDs(unsigned int dev_idx); - void SendRequest_RGBController_UpdateZoneLEDs(unsigned int dev_idx, int zone); - void SendRequest_RGBController_UpdateSingleLED(unsigned int dev_idx, int led); + void SendRequest_RGBController_UpdateLEDs(unsigned int dev_idx, unsigned char * data, unsigned int size); + void SendRequest_RGBController_UpdateZoneLEDs(unsigned int dev_idx, unsigned char * data, unsigned int size); + void SendRequest_RGBController_UpdateSingleLED(unsigned int dev_idx, unsigned char * data, unsigned int size); void SendRequest_RGBController_SetCustomMode(unsigned int dev_idx); diff --git a/NetworkServer.cpp b/NetworkServer.cpp index af3fdc61..3507ecc8 100644 --- a/NetworkServer.cpp +++ b/NetworkServer.cpp @@ -202,6 +202,7 @@ void NetworkServer::ListenThread(SOCKET * client_sock) if(header.pkt_dev_idx < controllers.size()) { + controllers[header.pkt_dev_idx]->SetColorDescription((unsigned char *)data); controllers[header.pkt_dev_idx]->UpdateLEDs(); } break; @@ -209,12 +210,13 @@ void NetworkServer::ListenThread(SOCKET * client_sock) case NET_PACKET_ID_RGBCONTROLLER_UPDATEZONELEDS: printf( "NET_PACKET_ID_RGBCONTROLLER_UPDATEZONELEDS\r\n" ); - if((header.pkt_dev_idx < controllers.size()) && (header.pkt_size == sizeof(int))) + if(header.pkt_dev_idx < controllers.size()) { int zone; - memcpy(&zone, data, sizeof(int)); + memcpy(&zone, &data[sizeof(unsigned int)], sizeof(int)); + controllers[header.pkt_dev_idx]->SetZoneColorDescription((unsigned char *)data); controllers[header.pkt_dev_idx]->UpdateZoneLEDs(zone); } break; @@ -222,12 +224,13 @@ void NetworkServer::ListenThread(SOCKET * client_sock) case NET_PACKET_ID_RGBCONTROLLER_UPDATESINGLELED: printf( "NET_PACKET_ID_RGBCONTROLLER_UPDATESINGLELED\r\n" ); - if((header.pkt_dev_idx < controllers.size()) && (header.pkt_size == sizeof(int))) + if(header.pkt_dev_idx < controllers.size()) { int led; memcpy(&led, data, sizeof(int)); + controllers[header.pkt_dev_idx]->SetSingleLEDColorDescription((unsigned char *)data); controllers[header.pkt_dev_idx]->UpdateSingleLED(led); } break; diff --git a/RGBController/RGBController.cpp b/RGBController/RGBController.cpp index d2943a1c..3170b348 100644 --- a/RGBController/RGBController.cpp +++ b/RGBController/RGBController.cpp @@ -621,6 +621,11 @@ void RGBController::ReadDeviceDescription(unsigned char* data_buf) colors.push_back(new_color); } + + /*---------------------------------------------------------*\ + | Setup colors | + \*---------------------------------------------------------*/ + SetupColors(); } unsigned char * RGBController::GetModeDescription(int mode) @@ -653,8 +658,6 @@ unsigned char * RGBController::GetModeDescription(int mode) data_size += sizeof(mode_num_colors); data_size += (mode_num_colors * sizeof(RGBColor)); - printf( "Data size: %d \r\n", data_size ); - /*---------------------------------------------------------*\ | Create data buffer | \*---------------------------------------------------------*/ @@ -753,7 +756,6 @@ unsigned char * RGBController::GetModeDescription(int mode) data_ptr += sizeof(modes[mode].colors[color_index]); } - printf( "end data_ptr %d\r\n", data_ptr ); return(data_buf); } @@ -868,6 +870,210 @@ void RGBController::SetModeDescription(unsigned char* data_buf) printf("read data ptr %d\r\n", data_ptr); } +unsigned char * RGBController::GetColorDescription() +{ + unsigned int data_ptr = 0; + unsigned int data_size = 0; + + unsigned short num_colors = colors.size(); + + /*---------------------------------------------------------*\ + | Calculate data size | + \*---------------------------------------------------------*/ + data_size += sizeof(data_size); + data_size += sizeof(num_colors); + data_size += num_colors * sizeof(RGBColor); + + /*---------------------------------------------------------*\ + | 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 number of colors (data) | + \*---------------------------------------------------------*/ + memcpy(&data_buf[data_ptr], &num_colors, sizeof(unsigned short)); + data_ptr += sizeof(unsigned short); + + /*---------------------------------------------------------*\ + | Copy in colors | + \*---------------------------------------------------------*/ + for(int color_index = 0; color_index < num_colors; color_index++) + { + /*---------------------------------------------------------*\ + | Copy in color (data) | + \*---------------------------------------------------------*/ + memcpy(&data_buf[data_ptr], &colors[color_index], sizeof(colors[color_index])); + data_ptr += sizeof(colors[color_index]); + } + + return(data_buf); +} + +void RGBController::SetColorDescription(unsigned char* data_buf) +{ + unsigned int data_ptr = sizeof(unsigned int); + + /*---------------------------------------------------------*\ + | Copy in number of colors (data) | + \*---------------------------------------------------------*/ + unsigned short num_colors; + memcpy(&num_colors, &data_buf[data_ptr], sizeof(unsigned short)); + data_ptr += sizeof(unsigned short); + + /*---------------------------------------------------------*\ + | Copy in colors | + \*---------------------------------------------------------*/ + for(int color_index = 0; color_index < num_colors; color_index++) + { + RGBColor new_color; + + /*---------------------------------------------------------*\ + | Copy in color (data) | + \*---------------------------------------------------------*/ + memcpy(&new_color, &data_buf[data_ptr], sizeof(RGBColor)); + data_ptr += sizeof(RGBColor); + + colors[color_index] = new_color; + } +} + +unsigned char * RGBController::GetZoneColorDescription(int zone) +{ + unsigned int data_ptr = 0; + unsigned int data_size = 0; + + unsigned short num_colors = zones[zone].leds_count; + + /*---------------------------------------------------------*\ + | Calculate data size | + \*---------------------------------------------------------*/ + data_size += sizeof(data_size); + data_size += sizeof(zone); + data_size += sizeof(num_colors); + data_size += num_colors * sizeof(RGBColor); + + /*---------------------------------------------------------*\ + | 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); + + /*---------------------------------------------------------*\ + | Copy in number of colors (data) | + \*---------------------------------------------------------*/ + memcpy(&data_buf[data_ptr], &num_colors, sizeof(unsigned short)); + data_ptr += sizeof(unsigned short); + + /*---------------------------------------------------------*\ + | Copy in colors | + \*---------------------------------------------------------*/ + for(int color_index = 0; color_index < num_colors; color_index++) + { + /*---------------------------------------------------------*\ + | Copy in color (data) | + \*---------------------------------------------------------*/ + memcpy(&data_buf[data_ptr], &zones[zone].colors[color_index], sizeof(zones[zone].colors[color_index])); + data_ptr += sizeof(zones[zone].colors[color_index]); + } + + return(data_buf); +} + +void RGBController::SetZoneColorDescription(unsigned char* data_buf) +{ + unsigned int data_ptr = sizeof(unsigned int); + unsigned int zone_idx; + + /*---------------------------------------------------------*\ + | Copy in zone index | + \*---------------------------------------------------------*/ + memcpy(&zone_idx, &data_buf[data_ptr], sizeof(zone_idx)); + data_ptr += sizeof(zone_idx); + + /*---------------------------------------------------------*\ + | Copy in number of colors (data) | + \*---------------------------------------------------------*/ + unsigned short num_colors; + memcpy(&num_colors, &data_buf[data_ptr], sizeof(unsigned short)); + data_ptr += sizeof(unsigned short); + + /*---------------------------------------------------------*\ + | Copy in colors | + \*---------------------------------------------------------*/ + for(int color_index = 0; color_index < num_colors; color_index++) + { + RGBColor new_color; + + /*---------------------------------------------------------*\ + | Copy in color (data) | + \*---------------------------------------------------------*/ + memcpy(&new_color, &data_buf[data_ptr], sizeof(RGBColor)); + data_ptr += sizeof(RGBColor); + + zones[zone_idx].colors[color_index] = new_color; + } +} + +unsigned char * RGBController::GetSingleLEDColorDescription(int led) +{ + /*---------------------------------------------------------*\ + | Fixed size descrption: | + | int: LED index | + | RGBColor: LED color | + \*---------------------------------------------------------*/ + unsigned char *data_buf = new unsigned char[sizeof(int) + sizeof(RGBColor)]; + + /*---------------------------------------------------------*\ + | Copy in LED index | + \*---------------------------------------------------------*/ + memcpy(&data_buf[0], &led, sizeof(int)); + + /*---------------------------------------------------------*\ + | Copy in LED color | + \*---------------------------------------------------------*/ + memcpy(&data_buf[sizeof(led)], &colors[led], sizeof(RGBColor)); + + return(data_buf); +} + +void RGBController::SetSingleLEDColorDescription(unsigned char* data_buf) +{ + /*---------------------------------------------------------*\ + | Fixed size descrption: | + | int: LED index | + | RGBColor: LED color | + \*---------------------------------------------------------*/ + int led_idx; + + /*---------------------------------------------------------*\ + | Copy in LED index | + \*---------------------------------------------------------*/ + memcpy(&led_idx, &data_buf[0], sizeof(led_idx)); + + /*---------------------------------------------------------*\ + | Copy in LED color | + \*---------------------------------------------------------*/ + memcpy(&colors[led_idx], &data_buf[sizeof(led_idx)], sizeof(RGBColor)); +} + void RGBController::SetupColors() { unsigned int total_led_count; diff --git a/RGBController/RGBController.h b/RGBController/RGBController.h index fbcdc036..81905c47 100644 --- a/RGBController/RGBController.h +++ b/RGBController/RGBController.h @@ -163,6 +163,15 @@ public: unsigned char * GetModeDescription(int mode); void SetModeDescription(unsigned char* data_buf); + unsigned char * GetColorDescription(); + void SetColorDescription(unsigned char* data_buf); + + unsigned char * GetZoneColorDescription(int zone); + void SetZoneColorDescription(unsigned char* data_buf); + + unsigned char * GetSingleLEDColorDescription(int led); + void SetSingleLEDColorDescription(unsigned char* data_buf); + /*---------------------------------------------------------*\ | Functions to be implemented in device implementation | \*---------------------------------------------------------*/ diff --git a/RGBController/RGBController_Network.cpp b/RGBController/RGBController_Network.cpp index 79d3d785..25a2bf48 100644 --- a/RGBController/RGBController_Network.cpp +++ b/RGBController/RGBController_Network.cpp @@ -28,17 +28,28 @@ void RGBController_Network::ResizeZone(int zone, int new_size) void RGBController_Network::UpdateLEDs() { - client->SendRequest_RGBController_UpdateLEDs(dev_idx); + unsigned char * data = GetColorDescription(); + unsigned int size; + + memcpy(&size, &data[0], sizeof(unsigned int)); + + client->SendRequest_RGBController_UpdateLEDs(dev_idx, data, size); } void RGBController_Network::UpdateZoneLEDs(int zone) { - client->SendRequest_RGBController_UpdateZoneLEDs(dev_idx, zone); + unsigned char * data = GetZoneColorDescription(zone); + unsigned int size; + + memcpy(&size, &data[0], sizeof(unsigned int)); + + client->SendRequest_RGBController_UpdateZoneLEDs(dev_idx, data, size); } void RGBController_Network::UpdateSingleLED(int led) { - client->SendRequest_RGBController_UpdateSingleLED(dev_idx, led); + unsigned char * data = GetSingleLEDColorDescription(led); + client->SendRequest_RGBController_UpdateSingleLED(dev_idx, data, sizeof(int) + sizeof(RGBColor)); } void RGBController_Network::SetCustomMode()