]> git.tdb.fi Git - r2c2.git/blob - source/network/train.cpp
4ba4df08870891e354c10c86489bc3c82a0290ac
[r2c2.git] / source / network / train.cpp
1 #include "client.h"
2 #include "train.h"
3
4 using namespace std;
5
6 namespace R2C2 {
7
8 NetTrain::NetTrain(Client &c, const TrainInfoPacket &pkt):
9         client(c),
10         loco_type(client.get_catalogue().get<VehicleType>(pkt.loco_type)),
11         address(pkt.address),
12         name(pkt.name),
13         functions(0)
14 { }
15
16 void NetTrain::set_control(const string &c, float v)
17 {
18         if(v==controls[c])
19                 return;
20
21         TrainControlPacket pkt;
22         pkt.address = address;
23         pkt.control = c;
24         pkt.value = v;
25         client.send(pkt);
26 }
27
28 float NetTrain::get_control(const string &c) const
29 {
30         map<string, float>::const_iterator i = controls.find(c);
31         return i!=controls.end() ? i->second : 0;
32 }
33
34 void NetTrain::set_function(unsigned i, bool set)
35 {
36         TrainFunctionPacket pkt;
37         pkt.address = address;
38         pkt.functions = functions;
39         if(set)
40                 pkt.functions |= 1<<i;
41         else
42                 pkt.functions &= ~(1<<i);
43         client.send(pkt);
44 }
45
46 void NetTrain::set_route(const string &r)
47 {
48         if(r==route)
49                 return;
50
51         TrainRoutePacket pkt;
52         pkt.address = address;
53         pkt.route = r;
54         client.send(pkt);
55 }
56
57 void NetTrain::process_packet(const TrainControlPacket &pkt)
58 {
59         controls[pkt.control] = pkt.value;
60         signal_control_changed.emit(pkt.control, pkt.value);
61 }
62
63 void NetTrain::process_packet(const TrainFunctionPacket &pkt)
64 {
65         unsigned old_funcs = functions;
66         functions = pkt.functions;
67         for(unsigned i=0; i<9; ++i)
68                 if(((functions^old_funcs)>>i)&1)
69                         signal_function_changed.emit(i, (functions>>i)&1);
70 }
71
72 void NetTrain::process_packet(const TrainStatusPacket &pkt)
73 {
74         status = pkt.status;
75         signal_status_changed.emit(status);
76 }
77
78 void NetTrain::process_packet(const TrainRoutePacket &pkt)
79 {
80         route = pkt.route;
81         signal_route_changed.emit(route);
82 }
83
84 } // namespace R2C2