From: Mikko Rasa Date: Sat, 21 May 2011 20:54:48 +0000 (+0000) Subject: Get the initial state of s88 modules X-Git-Url: http://git.tdb.fi/?a=commitdiff_plain;h=374dc443d044f31c925342f339a628c860c08a7e;p=r2c2.git Get the initial state of s88 modules Get all functions of locomotives --- diff --git a/source/libr2c2/centralstation.cpp b/source/libr2c2/centralstation.cpp index dd0cbcf..2e605ba 100644 --- a/source/libr2c2/centralstation.cpp +++ b/source/libr2c2/centralstation.cpp @@ -107,6 +107,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)"); } @@ -343,7 +347,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); @@ -410,6 +419,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; @@ -706,10 +716,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())); } } @@ -741,6 +753,7 @@ CentralStation::Locomotive::Locomotive(): address(0), speed(0), reverse(false), + func_mask(0), funcs(0), control(false) { } diff --git a/source/libr2c2/centralstation.h b/source/libr2c2/centralstation.h index fea882b..90f4471 100644 --- a/source/libr2c2/centralstation.h +++ b/source/libr2c2/centralstation.h @@ -30,7 +30,7 @@ private: struct Message { - typedef std::map AttribMap; + typedef std::multimap AttribMap; typedef std::map ObjectMap; Tag header; @@ -68,6 +68,7 @@ private: unsigned address; unsigned speed; bool reverse; + unsigned func_mask; unsigned funcs; bool control;