Ignore:
Timestamp:
05/08/11 16:49:34 (14 years ago)
Author:
tbretz
Message:
Added command to control the trigger sequence and the trigger majority logic; added a consistency check for an arrived static data block.
File:
1 edited

Legend:

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

    r10613 r10623  
    157157        Out() << "D=" << fCounter[kDynamicData] << "  ";
    158158        Out() << "F=" << fCounter[kFtuList] << "  ";
    159         Out() << "E=" << fCounter[kError] << "  ";
     159        Out() << "E=" << fCounter[kErrorList] << "  ";
    160160        Out() << "R=" << fCounter[kRegister] << endl;
     161    }
     162
     163    void CheckConsistency()
     164    {
     165        if (fStaticData.IsEnabled(StaticData::kPedestal) != (fStaticData.GetSequencePed()  >0) ||
     166            fStaticData.IsEnabled(StaticData::kLPint)    != (fStaticData.GetSequenceLPint()>0) ||
     167            fStaticData.IsEnabled(StaticData::kLPext)    != (fStaticData.GetSequenceLPext()>0))
     168        {
     169            Warn("GeneralSettings not consistent with trigger sequence.");
     170        }
     171
     172        const uint16_t ref = fStaticData[0].fPrescaling;
     173        for (int i=1; i<40; i++)
     174        {
     175            if (fStaticData[i].fPrescaling != ref)
     176            {
     177                Warn("Prescaling not consistent for all boards.");
     178                break;
     179            }
     180        }
     181
    161182    }
    162183
     
    292313
    293314            case kStaticData:
    294                 cout << fBuffer.size() << " " << sizeof(fStaticData) << endl;
    295315                fStaticData = fBuffer;
     316
     317                if (fCounter[kStaticData]==1)
     318                    CheckConsistency();
     319
    296320                UpdateStaticData();
    297321                break;
     
    306330                {
    307331                    Out() << endl << kBold << "Register received: " << endl;
    308                     Out() << "Value: " << ntohs(fBuffer[0]) << endl;
     332                    Out() << "Addr:  " << ntohs(fBuffer[0]) << endl;
     333                    Out() << "Value: " << ntohs(fBuffer[1]) << endl;
    309334                }
    310335                break;
     
    477502        // Request the changed configuration to ensure the
    478503        // change is distributed in the network
    479         CmdReqStatDat();
     504        //CmdReqStatDat();
    480505    }
    481506
     
    735760    }
    736761
     762    void Enable(FTM::StaticData::GeneralSettings type, bool enable)
     763    {
     764        fStaticData.Enable(type, enable);
     765    }
     766
     767    bool SetTriggerSeq(const uint8_t d[3])
     768    {
     769        const uint16_t oldset = fStaticData.fGeneralSettings;
     770        const uint16_t oldseq = fStaticData.fTriggerSequence;
     771
     772        fStaticData.Enable(StaticData::kPedestal, d[0]>0);
     773        fStaticData.Enable(StaticData::kLPext,    d[1]>0);
     774        fStaticData.Enable(StaticData::kLPint,    d[2]>0);
     775
     776        if (d[0]>StaticData::kMaxSequence ||
     777            d[1]>StaticData::kMaxSequence ||
     778            d[2]>StaticData::kMaxSequence)
     779            return false;
     780
     781        fStaticData.fTriggerSequence =
     782            (d[0]<<10) | (d[1]<<5) || d[2];
     783
     784        if (oldseq!=fStaticData.fTriggerSequence || oldset!=fStaticData.fGeneralSettings)
     785            CmdSendStatDat();
     786
     787        return true;
     788    }
     789
     790    bool SetTriggerCoincidence(uint16_t n, uint16_t win)
     791    {
     792        if (n==0 || n>StaticData::kMaxCoincidence || win>StaticData::kMaxWindow)
     793            return false;
     794
     795        if (n  ==fStaticData.fCoincidencePhysics &&
     796            win==fStaticData.fWindowPhysics)
     797            return true;
     798
     799        fStaticData.fCoincidencePhysics = n;
     800        fStaticData.fWindowPhysics      = win;
     801
     802        CmdSendStatDat();
     803
     804        return true;
     805    }
     806
     807    bool SetCalibCoincidence(uint16_t n, uint16_t win)
     808    {
     809        if (n==0 || n>StaticData::kMaxCoincidence || win>StaticData::kMaxWindow)
     810            return false;
     811
     812        if (n  ==fStaticData.fCoincidenceCalib &&
     813            win==fStaticData.fWindowCalib)
     814            return true;
     815
     816        fStaticData.fCoincidenceCalib = n;
     817        fStaticData.fWindowCalib      = win;
     818
     819        CmdSendStatDat();
     820
     821        return true;
     822    }
     823
    737824    int GetState() const { return IsConnected() ? fState : (int)FTM::kDisconnected; }
    738825};
     
    822909            fCounter[kDynamicData],
    823910            fCounter[kFtuList],
    824             fCounter[kError],
     911            fCounter[kErrorList],
    825912            fCounter[kRegister],
    826913        };
     
    835922        fDimTriggerCounter("FTM_CONTROL/TRIGGER_COUNTER", "X:1;L:1",      NULL, 0, ""),
    836923        fDimError         ("FTM_CONTROL/ERROR",           "X:1;S:1;S:28", NULL, 0, ""),
    837         fDimFtuList       ("FTM_CONTROL/FTU_LIST",        "X:1;X:1;S:1;C:4;X:40;C:40;C:40", NULL, 0, ""),
     924        fDimFtuList       ("FTM_CONTROL/FTU_LIST",        "X:1;X:1;S:1;C:4;X:40;C:40;C:40",  NULL, 0, ""),
    838925        fDimStaticData    ("FTM_CONTROL/STATIC_DATA",     "X:1;S:1;S:1;X:1;S:1;S:3;S:1;S:1;S:1;S:1;S:1;S:1;I:1;S:8;S:80;S:160;S:40;S:40", NULL, 0, ""),
    839926        fDimDynamicData   ("FTM_CONTROL/DYNAMIC_DATA",    "X:1;X:1;F:4;I:160;I:40;S:40;S:40", NULL, 0, ""),
     
    11021189    }
    11031190
     1191    int SetTriggerSeq(const EventImp &evt)
     1192    {
     1193        if (!CheckEventSize(evt.GetSize(), "SetTriggerSeq", 3))
     1194            return T::kSM_FatalError;
     1195
     1196        const uint8_t *data = reinterpret_cast<const uint8_t*>(evt.GetData());
     1197
     1198        if (!fFTM.SetTriggerSeq(data))
     1199            T::Warn("SetTriggerSeq -  Value out of range.");
     1200
     1201        return T::GetCurrentState();
     1202    }
     1203
    11041204    int SetDeadTime(const EventImp &evt)
    11051205    {
     
    11091209        if (!fFTM.SetDeadTime(evt.GetInt()))
    11101210            T::Warn("SetDeadTime -  Value out of range.");
     1211
     1212        return T::GetCurrentState();
     1213    }
     1214
     1215    int SetTriggerCoincidence(const EventImp &evt)
     1216    {
     1217        if (!CheckEventSize(evt.GetSize(), "SetTriggerCoincidence", 4))
     1218            return T::kSM_FatalError;
     1219
     1220        const uint16_t *d = reinterpret_cast<const uint16_t*>(evt.GetText());;
     1221
     1222        if (!fFTM.SetTriggerCoincidence(d[0], d[1]))
     1223            T::Warn("SetTriggerCoincidence -  Value out of range.");
     1224
     1225        return T::GetCurrentState();
     1226    }
     1227
     1228    int SetCalibCoincidence(const EventImp &evt)
     1229    {
     1230        if (!CheckEventSize(evt.GetSize(), "SetCalibCoincidence", 4))
     1231            return T::kSM_FatalError;
     1232
     1233        const uint16_t *d = reinterpret_cast<const uint16_t*>(evt.GetText());;
     1234
     1235        if (!fFTM.SetCalibCoincidence(d[0], d[1]))
     1236            T::Warn("SetCalibCoincidence -  Value out of range.");
     1237
     1238        return T::GetCurrentState();
     1239    }
     1240
     1241    int Enable(const EventImp &evt, FTM::StaticData::GeneralSettings type)
     1242    {
     1243        if (!CheckEventSize(evt.GetSize(), "Enable", 1))
     1244            return T::kSM_FatalError;
     1245
     1246        fFTM.Enable(type, evt.GetText()[0]!=0);
    11111247
    11121248        return T::GetCurrentState();
     
    12811417             "|[]:");
    12821418
     1419        AddConfiguration("ENABLE_TRIGGER", "B:1", kStateIdle)
     1420            (boost::bind(&StateMachineFTM::Enable, this, _1, FTM::StaticData::kTrigger))
     1421            (""
     1422             "|[]:");
     1423
     1424        // FIXME: Switch on/off depending on sequence
     1425        AddConfiguration("ENABLE_EXT1", "B:1", kStateIdle)
     1426            (boost::bind(&StateMachineFTM::Enable, this, _1, FTM::StaticData::kExt1))
     1427            (""
     1428             "|[]:");
     1429
     1430        // FIXME: Switch on/off depending on sequence
     1431        AddConfiguration("ENABLE_EXT2", "B:1", kStateIdle)
     1432            (boost::bind(&StateMachineFTM::Enable, this, _1, FTM::StaticData::kExt2))
     1433            (""
     1434             "|[]:");
     1435
     1436        AddConfiguration("ENABLE_VETO", "B:1", kStateIdle)
     1437            (boost::bind(&StateMachineFTM::Enable, this, _1, FTM::StaticData::kVeto))
     1438            (""
     1439             "|[]:");
     1440
     1441        AddConfiguration("SET_TRIGGER_SEQUENCE", "C:3", kStateIdle)
     1442            (boost::bind(&StateMachineFTM::SetTriggerSeq, this, _1))
     1443            (""
     1444             "|[]:");
     1445
     1446        AddConfiguration("SET_TRIGGER_COINCIDENCE", "S:2", kStateIdle)
     1447            (boost::bind(&StateMachineFTM::SetTriggerCoincidence, this, _1))
     1448            (""
     1449             "|[]:");
     1450
     1451        AddConfiguration("SET_CALIBRATION_COINCIDENCE", "S:2", kStateIdle)
     1452            (boost::bind(&StateMachineFTM::SetCalibCoincidence, this, _1))
     1453            (""
     1454             "|[]:");
    12831455
    12841456
     
    13291501
    13301502        fFTM.StartConnect();
    1331 
    1332 
    1333         // ENABLE_TRIGGER         bool
    1334         // ENABLE_EXT1            bool
    1335         // ENABLE_EXT2            bool
    1336         // ENABLE_VETO            bool
    1337         // ---> Enable(bit, bool)
    1338 
    1339         // SET_TRIGGER_SEQUENCE   val val val
    1340         // ---> SetTriggerSequence(val, val, val)
    1341 
    1342         // SET_PRESCALING         idx val
    1343         // ---> SetPrescaling(idx==-1, val)
    13441503    }
    13451504
Note: See TracChangeset for help on using the changeset viewer.