Ignore:
Timestamp:
05/23/12 17:06:08 (12 years ago)
Author:
tbretz
Message:
Adapted to the changes in the StateMachineDim. Now (almost) all received services are processed synchronously with the commands and (more important) with the Execute function.
File:
1 edited

Legend:

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

    r13820 r13838  
    1717
    1818#include "tools.h"
    19 #include "DimData.h"
    2019
    2120#include "LocalControl.h"
     
    3029
    3130#include "DimDescriptionService.h"
     31#include "DimState.h"
    3232
    3333// ------------------------------------------------------------------------
     
    305305// ========================================================================
    306306
    307 class DimState : public DimInfoHandler
    308 {
    309 protected:
    310     typedef function<void(const DimData &)> callback;
    311 
    312 public:
    313     DimState(const string &n, const string s="STATE") : server(n),
    314         info(make_pair(Time(), -4)),
    315         dim((n+"/"+s).c_str(), (void*)NULL, 0, this) { }
    316 
    317     string server;
    318     pair<Time, int> info;
    319     string msg;
    320 
    321     DimStampedInfo dim;
    322 
    323     callback fCallback;
    324 
    325     void SetCallback(const callback &cb)
    326     {
    327         fCallback = cb;
    328     }
    329 
    330     void infoHandler()
    331     {
    332         DimInfo *curr = getInfo(); // get current DimInfo address
    333         if (!curr || curr != &dim)
    334             return;
    335 
    336         const bool disconnected = dim.getSize()==0;
    337 
    338         // Make sure getTimestamp is called _before_ getTimestampMillisecs
    339         const int tsec = dim.getTimestamp();
    340         const int tms  = dim.getTimestampMillisecs();
    341 
    342         info = make_pair(Time(tsec, tms*1000),
    343                          disconnected ? -4 : dim.getQuality());
    344 
    345         msg = disconnected ? "" : dim.getString();
    346 
    347         if (fCallback)
    348             fCallback(DimData(curr));
    349     }
    350 
    351     const Time &time() const { return info.first; }
    352     const int  &state() const { return info.second; }
    353 
    354     bool online() const { return info.second>-4; }
    355 
    356     const string &name() const { return server; }
    357 };
    358 
    359 class DimVersion : public DimState
    360 {
    361 public:
    362     DimVersion() : DimState("DIS_DNS", "VERSION_NUMBER") { }
    363 
    364     void infoHandler()
    365     {
    366         DimInfo *curr = getInfo(); // get current DimInfo address
    367         if (!curr || curr != &dim)
    368             return;
    369 
    370         DimState::infoHandler();
    371 
    372         info.second = dim.getSize()==4 ? dim.getInt() : 0;
    373     }
    374 
    375     string version() const
    376     {
    377         if (info.second==0)
    378             return "Offline";
    379 
    380         ostringstream out;
    381         out << "V" << info.second/100 << 'r' << info.second%100;
    382         return out.str();
    383     }
    384 };
    385 
    386 class DimControl : public DimState
    387 {
    388     map<string, callback> fCallbacks;
    389 public:
    390     DimControl() : DimState("DIM_CONTROL") { }
    391 
    392     void AddCallback(const string &script, const callback &cb)
    393     {
    394         fCallbacks[script] = cb;
    395     }
    396 
    397     void infoHandler()
    398     {
    399         DimInfo *curr = getInfo(); // get current DimInfo address
    400         if (!curr || curr != &dim)
    401             return;
    402 
    403         DimState::infoHandler();
    404 
    405         // Evaluate msg
    406         const size_t p0 = msg.find_first_of(':');
    407         if (p0==string::npos)
    408             return;
    409 
    410         const size_t p1 = msg.find_last_of('[');
    411         if (p1==string::npos)
    412             return;
    413 
    414         const size_t p2 = msg.find_first_of(':', p0+1);
    415 
    416         const size_t p3 = p2==string::npos || p2>p1 ? p1-1 : p2;
    417 
    418         const string file = msg.substr(p0+2, p3-p0-2);
    419 
    420         const auto func = fCallbacks.find(file);
    421         if (func==fCallbacks.end())
    422             return;
    423 
    424         // Call callback
    425         func->second(DimData(curr));
    426     }
    427 };
    428 
    429 struct DimSubscriptions
    430 {
    431     DimServiceInfoList fNetwork;
    432 
    433     DimVersion fDNS;
    434     DimControl fControl;
    435     DimState   fMcp;
    436     DimState   fDataLogger;
    437     DimState   fDriveControl;
    438     DimState   fMagicWeather;
    439     DimState   fFeedback;
    440     DimState   fBiasControl;
    441     DimState   fFtmControl;
    442     DimState   fFadControl;
    443     DimState   fFscControl;
    444     DimState   fRateControl;
    445     DimState   fRateScan;
    446     DimState   fChatServer;
    447 
    448     DimStampedInfo fControlMessage;
    449 
    450     DimStampedInfo fMcpConfiguration;
    451 
    452     DimStampedInfo fDriveControlPointing;
    453     DimStampedInfo fDriveControlTracking;
    454     DimStampedInfo fDriveControlSource;
    455 
    456     DimStampedInfo fFscControlTemperature;
    457     DimStampedInfo fFscControlHumidity;
    458 
    459     DimStampedInfo fMagicWeatherData;
    460 
    461     DimStampedInfo fFeedbackDeviation;
    462     DimStampedInfo fFeedbackCalibration;
    463 
    464     DimStampedInfo fBiasControlVoltage;
    465     DimStampedInfo fBiasControlCurrent;
    466 
    467     DimStampedInfo fFadConnections;
    468     DimStampedInfo fFadEvents;
    469 
    470     DimStampedInfo fFtmControlTriggerRates;
    471     DimStampedInfo fFtmControlStaticData;
    472     DimStampedInfo fFtmControlFtuList;
    473 
    474     DimStampedInfo fRateScanData;
    475 
    476     DimStampedInfo fFadControlEventData;
    477 
    478     DimSubscriptions(DimInfoHandler *h) :
    479         fMcp                   ("MCP"),
    480         fDataLogger            ("DATA_LOGGER"),
    481         fDriveControl          ("DRIVE_CONTROL"),
    482         fMagicWeather          ("MAGIC_WEATHER"),
    483         fFeedback              ("FEEDBACK"),
    484         fBiasControl           ("BIAS_CONTROL"),
    485         fFtmControl            ("FTM_CONTROL"),
    486         fFadControl            ("FAD_CONTROL"),
    487         fFscControl            ("FSC_CONTROL"),
    488         fRateControl           ("RATE_CONTROL"),
    489         fRateScan              ("RATE_SCAN"),
    490         fChatServer            ("CHAT_SERVER"),
    491         //---
    492         fControlMessage        ("DIM_CONTROL/MESSAGE",             (void*)NULL, 0, h),
    493         //---
    494         fMcpConfiguration      ("MCP/CONFIGURATION",               (void*)NULL, 0, h),
    495         //---
    496         fDriveControlPointing  ("DRIVE_CONTROL/POINTING_POSITION", (void*)NULL, 0, h),
    497         fDriveControlTracking  ("DRIVE_CONTROL/TRACKING_POSITION", (void*)NULL, 0, h),
    498         fDriveControlSource    ("DRIVE_CONTROL/SOURCE_POSITION",   (void*)NULL, 0, h),
    499         //---
    500         fFscControlTemperature ("FSC_CONTROL/TEMPERATURE",         (void*)NULL, 0, h),
    501         fFscControlHumidity    ("FSC_CONTROL/HUMIDITY",            (void*)NULL, 0, h),
    502         //---
    503         fMagicWeatherData      ("MAGIC_WEATHER/DATA",              (void*)NULL, 0, h),
    504         //---
    505         fFeedbackDeviation     ("FEEDBACK/DEVIATION",              (void*)NULL, 0, h),
    506         fFeedbackCalibration   ("FEEDBACK/CALIBRATION",            (void*)NULL, 0, h),
    507         //---
    508         fBiasControlVoltage    ("BIAS_CONTROL/VOLTAGE",            (void*)NULL, 0, h),
    509         fBiasControlCurrent    ("BIAS_CONTROL/CURRENT",            (void*)NULL, 0, h),
    510         //---
    511         fFadConnections        ("FAD_CONTROL/CONNECTIONS",         (void*)NULL, 0, h),
    512         fFadEvents             ("FAD_CONTROL/EVENTS",              (void*)NULL, 0, h),
    513         //---
    514         fFtmControlTriggerRates("FTM_CONTROL/TRIGGER_RATES",       (void*)NULL, 0, h),
    515         fFtmControlStaticData  ("FTM_CONTROL/STATIC_DATA",         (void*)NULL, 0, h),
    516         fFtmControlFtuList     ("FTM_CONTROL/FTU_LIST",            (void*)NULL, 0, h),
    517         //---
    518         fRateScanData          ("RATE_SCAN/DATA",                  (void*)NULL, 0, h),
    519         //---
    520         fFadControlEventData   ("FAD_CONTROL/EVENT_DATA",          (void*)NULL, 0, h)
    521 
    522     {
    523     }
    524 
    525     const State GetState(const DimState &s) const
    526     {
    527         return fNetwork.GetState(s.name(), s.state());
    528     }
    529 };
    530 
    531 // ========================================================================
    532 // ========================================================================
    533 // ========================================================================
    534 
    535 
    536 class StateMachineSmartFACT : public StateMachineDim, public DimInfoHandler
     307class StateMachineSmartFACT : public StateMachineDim//, public DimInfoHandler
    537308{
    538309private:
     
    601372    // ------------- Initialize variables before the Dim stuff ------------
    602373
    603     DimSubscriptions *fDim;
     374    DimServiceInfoListImp fNetwork;
     375
     376    DimVersion fDimDNS;
     377    DimControl fDimControl;
     378    DimState   fDimMcp;
     379    DimState   fDimDataLogger;
     380    DimState   fDimDriveControl;
     381    DimState   fDimMagicWeather;
     382    DimState   fDimFeedback;
     383    DimState   fDimBiasControl;
     384    DimState   fDimFtmControl;
     385    DimState   fDimFadControl;
     386    DimState   fDimFscControl;
     387    DimState   fDimRateControl;
     388    DimState   fDimRateScan;
     389    DimState   fDimChatServer;
    604390
    605391    // -------------------------------------------------------------------
    606 
    607 
    608     // -------------------------------------------------------------------
    609 
     392/*
    610393    bool HandleService(DimInfo *curr, const DimInfo &service, void (StateMachineSmartFACT::*handle)(const DimData &))
    611394    {
     
    616399        return true;
    617400    }
    618 
    619 
    620     bool CheckDataSize(const DimData &d, const char *name, size_t size, bool min=false)
    621     {
    622         if ((!min && d.data.size()==size) || (min && d.data.size()>size))
     401*/
     402
     403    bool CheckDataSize(const EventImp &d, const char *name, size_t size, bool min=false)
     404    {
     405        if ((!min && d.GetSize()==size) || (min && d.GetSize()>size))
    623406            return true;
    624407
    625408        ostringstream msg;
    626         msg << name << " - Received service has " << d.data.size() << " bytes, but expected ";
     409        msg << name << " - Received service has " << d.GetSize() << " bytes, but expected ";
    627410        if (min)
    628411            msg << "more than ";
     
    636419
    637420    template<class T>
    638         void WriteBinary(const DimData &d, const string &fname, const T &t, double scale, double offset=0)
     421        void WriteBinary(const EventImp &d, const string &fname, const T &t, double scale, double offset=0)
    639422    {
    640423        vector<uint8_t> val(t.size(), 0);
     
    652435
    653436        ostringstream out;
    654         out << d.time.JavaDate() << '\n';
     437        out << d.GetJavaDate() << '\n';
    655438        out << offset << '\n';
    656439        out << offset+scale << '\n';
     
    695478    };
    696479
    697     void HandleControlMessageImp(const DimData &d)
    698     {
    699         if (d.size()==0)
     480    void HandleControlMessageImp(const EventImp &d)
     481    {
     482        if (d.GetSize()==0)
    700483            return;
    701484
    702485        const string str  = fControlMessageHist.size()>0 ? fControlMessageHist.back() : "<pre>  :  :  </pre> ";
    703         const string time = "<pre>"+d.time.GetAsStr("%H:%M:%S")+"</pre> ";
     486        const string time = "<pre>"+d.GetTimeAsStr("%H:%M:%S")+"</pre> ";
    704487
    705488        ostringstream tst;
    706         tst << d.qos;
     489        tst << d.GetQoS();
    707490
    708491        string msg;
    709492        msg += str.substr(0, time.length())==time ? "<pre>        </pre> " : time;
    710         msg += d.ptr<char>();
     493        msg += d.Ptr<char>();
    711494
    712495        fControlMessageHist.push_back(msg);
     
    714497        ostringstream out;
    715498        out << setprecision(3);
    716         out << d.time.JavaDate() << '\n';
     499        out << d.GetJavaDate() << '\n';
    717500        out << "#ffffff\t";
    718501
     
    725508    }
    726509
    727     void HandleControlMessage(const DimData &d)
    728     {
    729         if (d.qos==90)
     510    int HandleDimControlMessage(const EventImp &d)
     511    {
     512        if (d.GetQoS()==90)
    730513            HandleControlMessageImp(d);
    731     }
    732 
    733     void HandleControlStateChange(const DimData &d)
    734     {
    735         if (d.qos==-2)
     514
     515        return GetCurrentState();
     516    }
     517
     518    void HandleControlStateChange(const EventImp &d)
     519    {
     520        if (d.GetQoS()==-2)
    736521            fControlMessageHist.clear();
    737522
    738         if (d.qos<0)
     523        if (d.GetQoS()<0)
    739524            HandleControlMessageImp(d);
    740525    }
    741526
    742     void HandleMcpConfiguration(const DimData &d)
     527    int HandleMcpConfiguration(const EventImp &d)
    743528    {
    744529        if (!CheckDataSize(d, "Mcp:Configuration", 16, true))
    745             return;
    746 
    747         fMcpConfigurationState     = d.qos;
    748         fMcpConfigurationMaxTime   = d.get<uint64_t>();
    749         fMcpConfigurationMaxEvents = d.get<uint64_t>(8);
    750         fMcpConfigurationName      = d.ptr<char>(16);
    751 
    752         if (d.qos==12)
     530            return GetCurrentState();
     531
     532        fMcpConfigurationState     = d.GetQoS();
     533        fMcpConfigurationMaxTime   = d.Get<uint64_t>();
     534        fMcpConfigurationMaxEvents = d.Get<uint64_t>(8);
     535        fMcpConfigurationName      = d.Ptr<char>(16);
     536
     537        if (d.GetQoS()==12)
    753538            fMcpConfigurationRunStart = Time();
    754     }
    755 
    756     void WriteWeather(const DimData &d, const string &name, int i, float min, float max)
     539
     540        return GetCurrentState();
     541    }
     542
     543    void WriteWeather(const EventImp &d, const string &name, int i, float min, float max)
    757544    {
    758545        const Statistics stat(fMagicWeatherHist[i]);
     
    760547        ostringstream out;
    761548        out << setprecision(3);
    762         out << d.time.JavaDate() << '\n';
     549        out << d.GetJavaDate() << '\n';
    763550
    764551        out << "#ffffff\t" << fMagicWeatherHist[i].back() << '\n';
     
    772559    }
    773560
    774     void HandleMagicWeatherData(const DimData &d)
     561    int HandleMagicWeatherData(const EventImp &d)
    775562    {
    776563        if (!CheckDataSize(d, "MagicWeather:Data", 7*4+2))
    777             return;
     564            return GetCurrentState();
    778565
    779566        // Store a history of the last 300 entries
    780567        for (int i=kWeatherBegin; i<kWeatherEnd; i++)
    781568        {
    782             fMagicWeatherHist[i].push_back(d.ptr<float>(2)[i]);
     569            fMagicWeatherHist[i].push_back(d.Ptr<float>(2)[i]);
    783570            if (fMagicWeatherHist[i].size()>300)
    784571                fMagicWeatherHist[i].pop_front();
     
    801588
    802589        ostringstream out;
    803         out << d.time.JavaDate() << '\n';
     590        out << d.GetJavaDate() << '\n';
    804591        out << astro.color << '\t' << astro.description << '\n';
    805592        out << setprecision(2);
     
    836623        WriteWeather(d, "gusts", kGusts,   0,  100);
    837624        WriteWeather(d, "press", kPress, 700, 1000);
    838     }
    839 
    840     void HandleDriveControlPointing(const DimData &d)
     625
     626        return GetCurrentState();
     627    }
     628
     629    int HandleDrivePointing(const EventImp &d)
    841630    {
    842631        if (!CheckDataSize(d, "DriveControl:Pointing", 16))
    843             return;
    844 
    845         fDriveControlPointingZd = d.get<double>();
    846 
    847         const double az = d.get<double>(8);
     632            return GetCurrentState();
     633
     634        fDriveControlPointingZd = d.Get<double>();
     635
     636        const double az = d.Get<double>(8);
    848637
    849638        static const char *dir[] =
     
    859648
    860649        ostringstream out;
    861         out << d.time.JavaDate() << '\n';
     650        out << d.GetJavaDate() << '\n';
    862651
    863652        out << setprecision(5);
     
    866655
    867656        ofstream(fPath+"/drive-pointing.txt") << out.str();
    868     }
    869 
    870     void HandleDriveControlTracking(const DimData &d)
     657
     658        return GetCurrentState();
     659    }
     660
     661    int HandleDriveTracking(const EventImp &d)
    871662    {
    872663        if (!CheckDataSize(d, "DriveControl:Tracking", 56))
    873             return;
    874 
    875         const double Ra  = d.get<double>(0*8);
    876         const double Dec = d.get<double>(1*8);
    877         const double Zd  = d.get<double>(3*8);
    878         const double Az  = d.get<double>(4*8);
     664            return GetCurrentState();
     665
     666        const double Ra  = d.Get<double>(0*8);
     667        const double Dec = d.Get<double>(1*8);
     668        const double Zd  = d.Get<double>(3*8);
     669        const double Az  = d.Get<double>(4*8);
    879670
    880671        const double zd  = Zd                 * M_PI / 180;
    881         const double dzd = d.get<double>(5*8) * M_PI / 180;
    882         const double daz = d.get<double>(6*8) * M_PI / 180;
     672        const double dzd = d.Get<double>(5*8) * M_PI / 180;
     673        const double daz = d.Get<double>(6*8) * M_PI / 180;
    883674
    884675        // Correct:
     
    896687
    897688        ostringstream out;
    898         out << d.time.JavaDate() << '\n';
     689        out << d.GetJavaDate() << '\n';
    899690
    900691        out << kHtmlWhite << '\t' << fDriveControlSourceName << '\n';
     
    923714
    924715        ofstream(fPath+"/tracking.txt") << out.str();
    925     }
    926 
    927     void HandleDriveControlSource(const DimData &d)
     716
     717        return GetCurrentState();
     718    }
     719
     720    int HandleDriveSource(const EventImp &d)
    928721    {
    929722        if (!CheckDataSize(d, "DriveControl:Source", 7*4+2, true))
    930             return;
    931 
    932         const double *ptr = d.ptr<double>();
     723            return GetCurrentState();
     724
     725        const double *ptr = d.Ptr<double>();
    933726
    934727        const double ra   = ptr[0];  // Ra[h]
     
    937730        const double wang = ptr[5];  // Wobble angle  [deg]
    938731
    939         fDriveControlSourceName = d.ptr<char>(6*8);
     732        fDriveControlSourceName = d.Ptr<char>(6*8);
    940733
    941734        ostringstream out;
    942         out << d.time.JavaDate() << '\n';
     735        out << d.GetJavaDate() << '\n';
    943736
    944737        out << "#ffffff\t" << fDriveControlSourceName << '\n';
     
    951744
    952745        ofstream(fPath+"/source.txt") << out.str();
    953     }
    954 
    955     void HandleFeedbackCalibration(const DimData &d)
     746
     747        return GetCurrentState();
     748    }
     749
     750    int HandleFeedbackCalibration(const EventImp &d)
    956751    {
    957752        if (!CheckDataSize(d, "Feedback:Calibration", 3*4*416))
    958753        {
    959754            fFeedbackCalibration.clear();
    960             return;
    961         }
    962 
    963         const float *ptr = d.ptr<float>();
     755            return GetCurrentState();
     756        }
     757
     758        const float *ptr = d.Ptr<float>();
    964759        fFeedbackCalibration.assign(ptr+2*416, ptr+3*416);
    965     }
    966 
    967     void HandleFeedbackDeviation(const DimData &d)
     760
     761        return GetCurrentState();
     762    }
     763
     764    int HandleFeedbackDeviation(const EventImp &d)
    968765    {
    969766        if (!CheckDataSize(d, "Feedback:Deviation", 2*4*416+8))
    970             return;
    971 
    972         const float *ptr = d.ptr<float>();
     767            return GetCurrentState();
     768
     769        const float *ptr = d.Ptr<float>();
    973770        vector<float> dev(ptr+416, ptr+416+320);
    974771
     
    985782
    986783        ostringstream out;
    987         out << d.time.JavaDate() << '\n';
     784        out << d.GetJavaDate() << '\n';
    988785        out << kHtmlWhite << '\t' << fFeedbackUserOffset << '\n';
    989786        out << setprecision(3);
     
    994791        out << kHtmlWhite << '\t' << stat.max << '\n';
    995792        ofstream(fPath+"/feedback.txt") << out.str();
    996     }
    997 
    998     void HandleBiasControlVoltage(const DimData &d)
     793
     794        return GetCurrentState();
     795    }
     796
     797    int HandleBiasVoltage(const EventImp &d)
    999798    {
    1000799        if (!CheckDataSize(d, "BiasControl:Voltage", 1664))
    1001800        {
    1002801            fBiasControlVoltageVec.clear();
    1003             return;
    1004         }
    1005 
    1006         fBiasControlVoltageVec.assign(d.ptr<float>(), d.ptr<float>()+320);
     802            return GetCurrentState();
     803        }
     804
     805        fBiasControlVoltageVec.assign(d.Ptr<float>(), d.Ptr<float>()+320);
    1007806
    1008807        const Statistics stat(fBiasControlVoltageVec);
     
    1017816        }
    1018817
    1019         if (fDim->fBiasControl.state()==BIAS::kVoltageOn)
     818        if (fDimBiasControl.state()==BIAS::kVoltageOn)
    1020819            WriteBinary(d, "biascontrol-voltage", val, 10, 65);
    1021820        else
     
    1024823        ostringstream out;
    1025824        out << setprecision(3);
    1026         out << d.time.JavaDate() << '\n';
     825        out << d.GetJavaDate() << '\n';
    1027826        out << kHtmlWhite << '\t' << stat.min << '\n';
    1028827        out << kHtmlWhite << '\t' << stat.med << '\n';
     
    1031830        ofstream(fPath+"/voltage.txt") << out.str();
    1032831
    1033     }
    1034 
    1035     void HandleBiasControlCurrent(const DimData &d)
     832        return GetCurrentState();
     833    }
     834
     835    int HandleBiasCurrent(const EventImp &d)
    1036836    {
    1037837        if (!CheckDataSize(d, "BiasControl:Current", 832))
    1038             return;
     838            return GetCurrentState();
    1039839
    1040840        // Convert dac counts to uA
    1041841        vector<float> v(320);
    1042842        for (int i=0; i<320; i++)
    1043             v[i] = d.ptr<uint16_t>()[i] * 5000./4096;
     843            v[i] = d.Ptr<uint16_t>()[i] * 5000./4096;
    1044844
    1045845        const bool cal = fFeedbackCalibration.size()>0 && fBiasControlVoltageVec.size()>0;
     
    1136936        ostringstream out;
    1137937        out << setprecision(2);
    1138         out << d.time.JavaDate() << '\n';
     938        out << d.GetJavaDate() << '\n';
    1139939        out << col0 << '\t' << (cal?"yes":"no") << '\n';
    1140940        out << col1 << '\t' << stat.min << '\n';
     
    1144944        out << kHtmlWhite << '\t' << power_tot << "W [" << power_apd << "mW]\n";
    1145945        ofstream(fPath+"/current.txt") << out.str();
    1146     }
    1147 
    1148     void HandleFadEvents(const DimData &d)
     946
     947        return GetCurrentState();
     948    }
     949
     950    int HandleFadEvents(const EventImp &d)
    1149951    {
    1150952        if (!CheckDataSize(d, "FadControl:Events", 4*4))
    1151953        {
    1152954            fFadControlNumEvents = -1;
    1153             return;
    1154         }
    1155 
    1156         fFadControlNumEvents = d.get<uint32_t>();
    1157     }
    1158 
    1159     void HandleFadConnections(const DimData &d)
     955            return GetCurrentState();
     956        }
     957
     958        fFadControlNumEvents = d.Get<uint32_t>();
     959
     960        return GetCurrentState();
     961    }
     962
     963    int HandleFadConnections(const EventImp &d)
    1160964    {
    1161965        if (!CheckDataSize(d, "FadControl:Connections", 41))
    1162966        {
    1163967            //fStatusEventBuilderLabel->setText("Offline");
    1164             return;
     968            return GetCurrentState();
    1165969        }
    1166970
    1167971        string rc(40, '-'); // orange/red [45]
    1168972
    1169         const uint8_t *ptr = d.ptr<uint8_t>();
     973        const uint8_t *ptr = d.Ptr<uint8_t>();
    1170974
    1171975        int c[4] = { '.', '.', '.', '.' };
     
    11981002        ostringstream out;
    11991003        out << setprecision(3);
    1200         out << d.time.JavaDate() << '\n';
     1004        out << d.GetJavaDate() << '\n';
    12011005        out << col[0] << '\t' << rc.substr( 0, 10) << '\n';
    12021006        out << col[1] << '\t' << rc.substr(10, 10) << '\n';
     
    12041008        out << col[3] << '\t' << rc.substr(30, 10) << '\n';
    12051009        ofstream(fPath+"/fad.txt") << out.str();
    1206     }
    1207 
    1208     void HandleFtmControlTriggerRates(const DimData &d)
     1010
     1011        return GetCurrentState();
     1012    }
     1013
     1014    int HandleFtmTriggerRates(const EventImp &d)
    12091015    {
    12101016        if (!CheckDataSize(d, "FtmControl:TriggerRates", 24+160+640+8))
    1211             return;
     1017            return GetCurrentState();
    12121018
    12131019        // New run started
    1214         if (d.get<float>(20)<0)
    1215             return;
    1216 
    1217         fFtmControlTriggerRateCam = d.get<float>(20);
    1218 
    1219         const float *brates = d.ptr<float>(24);     // Board rate
    1220         const float *prates = d.ptr<float>(24+160); // Patch rate
     1020        if (d.Get<float>(20)<0)
     1021            return GetCurrentState();
     1022
     1023        fFtmControlTriggerRateCam = d.Get<float>(20);
     1024
     1025        const float *brates = d.Ptr<float>(24);     // Board rate
     1026        const float *prates = d.Ptr<float>(24+160); // Patch rate
    12211027
    12221028        // Store a history of the last 60 entries
     
    12361042        ostringstream out;
    12371043        out << setprecision(3);
    1238         out << d.time.JavaDate() << '\n';
     1044        out << d.GetJavaDate() << '\n';
    12391045        out << "#ffffff\t" << fFtmControlTriggerRateCam << '\n';
    12401046
     
    12451051
    12461052        out.str("");
    1247         out << d.time.JavaDate() << '\n';
     1053        out << d.GetJavaDate() << '\n';
    12481054        out << kHtmlWhite << '\t' << bstat.min << '\n';
    12491055        out << kHtmlWhite << '\t' << bstat.med << '\n';
     
    12531059
    12541060        out.str("");
    1255         out << d.time.JavaDate() << '\n';
     1061        out << d.GetJavaDate() << '\n';
    12561062        out << kHtmlWhite << '\t' << pstat.min << '\n';
    12571063        out << kHtmlWhite << '\t' << pstat.med << '\n';
     
    12591065        out << kHtmlWhite << '\t' << pstat.max << '\n';
    12601066        ofstream(fPath+"/patchrates.txt") << out.str();
    1261     }
    1262 
    1263     void HandleFtmControlStaticData(const DimData &d)
     1067
     1068        return GetCurrentState();
     1069    }
     1070
     1071    int HandleFtmStaticData(const EventImp &d)
    12641072    {
    12651073        if (!CheckDataSize(d, "FtmControl:StaticData", 740))
    1266             return;
    1267 
    1268         const uint16_t *ptr = d.ptr<uint16_t>(260);
     1074            return GetCurrentState();
     1075
     1076        const uint16_t *ptr = d.Ptr<uint16_t>(260);
    12691077        vector<uint16_t> vec(ptr, ptr+160);
    12701078
     
    12741082
    12751083        ostringstream out;
    1276         out << d.time.JavaDate() << '\n';
     1084        out << d.GetJavaDate() << '\n';
    12771085        out << kHtmlWhite << '\t' << stat.min << '\n';
    12781086        out << kHtmlWhite << '\t' << stat.med << '\n';
     
    12801088        out << kHtmlWhite << '\t' << stat.max << '\n';
    12811089        ofstream(fPath+"/thresholds.txt") << out.str();
    1282     }
    1283 
    1284     void HandleFtmControlFtuList(const DimData &d)
     1090
     1091        return GetCurrentState();
     1092    }
     1093
     1094    int HandleFtmFtuList(const EventImp &d)
    12851095    {
    12861096        if (!CheckDataSize(d, "FtmControl:FtuList", sizeof(FTM::DimFtuList)))
    1287             return;
    1288 
    1289         const FTM::DimFtuList &sdata = d.ref<FTM::DimFtuList>();
     1097            return GetCurrentState();
     1098
     1099        const FTM::DimFtuList &sdata = d.Ref<FTM::DimFtuList>();
    12901100
    12911101        ostringstream out;
    1292         out << d.time.JavaDate() << '\n';
     1102        out << d.GetJavaDate() << '\n';
    12931103
    12941104        int cnt = 0;
     
    13151125
    13161126        ofstream(fPath+"/ftu.txt") << out.str();
    1317     }
    1318 
    1319     void HandleFadControlEventData(const DimData &d)
     1127
     1128        return GetCurrentState();
     1129    }
     1130
     1131    int HandleFadEventData(const EventImp &d)
    13201132    {
    13211133        if (!CheckDataSize(d, "FadControl:EventData", 23040))
    1322             return;
    1323 
    1324         //const float *avg = d.ptr<float>();
    1325         //const float *rms = d.ptr<float>(1440*sizeof(float));
    1326         const float *dat = d.ptr<float>(1440*sizeof(float)*2);
    1327         //const float *pos = d.ptr<float>(1440*sizeof(float)*3);
     1134            return GetCurrentState();
     1135
     1136        //const float *avg = d.Ptr<float>();
     1137        //const float *rms = d.Ptr<float>(1440*sizeof(float));
     1138        const float *dat = d.Ptr<float>(1440*sizeof(float)*2);
     1139        //const float *pos = d.Ptr<float>(1440*sizeof(float)*3);
    13281140
    13291141        vector<float> max(320, -2);
     
    13391151        }
    13401152
    1341         switch (d.qos)
     1153        switch (d.GetQoS())
    13421154        {
    13431155        case 0:  WriteBinary(d, "fadcontrol-eventdata", max, 2,   -1); break;
     
    13451157        default: WriteBinary(d, "fadcontrol-eventdata", max, 0.25, 0); break;
    13461158        }
    1347     }
    1348 
    1349     void HandleFscControlTemperature(const DimData &d)
     1159
     1160        return GetCurrentState();
     1161    }
     1162
     1163    int HandleFscTemperature(const EventImp &d)
    13501164    {
    13511165        if (!CheckDataSize(d, "FscControl:Temperature", 240))
    1352             return;
    1353 
    1354         const float *ptr = d.ptr<float>(4);
     1166            return GetCurrentState();
     1167
     1168        const float *ptr = d.Ptr<float>(4);
    13551169
    13561170        double avg =   0;
     
    13911205        ostringstream out;
    13921206        out << setprecision(3);
    1393         out << d.time.JavaDate() << '\n';
     1207        out << d.GetJavaDate() << '\n';
    13941208        out << "#ffffff\t" << fFscControlHumidityAvg << '\n';
    13951209        out << "#ffffff\t" << min      << '\n';
     
    14041218        WriteBinary(d, "fsccontrol-temperature-hist",
    14051219                    fFscControlTemperatureHist, 10);
    1406     }
    1407 
    1408     void HandleFscControlHumidity(const DimData &d)
     1220
     1221        return GetCurrentState();
     1222    }
     1223
     1224    int HandleFscHumidity(const EventImp &d)
    14091225    {
    14101226        if (!CheckDataSize(d, "FscControl:Humidity", 5*4))
    1411             return;
    1412 
    1413         const float *ptr = d.ptr<float>(4);
     1227            return GetCurrentState();
     1228
     1229        const float *ptr = d.Ptr<float>(4);
    14141230
    14151231        double avg =   0;
     
    14241240
    14251241        fFscControlHumidityAvg = avg/num;
    1426     }
    1427 
    1428     void HandleRateScanData(const DimData &d)
     1242
     1243        return GetCurrentState();
     1244    }
     1245
     1246    int HandleRateScanData(const EventImp &d)
    14291247    {
    14301248        if (!CheckDataSize(d, "RateScan:Data", 824))
    1431             return;
    1432 
    1433         const uint64_t id   = d.get<uint64_t>();
    1434         const float   *rate = d.ptr<float>(20);
     1249            return GetCurrentState();
     1250
     1251        const uint64_t id   = d.Get<uint64_t>();
     1252        const float   *rate = d.Ptr<float>(20);
    14351253
    14361254        if (fRateScanDataId!=id)
     
    14581276        ostringstream out;
    14591277        out << setprecision(3);
    1460         out << d.time.JavaDate() << '\n';
     1278        out << d.GetJavaDate() << '\n';
    14611279        out << "#ffffff\t" << pow(10, fRateScanDataHist[0].back()) << '\n';
    14621280        out << "#ffffff\t" << max << '\n';
     
    14651283
    14661284        out.str("");
    1467         out << d.time.JavaDate() << '\n';
     1285        out << d.GetJavaDate() << '\n';
    14681286        out << "#ffffff\t" << int(fRateScanBoard) << '\n';
    14691287        out << "#ffffff\t" << pow(10, fRateScanDataHist[fRateScanBoard+1].back()) << '\n';
    14701288
    14711289        ofstream(fPath+"/ratecan_board.txt") << out.str();
     1290
     1291        return GetCurrentState();
    14721292    }
    14731293
    14741294    // -------------------------------------------------------------------
    14751295
    1476     void HandleDoTest(const DimData &d)
     1296    void HandleDoTest(const EventImp &d)
    14771297    {
    14781298        ostringstream out;
    1479         out << d.time.JavaDate() << '\t' << fDim->fControl.online() << '\n';
    1480         switch (d.qos)
     1299        out << d.GetJavaDate() << '\t' << fDimControl.online() << '\n';
     1300        switch (d.GetQoS())
    14811301        {
    14821302        case -3: out << kHtmlWhite << "\tNot running\n";               break;
    14831303        case -2: out << kHtmlBlue  << "\tLoading\n";                   break;
    14841304        case -1: out << kHtmlBlue  << "\tStarted\n";                   break;
    1485         default: out << kHtmlGreen << "\tRunning [" << d.qos << "]\n"; break;
     1305        default: out << kHtmlGreen << "\tRunning [" << d.GetQoS() << "]\n"; break;
    14861306        }
    14871307
     
    14901310
    14911311    // -------------------------------------------------------------------
    1492 
    1493     void infoHandler()
    1494     {
    1495         DimInfo *curr = getInfo(); // get current DimInfo address
    1496         if (!curr)
    1497             return;
    1498 
    1499         if (HandleService(curr, fDim->fMcpConfiguration,       &StateMachineSmartFACT::HandleMcpConfiguration))
    1500             return;
    1501         if (HandleService(curr, fDim->fMagicWeatherData,       &StateMachineSmartFACT::HandleMagicWeatherData))
    1502             return;
    1503         if (HandleService(curr, fDim->fDriveControlPointing,   &StateMachineSmartFACT::HandleDriveControlPointing))
    1504             return;
    1505         if (HandleService(curr, fDim->fDriveControlTracking,   &StateMachineSmartFACT::HandleDriveControlTracking))
    1506             return;
    1507         if (HandleService(curr, fDim->fDriveControlSource,     &StateMachineSmartFACT::HandleDriveControlSource))
    1508             return;
    1509         if (HandleService(curr, fDim->fFeedbackDeviation,      &StateMachineSmartFACT::HandleFeedbackDeviation))
    1510             return;
    1511         if (HandleService(curr, fDim->fFeedbackCalibration,    &StateMachineSmartFACT::HandleFeedbackCalibration))
    1512             return;
    1513         if (HandleService(curr, fDim->fBiasControlVoltage,     &StateMachineSmartFACT::HandleBiasControlVoltage))
    1514             return;
    1515         if (HandleService(curr, fDim->fBiasControlCurrent,     &StateMachineSmartFACT::HandleBiasControlCurrent))
    1516             return;
    1517         if (HandleService(curr, fDim->fFadConnections,         &StateMachineSmartFACT::HandleFadConnections))
    1518             return;
    1519         if (HandleService(curr, fDim->fFadEvents,              &StateMachineSmartFACT::HandleFadEvents))
    1520             return;
    1521         if (HandleService(curr, fDim->fFtmControlTriggerRates, &StateMachineSmartFACT::HandleFtmControlTriggerRates))
    1522             return;
    1523         if (HandleService(curr, fDim->fFtmControlStaticData,   &StateMachineSmartFACT::HandleFtmControlStaticData))
    1524             return;
    1525         if (HandleService(curr, fDim->fFtmControlFtuList,      &StateMachineSmartFACT::HandleFtmControlFtuList))
    1526             return;
    1527         if (HandleService(curr, fDim->fFadControlEventData,    &StateMachineSmartFACT::HandleFadControlEventData))
    1528             return;
    1529         if (HandleService(curr, fDim->fFscControlTemperature,  &StateMachineSmartFACT::HandleFscControlTemperature))
    1530             return;
    1531         if (HandleService(curr, fDim->fFscControlHumidity,     &StateMachineSmartFACT::HandleFscControlHumidity))
    1532             return;
    1533         if (HandleService(curr, fDim->fControlMessage,         &StateMachineSmartFACT::HandleControlMessage))
    1534             return;
    1535         if (HandleService(curr, fDim->fRateScanData,           &StateMachineSmartFACT::HandleRateScanData))
    1536             return;
    1537     }
    15381312
    15391313    bool CheckEventSize(size_t has, const char *name, size_t size)
     
    15481322    }
    15491323
     1324    const State GetState(const DimState &s) const
     1325    {
     1326        return fNetwork.GetState(s.name(), s.state());
     1327    }
     1328
    15501329    void PrintState(const DimState &state) const
    15511330    {
    1552         const State rc = fDim->GetState(state);
     1331        const State rc = GetState(state);
    15531332
    15541333        Out() << state.time().GetAsStr("%H:%M:%S.%f").substr(0, 12) << " - ";
     
    15681347    int Print() const
    15691348    {
    1570         Out() << fDim->fDNS.time().GetAsStr("%H:%M:%S.%f").substr(0, 12) << " - ";
    1571         Out() << kBold << "DIM_DNS: " << fDim->fDNS.version() << endl;
    1572 
    1573         PrintState(fDim->fMcp);
    1574         PrintState(fDim->fControl);
    1575         PrintState(fDim->fDataLogger);
    1576         PrintState(fDim->fDriveControl);
    1577         PrintState(fDim->fFadControl);
    1578         PrintState(fDim->fFtmControl);
    1579         PrintState(fDim->fBiasControl);
    1580         PrintState(fDim->fFeedback);
    1581         PrintState(fDim->fRateControl);
    1582         PrintState(fDim->fFscControl);
    1583         PrintState(fDim->fMagicWeather);
    1584         PrintState(fDim->fRateScan);
    1585         PrintState(fDim->fChatServer);
     1349        Out() << fDimDNS.time().GetAsStr("%H:%M:%S.%f").substr(0, 12) << " - ";
     1350        Out() << kBold << "DIM_DNS: " << fDimDNS.version() << endl;
     1351
     1352        PrintState(fDimMcp);
     1353        PrintState(fDimControl);
     1354        PrintState(fDimDataLogger);
     1355        PrintState(fDimDriveControl);
     1356        PrintState(fDimFadControl);
     1357        PrintState(fDimFtmControl);
     1358        PrintState(fDimBiasControl);
     1359        PrintState(fDimFeedback);
     1360        PrintState(fDimRateControl);
     1361        PrintState(fDimFscControl);
     1362        PrintState(fDimMagicWeather);
     1363        PrintState(fDimRateScan);
     1364        PrintState(fDimChatServer);
    15861365
    15871366        return GetCurrentState();
     
    15931372            return kHtmlWhite+"\t&mdash;\n";
    15941373
    1595         if (&state==&fDim->fControl)
     1374        if (&state==&fDimControl)
    15961375        {
    15971376            ostringstream out;
     
    16001379        }
    16011380
    1602         const State rc = fDim->GetState(state);
     1381        const State rc = GetState(state);
    16031382
    16041383        // Sate not found in list, server online (-3: offline; -2: not found)
     
    16301409        //poll_one();
    16311410
    1632         if (fDim->fDNS.state()==0)
     1411        if (fDimDNS.state()==0)
    16331412            return kStateDimNetworkNA;
    16341413
     
    16401419
    16411420        ostringstream out;
    1642         out << now.JavaDate() << '\t' << fDim->fControl.online() << '\n';
     1421        out << now.JavaDate() << '\t' << fDimControl.online() << '\n';
    16431422        out << setprecision(3);
    16441423
    16451424        // -------------- System status --------------
    1646         if (fDim->fMcp.state()>=5) // Idle
     1425        if (fDimMcp.state()>=5) // Idle
    16471426        {
    16481427            string col = kHtmlBlue;
     
    16511430                fMcpConfigurationState!=11 &&  // Trigger On
    16521431                fMcpConfigurationState!=12)    // Taking Data*/
    1653             if (fDim->fMcp.state()!= 5 &&  // Idle
    1654                 fDim->fMcp.state()!=11 &&  // Trigger On
    1655                 fDim->fMcp.state()!=12)    // Taking Data
     1432            if (fDimMcp.state()!= 5 &&  // Idle
     1433                fDimMcp.state()!=11 &&  // Trigger On
     1434                fDimMcp.state()!=12)    // Taking Data
    16561435                col = kHtmlYellow;
    16571436            else
    1658                 if (fDim->fFadControl.state()==FAD::kWritingData)
     1437                if (fDimFadControl.state()==FAD::kWritingData)
    16591438                    col = kHtmlGreen;
    16601439
    16611440            out << col << '\t';
    16621441
    1663             if (fDim->fRateControl.state()!=5 && fDim->fRateScan.state()!=5)
     1442            if (fDimRateControl.state()!=5 && fDimRateScan.state()!=5)
    16641443            {
    1665                 switch (fDim->fMcp.state()/*fMcpConfigurationState*/)
     1444                switch (fDimMcp.state()/*fMcpConfigurationState*/)
    16661445                {
    16671446                // kStateIdle
     
    16791458            }
    16801459            else
    1681                 if (fDim->fRateControl.state()==5/*kStateSettingGlobalThreshold*/)
     1460                if (fDimRateControl.state()==5/*kStateSettingGlobalThreshold*/)
    16821461                    out << "Calibrating threshold";
    16831462                else
    16841463
    1685                     if (fDim->fRateScan.state()==5/*kStateSettingGlobalThreshold*/)
     1464                    if (fDimRateScan.state()==5/*kStateSettingGlobalThreshold*/)
    16861465                        out << "Rate scan in progress";
    16871466
    1688             if (fDim->fMcp.state()>10 && fDim->fRateControl.state()!=5)
     1467            if (fDimMcp.state()>10 && fDimRateControl.state()!=5)
    16891468            {
    16901469                if (fMcpConfigurationMaxEvents>0 || fMcpConfigurationMaxTime>0 || fMcpConfigurationState==12)
     
    17321511
    17331512        // ------------------ Drive -----------------
    1734         if (fDim->fDriveControl.state()>=5)   // Armed, Moving, Tracking
     1513        if (fDimDriveControl.state()>=5)   // Armed, Moving, Tracking
    17351514        {
    17361515            const double dev = fDriveControlTrackingDevHist.size()>0 ? fDriveControlTrackingDevHist.back() : 0;
    1737             const State rc = fDim->GetState(fDim->fDriveControl);
     1516            const State rc = GetState(fDimDriveControl);
    17381517            string col = kHtmlGreen;
    17391518            if (rc.index==6) // Moving
     
    17531532            out << fDriveControlPointingZd  << '\t';
    17541533            out << fDriveControlPointingAz  << '\t';
    1755             if (fDim->fDriveControl.state()==7)
     1534            if (fDimDriveControl.state()==7)
    17561535            {
    17571536                out << fDriveControlSourceName  << '\t';
     
    17671546
    17681547        // ------------------- FSC ------------------
    1769         if (fDim->fFscControl.state()>1 && fFscControlTemperatureHist.size()>0)
     1548        if (fDimFscControl.state()>1 && fFscControlTemperatureHist.size()>0)
    17701549        {
    17711550            out << kHtmlGreen << '\t' << fFscControlTemperatureHist.back() << '\n';
     
    17751554
    17761555        // --------------- MagicWeather -------------
    1777         if (fDim->fMagicWeather.state()==3 && fMagicWeatherHist[kWeatherBegin].size()>0)
     1556        if (fDimMagicWeather.state()==3 && fMagicWeatherHist[kWeatherBegin].size()>0)
    17781557        {
    17791558            /*
     
    18041583
    18051584        // --------------- FtmControl -------------
    1806         if (fDim->fFtmControl.state()==FTM::kTriggerOn)
     1585        if (fDimFtmControl.state()==FTM::kTriggerOn)
    18071586        {
    18081587            string col = kHtmlGreen;
     
    18181597
    18191598        // --------------- BiasControl -------------
    1820         if (fDim->fBiasControl.state()==BIAS::kRamping     ||
    1821             fDim->fBiasControl.state()==BIAS::kOverCurrent ||
    1822             fDim->fBiasControl.state()==BIAS::kVoltageOn   ||
    1823             fDim->fBiasControl.state()==BIAS::kVoltageOff)
    1824         {
    1825             const bool off = fDim->fBiasControl.state()==BIAS::kVoltageOff;
    1826             const bool oc  = fDim->fBiasControl.state()==BIAS::kOverCurrent;
     1599        if (fDimBiasControl.state()==BIAS::kRamping     ||
     1600            fDimBiasControl.state()==BIAS::kOverCurrent ||
     1601            fDimBiasControl.state()==BIAS::kVoltageOn   ||
     1602            fDimBiasControl.state()==BIAS::kVoltageOff)
     1603        {
     1604            const bool off = fDimBiasControl.state()==BIAS::kVoltageOff;
     1605            const bool oc  = fDimBiasControl.state()==BIAS::kOverCurrent;
    18271606
    18281607            string col = fBiasControlVoltageMed>3?kHtmlGreen:kHtmlWhite;
     
    18331612
    18341613            // Bias in overcurrent => Red
    1835             if (fDim->fBiasControl.state()==BIAS::kOverCurrent)
     1614            if (fDimBiasControl.state()==BIAS::kOverCurrent)
    18361615                col = kHtmlRed;
    18371616
    18381617            // MCP in ReadyForDatataking/Configuring/Configured/TriggerOn/TakingData
    18391618            // and Bias not in "data-taking state' => Red
    1840             if (fDim->fMcp.state()>5 &&
    1841                 fDim->fBiasControl.state()!=BIAS::kVoltageOn &&
    1842                 fDim->fBiasControl.state()!=BIAS::kVoltageOff)
     1619            if (fDimMcp.state()>5 &&
     1620                fDimBiasControl.state()!=BIAS::kVoltageOn &&
     1621                fDimBiasControl.state()!=BIAS::kVoltageOff)
    18431622                col = kHtmlRed;
    18441623
     
    18461625
    18471626            // Feedback is currently calibrating => Blue
    1848             if (fDim->fFeedback.state()==13)
     1627            if (fDimFeedback.state()==13)
    18491628            {
    18501629                out << kHtmlBlue << '\t';
     
    18821661
    18831662        out.str("");
    1884         out << now.JavaDate() << '\t' << fDim->fControl.online() << '\n';
    1885 
    1886         if (fDim->fDNS.state()==0)
     1663        out << now.JavaDate() << '\t' << fDimControl.online() << '\n';
     1664
     1665        if (fDimDNS.state()==0)
    18871666            out << kHtmlWhite << "\tOffline\n\n\n\n\n\n\n\n\n\n\n\n";
    18881667        else
    18891668        {
    1890             out << kHtmlGreen << '\t' << fDim->fDNS.version() << '\n';
    1891 
    1892             out << GetStateHtml(fDim->fMcp,          4);
    1893             out << GetStateHtml(fDim->fControl,      0);
    1894             out << GetStateHtml(fDim->fDataLogger,   1);
    1895             out << GetStateHtml(fDim->fDriveControl, 2);
    1896             out << GetStateHtml(fDim->fFadControl,   FAD::kConnected);
    1897             out << GetStateHtml(fDim->fFtmControl,   FTM::kConnected);
    1898             out << GetStateHtml(fDim->fBiasControl,  BIAS::kConnected);
    1899             out << GetStateHtml(fDim->fFeedback,     4);
    1900             out << GetStateHtml(fDim->fRateControl,  4);
    1901             out << GetStateHtml(fDim->fFscControl,   2);
    1902             out << GetStateHtml(fDim->fMagicWeather, 2);
    1903             out << GetStateHtml(fDim->fRateScan,     4);
    1904             out << GetStateHtml(fDim->fChatServer,   1);
     1669            out << kHtmlGreen << '\t' << fDimDNS.version() << '\n';
     1670
     1671            out << GetStateHtml(fDimMcp,          4);
     1672            out << GetStateHtml(fDimControl,      0);
     1673            out << GetStateHtml(fDimDataLogger,   1);
     1674            out << GetStateHtml(fDimDriveControl, 2);
     1675            out << GetStateHtml(fDimFadControl,   FAD::kConnected);
     1676            out << GetStateHtml(fDimFtmControl,   FTM::kConnected);
     1677            out << GetStateHtml(fDimBiasControl,  BIAS::kConnected);
     1678            out << GetStateHtml(fDimFeedback,     4);
     1679            out << GetStateHtml(fDimRateControl,  4);
     1680            out << GetStateHtml(fDimFscControl,   2);
     1681            out << GetStateHtml(fDimMagicWeather, 2);
     1682            out << GetStateHtml(fDimRateScan,     4);
     1683            out << GetStateHtml(fDimChatServer,   1);
    19051684        }
    19061685
     
    19091688        return kStateRunning;
    19101689    }
     1690
    19111691
    19121692public:
     
    19181698        fRateScanDataId(0),
    19191699        fRateScanBoard(0),
    1920         fDim(0)
    1921     {
     1700        // ---
     1701        fDimMcp         ("MCP"),
     1702        fDimDataLogger  ("DATA_LOGGER"),
     1703        fDimDriveControl("DRIVE_CONTROL"),
     1704        fDimMagicWeather("MAGIC_WEATHER"),
     1705        fDimFeedback    ("FEEDBACK"),
     1706        fDimBiasControl ("BIAS_CONTROL"),
     1707        fDimFtmControl  ("FTM_CONTROL"),
     1708        fDimFadControl  ("FAD_CONTROL"),
     1709        fDimFscControl  ("FSC_CONTROL"),
     1710        fDimRateControl ("RATE_CONTROL"),
     1711        fDimRateScan    ("RATE_SCAN"),
     1712        fDimChatServer  ("CHAT_SERVER")
     1713    {
     1714        fDimMcp.Subscribe(*this);
     1715        fDimDataLogger.Subscribe(*this);
     1716        fDimDriveControl.Subscribe(*this);
     1717        fDimMagicWeather.Subscribe(*this);
     1718        fDimFeedback.Subscribe(*this);
     1719        fDimBiasControl.Subscribe(*this);
     1720        fDimFtmControl.Subscribe(*this);
     1721        fDimFadControl.Subscribe(*this);
     1722        fDimFscControl.Subscribe(*this);
     1723        fDimRateControl.Subscribe(*this);
     1724        fDimRateScan.Subscribe(*this);
     1725        fDimChatServer.Subscribe(*this);
     1726
     1727        Subscribe("DIM_CONTROL/MESSAGE")
     1728            (bind(&StateMachineSmartFACT::HandleDimControlMessage,  this, placeholders::_1));
     1729
     1730        Subscribe("MCP/CONFIGURATION")
     1731            (bind(&StateMachineSmartFACT::HandleMcpConfiguration,   this, placeholders::_1));
     1732
     1733        Subscribe("DRIVE_CONTROL/POINTING_POSITION")
     1734            (bind(&StateMachineSmartFACT::HandleDrivePointing,      this, placeholders::_1));
     1735        Subscribe("DRIVE_CONTROL/TRACKING_POSITION")
     1736            (bind(&StateMachineSmartFACT::HandleDriveTracking,      this, placeholders::_1));
     1737        Subscribe("DRIVE_CONTROL/SOURCE_POSITION")
     1738            (bind(&StateMachineSmartFACT::HandleDriveSource,        this, placeholders::_1));
     1739
     1740        Subscribe("FSC_CONTROL/TEMPERATURE")
     1741            (bind(&StateMachineSmartFACT::HandleFscTemperature,     this, placeholders::_1));
     1742        Subscribe("FSC_CONTROL/HUMIDITY")
     1743            (bind(&StateMachineSmartFACT::HandleFscHumidity,        this, placeholders::_1));
     1744
     1745        Subscribe("MAGIC_WEATHER/DATA")
     1746            (bind(&StateMachineSmartFACT::HandleMagicWeatherData,   this, placeholders::_1));
     1747
     1748        Subscribe("FEEDBACK/DEVIATION")
     1749            (bind(&StateMachineSmartFACT::HandleFeedbackDeviation,   this, placeholders::_1));
     1750        Subscribe("FEEDBACK/CALIBRATION")
     1751            (bind(&StateMachineSmartFACT::HandleFeedbackCalibration, this, placeholders::_1));
     1752
     1753        Subscribe("BIAS_CONTROL/VOLTAGE")
     1754            (bind(&StateMachineSmartFACT::HandleBiasVoltage,         this, placeholders::_1));
     1755        Subscribe("BIAS_CONTROL/CURRENT")
     1756            (bind(&StateMachineSmartFACT::HandleBiasCurrent,         this, placeholders::_1));
     1757
     1758        Subscribe("FAD_CONTROL/CONNECTIONS")
     1759            (bind(&StateMachineSmartFACT::HandleFadConnections,      this, placeholders::_1));
     1760        Subscribe("FAD_CONTROL/EVENTS")
     1761            (bind(&StateMachineSmartFACT::HandleFadEvents,           this, placeholders::_1));
     1762
     1763        Subscribe("FTM_CONTROL/TRIGGER_RATES")
     1764            (bind(&StateMachineSmartFACT::HandleFtmTriggerRates,     this, placeholders::_1));
     1765        Subscribe("FTM_CONTROL/STATIC_DATA")
     1766            (bind(&StateMachineSmartFACT::HandleFtmStaticData,       this, placeholders::_1));
     1767        Subscribe("FTM_CONTROL/FTU_LIST")
     1768            (bind(&StateMachineSmartFACT::HandleFtmFtuList,          this, placeholders::_1));
     1769
     1770        Subscribe("RATE_SCAN/DATA")
     1771            (bind(&StateMachineSmartFACT::HandleRateScanData,        this, placeholders::_1));
     1772
     1773        Subscribe("FAD_CONTROL/EVENT_DATA")
     1774            (bind(&StateMachineSmartFACT::HandleFadEventData,        this, placeholders::_1));
     1775
     1776        // =================================================================
     1777
    19221778        // State names
    19231779        AddStateName(kStateDimNetworkNA, "DimNetworkNotAvailable",
     
    19261782        AddStateName(kStateRunning, "Running", "");
    19271783
     1784        // =================================================================
     1785
    19281786        AddEvent("PRINT")
    19291787            (bind(&StateMachineSmartFACT::Print, this))
     
    19311789
    19321790    }
    1933     ~StateMachineSmartFACT()
    1934     {
    1935         delete fDim;
    1936     }
    19371791    int EvalOptions(Configuration &conf)
    19381792    {
     
    19451799        fPath = conf.Get<string>("path");
    19461800
    1947         fDim = new DimSubscriptions(this);
    1948         fDim->fControl.SetCallback(bind(&StateMachineSmartFACT::HandleControlStateChange, this, placeholders::_1));
    1949         fDim->fControl.AddCallback("dotest.dim", bind(&StateMachineSmartFACT::HandleDoTest, this, placeholders::_1));
     1801        fDimControl.SetCallback(bind(&StateMachineSmartFACT::HandleControlStateChange, this, placeholders::_1));
     1802        fDimControl.AddCallback("dotest.dim", bind(&StateMachineSmartFACT::HandleDoTest, this, placeholders::_1));
    19501803
    19511804        return -1;
Note: See TracChangeset for help on using the changeset viewer.