X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibmarklin%2Fcontrol.cpp;h=6e82614c21ebf904a65fd3d4d29b359bfe77c03e;hb=aead7f2da831199fbb8f6950b067656b2965c2fa;hp=d371777fc5ca15d58478c001649732d038d33737;hpb=6c61179fe09af2f5366d50f10aadbf5f83438087;p=r2c2.git diff --git a/source/libmarklin/control.cpp b/source/libmarklin/control.cpp index d371777..6e82614 100644 --- a/source/libmarklin/control.cpp +++ b/source/libmarklin/control.cpp @@ -2,7 +2,7 @@ #include #include #include -#include +#include #include #include #include "command.h" @@ -30,32 +30,6 @@ void Control::set_power(bool p) command(string(1, CMD_POWER_OFF)); } -Turnout *Control::get_turnout(unsigned id) const -{ - TurnoutMap::const_iterator i=turnouts.find(id); - if(i!=turnouts.end()) - return i->second; - - return 0; -} - -Locomotive *Control::get_locomotive(unsigned id) const -{ - for(LocomotiveSeq::const_iterator i=locomotives.begin(); i!=locomotives.end(); ++i) - if((*i)->get_address()==id) - return *i; - return 0; -} - -Sensor *Control::get_sensor(unsigned id) const -{ - SensorMap::const_iterator i=sensors.find(id); - if(i!=sensors.end()) - return i->second; - - return 0; -} - void Control::open(const string &dev) { serial_fd=::open(dev.c_str(), O_RDWR); @@ -114,31 +88,58 @@ Command &Control::command(const string &cmd) return queue.back(); } -void Control::add_turnout(Turnout *t) +void Control::add_turnout(Turnout &t) { - if(turnouts.count(t->get_address())==0) - turnouts.insert(TurnoutMap::value_type(t->get_address(), t)); + turnouts[t.get_address()]=&t; } -void Control::add_locomotive(Locomotive *l) +Turnout &Control::get_turnout(unsigned id) const { - if(find(locomotives.begin(), locomotives.end(), l)==locomotives.end()) - locomotives.push_back(l); + map::const_iterator i=turnouts.find(id); + if(i==turnouts.end()) + throw KeyError("Unknown turnout"); + + return *i->second; } -void Control::add_sensor(Sensor *s) +void Control::add_locomotive(Locomotive &l) { - if(sensors.count(s->get_address())==0) - { - sensors.insert(SensorMap::value_type(s->get_address(), s)); - poll_sensors=true; - } + locomotives[l.get_address()]=&l; +} + +Locomotive &Control::get_locomotive(unsigned id) const +{ + map::const_iterator i=locomotives.find(id); + if(i==locomotives.end()) + throw KeyError("Unknown locomotive"); + + return *i->second; +} + +void Control::add_sensor(Sensor &s) +{ + sensors[s.get_address()]=&s; + poll_sensors=true; +} + +Sensor &Control::get_sensor(unsigned id) const +{ + map::const_iterator i=sensors.find(id); + if(i==sensors.end()) + throw KeyError("Unknown sensor"); + + return *i->second; } void Control::tick() { const Time::TimeStamp t=Time::now(); + for(map::const_iterator i=sensors.begin(); i!=sensors.end(); ++i) + i->second->tick(); + + timer.tick(false); + if(t>next_event_query) { next_event_query=t+300*Time::msec; @@ -203,8 +204,19 @@ void Control::tick() } } +Time::Timer::Slot &Control::set_timer(const Time::TimeDelta &dt) +{ + return timer.add(dt); +} + Control::~Control() { + for(map::iterator i=sensors.begin(); i!=sensors.end(); ++i) + delete i->second; + for(map::iterator i=turnouts.begin(); i!=turnouts.end(); ++i) + delete i->second; + for(map::iterator i=locomotives.begin(); i!=locomotives.end(); ++i) + delete i->second; close(serial_fd); } @@ -315,14 +327,14 @@ void Control::sensor_event_done(Error, const string &resp) for(unsigned i=0; resp[i]; i+=3) { unsigned module=(unsigned char)resp[i]; + cout<<"S88 module "<>(7-j%8))&1; - cout<>(7-j%8))&1); cout<<'\n'; + + for(unsigned j=0; j<16; ++j) + signal_sensor_event.emit(module*16+j-15, (resp[i+1+j/8]>>(7-j%8))&1); } }