diff --git a/NetworkClient.cpp b/NetworkClient.cpp index cbc18306..61dcd4c8 100644 --- a/NetworkClient.cpp +++ b/NetworkClient.cpp @@ -38,8 +38,14 @@ THREAD listen_thread(void *param) NetworkClient::NetworkClient(std::vector& control) : controllers(control) { + unsigned int requested_controllers; + port.tcp_client("127.0.0.1", "1337"); + server_connected = false; + server_controller_count = 0; + requested_controllers = 0; + //Start the connection thread #ifdef WIN32 _beginthread(connection_thread, 0, this); @@ -48,6 +54,46 @@ NetworkClient::NetworkClient(std::vector& control) : controller pthread_create(&thread, NULL, &connection_thread, this); pthread_create(&thread, NULL, &listen_thread, this); #endif + + //Wait for server to connect + while(!server_connected) + { + Sleep(100); + } + + //Once server is connected, request number of controllers + SendRequest_ControllerCount(); + + //Wait for server controller count + while(server_controller_count == 0) + { + Sleep(100); + } + + printf("Client: Received controller count from server: %d\r\n", server_controller_count); + + //Once count is received, request controllers + while(requested_controllers < server_controller_count) + { + printf("Client: Requesting controller %d\r\n", requested_controllers); + + SendRequest_ControllerData(requested_controllers); + + //Wait until controller is received + while(server_controllers.size() == requested_controllers) + { + Sleep(100); + } + + requested_controllers++; + } + + //All controllers received, add them to master list + printf("Client: All controllers received, adding them to master list\r\n"); + for(std::size_t controller_idx = 0; controller_idx < server_controllers.size(); controller_idx++) + { + controllers.push_back(server_controllers[controller_idx]); + } } void NetworkClient::ConnectionThread() @@ -60,11 +106,10 @@ void NetworkClient::ConnectionThread() //Try to connect to server port.tcp_client_connect(); - printf( "Network client connected\n" ); + printf( "Connected to server\n" ); - printf( "Send controller count request\n" ); - - SendRequest_ControllerCount(); + server_connected = true; + break; //Wait 1 second between tries; Sleep(1000); @@ -159,33 +204,38 @@ void NetworkClient::ListenThread() { case NET_PACKET_ID_REQUEST_CONTROLLER_COUNT: printf( "Client: NET_PACKET_ID_REQUEST_CONTROLLER_COUNT\r\n" ); - if(header.pkt_size == sizeof(unsigned int)) - { - unsigned int controller_count; - - memcpy(&controller_count, data, sizeof(unsigned int)); - - printf( "Client: Received controller size: %d\r\n", controller_count); - - printf( "Client: Now request the first controller\r\n"); - - SendRequest_ControllerData(0); - } + + ProcessReply_ControllerCount(header.pkt_size, data); break; case NET_PACKET_ID_REQUEST_CONTROLLER_DATA: printf( "Client: NET_PACKET_ID_REQUEST_CONTROLLER_DATA\r\n"); - { - RGBController_Dummy new_controller; - - new_controller.ReadDeviceDescription((unsigned char *)data); - - printf("Received controller: %s\r\n", new_controller.name.c_str()); - } + + ProcessReply_ControllerData(header.pkt_size, data); + break; } } } +void NetworkClient::ProcessReply_ControllerCount(unsigned int data_size, char * data) +{ + if(data_size == sizeof(unsigned int)) + { + memcpy(&server_controller_count, data, sizeof(unsigned int)); + } +} + +void NetworkClient::ProcessReply_ControllerData(unsigned int data_size, char * data) +{ + RGBController_Dummy * new_controller = new RGBController_Dummy(); + + new_controller->ReadDeviceDescription((unsigned char *)data); + + printf("Received controller: %s\r\n", new_controller->name.c_str()); + + server_controllers.push_back(new_controller); +} + void NetworkClient::SendRequest_ControllerCount() { NetPacketHeader reply_hdr; diff --git a/NetworkClient.h b/NetworkClient.h index 4aee53b6..3b1f2e9f 100644 --- a/NetworkClient.h +++ b/NetworkClient.h @@ -12,12 +12,18 @@ public: void ConnectionThread(); void ListenThread(); + void ProcessReply_ControllerCount(unsigned int data_size, char * data); + void ProcessReply_ControllerData(unsigned int data_size, char * data); + void SendRequest_ControllerCount(); void SendRequest_ControllerData(unsigned int idx); - + protected: std::vector& controllers; + std::vector server_controllers; private: - net_port port; + net_port port; + bool server_connected; + unsigned int server_controller_count; }; \ No newline at end of file