blob: cc6d26090f7bc23bcd3a92c8a9afb1892edc3b2f [file] [log] [blame]
#include <memory>
#include <set>
#include "aos/init.h"
#include "aos/logging/logging.h"
#include "aos/time/time.h"
#include "internal/Embedded.h"
#include "seasocks/PrintfLogger.h"
#include "seasocks/Server.h"
#include "seasocks/StringUtil.h"
#include "seasocks/WebSocket.h"
namespace y2019 {
namespace vision {
class WebsocketHandler : public seasocks::WebSocket::Handler {
public:
WebsocketHandler();
void onConnect(seasocks::WebSocket* connection) override;
void onData(seasocks::WebSocket* connection, const char* data) override;
void onDisconnect(seasocks::WebSocket* connection) override;
private:
std::set<seasocks::WebSocket *> connections_;
};
WebsocketHandler::WebsocketHandler() {
}
void WebsocketHandler::onConnect(seasocks::WebSocket *connection) {
connections_.insert(connection);
LOG(INFO, "Connected: %s : %s\n", connection->getRequestUri().c_str(),
seasocks::formatAddress(connection->getRemoteAddress()).c_str());
}
void WebsocketHandler::onData(seasocks::WebSocket * /*connection*/,
const char *data) {
LOG(INFO, "Got data: %s\n", data);
}
void WebsocketHandler::onDisconnect(seasocks::WebSocket *connection) {
connections_.erase(connection);
LOG(INFO, "Disconnected: %s : %s\n", connection->getRequestUri().c_str(),
seasocks::formatAddress(connection->getRemoteAddress()).c_str());
}
// TODO(Brian): Put this somewhere shared.
class SeasocksLogger : public seasocks::PrintfLogger {
public:
SeasocksLogger(Level min_level_to_log) : PrintfLogger(min_level_to_log) {}
void log(Level level, const char* message) override;
};
void SeasocksLogger::log(Level level, const char *message) {
// Convert Seasocks error codes to AOS.
log_level aos_level;
switch (level) {
case seasocks::Logger::INFO:
aos_level = INFO;
break;
case seasocks::Logger::WARNING:
aos_level = WARNING;
break;
case seasocks::Logger::ERROR:
case seasocks::Logger::SEVERE:
aos_level = ERROR;
break;
case seasocks::Logger::DEBUG:
case seasocks::Logger::ACCESS:
default:
aos_level = DEBUG;
break;
}
LOG(aos_level, "Seasocks: %s\n", message);
}
} // namespace vision
} // namespace y2019
int main(int, char *[]) {
// Make sure to reference this to force the linker to include it.
findEmbeddedContent("");
aos::InitNRT();
seasocks::Server server(::std::shared_ptr<seasocks::Logger>(
new y2019::vision::SeasocksLogger(seasocks::Logger::INFO)));
auto websocket_handler = std::make_shared<y2019::vision::WebsocketHandler>();
server.addWebSocketHandler("/ws", websocket_handler);
server.serve("/home/admin/robot_code/www", 1180);
return 0;
}