]> git.tdb.fi Git - r2c2.git/blobdiff - source/libr2c2/centralstation.cpp
Add basic support for signals
[r2c2.git] / source / libr2c2 / centralstation.cpp
index 833560ae727a5839151105b625da6e363a76a662..ee5aaeea4fe573e3b47f948e7154958c69b7f03d 100644 (file)
@@ -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;