]> git.tdb.fi Git - r2c2.git/blobdiff - source/network/train.cpp
Add networking library and a remote control program
[r2c2.git] / source / network / train.cpp
diff --git a/source/network/train.cpp b/source/network/train.cpp
new file mode 100644 (file)
index 0000000..468b220
--- /dev/null
@@ -0,0 +1,90 @@
+/* $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