Index: trunk/MagicSoft/Cosy/main/MCosy.cc
===================================================================
--- trunk/MagicSoft/Cosy/main/MCosy.cc	(revision 1701)
+++ trunk/MagicSoft/Cosy/main/MCosy.cc	(revision 1702)
@@ -150,7 +150,7 @@
     // Get the values
     //
-    const int p0 = fZd1 ? fZd1->GetPos() : 0;
-    const int p1 = fZd2 ? fZd2->GetPos() : 0;
-    const int p2 = fAz  ? fAz->GetPos()  : 0;
+    const int p0 = !fZd1->IsZombieNode() ? fZd1->GetPos() : 0;
+    const int p1 = !fZd2->IsZombieNode() ? fZd2->GetPos() : 0;
+    const int p2 = !fAz->IsZombieNode()  ? fAz->GetPos()  : 0;
 
     const int a0 = p0; //p0>8192?p0-16384:p0;
@@ -177,5 +177,5 @@
 Bool_t MCosy::RequestRePos()
 {
-    if (!(fMac1 && fMac2))
+    if (fMac1->IsZombieNode() || fMac2->IsZombieNode())
         return kTRUE;
 
@@ -192,5 +192,5 @@
 
     //
-    // If waitng was not interrupted everything is ok. return.
+    // If waiting was not interrupted everything is ok. return.
     //
     if (!StopWaitingForSDO())
@@ -216,5 +216,5 @@
 ZdAz MCosy::GetRePos()
 {
-    return fMac1 && fMac2 ? ZdAz(fMac2->GetPos(), fMac1->GetPos()) : ZdAz(0,0);
+    return !fMac1->IsZombieNode() && !fMac2->IsZombieNode() ? ZdAz(fMac2->GetPos(), fMac1->GetPos()) : ZdAz(0,0);
 }
 
@@ -304,5 +304,5 @@
 int MCosy::StopWaitingForSDO() const
 {
-    return Break() || HasError();
+    return Break() || HasError() || HasZombie();
 }
 
@@ -346,5 +346,5 @@
 
     //
-    // No try to handle the error.
+    // Now try to handle the error.
     //
     fMac1->HandleError();
@@ -378,7 +378,7 @@
     // FIXME: Correct by fOffset ?
 
-    if (!(fMac1 && fMac2))
+    if (fMac1->IsZombieNode() || fMac2->IsZombieNode())
     {
-        cout << "SetPosition: No MACS!" << endl;
+        cout << "SetPosition: No connection to at least one of the MACS!" << endl;
         return TRUE;
     }
@@ -515,5 +515,5 @@
 void MCosy::InitTracking()
 {
-    if (!(fMac1 && fMac2))
+    if (fMac1->IsZombieNode() || fMac2->IsZombieNode())
         return;
 
@@ -656,5 +656,5 @@
     fRaDec = dst;
 
-    if (!(fMac1 && fMac2))
+    if (fMac1->IsZombieNode() || fMac2->IsZombieNode())
         return;
 
@@ -774,6 +774,7 @@
 void MCosy::StopMovement()
 {
-    if (!fMac1 || !fMac2)
+    if (fMac1->IsZombieNode() || fMac2->IsZombieNode())
         return;
+
     //
     // Set status to Stopping
@@ -810,4 +811,12 @@
 void *MCosy::Proc(int msg, void *mp)
 {
+    lout << "Checking for Zombies" << endl;
+    if (HasZombie())
+    {
+        lout << "Found Zombies" << endl;
+        if (!RebootZombies())
+            return (void*)0xebb0;
+    }
+
     switch (msg)
     {
@@ -823,7 +832,7 @@
     case WM_PRESET:
         cout << "WM_Preset: start." << endl;
-        if (fZd1) fZd1->SetPreset();
-        if (fZd2) fZd2->SetPreset();
-        if (fAz)  fAz->SetPreset();
+        if (!fZd1->IsZombieNode()) fZd1->SetPreset();
+        if (!fZd2->IsZombieNode()) fZd2->SetPreset();
+        if (!fAz->IsZombieNode())  fAz->SetPreset();
         cout << "WM_Preset: done. (return 0xaffe)" << endl;
         return (void*)0xaffe;
@@ -849,9 +858,9 @@
             cout << "Got  Zd: " << sepos.Zd() << " Az: " << sepos.Az() << endl;
 
-            if (fZd1)
+            if (!fZd1->IsZombieNode())
                 fZd1->SetPreset(za.Zd());
-            if(fZd2)
+            if (!fZd2->IsZombieNode())
                 fZd2->SetPreset(-za.Zd());
-            if(fAz)
+            if (!fAz->IsZombieNode())
                 fAz->SetPreset(za.Az());
 
@@ -924,9 +933,10 @@
     case WM_HOME:
         cout << "WM_Home: START" << endl;
-        if (fMac1 && fMac2)
+        if (!fMac1->IsZombieNode() && !fMac2->IsZombieNode())
         {
             cout << "Going Home..." << endl;
-            fMac1->SetHome(250000, 100);
-            fMac2->SetHome(250000, 100);
+            TEnv env(".cosyrc");
+            fMac1->SetHome(250000, env.GetValue("Az_MaxTime2ReachHome[s]", 100));
+            fMac2->SetHome(250000, env.GetValue("Zd_MaxTime2ReachHome[s]", 100));
 
             fAz->SetPreset();
@@ -991,8 +1001,8 @@
 
     Double_t resreaz = 0;
-    if (fMac1)
+    if (!fMac1->IsZombieNode())
         resreaz = fMac1->GetRes();
     else
-        if (fMac3)
+        if (!fMac3->IsZombieNode())
             resreaz = fMac3->GetRes();
         else
@@ -1000,5 +1010,5 @@
 
     Double_t resrezd = 0;
-    if (fMac2)
+    if (!fMac2->IsZombieNode())
         resrezd = fMac2->GetRes();
     else
@@ -1006,8 +1016,8 @@
  
     Double_t ressezd = 0;
-    if (fZd1)
+    if (!fZd1->IsZombieNode())
         ressezd = fZd1->GetPhysRes();
     else
-        if (fZd2)
+        if (!fZd2->IsZombieNode())
             ressezd = fZd2->GetPhysRes();
         else
@@ -1015,5 +1025,5 @@
 
     Double_t resseaz = 0;
-    if (fAz)
+    if (!fAz->IsZombieNode())
         resseaz = fAz->GetPhysRes();
     else
@@ -1024,13 +1034,13 @@
     cout << "done." << endl;
 
-    cout << "Setting Gear Ratios:" << endl;
-    cout << "--------------------" << endl;
-    cout << " X: " << gzd << "*" << resrezd << "/" << ressezd << "=" << kGearRatio.X() << endl;
-    cout << " Y: " << gaz << "*" << resreaz << "/" << resseaz << "=" << kGearRatio.Y() << endl;
+    cout << " * Setting Gear Ratios:" << endl;
+    cout << "   --------------------" << endl;
+    cout << " *  X: " << gzd << "*" << resrezd << "/" << ressezd << "=" << kGearRatio.X() << endl;
+    cout << " *  Y: " << gaz << "*" << resreaz << "/" << resseaz << "=" << kGearRatio.Y() << endl;
 }
 
 void MCosy::TalkThread()
 {
-    if (!(fMac1 && fMac2))
+    if (fMac1->IsZombieNode() || fMac2->IsZombieNode())
         return;
 
@@ -1048,8 +1058,5 @@
     }
 
-    //fMac1->EnableTimeout(kTRUE, 500);
-    //fMac2->EnableTimeout(kTRUE, 500);
-
-    if (!(fZd1 && fZd2 && fAz))
+    if (fZd1->IsZombieNode() || fZd2->IsZombieNode() || fAz->IsZombieNode())
         return;
 
@@ -1058,7 +1065,7 @@
     // Start the Network
     //
-    cout << "Reading configuration file..." << flush;
-    TEnv env(".cosyrc");
-    cout << "done." << endl;
+    //cout << "Reading configuration file..." << flush;
+    //TEnv env(".cosyrc");
+    //cout << "done." << endl;
 /*
     const int res = fMac3->GetVelRes();
@@ -1067,10 +1074,4 @@
     fMac3->SetAcceleration(res);
     fMac3->SetDeceleration(res);
-
-    cout << "Going Home..." << endl;
-    fMac1->SetHome(250000, env.GetValue("Az_MaxTime2ReachHome[s]", 100));
-    fMac2->SetHome(250000, env.GetValue("Zd_MaxTime2ReachHome[s]", 100));
-    PostMsg(WM_PRESET, 0, 0);
-    PostMsg(WM_WAIT,   0, 0);
 
     fMac1->ReqPos();
@@ -1098,36 +1099,7 @@
     fMac2->EnableTimeout(kTRUE, 500);
 
-    const Double_t gaz = env.GetValue("Az_GearRatio[U_mot/U_tel]");
-    const Double_t gzd = env.GetValue("Zd_GearRatio[U_mot/U_tel]");
-
-    const Double_t resreaz = env.GetValue("Az_ResRE[re/U_mot]");
-    const Double_t resrezd = env.GetValue("Zd_ResRE[re/U_mot]");
-
-    kGearRatio.Set (gzd*resrezd/RES_SE, gaz*resreaz/RES_SE);   //[re/se]
-    kGearRatio2.Set(gzd*resrezd/360.0,  gaz*resreaz/360.0);    //[re/deg]
-
     //fMac2->SetNegEndswitch(Deg2ZdRE(env.GetValue("MinZd[Deg]", -1.0)));
     //fMac2->SetPosEndswitch(Deg2ZdRE(env.GetValue("MaxZd[Deg]", +1.0)));
     //    fMac3->StartVelSync();
-
-    //cout << "PostMsg(WM_PRESET)" << endl;
-    //void *rc =
-    //cout << hex << "WM_PRESET: ret=" << rc << endl;
-
-    //RaDec dest = RaDec(45.0, 30.0)*D2PI/360.0;
-
-    //cout << "PostMsg(WM_TRACK)" << endl;
-    //cout << sizeof(RaDec) << "==" << sizeof(dest) << endl;
-    //rc=PostMsg(WM_TRACK, &dest, sizeof(dest));
-    //cout << "DEST killed." << endl;
-
-    // AltAz dest = AltAz(45.0, 30.0);
-    // double ra, dec;
-    // slaDaf2r( 71, 0, 0, &ra,  &status); // 0 WARNING: RANGE
-    // slaDaf2r( 89, 0, 0, &dec, &status); // 49
-    // cout << "Start tracking: Ra: " << Rad2Deg(ra) << kDEG << "  Dec: " << Rad2Deg(dec) << kDEG << endl;
-
-    // dest = AltAz(-46.0, 210);
-    // SetPosition(dest);
     */
     SlaStars sla;
@@ -1255,14 +1227,28 @@
     // Update Gui, foremer MTGui.
     //
-    if (fZd1) fZd1->DisplayVal();
-    if (fZd2) fZd2->DisplayVal();
-    if (fAz)  fAz->DisplayVal();
+    if (!fZd1->IsZombieNode()) fZd1->DisplayVal();
+    if (!fZd2->IsZombieNode()) fZd2->DisplayVal();
+    if (!fAz->IsZombieNode())  fAz->DisplayVal();
 
     ZdAz seist = GetSePos()*2*TMath::Pi()/16384; // [se]
     ZdAz bendist = fBending.CorrectBack(seist);
 
+    Byte_t avail = 0;
+
+    avail |= !fMac1->IsZombieNode() ? 0x01 : 0;
+    avail |= !fMac2->IsZombieNode() ? 0x02 : 0;
+    avail |= !fMac3->IsZombieNode() ? 0x04 : 0;
+    avail |= !fZd1->IsZombieNode()  ? 0x08 : 0;
+    avail |= !fZd2->IsZombieNode()  ? 0x10 : 0;
+    avail |= !fAz->IsZombieNode()   ? 0x20 : 0;
+
     fWin->Update(bendist*(360.0/2/TMath::Pi()), fTrackingError/kGearRatio2,
-                 fVelocity, fOffset/*/kGearRatio2*/, fRaDec, fZdAzSoll,
-                 fStatus);
+                 fVelocity, fOffset, fRaDec, fZdAzSoll, fStatus, avail);
+
+    /*
+     cout << (int)(fMac1->GetStatus()&Macs::kOutOfControl) << " ";
+     cout << (int)(fMac2->GetStatus()&Macs::kOutOfControl) << " ";
+     cout << (int)(fMac3->GetStatus()&Macs::kOutOfControl) << endl;
+     */
 
     return kTRUE;
@@ -1282,5 +1268,5 @@
     // Don't call this function twice!
     Network::Start();
-
+/*
     if (fMac1)
         if (fMac1->IsZombieNode()) { delete fMac1; fMac1=NULL; }
@@ -1289,16 +1275,16 @@
     if (fMac3)
         if (fMac3->IsZombieNode()) { delete fMac3; fMac3=NULL; }
-
-    if (fZd1)
+*/
+/*    if (fZd1)
         if (fZd1->IsZombieNode())  { delete fZd1;  fZd1=NULL; }
-        else fZd1->SetDisplay(fWin->GetLabel2());
-
-    if (fZd2)
+        else */fZd1->SetDisplay(fWin->GetLabel2());
+
+/*    if (fZd2)
         if (fZd2->IsZombieNode())  { delete fZd2;  fZd2=NULL; }
-        else fZd2->SetDisplay(fWin->GetLabel3());
-
-    if (fAz)
+        else */fZd2->SetDisplay(fWin->GetLabel3());
+
+/*    if (fAz)
         if (fAz->IsZombieNode())   { delete fAz;   fAz=NULL; }
-        else fAz->SetDisplay(fWin->GetLabel1());
+        else */fAz->SetDisplay(fWin->GetLabel1());
 
     ReadConfig();
@@ -1345,6 +1331,6 @@
     lout << "- Setting up network." << endl;
 
-    fMac1=new Macs(id1, "Mac/Az",      lout);
-    fMac2=new Macs(id3, "Mac/Zd",      lout);
+    fMac1=new Macs(id1, "Mac/Az", lout);
+    fMac2=new Macs(id3, "Mac/Zd", lout);
     if (id2>=0)
         fMac3=new Macs(id2, "Mac/Az-Sync", lout);
