cailean
3 months ago
6 changed files with 248 additions and 14 deletions
@ -0,0 +1,31 @@ |
|||||
|
#include "Request.h" |
||||
|
|
||||
|
/* setup http server */ |
||||
|
void Request::setup(std::string ip, int port, std::string page){ |
||||
|
req.method = ofHttpRequest::POST; |
||||
|
req.url = "http://" + ip + ":" + ofToString(port) + "/" + page; |
||||
|
req.headers["Content-Type"] = "application/json"; |
||||
|
} |
||||
|
|
||||
|
/* send a request to vp_server & return frame/video/folder */ |
||||
|
VPResp Request::query(Vector7D in){ |
||||
|
req.body = "{\"vector\": [" + |
||||
|
ofToString(in.angry) + "," + |
||||
|
ofToString(in.disgust) + "," + |
||||
|
ofToString(in.fear) + "," + |
||||
|
ofToString(in.happy) + "," + |
||||
|
ofToString(in.sad) + "," + |
||||
|
ofToString(in.surprise) + "," + |
||||
|
ofToString(in.neutral) + "]}"; |
||||
|
|
||||
|
auto resp = http.handleRequest(req); |
||||
|
json_resp = ofJson::parse(resp.data.getText()); |
||||
|
|
||||
|
VPResp vp_resp; |
||||
|
vp_resp.folder = json_resp["folder"]; |
||||
|
vp_resp.image = json_resp["image"]; |
||||
|
vp_resp.video = json_resp["video"]; |
||||
|
vp_resp.frame = json_resp["frame"]; |
||||
|
|
||||
|
return vp_resp; |
||||
|
} |
@ -0,0 +1,44 @@ |
|||||
|
#ifndef _REQUEST |
||||
|
#define _REQUEST |
||||
|
|
||||
|
#include "ofMain.h" |
||||
|
|
||||
|
/* emotional embedding */ |
||||
|
struct Vector7D { |
||||
|
float angry; |
||||
|
float disgust; |
||||
|
float fear; |
||||
|
float happy; |
||||
|
float sad; |
||||
|
float surprise; |
||||
|
float neutral; |
||||
|
|
||||
|
bool operator!=(const Vector7D &other) const { |
||||
|
return angry != other.angry || |
||||
|
disgust != other.disgust || |
||||
|
fear != other.fear || |
||||
|
happy != other.happy || |
||||
|
sad != other.sad || |
||||
|
surprise != other.surprise || |
||||
|
neutral != other.neutral; |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
/* Vantage point query structure */ |
||||
|
struct VPResp{ |
||||
|
std::string folder; |
||||
|
std::string video; |
||||
|
std::string image; |
||||
|
int frame; |
||||
|
}; |
||||
|
|
||||
|
class Request{ |
||||
|
public: |
||||
|
void setup(std::string ip, int port, std::string page); |
||||
|
VPResp query(Vector7D in); |
||||
|
|
||||
|
ofHttpRequest req; |
||||
|
ofURLFileLoader http; |
||||
|
ofJson json_resp; |
||||
|
}; |
||||
|
#endif |
@ -0,0 +1,107 @@ |
|||||
|
#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; |
||||
|
} |
@ -0,0 +1,40 @@ |
|||||
|
#ifndef _SERVER |
||||
|
#define _SERVER |
||||
|
|
||||
|
#include "ofMain.h" |
||||
|
#include "ofxNetwork.h" |
||||
|
#include "Request.h" |
||||
|
#include <unordered_map> |
||||
|
#include <chrono> |
||||
|
|
||||
|
struct ClientInfo { |
||||
|
float value; |
||||
|
std::string ip_address; |
||||
|
}; |
||||
|
|
||||
|
class Server{ |
||||
|
public: |
||||
|
Server(int port, Vector7D& _embedding, bool debug) |
||||
|
: port(port), embedding(_embedding), debug(debug) {} |
||||
|
|
||||
|
void start(); |
||||
|
void update(); |
||||
|
void addOrUpdateClient(int client_id, float value, const std::string& ip_address); |
||||
|
void printClients(); |
||||
|
void updateEmbedding(); |
||||
|
void checkActivity(); |
||||
|
|
||||
|
int port; |
||||
|
ofxTCPServer server; |
||||
|
std::unordered_map<int, ClientInfo> clients; |
||||
|
bool debug; |
||||
|
bool is_active; |
||||
|
Vector7D& embedding; |
||||
|
|
||||
|
private: |
||||
|
Vector7D previous_embedding; |
||||
|
std::chrono::time_point<std::chrono::steady_clock> last_change_time; |
||||
|
bool hasChanged(); |
||||
|
}; |
||||
|
|
||||
|
#endif |
Loading…
Reference in new issue