Index: trunk/FACT++/scripts/Main.js
===================================================================
--- trunk/FACT++/scripts/Main.js	(revision 17168)
+++ trunk/FACT++/scripts/Main.js	(revision 17174)
@@ -221,15 +221,12 @@
         return;
 
-    this.ok = cnt==0;
-
-    console.out("  DeltaUov=%.3f [N(>0.033V)=%d]".$(avg, cnt));
-}
-
-// DN:  Why is voltageOff() implemented as 
-//      a method of a Subscription to a specific Service
-//      I naively would think of voltageOff() as an unbound function.
-//      I seems to me it has to be a method of a Subscription object, in order
-//      to use the update counting method. But does it have to be
-//      a Subscription to FEEDBACK/DEVIATION, or could it work with other services as well?
+
+    this.ok = cnt==0 || (this.last!=undefined && Math.abs(this.last-avg)<0.002);
+
+    console.out("  DeltaUov=%.3f (%.3f) [N(>0.033V)=%d]".$(avg, Math.abs(this.last-avg), cnt));
+
+    this.last = avg;
+}
+
 service_feedback.voltageOff = function()
 {
@@ -247,6 +244,4 @@
     {
         dim.log("Switching voltage off.");
-
-        this.ok = undefined;
 
         // Supress the possibility that the bias control is
@@ -260,5 +255,5 @@
     }
 
-    dim.wait("BIAS_CONTROL", "VoltageOff", 60000);
+    dim.wait("BIAS_CONTROL", "VoltageOff", 60000); // FIXME: 30000?
 
     // FEEDBACK stays in CurrentCtrl when Voltage is off but output enabled
@@ -305,8 +300,8 @@
 
     // Wait until voltage on
-    dim.wait("BIAS_CONTROL", "VoltageOn", 60000);
-
-    if (isOff)
-        this.ok = false;
+    dim.wait("BIAS_CONTROL", "VoltageOn", 60000); // FIXME: 30000?
+
+//    if (isOff)
+//        this.ok = false;
 }
 
@@ -324,5 +319,8 @@
     var now = new Date();
 
-    v8.timeout(60000, func, this);
+    this.last = undefined;
+    this.ok = false;
+    v8.timeout(4*60000, func, this); // FIMXE: Remove 4!
+    this.ok = undefined;
 
     if (irq)
@@ -330,6 +328,4 @@
     else
         dim.log("Voltage stable within limits");
-
-    this.ok = undefined;
 }
 
@@ -378,9 +374,10 @@
     //dim.send("FEEDBACK/STOP");
     dim.send("FTM_CONTROL/STOP_TRIGGER");
+
+    dim.wait("FTM_CONTROL",  "Valid",        3000);
+    dim.wait("FEEDBACK",     "Calibrated",   3000);
+
     dim.send("BIAS_CONTROL/DISCONNECT");
-
-    dim.wait("FTM_CONTROL",  "Valid",        3000);
     dim.wait("BIAS_CONTROL", "Disconnected", 3000);
-    dim.wait("FEEDBACK",     "Calibrated",   3000);
 
     var report = sub.get();
@@ -806,6 +803,54 @@
         while (!irq && !takeRun("single-pe", 10000));
 
+        /*
+        // =================== new feedback ======================
+        dim.log("Switching to new bias calibration and feedback.");
+        dim.send("BIAS_CONTROL/EXPERT_MODE", true);
+        dim.wait("BIAS_CONTROL", "ExpertMode", 3000);
+        dim.send("BIAS_CONTROL/EXPERT_LOAD_MAP_FILE", "/home/fact/operation/GAPDmap_with_spare_module-new2.txt");
+        dim.send("BIAS_CONTROL/EXPERT_MODE", false);
+        dim.wait("BIAS_CONTROL", "VoltageOn", 3000);
+        dim.send("FEEDBACK/STOP");
+        dim.wait("FEEDBACK", "Calibrated", 3000);
+        dim.send("FEEDBACK/ENABLE_OLD_ALGORITHM", false);
+        dim.send("FEEDBACK/START", 1.1);
+        dim.wait("FEEDBACK", "InProgress", 45000);
+        service_feedback.voltageOn();
+        service_feedback.waitForVoltageOn();
+
+        v8.sleep(60000);
+        dim.log("Taking single p.e. run.");
+        while (!irq && !takeRun("single-pe", 10000));
+
+        dim.send("FEEDBACK/STOP");
+        dim.wait("FEEDBACK", "Calibrated", 3000);
+        dim.send("FEEDBACK/ENABLE_TEMP_OFFSETS", true);
+        dim.send("FEEDBACK/START", 1.1);
+        dim.wait("FEEDBACK", "InProgress", 45000);
+        service_feedback.voltageOn();
+        service_feedback.waitForVoltageOn();
+
+        v8.sleep(60000);
+        dim.log("Taking single p.e. run.");
+        while (!irq && !takeRun("single-pe", 10000));
+        */
+        // =======================================================
+
         // It is unclear what comes next, so we better switch off the voltage
         service_feedback.voltageOff();
+
+        /*
+        // =============== Switch back to old feedback =============
+        dim.log("Switching to old bias calibration and feedback.");
+        dim.send("BIAS_CONTROL/EXPERT_MODE", true);
+        dim.wait("BIAS_CONTROL", "ExpertMode", 3000);
+        dim.send("BIAS_CONTROL/EXPERT_LOAD_MAP_FILE", "/home/fact/operation/GAPDmap_with_spare_module-new.txt");
+        dim.send("BIAS_CONTROL/EXPERT_MODE", false);
+        dim.wait("BIAS_CONTROL", "VoltageOff", 3000);
+        dim.send("FEEDBACK/ENABLE_OLD_ALGORITHM", true);
+        dim.send("FEEDBACK/ENABLE_TEMP_OFFSETS", false);
+        // =========================================================
+        */
+
         system_on = true;
         dim.log("Task finished [STARTUP]");
@@ -909,5 +954,163 @@
         console.out("");
         break; // case "RATESCAN"
-
+/*
+    case "FEEDBACK-TEST":
+        // ----------------- Enable new feedback ---------------
+        service_feedback.voltageOff();
+        dim.log("Switching to new bias calibration and feedback.");
+        dim.send("BIAS_CONTROL/EXPERT_MODE", true);
+        dim.wait("BIAS_CONTROL", "ExpertMode", 3000);
+        dim.send("BIAS_CONTROL/EXPERT_LOAD_MAP_FILE", "/home/fact/operation/GAPDmap_with_spare_module-new2.txt");
+        dim.send("BIAS_CONTROL/EXPERT_MODE", false);
+        dim.wait("BIAS_CONTROL", "VoltageOff", 3000);
+        dim.send("FEEDBACK/ENABLE_OLD_ALGORITHM", false);
+
+        // ---------------- Take single pe run ------------------
+        CloseLid();
+        doDrsCalibration("singlepe");  // will turn voltage off
+        service_feedback.voltageOn();
+        service_feedback.waitForVoltageOn();
+        v8.sleep(15000);
+        dim.log("Taking single p.e. run.");
+        while (!irq && !takeRun("single-pe", 10000));
+
+        dim.send("FEEDBACK/STOP");
+        dim.wait("FEEDBACK", "Calibrated", 3000);
+        dim.send("FEEDBACK/ENABLE_TEMP_OFFSETS", true);
+        dim.send("FEEDBACK/START", 1.1);
+        dim.wait("FEEDBACK", "InProgress", 45000);
+        service_feedback.voltageOn();
+        service_feedback.waitForVoltageOn();
+        v8.sleep(15000);
+        dim.log("Taking single p.e. run.");
+        while (!irq && !takeRun("single-pe", 10000));
+
+        // ------------------ Ratescan --------------------------
+        var tm1 = new Date();
+
+        // This is a workaround to make sure that we really catch
+        // the new OnTrack state later and not the old one
+        dim.send("DRIVE_CONTROL/STOP");
+        dim.wait("DRIVE_CONTROL", "Armed", 15000);
+
+        // The lid must be open
+        OpenLid();
+
+        // The voltage must be switched on
+        service_feedback.voltageOn();
+
+        if (obs.source != undefined)
+        {
+            dim.log("Pointing telescope to '"+obs[cub].source+"'.");
+            dim.send("DRIVE_CONTROL/TRACK_ON", obs[sub].source);
+        }
+        else
+        {
+            dim.log("Pointing telescope to ra="+obs[sub].ra+" dec="+obs[sub].dec);
+            dim.send("DRIVE_CONTROL/TRACK", obs[sub].ra, obs[sub].dec);
+        }
+
+        dim.wait("DRIVE_CONTROL", "OnTrack", 150000); // 110s for turning and 30s for stabilizing
+
+        service_feedback.waitForVoltageOn();
+
+        var tm2 = new Date();
+
+        dim.log("Starting ratescan.");
+
+        // Start rate scan
+        dim.send("RATE_SCAN/START_THRESHOLD_SCAN", 50, 1000, -10);
+
+        // Lets wait if the ratescan really starts... this might take a few
+        // seconds because RATE_SCAN configures the ftm and is waiting for
+        // it to be configured.
+        dim.wait("RATE_SCAN", "InProgress", 10000);
+        dim.wait("RATE_SCAN", "Connected", 2700000);
+
+        // this line is actually some kind of hack. 
+        // after the Ratescan, no data is written to disk. I don't know why, but it happens all the time
+        // So I decided to put this line here as a kind of patchwork....
+        //dim.send("FAD_CONTROL/SET_FILE_FORMAT", 2);
+
+        dim.log("Ratescan done [%.1fs, %.1fs]".$((tm2-tm1)/1000, (new Date()-tm2)/1000));
+
+        // ------------------ Switch back --------------------------
+
+        dim.send("BIAS_CONTROL/EXPERT_MODE", true);
+        dim.wait("BIAS_CONTROL", "ExpertMode", 3000);
+        dim.send("BIAS_CONTROL/EXPERT_LOAD_MAP_FILE", "/home/fact/operation/GAPDmap_with_spare_module-new.txt");
+        dim.send("BIAS_CONTROL/EXPERT_MODE", false);
+        dim.wait("BIAS_CONTROL", "VoltageOn", 3000);
+        dim.send("FEEDBACK/STOP");
+        dim.wait("FEEDBACK", "Calibrated", 3000);
+        dim.send("FEEDBACK/ENABLE_OLD_ALGORITHM", true);
+        dim.send("FEEDBACK/ENABLE_TEMP_OFFSETS", false);
+        dim.send("FEEDBACK/START", 1.1);
+        dim.wait("FEEDBACK", "InProgress", 60000);
+
+        dim.log("Starting ratescan.");
+
+        // Start rate scan
+        dim.send("RATE_SCAN/START_THRESHOLD_SCAN", 50, 1000, -10);
+
+        // Lets wait if the ratescan really starts... this might take a few
+        // seconds because RATE_SCAN configures the ftm and is waiting for
+        // it to be configured.
+        dim.wait("RATE_SCAN", "InProgress", 10000);
+        dim.wait("RATE_SCAN", "Connected", 2700000);
+
+        // this line is actually some kind of hack. 
+        // after the Ratescan, no data is written to disk. I don't know why, but it happens all the time
+        // So I decided to put this line here as a kind of patchwork....
+        //dim.send("FAD_CONTROL/SET_FILE_FORMAT", 2);
+
+        dim.log("Ratescan done [%.1fs, %.1fs]".$((tm2-tm1)/1000, (new Date()-tm2)/1000));
+
+        dim.log("Task finished [FEEDBACK-TEST]");
+        console.out("");
+        break;
+
+    case "SINGLEPE-TEST":
+        // ----------------- Enable new feedback ---------------
+        service_feedback.voltageOff();
+        dim.log("Switching to new bias calibration and feedback.");
+        dim.send("BIAS_CONTROL/EXPERT_MODE", true);
+        dim.wait("BIAS_CONTROL", "ExpertMode", 3000);
+        dim.send("BIAS_CONTROL/EXPERT_LOAD_MAP_FILE", "/home/fact/operation/GAPDmap_with_spare_module-new2.txt");
+        dim.send("BIAS_CONTROL/EXPERT_MODE", false);
+        dim.wait("BIAS_CONTROL", "VoltageOff", 3000);
+        dim.send("FEEDBACK/ENABLE_OLD_ALGORITHM", false);
+
+        // ---------------- Take single pe run ------------------
+        CloseLid();
+        doDrsCalibration("singlepe");  // will turn voltage off
+        dim.send("FEEDBACK/STOP");
+        dim.wait("FEEDBACK", "Calibrated", 3000);
+        dim.send("FEEDBACK/ENABLE_TEMP_OFFSETS", true);
+        dim.send("FEEDBACK/START", 1.1);
+        dim.wait("FEEDBACK", "InProgress", 45000);
+        service_feedback.voltageOn();
+        service_feedback.waitForVoltageOn();
+        v8.sleep(15000);
+        dim.log("Taking single p.e. run.");
+        while (!irq && !takeRun("single-pe", 10000));
+
+        // ------------------ Switch back --------------------------
+        dim.send("BIAS_CONTROL/EXPERT_MODE", true);
+        dim.wait("BIAS_CONTROL", "ExpertMode", 3000);
+        dim.send("BIAS_CONTROL/EXPERT_LOAD_MAP_FILE", "/home/fact/operation/GAPDmap_with_spare_module-new.txt");
+        dim.send("BIAS_CONTROL/EXPERT_MODE", false);
+        dim.wait("BIAS_CONTROL", "VoltageOn", 3000);
+        dim.send("FEEDBACK/STOP");
+        dim.wait("FEEDBACK", "Calibrated", 3000);
+        dim.send("FEEDBACK/ENABLE_OLD_ALGORITHM", true);
+        dim.send("FEEDBACK/ENABLE_TEMP_OFFSETS", false);
+        dim.send("FEEDBACK/START", 1.1);
+        dim.wait("FEEDBACK", "InProgress", 60000);
+
+        dim.log("Task finished [SINGLEPE-TEST]");
+        console.out("");
+        break;
+*/
 
     case "DATA":
Index: trunk/FACT++/scripts/Observation_class.js
===================================================================
--- trunk/FACT++/scripts/Observation_class.js	(revision 17168)
+++ trunk/FACT++/scripts/Observation_class.js	(revision 17174)
@@ -58,5 +58,5 @@
         case 'DATA':
             if (i!=obj.measurements.length-1)
-                throw new Error("DATA must be the last in the list of measurements");
+                throw new Error("DATA [n="+i+", "+utc.toUTCString()+"] must be the last in the list of measurements [cnt="+obj.measurements.length+"]");
             if (ret[i].source == undefined)
                 throw new Error("Observation must have either 'source' or 'task' " +
@@ -79,5 +79,12 @@
                                 "if 'task' == 'ratescan'");
             break;
-
+       /*
+        case 'FEEDBACK-TEST':
+            if (ret[i].source == undefined && (ret[i].ra == undefined || ret[i].dec == undefined))
+                throw new Error("Observation must have either 'source' or 'ra' & 'dec' " +
+                                "if 'task' == 'ratescan'");
+            break;
+        */
+        //case 'SINGLEPE-TEST':
         case 'SINGLEPE':
         case 'DRSCALIB':
Index: trunk/FACT++/scripts/Startup.js
===================================================================
--- trunk/FACT++/scripts/Startup.js	(revision 17168)
+++ trunk/FACT++/scripts/Startup.js	(revision 17174)
@@ -218,5 +218,5 @@
 {
     dim.send("BIAS_CONTROL/SET_ZERO_VOLTAGE");
-    dim.wait("BIAS_CONTROL", "VoltageOff", 15000);
+    dim.wait("BIAS_CONTROL", "VoltageOff", 30000); // waS: 15000
 
     var now = new Date();
@@ -227,10 +227,10 @@
 
     console.out("Wait for calibration to end");
-    dim.wait("FEEDBACK", "Calibrated", 60000);
+    dim.wait("FEEDBACK", "Calibrated", 90000);
 
     console.out("Calibration finished ["+(new Date()-now)+"ms]");
 
     console.out("Wait for voltage to be off");
-    dim.wait("BIAS_CONTROL", "VoltageOff", 5000);
+    dim.wait("BIAS_CONTROL", "VoltageOff", 30000); // was: 15000
 }
 
@@ -261,8 +261,11 @@
 // ================================================================
 
-dim.send("BIAS_CONTROL/SET_EXPERT_MODE", true);
+dim.log("Switching to old bias calibration and feedback.");
+dim.send("BIAS_CONTROL/EXPERT_MODE", true);
 dim.send("BIAS_CONTROL/EXPERT_LOAD_MAP_FILE", "/home/fact/operation/GAPDmap_with_spare_module-new.txt");
-dim.send("BIAS_CONTROL/SET_EXPERT_MODE", false);
-dim.send("FEEDBACK/ENABLE_OLD_ALGORITHM", false);
+dim.send("BIAS_CONTROL/EXPERT_MODE", false);
+dim.send("FEEDBACK/ENABLE_OLD_ALGORITHM", true);
+dim.send("FEEDBACK/ENABLE_TEMP_OFFSETS", false);
+v8.sleep(3000);
 
 // ================================================================
@@ -283,5 +286,5 @@
  [ "PWR_CONTROL",     [ "SystemOn"                        ] ],
  [ "AGILENT_CONTROL", [ "VoltageOn"                       ] ],
- [ "BIAS_CONTROL",    [ "VoltageOn", "VoltageOff"         ] ],
+ [ "BIAS_CONTROL",    [ "VoltageOff"                      ] ],
  [ "FEEDBACK",        [ "Calibrated"                      ] ],
  [ "RATE_SCAN",       [ "Connected"                       ] ],
Index: trunk/FACT++/scripts/getSchedule.js
===================================================================
--- trunk/FACT++/scripts/getSchedule.js	(revision 17168)
+++ trunk/FACT++/scripts/getSchedule.js	(revision 17174)
@@ -3,6 +3,6 @@
 function getSchedule()
 {
-    // List of all available measurement types
-    var measurementType = [ "STARTUP", "IDLE", "DRSCALIB", "SINGLEPE", "DATA", "RATESCAN", "SHUTDOWN" ];
+    // List of all available measurement types (see also Observation_class.js)
+    var measurementType = [ "STARTUP", "IDLE", "DRSCALIB", "SINGLEPE", "DATA", "RATESCAN", "SHUTDOWN"/*, "FEEDBACK-TEST", "SINGLEPE-TEST"*/ ];
 
     // Get current time
