blob: 16a58409d4726bcfdc5c69a290e9167a7c209f49 [file] [log] [blame]
Brian Silverman17f503e2015-08-02 18:17:18 -07001#include <arpa/inet.h>
Tyler Chatowbf0609c2021-07-31 16:13:27 -07002#include <netinet/in.h>
3#include <sys/socket.h>
4#include <sys/types.h>
Brian Silverman97aae262015-12-25 18:00:34 -08005#include <unistd.h>
Brian Silverman17f503e2015-08-02 18:17:18 -07006
Tyler Chatowbf0609c2021-07-31 16:13:27 -07007#include <cerrno>
8#include <cstring>
9
Alex Perrycb7da4b2019-08-28 19:35:56 -070010#include "aos/events/shm_event_loop.h"
Austin Schuha3e576b2019-05-22 21:22:23 -070011#include "aos/init.h"
12#include "aos/logging/logging.h"
Austin Schuha3e576b2019-05-22 21:22:23 -070013#include "aos/time/time.h"
Alex Perrycb7da4b2019-08-28 19:35:56 -070014#include "y2014/queues/hot_goal_generated.h"
Brian Silverman17f503e2015-08-02 18:17:18 -070015
Austin Schuh094d09b2020-11-20 23:26:52 -080016int main(int argc, char **argv) {
17 ::aos::InitGoogle(&argc, &argv);
Brian Silverman17f503e2015-08-02 18:17:18 -070018
Alex Perrycb7da4b2019-08-28 19:35:56 -070019 aos::FlatbufferDetachedBuffer<aos::Configuration> config =
Austin Schuhc5fa6d92022-02-25 14:36:28 -080020 aos::configuration::ReadConfig("aos_config.json");
Alex Perrycb7da4b2019-08-28 19:35:56 -070021
22 ::aos::ShmEventLoop shm_event_loop(&config.message());
Brian Silverman17f503e2015-08-02 18:17:18 -070023
Austin Schuha3e576b2019-05-22 21:22:23 -070024 ::aos::Sender<::y2014::HotGoal> hot_goal_sender =
Alex Perrycb7da4b2019-08-28 19:35:56 -070025 shm_event_loop.MakeSender<::y2014::HotGoal>("/");
Austin Schuha3e576b2019-05-22 21:22:23 -070026
27 uint64_t left_count = 0, right_count = 0;
Brian Silverman17f503e2015-08-02 18:17:18 -070028 int my_socket = -1;
29 while (true) {
30 if (my_socket == -1) {
31 my_socket = socket(AF_INET, SOCK_STREAM, 0);
32 if (my_socket == -1) {
Austin Schuhf257f3c2019-10-27 21:00:43 -070033 AOS_PLOG(WARNING, "socket(AF_INET, SOCK_STREAM, 0) failed");
Brian Silverman17f503e2015-08-02 18:17:18 -070034 continue;
35 } else {
Austin Schuhf257f3c2019-10-27 21:00:43 -070036 AOS_LOG(INFO, "opened socket (is %d)\n", my_socket);
Brian Silverman17f503e2015-08-02 18:17:18 -070037 sockaddr_in address, *sockaddr_pointer;
38 memset(&address, 0, sizeof(address));
39 address.sin_family = AF_INET;
Brian Silvermanb4bfb0c2021-01-11 18:25:51 -080040 address.sin_port = htons(1180);
Brian Silverman17f503e2015-08-02 18:17:18 -070041 sockaddr *address_pointer;
42 sockaddr_pointer = &address;
43 memcpy(&address_pointer, &sockaddr_pointer, sizeof(void *));
44 if (bind(my_socket, address_pointer, sizeof(address)) == -1) {
Austin Schuhf257f3c2019-10-27 21:00:43 -070045 AOS_PLOG(WARNING, "bind(%d, %p, %zu) failed", my_socket, &address,
46 sizeof(address));
Brian Silverman17f503e2015-08-02 18:17:18 -070047 close(my_socket);
48 my_socket = -1;
49 continue;
50 }
51
52 if (listen(my_socket, 1) == -1) {
Austin Schuhf257f3c2019-10-27 21:00:43 -070053 AOS_PLOG(WARNING, "listen(%d, 1) failed", my_socket);
Brian Silverman17f503e2015-08-02 18:17:18 -070054 close(my_socket);
55 my_socket = -1;
56 continue;
57 }
58 }
59 }
60
61 int connection = accept4(my_socket, nullptr, nullptr, SOCK_NONBLOCK);
62 if (connection == -1) {
Austin Schuhf257f3c2019-10-27 21:00:43 -070063 AOS_PLOG(WARNING, "accept(%d, nullptr, nullptr) failed", my_socket);
Brian Silverman17f503e2015-08-02 18:17:18 -070064 continue;
65 }
Austin Schuhf257f3c2019-10-27 21:00:43 -070066 AOS_LOG(INFO, "accepted (is %d)\n", connection);
Brian Silverman17f503e2015-08-02 18:17:18 -070067
68 while (connection != -1) {
69 fd_set fds;
70 FD_ZERO(&fds);
71 FD_SET(connection, &fds);
Austin Schuhf2a50ba2016-12-24 16:16:26 -080072 struct timeval timeout_timeval;
73 timeout_timeval.tv_sec = 1;
74 timeout_timeval.tv_usec = 0;
Brian Silverman17f503e2015-08-02 18:17:18 -070075 switch (
76 select(connection + 1, &fds, nullptr, nullptr, &timeout_timeval)) {
77 case 1: {
78 uint8_t data;
79 ssize_t read_bytes = read(connection, &data, sizeof(data));
80 if (read_bytes != sizeof(data)) {
Austin Schuhf257f3c2019-10-27 21:00:43 -070081 AOS_LOG(WARNING, "read %zd bytes instead of %zd\n", read_bytes,
82 sizeof(data));
Brian Silverman17f503e2015-08-02 18:17:18 -070083 break;
84 }
85 if (data & 0x01) ++right_count;
86 if (data & 0x02) ++left_count;
Alex Perrycb7da4b2019-08-28 19:35:56 -070087 auto builder = hot_goal_sender.MakeBuilder();
88 y2014::HotGoal::Builder hot_goal_builder =
89 builder.MakeBuilder<y2014::HotGoal>();
90 hot_goal_builder.add_left_count(left_count);
91 hot_goal_builder.add_right_count(right_count);
milind1f1dca32021-07-03 13:50:07 -070092 (void)builder.Send(hot_goal_builder.Finish());
Brian Silverman17f503e2015-08-02 18:17:18 -070093 } break;
94 case 0:
Austin Schuhf257f3c2019-10-27 21:00:43 -070095 AOS_LOG(WARNING, "read on %d timed out\n", connection);
Brian Silverman17f503e2015-08-02 18:17:18 -070096 close(connection);
97 connection = -1;
98 break;
99 default:
Austin Schuhf257f3c2019-10-27 21:00:43 -0700100 AOS_PLOG(FATAL, "select(%d, %p, nullptr, nullptr, %p) failed",
101 connection + 1, &fds, &timeout_timeval);
Brian Silverman17f503e2015-08-02 18:17:18 -0700102 }
103 }
104 }
105
Austin Schuhf257f3c2019-10-27 21:00:43 -0700106 AOS_LOG(FATAL, "finished???\n");
Brian Silverman17f503e2015-08-02 18:17:18 -0700107}