Index: trunk/FACT++/src/smartfact.cc
===================================================================
--- trunk/FACT++/src/smartfact.cc	(revision 17950)
+++ trunk/FACT++/src/smartfact.cc	(revision 17953)
@@ -1,4 +1,4 @@
 #ifdef HAVE_NOVA
-#include "externals/nova.h"
+#include "externals/Prediction.h"
 #endif
 
@@ -2127,27 +2127,21 @@
 #ifdef HAVE_NOVA
 
-    vector<pair<Nova::EquPosn, double>> fMoonCoords;
-
-    void CalcMoonCoords(double jd)
+    //vector<pair<Nova::EquPosn, double>> fMoonCoords;
+
+    vector<Nova::SolarObjects> fCoordinates;
+
+    void CalcCoordinates(double jd)
     {
         jd = floor(jd);
 
-        fMoonCoords.clear();
+        fCoordinates.clear();
         for (double h=0; h<1; h+=1./(24*12))
-        {
-            const Nova::EquPosn moon = Nova::GetLunarEquCoords(jd+h,0.01);
-
-            const double disk = Nova::GetLunarDisk(jd+h);
-
-            fMoonCoords.emplace_back(moon, disk);
-        }
-    }
-
-    pair<vector<float>, pair<Time, float>> GetVisibility(Nova::EquPosn *src, double jd)
-    {
-        jd = floor(jd);
-
-        const double jd0 = fmod(fSun.fSetAstronomical.JD(),  1);
-        const double jd1 = fmod(fSun.fRiseAstronomical.JD(), 1);
+            fCoordinates.emplace_back(jd+h);
+    }
+
+    pair<vector<float>, pair<Time, float>> GetVisibility(Nova::EquPosn *src=0)
+    {
+        const double sunset  = fSun.fSetAstronomical.JD();
+        const double sunrise = fSun.fRiseAstronomical.JD();
 
         Nova::EquPosn  moon;
@@ -2159,15 +2153,13 @@
         int cnt = 0;
 
-        int i=0;
-
         vector<float> alt;
-        for (double h=0; h<1; h+=1./(24*12), i++)
+        for (auto it=fCoordinates.begin(); it!=fCoordinates.end(); it++)
         {
             if (src==0)
-                moon = fMoonCoords[i].first; //ln_get_lunar_equ_coords_prec(jd+h, &moon, 0.01);
-
-            const Nova::HrzPosn hrz = Nova::GetHrzFromEqu(*pos, jd+h);
-
-            if (h>jd0 && h<jd1)
+                moon = it->fMoonEqu;
+
+            const Nova::HrzPosn hrz = Nova::GetHrzFromEqu(*pos, it->fJD);
+
+            if (it->fJD>sunset && it->fJD<sunrise)
                 alt.push_back(hrz.alt);
 
@@ -2175,8 +2167,8 @@
             {
                 max   = hrz.alt;
-                maxjd = jd+h;
+                maxjd = it->fJD;
             }
 
-            if (h>jd0 && h<jd1 && hrz.alt>15)
+            if (it->fJD>sunset && it->fJD<sunrise && hrz.alt>15)
                 cnt++;
         }
@@ -2185,13 +2177,11 @@
             return make_pair(vector<float>(), make_pair(Time(), 0));
 
-        return make_pair(alt, make_pair(maxjd, maxjd>jd+jd0&&maxjd<jd+jd1?max:0));
-    }
-
-    pair<vector<float>, pair<Time, float>> GetLightCondition(double jd)
-    {
-        jd = floor(jd);
-
-        const double jd0 = fmod(fSun.fSetAstronomical.JD(),  1);
-        const double jd1 = fmod(fSun.fRiseAstronomical.JD(), 1);
+        return make_pair(alt, make_pair(maxjd, maxjd>sunset&&maxjd<sunrise?max:0));
+    }
+
+    pair<vector<float>, pair<Time, float>> GetLightCondition(const Nova::EquPosn &src_pos)
+    {
+        const double sunset  = fSun.fSetAstronomical.JD();
+        const double sunrise = fSun.fRiseAstronomical.JD();
 
         double max   = -1;
@@ -2199,26 +2189,14 @@
 
         int cnt = 0;
-        int i = 0;
 
         vector<float> vec;
-        for (double h=0; h<1; h+=1./(24*12), i++)
+        for (auto it=fCoordinates.begin(); it!=fCoordinates.end(); it++)
         {
             double cur = -1;
 
-            if (h>jd0 && h<jd1)
+            if (it->fJD>sunset && it->fJD<sunrise)
             {
-                Nova::EquPosn moon = fMoonCoords[i].first;//ln_get_lunar_equ_coords_prec(jd+h, &moon, 0.01);
-                const double disk  = fMoonCoords[i].second;//ln_get_lunar_disk(jd+h);
-
-                const Nova::HrzPosn hrz = Nova::GetHrzFromEqu(moon, jd+h);
-                const double dist  = Nova::GetLunarEarthDist(jd+h);
-
-                // Current prediction
-                const double calt = sin(hrz.alt*M_PI/180);
-
-                const double lc = calt>0 ? calt*pow(disk, 2.2)*pow(dist, -2) : -1;
-                cur = lc>0 ? 4+103*lc : -1;
-
-                vec.push_back(cur); // Covert LC to pixel current in uA
+                cur = FACT::PredictI(*it, src_pos);
+                vec.push_back(cur);
             }
 
@@ -2226,8 +2204,8 @@
             {
                 max   = cur;
-                maxjd = jd+h;
+                maxjd = it->fJD;
             }
 
-            if (h>jd0 && h<jd1 && cur>0)
+            if (it->fJD>sunset && it->fJD<sunrise && cur>0)
                 cnt++;
         }
@@ -2236,5 +2214,5 @@
             return make_pair(vector<float>(), make_pair(Time(), 0));
 
-        return make_pair(vec, make_pair(maxjd, maxjd>jd+jd0&&maxjd<jd+jd1?max:-1));
+        return make_pair(vec, make_pair(maxjd, maxjd>sunset&&maxjd<sunrise?max:-1));
     }
 #endif
@@ -2244,5 +2222,5 @@
         Time now;
 
-        CalcMoonCoords(now.JD());
+        CalcCoordinates(now.JD());
 
         fSun  = Sun (now);
@@ -2337,5 +2315,5 @@
         int lcol = 0;
 
-        /*const*/ pair<vector<float>, pair<Time, float>> vism = GetVisibility(0, now.JD());
+        /*const*/ pair<vector<float>, pair<Time, float>> vism = GetVisibility();
         if (!vism.first.empty())
         {
@@ -2373,5 +2351,5 @@
                 const Nova::ZdAzPosn hrz = Nova::GetHrzFromEqu(pos, now.JD());
 
-                /*const*/ pair<vector<float>, pair<Time, float>> vis = GetVisibility(&pos, now.JD());
+                /*const*/ pair<vector<float>, pair<Time, float>> vis = GetVisibility(&pos);
                 if (!vis.first.empty())
                 {
@@ -2384,5 +2362,5 @@
                     ccol++;
 
-                    /*const*/ pair<vector<float>, pair<Time, float>> lc = GetLightCondition(now.JD());
+                    /*const*/ pair<vector<float>, pair<Time, float>> lc = GetLightCondition(pos);
                     if (!lc.first.empty())
                     {
