Index: trunk/MagicSoft/Cosy/devdrv/shaftencoder.cc
===================================================================
--- trunk/MagicSoft/Cosy/devdrv/shaftencoder.cc	(revision 920)
+++ trunk/MagicSoft/Cosy/devdrv/shaftencoder.cc	(revision 921)
@@ -13,5 +13,5 @@
 #include <sys/resource.h>  // PRIO_PROCESS
 
-ShaftEncoder::ShaftEncoder(BYTE_t nodeid, MLog &out) : NodeDrv(nodeid, out), fLabel(NULL)
+ShaftEncoder::ShaftEncoder(BYTE_t nodeid, MLog &out) : NodeDrv(nodeid, out), fLabel(NULL), fPosHasChanged(false)
 {
 }
@@ -112,13 +112,19 @@
 }
 
-void ShaftEncoder::HandlePDOType0(BYTE_t *data)
+void ShaftEncoder::HandlePDOType0(BYTE_t *data, struct timeval *tv)
 {
     //
     // Decode information, we have a 14bit only
     //
-    fPos  = data[0] | (data[1]<<8) | (data[2]<<16); // | (data[3]<<24);
-}
-
-void ShaftEncoder::HandlePDOType1(BYTE_t *data)
+    LWORDS_t pos = data[0] | (data[1]<<8) | (data[2]<<16); // | (data[3]<<24);
+    if (pos==fPos)
+        return;
+
+    fPos = pos;
+    fTime.SetTimer(tv);
+    fPosHasChanged = true;
+}
+
+void ShaftEncoder::HandlePDOType1(BYTE_t *data, struct timeval *tv)
 {
     //
@@ -127,5 +133,12 @@
     LWORDS_t pos  = data[0] | (data[1]<<8) | (data[2]<<16); // | (data[3]<<24);
     BYTE_t   flag = data[4];
-    pos=pos;
+
+    if (fPos==pos)
+        return;
+
+    fPos=pos;
+    fTime.SetTimer(tv);
+    fPosHasChanged=true;
+
     flag=flag;
 }
@@ -141,16 +154,22 @@
     fAcc = data[6] | (data[7]<<8);
 
-    fTime.SetTimer(tv);
-
     const int uplim = 9*fTicks/10;
     const int dnlim = 1*fTicks/10;
 
+    int turn = fTurn;
+
     if (fPos > uplim && pos < dnlim)
-        fTurn++;
+        turn++;
 
     if (fPos < dnlim && pos > uplim)
-        fTurn--;
-
-    fPos = pos;
+        turn--;
+
+    if (fPos==pos && fTurn==fTurn)
+        return;
+
+    fPos  = pos;
+    fTurn = turn;
+    fTime.SetTimer(tv);
+    fPosHasChanged=true;
 }
 
Index: trunk/MagicSoft/Cosy/devdrv/shaftencoder.h
===================================================================
--- trunk/MagicSoft/Cosy/devdrv/shaftencoder.h	(revision 920)
+++ trunk/MagicSoft/Cosy/devdrv/shaftencoder.h	(revision 921)
@@ -22,8 +22,10 @@
     WORDS_t   fUpdAcc;   // ticks per 25ms^2
 
+    bool fPosHasChanged;
+
     Timer fTime;
 
-    void HandlePDOType0(BYTE_t *data);
-    void HandlePDOType1(BYTE_t *data);
+    void HandlePDOType0(BYTE_t *data, struct timeval *tv);
+    void HandlePDOType1(BYTE_t *data, struct timeval *tv);
     void HandlePDOType2(BYTE_t *data, struct timeval *tv);
 
@@ -56,4 +58,7 @@
 
     void DisplayVal();
+
+    bool IsPosHasChanged() const { return fPosHasChanged; }
+    void ResetPosHasChanged() { fPosHasChanged = false; }
 };
 
