]> git.tdb.fi Git - r2c2.git/blobdiff - source/network/server.cpp
Send and receive power/halt states over network
[r2c2.git] / source / network / server.cpp
index 174e812148b6f5c46f7fdb24fea04b67f8e90e5f..43d22ffef9016f26b376e691d840840bea13a940 100644 (file)
@@ -6,6 +6,7 @@ Distributed under the GPL
 */
 
 #include <msp/net/inet.h>
+#include "libr2c2/driver.h"
 #include "libr2c2/route.h"
 #include "libr2c2/train.h"
 #include "libr2c2/vehicletype.h"
@@ -21,6 +22,10 @@ Server::Server(Layout &l):
        listen_sock(Net::INET),
        event_disp(0)
 {
+       layout.get_driver().signal_power.connect(sigc::hide(sigc::mem_fun(this, &Server::driver_state_changed)));
+       layout.get_driver().signal_halt.connect(sigc::hide(sigc::mem_fun(this, &Server::driver_state_changed)));
+       layout.signal_emergency.connect(sigc::mem_fun(this, &Server::emergency));
+
        layout.signal_train_added.connect(sigc::mem_fun(this, &Server::train_added));
 
        const map<unsigned, Train *> &trains = layout.get_trains();
@@ -45,6 +50,21 @@ void Server::incoming_connection()
        connections.push_back(new Connection(*this, sock));
 }
 
+void Server::driver_state_changed()
+{
+       DriverStatePacket pkt;
+       pkt.power = layout.get_driver().get_power();
+       pkt.halt = layout.get_driver().is_halted();
+       send(pkt);
+}
+
+void Server::emergency(const string &msg)
+{
+       EmergencyPacket pkt;
+       pkt.message = msg;
+       send(pkt);
+}
+
 void Server::train_added(Train &train)
 {
        train.signal_control_changed.connect(sigc::bind<0>(sigc::mem_fun(this, &Server::train_control_changed), sigc::ref(train)));
@@ -119,14 +139,22 @@ Server::Connection::~Connection()
 
 void Server::Connection::handshake_done()
 {
-       const set<Route *> &routes = server.layout.get_routes();
-       for(set<Route *>::const_iterator i=routes.begin(); i!=routes.end(); ++i)
        {
-               RouteInfoPacket pkt;
-               pkt.name = (*i)->get_name();
+               DriverStatePacket pkt;
+               pkt.power = server.layout.get_driver().get_power();
+               pkt.halt = server.layout.get_driver().is_halted();
                comm.send(pkt);
        }
 
+       const set<Route *> &routes = server.layout.get_routes();
+       for(set<Route *>::const_iterator i=routes.begin(); i!=routes.end(); ++i)
+               if(!(*i)->is_temporary())
+               {
+                       RouteInfoPacket pkt;
+                       pkt.name = (*i)->get_name();
+                       comm.send(pkt);
+               }
+
        const map<unsigned, Train *> &trains = server.layout.get_trains();
        for(map<unsigned, Train *>::const_iterator i=trains.begin(); i!=trains.end(); ++i)
        {
@@ -179,6 +207,15 @@ void Server::Connection::end_of_file()
        stale = true;
 }
 
+void Server::Connection::receive(const DriverStatePacket &pkt)
+{
+       Driver &driver = server.layout.get_driver();
+       if(pkt.power!=driver.get_power())
+               driver.set_power(pkt.power);
+       if(pkt.halt!=driver.is_halted())
+               driver.halt(pkt.halt);
+}
+
 void Server::Connection::receive(const TrainControlPacket &pkt)
 {
        try