3 This file is part of the MSP Märklin suite
4 Copyright © 2006-2009 Mikkosoft Productions, Mikko Rasa
5 Distributed under the GPL
8 #include <msp/time/timer.h>
9 #include <msp/time/units.h>
20 Turnout::Turnout(Control &c, unsigned a, bool d):
26 control.add_turnout(*this);
28 control.signal_turnout_event.connect(sigc::mem_fun(this, &Turnout::turnout_event));
30 unsigned char data[2];
32 data[1] = (addr>>8)&0xFF;
33 control.command(CMD_TURNOUT_STATUS, data, 2).signal_done.connect(sigc::bind(sigc::mem_fun(this, &Turnout::status_reply), false));
36 data[0] = (addr+1)&0xFF;
37 data[1] = ((addr+1)>>8)&0xFF;
38 control.command(CMD_TURNOUT_STATUS, data, 2).signal_done.connect(sigc::bind(sigc::mem_fun(this, &Turnout::status_reply), true));
42 void Turnout::set_route(unsigned r)
44 signal_route_changing.emit(r);
48 control.set_timer(200*Time::msec).signal_timeout.connect(sigc::mem_fun(this, &Turnout::switch_timeout));
50 signal_route_changed.emit(route);
53 void Turnout::command(bool on)
55 unsigned char data[2];
57 data[1] = ((addr>>8)&0x7) | (on ? 0x40 : 0) | (route&1 ? 0 : 0x80);
58 control.command(CMD_TURNOUT, data, 2);
61 data[0] = (addr+1)&0xFF;
62 data[1] = (((addr+1)>>8)&0x7) | (on ? 0x40 : 0) | (route&2 ? 0 : 0x80);
63 control.command(CMD_TURNOUT, data, 2);
67 void Turnout::status_reply(const Reply &reply, bool high)
69 if(reply.get_error()==ERR_NO_ERROR)
71 bool v = !(reply.get_data()[0]&0x04);
72 unsigned b = (high?2:1);
73 route = (route&~b)|(v?b:0);
74 signal_route_changed.emit(route);
78 bool Turnout::switch_timeout()
85 void Turnout::turnout_event(unsigned a, bool r)
87 if(a==addr && r!=(route&1))
89 route = (route&2)|(r?1:0);
90 signal_route_changed.emit(route);
92 else if(dual && a==addr+1 && r!=((route>>1)&1))
94 route = (route&1)|(r?2:0);
95 signal_route_changed.emit(route);
99 } // namespace Marklin