--- /dev/null
+/* $Id$
+
+This file is part of the MSP Märklin suite
+Copyright © 2009 Mikkosoft Productions, Mikko Rasa
+Distributed under the GPL
+*/
+
+#include "client.h"
+#include "train.h"
+
+using namespace std;
+
+namespace Marklin {
+
+NetTrain::NetTrain(Client &c, const TrainInfoPacket &pkt):
+ client(c),
+ loco_type(client.get_catalogue().get_locomotive(pkt.loco_type)),
+ address(pkt.address),
+ name(pkt.name),
+ speed(0),
+ reverse(0),
+ functions(0)
+{ }
+
+void NetTrain::set_speed(unsigned s)
+{
+ if(s==speed)
+ return;
+
+ TrainSpeedPacket pkt;
+ pkt.address = address;
+ pkt.speed = s;
+ pkt.reverse = reverse;
+ client.send(pkt);
+}
+
+void NetTrain::set_reverse(bool r)
+{
+ if(r==reverse)
+ return;
+
+ TrainSpeedPacket pkt;
+ pkt.address = address;
+ pkt.speed = speed;
+ pkt.reverse = r;
+ client.send(pkt);
+}
+
+void NetTrain::set_function(unsigned i, bool set)
+{
+ TrainFunctionPacket pkt;
+ pkt.address = address;
+ pkt.functions = functions;
+ if(set)
+ pkt.functions |= 1<<i;
+ else
+ pkt.functions &= ~(1<<i);
+ client.send(pkt);
+}
+
+void NetTrain::process_packet(const TrainSpeedPacket &pkt)
+{
+ if(pkt.speed!=speed)
+ {
+ speed = pkt.speed;
+ signal_speed_changed.emit(speed);
+ }
+ if(pkt.reverse!=reverse)
+ {
+ reverse = pkt.reverse;
+ signal_reverse_changed.emit(reverse);
+ }
+}
+
+void NetTrain::process_packet(const TrainFunctionPacket &pkt)
+{
+ unsigned old_funcs = functions;
+ functions = pkt.functions;
+ for(unsigned i=0; i<9; ++i)
+ if(((functions^old_funcs)>>i)&1)
+ signal_function_changed.emit(i, (functions>>i)&1);
+}
+
+void NetTrain::process_packet(const TrainStatusPacket &pkt)
+{
+ status = pkt.status;
+ signal_status_changed.emit(status);
+}
+
+} // namespace Marklin