-/* $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 {
+namespace R2C2 {
NetTrain::NetTrain(Client &c, const TrainInfoPacket &pkt):
client(c),
- loco_type(client.get_catalogue().get_locomotive(pkt.loco_type)),
+ loco_type(client.get_catalogue().get<VehicleType>(pkt.loco_type)),
address(pkt.address),
name(pkt.name),
- speed(0),
- reverse(0),
+ target_speed(0),
+ reverse(false),
functions(0)
{ }
-void NetTrain::set_speed(unsigned s)
+void NetTrain::set_control(const string &c, float v)
{
- if(s==speed)
+ if(v==controls[c])
return;
- TrainSpeedPacket pkt;
+ TrainControlPacket pkt;
pkt.address = address;
- pkt.speed = s;
+ pkt.control = c;
+ pkt.value = v;
+ client.send(pkt);
+}
+
+float NetTrain::get_control(const string &c) const
+{
+ map<string, float>::const_iterator i = controls.find(c);
+ return i!=controls.end() ? i->second : 0;
+}
+
+void NetTrain::set_target_speed(float s)
+{
+ TrainAIControlPacket pkt;
+ pkt.address = address;
+ pkt.target_speed = s;
pkt.reverse = reverse;
client.send(pkt);
}
void NetTrain::set_reverse(bool r)
{
- if(r==reverse)
- return;
-
- TrainSpeedPacket pkt;
+ TrainAIControlPacket pkt;
pkt.address = address;
- pkt.speed = speed;
+ pkt.target_speed = target_speed;
pkt.reverse = r;
client.send(pkt);
}
client.send(pkt);
}
-void NetTrain::process_packet(const TrainSpeedPacket &pkt)
+void NetTrain::process_packet(const TrainControlPacket &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);
- }
+ controls[pkt.control] = pkt.value;
+ signal_control_changed.emit(pkt.control, pkt.value);
}
void NetTrain::process_packet(const TrainFunctionPacket &pkt)
signal_function_changed.emit(i, (functions>>i)&1);
}
+void NetTrain::process_packet(const TrainAIControlPacket &pkt)
+{
+ if(pkt.target_speed!=target_speed)
+ {
+ target_speed = pkt.target_speed;
+ signal_target_speed_changed.emit(target_speed);
+ }
+
+ if(pkt.reverse!=reverse)
+ {
+ reverse = pkt.reverse;
+ signal_reverse_changed.emit(reverse);
+ }
+}
+
void NetTrain::process_packet(const TrainStatusPacket &pkt)
{
status = pkt.status;
signal_route_changed.emit(route);
}
-} // namespace Marklin
+} // namespace R2C2