Index: hvcontrol/HV.conf
===================================================================
--- hvcontrol/HV.conf	(revision 35)
+++ hvcontrol/HV.conf	(revision 39)
@@ -1,3 +1,3 @@
-# Main configuration file for the HV control program V1.0, 2009 04 23, 17:13:36
+# Main configuration file for the HV control program V1.0, 2009 05 13, 11:37:07
 # Note: this file will be updated at program exit
 
Index: hvcontrol/Makefile
===================================================================
--- hvcontrol/Makefile	(revision 35)
+++ hvcontrol/Makefile	(revision 39)
@@ -3,5 +3,5 @@
 #
 
-SOURCES = hvcontrol.cpp src/CCCommand.cc src/ConsoleCommand.cc src/HV.cc src/HVConfig.cc src/HVCalib.cc src/HVMonitor.cc src/HVStatus.cc src/Log.cc src/ProcessIO.cc src/ReadCard.cc src/Utilities.cc ../../fact_repos.svn/pixelmap/Pixel.cc ../../fact_repos.svn/pixelmap/PixelMap.cc
+SOURCES = hvcontrol.cpp src/CCCommand.cc src/ConsoleCommand.cc src/HV.cc src/HVConfig.cc src/HVCalib.cc src/HVMonitor.cc src/HVStatus.cc src/Log.cc src/ProcessIO.cc src/ReadCard.cc src/Utilities.cc ../fact_repos.svn/pixelmap/Pixel.cc ../fact_repos.svn/pixelmap/PixelMap.cc
 
 OBJECTS = $(addsuffix .o, $(basename $(SOURCES)))
Index: hvcontrol/src/CCCommand.cc
===================================================================
--- hvcontrol/src/CCCommand.cc	(revision 35)
+++ hvcontrol/src/CCCommand.cc	(revision 39)
@@ -29,5 +29,12 @@
     return;
   }
- 
+
+// Allows immediate reuse of socket after closing (circumvents TIME_WAIT)
+  int Value=1;
+  if (setsockopt(ServerSocket, SOL_SOCKET, SO_REUSEADDR, (char *) &Value, sizeof (Value)) == -1) {
+    sprintf(str,"Warning: Could not set server socket option SO_REUSEADDR (%s).\n",strerror(errno));
+    m->PrintMessage(str);
+  }
+
   SocketAddress.sin_family = PF_INET;
   SocketAddress.sin_port = htons((unsigned short) m->config->fCCPort);
Index: hvcontrol/src/HVStatus.cc
===================================================================
--- hvcontrol/src/HVStatus.cc	(revision 35)
+++ hvcontrol/src/HVStatus.cc	(revision 39)
@@ -53,6 +53,8 @@
       status->OC[i][j]   = FALSE;
 
-      for (int k=0;k<MAX_NUM_CHANNELS;k++)
+      for (int k=0;k<MAX_NUM_CHANNELS;k++){
 	status->HV[i][j][k] = 0;
+	status->HVV[i][j][k] = 0.0;
+      }
     }
   }
Index: hvcontrol/src/HVStatus.h
===================================================================
--- hvcontrol/src/HVStatus.h	(revision 35)
+++ hvcontrol/src/HVStatus.h	(revision 39)
@@ -50,5 +50,6 @@
   
   unsigned int VRef[MAX_NUM_HVBOARDS][MAX_NUM_CHAINS];     
-  unsigned int HV[MAX_NUM_HVBOARDS][MAX_NUM_CHAINS][MAX_NUM_CHANNELS];
+  unsigned int HV[MAX_NUM_HVBOARDS][MAX_NUM_CHAINS][MAX_NUM_CHANNELS];      // HV value in DAC
+  float HVV[MAX_NUM_HVBOARDS][MAX_NUM_CHAINS][MAX_NUM_CHANNELS];            // HV value in volts
 
   float fTimeOut;
Index: hvcontrol/src/ProcessIO.cc
===================================================================
--- hvcontrol/src/ProcessIO.cc	(revision 35)
+++ hvcontrol/src/ProcessIO.cc	(revision 39)
@@ -349,11 +349,14 @@
 	  if (!allchannels) {
  // Convert from HV to DAC values
-	    if (!(config->IsDAC))
+	    if (!(config->IsDAC)){
+	      status->HVV[i][j][channel]=hvoltageV;
 	      hvoltage = calib->HVToDAC(hvoltageV,i,j,channel);
+	      printf("HV = %f, dac hv = %d .\n",hvoltageV,hvoltage);
+	    }
 	    if ((hv->GetHVBoard(i))->SetHV(stdout,j,channel,hvoltage,rbuf,status->Verbose)==1){
 	      status->HV[i][j][channel]=hvoltage;
 	      UpdateStatus(i,rbuf);
 	      
-	      sprintf(str,"board %d: high voltage of chain %d channel %d set to %d | 0X%.4X\n",hv->GetHVBoard(i)->GetBoardNumber(),j,channel,hvoltage,hvoltage);
+	      sprintf(str,"board %d: high voltage of chain %d channel %d set to %d | 0X%.4X | %f V\n",hv->GetHVBoard(i)->GetBoardNumber(),j,channel,hvoltage,hvoltage,calib->DACToHV(hvoltage,hv->GetHVBoard(i)->GetBoardNumber(),j,channel));
 	      DoPrompt(str);
 	      if (status->Verbose) {
@@ -376,6 +379,8 @@
 	    for (int k=0;k<MAX_NUM_CHANNELS;k++) {
  // Convert from HV to DAC values
-	      if (!(config->IsDAC)) 
+	      if (!(config->IsDAC)){
+		status->HVV[i][j][channel]=hvoltageV;
 		hvoltage = calib->HVToDAC(hvoltageV,i,j,k);
+	      }
 	      if ((hv->GetHVBoard(i))->SetHV(stdout,j,k,hvoltage,rbuf,status->Verbose)==1) {
 		status->HV[i][j][k]=hvoltage;
@@ -383,5 +388,6 @@
 		
 		if (status->Verbose) {
-		  sprintf(str,"board %d: high voltage of chain %d channel %d set to %d | 0X%.4X\n",hv->GetHVBoard(i)->GetBoardNumber(),j,k,hvoltage,hvoltage);
+		  sprintf(str,"board %d: high voltage of chain %d channel %d set to %d | 0X%.4X | %f V\n",hv->GetHVBoard(i)->GetBoardNumber(),j,channel,hvoltage,hvoltage,calib->DACToHV(hvoltage,hv->GetHVBoard(i)->GetBoardNumber(),j,channel));
+		  //sprintf(str,"board %d: high voltage of chain %d channel %d set to %d | 0X%.4X\n",hv->GetHVBoard(i)->GetBoardNumber(),j,k,hvoltage,hvoltage);
 		  DoPrompt(str);
 		  sPrintStatus(status,str,i);
@@ -455,13 +461,4 @@
       //      std::cout << "Channel: " << channel << std::endl;
 
-      /*      if (IsNoDigit(status->Param[1]))
-	      channel = atoi(status->Param[1]);
-	      else if(status->Param[1][0] == 'a')
-	      allchannels = TRUE;
-	      else {
-	      DoPrompt("error: wrong input format - usage: hvdiff <channel>|<all> <hv difference>\n");
-	      return 0;
-	}*/
-
       // Binary input
       if (tolower(status->Param[2][0])=='x' && strlen(status->Param[2])>2) {
@@ -506,8 +503,10 @@
       //Convert from HV to DAC values
       if (!(config->IsDAC)){
-	hvoltage = status->HV[board][chain][channel];
-	hvoltageV = calib->DACToHV(hvoltage,board,chain,channel);
-	hvoltageV = hvoltageV + hvdiffV;
-	hvdiff = calib->HVToDAC(hvoltageV,board,chain,channel) - hvoltage;
+	hvoltageV = status->HVV[board][chain][channel]+hvdiffV;
+	status->HVV[board][chain][channel] = hvoltageV;
+	printf("hv+diff = %f .\n",hvoltageV);
+	hvdiff = calib->HVToDAC(hvoltageV,board,chain,channel) - status->HV[board][chain][channel];
+	printf("dac new = %d, dac old = %d.\n",calib->HVToDAC(hvoltageV,board,chain,channel),status->HV[board][chain][channel]);
+	printf("dac diff = %d .\n",hvdiff);
       }
       StopMonitor();
@@ -516,4 +515,5 @@
       
       hvoltage = status->HV[board][chain][channel];
+      //      printf("dac hv = %d .\n",hvoltage);
       for (int k=0;k<=abs((int)(hvdiff/config->fHVMaxDiff));k++){
 	if (k<abs((int)(hvdiff/config->fHVMaxDiff))){
@@ -526,8 +526,10 @@
 	
 	status->HV[board][chain][channel]=hvoltage;
+	printf("dac hv rampingup= %d .\n",hvoltage);
 	if ((hv->GetHVBoard(board))->SetHV(stdout,chain,channel,hvoltage,rbuf,status->Verbose)==1) {
 	  UpdateStatus(board,rbuf);
-	  if (k==(int)(abs((int)(hvdiff/config->fHVMaxDiff)))){
-	    sprintf(str,"board %d: high voltage of chain %d channel %d set to %d | 0X%.4X\n",hv->GetHVBoard(board)->GetBoardNumber(),chain,channel,hvoltage,hvoltage);
+	  if (k==(abs((int)(hvdiff/config->fHVMaxDiff)))){
+	    sprintf(str,"board %d: high voltage of chain %d channel %d set to %d | 0X%.4X | %f V\n",hv->GetHVBoard(board)->GetBoardNumber(),chain,channel,hvoltage,hvoltage,calib->DACToHV(hvoltage,hv->GetHVBoard(board)->GetBoardNumber(),chain,channel));
+	    //sprintf(str,"board %d: high voltage of chain %d channel %d set to %d | 0X%.4X\n",hv->GetHVBoard(board)->GetBoardNumber(),chain,channel,hvoltage,hvoltage);
 	    DoPrompt(str);
 	    sPrintStatus(status,str,board); // Print status only to socket 
@@ -540,5 +542,4 @@
 	}
       }          // for loop over k
-	//	    Sleep(1);
       if (status->Verbose) {
 	sPrintStatus(status,str,board);
