Index: hvcontrol/History.txt
===================================================================
--- hvcontrol/History.txt	(revision 113)
+++ hvcontrol/History.txt	(revision 126)
@@ -26,2 +26,4 @@
 24/9/2009   Program is terminated if too many errors are encountered by the
     	    monitor thread
+8/12/2009   Implemented DIM servers (currently only needs DIM_DNS_NODE
+    	    environment variable)
Index: hvcontrol/Makefile
===================================================================
--- hvcontrol/Makefile	(revision 113)
+++ hvcontrol/Makefile	(revision 126)
@@ -3,16 +3,16 @@
 #
 
-SOURCES = hvcontrol.cpp src/HV.cc src/HVConfig.cc src/HVCalib.cc src/ProcessIO.cc ../pixelmap/Pixel.cc ../pixelmap/PixelMap.cc ../drsdaq/SlowData.cc
-OBJECTS = $(addsuffix .o, $(basename $(SOURCES)))
-INCDIRS   = -I. -I./src
+SOURCES = hvcontrol.cpp src/HV.cc src/HVConfig.cc src/HVCalib.cc src/ProcessIO.cc ../pixelmap/Pixel.cc ../pixelmap/PixelMap.cc ../drsdaq/SlowData.cc ../../Evidence/Evidence.cc 
+OBJECTS = $(addsuffix .o, $(basename $(SOURCES))) 
+INCDIRS   = -I. -I./src -I../../Evidence/DIM/dim
 
-CPPFLAGS = -O3 -Wall -DOS_LINUX
-LIBS = -lstdc++ -lpthread -lfl -lreadline -ltermcap
+CPPFLAGS = -O3 -Wall -DOS_LINUX $(INCDIRS)
+LDLIBS = -lstdc++ -lpthread -lfl -lreadline -ltermcap
 
-hvcontrol: $(OBJECTS)
-	$(CC) $(CPPFLAGS) -o $@ $(OBJECTS) $(LIBS)
+hvcontrol: $(OBJECTS) ../../Evidence/DIM/linux/libdim.a
+#	$(CC) $(CPPFLAGS) -o $@ $(OBJECTS) $(LIBS)
 
 clean:
-	@rm -f $(OBJECTS) $(SOBJECTS).so
+	@rm -f $(OBJECTS)
 	@rm -f *.d
 	@rm -f *~
@@ -22,8 +22,8 @@
 # Implicit rules
 
-%.o : %.cc
-	$(CC) $(CPPFLAGS) $(INCDIRS) -c -o $@ $<
-%.o : %.cpp
-	$(CC) $(CPPFLAGS) $(INCDIRS) -c -o $@ $<
+#%.o : %.cc
+#	$(CC) $(CPPFLAGS) $(INCDIRS) -c -o $@ $<
+#%.o : %.cpp
+#	$(CC) $(CPPFLAGS) $(INCDIRS) -c -o $@ $<
 %.d :
 	@echo "Generating dependencies" $@
Index: hvcontrol/hvcontrol.cpp
===================================================================
--- hvcontrol/hvcontrol.cpp	(revision 113)
+++ hvcontrol/hvcontrol.cpp	(revision 126)
@@ -30,6 +30,7 @@
 void CCCommand(ProcessIO *);
 void HVMonitor(ProcessIO *);
-void SignalHandler(int);
+void DummyHandler(int);
 void CrashHandler(int);
+void ExitFunction();
 
 // ================
@@ -71,9 +72,8 @@
  
   // Install signal handler and set signal SIGUSR1 to interrupt blocking system calls
-  signal(SIGUSR1, &SignalHandler);
+  signal(SIGUSR1, &DummyHandler);
   siginterrupt (SIGUSR1, true);
 
-  // Install signals to assure that the lock file is deleted in case of a program crash
-  signal(SIGQUIT, &CrashHandler);
+  // Assure lock file is deleted in case of a program crash or call to exit()
   signal(SIGILL, &CrashHandler);
   signal(SIGABRT, &CrashHandler);
@@ -81,8 +81,6 @@
   signal(SIGSEGV, &CrashHandler);
   signal(SIGBUS, &CrashHandler);
-  signal(SIGTERM, &CrashHandler);
-  signal(SIGINT, &CrashHandler);
-  signal(SIGHUP, &CrashHandler);
-
+  atexit(&ExitFunction);
+  
   // Construct main instance and create mutex for thread synchronization
   ProcessIO pio(argc==3 ? argv[2] : DEFAULT_CONFIG);
@@ -91,4 +89,10 @@
     throw;
   }
+  
+  // These signals were set during construction of EvidenceServer
+  signal(SIGQUIT, &CrashHandler);  // CTRL-Backspace
+  signal(SIGINT, &CrashHandler);   // CTRL-C
+  signal(SIGHUP, &CrashHandler);  // CTRL-Backspace
+  signal(SIGTERM, &CrashHandler);
 
   // Create threads
@@ -310,5 +314,11 @@
 
 // Dummy signal handler to return from blocking syscalls
-void SignalHandler(int Signal) {
+void DummyHandler(int Signal) {
   return;          
 }
+
+// This function will be implicitly called by exit()
+void ExitFunction() {
+  remove(LOCKFILE);
+  return;          
+}
Index: hvcontrol/src/HV.cc
===================================================================
--- hvcontrol/src/HV.cc	(revision 113)
+++ hvcontrol/src/HV.cc	(revision 126)
@@ -26,5 +26,17 @@
   BoardName = DeviceName;
   
-  for (int i=0; i<NUM_CHAINS; i++) Overcurrent[i] = false;
+  // Create DIM services
+  snprintf(Buffer, sizeof(Buffer), SERVER_NAME"/NAME/ID%.2d", BoardNumber);
+  Name = new DimService (Buffer, BoardName);
+
+  for (int i=0; i<NUM_CHAINS; i++) {
+    for (int j=0; j<NUM_CHANNELS; j++) {
+      snprintf(Buffer, sizeof(Buffer), SERVER_NAME"/VOLT/ID%.2d/%.2d-%.3d", BoardNumber, i, j);
+      BiasVolt[i][j] = new DimService (Buffer, HVV[i][j]);
+      snprintf(Buffer, sizeof(Buffer), SERVER_NAME"/DAC/ID%.2d/%.2d-%.3d", BoardNumber, i, j);
+      BiasDAC[i][j] = new DimService (Buffer, HV[i][j]);
+    }
+    Overcurrent[i] = false;
+  }
   ResetButton = false;
   WrapOK = true;
@@ -74,4 +86,12 @@
     Reset();
     close(fDescriptor);
+  }
+
+  delete Name;
+  for (int i=0; i<NUM_CHAINS; i++) {
+    for (int j=0; j<NUM_CHANNELS; j++) {
+      delete BiasVolt[i][j];
+      delete BiasDAC[i][j];
+    }
   }
 }
@@ -194,4 +214,8 @@
       HV[j][k] = 0;
       HVV[j][k] = 0.0;
+      
+      // Update DIM services
+      BiasVolt[j][k]->updateService();
+      BiasDAC[j][k]->updateService();
     }
   }
Index: hvcontrol/src/HV.h
===================================================================
--- hvcontrol/src/HV.h	(revision 113)
+++ hvcontrol/src/HV.h	(revision 126)
@@ -10,4 +10,5 @@
 
 #include "HVConfig.h"
+#include "dis.hxx"
 
 #define BAUDRATE B115200
@@ -52,4 +53,8 @@
    double HVV[NUM_CHAINS][NUM_CHANNELS];  // HV value in volts
 
+   DimService *Name;
+   DimService *BiasVolt[NUM_CHAINS][NUM_CHANNELS];
+   DimService *BiasDAC[NUM_CHAINS][NUM_CHANNELS];
+
    void ClearVoltageArrays();
    int Reset();
Index: hvcontrol/src/ProcessIO.cc
===================================================================
--- hvcontrol/src/ProcessIO.cc	(revision 113)
+++ hvcontrol/src/ProcessIO.cc	(revision 126)
@@ -15,5 +15,5 @@
 
 
-ProcessIO::ProcessIO(const char *ConfigFile) {
+ProcessIO::ProcessIO(const char *ConfigFile): EvidenceServer(SERVER_NAME) {
 
   // Get program start time
@@ -268,6 +268,9 @@
 	  
 	  // Set new voltage (if DAC value, update calibrated value)
-	  if(!RampVoltage(DACValue, i, j, k)) Errors++;
-	  if(SetDac) fHVBoard[i]->HVV[j][k] = calib->DACToHV(fHVBoard[i]->HV[j][k], i, j, k);
+	  if (!RampVoltage(DACValue, i, j, k)) Errors++;
+	  if (SetDac) fHVBoard[i]->HVV[j][k] = calib->DACToHV(fHVBoard[i]->HV[j][k], i, j, k);
+
+    	  // Update DIM services
+    	  fHVBoard[i]->BiasVolt[j][k]->updateService();
 
 	} // Channels	
@@ -316,4 +319,8 @@
     	    }
 	    fHVBoard[Board]->HVV[Chain][Channel] = calib->DACToHV(fHVBoard[Board]->HV[Chain][Channel], Board, Chain, Channel);
+
+	    // Update DIM services
+    	    fHVBoard[Board]->BiasVolt[Chain][Channel]->updateService();
+
 	    if(++Channel == NUM_CHANNELS) {
 	      Chain++;
@@ -625,4 +632,8 @@
   SlowDataClass->NewEntry("Value");
   SlowDataClass->AddToEntry("%s %d %d %d %d %.2f ",fHVBoard[Board]->BoardName,Board, Chain, Channel, Target, calib->DACToHV(Target,Board,Chain,Channel));
+
+  // Update DIM service
+  fHVBoard[Board]->BiasDAC[Chain][Channel]->updateService();
+  
   return true;
 }
Index: hvcontrol/src/ProcessIO.h
===================================================================
--- hvcontrol/src/ProcessIO.h	(revision 113)
+++ hvcontrol/src/ProcessIO.h	(revision 126)
@@ -7,4 +7,7 @@
 #include <math.h>
 #include <signal.h>
+
+#define SERVER_NAME "BIAS"       // Name to use in DIM
+#include "../../Evidence/Evidence.h"
 
 #include "HVConfig.h"
@@ -22,5 +25,5 @@
 typedef enum stateenum { active, stopped, na } state_enum;
 
-class ProcessIO {
+class ProcessIO: public EvidenceServer {
 
   time_t StartTime;
