Ignore:
Timestamp:
05/26/12 14:49:54 (12 years ago)
Author:
tbretz
Message:
Replaced Execute by callbacks and moved state definition to own header file and namespace.
File:
1 edited

Legend:

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

    r13847 r13916  
    1414#include "HeadersFTM.h"
    1515#include "HeadersFAD.h"
    16 
     16#include "HeadersMCP.h"
     17#include "HeadersRateControl.h"
    1718
    1819namespace ba    = boost::asio;
     
    3233{
    3334private:
    34     enum states_t
    35     {
    36         kStateDimNetworkNA = 1,
    37         kStateDisconnected,
    38         kStateConnecting,
    39         kStateConnected,
    40         kStateIdle,
    41         kStateDummy, // Doesn't exist, kept to keep the numbers
    42         kStateConfiguring1,
    43         kStateConfiguring2,
    44         kStateConfiguring3,
    45         kStateConfigured,
    46         kStateTriggerOn,
    47         kStateTakingData,
    48 //        kStateRunInProgress,
    49     };
    50 
    5135    DimVersion fDim;
    5236    DimDescribedState fDimFTM;
     
    5943    int Print() const
    6044    {
    61         Out() << fDim << endl;
     45        Out() << fDim    << endl;
    6246        Out() << fDimFTM << endl;
    6347        Out() << fDimFAD << endl;
    6448        Out() << fDimLog << endl;
    65         Out() << fDimRC << endl;
     49        Out() << fDimRC  << endl;
    6650
    6751        return GetCurrentState();
     
    7559    int StopRun(const EventImp &)
    7660    {
    77         if (fDimFTM.state()==FTM::kTriggerOn)
     61        if (fDimFTM.state()==FTM::State::kTriggerOn)
    7862        {
    7963            Message("Stopping FTM");
    80             Dim::SendCommand("FTM_CONTROL/STOP_TRIGGER");
     64            Dim::SendCommandNB("FTM_CONTROL/STOP_TRIGGER");
    8165        }
    8266
    8367        // FIXME: Do step 2 only when FTM is stopped
    84         if (fDimFAD.state()==FAD::kConnected)
     68        if (fDimFAD.state()==FAD::State::kConnected)
    8569        {
    8670            //Dim::SendCommand("FAD_CONTROL/ENABLE_TRIGGER_LINE",      bool(false));
    8771            Message("Stopping FAD");
    88             Dim::SendCommand("FAD_CONTROL/ENABLE_CONTINOUS_TRIGGER", bool(false));
     72            Dim::SendCommandNB("FAD_CONTROL/ENABLE_CONTINOUS_TRIGGER", bool(false));
    8973        }
    9074
     
    9680        fRunType = "";
    9781        Message("Reseting configuration states of FAD and FTM");
    98         Dim::SendCommand("FTM_CONTROL/RESET_CONFIGURE");
    99         Dim::SendCommand("FAD_CONTROL/RESET_CONFIGURE");
    100         Update(kStateIdle);
    101         return kStateIdle;
     82        Dim::SendCommandNB("FTM_CONTROL/RESET_CONFIGURE");
     83        Dim::SendCommandNB("FAD_CONTROL/RESET_CONFIGURE");
     84        Update(MCP::State::kIdle);
     85        return MCP::State::kIdle;
    10286        /*
    10387        // FIMXE: Handle error states!
     
    10892            Dim::SendCommand("DATA_LOGGER/WAIT_FOR_RUN_NUMBER");
    10993
    110         if (fDimFAD.state()==FAD::kConnected)
     94        if (fDimFAD.state()==FAD::State::kConnected)
    11195        {
    11296            Dim::SendCommand("FAD_CONTROL/ENABLE_TRIGGER_LINE", bool(false));
     
    11498        }
    11599
    116         if (fDimFTM.state()==FTM::kTakingData)
     100        if (fDimFTM.state()==FTM::State::kTakingData)
    117101            Dim::SendCommand("FTM_CONTROL/STOP");
    118102
     
    126110    int StartRun(const EventImp &evt)
    127111    {
    128         if (fDimFTM.state()==-2)
     112        if (!fDimFTM.online())
    129113        {
    130114            Error("No connection to ftmcontrol (see PRINT).");
    131115            return GetCurrentState();
    132116        }
    133         if (fDimFAD.state()==-2)
     117        if (!fDimFAD.online())
    134118        {
    135119            Warn("No connection to fadcontrol (see PRINT).");
    136120            return GetCurrentState();
    137121        }
    138         if (fDimLog.state()==-2)
     122        if (!fDimLog.online())
    139123        {
    140124            Warn("No connection to datalogger (see PRINT).");
    141125            return GetCurrentState();
    142126        }
    143         if (fDimRC.state()==-2)
     127        if (!fDimRC.online())
    144128        {
    145129            Warn("No connection to ratecontrol (see PRINT).");
     
    165149        Message(str);
    166150
    167         Update(kStateConfiguring1);
    168 
    169         return kStateConfiguring1;
     151        Update(MCP::State::kConfiguring1);
     152
     153        return MCP::State::kConfiguring1;
    170154    }
    171155
     
    207191
    208192        Message("Configuring FAD");
    209         Dim::SendCommand("FAD_CONTROL/CONFIGURE", buf, sizeof(Value)+fRunType.length()+1);
     193        Dim::SendCommandNB("FAD_CONTROL/CONFIGURE", buf, sizeof(Value)+fRunType.length()+1);
    210194
    211195        delete buf;
    212196    }
    213197
    214     int Execute()
    215     {
    216         // Dispatch (execute) at most one handler from the queue. In contrary
    217         // to run_one(), it doesn't wait until a handler is available
    218         // which can be dispatched, so poll_one() might return with 0
    219         // handlers dispatched. The handlers are always dispatched/executed
    220         // synchronously, i.e. within the call to poll_one()
    221         //poll_one();
    222 
     198    int HandleStateChange()
     199    {
    223200        if (!fDim.online())
    224             return kStateDimNetworkNA;
    225 
    226         if (fDimFTM.state() >= FTM::kConnected &&
    227             fDimFAD.state() >= FAD::kConnected &&
     201            return MCP::State::kDimNetworkNA;
     202
     203        if (fDimFTM.state() >= FTM::State::kConnected &&
     204            fDimFAD.state() >= FAD::State::kConnected &&
    228205            fDimLog.state() >= kSM_Ready)
    229206        {
    230             if (GetCurrentState()==kStateConfiguring1)
     207            if (GetCurrentState()==MCP::State::kConfiguring1)
    231208            {
    232209                if (fDimLog.state()<30/*kSM_WaitForRun*/)
    233210                {
    234211                    Message("Starting datalogger");
    235                     Dim::SendCommand("DATA_LOGGER/START_RUN_LOGGING");
     212                    Dim::SendCommandNB("DATA_LOGGER/START_RUN_LOGGING");
    236213                }
    237214                Message("Configuring Trigger (FTM)");
    238                 Dim::SendCommand("FTM_CONTROL/CONFIGURE", fRunType);
    239                 Update(kStateConfiguring2);
    240                 return kStateConfiguring2;
    241             }
    242 
    243             if (GetCurrentState()==kStateConfiguring2)
     215                Dim::SendCommandNB("FTM_CONTROL/CONFIGURE", fRunType);
     216                Update(MCP::State::kConfiguring2);
     217                return MCP::State::kConfiguring2;
     218            }
     219
     220            if (GetCurrentState()==MCP::State::kConfiguring2)
    244221            {
    245222                // FIMXE: Reset in case of error
    246                 if ((/*fDimFTM.state() != FTM::kConfiguring2 &&*/
    247                      fDimFTM.state() != FTM::kConfigured) ||
     223                if ((/*fDimFTM.state() != FTM::State::kConfiguring2 &&*/
     224                     fDimFTM.state() != FTM::State::kConfigured) ||
    248225                    fDimLog.state()<30 || fDimLog.state()>0xff)
    249226                    return GetCurrentState();
     
    254231
    255232                Message("Starting Rate Control");
    256                 Dim::SendCommand("RATE_CONTROL/CALIBRATE");
     233                Dim::SendCommandNB("RATE_CONTROL/CALIBRATE");
    257234
    258235                ConfigureFAD();
    259                 Update(kStateConfiguring3);
    260                 return kStateConfiguring3;
    261             }
    262 
    263             if (GetCurrentState()==kStateConfiguring3)
    264             {
    265                 if (fDimFTM.state() != FTM::kConfigured ||
    266                     fDimFAD.state() != FAD::kConfigured ||
    267                     fDimRC.state()  < 6)
     236                Update(MCP::State::kConfiguring3);
     237                return MCP::State::kConfiguring3;
     238            }
     239
     240            if (GetCurrentState()==MCP::State::kConfiguring3)
     241            {
     242                if (fDimFTM.state() != FTM::State::kConfigured ||
     243                    fDimFAD.state() != FAD::State::kConfigured ||
     244                    fDimRC.state()  <  RateControl::State::kSettingGlobalThreshold)
    268245                    return GetCurrentState();
    269246
    270247                Message("Starting Trigger (FTM)");
    271                 Dim::SendCommand("FTM_CONTROL/START_TRIGGER");
    272                 Update(kStateConfigured);
    273                 return kStateConfigured;
    274             }
    275 
    276             if (GetCurrentState()==kStateConfigured)
    277             {
    278                 if (fDimFTM.state() != FTM::kTriggerOn)
     248                Dim::SendCommandNB("FTM_CONTROL/START_TRIGGER");
     249                Update(MCP::State::kConfigured);
     250                return MCP::State::kConfigured;
     251            }
     252
     253            if (GetCurrentState()==MCP::State::kConfigured)
     254            {
     255                if (fDimFTM.state() != FTM::State::kTriggerOn)
    279256                    return GetCurrentState();
    280257
    281                 Update(kStateTriggerOn);
    282 
    283                 return kStateTriggerOn;
    284             }
    285 
    286             if (GetCurrentState()==kStateTriggerOn)
    287             {
    288                 if (fDimFAD.state() != FAD::kWritingData)
     258                Update(MCP::State::kTriggerOn);
     259
     260                return MCP::State::kTriggerOn;
     261            }
     262
     263            if (GetCurrentState()==MCP::State::kTriggerOn)
     264            {
     265                if (fDimFAD.state() != FAD::State::kWritingData)
    289266                    return GetCurrentState();
    290267
    291                 Update(kStateTakingData);
    292 
    293                 return kStateTakingData;
    294             }
    295 
    296             if (GetCurrentState()==kStateTakingData)
    297             {
    298                 if (fDimFTM.state()==FTM::kTriggerOn &&
    299                     fDimFAD.state()==FAD::kWritingData)
    300                     return kStateTakingData;
    301 
    302                 Update(kStateIdle);
    303             }
    304 
    305             return kStateIdle;
     268                Update(MCP::State::kTakingData);
     269
     270                return MCP::State::kTakingData;
     271            }
     272
     273            if (GetCurrentState()==MCP::State::kTakingData)
     274            {
     275                if (fDimFTM.state()==FTM::State::kTriggerOn &&
     276                    fDimFAD.state()==FAD::State::kWritingData)
     277                    return MCP::State::kTakingData;
     278
     279                Update(MCP::State::kIdle);
     280            }
     281
     282            return MCP::State::kIdle;
    306283        }
    307284
    308285        /*
    309         if (fDimFTM.state() >= FTM::kConnected &&
    310             fDimFAD.state() >= FAD::kConnected &&
     286        if (fDimFTM.state() >= FTM::State::kConnected &&
     287            fDimFAD.state() >= FAD::State::kConnected &&
    311288            fDimLog.state() >= kSM_Ready)
    312             return kStateIdle;
     289            return MCP::State::kIdle;
    313290         */
    314291        if (fDimFTM.state() >-2 &&
     
    316293            fDimLog.state() >-2 &&
    317294            fDimRC.state() >-2)
    318             return kStateConnected;
     295            return MCP::State::kConnected;
    319296
    320297        if (fDimFTM.state() >-2 ||
     
    322299            fDimLog.state() >-2 ||
    323300            fDimRC.state() >-2)
    324             return kStateConnecting;
    325 
    326         return kStateDisconnected;
     301            return MCP::State::kConnecting;
     302
     303        return MCP::State::kDisconnected;
    327304    }
    328305
     
    351328        fDimRC.Subscribe(*this);
    352329
     330        fDim.SetCallback(bind(&StateMachineMCP::HandleStateChange, this));
     331        fDimFTM.SetCallback(bind(&StateMachineMCP::HandleStateChange, this));
     332        fDimFAD.SetCallback(bind(&StateMachineMCP::HandleStateChange, this));
     333        fDimLog.SetCallback(bind(&StateMachineMCP::HandleStateChange, this));
     334        fDimRC.SetCallback(bind(&StateMachineMCP::HandleStateChange, this));
     335
    353336        // State names
    354         AddStateName(kStateDimNetworkNA, "DimNetworkNotAvailable",
     337        AddStateName(MCP::State::kDimNetworkNA, "DimNetworkNotAvailable",
    355338                     "DIM dns server not available.");
    356339
    357         AddStateName(kStateDisconnected, "Disconnected",
     340        AddStateName(MCP::State::kDisconnected, "Disconnected",
    358341                     "Neither ftmctrl, fadctrl, datalogger nor rate control online.");
    359342
    360         AddStateName(kStateConnecting, "Connecting",
     343        AddStateName(MCP::State::kConnecting, "Connecting",
    361344                     "Either ftmctrl, fadctrl, datalogger or rate control not online.");
    362345
    363         AddStateName(kStateConnected, "Connected",
     346        AddStateName(MCP::State::kConnected, "Connected",
    364347                     "All needed subsystems online.");
    365348
    366         AddStateName(kStateIdle, "Idle",
     349        AddStateName(MCP::State::kIdle, "Idle",
    367350                     "Waiting for next configuration command");
    368351
    369         AddStateName(kStateConfiguring1, "Configuring1",
     352        AddStateName(MCP::State::kConfiguring1, "Configuring1",
    370353                     "Starting configuration procedure, checking Datalogger state");
    371354
    372         AddStateName(kStateConfiguring2, "Configuring2",
     355        AddStateName(MCP::State::kConfiguring2, "Configuring2",
    373356                     "Waiting for FTM and Datalogger to get ready");
    374357
    375         AddStateName(kStateConfiguring3, "Configuring3",
     358        AddStateName(MCP::State::kConfiguring3, "Configuring3",
    376359                     "Waiting for FADs and rate control to get ready");
    377360
    378         AddStateName(kStateConfigured, "Configured",
     361        AddStateName(MCP::State::kConfigured, "Configured",
    379362                     "Everything is configured, trigger will be switched on now");
    380363
    381         AddStateName(kStateTriggerOn, "TriggerOn",
     364        AddStateName(MCP::State::kTriggerOn, "TriggerOn",
    382365                     "The trigger is switched on, waiting for FAD to receive data");
    383366
    384         AddStateName(kStateTakingData, "TakingData",
     367        AddStateName(MCP::State::kTakingData, "TakingData",
    385368                     "The trigger is switched on, FADs are sending data");
    386369
    387370
    388         AddEvent("START", "X:2;C")//, kStateIdle)
     371        AddEvent("START", "X:2;C")//, MCP::State::kIdle)
    389372            (bind(&StateMachineMCP::StartRun, this, placeholders::_1))
    390373            ("Start the configuration and data taking for a run-type of a pre-defined setup"
     
    397380            ("Stops the trigger (either disables the FTM trigger or the internal DRS trigger)");
    398381
    399         AddEvent("RESET", kStateConfiguring1, kStateConfiguring2, kStateConfiguring3, kStateConfigured)
     382        AddEvent("RESET", MCP::State::kConfiguring1, MCP::State::kConfiguring2, MCP::State::kConfiguring3, MCP::State::kConfigured)
    400383            (bind(&StateMachineMCP::Reset, this, placeholders::_1))
    401384            ("If a configuration blockes because a system cannot configure itself properly, "
Note: See TracChangeset for help on using the changeset viewer.