]> git.tdb.fi Git - r2c2.git/blob - source/network/train.cpp
Full vehicle unification
[r2c2.git] / source / network / train.cpp
1 /* $Id$
2
3 This file is part of the MSP Märklin suite
4 Copyright © 2009  Mikkosoft Productions, Mikko Rasa
5 Distributed under the GPL
6 */
7
8 #include "client.h"
9 #include "train.h"
10
11 using namespace std;
12
13 namespace Marklin {
14
15 NetTrain::NetTrain(Client &c, const TrainInfoPacket &pkt):
16         client(c),
17         loco_type(client.get_catalogue().get_vehicle(pkt.loco_type)),
18         address(pkt.address),
19         name(pkt.name),
20         functions(0)
21 { }
22
23 void NetTrain::set_control(const string &c, float v)
24 {
25         if(v==controls[c])
26                 return;
27
28         TrainControlPacket pkt;
29         pkt.address = address;
30         pkt.control = c;
31         pkt.value = v;
32         client.send(pkt);
33 }
34
35 void NetTrain::set_function(unsigned i, bool set)
36 {
37         TrainFunctionPacket pkt;
38         pkt.address = address;
39         pkt.functions = functions;
40         if(set)
41                 pkt.functions |= 1<<i;
42         else
43                 pkt.functions &= ~(1<<i);
44         client.send(pkt);
45 }
46
47 void NetTrain::set_route(const string &r)
48 {
49         if(r==route)
50                 return;
51
52         TrainRoutePacket pkt;
53         pkt.address = address;
54         pkt.route = r;
55         client.send(pkt);
56 }
57
58 void NetTrain::process_packet(const TrainControlPacket &pkt)
59 {
60         controls[pkt.control] = pkt.value;
61         signal_control_changed.emit(pkt.control, pkt.value);
62 }
63
64 void NetTrain::process_packet(const TrainFunctionPacket &pkt)
65 {
66         unsigned old_funcs = functions;
67         functions = pkt.functions;
68         for(unsigned i=0; i<9; ++i)
69                 if(((functions^old_funcs)>>i)&1)
70                         signal_function_changed.emit(i, (functions>>i)&1);
71 }
72
73 void NetTrain::process_packet(const TrainStatusPacket &pkt)
74 {
75         status = pkt.status;
76         signal_status_changed.emit(status);
77 }
78
79 void NetTrain::process_packet(const TrainRoutePacket &pkt)
80 {
81         route = pkt.route;
82         signal_route_changed.emit(route);
83 }
84
85 } // namespace Marklin