X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibr2c2%2Fblock.cpp;h=25b3bc8b85163d0bfd2ece6a54718f02b840ec6d;hb=ece91e92af821bd6b468bd1134302efb7c28f019;hp=f6818166d22c8996c58199abb45e464c2b54fcbc;hpb=cb4e53ba1b8ea41b978190de6668e9862b9cfea8;p=r2c2.git diff --git a/source/libr2c2/block.cpp b/source/libr2c2/block.cpp index f681816..25b3bc8 100644 --- a/source/libr2c2/block.cpp +++ b/source/libr2c2/block.cpp @@ -1,7 +1,8 @@ #include +#include +#include #include #include "block.h" -#include "driver.h" #include "layout.h" #include "route.h" #include "trackcircuit.h" @@ -16,9 +17,13 @@ namespace R2C2 { Block::Block(Layout &l, Track &start): TrackChain(l), id(0), - sensor_id(start.get_sensor_id()), - turnout_id(start.get_turnout_id()), - train(0) + sensor_addr(start.get_sensor_address()), + turnout_addr(start.get_turnout_address()), + conflict(false), + sensor(0), + train(0), + pending_train(0), + emitting_reserve(false) { add_track(start); @@ -43,9 +48,14 @@ Block::Block(Layout &l, Track &start): determine_id(); - sensor = new TrackCircuit(layout, *this); + const set &blocks = layout.get_all(); + for(set::const_iterator i=blocks.begin(); (!conflict && i!=blocks.end()); ++i) + conflict = (id==(*i)->get_id()); - layout.add_block(*this); + if(!conflict && sensor_addr) + sensor = new TrackCircuit(layout, *this); + + layout.add(*this); } Block::~Block() @@ -62,11 +72,16 @@ Block::~Block() blk->break_link(*this); } - layout.remove_block(*this); + layout.remove(*this); delete sensor; } +void Block::set_name(const string &) +{ + throw logic_error("Block names can't be set"); +} + void Block::on_track_added(Track &track) { track.set_block(this); @@ -74,7 +89,7 @@ void Block::on_track_added(Track &track) TrackChain::Validity Block::check_validity(Track &track) const { - if(track.get_sensor_id()!=sensor_id || track.get_turnout_id()!=turnout_id) + if(track.get_sensor_address()!=sensor_addr || track.get_turnout_address()!=turnout_addr) return INCOMPATIBLE; return TrackChain::check_validity(track); @@ -155,10 +170,19 @@ Block *Block::get_link(unsigned epi) const bool Block::reserve(Train *t) { - if(!t || !train) + if(!t || !(emitting_reserve ? pending_train : train)) { - train = t; - signal_reserved.emit(train); + pending_train = t; + if(!emitting_reserve) + { + while(pending_train!=train) + { + train = pending_train; + SetFlag setf(emitting_reserve); + signal_reserved.emit(train); + } + } + return true; } else @@ -167,10 +191,17 @@ bool Block::reserve(Train *t) void Block::determine_id() { - if(sensor_id) - id = 0x1000|sensor_id; - else if(turnout_id) - id = 0x2000|turnout_id; + string n; + if(sensor_addr) + { + id = 0x1000|sensor_addr; + n = format("Sensor %d", sensor_addr); + } + else if(turnout_addr) + { + id = 0x2000|turnout_addr; + n = format("Turnout %d", turnout_addr); + } else if(endpoints.size()==2) { unsigned id1 = endpoints[0].link ? endpoints[0].link->get_id() : 1; @@ -184,6 +215,17 @@ void Block::determine_id() unsigned id1 = endpoints[0].link ? endpoints[0].link->get_id() : 1; id = 0x10000 | id1; } + + if(n.empty()) + n = format("Block %x", id); + + name = n; + signal_name_changed.emit(name); +} + +DataFile::Statement Block::save_reference() const +{ + return (DataFile::Statement("block"), id); }