Changeset 16771 for trunk


Ignore:
Timestamp:
06/08/13 12:25:58 (11 years ago)
Author:
tbretz
Message:
When compiling a new static buffer to be sent to the FTM, not the last received buffer has to be used but the last sent buffer, this is because a new configuration might be in the queue already, but we have not yet received the answer. To avoid race conditions, the sent buffer is now filled at connection time and used to update the configuration; also a new state was introduced to signal (for debugging mainly) whether the last sent and the last received static data are different (this does not include the thresholds); for convenience in the ratecontrol: added a SET_ALL_THRESHOLDS
Location:
trunk/FACT++/src
Files:
2 edited

Legend:

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

    r15106 r16771  
    3636        enum StateMachine
    3737        {
    38             kDisconnected = 1, //= ConnectionFTM::kDisconnected,
    39             kConnected,        //= ConnectionFTM::kConnected,
    40             kIdle,             //= ConnectionFTM::kIdle,
    41             kTriggerOn,        //= ConnectionFTM::kTriggerOn,
     38            kDisconnected = 1,
     39            kConnected,
     40            kIdle,
     41            kValid,
     42            kTriggerOn,
    4243            kConfiguring1,
    4344            kConfiguring2,
     
    261262            return memcmp(this, &d, sizeof(StaticData))==0;
    262263        }
     264
     265        bool valid() const { static StaticData empty; return memcmp(this, &empty, sizeof(FTM::StaticData))!=0; }
    263266
    264267        void clear() { reset(*this); }
  • trunk/FACT++/src/ftmctrl.cc

    r16732 r16771  
    5151    FTM::Header      fHeader;
    5252    FTM::FtuList     fFtuList;
    53     FTM::StaticData  fStaticData;
     53    FTM::StaticData  fStaticData;    // fStaticBufferTx
    5454    FTM::DynamicData fDynamicData;
    5555    FTM::Error       fError;
    5656
    57     FTM::StaticData  fBufStaticData;
     57    FTM::StaticData  fBufStaticData; // fStaticBufferRx
    5858
    5959    virtual void UpdateFirstHeader()
     
    314314
    315315                fStaticData = fBuffer;
     316
     317                // is this the first received static data block?
     318                if (!fBufStaticData.valid())
     319                    fBufStaticData = fStaticData;
     320
    316321                UpdateStaticData();
    317322                break;
     
    670675        if (patch<0)
    671676        {
    672             FTM::StaticData data(fStaticData);
     677            FTM::StaticData data(fBufStaticData);
    673678
    674679            bool ident = true;
     
    714719        return true;
    715720    }
     721    /*
     722    bool SetSelectedThresholds(const int32_t *th)
     723    {
     724        for (int i=0; i<FTM::StaticData::kMaxPatchIdx; i++)
     725            if (th[i]<0 || th[i]>FTM::StaticData::kMaxDAC)
     726                return false;
     727
     728        FTM::StaticData data(fBufStaticData);
     729
     730        for (int i=0; i<=FTM::StaticData::kMaxPatchIdx; i++)
     731        {
     732            if (fBufStaticData[i/4].fDac[i%4]!=th[i])
     733            {
     734
     735                // Calculate offset in static data block
     736                const uint16_t addr = (uintptr_t(&fStaticData[i/4].fDAC[i%4])-uintptr_t(&fStaticData))/2;
     737
     738                // From CmdSetRegister
     739                const array<uint16_t, 2> data = {{ addr, uint16_t(th[i]) }};
     740                PostCmd(data, FTM::kCmdWrite, FTM::kCmdRegister);
     741
     742                reinterpret_cast<uint16_t*>(&fBufStaticData)[addr] = th[i];
     743            }
     744        }
     745
     746        // Now execute change before the static data is requested back
     747        PostCmd(FTM::kCmdConfigFTU, (patch/40) | (((patch/4)%10)<<8));
     748
     749        //CmdGetRegister(addr);
     750        CmdReqStatDat();
     751
     752        return true;
     753    }*/
     754
     755
     756    bool SetAllThresholds(const int32_t *th)
     757    {
     758        for (int i=0; i<FTM::StaticData::kMaxPatchIdx; i++)
     759            if (th[i]<0 || th[i]>FTM::StaticData::kMaxDAC)
     760                return false;
     761
     762        FTM::StaticData data(fBufStaticData);
     763
     764        for (int i=0; i<=FTM::StaticData::kMaxPatchIdx; i++)
     765            data[i/4].fDAC[i%4] = th[i];
     766
     767        CmdSendStatDat(data);
     768
     769        return true;
     770    }
    716771
    717772    bool SetNoutof4(int32_t patch, int32_t value)
     
    725780        if (patch<0)
    726781        {
    727             FTM::StaticData data(fStaticData);
     782            FTM::StaticData data(fBufStaticData);
    728783
    729784            bool ident = true;
     
    780835            return false;
    781836
    782         FTM::StaticData data(fStaticData);
     837        FTM::StaticData data(fBufStaticData);
    783838
    784839        bool ident = true;
     
    806861            return false;
    807862
    808         FTM::StaticData data(fStaticData);
     863        FTM::StaticData data(fBufStaticData);
    809864
    810865        if (board<0)
     
    835890            return false;
    836891
    837         FTM::StaticData data(fStaticData);
     892        FTM::StaticData data(fBufStaticData);
    838893
    839894        data.ToggleFTU(board);
     
    853908            return true;
    854909
    855         FTM::StaticData data(fStaticData);
     910        FTM::StaticData data(fBufStaticData);
    856911
    857912        dest = reinterpret_cast<uint16_t*>(&data) + (dest - reinterpret_cast<uint16_t*>(&fStaticData));
     
    866921    bool SetTriggerInterval(uint32_t val)
    867922    {
    868         return SetVal(&fStaticData.fTriggerInterval, val,
     923        return SetVal(&fBufStaticData.fTriggerInterval, val,
    869924                      FTM::StaticData::kMaxTriggerInterval);
    870925    }
     
    872927    bool SetTriggerDelay(uint32_t val)
    873928    {
    874         return SetVal(&fStaticData.fDelayTrigger, val,
     929        return SetVal(&fBufStaticData.fDelayTrigger, val,
    875930                      FTM::StaticData::kMaxDelayTrigger);
    876931    }
     
    878933    bool SetTimeMarkerDelay(uint32_t val)
    879934    {
    880         return SetVal(&fStaticData.fDelayTimeMarker, val,
     935        return SetVal(&fBufStaticData.fDelayTimeMarker, val,
    881936                      FTM::StaticData::kMaxDelayTimeMarker);
    882937    }
     
    884939    bool SetDeadTime(uint32_t val)
    885940    {
    886         return SetVal(&fStaticData.fDeadTime, val,
     941        return SetVal(&fBufStaticData.fDeadTime, val,
    887942                      FTM::StaticData::kMaxDeadTime);
    888943    }
     
    893948        //    return;
    894949
    895         FTM::StaticData data(fStaticData);
     950        FTM::StaticData data(fBufStaticData);
    896951        data.Enable(type, enable);
    897952        CmdSendStatDat(data);
     
    905960            return false;
    906961
    907         FTM::StaticData data(fStaticData);
     962        FTM::StaticData data(fBufStaticData);
    908963
    909964        /*
     
    929984            return false;
    930985
    931         if (n==fStaticData.fMultiplicityPhysics)
    932             return true;
    933 
    934         FTM::StaticData data(fStaticData);
     986        //if (n==fBufStaticData.fMultiplicityPhysics)
     987        //    return true;
     988
     989        FTM::StaticData data(fBufStaticData);
    935990
    936991        data.fMultiplicityPhysics = n;
     
    9461001            return false;
    9471002
    948         if (win==fStaticData.fWindowPhysics)
    949             return true;
    950 
    951         FTM::StaticData data(fStaticData);
     1003        //if (win==fStaticData.fWindowPhysics)
     1004        //    return true;
     1005
     1006        FTM::StaticData data(fBufStaticData);
    9521007
    9531008        data.fWindowPhysics = win;
     
    9631018            return false;
    9641019
    965         if (n==fStaticData.fMultiplicityCalib)
    966             return true;
    967 
    968         FTM::StaticData data(fStaticData);
     1020        //if (n==fStaticData.fMultiplicityCalib)
     1021        //    return true;
     1022
     1023        FTM::StaticData data(fBufStaticData);
    9691024
    9701025        data.fMultiplicityCalib = n;
     
    9801035            return false;
    9811036
    982         if (win==fStaticData.fWindowCalib)
    983             return true;
    984 
    985         FTM::StaticData data(fStaticData);
     1037        //if (win==fStaticData.fWindowCalib)
     1038        //    return true;
     1039
     1040        FTM::StaticData data(fBufStaticData);
    9861041
    9871042        data.fWindowCalib = win;
     
    9941049    bool SetClockRegister(const uint64_t reg[])
    9951050    {
    996         FTM::StaticData data(fStaticData);
     1051        FTM::StaticData data(fBufStaticData);
    9971052
    9981053        for (int i=0; i<8; i++)
     
    10121067            return false;
    10131068
    1014         FTM::StaticData data(fStaticData);
     1069        FTM::StaticData data(fBufStaticData);
    10151070
    10161071        if (lp==FTM::StaticData::kLPint)
     
    10331088            return false;
    10341089
    1035         FTM::StaticData data(fStaticData);
     1090        FTM::StaticData data(fBufStaticData);
    10361091
    10371092        if (lp==FTM::StaticData::kLPint)
     
    10531108        if (idx==-1)
    10541109        {
    1055             FTM::StaticData data(fStaticData);
     1110            FTM::StaticData data(fBufStaticData);
    10561111
    10571112            for (int i=0; i<=FTM::StaticData::kMaxPixelIdx; i++)
     
    10691124         */
    10701125
    1071         FTM::StaticData data(fStaticData);
     1126        FTM::StaticData data(fBufStaticData);
    10721127
    10731128        const uintptr_t base = uintptr_t(&data);
     
    10981153            return false;
    10991154
    1100         FTM::StaticData data(fStaticData);
     1155        FTM::StaticData data(fBufStaticData);
    11011156
    11021157        for (int i=0; i<=FTM::StaticData::kMaxPixelIdx; i++)
     
    11131168            return false;
    11141169
    1115         FTM::StaticData data(fStaticData);
     1170        FTM::StaticData data(fBufStaticData);
    11161171
    11171172        for (int i=0; i<=FTM::StaticData::kMaxPixelIdx; i++)
     
    11281183            return false;
    11291184
    1130         FTM::StaticData data(fStaticData);
     1185        FTM::StaticData data(fBufStaticData);
    11311186
    11321187        for (int i=0; i<=FTM::StaticData::kMaxPixelIdx; i++)
     
    11441199            return false;
    11451200
    1146         FTM::StaticData data(fStaticData);
    1147 
    1148         data.EnablePixel(idx, !fStaticData.Enabled(idx));
     1201        FTM::StaticData data(fBufStaticData);
     1202
     1203        data.EnablePixel(idx, !fBufStaticData.Enabled(idx));
    11491204
    11501205        CmdSendStatDat(data);
     
    11611216        {
    11621217        case FTM::kFtmUndefined:  // 0
    1163             return kConnected;    // rc=2
     1218            return fBufStaticData.valid() ? kConnected :  kDisconnected;    // rc=2
    11641219
    11651220        case FTM::kFtmRunning:    // 3
     
    11781233    //bool IsLocked() const { return fHeader.fState&FTM::kFtmLocked; }
    11791234
    1180     int GetCounter(FTM::Types type) { return fCounter[type]; }
     1235    uint32_t GetCounter(FTM::Types type) { return fCounter[type]; }
    11811236
    11821237    const FTM::StaticData &GetStaticData() const { return fStaticData; }
     
    15771632    }
    15781633
     1634    int SetAllThresholds(const EventImp &evt)
     1635    {
     1636        if (!CheckEventSize(evt.GetSize(), "SetAllThresholds", 160*4))
     1637            return T::kSM_FatalError;
     1638
     1639        const int32_t *data = evt.Ptr<int32_t>();
     1640        if (!fFTM.SetAllThresholds(data))
     1641        {
     1642            ostringstream msg;
     1643            msg << "SetAllThresholds - Value out of range [0; 0xffff]";
     1644            T::Warn(msg);
     1645        }
     1646
     1647        return T::GetCurrentState();
     1648    }
     1649
    15791650    int SetNoutof4(const EventImp &evt)
    15801651    {
     
    19011972    }*/
    19021973
    1903     int64_t fCounterReg;
    1904     int64_t fCounterStat;
     1974    uint32_t fCounterReg;
     1975    uint32_t fCounterStat;
    19051976
    19061977    typedef map<string, FTM::StaticData> Configs;
     
    19712042        case FTM::State::kConfiguring2:
    19722043        case FTM::State::kConfigured:
    1973             // If FTM has received an anwer to the stop_run command
    1974             // the counter for the registers has been increased
     2044            // If FTM has received an anwer to the CmdSendStatDat
     2045            // the counter for static data has been increased
    19752046            if (fFTM.GetCounter(FTM::kStaticData)<=fCounterStat)
    19762047                break;
     
    19892060                T::Message("Sending new configuration was successfull.");
    19902061            else
    1991                 T::Message("Configuration successfull updated.");
     2062                T::Message("Configuration successfully updated.");
    19922063
    19932064            // Next state is: wait for the answer to our configuration
     
    20032074            {
    20042075            case ConnectionFTM::kIdle:         return FTM::State::kIdle;
    2005             case ConnectionFTM::kConfigured:   return FTM::State::kIdle;
     2076            case ConnectionFTM::kConfigured:   return FTM::State::kValid;
    20062077            case ConnectionFTM::kTriggerOn:    return FTM::State::kTriggerOn;
    20072078            default:
    2008                 throw runtime_error("StateMachienFTM - Execute() - Inavlid state.");
     2079                throw runtime_error("StateMachineFTM - Execute() - Inavlid state.");
    20092080            }
    20102081        }
     
    20382109        T::AddStateName(FTM::State::kIdle, "Idle",
    20392110                        "Ethernet connection to FTM established, FTM in idle state.");
     2111
     2112        T::AddStateName(FTM::State::kValid, "Valid",
     2113                        "FTM in idle state and the last sent and received static data block are bitwise identical.");
    20402114
    20412115        T::AddStateName(FTM::State::kConfiguring1, "Configuring1",
     
    20542128
    20552129        // FTM Commands
    2056         T::AddEvent("TOGGLE_LED", FTM::State::kIdle)
     2130        T::AddEvent("TOGGLE_LED", FTM::State::kIdle, FTM::State::kValid)
    20572131            (Wrapper(bind(&ConnectionFTM::CmdToggleLed, &fFTM)))
    20582132            ("toggle led");
    20592133
    2060         T::AddEvent("PING", FTM::State::kIdle)
     2134        T::AddEvent("PING", FTM::State::kIdle, FTM::State::kValid)
    20612135            (Wrapper(bind(&ConnectionFTM::CmdPing, &fFTM)))
    20622136            ("send ping");
    20632137
    2064         T::AddEvent("REQUEST_DYNAMIC_DATA", FTM::State::kIdle)
     2138        T::AddEvent("REQUEST_DYNAMIC_DATA", FTM::State::kIdle, FTM::State::kValid)
    20652139            (Wrapper(bind(&ConnectionFTM::CmdReqDynDat, &fFTM)))
    20662140            ("request transmission of dynamic data block");
    20672141
    2068         T::AddEvent("REQUEST_STATIC_DATA", FTM::State::kIdle)
     2142        T::AddEvent("REQUEST_STATIC_DATA", FTM::State::kIdle, FTM::State::kValid)
    20692143            (Wrapper(bind(&ConnectionFTM::CmdReqStatDat, &fFTM)))
    20702144            ("request transmission of static data from FTM to memory");
    20712145
    2072         T::AddEvent("GET_REGISTER", "I", FTM::State::kIdle)
     2146        T::AddEvent("GET_REGISTER", "I", FTM::State::kIdle, FTM::State::kValid)
    20732147            (bind(&StateMachineFTM::GetRegister, this, placeholders::_1))
    20742148            ("read register from address addr"
    20752149            "|addr[short]:Address of register");
    20762150
    2077         T::AddEvent("SET_REGISTER", "I:2", FTM::State::kIdle)
     2151        T::AddEvent("SET_REGISTER", "I:2", FTM::State::kIdle, FTM::State::kValid)
    20782152            (bind(&StateMachineFTM::SetRegister, this, placeholders::_1))
    20792153            ("set register to value"
     
    20812155            "|val[short]:Value to be set");
    20822156
    2083         T::AddEvent("START_TRIGGER", FTM::State::kIdle, FTM::State::kConfigured)
     2157        T::AddEvent("START_TRIGGER", FTM::State::kIdle, FTM::State::kValid, FTM::State::kConfigured)
    20842158            (Wrapper(bind(&ConnectionFTM::CmdStartRun, &fFTM)))
    20852159            ("start a run (start distributing triggers)");
     
    20892163            ("stop a run (stop distributing triggers)");
    20902164
    2091         T::AddEvent("TAKE_N_EVENTS", "I", FTM::State::kIdle)
     2165        T::AddEvent("TAKE_N_EVENTS", "I", FTM::State::kIdle, FTM::State::kValid)
    20922166            (bind(&StateMachineFTM::TakeNevents, this, placeholders::_1))
    20932167            ("take n events (distribute n triggers)|number[int]:Number of events to be taken");
    20942168
    2095         T::AddEvent("DISABLE_REPORTS", "B", FTM::State::kIdle)
     2169        T::AddEvent("DISABLE_REPORTS", "B", FTM::State::kIdle, FTM::State::kValid)
    20962170            (bind(&StateMachineFTM::DisableReports, this, placeholders::_1))
    20972171            ("disable sending rate reports"
    20982172             "|status[bool]:disable or enable that the FTM sends rate reports (yes/no)");
    20992173
    2100         T::AddEvent("SET_THRESHOLD", "I:2", FTM::State::kIdle, FTM::State::kConfigured, FTM::State::kTriggerOn)
     2174        T::AddEvent("SET_THRESHOLD", "I:2", FTM::State::kIdle, FTM::State::kValid, FTM::State::kConfigured, FTM::State::kTriggerOn)
    21012175            (bind(&StateMachineFTM::SetThreshold, this, placeholders::_1))
    21022176            ("Set the comparator threshold"
     
    21042178             "|Threshold[counts]:Threshold to be set in binary counts");
    21052179
    2106         T::AddEvent("SET_N_OUT_OF_4", "I:2", FTM::State::kIdle, FTM::State::kTriggerOn)
     2180        T::AddEvent("SET_ALL_THRESHOLDS", "I:160", FTM::State::kIdle, FTM::State::kValid, FTM::State::kConfigured, FTM::State::kTriggerOn)
     2181            (bind(&StateMachineFTM::SetAllThresholds, this, placeholders::_1))
     2182            ("Set the comparator thresholds"
     2183             "|Thresholds[counts]:Threshold to be set in binary counts");
     2184
     2185        T::AddEvent("SET_N_OUT_OF_4", "I:2", FTM::State::kIdle, FTM::State::kValid, FTM::State::kTriggerOn)
    21072186            (bind(&StateMachineFTM::SetNoutof4, this, placeholders::_1))
    21082187            ("Set the comparator threshold"
     
    21102189             "|Threshold[counts]:Threshold to be set in binary counts");
    21112190
    2112         T::AddEvent("SET_PRESCALING", "I:1", FTM::State::kIdle)
     2191        T::AddEvent("SET_PRESCALING", "I:1", FTM::State::kIdle, FTM::State::kValid)
    21132192            (bind(&StateMachineFTM::SetPrescaling, this, placeholders::_1))
    21142193            ("Sets the FTU readout time intervals"
    21152194             "|time[0.5s]:The interval is given in units of 0.5s, i.e. 1 means 0.5s, 2 means 1s, ...");
    21162195
    2117         T::AddEvent("ENABLE_FTU", "I:1;B:1", FTM::State::kIdle, FTM::State::kConfigured)
     2196        T::AddEvent("ENABLE_FTU", "I:1;B:1", FTM::State::kIdle, FTM::State::kValid, FTM::State::kConfigured)
    21182197            (bind(&StateMachineFTM::EnableFTU, this, placeholders::_1))
    21192198            ("Enable or disable FTU"
     
    21212200             "|Enable[bool]:Whether FTU should be enabled or disabled (yes/no)");
    21222201
    2123         T::AddEvent("DISABLE_PIXEL", "S:1", FTM::State::kIdle, FTM::State::kTriggerOn)
     2202        T::AddEvent("DISABLE_PIXEL", "S:1", FTM::State::kIdle, FTM::State::kValid, FTM::State::kTriggerOn)
    21242203            (bind(&StateMachineFTM::EnablePixel, this, placeholders::_1, false))
    21252204            ("(-1 or all)");
    21262205
    2127         T::AddEvent("ENABLE_PIXEL", "S:1", FTM::State::kIdle, FTM::State::kTriggerOn)
     2206        T::AddEvent("ENABLE_PIXEL", "S:1", FTM::State::kIdle, FTM::State::kValid, FTM::State::kTriggerOn)
    21282207            (bind(&StateMachineFTM::EnablePixel, this, placeholders::_1, true))
    21292208            ("(-1 or all)");
    21302209
    2131         T::AddEvent("DISABLE_ALL_PIXELS_EXCEPT", "S:1", FTM::State::kIdle)
     2210        T::AddEvent("DISABLE_ALL_PIXELS_EXCEPT", "S:1", FTM::State::kIdle, FTM::State::kValid)
    21322211            (bind(&StateMachineFTM::DisableAllPixelsExcept, this, placeholders::_1))
    21332212            ("");
    21342213
    2135         T::AddEvent("DISABLE_ALL_PATCHES_EXCEPT", "S:1", FTM::State::kIdle)
     2214        T::AddEvent("DISABLE_ALL_PATCHES_EXCEPT", "S:1", FTM::State::kIdle, FTM::State::kValid)
    21362215            (bind(&StateMachineFTM::DisableAllPatchesExcept, this, placeholders::_1))
    21372216            ("");
    21382217
    2139         T::AddEvent("ENABLE_PATCH", "S:1", FTM::State::kIdle)
     2218        T::AddEvent("ENABLE_PATCH", "S:1", FTM::State::kIdle, FTM::State::kValid)
    21402219            (bind(&StateMachineFTM::EnablePatch, this, placeholders::_1, true))
    21412220            ("");
    21422221
    2143         T::AddEvent("DISABLE_PATCH", "S:1", FTM::State::kIdle)
     2222        T::AddEvent("DISABLE_PATCH", "S:1", FTM::State::kIdle, FTM::State::kValid)
    21442223            (bind(&StateMachineFTM::EnablePatch, this, placeholders::_1, false))
    21452224            ("");
    21462225
    2147         T::AddEvent("TOGGLE_PIXEL", "S:1", FTM::State::kIdle)
     2226        T::AddEvent("TOGGLE_PIXEL", "S:1", FTM::State::kIdle, FTM::State::kValid)
    21482227            (bind(&StateMachineFTM::TogglePixel, this, placeholders::_1))
    21492228            ("");
    21502229
    2151         T::AddEvent("TOGGLE_FTU", "I:1", FTM::State::kIdle)
     2230        T::AddEvent("TOGGLE_FTU", "I:1", FTM::State::kIdle, FTM::State::kValid)
    21522231            (bind(&StateMachineFTM::ToggleFTU, this, placeholders::_1))
    21532232            ("Toggle status of FTU (this is mainly meant to be used in the GUI)"
    21542233             "|Board[idx]:Index of the board (0-39)");
    21552234
    2156         T::AddEvent("SET_TRIGGER_INTERVAL", "I:1", FTM::State::kIdle)
     2235        T::AddEvent("SET_TRIGGER_INTERVAL", "I:1", FTM::State::kIdle, FTM::State::kValid)
    21572236            (bind(&StateMachineFTM::SetTriggerInterval, this, placeholders::_1))
    21582237            ("Sets the trigger interval which is the distance between two consecutive artificial triggers."
    21592238             "|interval[ms]:The applied trigger interval in millisecond (min 1ms / 10bit)");
    21602239
    2161         T::AddEvent("SET_TRIGGER_DELAY", "I:1", FTM::State::kIdle)
     2240        T::AddEvent("SET_TRIGGER_DELAY", "I:1", FTM::State::kIdle, FTM::State::kValid)
    21622241            (bind(&StateMachineFTM::SetTriggerDelay, this, placeholders::_1))
    21632242            (""
    21642243             "|delay[int]:The applied trigger delay is: delay*4ns+8ns");
    21652244
    2166         T::AddEvent("SET_TIME_MARKER_DELAY", "I:1", FTM::State::kIdle)
     2245        T::AddEvent("SET_TIME_MARKER_DELAY", "I:1", FTM::State::kIdle, FTM::State::kValid)
    21672246            (bind(&StateMachineFTM::SetTimeMarkerDelay, this, placeholders::_1))
    21682247            (""
    21692248            "|delay[int]:The applied time marker delay is: delay*4ns+8ns");
    21702249
    2171         T::AddEvent("SET_DEAD_TIME", "I:1", FTM::State::kIdle)
     2250        T::AddEvent("SET_DEAD_TIME", "I:1", FTM::State::kIdle, FTM::State::kValid)
    21722251            (bind(&StateMachineFTM::SetDeadTime, this, placeholders::_1))
    21732252            (""
    21742253            "|dead_time[int]:The applied dead time is: dead_time*4ns+8ns");
    21752254
    2176         T::AddEvent("ENABLE_TRIGGER", "B:1", FTM::State::kIdle)
     2255        T::AddEvent("ENABLE_TRIGGER", "B:1", FTM::State::kIdle, FTM::State::kValid)
    21772256            (bind(&StateMachineFTM::Enable, this, placeholders::_1, FTM::StaticData::kTrigger))
    21782257            ("Switch on the physics trigger"
     
    21802259
    21812260        // FIXME: Switch on/off depending on sequence
    2182         T::AddEvent("ENABLE_EXT1", "B:1", FTM::State::kIdle)
     2261        T::AddEvent("ENABLE_EXT1", "B:1", FTM::State::kIdle, FTM::State::kValid)
    21832262            (bind(&StateMachineFTM::Enable, this, placeholders::_1, FTM::StaticData::kExt1))
    21842263            ("Switch on the triggers through the first external line"
     
    21862265
    21872266        // FIXME: Switch on/off depending on sequence
    2188         T::AddEvent("ENABLE_EXT2", "B:1", FTM::State::kIdle)
     2267        T::AddEvent("ENABLE_EXT2", "B:1", FTM::State::kIdle, FTM::State::kValid)
    21892268            (bind(&StateMachineFTM::Enable, this, placeholders::_1, FTM::StaticData::kExt2))
    21902269            ("Switch on the triggers through the second external line"
    21912270             "|Enable[bool]:Enable ext2 trigger (yes/no)");
    21922271
    2193         T::AddEvent("ENABLE_VETO", "B:1", FTM::State::kIdle)
     2272        T::AddEvent("ENABLE_VETO", "B:1", FTM::State::kIdle, FTM::State::kValid)
    21942273            (bind(&StateMachineFTM::Enable, this, placeholders::_1, FTM::StaticData::kVeto))
    21952274            ("Enable veto line"
    21962275             "|Enable[bool]:Enable veto (yes/no)");
    21972276
    2198         T::AddEvent("ENABLE_CLOCK_CONDITIONER", "B:1", FTM::State::kIdle)
     2277        T::AddEvent("ENABLE_CLOCK_CONDITIONER", "B:1", FTM::State::kIdle, FTM::State::kValid)
    21992278            (bind(&StateMachineFTM::Enable, this, placeholders::_1, FTM::StaticData::kClockConditioner))
    22002279            ("Enable clock conidtioner output in favor of time marker output"
    22012280             "|Enable[bool]:Enable clock conditioner (yes/no)");
    22022281
    2203         T::AddEvent("ENABLE_GROUP1_LPINT", "B:1", FTM::State::kIdle)
     2282        T::AddEvent("ENABLE_GROUP1_LPINT", "B:1", FTM::State::kIdle, FTM::State::kValid)
    22042283            (bind(&StateMachineFTM::EnableLP, this, placeholders::_1, FTM::StaticData::kLPint, FTM::StaticData::kGroup1))
    22052284            ("");
    2206         T::AddEvent("ENABLE_GROUP1_LPEXT", "B:1", FTM::State::kIdle)
     2285        T::AddEvent("ENABLE_GROUP1_LPEXT", "B:1", FTM::State::kIdle, FTM::State::kValid)
    22072286            (bind(&StateMachineFTM::EnableLP, this, placeholders::_1, FTM::StaticData::kLPext, FTM::StaticData::kGroup1))
    22082287            ("");
    2209         T::AddEvent("ENABLE_GROUP2_LPINT", "B:1", FTM::State::kIdle)
     2288        T::AddEvent("ENABLE_GROUP2_LPINT", "B:1", FTM::State::kIdle, FTM::State::kValid)
    22102289            (bind(&StateMachineFTM::EnableLP, this, placeholders::_1, FTM::StaticData::kLPint, FTM::StaticData::kGroup2))
    22112290            ("");
    2212         T::AddEvent("ENABLE_GROUP2_LPEXT", "B:1", FTM::State::kIdle)
     2291        T::AddEvent("ENABLE_GROUP2_LPEXT", "B:1", FTM::State::kIdle, FTM::State::kValid)
    22132292            (bind(&StateMachineFTM::EnableLP, this, placeholders::_1, FTM::StaticData::kLPext, FTM::StaticData::kGroup2))
    22142293            ("");
    2215         T::AddEvent("SET_INTENSITY_LPINT", "S:1", FTM::State::kIdle)
     2294        T::AddEvent("SET_INTENSITY_LPINT", "S:1", FTM::State::kIdle, FTM::State::kValid)
    22162295            (bind(&StateMachineFTM::SetIntensity, this, placeholders::_1, FTM::StaticData::kLPint))
    22172296            ("");
    2218         T::AddEvent("SET_INTENSITY_LPEXT", "S:1", FTM::State::kIdle)
     2297        T::AddEvent("SET_INTENSITY_LPEXT", "S:1", FTM::State::kIdle, FTM::State::kValid)
    22192298            (bind(&StateMachineFTM::SetIntensity, this, placeholders::_1, FTM::StaticData::kLPext))
    22202299            ("");
    22212300
    22222301
    2223         T::AddEvent("SET_TRIGGER_SEQUENCE", "S:3", FTM::State::kIdle)
     2302        T::AddEvent("SET_TRIGGER_SEQUENCE", "S:3", FTM::State::kIdle, FTM::State::kValid)
    22242303            (bind(&StateMachineFTM::SetTriggerSeq, this, placeholders::_1))
    22252304            ("Setup the sequence of artificial triggers produced by the FTM"
     
    22282307             "|LPint[short]:number of triggers of the internal light pulser");
    22292308
    2230         T::AddEvent("SET_TRIGGER_MULTIPLICITY", "S:1", FTM::State::kIdle)
     2309        T::AddEvent("SET_TRIGGER_MULTIPLICITY", "S:1", FTM::State::kIdle, FTM::State::kValid)
    22312310            (bind(&StateMachineFTM::SetTriggerMultiplicity, this, placeholders::_1))
    22322311            ("Setup the Multiplicity condition for physcis triggers"
    22332312             "|N[int]:Number of requirered coincident triggers from sum-patches (1-40)");
    22342313
    2235         T::AddEvent("SET_TRIGGER_WINDOW", "S:1", FTM::State::kIdle)
     2314        T::AddEvent("SET_TRIGGER_WINDOW", "S:1", FTM::State::kIdle, FTM::State::kValid)
    22362315            (bind(&StateMachineFTM::SetTriggerWindow, this, placeholders::_1))
    22372316            ("");
    22382317
    2239         T::AddEvent("SET_CALIBRATION_MULTIPLICITY", "S:1", FTM::State::kIdle)
     2318        T::AddEvent("SET_CALIBRATION_MULTIPLICITY", "S:1", FTM::State::kIdle, FTM::State::kValid)
    22402319            (bind(&StateMachineFTM::SetCalibMultiplicity, this, placeholders::_1))
    22412320            ("Setup the Multiplicity condition for artificial (calibration) triggers"
    22422321             "|N[int]:Number of requirered coincident triggers from sum-patches (1-40)");
    22432322
    2244         T::AddEvent("SET_CALIBRATION_WINDOW", "S:1", FTM::State::kIdle)
     2323        T::AddEvent("SET_CALIBRATION_WINDOW", "S:1", FTM::State::kIdle, FTM::State::kValid)
    22452324            (bind(&StateMachineFTM::SetCalibWindow, this, placeholders::_1))
    22462325            ("");
    22472326
    2248         T::AddEvent("SET_CLOCK_FREQUENCY", "S:1", FTM::State::kIdle)
     2327        T::AddEvent("SET_CLOCK_FREQUENCY", "S:1", FTM::State::kIdle, FTM::State::kValid)
    22492328            (bind(&StateMachineFTM::SetClockFrequency, this, placeholders::_1))
    22502329            ("");
    22512330
    2252         T::AddEvent("SET_CLOCK_REGISTER", "X:8", FTM::State::kIdle)
     2331        T::AddEvent("SET_CLOCK_REGISTER", "X:8", FTM::State::kIdle, FTM::State::kValid)
    22532332            (bind(&StateMachineFTM::SetClockRegister, this, placeholders::_1))
    22542333            ("");
     
    22562335        // A new configure will first stop the FTM this means
    22572336        // we can allow it in idle _and_ taking data
    2258         T::AddEvent("CONFIGURE", "C", FTM::State::kIdle, FTM::State::kConfiguring1, FTM::State::kConfiguring2, FTM::State::kConfigured, FTM::State::kTriggerOn)
     2337        T::AddEvent("CONFIGURE", "C")(FTM::State::kIdle)(FTM::State::kValid)(FTM::State::kConfiguring1)(FTM::State::kConfiguring2)(FTM::State::kConfigured)(FTM::State::kTriggerOn)
    22592338            (bind(&StateMachineFTM::ConfigureFTM, this, placeholders::_1))
    22602339            ("");
     
    22662345
    22672346
    2268         T::AddEvent("RESET_CRATE", "S:1", FTM::State::kIdle, FTM::State::kConfigured)
     2347        T::AddEvent("RESET_CRATE", "S:1", FTM::State::kIdle, FTM::State::kValid, FTM::State::kConfigured)
    22692348            (bind(&StateMachineFTM::ResetCrate, this, placeholders::_1))
    22702349            ("Reset one of the crates 0-3"
    22712350             "|crate[short]:Crate number to be reseted (0-3)");
    22722351
    2273         T::AddEvent("RESET_CAMERA", FTM::State::kIdle)
     2352        T::AddEvent("RESET_CAMERA", FTM::State::kIdle, FTM::State::kValid)
    22742353            (Wrapper(bind(&ConnectionFTM::CmdResetCamera, &fFTM)))
    22752354            ("Reset all crates. The commands are sent in the order 0,1,2,3");
     
    22772356
    22782357        // Load/save static data block
    2279         T::AddEvent("SAVE", "C", FTM::State::kIdle)
     2358        T::AddEvent("SAVE", "C", FTM::State::kIdle, FTM::State::kValid)
    22802359            (bind(&StateMachineFTM::SaveStaticData, this, placeholders::_1))
    22812360            ("Saves the static data (FTM configuration) from memory to a file"
    22822361             "|filename[string]:Filename (can include a path), .bin is automatically added");
    22832362
    2284         T::AddEvent("LOAD", "C", FTM::State::kIdle)
     2363        T::AddEvent("LOAD", "C", FTM::State::kIdle, FTM::State::kValid)
    22852364            (bind(&StateMachineFTM::LoadStaticData, this, placeholders::_1))
    22862365            ("Loads the static data (FTM configuration) from a file into memory and sends it to the FTM"
     
    23072386
    23082387        // Conenction commands
    2309         T::AddEvent("DISCONNECT", FTM::State::kConnected, FTM::State::kIdle)
     2388        T::AddEvent("DISCONNECT", FTM::State::kConnected, FTM::State::kIdle, FTM::State::kValid)
    23102389            (bind(&StateMachineFTM::Disconnect, this))
    23112390            ("disconnect from ethernet");
    23122391
    2313         T::AddEvent("RECONNECT", "O", FTM::State::kDisconnected, FTM::State::kConnected, FTM::State::kIdle, FTM::State::kConfigured)
     2392        T::AddEvent("RECONNECT", "O", FTM::State::kDisconnected, FTM::State::kConnected, FTM::State::kIdle, FTM::State::kValid, FTM::State::kConfigured)
    23142393            (bind(&StateMachineFTM::Reconnect, this, placeholders::_1))
    23152394            ("(Re)connect ethernet connection to FTM, a new address can be given"
Note: See TracChangeset for help on using the changeset viewer.