X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibr2c2%2Fintellibox.cpp;h=4e6bb763d7e278a745a16fc200cfb8cdf406da63;hb=598631d530a20ba8f4710f45747a9742e149f604;hp=64e785582dce0f8895deda28493af96cb5f7974c;hpb=247742fbc1c27bfc9fdef4630afcdc2408cdd550;p=r2c2.git diff --git a/source/libr2c2/intellibox.cpp b/source/libr2c2/intellibox.cpp index 64e7855..4e6bb76 100644 --- a/source/libr2c2/intellibox.cpp +++ b/source/libr2c2/intellibox.cpp @@ -242,7 +242,7 @@ void Intellibox::set_turnout(unsigned addr, unsigned state) { Turnout &turnout = turnouts[addr]; unsigned mask = (1<second.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,20 +591,18 @@ 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); } + + turnout.synced = true; } else error(cmd, err); @@ -623,24 +622,22 @@ void Intellibox::process_reply(const Time::TimeStamp &t) unsigned speed = (data[0]<=1 ? 0 : data[0]*2/19+1); bool reverse = !(data[1]&0x20); - if(speed!=loco.speed || reverse!=loco.reverse) - { - loco.speed = speed; - loco.reverse = reverse; - signal_loco_speed.emit(addr, loco.speed, loco.reverse); - } + bool speed_changed = (speed!=loco.speed || reverse!=loco.reverse); + + loco.speed = speed; + loco.reverse = reverse; unsigned funcs = (data[1]&0xF)<<1; if(data[1]&0x10) funcs |= 1; - if(funcs!=loco.funcs) - { - unsigned changed = loco.funcs^funcs; - loco.funcs = funcs; - for(unsigned i=0; i<5; ++i) - if(changed&(1<