X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibr2c2%2Flayout.cpp;h=0901382b91d0f140bb8ddf39010bf41228b33bfb;hb=81ee4fbd16b472892b67b35ea85956423a2247ed;hp=c7dc346d61db45c652c3f553fc438c92e9f8576f;hpb=e3f081a762c1bd21c051590540d21ec21e9b36b1;p=r2c2.git diff --git a/source/libr2c2/layout.cpp b/source/libr2c2/layout.cpp index c7dc346..0901382 100644 --- a/source/libr2c2/layout.cpp +++ b/source/libr2c2/layout.cpp @@ -248,7 +248,7 @@ unsigned Layout::allocate_turnout_address() set used_addrs; const set &tracks = objects.get(); for(set::const_iterator i=tracks.begin(); i!=tracks.end(); ++i) - if((*i)->get_turnout_address()) + if((*i)->get_type().is_turnout()) used_addrs.insert((*i)->get_turnout_address()); unsigned result = next_turnout_addr; @@ -385,7 +385,8 @@ void Layout::tick() dt = t-last_tick; last_tick = t; - clock.tick(dt); + if(!driver || !driver->is_halted()) + clock.tick(dt); for(set::iterator i=sensors.get().begin(); i!=sensors.get().end(); ++i) (*i)->tick(dt); @@ -396,12 +397,15 @@ void Layout::tick() i->second->tick(dt); } -void Layout::emergency(const string &msg) +void Layout::emergency(Block *block, const string &msg) { if(driver) driver->halt(true); - IO::print("Emergency: %s\n", msg); - signal_emergency.emit(msg); + if(block) + IO::print("Emergency at %s: %s\n", block->get_name(), msg); + else + IO::print("Emergency: %s\n", msg); + signal_emergency.emit(block, msg); } void Layout::save(const string &fn) const @@ -416,7 +420,7 @@ void Layout::save(const string &fn) const for(set::const_iterator i=tracks.begin(); i!=tracks.end(); ++i) { DataFile::Statement st("track"); - st.append((*i)->get_type().get_article_number()); + st.append(catalogue.get_name(&(*i)->get_type())); (*i)->save(st.sub); writer.write(st); } @@ -425,7 +429,7 @@ void Layout::save(const string &fn) const for(set::const_iterator i=signals.begin(); i!=signals.end(); ++i) { DataFile::Statement st("signal"); - st.append((*i)->get_type().get_article_number()); + st.append(catalogue.get_name(&(*i)->get_type())); (*i)->save(st.sub); writer.write(st); } @@ -434,7 +438,7 @@ void Layout::save(const string &fn) const for(set::const_iterator i=terrains.begin(); i!=terrains.end(); ++i) { DataFile::Statement st("terrain"); - st.append((*i)->get_type().get_article_number()); + st.append(catalogue.get_name(&(*i)->get_type())); (*i)->save(st.sub); writer.write(st); } @@ -480,13 +484,13 @@ void Layout::save_dynamic(const string &fn) const const set &tracks = objects.get(); for(set::const_iterator i=tracks.begin(); i!=tracks.end(); ++i) - if(unsigned taddr = (*i)->get_turnout_address()) - writer.write((DataFile::Statement("turnout"), taddr, (*i)->get_active_path())); + if((*i)->get_type().is_turnout()) + writer.write((DataFile::Statement("turnout"), (*i)->get_turnout_address(), (*i)->get_active_path())); for(map::const_iterator i=trains.begin(); i!=trains.end(); ++i) { DataFile::Statement st("train"); - st.append(i->second->get_locomotive_type().get_article_number()); + st.append(catalogue.get_name(&i->second->get_locomotive_type())); st.append(i->second->get_address()); st.append(i->second->get_protocol()); i->second->save(st.sub); @@ -500,7 +504,7 @@ void Layout::sensor_state_changed(Sensor &sensor, Sensor::State state) { Block *block = sensor.get_block(); if(block && !block->get_train()) - emergency(format("Unreserved sensor %d triggered", sensor.get_address())); + emergency(block, "Unreserved sensor triggered"); } } @@ -590,21 +594,21 @@ void Layout::Loader::route() load_sub(*rte); } -void Layout::Loader::signal(ArticleNumber art_nr) +void Layout::Loader::signal(const string &n) { - Signal *sig = new Signal(obj, obj.catalogue.get(art_nr)); + Signal *sig = new Signal(obj, obj.catalogue.get(n)); load_sub(*sig); } -void Layout::Loader::terrain(ArticleNumber art_nr) +void Layout::Loader::terrain(const string &n) { - Terrain *ter = new Terrain(obj, obj.catalogue.get(art_nr)); + Terrain *ter = new Terrain(obj, obj.catalogue.get(n)); load_sub(*ter); } -void Layout::Loader::track(ArticleNumber art_nr) +void Layout::Loader::track(const string &n) { - Track *trk = new Track(obj, obj.catalogue.get(art_nr)); + Track *trk = new Track(obj, obj.catalogue.get(n)); load_sub(*trk); const set &tracks = obj.objects.get(); for(set::const_iterator i=tracks.begin(); i!=tracks.end(); ++i) @@ -612,9 +616,9 @@ void Layout::Loader::track(ArticleNumber art_nr) trk->link_to(**i); } -void Layout::Loader::train(ArticleNumber art_nr, unsigned addr, const std::string &proto) +void Layout::Loader::train(const string &n, unsigned addr, const std::string &proto) { - Train *trn = new Train(obj, obj.catalogue.get(art_nr), addr, proto); + Train *trn = new Train(obj, obj.catalogue.get(n), addr, proto); load_sub(*trn); }