X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibmarklin%2Fcontrol.cpp;h=bd63f9f66f661c75d110820edd7ddd3610e48d2c;hb=25b79ab38c2be2e5c89b8240504f641fd9c4899c;hp=02b8f0f16949a2aab1c5f49013de37e32bf10415;hpb=52cbe8d99669f843f8f75c51128e2748584dd03a;p=r2c2.git diff --git a/source/libmarklin/control.cpp b/source/libmarklin/control.cpp index 02b8f0f..bd63f9f 100644 --- a/source/libmarklin/control.cpp +++ b/source/libmarklin/control.cpp @@ -21,6 +21,17 @@ Control::Control(): debug(false) { } +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); +} + void Control::set_power(bool p) { power=p; @@ -30,6 +41,11 @@ void Control::set_power(bool p) command(string(1, CMD_POWER_OFF)); } +void Control::set_debug(bool d) +{ + debug=d; +} + void Control::open(const string &dev) { serial_fd=::open(dev.c_str(), O_RDWR); @@ -138,6 +154,8 @@ void Control::tick() 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; @@ -156,28 +174,28 @@ void Control::tick() poll_sensors=false; } - if(queue.size() && queue.front().get_sent()) + if(!queue.empty() && queue.front().get_sent()) { pollfd pfd={serial_fd, POLLIN, 0}; if(poll(&pfd, 1, 0)>0) { - string resp=read_reply((Cmd)(unsigned char)queue.front().get_command()[0]); + string resp=read_reply(static_cast(static_cast(queue.front().get_command()[0]))); if(debug) { printf("read: "); for(unsigned i=0; i(resp[i])); printf("(%d bytes)\n", resp.size()); } - queue.front().signal_done.emit((Error)resp[0], resp.substr(1)); + queue.front().signal_done.emit(static_cast(resp[0]), resp.substr(1)); queue.erase(queue.begin()); } else return; } - if(queue.size()) + if(!queue.empty()) { string cmd=queue.front().get_command(); @@ -193,8 +211,8 @@ void Control::tick() { printf("write: "); for(unsigned i=0; i(cmd[i])); + printf("(%d bytes)\n", cmd.size()); } write(serial_fd, cmd.data(), cmd.size()); @@ -207,19 +225,6 @@ 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); -} - -/*** private ***/ - void Control::read_all(int fd, char *buf, int size) { int pos=0; @@ -313,7 +318,7 @@ void Control::turnout_event_done(Error, const string &resp) unsigned count=resp[0]; for(unsigned i=0; i(resp[i*2+1])+((resp[i*2+2]&7)<<8); bool status=!(resp[i*2+2]&0x80); cout<<"Turnout "<(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); } }