]> git.tdb.fi Git - r2c2.git/blobdiff - source/libr2c2/intellibox.cpp
Strip Id tags and copyright notices from files
[r2c2.git] / source / libr2c2 / intellibox.cpp
index 7702ed6b1bdde49b9309c2da9ef72f54fd3e2ae6..732e164c01b42660122d89fa15058b36fb94efc6 100644 (file)
@@ -1,10 +1,3 @@
-/* $Id$
-
-This file is part of R²C²
-Copyright © 2010  Mikkosoft Productions, Mikko Rasa
-Distributed under the GPL
-*/
-
 #include <fcntl.h>
 #include <termios.h>
 #include <sys/poll.h>
@@ -242,7 +235,7 @@ void Intellibox::set_turnout(unsigned addr, unsigned state)
 {
        Turnout &turnout = turnouts[addr];
        unsigned mask = (1<<turnout.bits)-1;
-       if(((state^turnout.state)&mask)==0 || ((state^turnout.pending)&mask)==0)
+       if(((state^turnout.state)&mask)==0 || ((state^turnout.pending)&mask)==0 || !turnout.synced)
        {
                turnout.state = state;
                turnout.pending = state;
@@ -355,7 +348,6 @@ void Intellibox::tick()
 
 void Intellibox::flush()
 {
-       Time::TimeStamp t = Time::now();
        for(list<CommandSlot>::iterator i=queue.begin(); i!=queue.end(); ++i)
        {
                write(serial_fd, i->data, i->length);
@@ -601,6 +593,8 @@ void Intellibox::process_reply(const Time::TimeStamp &t)
                                turnout.pending = turnout.state;
                                signal_turnout.emit(addr, turnout.state);
                        }
+
+                       turnout.synced = true;
                }
                else
                        error(cmd, err);
@@ -620,24 +614,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<<i))
-                                               signal_loco_function.emit(addr, i, loco.funcs&(1<<i));
-                       }
+                       unsigned funcs_changed = loco.funcs^funcs;
+                       loco.funcs = funcs;
+
+                       if(speed_changed)
+                               signal_loco_speed.emit(addr, loco.speed, loco.reverse);
+                       for(unsigned i=0; i<5; ++i)
+                               if(funcs_changed&(1<<i))
+                                       signal_loco_function.emit(addr, i, loco.funcs&(1<<i));
                }
                else
                        error(cmd, err);
@@ -748,7 +740,8 @@ Intellibox::Turnout::Turnout():
        bits(1),
        state(0),
        active(false),
-       pending(false)
+       synced(false),
+       pending(0)
 { }