Index: trunk/FACT++/src/smartfact.cc
===================================================================
--- trunk/FACT++/src/smartfact.cc	(revision 13954)
+++ trunk/FACT++/src/smartfact.cc	(revision 13955)
@@ -191,18 +191,9 @@
         description = state[name];
 
-        string arr;
-        ostringstream out;
-        if (isday)
-        {
-            out << fSunSetDarkTime-time;
-            arr = "&darr;";
-        }
-        else
-        {
-            out << fSunRiseDayTime-time;
-            arr = "&uarr;";
-        }
-
-        description += " ["+out.str().substr(0, 5)+arr+"]";
+        const string arr = isday ?
+            fSunSetDarkTime.MinutesTo(time)+"&darr;" :
+            fSunRiseDayTime.MinutesTo(time)+"&uarr;";
+
+        description += " ["+arr+"]";
 
         switch (state)
@@ -282,20 +273,11 @@
             color = disk>75 ? HTML::kRed : HTML::kYellow;
 
-        string arr;
-        ostringstream dt;
-        if (fMoonSet<fMoonRise)
-        {
-            dt << fMoonSet-time;
-            arr = "&darr;";
-        }
-        else
-        {
-            dt << fMoonRise-time;
-            arr = "&uarr;";
-        }
+        const string arr = fMoonSet<fMoonRise ?
+            fMoonSet.MinutesTo(time)+"&darr;" :
+            fMoonRise.MinutesTo(time)+"&uarr;";
 
         ostringstream out;
         out << setprecision(2);
-        out << (visible?"visible ":"") << (disk<0.1?0:disk) << "% [" << dt.str().substr(0,5) << arr << "]";
+        out << (visible?"visible ":"") << (disk<0.1?0:disk) << "% [" << arr << "]";
 
         description = out.str();
@@ -409,4 +391,6 @@
     bool fSunIsVisible;
     bool fMoonIsVisible;
+
+    Time fTimeOfCivilTwilight;
 
     int fHasError;
@@ -675,4 +659,6 @@
         fSunIsVisible = astro.state>=3 && astro.state<=5;
         fMoonIsVisible = !fSunIsVisible && moon.visible;
+
+        fTimeOfCivilTwilight = astro.fSunSetCivil;
 
         ofstream(fPath+"/weather.data") << out.str();
@@ -1554,6 +1540,11 @@
             return HTML::kWhite + "\t&mdash;\n";
 
-
-        return (rc.index<green?HTML::kYellow:HTML::kGreen) + '\t' + rc.name + '\n';
+        string col = HTML::kGreen;
+        if (rc.index<green)
+            col = HTML::kYellow;
+        if (rc.index>0xff)
+            col = HTML::kRed;
+
+        return col + '\t' + rc.name + '\n';
     }
 
@@ -1575,4 +1566,8 @@
         // ==============================================================
 
+        const bool data_taking =
+            fDimMcp.state()==MCP::State::kTriggerOn ||
+            fDimMcp.state()==MCP::State::kTakingData;
+
         ostringstream msg;
 
@@ -1581,7 +1576,7 @@
         if (!fDimDNS.online())
             msg << "DIM network not available.<br/>";
-        if (fDimDriveControl.state()>0xff)
-            msg << "Drive in ERROR state<br/>";
-        if (fDimBiasControl.state()<BIAS::State::kRamping && (fDimMcp.state()==MCP::State::kTriggerOn || fDimMcp.state()==MCP::State::kTakingData))
+        if (fDimDriveControl.state()>0xff && data_taking)
+            msg << "Drive in ERROR state during data-taking<br/>";
+        if (fDimBiasControl.state()<BIAS::State::kRamping && data_taking)
             msg << "BIAS not operating during data-taking<br/>";
         if (fDimBiasControl.state()==BIAS::State::kOverCurrent)
@@ -1596,5 +1591,5 @@
                 msg << "Maximum current exceeds 90&micro;A/pix<br/>";
         }
-        if (fMagicWeatherHist[kHum].size()>0 && fMagicWeatherHist[kHum].back()>98 && (fDimMcp.state()==MCP::State::kTriggerOn || fDimMcp.state()==MCP::State::kTakingData))
+        if (fMagicWeatherHist[kHum].size()>0 && fMagicWeatherHist[kHum].back()>98 && data_taking)
             msg << "Outside humidity exceeds 98% during data-taking<br/>";
         if (fMagicWeatherHist[kGusts].size()>0 && fMagicWeatherHist[kGusts].back()>98 && fDimDriveControl.state()==Drive::State::kTracking)
@@ -1602,5 +1597,5 @@
         if (fFscControlTemperatureHist.size()>0 && fFscControlTemperatureHist.back()>7)
             msg << "Sensor temperature exceeds outside temperature by more than 7&deg;C<br/>";
-        if (fFtmControlTriggerRateCam<0.01 && (fDimMcp.state()==MCP::State::kTriggerOn || fDimMcp.state()==MCP::State::kTakingData))
+        if (fFtmControlTriggerRateCam<0.01 && data_taking)
             msg << "Trigger rate below 10mHz during data taking<br/>";
         if (fFscControlHumidityAvg>60)
@@ -1745,9 +1740,5 @@
                 {
                     if (fMcpConfigurationState==MCP::State::kTakingData)
-                    {
-                        ostringstream d;
-                        d << Time()-fMcpConfigurationRunStart;
-                        tim << d.str().substr(3, 5);
-                    }
+                        tim << fMcpConfigurationRunStart.SecondsTo();
                 }
 
@@ -1790,11 +1781,11 @@
             //out << rc.name << '\t';
             out << fDriveControlPointingAz << ' ';
+            out << fDriveControlPointingZd  << "&deg;";
             out << setprecision(2);
-            out << fDriveControlPointingZd  << "&deg;";
             if (fDimDriveControl.state()==Drive::State::kTracking)
             {
                 out << " &plusmn; " << dev << '"';
                 if (!fDriveControlSourceName.empty())
-                    out << '[' << fDriveControlSourceName  << ']';
+                    out << " [" << fDriveControlSourceName  << ']';
             }
             if (fDimDriveControl.state()==Drive::State::kMoving)
@@ -1805,5 +1796,9 @@
             out << HTML::kWhite << '\t';
         if (fSunIsVisible)
+        {
             out << " &#9788;";
+            if (fTimeOfCivilTwilight.IsValid() && fDimDriveControl.state()<Drive::State::kArmed)
+                out << " [" << fTimeOfCivilTwilight.MinutesTo() << "]";
+        }
         else
             if (fMoonIsVisible)
@@ -1978,4 +1973,6 @@
         fBiasControlCurrentMax(0),
         fFscControlHumidityAvg(0),
+        fDriveControlMoonDist(-1),
+        fFadControlNumEvents(0),
         fFadControlDrsRuns(3),
         fFtmControlTriggerRateCam(0),
@@ -1983,4 +1980,6 @@
         fRateScanBoard(0),
         fSunIsVisible(true),
+        fMoonIsVisible(false),
+        fTimeOfCivilTwilight(Time::none),
         fHasError(2),
         // ---
