Changeset 13838 for trunk


Ignore:
Timestamp:
05/23/12 17:06:08 (13 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.
Location:
trunk/FACT++/src
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/FACT++/src/RemoteControl.h

    r13743 r13838  
    119119    }
    120120
    121     void infoHandler()
    122     {
    123         RemoteControlImp::infoHandler();
    124         if (!fCurrentServer.empty() && !HasServer(fCurrentServer))
     121    void RemoveServer(std::string s)
     122    {
     123        DimNetwork::RemoveServer(s);
     124        if (fCurrentServer==s)
    125125        {
    126126            fCurrentServer = "";
    127127            T::UpdatePrompt();
    128128        }
     129    }
     130
     131    void RemoveAllServers()
     132    {
     133        DimNetwork::RemoveAllServers();
     134        fCurrentServer = "";
     135        T::UpdatePrompt();
    129136    }
    130137
  • trunk/FACT++/src/datalogger.cc

    r13670 r13838  
    196196};
    197197
    198 class DataLogger : public StateMachineDim, DimServiceInfoList
     198class DataLogger : public StateMachineDim, DimServiceInfoListImp
    199199{
    200200public:
     
    262262     ***************************************************/
    263263    ///Reporting method for the services info received
    264     void ReportPlease(DimInfo* I, SubscriptionType& sub); 
     264    void Report(DimInfo* I, SubscriptionType& sub);
    265265
    266266    ///Configuration of the nightly file path
    267267    int ConfigureFilePath(const Event& evt);
    268268    ///print the current state of the dataLogger
    269     int PrintStatePlease(const Event& evt);
     269    int PrintState(const Event& evt);
    270270    ///checks whether or not the current info being treated is a run number
    271271    void CheckForRunNumber(DimInfo* I);
    272272    /// start transition
    273     int StartPlease();
     273    int Start();
    274274    ///from waiting to logging transition
    275     //int StartRunPlease();
     275    //int StartRun();
    276276    // from logging to waiting transition
    277277    int StopRunLogging();
    278278    ///stop and reset transition
    279     int GoToReadyPlease();
     279    int GoToReady();
    280280    ///from NightlyOpen to waiting transition
    281     int NightlyToWaitRunPlease();
     281    int NightlyToWaitRun();
    282282    ///from wait for run number to nightly open
    283     int BackToNightlyOpenPlease();
     283    int BackToNightlyOpen();
    284284#ifdef HAVE_FITS
    285285    ///Open fits files
    286     void OpenFITSFilesPlease(SubscriptionType& sub, RunNumberType* cRunNumber);
     286    void OpenFITSFiles(SubscriptionType& sub, RunNumberType* cRunNumber);
    287287    ///Write data to FITS files
    288288    void WriteToFITS(SubscriptionType& sub);
     
    355355    bool ShouldSubscribe(const string& server, const string& service);
    356356    ///Subscribe to a given server and service
    357     DimStampedInfo* SubscribeToPlease(const string& server, const string& service);
     357    DimStampedInfo* SubscribeTo(const string& server, const string& service);
    358358    ///Open a text file and checks for ofstream status
    359     bool OpenTextFilePlease(ofstream& stream, const string& name);
     359    bool OpenTextFile(ofstream& stream, const string& name);
    360360    ///Checks if the input osftream is in error state, and if so close it.
    361361    bool CheckForOfstreamError(ofstream& out, bool isDailyStream);
     
    370370    bool CreateDirectory(string path);
    371371    /***************************************************
    372     * INHERITED FROM DIMSERVICEINFOLIST
     372    * INHERITED FROM DimServiceInfoList
    373373    ***************************************************/
    374374    ///Add a new service subscription
     
    480480    }
    481481
    482     list[service].dimInfo.reset(SubscribeToPlease(server, service));
     482    list[service].dimInfo.reset(SubscribeTo(server, service));
    483483    list[service].server  = server;
    484484    list[service].service = service;
     
    615615//! @name the file name
    616616//
    617 bool DataLogger::OpenTextFilePlease(ofstream& stream, const string& name)
     617bool DataLogger::OpenTextFile(ofstream& stream, const string& name)
    618618{
    619619    return OpenStreamImp(stream, name, true);
     
    626626//! @param service the service name
    627627//
    628 DimStampedInfo* DataLogger::SubscribeToPlease(const string& server, const string& service)
     628DimStampedInfo* DataLogger::SubscribeTo(const string& server, const string& service)
    629629{
    630630    if (fDebugIsOn)
     
    780780
    781781    // Add the possible transitions for this machine
    782     AddEvent(kSM_NightlyOpen, "START", kSM_Ready, kSM_BadFolder)
    783         (bind(&DataLogger::StartPlease, this))
     782    AddEvent("START", kSM_Ready, kSM_BadFolder)
     783        (bind(&DataLogger::Start, this))
    784784        ("Start the nightly logging. Nightly file location must be specified already");
    785785
    786     AddEvent(kSM_Ready, "STOP", kSM_NightlyOpen, kSM_WaitingRun, kSM_Logging, kSM_DailyWriteError, kSM_RunWriteError)
    787         (bind(&DataLogger::GoToReadyPlease, this))
     786    AddEvent("STOP", kSM_NightlyOpen, kSM_WaitingRun, kSM_Logging, kSM_DailyWriteError, kSM_RunWriteError)
     787        (bind(&DataLogger::GoToReady, this))
    788788        ("Stop all data logging, close all files.");
    789789/*
    790790    AddEvent(kSM_Logging, "START_RUN", kSM_WaitingRun, kSM_BadRunConfig)
    791         (bind(&DataLogger::StartRunPlease, this))
     791        (bind(&DataLogger::StartRun, this))
    792792        ("Start the run logging. Run file location must be specified already.");
    793793
     
    796796        ("Wait for a run to be started, open run-files as soon as a run number arrives.");
    797797*/
    798     AddEvent(kSM_Ready, "RESET", kSM_Error, kSM_BadFolder, kSM_DailyWriteError, kSM_RunWriteError)
    799         (bind(&DataLogger::GoToReadyPlease, this))
     798    AddEvent("RESET", kSM_Error, kSM_BadFolder, kSM_DailyWriteError, kSM_RunWriteError)
     799        (bind(&DataLogger::GoToReady, this))
    800800        ("Transition to exit error states. Closes the any open file.");
    801801
    802     AddEvent(kSM_WaitingRun, "START_RUN_LOGGING", /*kSM_Logging,*/ kSM_NightlyOpen, kSM_Ready)
    803         (bind(&DataLogger::NightlyToWaitRunPlease, this))
     802    AddEvent("START_RUN_LOGGING", /*kSM_Logging,*/ kSM_NightlyOpen, kSM_Ready)
     803        (bind(&DataLogger::NightlyToWaitRun, this))
    804804        ("Go to waiting for run number state. In this state with any received run-number a new file is opened.");
    805805
    806     AddEvent(kSM_NightlyOpen, "STOP_RUN_LOGGING", kSM_WaitingRun, kSM_Logging)
    807         (bind(&DataLogger::BackToNightlyOpenPlease, this))
     806    AddEvent("STOP_RUN_LOGGING", kSM_WaitingRun, kSM_Logging)
     807        (bind(&DataLogger::BackToNightlyOpen, this))
    808808        ("Go from the wait for run to nightly open state.");
    809809
     
    822822     // Provide a print command
    823823     AddEvent("PRINT_INFO")
    824             (bind(&DataLogger::PrintStatePlease, this, placeholders::_1))
     824            (bind(&DataLogger::PrintState, this, placeholders::_1))
    825825            ("Print information about the internal status of the data logger.");
    826826
     
    931931    }
    932932    //go to the ready state. i.e. close all files, run-wise first
    933     GoToReadyPlease();
     933    GoToReady();
    934934
    935935
     
    944944 //       messageBackup.reset();
    945945
    946     if (fNightlyLogFile.is_open())//this file is the only one that has not been closed by GoToReadyPlease
     946    if (fNightlyLogFile.is_open())//this file is the only one that has not been closed by GoToReady
    947947    {
    948948//        dim_lock();
     
    982982    {
    983983        fAutoStarted = true;
    984         SetCurrentState(StartPlease());
     984        SetCurrentState(Start());
    985985    }
    986986    else {if (GetCurrentState() > kSM_Ready)
     
    10091009    }
    10101010    if (!found)
    1011     {
    1012         DimServiceInfoList::infoHandler();
    10131011        return;
    1014     }
     1012
    10151013    if (I->getSize() <= 0 || I->getData()==NULL)
    10161014    {
     
    10401038    CheckForRunNumber(I);
    10411039
    1042     ReportPlease(I, y->second);
     1040    Report(I, y->second);
    10431041
    10441042    //remove old run numbers
     
    11671165//!        The dataLogger's subscription corresponding to this DimInfo
    11681166//
    1169 void DataLogger::ReportPlease(DimInfo* I, SubscriptionType& sub)
     1167void DataLogger::Report(DimInfo* I, SubscriptionType& sub)
    11701168{
    11711169    const string fmt(I->getFormat());
     
    12361234
    12371235        fFullNightlyLogFileName = CompileFileNameWithPath(fFilePath, "", "log");
    1238         if (!OpenTextFilePlease(fNightlyLogFile, fFullNightlyLogFileName))
    1239         {
    1240             GoToReadyPlease();
     1236        if (!OpenTextFile(fNightlyLogFile, fFullNightlyLogFileName))
     1237        {
     1238            GoToReady();
    12411239            SetCurrentState(kSM_BadFolder);
    12421240            return;
     
    12451243
    12461244        fFullNightlyReportFileName = CompileFileNameWithPath(fFilePath, "", "rep");
    1247         if (!OpenTextFilePlease(fNightlyReportFile, fFullNightlyReportFileName))
    1248         {
    1249             GoToReadyPlease();
     1245        if (!OpenTextFile(fNightlyReportFile, fFullNightlyReportFileName))
     1246        {
     1247            GoToReady();
    12501248            SetCurrentState(kSM_BadFolder);
    12511249            return;
     
    13771375        if (!sub.nightlyFile.IsOpen() || !sub.runFile.IsOpen() || sub.runNumber != sub.runFile.fRunNumber)
    13781376            if (GetCurrentState() != kSM_Ready)
    1379                 OpenFITSFilesPlease(sub, cRunNumber);
     1377                OpenFITSFiles(sub, cRunNumber);
    13801378        WriteToFITS(sub);
    13811379#endif
     
    14271425        if (!sub.nightlyFile.IsOpen() || !sub.runFile.IsOpen() || sub.runNumber != sub.runFile.fRunNumber)
    14281426            if (GetCurrentState() != kSM_Ready)
    1429                 OpenFITSFilesPlease(sub, cRunNumber);
     1427                OpenFITSFiles(sub, cRunNumber);
    14301428        WriteToFITS(sub);
    14311429    }
     
    14411439//!        the new state. Which, in that case, is the current state
    14421440//!
    1443 int DataLogger::PrintStatePlease(const Event& )
     1441int DataLogger::PrintState(const Event& )
    14441442{
    14451443    Message("------------------------------------------");
     
    17381736//! @returns
    17391737//!        kSM_NightlyOpen if success, kSM_BadFolder if failure
    1740 int DataLogger::StartPlease()
     1738int DataLogger::Start()
    17411739{
    17421740    if (fDebugIsOn)
     
    17461744    fFullNightlyLogFileName = CompileFileNameWithPath(fFilePath, "", "log");
    17471745    bool nightlyLogOpen = fNightlyLogFile.is_open();
    1748     if (!OpenTextFilePlease(fNightlyLogFile, fFullNightlyLogFileName))
     1746    if (!OpenTextFile(fNightlyLogFile, fFullNightlyLogFileName))
    17491747        return kSM_BadFolder;
    17501748    if (!nightlyLogOpen)
     
    17521750
    17531751    fFullNightlyReportFileName = CompileFileNameWithPath(fFilePath, "", "rep");
    1754     if (!OpenTextFilePlease(fNightlyReportFile, fFullNightlyReportFileName))
     1752    if (!OpenTextFile(fNightlyReportFile, fFullNightlyReportFileName))
    17551753    {
    17561754        fNightlyLogFile.close();
     
    17761774//! @param sub
    17771775//!     the current DimInfo subscription being examined
    1778 void DataLogger::OpenFITSFilesPlease(SubscriptionType& sub, RunNumberType* cRunNumber)
     1776void DataLogger::OpenFITSFiles(SubscriptionType& sub, RunNumberType* cRunNumber)
    17791777{
    17801778    string serviceName(sub.dimInfo->getName());
     
    19931991//! @returns
    19941992//!        kSM_Logging if success, kSM_BadRunConfig if failure.
    1995 int DataLogger::StartRunPlease()
     1993int DataLogger::StartRun()
    19961994{
    19971995    if (fDebugIsOn)
     
    20032001        if (OpenRunFile(*it) != 0)
    20042002        {
    2005             StopRunPlease();
     2003            StopRun();
    20062004            return kSM_BadRunConfig;
    20072005        }
     
    22192217//! @returns
    22202218//!     kSM_Ready
    2221 int DataLogger::GoToReadyPlease()
     2219int DataLogger::GoToReady()
    22222220{
    22232221   if (fDebugIsOn)
     
    22642262//!    @returns
    22652263//!        kSM_WaitingRun or kSM_BadFolder
    2266 int DataLogger::NightlyToWaitRunPlease()
     2264int DataLogger::NightlyToWaitRun()
    22672265{
    22682266    int cState = GetCurrentState();
     
    22722270
    22732271    if (cState == kSM_Ready)
    2274         cState = StartPlease();
     2272        cState = Start();
    22752273
    22762274    if (cState != kSM_NightlyOpen)
     
    22892287//!    @returns
    22902288//!        kSM_WaitingRun
    2291 int DataLogger::BackToNightlyOpenPlease()
     2289int DataLogger::BackToNightlyOpen()
    22922290{
    22932291    if (GetCurrentState()==kSM_Logging)
     
    23492347         fFilePath = folder;
    23502348         fFullNightlyLogFileName = CompileFileNameWithPath(fFilePath, "", "log");
    2351          if (!OpenTextFilePlease(fNightlyLogFile, fFullNightlyLogFileName))
     2349         if (!OpenTextFile(fNightlyLogFile, fFullNightlyLogFileName))
    23522350             return 3;
    23532351
  • trunk/FACT++/src/feedback.cc

    r13721 r13838  
    2828
    2929#include "DimDescriptionService.h"
     30#include "DimState.h"
    3031
    3132// ------------------------------------------------------------------------
    3233
    33 class StateMachineFeedback : public StateMachineDim, public DimInfoHandler
     34class StateMachineFeedback : public StateMachineDim
    3435{
    35     /*
    36     int Wrap(boost::function<void()> f)
    37     {
    38         f();
    39         return T::GetCurrentState();
    40     }
    41 
    42     boost::function<int(const EventImp &)> Wrapper(boost::function<void()> func)
    43     {
    44         return bind(&StateMachineMCP::Wrap, this, func);
    45     }*/
    46 
    4736private:
    4837    enum states_t
     
    7665    PixelMap fMap;
    7766
    78     DimServiceInfoList fNetwork;
    79 
    80     pair<Time, int> fStatusDim;
    81     pair<Time, int> fStatusFAD;
    82     pair<Time, int> fStatusFSC;
    83     pair<Time, int> fStatusBias;
    84 
    85     DimStampedInfo fDim;
    86     DimStampedInfo fFAD;
    87     DimStampedInfo fFSC;
    88     DimStampedInfo fBias;
    89     DimStampedInfo fBiasA;
    90 
    91     DimStampedInfo fBiasData;
    92     DimStampedInfo fBiasNom;
    93     DimStampedInfo fCameraTemp;
     67    DimServiceInfoListImp fNetwork;
     68
     69    DimVersion fDim;
     70    DimState   fDimFAD;
     71    DimState   fDimFSC;
     72    DimState   fDimBias;
    9473
    9574    DimDescribedService fDimReference;
     
    133112    bool fOutputEnabled;
    134113
    135     pair<Time, int> GetNewState(DimStampedInfo &info) const
    136     {
    137         const bool disconnected = info.getSize()==0;
    138 
    139         // Make sure getTimestamp is called _before_ getTimestampMillisecs
    140         const int tsec = info.getTimestamp();
    141         const int tms  = info.getTimestampMillisecs();
    142 
    143         return make_pair(Time(tsec, tms*1000),
    144                          disconnected ? -2 : info.getQuality());
    145     }
    146 
    147     void HandleCameraTemp()
    148     {
    149         if (fCameraTemp.getSize()!=60*sizeof(float))
    150             return;
    151 
    152         const float *ptr = static_cast<float*>(fCameraTemp.getData());
     114    int HandleCameraTemp(const EventImp &evt)
     115    {
     116        if (fControlType!=kTemp && fControlType!=kCurrents)
     117            return GetCurrentState();
     118
     119        if (evt.GetSize()!=60*sizeof(float))
     120            return GetCurrentState();
     121
     122        const float *ptr = evt.Ptr<float>();
    153123
    154124        double avgt = 0;
     
    164134        {
    165135            Warn("Received sensor temperatures all invalid.");
    166             return;
     136            return GetCurrentState();
    167137        }
    168138
     
    177147            Warn("Trying to calibrate above G-APD breakdown volatge!");
    178148            Warn(msg);
    179             return;
     149            return GetCurrentState();
    180150        }
    181151
     
    206176            {
    207177                //DimClient::sendCommandNB("BIAS_CONTROL/REQUEST_STATUS", NULL, 0);
    208                 return;
     178                return GetCurrentState();
    209179            }
    210180
     
    275245                vec[i+BIAS::kNumChannels] += dU;
    276246
     247                // Angelegte Spannung:    U0+dU
     248                // Gemessener Strom:      Im - Iavg
     249                // Strom offset:          (U0+dU) / Ravg
     250                // Fliessender Strom:     Im-Iavg - (U0+dU)/Ravg
     251                // Korrektur:             [ Im-Iavg - (U0+dU)/Ravg ] * Rg
     252
     253                // Aufgeloest nach dU:    dU =  ( Im-Iavg - dU/Ravg ) / ( 1/Rg + 1/Ravg )
     254                // Equivalent zu:         dU  = ( I*Ravg - U0 ) / ( Ravg/Rg+1 )
     255
    277256                // Calculate statistics only for channels with a valid calibration
    278257                if (Iavg[i]>0)
     
    299278        fDimDeviation.Update(vec);
    300279
    301         if (!fOutputEnabled || fStatusBias.second!=BIAS::kVoltageOn)
    302             return;
     280        if (!fOutputEnabled || fDimBias.state()!=BIAS::kVoltageOn)
     281            return GetCurrentState();
    303282
    304283        // Trigger calibration
     
    306285        {
    307286            DimClient::sendCommandNB("BIAS_CONTROL/REQUEST_STATUS", NULL, 0);
    308             return;
     287            return GetCurrentState();
    309288        }
    310289
     
    336315
    337316        fCursorTemp++;
    338     }
    339 
    340     int AverageCurrents()
    341     {
    342         if (fBiasA.getSize()!=BIAS::kNumChannels*sizeof(int16_t))
     317
     318        return GetCurrentState();
     319    }
     320
     321    int AverageCurrents(const EventImp &evt)
     322    {
     323        if (evt.GetSize()!=BIAS::kNumChannels*sizeof(int16_t))
    343324            return -1;
    344325
    345         if (fStatusBias.second!=BIAS::kVoltageOn)
     326        if (fDimBias.state()!=BIAS::kVoltageOn)
    346327            return false;
    347328
     
    349330            return true;
    350331
    351         const int16_t *ptr = static_cast<int16_t*>(fBiasA.getData());
     332        const int16_t *ptr = evt.Ptr<int16_t>();
    352333
    353334        for (int i=0; i<BIAS::kNumChannels; i++)
     
    361342
    362343
    363     void HandleCalibration()
    364     {
    365         const int rc = AverageCurrents();
     344    void HandleCalibration(const EventImp &evt)
     345    {
     346        const int rc = AverageCurrents(evt);
    366347        if (rc<0)
    367348            return;
     
    369350        if (fCursorCur<fNumCalibRequests)
    370351        {
    371             if (fStatusBias.second==BIAS::kVoltageOn)
     352            if (fDimBias.state()==BIAS::kVoltageOn)
    372353                DimClient::sendCommandNB("BIAS_CONTROL/REQUEST_STATUS", NULL, 0);
    373354            return;
     
    401382        Info("Calibration successfully done.");
    402383
    403         if (fStatusBias.second==BIAS::kVoltageOn)
     384        if (fDimBias.state()==BIAS::kVoltageOn)
    404385            DimClient::sendCommandNB("BIAS_CONTROL/REQUEST_STATUS", NULL, 0);
    405386    }
    406387
    407     void HandleFeedback()
    408     {
    409         if (fBiasData.getSize()!=1440*sizeof(float))
     388    void HandleFeedback(const EventImp &evt)
     389    {
     390        if (evt.GetSize()!=1440*sizeof(float))
    410391            return;
    411392
    412393        // -------- Check age of last stored event --------
    413394
    414         // Must be called in this order
    415         const int tsec = fBiasData.getTimestamp();
    416         const int tms  = fBiasData.getTimestampMillisecs();
    417 
    418         const Time tm(tsec, tms*1000);
     395        const Time tm(evt.GetTime());
    419396
    420397        if (Time()-fBiasLast>boost::posix_time::seconds(30))
     
    427404        // -------- Store new event --------
    428405
    429         fData[fCursorAmpl%fData.size()].assign(reinterpret_cast<float*>(fBiasData.getData()),
    430                                                reinterpret_cast<float*>(fBiasData.getData())+1440);
    431 
     406        fData[fCursorAmpl%fData.size()].assign(evt.Ptr<float>(), evt.Ptr<float>()+1440);
    432407        if (++fCursorAmpl<fData.size())
    433408            return;
     
    610585        fDimDeviation.Update(vec);
    611586
    612         if (!fOutputEnabled || fStatusBias.second!=BIAS::kVoltageOn)
     587        if (!fOutputEnabled || fDimBias.state()!=BIAS::kVoltageOn)
    613588            return;
    614589
     
    619594    }
    620595
    621     void HandleGlobalFeedback()
    622     {
    623         if (fBiasData.getSize()!=1440*sizeof(float))
     596    void HandleGlobalFeedback(const EventImp &evt)
     597    {
     598        if (evt.GetSize()!=1440*sizeof(float))
    624599            return;
    625600
    626601        // -------- Store new event --------
    627602
    628         vector<float> arr(reinterpret_cast<float*>(fBiasData.getData()),
    629                           reinterpret_cast<float*>(fBiasData.getData())+1440);
     603        vector<float> arr(evt.Ptr<float>(), evt.Ptr<float>()+1440);
    630604
    631605        sort(arr.begin(), arr.end());
     
    744718        fDimDeviation.Update(vec);
    745719
    746         if (!fOutputEnabled || fStatusBias.second!=BIAS::kVoltageOn)
     720        if (!fOutputEnabled || fDimBias.state()!=BIAS::kVoltageOn)
    747721            return;
    748722
     
    753727    }
    754728
    755     void infoHandler()
    756     {
    757         DimInfo *curr = getInfo(); // get current DimInfo address
    758         if (!curr)
    759             return;
    760 
    761         if (curr==&fBias)
    762         {
    763             fStatusBias = GetNewState(fBias);
    764             return;
    765         }
    766 
    767         if (curr==&fFAD)
    768         {
    769             fStatusFAD = GetNewState(fFAD);
    770             return;
    771         }
    772 
    773         if (curr==&fFSC)
    774         {
    775             fStatusFSC = GetNewState(fFSC);
    776             return;
    777         }
    778 
    779         if (curr==&fDim)
    780         {
    781             fStatusDim = GetNewState(fDim);
    782             fStatusDim.second = curr->getSize()==4 ? curr->getInt() : 0;
    783             return;
    784         }
    785 
    786         if (curr==&fBiasNom)
    787         {
    788             const float *ptr = reinterpret_cast<float*>(fBiasNom.getData());
    789             fVoltGapd.assign(ptr, ptr+416);
    790             Info("Nominal bias voltages received.");
    791             return;
    792         }
    793 
    794         if (curr==&fCameraTemp && (fControlType==kTemp || fControlType==kCurrents))
    795             HandleCameraTemp();
    796 
    797         if (curr==&fBiasA && fControlType==kTemp && GetCurrentState()==kStateCalibrating)
    798             HandleCalibration();
    799 
    800         if (curr==&fBiasA && (fControlType==kFeedbackGlobal || fControlType==kCurrents))
    801             AverageCurrents();
    802 
    803         if (curr==&fBiasData && fControlType==kFeedback)
    804             HandleFeedback();
    805 
    806         if (curr==&fBiasData && fControlType==kFeedbackGlobal)
    807             HandleGlobalFeedback();
     729    int HandleBiasCurrent(const EventImp &evt)
     730    {
     731        if (fControlType==kTemp && GetCurrentState()==kStateCalibrating)
     732            HandleCalibration(evt);
     733
     734        if (fControlType==kFeedbackGlobal || fControlType==kCurrents)
     735            AverageCurrents(evt);
     736
     737        return GetCurrentState();
     738    }
     739
     740    int HandleBiasData(const EventImp &evt)
     741    {
     742        if (fControlType==kFeedback)
     743            HandleFeedback(evt);
     744
     745        if (fControlType==kFeedbackGlobal)
     746            HandleGlobalFeedback(evt);
     747
     748        return GetCurrentState();
     749    }
     750
     751    int HandleBiasNom(const EventImp &evt)
     752    {
     753        fVoltGapd.assign(evt.Ptr<float>(), evt.Ptr<float>()+416);
     754
     755        Info("Nominal bias voltages received.");
     756
     757        return GetCurrentState();
    808758    }
    809759
     
    819769    }
    820770
     771    const State GetState(const DimState &s) const
     772    {
     773        return fNetwork.GetState(s.name(), s.state());
     774    }
     775
     776    void PrintState(const DimState &state) const
     777    {
     778        const State rc = GetState(state);
     779
     780        Out() << state.time().GetAsStr("%H:%M:%S.%f").substr(0, 12) << " - ";
     781        Out() << kBold << state.name() << ": ";
     782        if (rc.index==-3)
     783        {
     784            Out() << kReset << "Offline" << endl;
     785            return;
     786        }
     787        if (rc.index==-2)
     788            Out() << state.state();
     789        else
     790            Out() << rc.name << "[" << rc.index << "]";
     791        Out() << kReset << " - " << kBlue << rc.comment << endl;
     792    }
     793
     794    int Print() const
     795    {
     796        Out() << fDim.time().GetAsStr("%H:%M:%S.%f").substr(0, 12) << " - ";
     797        Out() << kBold << "DIM_DNS: " << fDim.version() << endl;
     798
     799        PrintState(fDimFAD);
     800        PrintState(fDimFSC);
     801        PrintState(fDimBias);
     802
     803        return GetCurrentState();
     804    }
     805/*
    821806    void PrintState(const pair<Time,int> &state, const char *server)
    822807    {
     
    844829        return GetCurrentState();
    845830    }
    846 
     831*/
    847832    int PrintCalibration()
    848833    {
     
    886871    void WarnState(bool needfsc, bool needfad)
    887872    {
    888         const bool bias = fStatusBias.second >= BIAS::kConnecting;
    889         const bool fsc  = fStatusFSC.second  >= 2;
    890         const bool fad  = fStatusFAD.second  >= FAD::kConnected;
     873        const bool bias = fDimBias.state() >= BIAS::kConnecting;
     874        const bool fsc  = fDimFSC.state()  >= 2;
     875        const bool fad  = fDimFAD.state()  >= FAD::kConnected;
    891876
    892877        if (!bias)
     
    1000985        Message(out);
    1001986
    1002         if (fStatusBias.second==BIAS::kVoltageOn)
     987        if (fDimBias.state()==BIAS::kVoltageOn)
    1003988            DimClient::sendCommandNB("BIAS_CONTROL/REQUEST_STATUS", NULL, 0);
    1004989
     
    10911076//            return kSM_FatalError;
    10921077
    1093         if (fStatusBias.second==BIAS::kRamping)
     1078        if (fDimBias.state()==BIAS::kRamping)
    10941079        {
    10951080            Warn("Calibration cannot be started when biasctrl is in state Ramping.");
     
    11431128        //poll_one();
    11441129
    1145         if (fStatusDim.second==0)
     1130        if (!fDim.online())
    11461131            return kStateDimNetworkNA;
    11471132
    1148         const bool bias = fStatusBias.second >= BIAS::kConnecting;
    1149         const bool fad  = fStatusFAD.second  >= FAD::kConnected;
    1150         const bool fsc  = fStatusFSC.second  >= 2;
     1133        const bool bias = fDimBias.state() >= BIAS::kConnecting;
     1134        const bool fad  = fDimFAD.state()  >= FAD::kConnected;
     1135        const bool fsc  = fDimFSC.state()  >= 2;
    11511136
    11521137        // All subsystems are not connected
     
    12201205                if (fCurrentRequestInterval>0 && Time()-past>boost::posix_time::milliseconds(fCurrentRequestInterval))
    12211206                {
    1222                     if (fStatusBias.second==BIAS::kVoltageOn)
     1207                    if (fDimBias.state()==BIAS::kVoltageOn)
    12231208                        DimClient::sendCommandNB("BIAS_CONTROL/REQUEST_STATUS", NULL, 0);
    12241209                    past = Time();
     
    12401225public:
    12411226    StateMachineFeedback(ostream &out=cout) : StateMachineDim(out, "FEEDBACK"),
    1242         fStatusDim(make_pair(Time(), -2)),
    1243         fStatusFAD(make_pair(Time(), -2)),
    1244         fStatusBias(make_pair(Time(), -2)),
    1245         fDim("DIS_DNS/VERSION_NUMBER",  (void*)NULL, 0, this),
    1246         fFAD("FAD_CONTROL/STATE",       (void*)NULL, 0, this),
    1247         fFSC("FSC_CONTROL/STATE",       (void*)NULL, 0, this),
    1248         fBias("BIAS_CONTROL/STATE",     (void*)NULL, 0, this),
    1249         fBiasA("BIAS_CONTROL/CURRENT",  (void*)NULL, 0, this),
    1250         fBiasData("FAD_CONTROL/FEEDBACK_DATA", (void*)NULL, 0, this),
    1251         fBiasNom("BIAS_CONTROL/NOMINAL", (void*)NULL, 0, this),
    1252         fCameraTemp("FSC_CONTROL/TEMPERATURE", (void*)NULL, 0, this),
     1227        //---
     1228        fDimFAD("FAD_CONTROL"),
     1229        fDimFSC("FSC_CONTROL"),
     1230        fDimBias("BIAS_CONTROL"),
     1231        //---
    12531232        fDimReference("FEEDBACK/REFERENCE", "F:416",
    12541233                      "Amplitude reference value(s)"
     
    12801259        // deletion and creation of threads and more.
    12811260
    1282 //        fSP.resize(416);
     1261        fDim.Subscribe(*this);
     1262        fDimFAD.Subscribe(*this);
     1263        fDimFSC.Subscribe(*this);
     1264        fDimBias.Subscribe(*this);
     1265
     1266        Subscribe("BIAS_CONTROL/CURRENT")
     1267            (bind(&StateMachineFeedback::HandleBiasCurrent, this, placeholders::_1));
     1268        Subscribe("BIAS_CONTROL/FEEDBACK_DATA")
     1269            (bind(&StateMachineFeedback::HandleBiasData,    this, placeholders::_1));
     1270        Subscribe("FSC_CONTROL/TEMPERATURE")
     1271            (bind(&StateMachineFeedback::HandleCameraTemp,  this, placeholders::_1));
    12831272
    12841273        // State names
  • trunk/FACT++/src/logtime.cc

    r12853 r13838  
    1414    DimServer::start("TIME");
    1515
     16
     17
    1618    // Some info on the console
    1719    std::cout << "Offering TIME/MESSAGE...\n" << std::endl;
     
    2628        // wait approximately one second
    2729        usleep(1000000);
     30
     31        //std::cout << DimServer::getClientName() << std::endl;
     32        //std::cout << DimServer::getClientId() << std::endl;
     33        //std::cout << DimServer::getDnsPort() << std::endl;
     34        std::cout << "con: " << dis_get_conn_id() << std::endl;
     35
     36        char **ids = DimServer::getClientServices();
     37
     38        while (*ids)
     39        {
     40            std::cout << *ids << std::endl;
     41            ids++;
     42        }
    2843    }
    2944
  • trunk/FACT++/src/mcp.cc

    r13794 r13838  
    2626
    2727#include "DimDescriptionService.h"
     28#include "DimState.h"
    2829
    2930// ------------------------------------------------------------------------
    3031
    31 class StateMachineMCP : public StateMachineDim, public DimInfoHandler
     32class StateMachineMCP : public StateMachineDim
    3233{
    33     /*
    34     int Wrap(boost::function<void()> f)
    35     {
    36         f();
    37         return T::GetCurrentState();
    38     }
    39 
    40     boost::function<int(const EventImp &)> Wrapper(boost::function<void()> func)
    41     {
    42         return bind(&StateMachineMCP::Wrap, this, func);
    43     }*/
    44 
    4534private:
    4635    enum states_t
     
    6150    };
    6251
    63     DimServiceInfoList fNetwork;
    64 
    65     pair<Time, int> fStatusDim;
    66     pair<Time, int> fStatusFTM;
    67     pair<Time, int> fStatusFAD;
    68     pair<Time, int> fStatusLog;
    69     pair<Time, int> fStatusRC;
    70 
    71     DimStampedInfo fDim;
    72     DimStampedInfo fFTM;
    73     DimStampedInfo fFAD;
    74     DimStampedInfo fLog;
    75     DimStampedInfo fRC;
     52    DimServiceInfoListImp fNetwork;
     53
     54    DimVersion fDim;
     55    DimState   fDimFTM;
     56    DimState   fDimFAD;
     57    DimState   fDimLog;
     58    DimState   fDimRC;
    7659
    7760    DimDescribedService fService;
    7861
    79     pair<Time, int> GetNewState(DimStampedInfo &info) const
    80     {
    81         const bool disconnected = info.getSize()==0;
    82 
    83         // Make sure getTimestamp is called _before_ getTimestampMillisecs
    84         const int tsec = info.getTimestamp();
    85         const int tms  = info.getTimestampMillisecs();
    86 
    87         return make_pair(Time(tsec, tms*1000),
    88                          disconnected ? -2 : info.getQuality());
    89     }
    90 
    91     void infoHandler()
    92     {
    93         DimInfo *curr = getInfo(); // get current DimInfo address
    94         if (!curr)
     62    const State GetState(const DimState &s) const
     63    {
     64        return fNetwork.GetState(s.name(), s.state());
     65    }
     66
     67    void PrintState(const DimState &state) const
     68    {
     69        const State rc = GetState(state);
     70
     71        Out() << state.time().GetAsStr("%H:%M:%S.%f").substr(0, 12) << " - ";
     72        Out() << kBold << state.name() << ": ";
     73        if (rc.index==-3)
     74        {
     75            Out() << kReset << "Offline" << endl;
    9576            return;
    96 
    97         if (curr==&fFTM)
    98         {
    99             fStatusFTM = GetNewState(fFTM);
    100             return;
    101         }
    102 
    103         if (curr==&fFAD)
    104         {
    105             fStatusFAD = GetNewState(fFAD);
    106             return;
    107         }
    108 
    109         if (curr==&fLog)
    110         {
    111             fStatusLog = GetNewState(fLog);
    112             return;
    113         }
    114 
    115         if (curr==&fRC)
    116         {
    117             fStatusRC = GetNewState(fRC);
    118             return;
    119         }
    120 
    121         if (curr==&fDim)
    122         {
    123             fStatusDim = GetNewState(fDim);
    124             fStatusDim.second = curr->getSize()==4 ? curr->getInt() : 0;
    125             return;
    126         }
    127     }
    128 
    129     bool CheckEventSize(size_t has, const char *name, size_t size)
    130     {
    131         if (has==size)
    132             return true;
    133 
    134         ostringstream msg;
    135         msg << name << " - Received event has " << has << " bytes, but expected " << size << ".";
    136         Fatal(msg);
    137         return false;
    138     }
    139 
    140     int SetVerbosity(const EventImp &)
    141     {
    142         /*
    143         if (!CheckEventSize(evt.GetSize(), "SetVerbosity", 1))
    144             return T::kSM_FatalError;
    145 
    146         fFSC.SetVerbose(evt.GetBool());
    147 
    148         */
     77        }
     78        if (rc.index==-2)
     79            Out() << state.state();
     80        else
     81            Out() << rc.name << "[" << rc.index << "]";
     82        Out() << kReset << " - " << kBlue << rc.comment << endl;
     83    }
     84
     85    int Print() const
     86    {
     87        Out() << fDim.time().GetAsStr("%H:%M:%S.%f").substr(0, 12) << " - ";
     88        Out() << kBold << "DIM_DNS: " << fDim.version() << endl;
     89
     90        PrintState(fDim);
     91        PrintState(fDimFTM);
     92        PrintState(fDimFAD);
     93        PrintState(fDimLog);
     94        PrintState(fDimRC);
    14995
    15096        return GetCurrentState();
    15197    }
    15298
    153 
    154     void PrintState(const pair<Time,int> &state, const char *server)
    155     {
    156         const State rc = fNetwork.GetState(server, state.second);
    157 
    158         Out() << state.first.GetAsStr("%H:%M:%S.%f").substr(0, 12) << " - ";
    159         Out() << kBold << server << ": ";
    160         Out() << rc.name << "[" << rc.index << "]";
    161         Out() << kReset << " - " << kBlue << rc.comment << endl;
    162     }
    163 
    164     int Print()
    165     {
    166         Out() << fStatusDim.first.GetAsStr("%H:%M:%S.%f").substr(0, 12) << " - ";
    167         Out() << kBold << "DIM_DNS: ";
    168         if (fStatusDim.second==0)
    169             Out() << "Offline" << endl;
    170         else
    171             Out() << "V" << fStatusDim.second/100 << 'r' << fStatusDim.second%100 << endl;
    172 
    173         PrintState(fStatusFTM, "FTM_CONTROL");
    174         PrintState(fStatusFAD, "FAD_CONTROL");
    175         PrintState(fStatusLog, "DATA_LOGGER");
    176         PrintState(fStatusRC,  "RATE_CONTROL");
    177 
     99    int GetReady()
     100    {
    178101        return GetCurrentState();
    179102    }
    180103
    181     int GetReady()
    182     {
    183         return GetCurrentState();
    184     }
    185 
    186104    int StopRun(const EventImp &)
    187105    {
    188         if (fStatusFTM.second==FTM::kTriggerOn)
     106        if (fDimFTM.state()==FTM::kTriggerOn)
    189107        {
    190108            Message("Stopping FTM");
     
    193111
    194112        // FIXME: Do step 2 only when FTM is stopped
    195         if (fStatusFAD.second==FAD::kConnected)
     113        if (fDimFAD.state()==FAD::kConnected)
    196114        {
    197115            //Dim::SendCommand("FAD_CONTROL/ENABLE_TRIGGER_LINE",      bool(false));
     
    213131        /*
    214132        // FIMXE: Handle error states!
    215         if (fStatusLog.second>=20)//kSM_NightlyOpen
     133        if (fDimLog.state()>=20)//kSM_NightlyOpen
    216134            Dim::SendCommand("DATA_LOGGER/STOP");
    217135
    218         if (fStatusLog.second==0)
     136        if (fDimLog.state()==0)
    219137            Dim::SendCommand("DATA_LOGGER/WAIT_FOR_RUN_NUMBER");
    220138
    221         if (fStatusFAD.second==FAD::kConnected)
     139        if (fDimFAD.state()==FAD::kConnected)
    222140        {
    223141            Dim::SendCommand("FAD_CONTROL/ENABLE_TRIGGER_LINE", bool(false));
     
    225143        }
    226144
    227         if (fStatusFTM.second==FTM::kTakingData)
     145        if (fDimFTM.state()==FTM::kTakingData)
    228146            Dim::SendCommand("FTM_CONTROL/STOP");
    229147
     
    237155    int StartRun(const EventImp &evt)
    238156    {
    239         if (fStatusFTM.second==-2)
     157        if (fDimFTM.state()==-2)
    240158        {
    241159            Error("No connection to ftmcontrol (see PRINT).");
    242160            return GetCurrentState();
    243161        }
    244         if (fStatusFAD.second==-2)
     162        if (fDimFAD.state()==-2)
    245163        {
    246164            Warn("No connection to fadcontrol (see PRINT).");
    247165            return GetCurrentState();
    248166        }
    249         if (fStatusLog.second==-2)
     167        if (fDimLog.state()==-2)
    250168        {
    251169            Warn("No connection to datalogger (see PRINT).");
    252170            return GetCurrentState();
    253171        }
    254         if (fStatusRC.second==-2)
     172        if (fDimRC.state()==-2)
    255173        {
    256174            Warn("No connection to ratecontrol (see PRINT).");
     
    332250        //poll_one();
    333251
    334         if (fStatusDim.second==0)
     252        if (!fDim.online())
    335253            return kStateDimNetworkNA;
    336254
    337         if (fStatusFTM.second >= FTM::kConnected &&
    338             fStatusFAD.second >= FAD::kConnected &&
    339             fStatusLog.second >= kSM_Ready)
     255        if (fDimFTM.state() >= FTM::kConnected &&
     256            fDimFAD.state() >= FAD::kConnected &&
     257            fDimLog.state() >= kSM_Ready)
    340258        {
    341259            if (GetCurrentState()==kStateConfiguring1)
    342260            {
    343                 if (fStatusLog.second<30/*kSM_WaitForRun*/)
     261                if (fDimLog.state()<30/*kSM_WaitForRun*/)
    344262                {
    345263                    Message("Starting datalogger");
     
    355273            {
    356274                // FIMXE: Reset in case of error
    357                 if ((/*fStatusFTM.second != FTM::kConfiguring2 &&*/
    358                      fStatusFTM.second != FTM::kConfigured) ||
    359                     fStatusLog.second<30 || fStatusLog.second>0xff)
     275                if ((/*fDimFTM.state() != FTM::kConfiguring2 &&*/
     276                     fDimFTM.state() != FTM::kConfigured) ||
     277                    fDimLog.state()<30 || fDimLog.state()>0xff)
    360278                    return GetCurrentState();
    361279
     
    374292            if (GetCurrentState()==kStateConfiguring3)
    375293            {
    376                 if (fStatusFTM.second != FTM::kConfigured ||
    377                     fStatusFAD.second != FAD::kConfigured ||
    378                     fStatusRC.second  < 6)
     294                if (fDimFTM.state() != FTM::kConfigured ||
     295                    fDimFAD.state() != FAD::kConfigured ||
     296                    fDimRC.state()  < 6)
    379297                    return GetCurrentState();
    380298
     
    387305            if (GetCurrentState()==kStateConfigured)
    388306            {
    389                 if (fStatusFTM.second != FTM::kTriggerOn)
     307                if (fDimFTM.state() != FTM::kTriggerOn)
    390308                    return GetCurrentState();
    391309
     
    397315            if (GetCurrentState()==kStateTriggerOn)
    398316            {
    399                 if (fStatusFAD.second != FAD::kWritingData)
     317                if (fDimFAD.state() != FAD::kWritingData)
    400318                    return GetCurrentState();
    401319
     
    407325            if (GetCurrentState()==kStateTakingData)
    408326            {
    409                 if (fStatusFTM.second==FTM::kTriggerOn &&
    410                     fStatusFAD.second==FAD::kWritingData)
     327                if (fDimFTM.state()==FTM::kTriggerOn &&
     328                    fDimFAD.state()==FAD::kWritingData)
    411329                    return kStateTakingData;
    412330
     
    418336
    419337        /*
    420         if (fStatusFTM.second >= FTM::kConnected &&
    421             fStatusFAD.second >= FAD::kConnected &&
    422             fStatusLog.second >= kSM_Ready)
     338        if (fDimFTM.state() >= FTM::kConnected &&
     339            fDimFAD.state() >= FAD::kConnected &&
     340            fDimLog.state() >= kSM_Ready)
    423341            return kStateIdle;
    424342         */
    425         if (fStatusFTM.second >-2 &&
    426             fStatusFAD.second >-2 &&
    427             fStatusLog.second >-2 &&
    428             fStatusRC.second >-2)
     343        if (fDimFTM.state() >-2 &&
     344            fDimFAD.state() >-2 &&
     345            fDimLog.state() >-2 &&
     346            fDimRC.state() >-2)
    429347            return kStateConnected;
    430348
    431         if (fStatusFTM.second >-2 ||
    432             fStatusFAD.second >-2 ||
    433             fStatusLog.second >-2 ||
    434             fStatusRC.second >-2)
     349        if (fDimFTM.state() >-2 ||
     350            fDimFAD.state() >-2 ||
     351            fDimLog.state() >-2 ||
     352            fDimRC.state() >-2)
    435353            return kStateConnecting;
    436354
     
    440358public:
    441359    StateMachineMCP(ostream &out=cout) : StateMachineDim(out, "MCP"),
    442         fStatusDim(make_pair(Time(), -2)),
    443         fStatusFTM(make_pair(Time(), -2)),
    444         fStatusFAD(make_pair(Time(), -2)),
    445         fStatusLog(make_pair(Time(), -2)),
    446         fDim("DIS_DNS/VERSION_NUMBER", (void*)NULL, 0, this),
    447         fFTM("FTM_CONTROL/STATE",      (void*)NULL, 0, this),
    448         fFAD("FAD_CONTROL/STATE",      (void*)NULL, 0, this),
    449         fLog("DATA_LOGGER/STATE",      (void*)NULL, 0, this),
    450         fRC("RATE_CONTROL/STATE",      (void*)NULL, 0, this),
     360        fDimFTM("FTM_CONTROL"),
     361        fDimFAD("FAD_CONTROL"),
     362        fDimLog("DATA_LOGGER"),
     363        fDimRC("RATE_CONTROL"),
    451364        fService("MCP/CONFIGURATION", "X:1;X:1;C", "Run configuration information"
    452365                 "|MaxTime[s]:Maximum time before the run gets stopped"
     
    461374        // deletion and creation of threads and more.
    462375
     376        fDim.Subscribe(*this);
     377        fDimFTM.Subscribe(*this);
     378        fDimFAD.Subscribe(*this);
     379        fDimLog.Subscribe(*this);
     380        fDimRC.Subscribe(*this);
     381
    463382        // State names
    464383        AddStateName(kStateDimNetworkNA, "DimNetworkNotAvailable",
     
    513432             "is also propagated to FTM and FAD");
    514433
    515         // Verbosity commands
    516         AddEvent("SET_VERBOSE", "B:1")
    517             (bind(&StateMachineMCP::SetVerbosity, this, placeholders::_1))
    518             ("set verbosity state"
    519              "|verbosity[bool]:disable or enable verbosity for received data (yes/no), except dynamic data");
    520 
    521434        AddEvent("PRINT")
    522435            (bind(&StateMachineMCP::Print, this))
     
    526439    int EvalOptions(Configuration &)
    527440    {
    528         //SetEndpoint(conf.Get<string>("addr"));
    529 
    530         //fFSC.SetVerbose(!conf.Get<bool>("quiet"));
    531 
    532441        return -1;
    533442    }
  • trunk/FACT++/src/ratecontrol.cc

    r13756 r13838  
    2727
    2828#include "DimDescriptionService.h"
     29#include "DimState.h"
    2930
    3031// ------------------------------------------------------------------------
    3132
    32 class StateMachineRateControl : public StateMachineDim, public DimInfoHandler
     33class StateMachineRateControl : public StateMachineDim//, public DimInfoHandler
    3334{
    3435private:
     
    5051    vector<bool> fBlock;
    5152
    52     DimServiceInfoList fNetwork;
    53 
    54     pair<Time, int> fStatusDim;
    55     pair<Time, int> fStatusFTM;
    56     pair<Time, int> fStatusRS;
    57 
    58     DimStampedInfo fDim;
    59     DimStampedInfo fFTM;
    60     DimStampedInfo fRates;
    61     DimStampedInfo fStatic;
    62     DimStampedInfo fRateScan;
    63 
    64 //    DimDescribedService fDimData;
    65 //    DimDescribedService fDimProc;
     53    DimServiceInfoListImp fNetwork;
     54
     55    DimVersion fDim;
     56    DimState   fDimFTM;
     57    DimState   fDimRS;
    6658
    6759    float  fTargetRate;
     
    7668    uint64_t fCounter;
    7769
    78     pair<Time, int> GetNewState(DimStampedInfo &info) const
    79     {
    80         const bool disconnected = info.getSize()==0;
    81 
    82         // Make sure getTimestamp is called _before_ getTimestampMillisecs
    83         const int tsec = info.getTimestamp();
    84         const int tms  = info.getTimestampMillisecs();
    85 
    86         return make_pair(Time(tsec, tms*1000),
    87                          disconnected ? -2 : info.getQuality());
    88     }
    89 
    90     bool CheckEventSize(size_t has, const char *name, size_t size)
    91     {
    92         if (has==size)
     70    bool CheckEventSize(const EventImp &evt, size_t size)
     71    {
     72        if (size_t(evt.GetSize())==size)
    9373            return true;
    9474
    95         if (has==0)
     75        if (evt.GetSize()==0)
    9676            return false;
    9777
    9878        ostringstream msg;
    99         msg << name << " - Received event has " << has << " bytes, but expected " << size << ".";
     79        msg << evt.GetName() << " - Received event has " << evt.GetSize() << " bytes, but expected " << size << ".";
    10080        Fatal(msg);
    10181        return false;
     
    343323    }
    344324
    345     void infoHandler()
    346     {
    347         DimInfo *curr = getInfo(); // get current DimInfo address
    348         if (!curr)
    349             return;
    350 
    351         if (curr==&fFTM)
    352         {
    353             fStatusFTM = GetNewState(fFTM);
    354             return;
    355         }
    356 
    357         if (curr==&fDim)
    358         {
    359             fStatusDim = GetNewState(fDim);
    360             fStatusDim.second = curr->getSize()==4 ? curr->getInt() : 0;
    361             return;
    362         }
    363         if (curr==&fRateScan)
    364         {
    365             fStatusRS = GetNewState(fRateScan);
    366             fStatusRS.second = curr->getSize()==4 ? curr->getInt() : 0;
    367             return;
    368         }
    369 
    370         static vector<uint8_t> counter(160);
    371         if (curr==&fStatic)
    372         {
    373             if (!CheckEventSize(curr->getSize(), "infoHandler[DimStaticData]", sizeof(FTM::DimStaticData)))
    374                 return;
    375 
    376             const FTM::DimStaticData &sdata = *static_cast<FTM::DimStaticData*>(curr->getData());
    377             fTriggerOn = sdata.HasTrigger();
    378  
    379             PrintThresholds(sdata);
    380 
    381             fThresholds.assign(sdata.fThreshold, sdata.fThreshold+160);
    382             return;
    383         }
    384 
    385         if (curr==&fRates)
    386         {
    387             if (fThresholds.size()==0)
    388                 return;
    389 
    390             if (!fTriggerOn && !fEnabled)
    391                 return;
    392 
    393             if (fStatusRS.second==5)
    394                 return;
    395 
    396             if (!CheckEventSize(curr->getSize(), "infoHandler[DimTriggerRates]", sizeof(FTM::DimTriggerRates)))
    397                 return;
    398 
    399             const FTM::DimTriggerRates &sdata = *static_cast<FTM::DimTriggerRates*>(curr->getData());
    400 
    401             if (GetCurrentState()==kStateSettingGlobalThreshold)
    402                 ProcessCamera(sdata);
    403 
    404             if (GetCurrentState()==kStateInProgress)
    405                 ProcessPatches(sdata);
    406         }
     325    int HandleStaticData(const EventImp &evt)
     326    {
     327        if (!CheckEventSize(evt, sizeof(FTM::DimStaticData)))
     328            return GetCurrentState();
     329
     330        const FTM::DimStaticData &sdata = *static_cast<const FTM::DimStaticData*>(evt.GetData());
     331        fTriggerOn = sdata.HasTrigger();
     332
     333        PrintThresholds(sdata);
     334
     335        fThresholds.assign(sdata.fThreshold, sdata.fThreshold+160);
     336
     337        return GetCurrentState();
     338    }
     339
     340    int HandleTriggerRates(const EventImp &evt)
     341    {
     342        if (fThresholds.size()==0)
     343            return GetCurrentState();
     344
     345        if (!fTriggerOn && !fEnabled)
     346            return GetCurrentState();
     347
     348        if (fDimRS.state()==5)
     349            return GetCurrentState();
     350
     351        if (!CheckEventSize(evt, sizeof(FTM::DimTriggerRates)))
     352            return GetCurrentState();
     353
     354        const FTM::DimTriggerRates &sdata = *static_cast<const FTM::DimTriggerRates*>(evt.GetData());
     355
     356        if (GetCurrentState()==kStateSettingGlobalThreshold)
     357            ProcessCamera(sdata);
     358
     359        if (GetCurrentState()==kStateInProgress)
     360            ProcessPatches(sdata);
     361
     362        return GetCurrentState();
    407363    }
    408364
     
    446402    int SetEnabled(const EventImp &evt)
    447403    {
    448         if (!CheckEventSize(evt.GetSize(), "SetEnabled", 1))
     404        if (!CheckEventSize(evt, 1))
    449405            return kSM_FatalError;
    450406
     
    456412    int SetMinThreshold(const EventImp &evt)
    457413    {
    458         if (!CheckEventSize(evt.GetSize(), "SetMinThreshold", 4))
     414        if (!CheckEventSize(evt, 4))
    459415            return kSM_FatalError;
    460416
     
    468424    int SetTargetRate(const EventImp &evt)
    469425    {
    470         if (!CheckEventSize(evt.GetSize(), "SetTargetRate", 4))
     426        if (!CheckEventSize(evt, 4))
    471427            return kSM_FatalError;
    472428
     
    475431        return GetCurrentState();
    476432    }
    477 
     433/*
    478434    void PrintState(const pair<Time,int> &state, const char *server)
    479435    {
     
    500456        return GetCurrentState();
    501457    }
     458    */
     459
     460    const State GetState(const DimState &s) const
     461    {
     462        return fNetwork.GetState(s.name(), s.state());
     463    }
     464
     465    void PrintState(const DimState &state) const
     466    {
     467        const State rc = GetState(state);
     468
     469        Out() << state.time().GetAsStr("%H:%M:%S.%f").substr(0, 12) << " - ";
     470        Out() << kBold << state.name() << ": ";
     471        if (rc.index==-3)
     472        {
     473            Out() << kReset << "Offline" << endl;
     474            return;
     475        }
     476        if (rc.index==-2)
     477            Out() << state.state();
     478        else
     479            Out() << rc.name << "[" << rc.index << "]";
     480        Out() << kReset << " - " << kBlue << rc.comment << endl;
     481    }
     482
     483    int Print() const
     484    {
     485        Out() << fDim.time().GetAsStr("%H:%M:%S.%f").substr(0, 12) << " - ";
     486        Out() << kBold << "DIM_DNS: " << fDim.version() << endl;
     487
     488        PrintState(fDimFTM);
     489        PrintState(fDimRS);
     490
     491        return GetCurrentState();
     492    }
    502493
    503494    int SetVerbosity(const EventImp &evt)
    504495    {
    505         if (!CheckEventSize(evt.GetSize(), "SetVerbosity", 1))
     496        if (!CheckEventSize(evt, 1))
    506497            return kSM_FatalError;
    507498
     
    520511        //poll_one();
    521512
    522         if (fStatusDim.second==0)
     513        if (!fDim.online())
    523514            return kStateDimNetworkNA;
    524515
    525516        // All subsystems are not connected
    526         if (fStatusFTM.second<FTM::kConnected)
     517        if (fDimFTM.state()<FTM::kConnected)
    527518            return kStateDisconnected;
    528519
     
    543534
    544535        // At least one subsystem is not connected
    545         //        if (fStatusFTM.second>=FTM::kConnected)
    546         return fTriggerOn && fEnabled && fStatusRS.second!=5 ? kStateInProgress : kStateConnected;
     536        //        if (fDimFTM.state()>=FTM::kConnected)
     537        return fTriggerOn && fEnabled && fDimRS.state()!=5 ? kStateInProgress : kStateConnected;
    547538    }
    548539
     
    550541    StateMachineRateControl(ostream &out=cout) : StateMachineDim(out, "RATE_CONTROL"),
    551542        fTriggerOn(false), fBlock(40),
    552         fStatusDim(make_pair(Time(), -2)),
    553         fStatusFTM(make_pair(Time(), -2)),
    554         fDim("DIS_DNS/VERSION_NUMBER",  (void*)NULL, 0, this),
    555         fFTM("FTM_CONTROL/STATE",       (void*)NULL, 0, this),
    556         fRates("FTM_CONTROL/TRIGGER_RATES", (void*)NULL, 0, this),
    557         fStatic("FTM_CONTROL/STATIC_DATA", (void*)NULL, 0, this),
    558         fRateScan("RATE_SCAN/STATE", (void*)NULL, 0, this)/*,
    559         fDimData("RATE_SCAN/DATA", "I:1;F:1;F:1;F:1;F:40;F:160", ""),
    560         fDimProc("RATE_SCAN/PROCESS_DATA", "I:1;I:1;I:1",
    561                  "Rate scan process data"
    562                  "|min[DAC]:Value at which scan was started"
    563                  "|max[DAC]:Value at which scan will end"
    564                  "|step[DAC]:Step size for scan")*/
     543        fDimFTM("FTM_CONTROL"),
     544        fDimRS("RATE_SCAN")
    565545    {
    566546        // ba::io_service::work is a kind of keep_alive for the loop.
     
    570550        // previous state but this might introduce some overhead of
    571551        // deletion and creation of threads and more.
     552
     553        fDim.Subscribe(*this);
     554        fDimFTM.Subscribe(*this);
     555        fDimRS.Subscribe(*this);
     556
     557        Subscribe("FTM_CONTROL/TRIGGER_RATES")
     558            (bind(&StateMachineRateControl::HandleTriggerRates, this, placeholders::_1));
     559        Subscribe("FTM_CONTROL/STATIC_DATA")
     560            (bind(&StateMachineRateControl::HandleStaticData,   this, placeholders::_1));
    572561
    573562        // State names
  • trunk/FACT++/src/ratescan.cc

    r13761 r13838  
    1818#include "HeadersFTM.h"
    1919
    20 namespace ba    = boost::asio;
    21 namespace bs    = boost::system;
    22 namespace dummy = ba::placeholders;
     20namespace ba = boost::asio;
     21namespace bs = boost::system;
    2322
    2423using namespace std;
     
    2726
    2827#include "DimDescriptionService.h"
     28#include "DimState.h"
    2929
    3030// ------------------------------------------------------------------------
    3131
    32 class StateMachineRateScan : public StateMachineDim, public DimInfoHandler
     32class StateMachineRateScan : public StateMachineDim
    3333{
    34     /*
    35     int Wrap(boost::function<void()> f)
    36     {
    37         f();
    38         return T::GetCurrentState();
    39     }
    40 
    41     boost::function<int(const EventImp &)> Wrapper(boost::function<void()> func)
    42     {
    43         return bind(&StateMachineMCP::Wrap, this, func);
    44     }*/
    45 
    4634private:
    4735    enum states_t
     
    5442    };
    5543
    56 //    PixelMap fMap;
    57 
    58     DimServiceInfoList fNetwork;
    59 
    60     pair<Time, int> fStatusDim;
    61     pair<Time, int> fStatusFTM;
    62 
    63     DimStampedInfo fDim;
    64     DimStampedInfo fFTM;
    65     DimStampedInfo fRates;
     44    DimServiceInfoListImp fNetwork;
     45
     46    DimVersion fDim;
     47    DimState   fDimFTM;
    6648
    6749    DimDescribedService fDimData;
     
    10587    }
    10688
    107     pair<Time, int> GetNewState(DimStampedInfo &info) const
    108     {
    109         const bool disconnected = info.getSize()==0;
    110 
    111         // Make sure getTimestamp is called _before_ getTimestampMillisecs
    112         const int tsec = info.getTimestamp();
    113         const int tms  = info.getTimestampMillisecs();
    114 
    115         return make_pair(Time(tsec, tms*1000),
    116                          disconnected ? -2 : info.getQuality());
    117     }
    118 
    119     bool CheckEventSize(size_t has, const char *name, size_t size)
    120     {
    121         if (has==size)
     89    bool CheckEventSize(const EventImp &evt, size_t size)
     90    {
     91        if (size_t(evt.GetSize())==size)
    12292            return true;
    12393
    124         if (has==0)
     94        if (evt.GetSize()==0)
    12595            return false;
    12696
    12797        ostringstream msg;
    128         msg << name << " - Received event has " << has << " bytes, but expected " << size << ".";
     98        msg << evt.GetName() << " - Received event has " << evt.GetSize() << " bytes, but expected " << size << ".";
    12999        Fatal(msg);
    130100        return false;
    131101    }
    132102
    133     void infoHandler()
    134     {
    135         DimInfo *curr = getInfo(); // get current DimInfo address
    136         if (!curr)
     103    int HandleTriggerRates(const EventImp &evt)
     104    {
     105        if (!CheckEventSize(evt, sizeof(FTM::DimTriggerRates)))
     106            return GetCurrentState();
     107
     108        if (fThreshold<0/* || fDimFTM.state()!=FTM::kTakingData*/)
     109            return GetCurrentState();
     110
     111        const FTM::DimTriggerRates &sdata = *static_cast<const FTM::DimTriggerRates*>(evt.GetData());
     112
     113        if (++fCounter<0)
     114            return GetCurrentState();
     115
     116        if (fCounter==0)
     117        {
     118            fRate = 0;
     119
     120            memset(fRateBoard, 0,  40*sizeof(double));
     121            memset(fRatePatch, 0, 160*sizeof(double));
     122
     123            fOnTime = 0;
     124            return GetCurrentState();
     125        }
     126/*
     127        if (sdata.fTriggerRate==0)
     128        {
     129            Message("Rate scan stopped due zero trigger rate.");
     130            fThreshold = -1;
    137131            return;
    138 
    139         if (curr==&fFTM)
    140         {
    141             fStatusFTM = GetNewState(fFTM);
     132        }
     133*/
     134
     135        fRate += sdata.fTriggerRate;
     136        for (int i=0; i<40; i++)
     137            fRateBoard[i] += sdata.fBoardRate[i];
     138        for (int i=0; i<160; i++)
     139            fRatePatch[i] += sdata.fPatchRate[i];
     140
     141        double reference = fRate;
     142        if (fReference==kBoard)
     143            reference = fRateBoard[fReferenceIdx];
     144        if (fReference==kPatch)
     145            reference = fRatePatch[fReferenceIdx];
     146
     147        fOnTime += sdata.fOnTime;
     148
     149        reference *= sdata.fElapsedTime;
     150
     151        if ((reference==0 || sqrt(reference)>fResolution*reference) && fCounter<fCounterMax)
     152        {
     153            ostringstream out;
     154            out << "Triggers so far: " << reference;
     155            if (reference>0)
     156                out << " (" << sqrt(reference)/reference << ")";
     157            Info(out);
     158
     159            return GetCurrentState();
     160        }
     161
     162        const double   time = sdata.fElapsedTime*fCounter;
     163        const uint32_t th   = fThreshold;
     164
     165        float data[2+3+1+40+160];
     166        memcpy(data,   &fStartTime, 8);
     167        memcpy(data+2, &th, 4);
     168        data[3] = time;         // total elapsed time
     169        data[4] = fOnTime/time; // relative on time
     170        data[5] = fRate/fCounter;
     171        for (int i=0; i<40; i++)
     172            data[i+6] = fRateBoard[i]/fCounter;
     173        for (int i=0; i<160; i++)
     174            data[i+46] = fRatePatch[i]/fCounter;
     175
     176        ostringstream sout1, sout2, sout3;
     177
     178        sout1 << th << " " << data[5];
     179        for (int i=0; i<200; i++)
     180            sout2 << " " << data[i+6];
     181        sout3 << " " << data[3] << " " << data[4];
     182
     183        Info(sout1.str());
     184
     185        ofstream fout("ratescan.txt", ios::app);
     186        fout << sout1.str() << sout2.str() << sout3.str() << endl;
     187
     188        fDimData.setQuality(fCommand=="FTM_CONTROL/SET_THRESHOLD");
     189        fDimData.setData(data, sizeof(data));
     190        fDimData.Update();
     191
     192        fThreshold += fThresholdStep;
     193
     194        if (fCounter>=fCounterMax)
     195        {
     196            Message("Rate scan stopped due to timeout.");
     197            fThreshold=-1;
     198            return GetCurrentState();
     199        }
     200
     201        if (fThreshold>fThresholdMax)
     202        {
     203            Message("Rate scan finished.");
     204            fThreshold = -1;
     205            return GetCurrentState();
     206        }
     207
     208        // Does this need to be shifted upwards?
     209        if (fCounter>1 && fThresholdStepDyn>0)
     210        {
     211            //const double scale = fCounter/reference/fResolution/fResolution;
     212            //const double step  = floor(scale*fThresholdStepDyn);
     213
     214            fThresholdStep = fCounter*fThresholdStepDyn;
     215        }
     216
     217        //fCounter = -2;  // FIXME: In principle one missed report is enough
     218        fCounter = -1;
     219
     220        const int32_t cmd[2] = { -1, fThreshold };
     221        DimClient::sendCommandNB(fCommand.c_str(), (void*)cmd, 8);
     222
     223        return GetCurrentState();
     224    }
     225
     226    const State GetState(const DimState &s) const
     227    {
     228        return fNetwork.GetState(s.name(), s.state());
     229    }
     230
     231    void PrintState(const DimState &state) const
     232    {
     233        const State rc = GetState(state);
     234
     235        Out() << state.time().GetAsStr("%H:%M:%S.%f").substr(0, 12) << " - ";
     236        Out() << kBold << state.name() << ": ";
     237        if (rc.index==-3)
     238        {
     239            Out() << kReset << "Offline" << endl;
    142240            return;
    143241        }
    144 
    145         if (curr==&fDim)
    146         {
    147             fStatusDim = GetNewState(fDim);
    148             fStatusDim.second = curr->getSize()==4 ? curr->getInt() : 0;
    149             return;
    150         }
    151 
    152         if (curr==&fRates)
    153         {
    154             if (!CheckEventSize(curr->getSize(), "infoHandler[DimTriggerRates]", sizeof(FTM::DimTriggerRates)))
    155                 return;
    156 
    157             if (fThreshold<0/* || fStatusFTM.second!=FTM::kTakingData*/)
    158                 return;
    159 
    160             const FTM::DimTriggerRates &sdata = *static_cast<FTM::DimTriggerRates*>(curr->getData());
    161 
    162             if (++fCounter<0)
    163                 return;
    164 
    165             if (fCounter==0)
    166             {
    167                 fRate = 0;
    168 
    169                 memset(fRateBoard, 0,  40*sizeof(double));
    170                 memset(fRatePatch, 0, 160*sizeof(double));
    171 
    172                 fOnTime = 0;
    173                 return;
    174             }
    175 /*
    176             if (sdata.fTriggerRate==0)
    177             {
    178                 Message("Rate scan stopped due zero trigger rate.");
    179                 fThreshold = -1;
    180                 return;
    181             }
    182 */
    183 
    184             fRate += sdata.fTriggerRate;
    185             for (int i=0; i<40; i++)
    186                 fRateBoard[i] += sdata.fBoardRate[i];
    187             for (int i=0; i<160; i++)
    188                 fRatePatch[i] += sdata.fPatchRate[i];
    189 
    190             double reference = fRate;
    191             if (fReference==kBoard)
    192                 reference = fRateBoard[fReferenceIdx];
    193             if (fReference==kPatch)
    194                 reference = fRatePatch[fReferenceIdx];
    195 
    196             fOnTime += sdata.fOnTime;
    197 
    198             reference *= sdata.fElapsedTime;
    199 
    200             if ((reference==0 || sqrt(reference)>fResolution*reference) && fCounter<fCounterMax)
    201             {
    202                 ostringstream out;
    203                 out << "Triggers so far: " << reference;
    204                 if (reference>0)
    205                     out << " (" << sqrt(reference)/reference << ")";
    206                 Info(out);
    207 
    208                 return;
    209             }
    210 
    211             const double   time = sdata.fElapsedTime*fCounter;
    212             const uint32_t th   = fThreshold;
    213 
    214             float data[2+3+1+40+160];
    215             memcpy(data,   &fStartTime, 8);
    216             memcpy(data+2, &th, 4);
    217             data[3] = time;         // total elapsed time
    218             data[4] = fOnTime/time; // relative on time
    219             data[5] = fRate/fCounter;
    220             for (int i=0; i<40; i++)
    221                 data[i+6] = fRateBoard[i]/fCounter;
    222             for (int i=0; i<160; i++)
    223                 data[i+46] = fRatePatch[i]/fCounter;
    224 
    225             ostringstream sout1, sout2, sout3;
    226 
    227             sout1 << th << " " << data[5];
    228             for (int i=0; i<200; i++)
    229                 sout2 << " " << data[i+6];
    230             sout3 << " " << data[3] << " " << data[4];
    231 
    232             Info(sout1.str());
    233 
    234             ofstream fout("ratescan.txt", ios::app);
    235             fout << sout1.str() << sout2.str() << sout3.str() << endl;
    236 
    237             fDimData.setQuality(fCommand=="FTM_CONTROL/SET_THRESHOLD");
    238             fDimData.setData(data, sizeof(data));
    239             fDimData.Update();
    240 
    241             fThreshold += fThresholdStep;
    242 
    243             if (fCounter>=fCounterMax)
    244             {
    245                 Message("Rate scan stopped due to timeout.");
    246                 fThreshold=-1;
    247                 return;
    248             }
    249 
    250             if (fThreshold>fThresholdMax)
    251             {
    252                 Message("Rate scan finished.");
    253                 fThreshold = -1;
    254                 return;
    255             }
    256 
    257             // Does this need to be shifted upwards?
    258             if (fCounter>1 && fThresholdStepDyn>0)
    259             {
    260                 //const double scale = fCounter/reference/fResolution/fResolution;
    261                 //const double step  = floor(scale*fThresholdStepDyn);
    262 
    263                 fThresholdStep = fCounter*fThresholdStepDyn;
    264             }
    265 
    266             //fCounter = -2;  // FIXME: In principle one missed report is enough
    267             fCounter = -1;
    268 
    269             const int32_t cmd[2] = { -1, fThreshold };
    270             DimClient::sendCommandNB(fCommand.c_str(), (void*)cmd, 8);
    271         }
    272     }
    273 
    274     void PrintState(const pair<Time,int> &state, const char *server)
    275     {
    276         const State rc = fNetwork.GetState(server, state.second);
    277 
    278         Out() << state.first.GetAsStr("%H:%M:%S.%f").substr(0, 12) << " - ";
    279         Out() << kBold << server << ": ";
    280         Out() << rc.name << "[" << rc.index << "]";
     242        if (rc.index==-2)
     243            Out() << state.state();
     244        else
     245            Out() << rc.name << "[" << rc.index << "]";
    281246        Out() << kReset << " - " << kBlue << rc.comment << endl;
    282247    }
    283248
    284     int Print()
    285     {
    286         Out() << fStatusDim.first.GetAsStr("%H:%M:%S.%f").substr(0, 12) << " - ";
    287         Out() << kBold << "DIM_DNS: ";
    288         if (fStatusDim.second==0)
    289             Out() << "Offline" << endl;
    290         else
    291             Out() << "V" << fStatusDim.second/100 << 'r' << fStatusDim.second%100 << endl;
    292 
    293         PrintState(fStatusFTM,  "FTM_CONTROL");
     249    int Print() const
     250    {
     251        Out() << fDim.time().GetAsStr("%H:%M:%S.%f").substr(0, 12) << " - ";
     252        Out() << kBold << "DIM_DNS: " << fDim.version() << endl;
     253
     254        PrintState(fDimFTM);
    294255
    295256        return GetCurrentState();
     
    298259    int StartRateScan(const EventImp &evt, const string &command)
    299260    {
    300         if (!CheckEventSize(evt.GetSize(), "StartRateScan", 12))
     261        if (!CheckEventSize(evt, 12))
    301262            return kSM_FatalError;
    302263
     
    355316        Message("Rate scan manually stopped.");
    356317
    357         //if (fStatusFTM.second==FTM::kTakingData)
     318        //if (fDimFTM.state()==FTM::kTakingData)
    358319        {
    359320            //Message("Stopping FTM");
     
    373334    int SetReferenceBoard(const EventImp &evt)
    374335    {
    375         if (!CheckEventSize(evt.GetSize(), "SetReferenceBoard", 4))
     336        if (!CheckEventSize(evt, 4))
    376337            return kSM_FatalError;
    377338
     
    390351    int SetReferencePatch(const EventImp &evt)
    391352    {
    392         if (!CheckEventSize(evt.GetSize(), "SetReferencePatch", 4))
     353        if (!CheckEventSize(evt, 4))
    393354            return kSM_FatalError;
    394355
     
    407368    int ChangeStepSize(const EventImp &evt)
    408369    {
    409         if (!CheckEventSize(evt.GetSize(), "ChangeStepSize", 4))
     370        if (!CheckEventSize(evt, 4))
    410371            return kSM_FatalError;
    411372
     
    423384    int ChangeMaximum(const EventImp &evt)
    424385    {
    425         if (!CheckEventSize(evt.GetSize(), "ChangeMaximum", 4))
     386        if (!CheckEventSize(evt, 4))
    426387            return kSM_FatalError;
    427388
     
    440401        //poll_one();
    441402
    442         if (fStatusDim.second==0)
     403        if (!fDim.online())
    443404            return kStateDimNetworkNA;
    444405
    445406        // All subsystems are not connected
    446         if (fStatusFTM.second<FTM::kConnected)
     407        if (fDimFTM.state()<FTM::kConnected)
    447408            return kStateDisconnected;
    448409
    449410        // At least one subsystem is not connected
    450         //        if (fStatusFTM.second>=FTM::kConnected)
     411        //        if (fDimFTM.state()>=FTM::kConnected)
    451412        return fThreshold<0 ? kStateConnected : kStateInProgress;
    452413    }
     
    454415public:
    455416    StateMachineRateScan(ostream &out=cout) : StateMachineDim(out, "RATE_SCAN"),
    456         fStatusDim(make_pair(Time(), -2)),
    457         fStatusFTM(make_pair(Time(), -2)),
    458         fDim("DIS_DNS/VERSION_NUMBER",  (void*)NULL, 0, this),
    459         fFTM("FTM_CONTROL/STATE",       (void*)NULL, 0, this),
    460         fRates("FTM_CONTROL/TRIGGER_RATES", (void*)NULL, 0, this),
     417        fDimFTM("FTM_CONTROL"),
    461418        fDimData("RATE_SCAN/DATA", "X:1;I:1;F:1;F:1;F:1;F:40;F:160",
    462419                 "|Id[s]:Start time used to identify measurement (UnixTime)"
     
    480437        // previous state but this might introduce some overhead of
    481438        // deletion and creation of threads and more.
     439
     440        fDim.Subscribe(*this);
     441        fDimFTM.Subscribe(*this);
     442
     443        Subscribe("FTM_CONTROL/TRIGGER_RATES")
     444            (bind(&StateMachineRateScan::HandleTriggerRates, this, placeholders::_1));
    482445
    483446        // State names
  • 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.