]> git.tdb.fi Git - r2c2.git/blobdiff - source/libr2c2/centralstation.cpp
Handle sensors in a separate class
[r2c2.git] / source / libr2c2 / centralstation.cpp
index 833560ae727a5839151105b625da6e363a76a662..ac553ab4ea5b94abc0f5b9a6515ca024c08ffa9f 100644 (file)
@@ -152,12 +152,12 @@ void CentralStation::add_turnout(unsigned addr, const TrackType &type)
        {
                TrackPoint start = i->get_point(0);
                TrackPoint end = i->get_point(i->get_length());
-               if(end.dir>start.dir+0.01 || end.dir<start.dir-0.01)
+               if(abs(end.dir-start.dir).radians()<0.01)
                {
                        (end.dir>start.dir ? left : right) = true;
                        straight &= ~(1<<i->get_path());
                }
-               else if(start.dir<-0.01 || start.dir>0.01)
+               else if(abs(start.dir).radians()>0.01)
                        cross = true;
        }
 
@@ -185,6 +185,21 @@ unsigned CentralStation::get_turnout(unsigned addr) const
        return get_accessory_state(addr, MagnetAccessory::TURNOUT);
 }
 
+void CentralStation::add_signal(unsigned addr, const SignalType &)
+{
+       add_accessory(addr, MagnetAccessory::SIGNAL, MagnetAccessory::SEMAPHORE_HOME);
+}
+
+void CentralStation::set_signal(unsigned addr, unsigned state)
+{
+       set_accessory_state(addr, MagnetAccessory::SIGNAL, state);
+}
+
+unsigned CentralStation::get_signal(unsigned addr) const
+{
+       return get_accessory_state(addr, MagnetAccessory::SIGNAL);
+}
+
 CentralStation::MagnetAccessory &CentralStation::add_accessory(unsigned addr, MagnetAccessory::Type type, MagnetAccessory::Symbol symbol)
 {
        unsigned id = map_address(accessories, accessory_addr, addr);
@@ -255,6 +270,8 @@ void CentralStation::accessory_state_changed(const MagnetAccessory &accessory) c
 {
        if(accessory.type==MagnetAccessory::TURNOUT)
                signal_turnout.emit(accessory.address, accessory.state);
+       else if(accessory.type==MagnetAccessory::SIGNAL)
+               signal_signal.emit(accessory.address, accessory.state);
 }
 
 void CentralStation::add_sensor(unsigned addr)
@@ -494,8 +511,9 @@ void CentralStation::process_reply(const Message &msg)
                                if(k!=accessories.end())
                                {
                                        command(format("request(%d, view, control)", id));
-                                       command(format("set(%d, addr[%d], symbol[%d], name1[\"Switch\"], name2[\"%d\"], name3[\"\"])",
-                                               id, k->second.address, k->second.symbol, k->second.address));
+                                       const char *label = (k->second.type==MagnetAccessory::SIGNAL ? "Signal" : "Switch");
+                                       command(format("set(%d, addr[%d], symbol[%d], name1[\"%s\"], name2[\"%d\"], name3[\"\"])",
+                                               id, k->second.address, k->second.symbol, label, k->second.address));
                                        command(format("set(%d, state[%d])", id, k->second.state&((1<<k->second.bits)-1)));
 
                                        k->second.synced = true;