X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibmarklin%2Fcontrol.cpp;h=ae26a179a9aa2f4b51585584b4d289ff6e59d4cc;hb=02c9a9779954d993cb73fe5f7a72b0847e87f633;hp=6f7ef74dbf30bc18cd83bd111e994ef7e606c619;hpb=38fb8d56efde037a71c46a58bda314655e68ab6c;p=r2c2.git diff --git a/source/libmarklin/control.cpp b/source/libmarklin/control.cpp index 6f7ef74..ae26a17 100644 --- a/source/libmarklin/control.cpp +++ b/source/libmarklin/control.cpp @@ -1,15 +1,15 @@ /* $Id$ This file is part of the MSP Märklin suite -Copyright © 2007-2008 Mikkosoft Productions, Mikko Rasa +Copyright © 2007-2009 Mikkosoft Productions, Mikko Rasa Distributed under the GPL */ #include #include #include -#include #include +#include #include #include #include "command.h" @@ -36,7 +36,8 @@ Control::~Control() delete i->second; for(map::iterator i=locomotives.begin(); i!=locomotives.end(); ++i) delete i->second; - close(serial_fd); + if(serial_fd>=0) + close(serial_fd); } void Control::open(const string &dev) @@ -71,7 +72,7 @@ void Control::open(const string &dev) pollfd pfd = { serial_fd, POLLIN, 0 }; if(poll(&pfd, 1, 500)>0) { - cout<<"IB detected at "<::iterator i=queue.begin(); i!=queue.end(); ++i) + i->send(serial_fd); +} + void Control::add_turnout(Turnout &t) { turnouts[t.get_address()] = &t; @@ -198,7 +205,7 @@ void Control::tick() { Reply reply = Reply::read(serial_fd, queue.front().get_command()); if(debug) - cout<<"R: "<=0) + queue.front().send(serial_fd); + else + { + Reply reply = Reply::simulate(queue.front().get_command()); + queue.front().signal_done.emit(reply); + queue.erase(queue.begin()); + } } } @@ -236,7 +250,7 @@ void Control::event_query_done(const Reply &reply) command(CMD_EVENT_TURNOUT).signal_done.connect(sigc::mem_fun(this, &Control::turnout_event_done)); if(data[0]&0x04) command(CMD_EVENT_SENSOR).signal_done.connect(sigc::mem_fun(this, &Control::sensor_event_done)); - if(data[1]&0x40) + if((data[0]&0x80) && (data[1]&0x40)) command(CMD_STATUS).signal_done.connect(sigc::mem_fun(this, &Control::status_done)); } @@ -248,7 +262,7 @@ void Control::turnout_event_done(const Reply &reply) { unsigned addr = (data[i*2+1])+((data[i*2+2]&7)<<8); bool status = !(data[i*2+2]&0x80); - cout<<"Turnout "<>(7-j%8))&1); - cout<<'\n'; + IO::print("S88 module %d, status %08b%08b\n", module, data[1], data[2]); for(unsigned j=0; j<16; ++j) signal_sensor_event.emit(module*16+j-15, (data[i+1+j/8]>>(7-j%8))&1);