blob: 9f5dc87626f90a29f4a143a01ffa32a3bc1988d8 [file] [log] [blame]
Brian Silverman17f503e2015-08-02 18:17:18 -07001#include <sys/types.h>
2#include <sys/socket.h>
3#include <errno.h>
4#include <string.h>
5#include <netinet/in.h>
6#include <arpa/inet.h>
Brian Silverman97aae262015-12-25 18:00:34 -08007#include <unistd.h>
Brian Silverman17f503e2015-08-02 18:17:18 -07008
Alex Perrycb7da4b2019-08-28 19:35:56 -07009#include "aos/events/shm_event_loop.h"
Austin Schuha3e576b2019-05-22 21:22:23 -070010#include "aos/init.h"
11#include "aos/logging/logging.h"
Austin Schuha3e576b2019-05-22 21:22:23 -070012#include "aos/time/time.h"
Alex Perrycb7da4b2019-08-28 19:35:56 -070013#include "y2014/queues/hot_goal_generated.h"
Brian Silverman17f503e2015-08-02 18:17:18 -070014
Austin Schuh094d09b2020-11-20 23:26:52 -080015int main(int argc, char **argv) {
16 ::aos::InitGoogle(&argc, &argv);
Brian Silverman17f503e2015-08-02 18:17:18 -070017
Alex Perrycb7da4b2019-08-28 19:35:56 -070018 aos::FlatbufferDetachedBuffer<aos::Configuration> config =
19 aos::configuration::ReadConfig("config.json");
20
21 ::aos::ShmEventLoop shm_event_loop(&config.message());
Brian Silverman17f503e2015-08-02 18:17:18 -070022
Austin Schuha3e576b2019-05-22 21:22:23 -070023 ::aos::Sender<::y2014::HotGoal> hot_goal_sender =
Alex Perrycb7da4b2019-08-28 19:35:56 -070024 shm_event_loop.MakeSender<::y2014::HotGoal>("/");
Austin Schuha3e576b2019-05-22 21:22:23 -070025
26 uint64_t left_count = 0, right_count = 0;
Brian Silverman17f503e2015-08-02 18:17:18 -070027 int my_socket = -1;
28 while (true) {
29 if (my_socket == -1) {
30 my_socket = socket(AF_INET, SOCK_STREAM, 0);
31 if (my_socket == -1) {
Austin Schuhf257f3c2019-10-27 21:00:43 -070032 AOS_PLOG(WARNING, "socket(AF_INET, SOCK_STREAM, 0) failed");
Brian Silverman17f503e2015-08-02 18:17:18 -070033 continue;
34 } else {
Austin Schuhf257f3c2019-10-27 21:00:43 -070035 AOS_LOG(INFO, "opened socket (is %d)\n", my_socket);
Brian Silverman17f503e2015-08-02 18:17:18 -070036 sockaddr_in address, *sockaddr_pointer;
37 memset(&address, 0, sizeof(address));
38 address.sin_family = AF_INET;
Brian Silvermanb4bfb0c2021-01-11 18:25:51 -080039 address.sin_port = htons(1180);
Brian Silverman17f503e2015-08-02 18:17:18 -070040 sockaddr *address_pointer;
41 sockaddr_pointer = &address;
42 memcpy(&address_pointer, &sockaddr_pointer, sizeof(void *));
43 if (bind(my_socket, address_pointer, sizeof(address)) == -1) {
Austin Schuhf257f3c2019-10-27 21:00:43 -070044 AOS_PLOG(WARNING, "bind(%d, %p, %zu) failed", my_socket, &address,
45 sizeof(address));
Brian Silverman17f503e2015-08-02 18:17:18 -070046 close(my_socket);
47 my_socket = -1;
48 continue;
49 }
50
51 if (listen(my_socket, 1) == -1) {
Austin Schuhf257f3c2019-10-27 21:00:43 -070052 AOS_PLOG(WARNING, "listen(%d, 1) failed", my_socket);
Brian Silverman17f503e2015-08-02 18:17:18 -070053 close(my_socket);
54 my_socket = -1;
55 continue;
56 }
57 }
58 }
59
60 int connection = accept4(my_socket, nullptr, nullptr, SOCK_NONBLOCK);
61 if (connection == -1) {
Austin Schuhf257f3c2019-10-27 21:00:43 -070062 AOS_PLOG(WARNING, "accept(%d, nullptr, nullptr) failed", my_socket);
Brian Silverman17f503e2015-08-02 18:17:18 -070063 continue;
64 }
Austin Schuhf257f3c2019-10-27 21:00:43 -070065 AOS_LOG(INFO, "accepted (is %d)\n", connection);
Brian Silverman17f503e2015-08-02 18:17:18 -070066
67 while (connection != -1) {
68 fd_set fds;
69 FD_ZERO(&fds);
70 FD_SET(connection, &fds);
Austin Schuhf2a50ba2016-12-24 16:16:26 -080071 struct timeval timeout_timeval;
72 timeout_timeval.tv_sec = 1;
73 timeout_timeval.tv_usec = 0;
Brian Silverman17f503e2015-08-02 18:17:18 -070074 switch (
75 select(connection + 1, &fds, nullptr, nullptr, &timeout_timeval)) {
76 case 1: {
77 uint8_t data;
78 ssize_t read_bytes = read(connection, &data, sizeof(data));
79 if (read_bytes != sizeof(data)) {
Austin Schuhf257f3c2019-10-27 21:00:43 -070080 AOS_LOG(WARNING, "read %zd bytes instead of %zd\n", read_bytes,
81 sizeof(data));
Brian Silverman17f503e2015-08-02 18:17:18 -070082 break;
83 }
84 if (data & 0x01) ++right_count;
85 if (data & 0x02) ++left_count;
Alex Perrycb7da4b2019-08-28 19:35:56 -070086 auto builder = hot_goal_sender.MakeBuilder();
87 y2014::HotGoal::Builder hot_goal_builder =
88 builder.MakeBuilder<y2014::HotGoal>();
89 hot_goal_builder.add_left_count(left_count);
90 hot_goal_builder.add_right_count(right_count);
91 builder.Send(hot_goal_builder.Finish());
Brian Silverman17f503e2015-08-02 18:17:18 -070092 } break;
93 case 0:
Austin Schuhf257f3c2019-10-27 21:00:43 -070094 AOS_LOG(WARNING, "read on %d timed out\n", connection);
Brian Silverman17f503e2015-08-02 18:17:18 -070095 close(connection);
96 connection = -1;
97 break;
98 default:
Austin Schuhf257f3c2019-10-27 21:00:43 -070099 AOS_PLOG(FATAL, "select(%d, %p, nullptr, nullptr, %p) failed",
100 connection + 1, &fds, &timeout_timeval);
Brian Silverman17f503e2015-08-02 18:17:18 -0700101 }
102 }
103 }
104
Austin Schuhf257f3c2019-10-27 21:00:43 -0700105 AOS_LOG(FATAL, "finished???\n");
Brian Silverman17f503e2015-08-02 18:17:18 -0700106}