Index: /trunk/FACT++/Makefile.am
===================================================================
--- /trunk/FACT++/Makefile.am	(revision 11981)
+++ /trunk/FACT++/Makefile.am	(revision 11982)
@@ -38,5 +38,5 @@
 	chatclient chatserv \
 	biasctrl \
-	mcp \
+	mcp feedback \
 	fitsdump
 
@@ -269,4 +269,9 @@
     	libConfiguration.la
 
+feedback_SOURCES = src/feedback.cc src/LocalControl.h
+feedback_LDADD   = libDim.la libDim++.la  libDimExtension.la \
+		libTime.la libTools.la libStateMachine.la \
+    		libConfiguration.la
+
 
 argv_SOURCES = src/argv.cc
Index: /trunk/FACT++/Makefile.in
===================================================================
--- /trunk/FACT++/Makefile.in	(revision 11981)
+++ /trunk/FACT++/Makefile.in	(revision 11982)
@@ -52,6 +52,7 @@
 	fadctrl$(EXEEXT) fad$(EXEEXT) fscctrl$(EXEEXT) fsc$(EXEEXT) \
 	chatclient$(EXEEXT) chatserv$(EXEEXT) biasctrl$(EXEEXT) \
-	mcp$(EXEEXT) fitsdump$(EXEEXT) $(am__EXEEXT_1) $(am__EXEEXT_2) \
-	$(am__EXEEXT_3) $(am__EXEEXT_4)
+	mcp$(EXEEXT) feedback$(EXEEXT) fitsdump$(EXEEXT) \
+	$(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) \
+	$(am__EXEEXT_4)
 @HAS_GUI_TRUE@am__append_1 = fact
 @HAS_VIEWER_TRUE@am__append_2 = viewer
@@ -270,4 +271,8 @@
 fadctrl_DEPENDENCIES = libDim.la libDim++.la libDimExtension.la \
 	libTime.la libTools.la libStateMachine.la libConfiguration.la
+am_feedback_OBJECTS = src/feedback.$(OBJEXT)
+feedback_OBJECTS = $(am_feedback_OBJECTS)
+feedback_DEPENDENCIES = libDim.la libDim++.la libDimExtension.la \
+	libTime.la libTools.la libStateMachine.la libConfiguration.la
 am_fitsdump_OBJECTS = src/fitsdump.$(OBJEXT)
 fitsdump_OBJECTS = $(am_fitsdump_OBJECTS)
@@ -393,10 +398,11 @@
 	$(dimctrl_SOURCES) $(dns_SOURCES) $(drivectrl_SOURCES) \
 	$(dserver2_SOURCES) $(fact_SOURCES) $(fad_SOURCES) \
-	$(fadctrl_SOURCES) $(fitsdump_SOURCES) fitsgrep.c \
-	$(fitsloader_SOURCES) $(fsc_SOURCES) $(fscctrl_SOURCES) \
-	$(ftm_SOURCES) $(ftmctrl_SOURCES) $(log_SOURCES) \
-	$(logtime_SOURCES) $(mcp_SOURCES) $(readfits_SOURCES) sched.c \
-	$(scheduler_SOURCES) $(test_SOURCES) $(time_SOURCES) \
-	$(triggerschedule_SOURCES) $(viewer_SOURCES)
+	$(fadctrl_SOURCES) $(feedback_SOURCES) $(fitsdump_SOURCES) \
+	fitsgrep.c $(fitsloader_SOURCES) $(fsc_SOURCES) \
+	$(fscctrl_SOURCES) $(ftm_SOURCES) $(ftmctrl_SOURCES) \
+	$(log_SOURCES) $(logtime_SOURCES) $(mcp_SOURCES) \
+	$(readfits_SOURCES) sched.c $(scheduler_SOURCES) \
+	$(test_SOURCES) $(time_SOURCES) $(triggerschedule_SOURCES) \
+	$(viewer_SOURCES)
 DIST_SOURCES = $(libConfiguration_la_SOURCES) $(libDim___la_SOURCES) \
 	$(libDim_la_SOURCES) $(libDimExtension_la_SOURCES) \
@@ -408,8 +414,9 @@
 	$(drivectrl_SOURCES) $(dserver2_SOURCES) \
 	$(am__fact_SOURCES_DIST) $(fad_SOURCES) \
-	$(am__fadctrl_SOURCES_DIST) $(fitsdump_SOURCES) fitsgrep.c \
-	$(fitsloader_SOURCES) $(fsc_SOURCES) $(fscctrl_SOURCES) \
-	$(ftm_SOURCES) $(ftmctrl_SOURCES) $(log_SOURCES) \
-	$(logtime_SOURCES) $(mcp_SOURCES) $(readfits_SOURCES) sched.c \
+	$(am__fadctrl_SOURCES_DIST) $(feedback_SOURCES) \
+	$(fitsdump_SOURCES) fitsgrep.c $(fitsloader_SOURCES) \
+	$(fsc_SOURCES) $(fscctrl_SOURCES) $(ftm_SOURCES) \
+	$(ftmctrl_SOURCES) $(log_SOURCES) $(logtime_SOURCES) \
+	$(mcp_SOURCES) $(readfits_SOURCES) sched.c \
 	$(scheduler_SOURCES) $(test_SOURCES) $(time_SOURCES) \
 	$(triggerschedule_SOURCES) $(am__viewer_SOURCES_DIST)
@@ -852,4 +859,9 @@
     	libConfiguration.la
 
+feedback_SOURCES = src/feedback.cc src/LocalControl.h
+feedback_LDADD = libDim.la libDim++.la  libDimExtension.la \
+		libTime.la libTools.la libStateMachine.la \
+    		libConfiguration.la
+
 argv_SOURCES = src/argv.cc
 argv_LDADD = libConfiguration.la
@@ -1291,4 +1303,9 @@
 	@rm -f fadctrl$(EXEEXT)
 	$(AM_V_CXXLD)$(CXXLINK) $(fadctrl_OBJECTS) $(fadctrl_LDADD) $(LIBS)
+src/feedback.$(OBJEXT): src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+feedback$(EXEEXT): $(feedback_OBJECTS) $(feedback_DEPENDENCIES) 
+	@rm -f feedback$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(feedback_OBJECTS) $(feedback_LDADD) $(LIBS)
 src/fitsdump.$(OBJEXT): src/$(am__dirstamp) \
 	src/$(DEPDIR)/$(am__dirstamp)
@@ -1512,4 +1529,5 @@
 	-rm -f src/fad.$(OBJEXT)
 	-rm -f src/fadctrl.$(OBJEXT)
+	-rm -f src/feedback.$(OBJEXT)
 	-rm -f src/fitsdump.$(OBJEXT)
 	-rm -f src/fitsloader.$(OBJEXT)
@@ -1621,4 +1639,5 @@
 @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/fad.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/fadctrl.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/feedback.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/fitsdump.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/fitsloader.Po@am__quote@
Index: /trunk/FACT++/ftmctrl.rc
===================================================================
--- /trunk/FACT++/ftmctrl.rc	(revision 11981)
+++ /trunk/FACT++/ftmctrl.rc	(revision 11982)
@@ -1,2 +1,62 @@
+console=2
+
+run-type=data
+run-type=pedestal
+run-type=drs-calib
+
+sampling-frequency.default = 2000
+
+ftu-report-interval.default = 100
+
+
+[trigger]
+enable-trigger.default = yes
+enable-trigger.pedestal = no
+enable-trigger.drs-calib = no
+
+enable-external-1.default = no
+enable-external-2.default = no
+enable-veto.default = no
+enable-clock-conditioner.default = no
+
+multiplicity-physics.default = 1
+multiplicity-calib.default = 40
+coincidence-window-physics.default = 10
+coincidence-window-calib.default = 10
+dead-time.default = 25
+delay.default = 25
+time-marker-delay.default = 25
+
+#disable-patch.default = 
+#disable-pixel.default = 
+
+
+[trigger.threshold]
+
+patch.default = 150
+logic.default = 16
+
+
+[trigger.sequence]
+interval.default = 50
+pedestal.default = 0
+lp-int.default = 0
+lp-ext.default = 0
+
+
+[light-pulser.external]
+
+intensity.default = 100
+enable-group1.default = no
+enable-group2.default = no
+
+
+[light-pulser.internal]
+
+intensity.default =  10
+enable-group1.default = no
+enable-group2.default = no
+
+
 [clock-conditioner]
 frequency   = 800
@@ -36,2 +96,3 @@
 R15.4000    = 0x1400fa0f
 R15.5000    = 0x0802710f
+
Index: /trunk/FACT++/gui/MainWindow.cc
===================================================================
--- /trunk/FACT++/gui/MainWindow.cc	(revision 11981)
+++ /trunk/FACT++/gui/MainWindow.cc	(revision 11982)
@@ -575,4 +575,5 @@
 }
 
+/*
 void MainWindow::on_fBiasRequestStatus_clicked()
 {
@@ -580,9 +581,17 @@
         Dim::SendCommand("BIAS_CONTROL/REQUEST_STATUS");
 }
+*/
 
 void MainWindow::on_fBiasApplyReference_clicked()
 {
     if (!fInHandler)
-        Dim::SendCommand("BIAS_CONTROL/SET_GAPD_REFERENCE_VOLTAGE");
+        Dim::SendCommand("BIAS_CONTROL/SET_GLOBAL_GAPD_REFERENCE_VOLTAGE");
+}
+
+void MainWindow::on_fBiasApplyReferenceCh_clicked()
+{
+    if (!fInHandler)
+        Dim::SendCommand("BIAS_CONTROL/SET_CHANNEL_GAPD_REFERENCE_VOLTAGE",
+                         uint16_t(fBiasHvBoard->value()*32+fBiasHvChannel->value()));
 }
 
Index: /trunk/FACT++/gui/MainWindow.h
===================================================================
--- /trunk/FACT++/gui/MainWindow.h	(revision 11981)
+++ /trunk/FACT++/gui/MainWindow.h	(revision 11982)
@@ -172,8 +172,9 @@
     void on_fBiasCurrentMax_valueChanged(int); // FIXME: Could be set as slot in the designer
 
-    void on_fBiasRequestStatus_clicked();
+    //void on_fBiasRequestStatus_clicked();
     void on_fBiasApply_clicked();
     void on_fBiasApplyGlobal_clicked();
     void on_fBiasApplyReference_clicked();
+    void on_fBiasApplyReferenceCh_clicked();
     void on_fBiasSetToZero_clicked();
     void on_fBiasReset_clicked();
Index: /trunk/FACT++/src/RemoteControl.h
===================================================================
--- /trunk/FACT++/src/RemoteControl.h	(revision 11981)
+++ /trunk/FACT++/src/RemoteControl.h	(revision 11982)
@@ -121,4 +121,6 @@
     {
     }
+
+    //void SetReceiver(void *) { }
 
     bool PrintGeneralHelp()
Index: /trunk/FACT++/src/argv.cc
===================================================================
--- /trunk/FACT++/src/argv.cc	(revision 11981)
+++ /trunk/FACT++/src/argv.cc	(revision 11982)
@@ -4,4 +4,36 @@
 
 using namespace std;
+
+template<class T,class S>
+std::ostream &operator<<(std::ostream &out, const pair<T,S> &f)
+{
+    out << f.first << "|" << f.second;
+    return out;
+}
+template<class T, class S>
+std::istream &operator>>(std::istream &in,  pair<T,S> &f)
+{
+    char c;
+    in >> f.first;
+    in >> c;
+    if (c!=':')
+        return in;
+    in >> f.second;
+    return in;
+}
+
+typedef pair<int,int> mytype;
+
+
+//Source is OutputStreamable, meaning that an operator<< is defined
+// that takes a std::ostream or std::wostream object on the left hand side
+// and an instance of the argument type on the right.
+
+// Target is InputStreamable, meaning that an operator>> is defined that
+// takes a std::istream or std::wistream object on the left hand side and
+// an instance of the result type on the right.
+
+//Target is CopyConstructible [20.1.3].
+//Target is DefaultConstructible, meaning that it is possible to default-initialize an object of that type [8.5, 20.1.4].
 
 // --------------------------------------------------------------------------
@@ -67,4 +99,7 @@
     po::options_description config("Configuration");
     config.add_options()
+        ("xxx", vars<int>(),             "Print available commandline options.")
+        ("test.*", var<int>(),             "Print available commandline options.")
+        ("map.*",  var<int>(),             "Print available commandline options.")
         ("compression",    var<int>(),                      "set compression level")
         ("optimization",   var<int>(10, &opt),              "optimization level")
@@ -82,4 +117,5 @@
         ("switch",        po_switch(),                    "include path")
         ("bool",          var<bool>()->implicit_value(true),                    "include path")
+        ("mytype",        var<mytype>(),                  "include path")
         ;
 
@@ -170,6 +206,31 @@
     cout << "Program " << argv[0] << " started successfully." << endl;
 
+    cout << conf.Has("test.A") << " " << conf.Get<int>("test.A") << endl;
+    cout << conf.Has("test.%") << " " << conf.Get<int>("test.%") << endl;
+    cout << conf.Has("test.9") << " " << conf.Get<int>("test.9") << endl;
+    cout << conf.Has("test.data") << " " << conf.Get<int>("test.data") << endl;
+    cout << conf.Has("test.pedestal") << " " << conf.Get<int>("test.pedestal") << endl;
+    cout << conf.Has("map.1") << " " << conf.Get<int>("map.1") << endl;
+    cout << conf.Has("map.2") << " " << conf.Get<int>("map.2") << endl;
+
+    return 0;
+
     cout << conf.Has("switch") << " " << conf.Get<bool>("switch") << endl;
-    cout << conf.Has("bool") << " " << conf.Get<bool>("bool") << endl;
+    cout << conf.Has("bool")   << " " << conf.Get<bool>("bool") << endl;
+    cout << conf.Has("mytype") << " " << conf.Get<mytype>("mytype") << endl;
+
+    cout << "---" << endl;
+    cout << conf.Has("test:A") << " " << conf.Get<int>("test:A") << endl;
+    cout << conf.Has("test:%") << " " << conf.Get<int>("test:%") << endl;
+    cout << conf.Has("test:9") << " " << conf.Get<int>("test:9") << endl;
+
+/*
+    map<string, int> m = conf.GetMap<int>("test:");
+
+    cout << m["test:A"] << endl;
+    cout << m["test:%"] << endl;
+    cout << m["test:9"] << endl;
+*/
+
 
     return 0;
Index: /trunk/FACT++/src/biasctrl.cc
===================================================================
--- /trunk/FACT++/src/biasctrl.cc	(revision 11981)
+++ /trunk/FACT++/src/biasctrl.cc	(revision 11982)
@@ -955,4 +955,18 @@
     }
 
+    bool SetGapdReferenceCh(uint16_t ch)
+    {
+        if (!CheckChDac("SetGapdReferenceCh", fVoltGapd[ch], ch))
+            return false;
+
+        fVoltRef[ch] = fVoltGapd[ch];
+
+        if (!fIsRamping)
+            fIsRamping = RampOneStep();
+
+        return true;
+    }
+
+
     void SetZero()
     {
@@ -1459,4 +1473,15 @@
     }
 
+    int SetGapdReferenceCh(const EventImp &evt)
+    {
+        if (!CheckEventSize(evt.GetSize(), "SetGapdReferenceCh", 2))
+            return false;
+
+        fBias.SetGapdReferenceCh(evt.GetUShort());
+
+        return T::GetCurrentState();
+    }
+
+
     // --------------------------------------------------------------------
 
@@ -1714,7 +1739,11 @@
             ("Set a single channel a new DAC reference value. Starts ramping if necessary.");
 
-        T::AddEvent("SET_GAPD_REFERENCE_VOLTAGE", kConnected, kAtReference, kOverCurrent)
+        T::AddEvent("SET_GLOBAL_GAPD_REFERENCE_VOLTAGE", kConnected, kAtReference, kOverCurrent)
             (Wrapper(bind(&ConnectionBias::SetGapdVoltage, &fBias, 0.)))
             ("Set all channels to their G-APD reference voltage. Starts ramping if necessary.");
+
+        T::AddEvent("SET_CHANNEL_GAPD_REFERENCE_VOLTAGE", "S:1", kConnected, kAtReference, kOverCurrent)
+            (bind(&StateMachineBias::SetGapdReferenceCh, this, placeholders::_1))
+            ("Set a single channel channels to its G-APD reference voltage. Starts ramping if necessary.");
 
         T::AddEvent("SET_GAPD_REFERENCE_OFFSET", "F:1", kConnected, kAtReference, kOverCurrent)
Index: /trunk/FACT++/src/logtime.cc
===================================================================
--- /trunk/FACT++/src/logtime.cc	(revision 11981)
+++ /trunk/FACT++/src/logtime.cc	(revision 11982)
@@ -6,7 +6,9 @@
 #include <iostream>
 
+#include "DimDescriptionService.h"
+
 int main(int, const char **)
 {
-   // We could use putenv to make the Configure class change the value...
+    // We could use putenv to make the Configure class change the value...
     setenv("DIM_DNS_NODE", "localhost", 0);
 
@@ -14,6 +16,32 @@
     DimServer::start("TIME");
 
+    usleep(2000000);
+
+    DimServer::stop();
+
+    return 0;
+
     // Some info on the console
     std::cout << "Offering TIME/MESSAGE...\n" << std::endl;
+
+    short s;
+    int i;
+    long long ll;
+    float f;
+    DimDescribedService servt("TIME/TEST", "O:1;I:1;C",
+                              "This is my test command|Char[c]:This is a char|   Int This is an int|String[s]:This is a string");
+
+    DimDescribedService servs("TIME/SHORT",     s,  "[a]");
+    DimDescribedService servx("TIME/LONGLONG",  ll, "|: This is my long long");
+    DimDescribedService servi("TIME/INT",       i,  "|MyInt  [  mi  ] ");
+    DimDescribedService servf("TIME/FLOAT",     f,  "|   MyFloat  :   This is my float");
+    DimDescribedService servc("TIME/TIME", const_cast<char*>(""), "|MyTime[T]:This is my time");
+
+    DimCommand cmd("TIME/CMD", "I:2;F:2");
+
+    DimDescriptionService des("TIME/CMD", "|range[addr]:From DAC to DAC|values[DAC]:DAC values to be set");
+
+    {
+    Time t0;
 
     // Setup a DimService called TIME/MESSAGE
@@ -23,8 +51,21 @@
         // Send current time
         msg.Message(Time().GetAsStr());
+//        servx.Update();
+        /*
+        servs.updateService();
+        servi.updateService();
+        servf.updateService();
+        servc.updateService();
+         */
+        // wait approximately one second
+        usleep(100000);
 
-        // wait approximately one second
-        usleep(1000000);
+//        if (t0.UnixTime()-Time().UnixTime()<-5)
+//            break;
     }
+    }
+
+    DimDescribedService servxx("TIME/XXX", const_cast<char*>(""), "|MyTime[T]:This is my time");
+    usleep(10000000);
 
     return 0;
Index: /trunk/FACT++/src/mcp.cc
===================================================================
--- /trunk/FACT++/src/mcp.cc	(revision 11981)
+++ /trunk/FACT++/src/mcp.cc	(revision 11982)
@@ -55,4 +55,5 @@
         kStateConfiguring2,
         kStateConfiguring3,
+        kStateConfiguring4,
         kStateConfigured,
     };
@@ -271,4 +272,6 @@
     }
 
+    Time fConfigTimer;
+
     int Execute()
     {
@@ -317,4 +320,17 @@
                     return GetCurrentState();
 
+                fConfigTimer = Time();
+
+                return kStateConfiguring4;
+            }
+
+            if (GetCurrentState()==kStateConfiguring4)
+            {
+                // We need some delay to ensure that after sending the
+                // "Enable Trigger Line" command to all FADs the really
+                // have all already enabled the trigger line
+                if (Time()-fConfigTimer<boost::posix_time::milliseconds(100))
+                    return kStateConfiguring4;
+
                 Message("Starting Trigger (FTM)");
                 Dim::SendCommand("FTM_CONTROL/START_RUN");
@@ -391,4 +407,7 @@
 
         AddStateName(kStateConfiguring3, "Configuring3",
+                     ".");
+
+        AddStateName(kStateConfiguring4, "Configuring4",
                      ".");
 
