#include "include/websocket.h" Websocket::Websocket(std::string host, std::string user, std::function toLog) : host(host), user(user), toLog(std::move(toLog)) { #ifdef IBM // Required on Windows ix::initNetSystem(); #endif webSocket = new ix::WebSocket(); webSocket->enableAutomaticReconnection(); webSocket->setUrl(host); webSocket->setOnMessageCallback([this](const ix::WebSocketMessagePtr &msg) { this->onClientMessageCallback(msg); }); webSocket->start(); } Websocket::~Websocket() { webSocket->stop(); toLog("WebSocket stopped"); #ifdef IBM // Required on Windows ix::uninitNetSystem(); #endif } void Websocket::onClientMessageCallback(const ix::WebSocketMessagePtr &msg) { if (msg->type == ix::WebSocketMessageType::Open) { std::stringstream debug_msg; debug_msg << "New connection" << std::endl; debug_msg << "Uri: " << msg->openInfo.uri << std::endl; debug_msg << "Headers:" << std::endl; for (const auto &it : msg->openInfo.headers) { debug_msg << it.first << ": " << it.second << std::endl; } toLog(debug_msg.str()); webSocket->send("LOGIN:" + user); toLog("Connecting as " + user); } else if (msg->type == ix::WebSocketMessageType::Close) { std::stringstream debug_msg; debug_msg << "Connection closed" << std::endl; debug_msg << "Code: " << msg->closeInfo.code << std::endl; debug_msg << "Reason: " << msg->closeInfo.reason << std::endl; debug_msg << "Remote: " << msg->closeInfo.remote << std::endl; toLog(debug_msg.str()); } else if (msg->type == ix::WebSocketMessageType::Error) { std::stringstream debug_msg; debug_msg << "Connection error" << std::endl; debug_msg << "Decompression: " << msg->errorInfo.decompressionError << std::endl; debug_msg << "HTTP status: " << msg->errorInfo.http_status << std::endl; debug_msg << "Reason: " << msg->errorInfo.reason << std::endl; debug_msg << "Retries: " << msg->errorInfo.retries << std::endl; debug_msg << "Wait time: " << msg->errorInfo.wait_time << std::endl; toLog(debug_msg.str()); } else if (msg->type == ix::WebSocketMessageType::Message) { if (!msg->str.empty()) { toLog(msg->str); } } } void Websocket::sendData(data d) { if (strcmp(d.path, lastPath) != 0) { strcpy(lastPath, d.path); if (util::generateMD5(d.path, lastHash, toLog)) { strcpy(lastHash, "NOT SET"); } } nlohmann::json json = { {"altitude", d.alt}, {"vs", d.vs}, {"ias", d.ias}, {"magHdg", d.magHeading}, {"truHdg", d.truHdg}, {"totFuel", d.totFuelKg}, {"fuelFlow", d.ff}, {"hash", lastHash}, }; { std::lock_guard lock(wsLock); if (webSocket != nullptr) { std::ostringstream msg; msg << "SEND:" << user << ":" << json.dump(); webSocket->send(msg.str(), false); } } }