]> git.tdb.fi Git - r2c2.git/blob - source/libmarklin/turnout.cpp
Major code refactoring:
[r2c2.git] / source / libmarklin / turnout.cpp
1 #include <iostream>
2 #include <msp/time/timer.h>
3 #include <msp/time/units.h>
4 #include "command.h"
5 #include "control.h"
6 #include "turnout.h"
7
8 using namespace std;
9 using namespace Msp;
10
11 namespace Marklin {
12
13 Turnout::Turnout(Control &c, unsigned a):
14         control(c),
15         addr(a),
16         route(0)
17 {
18         control.add_turnout(*this);
19
20         control.signal_turnout_event.connect(sigc::mem_fun(this, &Turnout::turnout_event));
21
22         char cmd[3];
23         cmd[0]=CMD_TURNOUT_STATUS;
24         cmd[1]=addr&0xFF;
25         cmd[2]=(addr>>8)&0xFF;
26         control.command(string(cmd,3)).signal_done.connect(sigc::mem_fun(this, &Turnout::status_reply));
27 }
28
29 void Turnout::set_route(unsigned r)
30 {
31         route=r;
32
33         command(true);
34         control.set_timer(200*Time::msec).signal_timeout.connect(sigc::mem_fun(this, &Turnout::switch_timeout));
35
36         signal_route_changed.emit(route);
37 }
38
39 void Turnout::command(bool on)
40 {
41         char cmd[3];
42         cmd[0]=CMD_TURNOUT;
43         cmd[1]=addr&0xFF;
44         cmd[2]=((addr>>8)&0x7);
45         if(on)
46                 cmd[2]|=0x40;
47         if(route==0)
48                 cmd[2]|=0x80;
49         control.command(string(cmd,3));
50 }
51
52 void Turnout::status_reply(Error err, const string &reply)
53 {
54         if(err==ERR_NO_ERROR)
55         {
56                 route=(reply[0]&4)?0:1;
57                 signal_route_changed.emit(route);
58         }
59 }
60
61 bool Turnout::switch_timeout()
62 {
63         command(false);
64
65         return false;
66 }
67
68 void Turnout::turnout_event(unsigned a, bool r)
69 {
70         if(a==addr && r!=route)
71         {
72                 route=r;
73                 signal_route_changed.emit(route);
74         }
75 }
76
77 } // namespace Marklin