]> git.tdb.fi Git - r2c2.git/blob - source/network/server.h
Export AI control parameters over the network
[r2c2.git] / source / network / server.h
1 #ifndef R2C2_NET_SERVER_H_
2 #define R2C2_NET_SERVER_H_
3
4 #include <msp/io/eventdispatcher.h>
5 #include <msp/net/communicator.h>
6 #include <msp/net/streamsocket.h>
7 #include <msp/net/streamserversocket.h>
8 #include "libr2c2/layout.h"
9 #include "libr2c2/trainai.h"
10 #include "packets.h"
11 #include "protocol.h"
12
13 namespace R2C2 {
14
15 class Server
16 {
17 private:
18         struct Connection: Msp::Net::PacketReceiver<DriverStatePacket>,
19                 Msp::Net::PacketReceiver<TrainControlPacket>,
20                 Msp::Net::PacketReceiver<TrainFunctionPacket>,
21                 Msp::Net::PacketReceiver<TrainAIControlPacket>,
22                 Msp::Net::PacketReceiver<TrainRoutePacket>
23         {
24                 Server &server;
25                 Msp::Net::StreamSocket *socket;
26                 Msp::Net::Communicator comm;
27                 bool stale;
28
29                 Connection(Server &, Msp::Net::StreamSocket *);
30                 ~Connection();
31
32                 void handshake_done();
33                 void end_of_file();
34                 virtual void receive(const DriverStatePacket &);
35                 virtual void receive(const TrainControlPacket &);
36                 virtual void receive(const TrainFunctionPacket &);
37                 virtual void receive(const TrainAIControlPacket &);
38                 virtual void receive(const TrainRoutePacket &);
39                 void comm_error(const std::exception &);
40                 void error(const std::string &);
41         };
42
43         Protocol proto;
44         Layout &layout;
45         Msp::Net::StreamServerSocket listen_sock;
46         Msp::IO::EventDispatcher *event_disp;
47         std::vector<Connection *> connections;
48
49 public:
50         Server(Layout &);
51         ~Server();
52
53         void use_event_dispatcher(Msp::IO::EventDispatcher &);
54 private:
55         void incoming_connection();
56
57         void driver_state_changed();
58         void emergency(Block *, const std::string &);
59         void train_added(Train &);
60         void train_control_changed(const Train &, const std::string &, float);
61         void train_function_changed(const Train &, unsigned, bool);
62         void train_ai_event(const Train &, TrainAI &, const TrainAI::Message &);
63
64         template<typename P>
65         void send(const P &);
66 };
67
68 } // namespace R2C2
69
70 #endif