Don't send turnout commands before establishing sync with the device
layout.get_driver().flush();
if(!options.simulate)
layout.get_driver().flush();
if(!options.simulate)
- layout.save_trains(options.state_fn);
+ layout.save_dynamic(options.state_fn);
delete overlay;
delete root;
delete overlay;
delete root;
{
Turnout &turnout = turnouts[addr];
unsigned mask = (1<<turnout.bits)-1;
{
Turnout &turnout = turnouts[addr];
unsigned mask = (1<<turnout.bits)-1;
- if(((state^turnout.state)&mask)==0 || ((state^turnout.pending)&mask)==0)
+ if(((state^turnout.state)&mask)==0 || ((state^turnout.pending)&mask)==0 || !turnout.synced)
{
turnout.state = state;
turnout.pending = state;
{
turnout.state = state;
turnout.pending = state;
turnout.pending = turnout.state;
signal_turnout.emit(addr, turnout.state);
}
turnout.pending = turnout.state;
signal_turnout.emit(addr, turnout.state);
}
+
+ turnout.synced = true;
bits(1),
state(0),
active(false),
bits(1),
state(0),
active(false),
+ synced(false),
+ pending(0)
unsigned bits;
unsigned state;
bool active;
unsigned bits;
unsigned state;
bool active;
unsigned pending;
Msp::Time::TimeStamp off_timeout;
unsigned pending;
Msp::Time::TimeStamp off_timeout;
-void Layout::save_trains(const string &fn) const
+void Layout::save_dynamic(const string &fn) const
{
IO::BufferedFile out(fn, IO::M_WRITE);
DataFile::Writer writer(out);
{
IO::BufferedFile out(fn, IO::M_WRITE);
DataFile::Writer writer(out);
+ for(set<Track *>::const_iterator i=tracks.begin(); i!=tracks.end(); ++i)
+ if(unsigned tid = (*i)->get_turnout_id())
+ writer.write((DataFile::Statement("turnout"), tid, (*i)->get_active_path()));
+
for(map<unsigned, Train *>::const_iterator i=trains.begin(); i!=trains.end(); ++i)
{
DataFile::Statement st("train");
for(map<unsigned, Train *>::const_iterator i=trains.begin(); i!=trains.end(); ++i)
{
DataFile::Statement st("train");
add("route", static_cast<void (Loader::*)()>(&Loader::route));
add("track", static_cast<void (Loader::*)(ArticleNumber)>(&Loader::track));
add("train", static_cast<void (Loader::*)(ArticleNumber, unsigned, const std::string &)>(&Loader::train));
add("route", static_cast<void (Loader::*)()>(&Loader::route));
add("track", static_cast<void (Loader::*)(ArticleNumber)>(&Loader::track));
add("train", static_cast<void (Loader::*)(ArticleNumber, unsigned, const std::string &)>(&Loader::train));
+ add("turnout", &Loader::turnout);
add("zone", &Loader::zone);
// Deprecated aliases
add("zone", &Loader::zone);
// Deprecated aliases
+void Layout::Loader::turnout(unsigned addr, unsigned path)
+{
+ if(obj.driver)
+ obj.driver->set_turnout(addr, path);
+}
+
void Layout::Loader::zone()
{
Zone *zne = new Zone(obj);
void Layout::Loader::zone()
{
Zone *zne = new Zone(obj);
void track(ArticleNumber);
void train(unsigned, unsigned, const std::string &);
void train(ArticleNumber, unsigned, const std::string &);
void track(ArticleNumber);
void train(unsigned, unsigned, const std::string &);
void train(ArticleNumber, unsigned, const std::string &);
+ void turnout(unsigned, unsigned);
void emergency(const std::string &);
void save(const std::string &) const;
void emergency(const std::string &);
void save(const std::string &) const;
- void save_trains(const std::string &) const;
+ void save_dynamic(const std::string &) const;
private:
void sensor_event(unsigned, bool);
};
private:
void sensor_event(unsigned, bool);
};