Index: fact/FADctrl/FAD.cc
===================================================================
--- fact/FADctrl/FAD.cc	(revision 10279)
+++ fact/FADctrl/FAD.cc	(revision 10290)
@@ -627,5 +627,5 @@
 	  continue; 
 	}
-	PrintMessage("Last event received %s", ctime(&S.Update.tv_sec));
+	PrintMessage("Event rate %.1f Hz     Last event received %s", S.Rate, ctime(&S.Update.tv_sec));
 
 	// Board identification
Index: fact/FADctrl/FADBoard.cc
===================================================================
--- fact/FADctrl/FADBoard.cc	(revision 10279)
+++ fact/FADctrl/FADBoard.cc	(revision 10290)
@@ -24,4 +24,5 @@
   Port = ServerPort;
   Status.Frequency = 0;
+  Status.Rate = 0;
   Status.BoardID = 0;
   
@@ -51,4 +52,5 @@
   DIM_Status = new DimService((ID.str()+"Status").c_str(), (char *) "");
   DIM_ID = new DimService((ID.str()+"BoardID").c_str(), (char *) "S", NULL, 0);
+  DIM_Rate = new DimService((ID.str()+"RateHz").c_str(), Status.Rate);
   DIM_Frequency = new DimService((ID.str()+"Frequency").c_str(), Status.Frequency);
   DIM_Temp = new DimService((ID.str()+"Temperature").c_str(), (char *) "F", NULL, 0);
@@ -85,4 +87,5 @@
   delete DIM_Status;
   delete DIM_ID;
+  delete DIM_Rate;
   delete DIM_Frequency;
   delete DIM_Temp;
@@ -347,10 +350,9 @@
 
   char Buffer[READ_BUFFER_SIZE];
-  unsigned int Pos = 0, Temp;
+  unsigned int Pos = 0, Count = 0;
   const PEVNT_HEADER *Header = (PEVNT_HEADER *) Buffer;
   ssize_t Result;
   struct sockaddr_in SocketAddress;
   struct BoardStatus PrevStatus;
-  time_t LastUpdate = 0; 
   int Ret;
 
@@ -415,5 +417,5 @@
 	
 	// Check if buffer starts with start_package_flag, remove data if not
-	Temp = 0;
+	unsigned int Temp = 0;
 	while (ntohs(*((unsigned short *) (Buffer+Temp))) != 0xfb01 && Temp<Pos) Temp++;
 	if (Temp != 0) {
@@ -439,6 +441,4 @@
 		Pnt = (PCHANNEL *) ((short *) (Channel[i] + 1) + ntohs(Channel[i]->roi));
 	  } 
-
-	  PrevStatus = Status;
 
 	  // Wait until event thread processed the previous data and lock to avoid concurrent access in GetStatus()
@@ -505,4 +505,5 @@
 	  // Prepare predicate for condition variable
 	  Continue = false;
+	  Count++;
 	  Unlock();
 	  
@@ -511,9 +512,15 @@
 
 	  // Update DIM services if necessary
-	  if (time(NULL) - LastUpdate > m->EventUpdateDelay) {
-		LastUpdate = time(NULL);
+	  if (Status.Update.tv_sec - PrevStatus.Update.tv_sec > m->EventUpdateDelay) {
+
+		// Determine event rate
+	    Status.Rate =
+	   Count / (double(Status.Update.tv_sec-PrevStatus.Update.tv_sec) + (Status.Update.tv_usec-PrevStatus.Update.tv_usec)/1000000.0);
+	    Count = 0;
 
 		if (PrevStatus.Frequency != Status.Frequency) DIM_Frequency->updateService();
 
+		if (PrevStatus.Rate != Status.Rate) DIM_Rate->updateService();
+		
 		if (memcmp(PrevStatus.Temp, Status.Temp, sizeof(Status.Temp)) != 0) {
 		  DIM_Temp->updateService(Status.Temp, sizeof(Status.Temp));
@@ -528,4 +535,6 @@
 		  DIM_ID->updateService(&Status.BoardID, sizeof(Status.BoardID));
 		}
+		
+		PrevStatus = Status;
 	  }
 	  
Index: fact/FADctrl/FADBoard.h
===================================================================
--- fact/FADctrl/FADBoard.h	(revision 10279)
+++ fact/FADctrl/FADBoard.h	(revision 10290)
@@ -28,5 +28,6 @@
 	int Socket;
 	pthread_mutex_t Mutex;
-	DimService *DIM_Name, *DIM_Status, *DIM_ID, *DIM_Frequency, *DIM_Temp, *DIM_ROI, *DIM_DAC;
+	DimService *DIM_Name, *DIM_Status, *DIM_ID, *DIM_Frequency;
+	DimService *DIM_Rate, *DIM_Temp, *DIM_ROI, *DIM_DAC;
 
 	void ReadLoop();
@@ -48,4 +49,5 @@
 	  char Message[STATUS_SIZE];
 	  struct timeval Update;
+	  float Rate;
 
 	  uint32_t TriggerID;
Index: fact/FADctrl/History.txt
===================================================================
--- fact/FADctrl/History.txt	(revision 10279)
+++ fact/FADctrl/History.txt	(revision 10290)
@@ -20,3 +20,4 @@
 29/3/2011	Added Status message service for each board (removed several console messages in turn)
 			Limited update rate of slow control data to 1 second or interval set by 'update'
-1/4/2011	Added DIM frequency service			
+1/4/2011	Added DIM frequency service
+5/4/2011	Added DIM rate service for each board		
