X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibr2c2%2Fcentralstation.cpp;h=3a9624af1ba17b0049b17a832e317ecb055bb4dc;hb=a76a60a5eb20f6e7c5bfc2a7250529b2510df987;hp=6a8de96694f3d9ada60020ff06dc4a018a676de6;hpb=4d60572bd7ba7f6b9ffed2c9f1191e39aad3d54c;p=r2c2.git diff --git a/source/libr2c2/centralstation.cpp b/source/libr2c2/centralstation.cpp index 6a8de96..3a9624a 100644 --- a/source/libr2c2/centralstation.cpp +++ b/source/libr2c2/centralstation.cpp @@ -1,10 +1,3 @@ -/* $Id$ - -This file is part of R²C² -Copyright © 2010 Mikkosoft Productions, Mikko Rasa -Distributed under the GPL -*/ - #include #include #include @@ -107,6 +100,10 @@ void CentralStation::add_loco(unsigned addr, const string &proto_name, const Veh loco.protocol = proto; loco.address = addr; + const VehicleType::FunctionMap &type_funcs = type.get_functions(); + for(VehicleType::FunctionMap::const_iterator i=type_funcs.begin(); i!=type_funcs.end(); ++i) + loco.func_mask |= 1<first; + if(locos_synced && proto!=MFX) command("create(10)"); } @@ -145,6 +142,7 @@ void CentralStation::set_loco_function(unsigned addr, unsigned func, bool state) void CentralStation::add_turnout(unsigned addr, const TrackType &type) { + unsigned straight = type.get_paths(); bool left = false; bool right = false; bool cross = false; @@ -154,10 +152,11 @@ 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) - left = true; - else if(end.dirstart.dir+0.01 || end.dirstart.dir ? left : right) = true; + straight &= ~(1<get_path()); + } else if(start.dir<-0.01 || start.dir>0.01) cross = true; } @@ -168,9 +167,9 @@ void CentralStation::add_turnout(unsigned addr, const TrackType &type) else if(left && right) symbol = Turnout::THREEWAY; else if(left) - symbol = Turnout::LEFT; + symbol = (straight ? Turnout::LEFT : Turnout::CURVED_LEFT); else if(right) - symbol = Turnout::RIGHT; + symbol = (straight ? Turnout::RIGHT : Turnout::CURVED_RIGHT); unsigned id = map_address(turnouts, turnout_addr, addr); if(!id) @@ -250,15 +249,6 @@ bool CentralStation::get_sensor(unsigned addr) const void CentralStation::tick() { - Time::TimeStamp t = Time::now(); - for(SensorMap::iterator i=sensors.begin(); i!=sensors.end(); ++i) - if(i->second.off_timeout && t>i->second.off_timeout) - { - i->second.state = false; - i->second.off_timeout = Time::TimeStamp(); - signal_sensor.emit(i->first, i->second.state); - } - while(Message msg = receive()) { if(msg.footer.code) @@ -352,7 +342,12 @@ void CentralStation::process_reply(const Message &msg) if(j!=locos.end()) { command(format("request(%d, view, control, force)", i->first)); - command(format("get(%d, dir, func[0])", i->first)); + string cmd = format("get(%d, dir", i->first); + for(unsigned l=0; j->second.func_mask>>l; ++l) + if((j->second.func_mask>>l)&1) + cmd += format(", func[%d]", l); + cmd += ')'; + command(cmd); locos.insert(LocoMap::value_type(i->first, j->second)); locos.erase(j); @@ -419,6 +414,7 @@ void CentralStation::process_reply(const Message &msg) { s88.push_back(i->first); command(format("request(%d, view)", i->first)); + command(format("get(%d, state)", i->first)); } sensors_synced = true; @@ -599,17 +595,11 @@ void CentralStation::process_object(unsigned id, const Message::AttribMap &attri unsigned addr = base*16+j+1; Sensor &sensor = sensors[addr]; bool s = state&(1< @@ -721,10 +711,12 @@ CentralStation::Message CentralStation::parse_message(string::iterator &iter, co if(open_bracket!=string::npos) { string::size_type close_bracket = attr.rfind(']'); - attribs[attr.substr(0, open_bracket)] = attr.substr(open_bracket+1, close_bracket-open_bracket-1); + string attr_name = attr.substr(0, open_bracket); + string attr_value = attr.substr(open_bracket+1, close_bracket-open_bracket-1); + attribs.insert(Message::AttribMap::value_type(attr_name, attr_value)); } else - attribs[attr]; + attribs.insert(Message::AttribMap::value_type(attr, string())); } } @@ -756,6 +748,7 @@ CentralStation::Locomotive::Locomotive(): address(0), speed(0), reverse(false), + func_mask(0), funcs(0), control(false) { }