1-
1+
22// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
33// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
44// All rights not expressly granted are reserved.
@@ -32,59 +32,51 @@ using namespace o2::roc;
3232namespace po = boost::program_options;
3333using namespace boost ::multiprecision;
3434
35+
3536class ProgramPatternPlayer : public Program
3637{
3738 public:
3839 virtual Description getDescription ()
3940 {
4041 return { " PatternPlayer" , " Configure the CRU pattern player" ,
41- " o2-roc-pat-player --id 42:00.0 --sync 0x0123457899876543210abcdefedcb --sync -length 4 --sync -delay 2 --sync -at-start\n " };
42+ " o2-roc-pat-player --id 42:00.0 --pat1 0x012345789abdef0123 --pat1 -length 4 --pat1 -delay 2 --execute-pat1 -at-start\n " };
4243 }
4344
4445 virtual void addOptions (boost::program_options::options_description& options)
4546 {
4647 Options::addOptionCardId (options);
47- options.add_options ()(" sync" ,
48- po::value<std::string>(&mOptions .syncPattern )->default_value (" 0x0" ),
49- " 80-bit sync pattern in hex" );
50- options.add_options ()(" reset" ,
51- po::value<std::string>(&mOptions .resetPattern )->default_value (" 0x0" ),
52- " 80-bit reset pattern in hex" );
53- options.add_options ()(" idle" ,
54- po::value<std::string>(&mOptions .idlePattern )->default_value (" 0x0" ),
55- " 80-bit idle pattern in hex" );
56- options.add_options ()(" sync-length" ,
57- po::value<uint32_t >(&mOptions .syncLength )->default_value (1 ),
58- " Sync pattern's length" );
59- options.add_options ()(" sync-delay" ,
60- po::value<uint32_t >(&mOptions .syncDelay )->default_value (0 ),
61- " Sync pattern's delay" );
62- options.add_options ()(" reset-length" ,
63- po::value<uint32_t >(&mOptions .resetLength )->default_value (1 ),
64- " Reset pattern's length" );
65- options.add_options ()(" reset-trigger-select" ,
66- po::value<uint32_t >(&mOptions .resetTriggerSelect )->default_value (30 ),
67- " Select trigger for SYNC from TTC_DATA[0-31]" );
68- options.add_options ()(" sync-trigger-select" ,
69- po::value<uint32_t >(&mOptions .syncTriggerSelect )->default_value (29 ),
70- " Select trigger for RESET from TTC_DATA[0-31]" );
71- options.add_options ()(" sync-at-start" ,
72- po::bool_switch (&mOptions .syncAtStart )->default_value (false ),
73- " Enable automatically sending a sync pattern when runenable goes high" );
74- options.add_options ()(" trigger-sync" ,
75- po::bool_switch (&mOptions .triggerSync )->default_value (false ),
76- " Manually trigger the SYNC pattern" );
77- options.add_options ()(" trigger-reset" ,
78- po::bool_switch (&mOptions .triggerReset )->default_value (false ),
79- " Manually trigger the reset pattern" );
48+
49+ optionValues.reserve (16 ); // need to keep same variable addresses
50+
51+ addOptionValue (options, " pat0" , " 80-bit pat0 pattern" , &mOptions .info .pat0 , 80 );
52+ addOptionValue (options, " pat1" , " 80-bit pat1 pattern" , &mOptions .info .pat1 , 80 );
53+ addOptionValue (options, " pat2" , " 80-bit pat2 pattern" , &mOptions .info .pat2 , 80 );
54+ addOptionValue (options, " pat3" , " 80-bit pat3 pattern" , &mOptions .info .pat3 , 80 );
55+ addOptionValue (options, " pat1-length" , " pat1 pattern's length" , &mOptions .info .pat1Length );
56+ addOptionValue (options, " pat1-delay" , " pat1 pattern's delay" , &mOptions .info .pat1Delay );
57+ addOptionValue (options, " pat2-length" , " pat2 pattern's length" , &mOptions .info .pat2Length );
58+ addOptionValue (options, " pat2-trigger-counters" , " Trigger counters for pat2: TF[31:20] ORBIT[19:12] BC[11:0]" , &mOptions .info .pat2TriggerTF );
59+ addOptionValue (options, " pat3-length" , " pat3 pattern's length" , &mOptions .info .pat3Length );
60+ addOptionValue (options, " pat1-trigger-select" , " Select trigger for pat1" , &mOptions .info .pat1TriggerSelect );
61+ addOptionValue (options, " pat2-trigger-select" , " Select trigger for pat2" , &mOptions .info .pat2TriggerSelect );
62+ addOptionValue (options, " pat3-trigger-select" , " Select trigger for pat3" , &mOptions .info .pat3TriggerSelect );
63+
64+ options.add_options ()(" execute-pat1-at-start" ,
65+ po::bool_switch (&mOptions .info .exePat1AtStart )->default_value (false ),
66+ " Enable automatically sending a pat1 pattern when runenable goes high" );
67+ options.add_options ()(" execute-pat1-now" ,
68+ po::bool_switch (&mOptions .info .exePat1Now )->default_value (false ),
69+ " Manually trigger the pat1 pattern now" );
70+ options.add_options ()(" execute-pat2-now" ,
71+ po::bool_switch (&mOptions .info .exePat2Now )->default_value (false ),
72+ " Manually trigger the pat2 pattern now" );
8073 options.add_options ()(" read-back" ,
8174 po::bool_switch (&mOptions .readBack )->default_value (false ),
8275 " Reads back the pattern player configuration [DOES NOT CONFIGURE!!]" );
8376 }
8477
8578 virtual void run (const boost::program_options::variables_map& map)
8679 {
87-
8880 auto cardId = Options::getOptionCardId (map);
8981 auto params = Parameters::makeParameters (cardId, 2 );
9082 auto bar2 = ChannelFactory ().getBar (params);
@@ -98,47 +90,80 @@ class ProgramPatternPlayer : public Program
9890 return ;
9991 }
10092
93+ // convert input strings to numbers
94+ parseOptionValues ();
95+
10196 auto cruBar2 = std::dynamic_pointer_cast<CruBar>(bar2);
10297 if (!mOptions .readBack ) {
103- cruBar2->patternPlayer ({ uint128_t (mOptions .syncPattern ), // TODO: Parse this correctly!
104- uint128_t (mOptions .resetPattern ),
105- uint128_t (mOptions .idlePattern ),
106- mOptions .syncLength ,
107- mOptions .syncDelay ,
108- mOptions .resetLength ,
109- mOptions .resetTriggerSelect ,
110- mOptions .syncTriggerSelect ,
111- mOptions .syncAtStart ,
112- mOptions .triggerSync ,
113- mOptions .triggerReset });
98+ cruBar2->patternPlayer (mOptions .info );
11499 } else {
115100 auto ppInfo = cruBar2->patternPlayerRead ();
116- std::cout << " sync pattern:\t\t 0x" << std::hex << ppInfo.syncPattern << std::endl;
117- std::cout << " reset pattern:\t\t 0x" << ppInfo.resetPattern << std::endl;
118- std::cout << " idle pattern:\t\t 0x" << ppInfo.idlePattern << std::dec << std::endl;
119- std::cout << " sync length:\t\t " << ppInfo.syncLength << std::endl;
120- std::cout << " sync delay:\t\t " << ppInfo.syncDelay << std::endl;
121- std::cout << " reset length:\t\t " << ppInfo.resetLength << std::endl;
122- std::cout << " reset trigger select:\t " << ppInfo.resetTriggerSelect << std::endl;
123- std::cout << " sync trigger select:\t " << ppInfo.syncTriggerSelect << std::endl;
101+ std::cout << " pat0 pattern:\t\t 0x" << std::hex << ppInfo.pat0 << std::endl;
102+ std::cout << " pat1 pattern:\t\t 0x" << std::hex << ppInfo.pat1 << std::endl;
103+ std::cout << " pat2 pattern:\t\t 0x" << std::hex << ppInfo.pat2 << std::endl;
104+ std::cout << " pat3 pattern:\t\t 0x" << std::hex << ppInfo.pat3 << std::endl;
105+
106+ std::cout << " pat1 length:\t\t " << std::dec << ppInfo.pat1Length << std::endl;
107+ std::cout << " pat1 delay:\t\t " << std::dec << ppInfo.pat1Delay << std::endl;
108+ std::cout << " pat2 length:\t\t " << std::dec << ppInfo.pat2Length << std::endl;
109+ std::cout << " pat3 length:\t\t " << std::dec << ppInfo.pat3Length << std::endl;
110+
111+ std::cout << " pat1 trigger select:\t 0x" << std::hex << ppInfo.pat1TriggerSelect << std::endl;
112+ std::cout << " pat2 trigger select:\t 0x" << std::hex << ppInfo.pat2TriggerSelect << std::endl;
113+ std::cout << " pat3 trigger select:\t 0x" << std::hex << ppInfo.pat3TriggerSelect << std::endl;
114+
115+ std::cout << " pat2 trigger counters:\t "
116+ << " TF 0x" << std::hex << ((ppInfo.pat2TriggerTF >> 20 ) & 0xFFF )
117+ << " ORBIT 0x" << std::hex << ((ppInfo.pat2TriggerTF >> 12 ) & 0xFF )
118+ << " BC 0x" << std::hex << (ppInfo.pat2TriggerTF & 0xFFF )
119+ << std::endl;
124120 }
125121 }
126122
127123 private:
128124 struct OptionsStruct {
129- std::string syncPattern = " 0x0" ;
130- std::string resetPattern = " 0x0" ;
131- std::string idlePattern = " 0x0" ;
132- uint32_t syncLength = 1 ;
133- uint32_t syncDelay = 0 ;
134- uint32_t resetLength = 1 ;
135- uint32_t resetTriggerSelect = 30 ;
136- uint32_t syncTriggerSelect = 29 ;
137- bool syncAtStart = false ;
138- bool triggerSync = false ;
139- bool triggerReset = false ;
125+ PatternPlayer::Info info;
140126 bool readBack = false ;
141127 } mOptions ;
128+
129+ struct OptionValue {
130+ public:
131+ enum OptionValueType {UINT32, UINT64, UINT128};
132+ std::string name; // option name
133+ std::string value; // string value
134+ void * destination; // variable assigned when parsing value
135+ unsigned int bitWidth; // maximum bit width allowed
136+ OptionValueType type; // variable type
137+ }; // namespace option
138+
139+ std::vector<OptionValue> optionValues;
140+
141+ // register 32bit option value
142+ void addOptionValue (boost::program_options::options_description& options, const char *name, const char *description, uint32_t *destinationVariable, unsigned int bitWidth = 32 ) {
143+ optionValues.push_back ({name, " " , destinationVariable, bitWidth, OptionValue::OptionValueType::UINT32});
144+ options.add_options ()(name, po::value<std::string>(&(optionValues.back ().value )), description);
145+ }
146+
147+ // register 128bit option value
148+ void addOptionValue (boost::program_options::options_description& options, const char *name, const char *description, uint128_t *destinationVariable, unsigned int bitWidth = 128 ) {
149+ optionValues.push_back ({name, " " , destinationVariable, bitWidth, OptionValue::OptionValueType::UINT128});
150+ options.add_options ()(name, po::value<std::string>(&(optionValues.back ().value )), description);
151+ }
152+
153+ // parse option values and assign corresponding variables
154+ void parseOptionValues () {
155+ for (const auto &opt : optionValues) {
156+ if (opt.value .length ()) {
157+ uint128_t v;
158+ v = PatternPlayer::getValueFromString (opt.value , opt.bitWidth , opt.name );
159+ if (opt.type == OptionValue::OptionValueType::UINT32) {
160+ *(static_cast <uint32_t *>(opt.destination )) = (uint32_t )v;
161+ } else if (opt.type == OptionValue::OptionValueType::UINT128) {
162+ *(static_cast <uint128_t *>(opt.destination )) = v;
163+ }
164+ }
165+ }
166+ }
142167};
143168
144169int main (int argc, char ** argv)
0 commit comments