X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibr2c2%2Fintellibox.cpp;h=7702ed6b1bdde49b9309c2da9ef72f54fd3e2ae6;hb=2dce9f86c82b6ada591f2a2f0135edceb95756f3;hp=64e785582dce0f8895deda28493af96cb5f7974c;hpb=247742fbc1c27bfc9fdef4630afcdc2408cdd550;p=r2c2.git diff --git a/source/libr2c2/intellibox.cpp b/source/libr2c2/intellibox.cpp index 64e7855..7702ed6 100644 --- a/source/libr2c2/intellibox.cpp +++ b/source/libr2c2/intellibox.cpp @@ -257,7 +257,7 @@ void Intellibox::set_turnout(unsigned addr, unsigned state) for(unsigned i=0; isecond.active = false; i->second.off_timeout = Time::TimeStamp(); - turnout_command(i->first, i->second.state, false); + for(unsigned j=0; jsecond.bits; ++j) + turnout_command(i->first+j, !(i->second.state&(1<::iterator i=sensors.begin(); i!=sensors.end(); ++i) @@ -490,8 +491,12 @@ void Intellibox::process_reply(const Time::TimeStamp &t) read_all(data, 2); unsigned addr = data[0]+((data[1]&7)<<8); + unsigned mask = 1; + for(; !turnouts[addr].bits; --addr, mask<<=1) ; Turnout &turnout = turnouts[addr]; - turnout.state = (data[1]&0x80)!=0; + + unsigned bit = !(data[1]&0x80); + turnout.state = (turnout.state&~mask) | (bit*mask); turnout.pending = turnout.state; signal_turnout.emit(addr, turnout.state); } @@ -553,11 +558,7 @@ void Intellibox::process_reply(const Time::TimeStamp &t) unsigned addr = queue.front().addr; unsigned mask = 1; - while(!turnouts[addr].bits) - { - --addr; - mask <<= 1; - } + for(; !turnouts[addr].bits; --addr, mask<<=1) ; Turnout &turnout = turnouts[addr]; if(err==ERR_NO_ERROR) @@ -590,17 +591,13 @@ void Intellibox::process_reply(const Time::TimeStamp &t) unsigned addr = queue.front().addr; unsigned mask = 1; - while(!turnouts[addr].bits) - { - --addr; - mask <<= 1; - } + for(; !turnouts[addr].bits; --addr, mask<<=1) ; Turnout &turnout = turnouts[addr]; - bool state = data&0x04; - if(state!=((turnout.state&mask)!=0)) + bool bit = !(data&0x04); + if(bit!=((turnout.state&mask)!=0)) { - turnout.state = (turnout.state&~mask) | (state ? mask : 0); + turnout.state = (turnout.state&~mask) | (bit*mask); turnout.pending = turnout.state; signal_turnout.emit(addr, turnout.state); }