Index: /fact/Evidence/GUI.cc
===================================================================
--- /fact/Evidence/GUI.cc	(revision 10983)
+++ /fact/Evidence/GUI.cc	(revision 10984)
@@ -46,4 +46,6 @@
   if (Format.size() == 1 && Format[0] != 'C') return new EddPlot(Service, Index);
   else return new EddText(Service);
+  
+  
 }
 
@@ -235,5 +237,5 @@
   setAcceptDrops(true);
   setAxisScaleDraw(QwtPlot::xBottom, new EddTimeScale);
-	
+
   // Update time range on plot when axis change	(update() results in paintEvent())
   connect(axisWidget(QwtPlot::xBottom), SIGNAL(scaleDivChanged()), SLOT(update()));
@@ -252,6 +254,8 @@
   Menu->insertAction(Menu->actions().value(1), Action);
   
-  // Maximum number if points in curve (will be increased in Update())
-  SizeLimit = 0;
+  // Set timer to regularly update plot if new data available
+  SingleShot = new QTimer(this);
+  connect(SingleShot, SIGNAL(timeout()), this, SLOT(UpdatePlot()));
+  SingleShot->setSingleShot(true);
 
   // DIM client
@@ -284,5 +288,27 @@
   List.append(N);
 
+  // Request new history buffer
+  const struct EvidenceHistory::Item *R;
+  class EvidenceHistory *Hist;
+
+  if ((Hist = Handler->GetHistory(Name)) != NULL) {
+	double Number=0;
+	while ((R=Hist->Next()) != NULL) {
+	  switch (*(Hist->GetFormat())) {
+    	case 'I':
+		case 'L':  Number = *((int *) R->Data + N.Index);   break;
+    	case 'S':  Number = *((short *) R->Data + N.Index);   break;
+    	case 'F':  Number = *((float *) R->Data + N.Index);   break;
+    	case 'D':  Number = *((double *) R->Data + N.Index);   break;
+    	case 'X':  Number = *((long long *) R->Data + N.Index);   break;
+    	default: break;
+	  }
+	  AddPoint(List.size()-1, R->Time, Number);
+	}
+  }
+  Handler->DropHistory(Name);
   Handler->Subscribe(Name);
+  
+  SingleShot->start(100);
 }
 
@@ -290,44 +316,7 @@
 void EddPlot::Update(QString Name, int Time, QByteArray, QString Format, QString Text) {
 
-  bool DoUpdate = false;
-
-  // Determine which plot item this call belongs to
-  int ItemNo;
-  for (ItemNo=0; ItemNo<List.size(); ItemNo++) if (List[ItemNo].Name == Name) {
-
-	DoUpdate = true;
-
-	// If size limit reached, clear buffer
-    if (List[ItemNo].Signal->dataSize() > SizeLimit) List[ItemNo].Signal->setData(QPolygonF());
-
-	// If buffer empty, request new history buffer
-    if (List[ItemNo].Signal->dataSize() == 0) {
-	  int Count=0;
-	  const struct EvidenceHistory::Item *R;
-	  class EvidenceHistory *Hist;
-
-	  if ((Hist = Handler->GetHistory(List[ItemNo].Name)) != NULL) {
-		double Number=0;
-		while ((R=Hist->Next()) != NULL) {
-		  switch (*(Hist->GetFormat())) {
-    		case 'I':
-			case 'L':  Number = *((int *) R->Data + List[ItemNo].Index);   break;
-    		case 'S':  Number = *((short *) R->Data + List[ItemNo].Index);   break;
-    		case 'F':  Number = *((float *) R->Data + List[ItemNo].Index);   break;
-    		case 'D':  Number = *((double *) R->Data + List[ItemNo].Index);   break;
-    		case 'X':  Number = *((long long *) R->Data + List[ItemNo].Index);   break;
-    		default: break;
-		  }
-		  AddPoint(ItemNo, R->Time, Number);
-		  Count++;
-		}
-
-		// Local buffer at least twice as large as longest history
-		if (SizeLimit < 2*Count) SizeLimit = 2*Count;
-	  }
-	  Handler->DropHistory(List[ItemNo].Name);
-	}
-
- 	// Append data only if service available
+  for (int ItemNo=0; ItemNo<List.size(); ItemNo++) if (List[ItemNo].Name == Name) {
+
+ 	// Append data if service available
 	if (SetStatus(this, Name, Time, Format)) {
 	  QString Txt = Text;
@@ -335,7 +324,7 @@
       AddPoint(ItemNo, Time, atof(Txt.toAscii().data()));
 	}
-  }
-
-  if (DoUpdate) UpdatePlot();
+
+	NewData = true;
+  }
 }
 
@@ -412,4 +401,5 @@
   setCanvasBackground(EddPlotBackgroundColor);
   setMargin(15);
+  NewData = false;
 
   // Plot navigation
@@ -460,8 +450,15 @@
   Menu->addAction("Single trace", this, SLOT(MenuSingleTrace()));
   Menu->addSeparator();
+  Menu->addAction("Set update rate", this, SLOT(MenuSetUpdateRate()));  
+  Menu->addSeparator();
   Menu->addAction("Save as ASCII", this, SLOT(MenuSaveASCII()));
   Menu->addAction("Save plot", this, SLOT(MenuSave()));
   Menu->addAction("Print plot", this, SLOT(MenuPrint()));
   Menu->addAction("Plot help", this, SLOT(MenuPlotHelp()));
+  
+  // Set timer to regularly update plot if new data available
+  Timer = new QTimer(this);
+  connect(Timer, SIGNAL(timeout()), this, SLOT(UpdatePlot()));
+  Timer->start(2000);
 }
 
@@ -527,4 +524,8 @@
   Symbol.setStyle(QwtSymbol::Ellipse);
   Symbol.setSize(4);
+
+  // Only update if called by timer if new data is available
+  if (sender() == Timer && !NewData) return;
+  NewData = false;
 
   // Select engine for linear or logarithmic scale
@@ -560,5 +561,5 @@
       }  
     }
- 
+
     // Plot data
     Items[ItemNo].Signal->setData(Items[ItemNo].x.data(), y, DataPoints);
@@ -716,4 +717,15 @@
   }
   UpdatePlot();
+}
+
+// Set maximum update rate of plot
+void EddBasePlot::MenuSetUpdateRate() {
+
+  bool OK;
+  double Rate;
+  
+  Rate = QInputDialog::getDouble(this, "Edd Request",
+    "Minimum period between plot updates (sec)", (double) Timer->interval()/1000, 0, std::numeric_limits<double>::max(), 2, &OK);
+  if (OK) Timer->setInterval(Rate*1000);
 }
 
Index: /fact/Evidence/GUI.h
===================================================================
--- /fact/Evidence/GUI.h	(revision 10983)
+++ /fact/Evidence/GUI.h	(revision 10984)
@@ -22,6 +22,7 @@
 #include <qwt_color_map.h>
 
-#include <limits.h>
+#include <limits>
 #include <float.h>
+#include <limits>
 
 #include "dic.hxx"
@@ -72,4 +73,6 @@
     ~EddBasePlot();
 
+	QTimer *Timer;
+	bool NewData;
 	QwtPlotCurve *NewCurve(QwtText);
 	void ClearCurve(unsigned int);
@@ -86,4 +89,5 @@
 	void contextMenuEvent(QContextMenuEvent *);
     void MenuSingleTrace();        
+    void MenuSetUpdateRate();        
     void MenuZoomOut();
     void MenuSaveASCII();
@@ -172,5 +176,5 @@
   private:
 	QwtLegend *Legend;
-	int SizeLimit;
+	QTimer *SingleShot;
 
     void dragEnterEvent(QDragEnterEvent *);
Index: /fact/tools/Edd/Edd.cc
===================================================================
--- /fact/tools/Edd/Edd.cc	(revision 10983)
+++ /fact/tools/Edd/Edd.cc	(revision 10984)
@@ -7,4 +7,6 @@
 EddLineDisplay changes its background colour in case it display
 a DIM status service
+
+Note: Currently no limit to number of points in plot, can result in out of memory condition.
 
 ============================================================ */
@@ -55,4 +57,6 @@
   AddTrace(0,0,0);
 
+  // Update interval
+  Timer->setInterval(100);
   SetActive(true);
 }
@@ -334,5 +338,5 @@
 
 //
-// Environment page
+// Environment page (For M0, server was called ARDUINO)
 //
 TP_Environment::TP_Environment() {
@@ -342,24 +346,39 @@
 
   // Status display
-  EddLineDisplay *Line = new EddLineDisplay("ARDUINO/Message");
-  Line->setMaximumWidth(200);
-  Layout->addWidget(Line, 0, 0, 1, 2);      
-
-  // Generate plot and data displays
+  EddLineDisplay *Line = new EddLineDisplay("FSCctrl/Message");
+  Line->setMaximumWidth(300);
+  Layout->addWidget(Line, 0, 0, 1, 4);      
+
+  Line = new EddLineDisplay("FSCctrl/Time");
+  Layout->addWidget(Line, 0, 5, 1, 2);      
+
+  // Temperatures
   EddPlot *Plot = new EddPlot();
-  for (int i=0; i<10; i++) {
-    Line = new EddLineDisplay("ARDUINO/Data", i);
-    Layout->addWidget(Line, i%5+1, i/5, 1, 1);
-    Plot->AddService("ARDUINO/Data", i);
-  }
-  Layout->addWidget(Plot, 0, 2, 9, 7);      
+  for (int i=0; i<64; i++) {
+    Line = new EddLineDisplay("FSCctrl/Temperature", i);
+    Line->setMaximumWidth(50);
+    Layout->addWidget(Line, i/8+1, i%8);
+    Plot->AddService("FSCctrl/Temperature", i);
+  }
+  Layout->addWidget(Plot, 0, 10, 22, 15);      
+
+  // Voltages and currents
+  for (int i=0; i<40; i++) {
+    Line = new EddLineDisplay("FSCctrl/Voltage", i);
+    Line->setMaximumWidth(50);
+    Layout->addWidget(Line, i/8+10, i%8);
+
+    Line = new EddLineDisplay("FSCctrl/Current", i);
+    Line->setMaximumWidth(50);
+    Layout->addWidget(Line, i/8+16, i%8);
+  }
 
   // Night sky monitor
   Line = new EddLineDisplay("SQM/Message");
-  Line->setMaximumWidth(200);
-  Layout->addWidget(Line, 6, 0, 1, 2);      
+  Line->setMaximumWidth(300);
+  Layout->addWidget(Line, 22, 0, 1, 4);      
 
   Line = new EddLineDisplay("SQM/NSB");
-  Layout->addWidget(Line, 7, 0, 1, 1);          
+  Layout->addWidget(Line, 22, 5, 1, 2);          
 }
 
@@ -872,5 +891,5 @@
   TabWidget->addTab(new TP_Bias, "Bias");
   TabWidget->addTab(new TP_Feedback, "Feedback");
-  TabWidget->addTab(new TP_Environment, "Environment");
+  TabWidget->addTab(new TP_Environment, "FSC/SQM");
   TabWidget->addTab(new TP_Evidence, "Evidence");
 
