Index: trunk/FACT++/scripts/CheckUnderflow.js
===================================================================
--- trunk/FACT++/scripts/CheckUnderflow.js	(revision 16049)
+++ trunk/FACT++/scripts/CheckUnderflow.js	(revision 16050)
@@ -97,19 +97,53 @@
     v8.sleep(1000); // Let 'timeout' in SendRawData pass
 
-    var event_counter = service_event.get(10000, false).counter;
-
-    console.out("Starting drs-gain");
-    dim.send("MCP/START", 15, -1, "drs-gain");
-
-    console.out("Waiting for new event");
-
-    var d = new Date();
-    v8.timeout(10000, function() { if (service_event.get(0, false).counter>event_counter) return true; });
-    //while (service_event.get(0, false).counter<=event_counter)
-    //    v8.sleep();
-
-    console.out("Event received: "+(new Date()-d)+"ms");
-
-    dim.send("MCP/STOP");
+    console.out("Starting drs-gain... waiting for new event");
+
+    var sub_incomplete = new Subscription("FAD_CONTROL/INCOMPLETE");
+    var sub_connections = new Subscription("FAD_CONTROL/CONNECTIONS");
+    var sub_startrun = new Subscription("FAD_CONTROL/START_RUN");
+    sub_startrun.get(5000);
+    sub_connections.get(5000);
+    sub_startrun.get(5000);
+
+    include('scripts/takeRun.js');
+
+    while (1)
+    {
+        var event_counter = service_event.get(10000, false).counter;
+
+        var stop = function ()
+        {
+            while (1)
+            {
+                if (dim.state("MCP").name=="TakingData" && service_event.get(0, false).counter>event_counter)
+                {
+                    dim.send("MCP/STOP");
+                    return;
+                }
+                v8.sleep(100);
+            }
+        }
+
+        var thread = new Thread(250, stop);
+
+        var rc = takeRun("drs-gain");
+
+        thread.kill();
+
+        if (rc)
+            break;
+    }
+
+    console.out("Event received.");
+
+    sub_incomplete.close();
+    sub_connections.close();
+    sub_startrun.close();
+
+
+    // FIXME: Restore DRS calibration in case of failure!!
+    //        FAD Re-connect in case of failure?
+    //        MCP/RESET in case of failure?
+    //        Proper error reporting!
 
     var event = service_event.get(0, false);
@@ -139,6 +173,5 @@
         var now = new Date();
         v8.timeout(3000, function() { if (service_drs.get(0, false).counter>drs_counter) return true; });
-        //while (drs_counter == service_drs.get(0, false).counter)
-        //    v8.sleep();
+
         console.out("Last DRS calibration restored ["+(new Date()-now)/1000+"s]");
     }
