Index: trunk/MagicSoft/Cosy/devdrv/macs.cc
===================================================================
--- trunk/MagicSoft/Cosy/devdrv/macs.cc	(revision 1702)
+++ trunk/MagicSoft/Cosy/devdrv/macs.cc	(revision 1703)
@@ -48,4 +48,10 @@
     case 0x100a:
         lout << "- " << GetNodeName() << ": Using Software Version V" << dec << (int)(val>>16) << "." << (int)(val&0xff) << endl;
+        fSoftVersion = val;
+        return;
+
+    case 0x100b:
+        // Do not display, this is used for CheckConnection
+        // lout << "Node ID: " << dec << val << endl;
         return;
 
@@ -221,32 +227,26 @@
 }
 
-void Macs::InitDevice(Network *net)
-{
-    lout << "- " << GetNodeName() << ": MAC Init device." << endl;
-    NodeDrv::InitDevice(net);
-    lout << "- " << GetNodeName() << ": MAC Init device...done." << endl;
-
-//    SendSDO(0x4003, (LWORD_t)('E'<<24 | 'X'<<16 | 'I'<<8 'T'));
-//    WaitForSdo(0x4003, 0);
-
-/*
-    lout << "- Requesting SDO 0x2002 (vel) of " << (int)GetId() << endl;
-    RequestSDO(0x2002);
-    WaitForSdo(0x2002);
-
-    lout << "- Requesting SDO 0x2003 of " << (int)GetId() << endl;
-    RequestSDO(0x2003);
-    WaitForSdo(0x2003);
-
-    lout << "- Requesting SDO 0x2004 of " << (int)GetId() << endl;
-    RequestSDO(0x2004);
-    WaitForSdo(0x2004);
-    */
+void Macs::CheckConnection()
+{
+    RequestSDO(0x100b);
+    WaitForSdo(0x100b);
+
+    // FIXME! Not statically linked!
+    //    if (fSoftVersion<0x00000035)
+    //        fIsZombie = true;
+}
+
+
+void Macs::Init()
+{
     lout << "- " << GetNodeName() << ": Requesting Mac Software Version." << endl;
     RequestSDO(0x100a);
     WaitForSdo(0x100a);
 
-    if (IsZombie())
-        return;
+    if (fIsZombie)
+    {
+        lout << GetNodeName() << " - InitDevice failed!" << endl;
+        return;
+    }
 
     EnableTimeout(kFALSE);
@@ -259,5 +259,4 @@
     SendSDO(0x3000, string('o', 'n'));
     WaitForSdo(0x3000);
-
 
 //    SetHome(250000);
@@ -413,5 +412,5 @@
     // or by a positioning command (POSA, ...)
     //
-    lout << "- " << GetNodeName() << ": Starting Posistion Sync Mode." << endl;
+    lout << "- " << GetNodeName() << ": Starting Position Sync Mode." << endl;
     SendSDO(0x3007, 1, string('s', 'y', 'n', 'c'));
     WaitForSdo(0x3007, 1);
@@ -547,4 +546,5 @@
 }
 
+// FIXME? Handling of fIsZombie?
 void Macs::HandleError()
 {
Index: trunk/MagicSoft/Cosy/devdrv/macs.h
===================================================================
--- trunk/MagicSoft/Cosy/devdrv/macs.h	(revision 1702)
+++ trunk/MagicSoft/Cosy/devdrv/macs.h	(revision 1703)
@@ -11,4 +11,6 @@
 private:
     BYTE_t   fMacId;
+
+    LWORD_t  fSoftVersion;
 
     LWORD_t  fVelRes;
@@ -41,5 +43,28 @@
     Bool_t HandleTimer(TTimer *t);
 
+    void Init();
+    //bool Reboot();
+
+    //bool InitDevice(Network *);
+
+    //void StartDevice();
+    void StopDevice();
+
+    void HandleSDO(WORD_t idx, BYTE_t subidx, LWORD_t val, timeval_t *tv);
+    void HandleSDOOK(WORD_t idx, BYTE_t subidx);
+    void HandleSDOError(LWORD_t data)           { NodeDrv::HandleSDOError(data); }
+
+    void HandlePDO1(BYTE_t *data, timeval_t *tv);
+    void HandlePDO2(BYTE_t *data, timeval_t *tv);
+
+    void CheckConnection();
+
 public:
+    enum
+    {
+        kNoSync = BIT(0),
+        kPosSync = BIT(1),
+        kVelSync = BIT(2)
+    };
     enum
     {
@@ -54,16 +79,4 @@
     Macs(const BYTE_t nodeid, const char *name=NULL, MLog &out=gLog);
     virtual ~Macs();
-
-    void InitDevice(Network *);
-
-    //void StartDevice();
-    void StopDevice();
-
-    void HandleSDO(WORD_t idx, BYTE_t subidx, LWORD_t val, timeval_t *tv);
-    void HandleSDOOK(WORD_t idx, BYTE_t subidx);
-    void HandleSDOError(LWORD_t data)           { NodeDrv::HandleSDOError(data); }
-
-    void HandlePDO1(BYTE_t *data, timeval_t *tv);
-    void HandlePDO2(BYTE_t *data, timeval_t *tv);
 
     void SendMsg(BYTE_t data[6]);
Index: trunk/MagicSoft/Cosy/devdrv/shaftencoder.cc
===================================================================
--- trunk/MagicSoft/Cosy/devdrv/shaftencoder.cc	(revision 1702)
+++ trunk/MagicSoft/Cosy/devdrv/shaftencoder.cc	(revision 1703)
@@ -51,5 +51,6 @@
         }
     case 0x100b:
-        lout << "Node ID: " << dec << val << endl;
+        // Do not display, this is used for CheckConnection
+        // lout << "Node ID: " << dec << val << endl;
         return;
 
@@ -94,4 +95,15 @@
 void ShaftEncoder::DisplayVal()
 {
+    if (fIsZombie)
+    {
+        fLabel[0]->SetText(new TGString(""));
+        fLabel[1]->SetText(new TGString(""));
+        fLabel[2]->SetText(new TGString(""));
+        fUpdPos = ~fPos;
+        fUpdVel = ~fVel;
+        fUpdAcc = ~fAcc;
+        return;
+    }
+
     char text[21];
 
@@ -190,8 +202,6 @@
 }
 
-void ShaftEncoder::InitDevice(Network *net)
-{
-    NodeDrv::InitDevice(net);
-
+void ShaftEncoder::Init()
+{
     //-----------------------------------------------------------------------
     //                    Start Setup of the Shaft Encoder
@@ -203,8 +213,9 @@
     lout << "- " << GetNodeName() << ": Requesting Hardware Type (0x1000)." << endl;
     RequestSDO(0x1000);
-    if (!WaitForSdo(0x1000))
-    {
-        lout << "  ... failed." << endl;
-        fIsZombie = true;
+    WaitForSdo(0x1000);
+
+    if (fIsZombie)
+    {
+        lout << GetNodeName() << " - Init failed!" << endl;
         return;
     }
@@ -265,4 +276,35 @@
 }
 
+void ShaftEncoder::CheckConnection()
+{
+    // Request Node number
+    RequestSDO(0x100b);
+    WaitForSdo(0x100b);
+}
+/*
+bool ShaftEncoder::InitDevice(Network *net)
+{
+    NodeDrv::InitDevice(net);
+
+    Init();
+
+    return !fIsZombie;
+}
+
+// --------------------------------------------------------------------------
+//
+// This should be called from a master or main thread to get a node out
+// of the Zombie-Status. 
+//
+bool ShaftEncoder::Reboot()
+{
+    fIsZombie = false;
+
+    Init();
+
+    return !fIsZombie;
+}
+*/
+
 void ShaftEncoder::ReqPos()
 {
@@ -277,10 +319,12 @@
 void ShaftEncoder::SetPreset(LWORD_t pre)
 {
+    lout << "- " << GetNodeName() << ": Setting Preset." << endl;
+
+    SendSDO(0x6003, (LWORD_t)fPos);
+    if (!WaitForSdo(0x6003))
+        return;
+
     fPos  = pre%16384;
     fTurn = pre/16384;
-
-    lout << "- " << GetNodeName() << ": Setting Preset." << endl;
-    SendSDO(0x6003, (LWORD_t)fPos);
-    WaitForSdo(0x6003);
 }
 
Index: trunk/MagicSoft/Cosy/devdrv/shaftencoder.h
===================================================================
--- trunk/MagicSoft/Cosy/devdrv/shaftencoder.h	(revision 1702)
+++ trunk/MagicSoft/Cosy/devdrv/shaftencoder.h	(revision 1703)
@@ -32,9 +32,13 @@
     void ReqPos();
 
+    void Init();
+    void CheckConnection();
+
 public:
     ShaftEncoder(const BYTE_t nodeid, const char *name=NULL, MLog &out=gLog);
     virtual ~ShaftEncoder();
 
-    void InitDevice(Network *);
+    //bool InitDevice(Network *);
+    //bool Reboot();
 
     //void StartDevice();
@@ -50,5 +54,5 @@
     void HandlePDO2(BYTE_t *data, timeval_t *tv) { HandlePDOType2(data, tv); }
 
-    LWORDS_t GetPos() { return fPos+fTurn*fTicks; }
+    LWORDS_t GetPos() { return fIsZombie ? 0 : fPos+fTurn*fTicks; } // FIXME? 0?
     LWORD_t  GetPhysRes() { return fTicks; }
 
