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