blob: cc6d26090f7bc23bcd3a92c8a9afb1892edc3b2f [file] [log] [blame]
Brian Silvermanacdabeb2019-03-23 14:04:36 -07001#include <memory>
2#include <set>
3
4#include "aos/init.h"
5#include "aos/logging/logging.h"
6#include "aos/time/time.h"
7#include "internal/Embedded.h"
8#include "seasocks/PrintfLogger.h"
9#include "seasocks/Server.h"
10#include "seasocks/StringUtil.h"
11#include "seasocks/WebSocket.h"
12
13namespace y2019 {
14namespace vision {
15
16class WebsocketHandler : public seasocks::WebSocket::Handler {
17 public:
18 WebsocketHandler();
19 void onConnect(seasocks::WebSocket* connection) override;
20 void onData(seasocks::WebSocket* connection, const char* data) override;
21 void onDisconnect(seasocks::WebSocket* connection) override;
22
23 private:
24 std::set<seasocks::WebSocket *> connections_;
25};
26
27WebsocketHandler::WebsocketHandler() {
28}
29
30void WebsocketHandler::onConnect(seasocks::WebSocket *connection) {
31 connections_.insert(connection);
32 LOG(INFO, "Connected: %s : %s\n", connection->getRequestUri().c_str(),
33 seasocks::formatAddress(connection->getRemoteAddress()).c_str());
34}
35
36void WebsocketHandler::onData(seasocks::WebSocket * /*connection*/,
37 const char *data) {
38 LOG(INFO, "Got data: %s\n", data);
39}
40
41void WebsocketHandler::onDisconnect(seasocks::WebSocket *connection) {
42 connections_.erase(connection);
43 LOG(INFO, "Disconnected: %s : %s\n", connection->getRequestUri().c_str(),
44 seasocks::formatAddress(connection->getRemoteAddress()).c_str());
45}
46
47// TODO(Brian): Put this somewhere shared.
48class SeasocksLogger : public seasocks::PrintfLogger {
49 public:
50 SeasocksLogger(Level min_level_to_log) : PrintfLogger(min_level_to_log) {}
51 void log(Level level, const char* message) override;
52};
53
54void SeasocksLogger::log(Level level, const char *message) {
55 // Convert Seasocks error codes to AOS.
56 log_level aos_level;
57 switch (level) {
58 case seasocks::Logger::INFO:
59 aos_level = INFO;
60 break;
61 case seasocks::Logger::WARNING:
62 aos_level = WARNING;
63 break;
64 case seasocks::Logger::ERROR:
65 case seasocks::Logger::SEVERE:
66 aos_level = ERROR;
67 break;
68 case seasocks::Logger::DEBUG:
69 case seasocks::Logger::ACCESS:
70 default:
71 aos_level = DEBUG;
72 break;
73 }
74 LOG(aos_level, "Seasocks: %s\n", message);
75}
76
77} // namespace vision
78} // namespace y2019
79
80int main(int, char *[]) {
81 // Make sure to reference this to force the linker to include it.
82 findEmbeddedContent("");
83
84 aos::InitNRT();
85
86 seasocks::Server server(::std::shared_ptr<seasocks::Logger>(
87 new y2019::vision::SeasocksLogger(seasocks::Logger::INFO)));
88
89 auto websocket_handler = std::make_shared<y2019::vision::WebsocketHandler>();
90
91 server.addWebSocketHandler("/ws", websocket_handler);
92 server.serve("/home/admin/robot_code/www", 1180);
93
94 return 0;
95}