blob: 8eb4efb5c5e130061fe424ea349a03c5bbd471b7 [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
John Park33858a32018-09-28 23:05:48 -07009#include "aos/byteorder.h"
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
16int main() {
17 ::aos::InitNRT();
18
Alex Perrycb7da4b2019-08-28 19:35:56 -070019 aos::FlatbufferDetachedBuffer<aos::Configuration> config =
20 aos::configuration::ReadConfig("config.json");
21
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;
40 address.sin_port = ::aos::hton<uint16_t>(1180);
41 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);
92 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}