You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
107 lines
2.9 KiB
107 lines
2.9 KiB
#include "Server.h"
|
|
|
|
void Server::start(){
|
|
server.setup(port);
|
|
is_active = true;
|
|
previous_embedding = embedding;
|
|
last_change_time = std::chrono::steady_clock::now();
|
|
}
|
|
|
|
void Server::update(){
|
|
|
|
for ( int i = 0; i < server.getLastID(); i++){
|
|
if (server.isClientConnected(i)) {
|
|
const int buffer_size = 8;
|
|
char buffer[buffer_size];
|
|
int bytes_recieved = server.receiveRawBytes(i, buffer, buffer_size);
|
|
|
|
if (bytes_recieved == buffer_size){
|
|
float value;
|
|
int id;
|
|
memcpy(&value, buffer, sizeof(float));
|
|
memcpy(&id, buffer + sizeof(float), sizeof(int));
|
|
|
|
std::string ip_address = server.getClientIP(i);
|
|
|
|
addOrUpdateClient(id, value, ip_address);
|
|
}
|
|
}
|
|
}
|
|
|
|
updateEmbedding();
|
|
checkActivity();
|
|
|
|
if(debug){
|
|
printClients();
|
|
}
|
|
}
|
|
|
|
void Server::addOrUpdateClient(int client_id, float value, const std::string& ip_address){
|
|
ClientInfo client;
|
|
|
|
client.ip_address = ip_address;
|
|
client.value = value;
|
|
|
|
clients[client_id] = client;
|
|
}
|
|
|
|
void Server::updateEmbedding(){
|
|
for(const auto& c : clients){
|
|
const ClientInfo& info = c.second;
|
|
float val = std::round(info.value * 1000.0f) / 1000.0f;
|
|
switch(c.first){
|
|
case 0:
|
|
embedding.angry = val;
|
|
break;
|
|
case 1:
|
|
embedding.disgust = val;
|
|
break;
|
|
case 2:
|
|
embedding.fear = val;
|
|
break;
|
|
case 3:
|
|
embedding.happy = val;
|
|
break;
|
|
case 4:
|
|
embedding.sad = val;
|
|
break;
|
|
case 5:
|
|
embedding.surprise = val;
|
|
break;
|
|
case 6:
|
|
embedding.neutral = val;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
void Server::printClients(){
|
|
for( const auto& c : clients){
|
|
int id = c.first;
|
|
const ClientInfo& info = c.second;
|
|
std::cout << "id: " << id
|
|
<< ", value: " << info.value
|
|
<< ", IP: " << info.ip_address << std::endl;
|
|
}
|
|
|
|
std::cout << is_active << std::endl;
|
|
}
|
|
|
|
/* check if the controllers are in use */
|
|
void Server::checkActivity(){
|
|
if (previous_embedding != embedding) { // Check if embedding has changed
|
|
last_change_time = std::chrono::steady_clock::now(); // Reset the timer if there is a change
|
|
previous_embedding = embedding; // Update the previous embedding to the current one
|
|
is_active = true;
|
|
} else {
|
|
// Calculate the time since the last change
|
|
auto now = std::chrono::steady_clock::now();
|
|
auto duration = std::chrono::duration_cast<std::chrono::seconds>(now - last_change_time).count();
|
|
|
|
if (duration >= 2) {
|
|
is_active = false;
|
|
}
|
|
}
|
|
|
|
std::cout << is_active << std::endl;
|
|
}
|