Ignore:
Timestamp:
05/19/12 09:16:35 (12 years ago)
Author:
tbretz
Message:
Improved the system status; implemented the display of some astronomy data.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/FACT++/src/smartfact.cc

    r13778 r13795  
    3333// ------------------------------------------------------------------------
    3434
     35const static string kHtmlWhite  = "#ffffff";
     36const static string kHtmlYellow = "#fffff0";
     37const static string kHtmlRed    = "#fff8f0";
     38const static string kHtmlGreen  = "#f0fff0";
     39const static string kHtmlBlue   = "#f0f0ff";
     40
    3541#ifdef HAVE_LIBNOVA
    3642
    3743class Astro
    3844{
     45public:
     46    Time time;
     47
    3948    Time fSunRiseDayTime;
    4049    Time fSunRiseCivil;
     
    4756    Time fSunSetDarkTime;
    4857
    49     ln_rst_time moon;
    50 
    51     ln_equ_posn moon_position;
    52     double      moon_disk;
    53 
     58    int state;
    5459    string description;
    55 
    56     //observer.lng = -(17.+53./60+26.525/3600);
    57     //observer.lat =   28.+45./60+42.462/3600;
     60    string color;
     61
     62    bool isday;
     63
    5864public:
    59     Astro(double lon, double lat, /*const*/ Time/* &*/time=Time())
    60     {
    61         // observers location (Edinburgh), used to calc rst
    62         struct ln_lnlat_posn observer;
    63         observer.lng = -(17.+53./60+26.525/3600);
    64         observer.lat =   28.+45./60+42.462/3600;
    65 
    66         time = Time(2012, 5, 18, 23, 30);
     65    Astro(double lon, double lat, const Time &t=Time()) :  time(t)
     66    {
     67        ln_lnlat_posn observer;
     68        observer.lng = lon;
     69        observer.lat = lat;
    6770
    6871        // get Julian day from local time
     
    7578
    7679        // Warning: return code of 1 means circumpolar and is not checked!
    77         ln_get_lunar_rst        (JD-0.5, &observer,      &moon);
     80        //ln_get_lunar_rst        (JD-0.5, &observer,      &moon);
    7881        ln_get_solar_rst        (JD-0.5, &observer,      &sun_day);
    7982        ln_get_solar_rst_horizon(JD-0.5, &observer, - 6, &sun_civil);
     
    9497        const bool is_night = JD>sun_dark.set;
    9598
    96         ln_get_lunar_rst        (JD+0.5, &observer,      &moon);
     99        //ln_get_lunar_rst        (JD+0.5, &observer,      &moon);
    97100        ln_get_solar_rst        (JD+0.5, &observer,      &sun_day);
    98101        ln_get_solar_rst_horizon(JD+0.5, &observer, - 6, &sun_civil);
     
    119122        // case 1: sun-rise to sun-set  |  is_day && !is_night | set /rise
    120123        // case 2: sun-set  to midnight |  is_day &&  is_night | rise/set
    121 
     124        /*
    122125        if (is_day^is_night)
    123126        {
     
    129132            cout << "SunRise: " << fSunRiseDayTime << endl;
    130133            cout << "SunSet:  " << fSunSetDayTime  << endl;
    131         }
    132 
    133         //const double mjd = Time(JD-2400000.5).Mjd();
    134 
    135         int state = is_day^is_night ? 4 : 0;
     134        }*/
     135
     136        isday = is_day^is_night;
     137
     138        state = isday ? 4 : 0;
    136139        if (time>fSunSetDayTime)       state++;
    137140        if (time>fSunSetCivil)         state++;
     
    147150        {
    148151            "dark time",
    149             "astronomical twilight",
     152            "astron. twilight",
    150153            "civil twilight",
    151154            "sunrise",
     
    153156            "sunset",
    154157            "civil twilight",
    155             "astronomical twilight",
     158            "astron. twilight",
    156159            "dark time"
    157160        };
     
    159162        description = state[name];
    160163
    161 
    162         cout << "NOW: " << name[state] << " [" << state << "]" << endl << endl;
    163 
    164 /*
    165         // RA, DEC
    166         ln_get_lunar_equ_coords(JD, &moon_position);
    167         //cout << "MoonRa:  " << equ.ra  << "\n";
    168         //cout << "MoonDec: " << equ.dec << "\n";
    169 
    170         // lunar disk, phase and bright limb
    171         moon_disk = ln_get_lunar_disk(JD);
    172 
    173         if (JD>sun_dark.set || JD<sun_normal.rise)
    174         {
    175             cout << "Sunrise will be at:" << endl;
    176             cout << "Astronom. TwL: " << Time(sun_dark.rise        -2400000.5).GetAsStr() << endl;
    177             cout << "Civil     TwL: " << Time(sun_astronomical.rise-2400000.5).GetAsStr() << endl;
    178             cout << "Sunrise:       " << Time(sun_civil.rise       -2400000.5).GetAsStr() << endl;
    179             cout << "Day time:      " << Time(sun_normal.rise      -2400000.5).GetAsStr() << endl;
     164        string arr;
     165        ostringstream out;
     166        if (isday)
     167        {
     168            out << fSunSetDarkTime-time;
     169            arr = "&darr;";
    180170        }
    181171        else
    182172        {
    183             cout << "Sunset will be at:" << endl;
    184             cout << "Sunset:        " << Time(sun_normal.set      -2400000.5).GetAsStr() << endl;
    185             cout << "Civil     TwL: " << Time(sun_civil.set       -2400000.5).GetAsStr() << endl;
    186             cout << "Astronom. TwL: " << Time(sun_astronomical.set-2400000.5).GetAsStr() << endl;
    187             cout << "Dark time:     " << Time(sun_dark.set        -2400000.5).GetAsStr() << endl;
    188         }
    189 
    190         if (JD>moon.rise && JD<moon.set)
    191             cout << "Moon: VISIBLE (" << setprecision(2) <<  moon_disk*100 << "%)" << endl;
    192 
    193         if (JD<moon.rise)
    194             cout << "MoonRise: " << Time(moon.rise   -2400000.5) << endl;
    195         if (JD<moon.transit)
    196             cout << "MoonCulm: " << Time(moon.transit-2400000.5) << endl;
    197         if (JD<moon.set)
    198             cout << "MoonSet:  " << Time(moon.set    -2400000.5) << endl;
    199             */
    200         }
    201 
    202     /*
    203 
    204     Always show the next event:
    205 
    206     What do we have now?
    207     time between sunset and civil:        sunset
    208     time between civial and astronominal: civil
    209     time between astronominal and dark:   astronomical
    210     time above dark:                      dark
    211 
    212 
    213     */
    214 
     173            out << fSunRiseDayTime-time;
     174            arr = "&uarr;";
     175        }
     176
     177        description += " ["+out.str().substr(0, 5)+arr+"]";
     178
     179        switch (state)
     180        {
     181        case 0: case 1:  color = kHtmlGreen;   break;
     182        case 2: case 3:  color = kHtmlYellow;  break;
     183        case 4:          color = kHtmlRed;     break;
     184        case 5: case 6:  color = kHtmlYellow;  break;
     185        case 7: case 8:  color = kHtmlGreen;   break;
     186        }
     187    }
    215188};
    216189
     190class Moon
     191{
     192public:
     193    double ra;
     194    double dec;
     195
     196    double disk;
     197
     198    bool visible;
     199
     200    Time fMoonRise;
     201    Time fMoonTransit;
     202    Time fMoonSet;
     203
     204    string description;
     205    string color;
     206
     207    Time time;
     208
     209    Moon(double lon, double lat, const Time &t=Time()) : time(t)
     210    {
     211        const double JD = time.JD();
     212
     213        ln_lnlat_posn observer;
     214        observer.lng = lon;
     215        observer.lat = lat;
     216
     217        ln_rst_time moon;
     218        ln_get_lunar_rst(JD-0.5, &observer, &moon);
     219
     220        fMoonRise    = Time(moon.rise);
     221        fMoonTransit = Time(moon.transit);
     222        fMoonSet     = Time(moon.set);
     223
     224        visible =
     225            (JD>moon.rise && JD<moon.set  && moon.rise<moon.set) ||
     226            ((JD<moon.set  || JD>moon.rise) && moon.rise>moon.set);
     227
     228        const bool is_up      = JD>moon.rise;
     229        const bool is_sinking = JD>moon.transit;
     230        const bool is_dn      = JD>moon.set;
     231
     232        ln_get_lunar_rst(JD+0.5, &observer, &moon);
     233        if (is_up)
     234            fMoonRise = Time(moon.rise);
     235        if (is_sinking)
     236            fMoonTransit = Time(moon.transit);
     237        if (is_dn)
     238            fMoonSet = Time(moon.set);
     239
     240        ln_equ_posn pos;
     241        ln_get_lunar_equ_coords(JD, &pos);
     242
     243        ra  = pos.ra/15;
     244        dec = pos.dec;
     245
     246        disk = ln_get_lunar_disk(JD)*100;
     247
     248        if (!visible || disk<25)
     249            color = kHtmlGreen;
     250        else
     251            color = disk>75 ? kHtmlRed : kHtmlYellow;
     252
     253        string arr;
     254        ostringstream dt;
     255        if (fMoonSet<fMoonRise)
     256        {
     257            dt << fMoonSet-time;
     258            arr = "&darr;";
     259        }
     260        else
     261        {
     262            dt << fMoonRise-time;
     263            arr = "&uarr;";
     264        }
     265
     266        ostringstream out;
     267        out << setprecision(2);
     268        out << (visible?"visible ":"") << disk << "% [" << dt.str().substr(0,5) << arr << "]";
     269
     270        description = out.str();
     271    }
     272
     273    double Angle(double r, double d)
     274    {
     275        const double theta0 = M_PI/2-d*M_PI/180;
     276        const double phi0   = r*M_PI/12;
     277
     278        const double theta1 = M_PI/2-dec*M_PI/180;
     279        const double phi1   = ra*M_PI/12;
     280
     281        const double x0 = sin(theta0) * cos(phi0);
     282        const double y0 = sin(theta0) * sin(phi0);
     283        const double z0 = cos(theta0);
     284
     285        const double x1 = sin(theta1) * cos(phi1);
     286        const double y1 = sin(theta1) * sin(phi1);
     287        const double z1 = cos(theta1);
     288
     289        double arg = x0*x1 + y0*y1 + z0*z1;
     290        if(arg >  1.0) arg =  1.0;
     291        if(arg < -1.0) arg = -1.0;
     292
     293        return acos(arg) * 180/M_PI;
     294    }
     295};
     296
    217297#endif
    218298
    219299// ------------------------------------------------------------------------
    220300
    221 const static string kHtmlWhite  = "#ffffff";
    222 const static string kHtmlYellow = "#fffff0";
    223 const static string kHtmlRed    = "#fff8f0";
    224 const static string kHtmlGreen  = "#f0fff0";
    225 const static string kHtmlBlue   = "#f0f0ff";
    226301
    227302class StateMachineSmartFACT : public StateMachineDim, public DimInfoHandler
     
    594669        const uint16_t idx = uint16_t(floor(fmod(fMagicWeatherHist[kDir].back()+360+11.25, 360)/22.5));
    595670
     671        Astro astro(-(17.+53./60+26.525/3600), 28.+45./60+42.462/3600);
     672        Moon  moon(-(17.+53./60+26.525/3600), 28.+45./60+42.462/3600);
     673
    596674        ostringstream out;
    597675        out << d.time.JavaDate() << '\n';
     676        out << astro.color << '\t' << astro.description << '\n';
     677        out << setprecision(2);
     678        out << (astro.isday?kHtmlWhite:moon.color) << '\t' << moon.description << '\n';
     679        out << setprecision(3);
    598680        for (int i=0; i<6; i++)
    599681            out << "#ffffff\t" << fMagicWeatherHist[i].back() << '\n';
    600682        out << "#ffffff\t" << dir[idx] << '\n';
    601683
    602         //Astro a(-(17.+53./60+26.525/3600), 28.+45./60+42.462/3600);
    603 
    604684        ofstream(fPath+"/magicweather.txt") << out.str();
     685
     686        out.str("");
     687        out << astro.time.JavaDate() << '\n';
     688        out << kHtmlWhite << '\t' << astro.fSunRiseDarkTime.GetAsStr("%H:%M") << '\n';
     689        out << kHtmlWhite << '\t' << astro.fSunRiseAstronomical.GetAsStr("%H:%M") << '\n';
     690        out << kHtmlWhite << '\t' << astro.fSunRiseCivil.GetAsStr("%H:%M") << '\n';
     691        out << kHtmlWhite << '\t' << astro.fSunRiseDayTime.GetAsStr("%H:%M") << '\n';
     692
     693        out << kHtmlWhite << '\t' << astro.fSunSetDayTime.GetAsStr("%H:%M") << '\n';
     694        out << kHtmlWhite << '\t' << astro.fSunSetCivil.GetAsStr("%H:%M") << '\n';
     695        out << kHtmlWhite << '\t' << astro.fSunSetAstronomical.GetAsStr("%H:%M") << '\n';
     696        out << kHtmlWhite << '\t' << astro.fSunSetDarkTime.GetAsStr("%H:%M") << '\n';
     697
     698        out << kHtmlWhite << '\t' << moon.fMoonRise.GetAsStr("%H:%M") << '\n';
     699        out << kHtmlWhite << '\t' << moon.fMoonTransit.GetAsStr("%H:%M") << '\n';
     700        out << kHtmlWhite << '\t' << moon.fMoonSet.GetAsStr("%H:%M") << '\n';
     701
     702        ofstream(fPath+"/astro.txt") << out.str();
    605703
    606704        WriteWeather(d, "temp",  kTemp,   -5,   35);
     
    672770        out << d.time.JavaDate() << '\n';
    673771
    674         out << "#ffffff\t" << fDriveControlSourceName << '\n';
     772        out << kHtmlWhite << '\t' << fDriveControlSourceName << '\n';
    675773        out << setprecision(5);
    676         out << "#ffffff\t" << Ra  << '\n';
    677         out << "#ffffff\t" << Dec << '\n';
     774        out << kHtmlWhite << '\t' << Ra  << '\n';
     775        out << kHtmlWhite << '\t' << Dec << '\n';
    678776        out << setprecision(3);
    679         out << "#ffffff\t" << Zd  << '\n';
    680         out << "#ffffff\t" << Az  << '\n';
    681         out << "#ffffff\t" << dev << '\n';
     777        out << kHtmlWhite << '\t' << Zd  << '\n';
     778        out << kHtmlWhite << '\t' << Az  << '\n';
     779        out << kHtmlWhite << '\t' << dev << '\n';
     780
     781        Moon moon(-(17.+53./60+26.525/3600), 28.+45./60+42.462/3600);
     782        if (moon.visible)
     783        {
     784            const double angle = moon.Angle(Ra, Dec);
     785
     786            string col = kHtmlGreen;
     787            if (angle<35 || angle>145)
     788                col = kHtmlYellow;
     789            if (angle<25 || angle>155)
     790                col = kHtmlRed;
     791            out << col << '\t' << setprecision(3) << angle << '\n';
     792        }
     793        else
     794            out << kHtmlWhite << "\t&mdash; \n";
    682795
    683796        ofstream(fPath+"/tracking.txt") << out.str();
     
    13361449        {
    13371450            string col = kHtmlBlue;
     1451            /*
    13381452            if (fMcpConfigurationState!= 5 &&  // Idle
    13391453                fMcpConfigurationState!=11 &&  // Trigger On
    1340                 fMcpConfigurationState!=12)    // Taking Data
     1454                fMcpConfigurationState!=12)    // Taking Data*/
     1455            if (fDimMcp.state()!= 5 &&  // Idle
     1456                fDimMcp.state()!=11 &&  // Trigger On
     1457                fDimMcp.state()!=12)    // Taking Data
    13411458                col = kHtmlYellow;
    13421459            else
     
    13451462
    13461463            out << col << '\t';
    1347             /*
    1348              out << fDimRateControl.state() << "/";
    1349              out << fDimRateScan.state() << "/";
    1350              out << fMcpConfigurationState << "/";
    1351              */
    1352 
    1353             if (fDimRateControl.state()!=5 &&
    1354                 fDimRateScan.state()!=5)
     1464
     1465            if (fDimRateControl.state()!=5 && fDimRateScan.state()!=5)
    13551466            {
    1356                 if (fMcpConfigurationState!=5 &&
    1357                     fMcpConfigurationState!=11 &&
    1358                     fMcpConfigurationState!=12)
    1359                     out << "Configuring ";
    1360                 out << fMcpConfigurationName;
     1467                switch (fDimMcp.state()/*fMcpConfigurationState*/)
     1468                {
     1469                // kStateIdle
     1470                case  5: out << "Idle [" << fMcpConfigurationName << "]"; break;
     1471                // Configuring1 - Configuring3
     1472                case  7:
     1473                case  8:
     1474                case  9: out << "Configuring [" << fMcpConfigurationName << "]"; break;
     1475                // Configured
     1476                case 10: out << "Configured [" << fMcpConfigurationName << "]"; break;
     1477                // TriggerOn / Taking Data
     1478                case 11:
     1479                case 12: out << fMcpConfigurationName; break;
     1480                }
    13611481            }
    13621482            else
     
    13681488                        out << "Rate scan in progress";
    13691489
    1370             if (fDimMcp.state()>5 && fDimRateControl.state()!=5)
     1490            if (fDimMcp.state()>10 && fDimRateControl.state()!=5)
    13711491            {
    13721492                if (fMcpConfigurationMaxEvents>0 || fMcpConfigurationMaxTime>0 || fMcpConfigurationState==12)
Note: See TracChangeset for help on using the changeset viewer.