Index: /trunk/FACT++/src/smartfact.cc
===================================================================
--- /trunk/FACT++/src/smartfact.cc	(revision 14041)
+++ /trunk/FACT++/src/smartfact.cc	(revision 14042)
@@ -79,13 +79,13 @@
     Time time;
 
-    Time fSunRiseDayTime;
-    Time fSunRiseCivil;
-    Time fSunRiseAstronomical;
-    Time fSunRiseDarkTime;
-
-    Time fSunSetDayTime;
-    Time fSunSetCivil;
-    Time fSunSetAstronomical;
-    Time fSunSetDarkTime;
+    Time fRiseDayTime;
+    Time fRiseCivil;
+    Time fRiseAstronomical;
+    Time fRiseDarkTime;
+
+    Time fSetDayTime;
+    Time fSetCivil;
+    Time fSetAstronomical;
+    Time fSetDarkTime;
 
     int state;
@@ -100,4 +100,7 @@
     {
     }
+
+    // Could be done more efficient: Only recalcuate if
+    // the current time exceeds at least on of the stored times
     Sun(double lon, double lat, const Time &t=Time()) :  time(t)
     {
@@ -121,13 +124,13 @@
         ln_get_solar_rst_horizon(JD-0.5, &observer, -18, &sun_dark);
 
-        fSunSetDayTime       = Time(sun_day.set);
-        fSunSetCivil         = Time(sun_civil.set);
-        fSunSetAstronomical  = Time(sun_astronomical.set);
-        fSunSetDarkTime      = Time(sun_dark.set);
-
-        fSunRiseDayTime      = Time(sun_day.rise);
-        fSunRiseCivil        = Time(sun_civil.rise);
-        fSunRiseAstronomical = Time(sun_astronomical.rise);
-        fSunRiseDarkTime     = Time(sun_dark.rise);
+        fSetDayTime       = Time(sun_day.set);
+        fSetCivil         = Time(sun_civil.set);
+        fSetAstronomical  = Time(sun_astronomical.set);
+        fSetDarkTime      = Time(sun_dark.set);
+
+        fRiseDayTime      = Time(sun_day.rise);
+        fRiseCivil        = Time(sun_civil.rise);
+        fRiseAstronomical = Time(sun_astronomical.rise);
+        fRiseDarkTime     = Time(sun_dark.rise);
 
         const bool is_day   = JD>sun_day.rise;
@@ -141,16 +144,16 @@
         if (is_day)
         {
-            fSunRiseDayTime      = Time(sun_day.rise);
-            fSunRiseCivil        = Time(sun_civil.rise);
-            fSunRiseAstronomical = Time(sun_astronomical.rise);
-            fSunRiseDarkTime     = Time(sun_dark.rise);
+            fRiseDayTime      = Time(sun_day.rise);
+            fRiseCivil        = Time(sun_civil.rise);
+            fRiseAstronomical = Time(sun_astronomical.rise);
+            fRiseDarkTime     = Time(sun_dark.rise);
         }
 
         if (is_night)
         {
-            fSunSetDayTime      = Time(sun_day.set);
-            fSunSetCivil        = Time(sun_civil.set);
-            fSunSetAstronomical = Time(sun_astronomical.set);
-            fSunSetDarkTime     = Time(sun_dark.set);
+            fSetDayTime      = Time(sun_day.set);
+            fSetCivil        = Time(sun_civil.set);
+            fSetAstronomical = Time(sun_astronomical.set);
+            fSetDarkTime     = Time(sun_dark.set);
         }
 
@@ -162,13 +165,13 @@
 
         state = isday ? 4 : 0;
-        if (time>fSunSetDayTime)       state++;
-        if (time>fSunSetCivil)         state++;
-        if (time>fSunSetAstronomical)  state++;
-        if (time>fSunSetDarkTime)      state++;
-
-        if (time>fSunRiseDarkTime)     state++;
-        if (time>fSunRiseAstronomical) state++;
-        if (time>fSunRiseCivil)        state++;
-        if (time>fSunRiseDayTime)      state++;
+        if (time>fSetDayTime)       state++;
+        if (time>fSetCivil)         state++;
+        if (time>fSetAstronomical)  state++;
+        if (time>fSetDarkTime)      state++;
+
+        if (time>fRiseDarkTime)     state++;
+        if (time>fRiseAstronomical) state++;
+        if (time>fRiseCivil)        state++;
+        if (time>fRiseDayTime)      state++;
 
         string name[] =
@@ -188,6 +191,6 @@
 
         const string arr = isday ?
-            fSunSetDarkTime.MinutesTo(time)+"&darr;" :
-            fSunRiseDarkTime.MinutesTo(time)+"&uarr;";
+            fSetDarkTime.MinutesTo(time)+"&darr;" :
+            fRiseDarkTime.MinutesTo(time)+"&uarr;";
 
         description += " ["+arr+"]";
@@ -222,15 +225,19 @@
     bool visible;
 
-    Time fMoonRise;
-    Time fMoonTransit;
-    Time fMoonSet;
+    Time fRise;
+    Time fTransit;
+    Time fSet;
 
     string description;
     string color;
 
+    int state;
+
     Moon() : time(Time::none)
     {
     }
 
+    // Could be done more efficient: Only recalcuate if
+    // the current time exceeds at least on of the stored times
     Moon(double lon, double lat, const Time &t=Time()) : time(t)
     {
@@ -252,11 +259,11 @@
         ln_get_lunar_rst(JD-0.5, &observer, &moon);
 
-        fMoonRise    = Time(moon.rise);
-        fMoonTransit = Time(moon.transit);
-        fMoonSet     = Time(moon.set);
-
-        visible =
-            (JD>moon.rise && JD<moon.set  && moon.rise<moon.set) ||
-            ((JD<moon.set  || JD>moon.rise) && moon.rise>moon.set);
+        fRise    = Time(moon.rise);
+        fTransit = Time(moon.transit);
+        fSet     = Time(moon.set);
+
+        //visible =
+        //    ((JD>moon.rise && JD<moon.set ) && moon.rise<moon.set) ||
+        //    ((JD<moon.set  || JD>moon.rise) && moon.rise>moon.set);
 
         const bool is_up      = JD>moon.rise;
@@ -266,9 +273,9 @@
         ln_get_lunar_rst(JD+0.5, &observer, &moon);
         if (is_up)
-            fMoonRise = Time(moon.rise);
+            fRise = Time(moon.rise);
         if (is_sinking)
-            fMoonTransit = Time(moon.transit);
+            fTransit = Time(moon.transit);
         if (is_dn)
-            fMoonSet = Time(moon.set);
+            fSet = Time(moon.set);
 
         ln_equ_posn pos;
@@ -284,4 +291,14 @@
 
         disk = ln_get_lunar_disk(JD)*100;
+        state = 0;
+        if (fRise   <fTransit && fRise   <fSet)     state = 0;  // not visible
+        if (fTransit<fSet     && fTransit<fRise)    state = 1;  // before culm
+        if (fSet    <fRise    && fSet    <fTransit) state = 2;  // after culm
+
+        visible = state!=0;
+
+        // 0: not visible
+        // 1: visible before cul
+        // 2: visible after cul
 
         if (!visible || disk<25)
@@ -290,7 +307,7 @@
             color = disk>75 ? HTML::kRed : HTML::kYellow;
 
-        const string arr = fMoonSet<fMoonRise ?
-            fMoonSet.MinutesTo(time)+"&darr;" :
-            fMoonRise.MinutesTo(time)+"&uarr;";
+        const string arr = fSet<fRise ?
+            fSet.MinutesTo(time) +"&darr;" :
+            fRise.MinutesTo(time)+"&uarr;";
 
         ostringstream out;
@@ -632,5 +649,6 @@
         // Not that this will also "ding" just after program startup
         // if the dimctrl is still in state -3
-        if (d.GetQoS()==-3 && fDimControl.scriptdepth==0)
+        if (fDimControl.last.second!=DimState::kOffline &&
+            d.GetQoS()==-3 && fDimControl.scriptdepth==0)
             SetAudio("ding");
 
@@ -850,8 +868,7 @@
         fDriveControlMoonDist = -1;
 
-        Moon moon(-(17.+53./60+26.525/3600), 28.+45./60+42.462/3600);
-        if (moon.visible)
-        {
-            const double angle = moon.Angle(Ra, Dec);
+        if (fMoon.visible)
+        {
+            const double angle = fMoon.Angle(Ra, Dec);
             out << Moon::Color(angle) << '\t' << setprecision(3) << angle << '\n';
 
@@ -1667,27 +1684,33 @@
         fMoon = Moon(lon, lat, now);
 
+        vector<string> color(8, HTML::kWhite);
+        color[fSun.state%8] = HTML::kBlue;
+
         ostringstream out;
         out << setprecision(3);
         out << now.JavaDate() << '\n';
-        out << HTML::kWhite << '\t' << fSun.fSunRiseDarkTime.GetAsStr("%H:%M") << '\n';
-        out << HTML::kWhite << '\t' << fSun.fSunRiseAstronomical.GetAsStr("%H:%M") << '\n';
-        out << HTML::kWhite << '\t' << fSun.fSunRiseCivil.GetAsStr("%H:%M") << '\n';
-        out << HTML::kWhite << '\t' << fSun.fSunRiseDayTime.GetAsStr("%H:%M") << '\n';
-
-        out << HTML::kWhite << '\t' << fSun.fSunSetDayTime.GetAsStr("%H:%M") << '\n';
-        out << HTML::kWhite << '\t' << fSun.fSunSetCivil.GetAsStr("%H:%M") << '\n';
-        out << HTML::kWhite << '\t' << fSun.fSunSetAstronomical.GetAsStr("%H:%M") << '\n';
-        out << HTML::kWhite << '\t' << fSun.fSunSetDarkTime.GetAsStr("%H:%M") << '\n';
+        out << color[0] << '\t' << fSun.fRiseDarkTime.GetAsStr("%H:%M") << '\n';
+        out << color[1] << '\t' << fSun.fRiseAstronomical.GetAsStr("%H:%M") << '\n';
+        out << color[2] << '\t' << fSun.fRiseCivil.GetAsStr("%H:%M") << '\n';
+        out << color[3] << '\t' << fSun.fRiseDayTime.GetAsStr("%H:%M") << '\n';
+
+        out << color[4] << '\t' << fSun.fSetDayTime.GetAsStr("%H:%M") << '\n';
+        out << color[5] << '\t' << fSun.fSetCivil.GetAsStr("%H:%M") << '\n';
+        out << color[6] << '\t' << fSun.fSetAstronomical.GetAsStr("%H:%M") << '\n';
+        out << color[7] << '\t' << fSun.fSetDarkTime.GetAsStr("%H:%M") << '\n';
 
         ofstream(fPath+"/sun.data") << out.str();
+
+        color.assign(3, HTML::kWhite);
+        color[fMoon.state%3] = HTML::kBlue;
 
         out.str("");
         out << now.JavaDate() << '\n';
 
-        out << HTML::kWhite << '\t' << fMoon.fMoonRise.GetAsStr("%H:%M") << '\n';
-        out << HTML::kWhite << '\t' << fMoon.fMoonTransit.GetAsStr("%H:%M") << '\n';
-        out << HTML::kWhite << '\t' << fMoon.fMoonSet.GetAsStr("%H:%M") << '\n';
-
-        out << (fSun.visible?HTML::kWhite:fMoon.color) << '\t' << fMoon.description << '\n';
+        out << color[0] << '\t' << fMoon.fRise.GetAsStr("%H:%M") << '\n';
+        out << color[1] << '\t' << fMoon.fTransit.GetAsStr("%H:%M") << '\n';
+        out << color[2] << '\t' << fMoon.fSet.GetAsStr("%H:%M") << '\n';
+
+        out << (fSun.isday?HTML::kWhite:fMoon.color) << '\t' << fMoon.description << '\n';
 
         if (!fMoon.visible)
@@ -1695,10 +1718,16 @@
         else
         {
-            string col = HTML::kGreen;
-            if (fMoon.zd>25)
-                col = HTML::kYellow;
-            if (fMoon.zd>45 && fMoon.zd<85)
-                col = HTML::kRed;
-            out << col << '\t' << fMoon.zd << '\n';
+            string col = HTML::kWhite;
+            if (!fSun.isday)
+            {
+                col = HTML::kGreen;
+                if (fMoon.zd>25)
+                    col = HTML::kYellow;
+                if (fMoon.zd>45 && fMoon.zd<80)
+                    col = HTML::kRed;
+                if (fMoon.zd>=80)
+                    col = HTML::kRed;
+            }
+            out << col << '\t' << fMoon.zd << '\t' << GetDir(fMoon.az) << '\n';
         }
 
@@ -2092,5 +2121,5 @@
                 out << " &#9788;";
                 if (fDimDriveControl.state()<Drive::State::kArmed)
-                    out << " [" << fSun.fSunSetCivil.MinutesTo() << "&darr;]";
+                    out << " [" << fSun.fSetCivil.MinutesTo() << "&darr;]";
             }
             else
