diff --git a/NetworkClient.cpp b/NetworkClient.cpp index f09fdc59f..56379dbe2 100644 --- a/NetworkClient.cpp +++ b/NetworkClient.cpp @@ -876,6 +876,23 @@ void NetworkClient::SendRequest_RGBController_ResizeZone(unsigned int dev_idx, i send_in_progress.unlock(); } +void NetworkClient::SendRequest_RGBController_SetHidden(unsigned int dev_idx, bool hidden) +{ + if(change_in_progress) + { + return; + } + + NetPacketHeader request_hdr; + + InitNetPacketHeader(&request_hdr, dev_idx, NET_PACKET_ID_RGBCONTROLLER_SETHIDDEN, sizeof(hidden)); + + send_in_progress.lock(); + send(client_sock, (char *)&request_hdr, sizeof(NetPacketHeader), MSG_NOSIGNAL); + send(client_sock, (char *)&hidden, sizeof(hidden), MSG_NOSIGNAL); + send_in_progress.unlock(); +} + void NetworkClient::SendRequest_RGBController_UpdateLEDs(unsigned int dev_idx, unsigned char* data_ptr, unsigned int data_size) { if(change_in_progress) @@ -889,7 +906,7 @@ void NetworkClient::SendRequest_RGBController_UpdateLEDs(unsigned int dev_idx, u send_in_progress.lock(); send(client_sock, (char *)&request_hdr, sizeof(NetPacketHeader), MSG_NOSIGNAL); - send(client_sock, (char *)data_ptr, data_size, 0); + send(client_sock, (char *)data_ptr, data_size, MSG_NOSIGNAL); send_in_progress.unlock(); } @@ -1900,6 +1917,12 @@ void NetworkClient::ProcessRequest_RGBController_SignalUpdate(unsigned int data_ case RGBCONTROLLER_UPDATE_REASON_SETDEVICESPECIFICZONECONFIGURATION: default: RGBController::SetDeviceDescription(data_ptr, data_size - (data_ptr - data_start), controller, GetProtocolVersion()); + + /*---------------------------------------------*\ + | Mark this controller as remote owned | + \*---------------------------------------------*/ + controller->flags &= ~CONTROLLER_FLAG_LOCAL; + controller->flags |= CONTROLLER_FLAG_REMOTE; break; } diff --git a/NetworkClient.h b/NetworkClient.h index 927e8386c..8543d2d27 100644 --- a/NetworkClient.h +++ b/NetworkClient.h @@ -155,6 +155,7 @@ public: void SendRequest_RGBController_AddSegment(unsigned int dev_idx, unsigned char* data_ptr, unsigned int data_size); void SendRequest_RGBController_ConfigureZone(unsigned int dev_idx, unsigned char* data_ptr, unsigned int data_size); void SendRequest_RGBController_ResizeZone(unsigned int dev_idx, int zone, int new_size); + void SendRequest_RGBController_SetHidden(unsigned int dev_idx, bool hidden); void SendRequest_RGBController_UpdateLEDs(unsigned int dev_idx, unsigned char* data_ptr, unsigned int data_size); void SendRequest_RGBController_UpdateZoneLEDs(unsigned int dev_idx, unsigned char* data_ptr, unsigned int data_size); diff --git a/NetworkProtocol.h b/NetworkProtocol.h index bf25de3be..36ba62749 100644 --- a/NetworkProtocol.h +++ b/NetworkProtocol.h @@ -173,6 +173,7 @@ enum NET_PACKET_ID_RGBCONTROLLER_CLEARSEGMENTS = 1001, /* RGBController::ClearSegments() */ NET_PACKET_ID_RGBCONTROLLER_ADDSEGMENT = 1002, /* RGBController::AddSegment() */ NET_PACKET_ID_RGBCONTROLLER_CONFIGUREZONE = 1003, /* RGBController::ConfigureZone() */ + NET_PACKET_ID_RGBCONTROLLER_SETHIDDEN = 1004, /* RGBController::SetHidden() */ NET_PACKET_ID_RGBCONTROLLER_UPDATELEDS = 1050, /* RGBController::UpdateLEDs() */ NET_PACKET_ID_RGBCONTROLLER_UPDATEZONELEDS = 1051, /* RGBController::UpdateZoneLEDs() */ diff --git a/NetworkServer.cpp b/NetworkServer.cpp index 9ba252424..c824fc701 100644 --- a/NetworkServer.cpp +++ b/NetworkServer.cpp @@ -1469,6 +1469,10 @@ void NetworkServer::ListenThreadFunction(NetworkClientInfo* client_info) status = ProcessRequest_RGBController_ConfigureZone(client_info, header.pkt_size, data, header.pkt_dev_id); break; + case NET_PACKET_ID_RGBCONTROLLER_SETHIDDEN: + status = ProcessRequest_RGBController_SetHidden(client_info, header.pkt_size, data, header.pkt_dev_id); + break; + case NET_PACKET_ID_RGBCONTROLLER_SETDEVICESPECIFICCONFIGURATION: status = ProcessRequest_RGBController_SetDeviceSpecificConfiguration(client_info, header.pkt_size, data, header.pkt_dev_id); break; @@ -2536,6 +2540,43 @@ NetPacketStatus NetworkServer::ProcessRequest_RGBController_SetDeviceSpecificZon return(NET_PACKET_STATUS_OK); } +NetPacketStatus NetworkServer::ProcessRequest_RGBController_SetHidden(NetworkClientInfo* client_info, unsigned int data_size, unsigned char* data_ptr, unsigned int controller_id) +{ + /*-----------------------------------------------------*\ + | Convert ID to index | + \*-----------------------------------------------------*/ + bool controller_idx_valid; + unsigned int controller_idx = index_from_id(controller_id, client_info->client_protocol_version, &controller_idx_valid); + + /*-----------------------------------------------------*\ + | If data pointer is null, return | + \*-----------------------------------------------------*/ + if(data_ptr == NULL) + { + return(NET_PACKET_STATUS_ERROR_INVALID_DATA); + } + + /*-----------------------------------------------------*\ + | If data size is invalid, return | + \*-----------------------------------------------------*/ + if(data_size < sizeof(bool)) + { + return(NET_PACKET_STATUS_ERROR_INVALID_DATA); + } + + /*-----------------------------------------------------*\ + | If controller ID is invalid, return | + \*-----------------------------------------------------*/ + if(!controller_idx_valid) + { + return(NET_PACKET_STATUS_ERROR_INVALID_ID); + } + + controllers[controller_idx]->SetHidden((bool*)data_ptr); + + return(NET_PACKET_STATUS_OK); +} + NetPacketStatus NetworkServer::ProcessRequest_RGBController_UpdateLEDs(NetworkClientInfo* client_info, unsigned int data_size, unsigned char* data_ptr, unsigned int controller_id) { /*-----------------------------------------------------*\ diff --git a/NetworkServer.h b/NetworkServer.h index df1ee2ab9..3e601c357 100644 --- a/NetworkServer.h +++ b/NetworkServer.h @@ -259,6 +259,7 @@ private: NetPacketStatus ProcessRequest_RGBController_SetCustomMode(NetworkClientInfo* client_info, unsigned int controller_id); NetPacketStatus ProcessRequest_RGBController_SetDeviceSpecificConfiguration(NetworkClientInfo* client_info, unsigned int data_size, unsigned char* data_ptr, unsigned int controller_id); NetPacketStatus ProcessRequest_RGBController_SetDeviceSpecificZoneConfiguration(NetworkClientInfo* client_info, unsigned int data_size, unsigned char* data_ptr, unsigned int controller_id); + NetPacketStatus ProcessRequest_RGBController_SetHidden(NetworkClientInfo* client_info, unsigned int data_size, unsigned char* data_ptr, unsigned int controller_id); NetPacketStatus ProcessRequest_RGBController_UpdateLEDs(NetworkClientInfo* client_info, unsigned int data_size, unsigned char* data_ptr, unsigned int controller_id); NetPacketStatus ProcessRequest_RGBController_UpdateSaveMode(NetworkClientInfo* client_info, unsigned int data_size, unsigned char* data_ptr, unsigned int controller_id, bool save_mode); NetPacketStatus ProcessRequest_RGBController_UpdateSingleLED(NetworkClientInfo* client_info, unsigned int data_size, unsigned char* data_ptr, unsigned int controller_id); diff --git a/RGBController/RGBController.cpp b/RGBController/RGBController.cpp index 3974c94ec..0b6afeccb 100644 --- a/RGBController/RGBController.cpp +++ b/RGBController/RGBController.cpp @@ -154,7 +154,13 @@ device_type RGBController::GetDeviceType() unsigned int RGBController::GetFlags() { - return(flags); + unsigned int controller_flags; + + AccessMutex.lock_shared(); + controller_flags = flags; + AccessMutex.unlock_shared(); + + return(controller_flags); } /*---------------------------------------------------------*\ @@ -162,19 +168,31 @@ unsigned int RGBController::GetFlags() \*---------------------------------------------------------*/ bool RGBController::GetHidden() { - return(flags & CONTROLLER_FLAG_HIDDEN); + bool hidden; + + AccessMutex.lock_shared(); + hidden = flags & CONTROLLER_FLAG_HIDDEN; + AccessMutex.unlock_shared(); + + return(hidden); } void RGBController::SetHidden(bool hidden) { if(hidden) { + AccessMutex.lock(); flags |= CONTROLLER_FLAG_HIDDEN; + AccessMutex.unlock(); + SignalUpdate(RGBCONTROLLER_UPDATE_REASON_HIDDEN); } else { + AccessMutex.lock(); flags &= ~CONTROLLER_FLAG_HIDDEN; + AccessMutex.unlock(); + SignalUpdate(RGBCONTROLLER_UPDATE_REASON_UNHIDDEN); } } @@ -256,20 +274,20 @@ std::size_t RGBController::GetZoneCount() unsigned int RGBController::GetZoneFlags(unsigned int zone) { - unsigned int flags; + unsigned int zone_flags; AccessMutex.lock_shared(); if(zone < zones.size()) { - flags = zones[zone].flags; + zone_flags = zones[zone].flags; } else { - flags = 0; + zone_flags = 0; } AccessMutex.unlock_shared(); - return(flags); + return(zone_flags); } unsigned int RGBController::GetZoneLEDsCount(unsigned int zone) @@ -581,20 +599,20 @@ unsigned int RGBController::GetZoneModeDirection(unsigned int zone, unsigned int unsigned int RGBController::GetZoneModeFlags(unsigned int zone, unsigned int mode) { - unsigned int flags; + unsigned int mode_flags; AccessMutex.lock_shared(); if((zone < zones.size()) && (mode < zones[zone].modes.size())) { - flags = zones[zone].modes[mode].flags; + mode_flags = zones[zone].modes[mode].flags; } else { - flags = 0; + mode_flags = 0; } AccessMutex.unlock_shared(); - return(flags); + return(mode_flags); } std::string RGBController::GetZoneModeName(unsigned int zone, unsigned int mode) @@ -725,20 +743,20 @@ std::size_t RGBController::GetZoneSegmentCount(unsigned int zone) unsigned int RGBController::GetZoneSegmentFlags(unsigned int zone, unsigned int segment) { - unsigned int flags; + unsigned int segment_flags; AccessMutex.lock_shared(); if((zone < zones.size()) && (segment < zones[zone].segments.size())) { - flags = zones[zone].segments[segment].flags; + segment_flags = zones[zone].segments[segment].flags; } else { - flags = 0; + segment_flags = 0; } AccessMutex.unlock_shared(); - return(flags); + return(segment_flags); } unsigned int RGBController::GetZoneSegmentLEDsCount(unsigned int zone, unsigned int segment) @@ -1242,20 +1260,20 @@ unsigned int RGBController::GetModeDirection(unsigned int mode) unsigned int RGBController::GetModeFlags(unsigned int mode) { - unsigned int flags; + unsigned int mode_flags; AccessMutex.lock_shared(); if(mode < modes.size()) { - flags = modes[mode].flags; + mode_flags = modes[mode].flags; } else { - flags = 0; + mode_flags = 0; } AccessMutex.unlock_shared(); - return(flags); + return(mode_flags); } std::string RGBController::GetModeName(unsigned int mode) diff --git a/RGBController/RGBController_Network.cpp b/RGBController/RGBController_Network.cpp index a882da15f..d70994a93 100644 --- a/RGBController/RGBController_Network.cpp +++ b/RGBController/RGBController_Network.cpp @@ -30,6 +30,11 @@ unsigned int RGBController_Network::GetID() return(dev_id); } +void RGBController_Network::SetHidden(bool hidden) +{ + client->SendRequest_RGBController_SetHidden(dev_id, hidden); +} + void RGBController_Network::ClearSegments(int zone) { client->SendRequest_RGBController_ClearSegments(dev_id, zone); diff --git a/RGBController/RGBController_Network.h b/RGBController/RGBController_Network.h index a529e597c..36e5343a5 100644 --- a/RGBController/RGBController_Network.h +++ b/RGBController/RGBController_Network.h @@ -23,6 +23,8 @@ public: unsigned int GetID(); + void SetHidden(bool hidden); + void ClearSegments(int zone); void AddSegment(int zone, segment new_segment);