4 #include "PixTestCmd.hh"
9 #include <Windows4Root.h>
37 PixTestCmd::PixTestCmd() :
PixTest()
44 if (parName == sval)
return true;
49 void PixTestCmd::init()
51 LOG(logINFO) <<
"PixTestCmd::init()";
52 fDirectory = gFile->GetDirectory( fName.c_str() );
61 fTestTip = string(
"void");
62 fSummaryTip = string(
"nothing to summarize here");
66 void PixTestCmd::bookHist(
string name)
68 LOG(logDEBUG) <<
"nothing done with " << name;
72 PixTestCmd::~PixTestCmd()
74 LOG(logDEBUG) <<
"PixTestCmd dtor";
75 std::list<TH1*>::iterator il;
78 LOG(logINFO) <<
"Write out " << (*il)->GetName();
84 ofstream fout(
".history");
85 for(
unsigned int i=max(0,(
int)cmdHistory.size()-100); i<cmdHistory.size(); i++){
86 fout << cmdHistory[i] << endl;
91 void PixTestCmd::DoTextField(){
92 string s=commandLine->GetText();
93 transcript->SetForegroundColor(1);
94 transcript->AddLine((
">"+s).c_str());
95 commandLine->SetText(
"");
97 int stat = cmd->exec( s );
98 string reply=cmd->out.str();
103 transcript->SetForegroundColor(0x0000ff);
105 transcript->SetForegroundColor(0xff0000);
109 std::stringstream ss( reply );
112 while(std::getline(ss,line,
'\n')){
113 transcript->AddLine( line.c_str() );
115 if (linecount>100000){
116 cout <<
"are you sure, this is line " << linecount <<
"\n" << line.c_str() << endl;
121 transcript->ShowBottom();
123 if ( (cmdHistory.size()==0) || (! (cmdHistory.back()==s))){
124 cmdHistory.push_back(s);
126 historyIndex=cmdHistory.size();
129 void PixTestCmd::DoUpArrow(){
130 if (historyIndex>0) historyIndex--;
131 if (cmdHistory.size()>historyIndex){
132 commandLine->SetText(cmdHistory[historyIndex].c_str());
136 void PixTestCmd::DoDnArrow(){
137 if (historyIndex<cmdHistory.size()){
140 if(historyIndex<cmdHistory.size()){
141 commandLine->SetText(cmdHistory[historyIndex].c_str());
143 commandLine->SetText(
"");
147 void PixTestCmd::createWidgets(){
148 const TGWindow *main = gClient->GetRoot();
150 tf =
new TGTransientFrame(gClient->GetRoot(), main, 600, 800);
154 textOutputFrame =
new TGHorizontalFrame(tf, w, 400);
155 transcript =
new TGTextView(textOutputFrame, w, 400);
156 textOutputFrame->AddFrame(transcript,
new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 2, 2, 2, 2));
158 tf->AddFrame(textOutputFrame,
new TGLayoutHints(kLHintsExpandX| kLHintsExpandY, 10, 10, 2, 2));
163 cmdLineFrame =
new TGHorizontalFrame(tf, w, 100);
164 commandLine =
new TGTextEntry(cmdLineFrame,
new TGTextBuffer(60));
165 commandLine->Connect(
"ReturnPressed()",
"PixTestCmd",
this,
"DoTextField()");
166 commandLine->Connect(
"CursorOutUp()",
"PixTestCmd",
this,
"DoUpArrow()");
167 commandLine->Connect(
"CursorOutDown()",
"PixTestCmd",
this,
"DoDnArrow()");
168 cmdLineFrame->AddFrame(commandLine,
new TGLayoutHints(kLHintsExpandX, 2, 2, 2, 2));
169 tf->AddFrame(cmdLineFrame,
new TGLayoutHints(kLHintsExpandX, 10, 10, 2, 2));
170 transcript->AddLine(
"Welcome to psi46expert!");
172 tf->Resize(tf->GetDefaultSize());
180 LOG(logINFO) <<
"PixTestCmd::doTest() " ;
186 ifstream inputFile(
".history");
187 if ( inputFile.is_open()){
189 while( getline( inputFile, line ) ){
190 cmdHistory.push_back(line);
192 historyIndex = cmdHistory.size();
232 #include "dictionaries.h"
235 string Token::front(
bool expand){
240 t=stack.back().front();
242 if (!expand)
return t;
243 mi = macros->find(t);
244 if (mi==macros->end())
return t;
246 stack.push_back(mi->second);
250 void Token::pop_front(){
254 if(stack.back().empty()){cerr <<
"bug alert" << endl;
return;}
255 stack.back().pop_front();
256 if (stack.back().empty()){stack.pop_back();};
259 void Token::push_front(
string s){
263 stack.back().push_front(s);
267 bool Token::assignment(
string& name){
273 if (!(empty())&& (front(
false)==
"=")){
285 bool StrToI(
string word,
int & v)
293 const char * digits =
"0123456789abcdef";
296 const char * d0 = strchr(digits,
'0');
298 int len = word.size();
299 if ((len>0) && (word[0] ==
'$')) {
302 }
else if ((len>1) && (word[0] ==
'0') && (word[1] ==
'x')) {
305 }
else if ((len>1) && (word[0] ==
'b') && ((word[1]==
'0')||(word[1])==
'1')) {
316 while ((i < len) && ((d = strchr(digits, word[i])) != NULL) && (d-d0<base) ) {
317 a = base * a + d - d0;
322 if (i == len) {
return true; }
else {
return false;}
327 int Arg::varvalue =0;
330 bool IntList::parse(
Token & token,
const bool append){
336 if (!append) ranges.clear();
338 if ( (token.front()==
"*") ){
340 ranges.push_back( make_pair( IMIN, IMAX ) );
341 singleValue = UNDEFINED;
342 }
else if( (token.front()==
"%") ){
344 ranges.push_back( make_pair( IVAR, IVAR ) );
349 if (token.front()==
":"){
350 cout <<
"this shouldn't really happen anymore" << endl;
353 }
else if( token.front()==
"~" ){
357 if ( StrToI(token.front(), i1)) {
364 if ( (!token.empty()) && (token.front()==
":")){
369 if (StrToI(token.front(), i2)) {
371 }
else if(token.front()==
"~"){
375 cout <<
"syntax error parsing integer list" << endl;
382 ranges.push_back( make_pair( i1, i2 ) );
383 if ((ranges.size()==1) && (i1==i2)){
386 singleValue = UNDEFINED;
390 if ( (!token.empty()) && (token.front()==
",")){
395 }
while (!token.empty());
399 cout <<
"IntList #ranges=" << ranges.size() <<
" single=" << (!(singleValue==UNDEFINED)) << endl;
400 for(
unsigned int i=0; i<ranges.size(); i++){cout << ranges[i].first <<
":" << ranges[i].second << endl;}
401 cout <<
"---------" << endl;
406 vector<int> IntList::getVect(
const int imin,
const int imax){
408 for(
unsigned int j=0; j<ranges.size(); j++){
409 int i1 = ranges[j].first;
410 int i2 = ranges[j].second;
412 if( i1 == IMIN ){ i1=imin;}
413 else if (i1 == IVAR ){ i1=Arg::varvalue;}
415 if( i2 == IMAX ){ i2=imax;}
416 else if(i2 == IVAR){ i2=Arg::varvalue;}
418 for(
int i=i1; i<i2+1; i++){
419 IntList.push_back(i);
428 bool is_whitespace(
unsigned int i,
const string & s){
430 return (s[i]==
' ') || (s[i]==
'\n')||(s[i]==
'\t');
437 string findchar(
char c,
unsigned int & i,
string s){
443 while( i<s.size() && !(s[++i]==c)){
444 word.push_back(s[i]);
451 deque <string > getWords(
const string & s){
455 const char * symbols=
"\",:()[];=\n";
457 while( is_whitespace(i,s) ){i++;};
464 word = findchar(
'"',i,s);
465 if ((i<s.size()) && (s[i]==
'"')) i++;
466 }
else if ( strchr(symbols, s[i]) != NULL){
467 word.push_back(s[i++]);
469 while( (i<s.size()) && (! is_whitespace(i,s))
470 && (strchr(symbols, s[i]) == NULL) ) {
471 word.push_back(s[i++]);
478 if((i>1)&& is_whitespace(i-2,s)){
479 words.push_back(
"~");
481 words.push_back(word);
482 if( (i>=s.size()) || is_whitespace(i,s) ){
483 words.push_back(
"~");
486 words.push_back(word);
490 while( is_whitespace(i,s) ){i++;};
495 cout<<
"getwords" <<endl;
496 for(
unsigned int i=0; i< words.size(); i++){ cout << i <<
" " << words[i] << endl;}
502 string Target::str(){
506 if(!expanded) { expand(0, 15);}
507 for(
unsigned int i=0; i<ivalues.size()-1; i++){
508 s<<
" " << ivalues[i] <<
",";
510 s<<
" "<<ivalues[ivalues.size()-1];
518 bool Target::parse(
Token & token){
520 if (token.empty())
return false;
522 name = token.front();
523 if ((name==
"roc")||(name==
"do")) {
526 lvalues.parse( token );
529 }
else if ((name==
"tbm") || (name==
"tbma") || (name==
"tbmb") || (name==
"tb")) {
539 bool Statement::parse(
Token & token){
544 if (token.empty())
return false;
546 if ( token.assignment( name ) ){
548 if (token.front()==
"["){
554 string t=token.front();
555 if(t==
"["){ n++;}
else if (t==
"]"){ n--;}
558 }
while((n>0)&&(!token.empty()));
561 cout <<
"Statement::parse adding macro " << name << endl;
562 token.add_macro(name, macro);
565 cerr <<
"error in macro definition" << endl;
578 has_localTarget = localTarget.parse( token );
588 if( token.front()==
"["){
592 block->parse( token );
594 }
else if (!(token.front()==
";")){
598 keyword =
Keyword( token.front() );
601 while( (!token.empty()) && !( (token.front()==
";") || (token.front()==
"]") || (token.front()==
">") ) ){
602 if (IntList.parse(token)){
603 keyword.argv.push_back(IntList);
605 keyword.argv.push_back(token.front());
611 cerr <<
"syntax error?" << endl;
616 if(!(token.empty()) && (token.front()==
">")){
618 if (!(token.empty())){
619 out_filename = token.front();
623 cerr <<
"expected filename after '>' " << endl;
633 bool Block::parse(
Token & token){
637 if (token.empty())
return false;
639 if ( !(token.front()==
"[") )
return false;
642 while( !token.empty() ){
644 bool stat = st->parse( token );
645 if (! stat)
return false;
646 stmts.push_back( st );
649 if (token.front()==
"]"){
652 }
else if (token.front()==
";"){
655 cerr <<
"expected ';' instead of " << token.front() << endl;
669 bool Keyword::match(
const char * s,
int & value){
670 return (kw(s)) && (narg()==1) && (argv[0].getInt(value));
673 bool Keyword::match(
const char * s,
int & value,
const char * s1){
674 return (kw(s)) && (narg()==2) && (argv[0].getInt(value)) && (argv[1].scmp(s1)) ;
677 bool Keyword::match(
const char * s1,
const char * s2,
int & value){
678 return (kw(s1)) && (narg()==2) && (argv[0].scmp(s2)) && (argv[1].getInt(value));
681 bool Keyword::match(
const char * s,
const char * s1){
682 if (narg() !=1 )
return false;
683 return (kw(s)) && (narg()==1) && (argv[0].scmp(s1));
686 bool Keyword::match(
const char * s,
const char * s1,
string & s2){
687 if (narg() !=1 )
return false;
688 return (kw(s)) && (narg()==2) && (argv[0].scmp(s1)) && (argv[1].getString(s2));
692 bool Keyword::match(
const char * s,
string & s1, vector<string> & options, ostream & err){
693 if (narg() !=1 )
return false;
695 if ( (kw(s)) && (narg()==1) ){
696 for(
unsigned int i=0; i<options.size(); i++){
697 if ( argv[0].svalue==options[i] ){
702 err <<
"possible options for keyword "<< s <<
" are :\n";
703 for(
unsigned int i=0; i<options.size(); i++){
704 err <<
" " <<options[i];
713 bool Keyword::greedy_match(
const char * s1,
string & s2){
714 if (! kw(s1) )
return false;
716 for(
unsigned int i=0; i<narg(); i++){ s2+=argv[i].str();}
720 bool Keyword::match(
const char * s,
int & value1,
int & value2){
721 return (kw(s)) && (narg()==2) && (argv[0].getInt(value1)) && (argv[1].getInt(value2));
724 bool Keyword::match(
const char * s,
int & value1,
int & value2,
int & value3){
725 return (kw(s)) && (narg()==3) && (argv[0].getInt(value1)) && (argv[1].getInt(value2)) && (argv[2].getInt(value3));
728 bool Keyword::greedy_match(
const char * s1,
int& value1,
int& value2,
int& value3,
string & s2){
729 return (kw(s1)) && (narg()>2) && (argv[0].getInt(value1))
730 && (argv[1].getInt(value2)) && (argv[2].getInt(value3))
734 bool Keyword::match(
const char * s1,
string & s2){
735 return (kw(s1)) && (narg()==1) && (argv[0].getString(s2));
739 bool Keyword::match(
const char * s, vector<int> & v1, vector<int> & v2){
740 return (kw(s)) && (narg()==2) && (argv[0].getVect(v1)) && (argv[1].getVect(v2));
743 bool Keyword::match(
const char * s, vector<int> & v1,
const int i1min,
const int i1max,
744 vector<int> & v2,
const int i2min,
const int i2max){
745 return (kw(s)) && (narg()==2) && (argv[0].getVect(v1, i1min, i1max)) && (argv[1].getVect(v2, i2min, i2max));
748 string Keyword::str(){
751 for(
unsigned int i=0; i<narg(); i++){
753 if (i+1<narg()) s <<
",";
763 for (
unsigned int i=0; i<stmts.size(); i++){
764 success |= stmts[i]->exec(proc, target);
781 if( has_localTarget && (block==NULL) && (keyword.keyword==
"") ){
783 proc->setDefaultTarget( localTarget );
784 proc->out <<
"target set to " << proc->defaultTarget.str();
789 if( has_localTarget ){
790 useTarget = localTarget;
797 if ( (block==NULL) && !(keyword.keyword==
"") ){
799 if(useTarget.name==
"roc"){
800 useTarget.expand( 0, 15 );
801 for(
unsigned int i=0; i<useTarget.size(); i++){
802 Target t = useTarget.get(i);
803 if (! (proc->process(keyword, t, has_localTarget)))
return false;
806 }
else if(useTarget.name==
"do"){
807 useTarget.expand(0, 100);
808 for(
unsigned int i=0; i< useTarget.size(); i++){
809 Target t = useTarget.get(i);
810 Arg::varvalue = t.value();
811 if (!(proc->process(keyword, t,
false) ))
return false;
815 stat = proc->process(keyword, useTarget, has_localTarget);
818 }
else if (!(block==NULL) ){
821 if(useTarget.name==
"roc"){
822 useTarget.expand( 0, 15 );
823 for(
unsigned int i=0; i< useTarget.size(); i++){
824 Target t = useTarget.get(i);
825 if (!(block->exec(proc, t) ))
return false;
828 }
else if(useTarget.name==
"do"){
829 useTarget.expand(0, 100);
830 for(
unsigned int i=0; i< useTarget.size(); i++){
831 Target t = useTarget.get(i);
832 Arg::varvalue = t.value();
833 if (!(block->exec(proc, t) ))
return false;
837 stat = block->exec(proc, useTarget);
849 fout.open( out_filename.c_str());
851 fout << proc->out.str();
855 cerr <<
"unable to open " << out_filename << endl;
867 const unsigned int CmdProc::fnDAC_names=19;
868 const char *
const CmdProc::fDAC_names[CmdProc::fnDAC_names] =
869 {
"vdig",
"vana",
"vsh",
"vcomp",
"vwllpr",
"vwllsh",
"vhlddel",
"vtrim",
"vthrcomp",
870 "vibias_bus",
"phoffset",
"vcomp_adc",
"phscale",
"vicolor",
"vcal",
871 "caldel",
"ctrlreg",
"wbc",
"readback"};
873 int CmdProc::fGetBufMethod = 1;
874 int CmdProc::fPrerun=0;
875 bool CmdProc::fFW35=
false;
881 defaultTarget =
Target(
"roc",0);
882 _dict = RegisterDictionary::getInstance();
883 _probeDict = ProbeDictionary::getInstance();
884 fA_names = _probeDict->getAllAnalogNames();
885 fD_names = _probeDict->getAllDigitalNames();
887 fPixelConfigNeeded =
true;
896 macros[
"start"] = getWords(
"[roc * mask; roc * cald; reset tbm; seq 14]");
897 macros[
"startroc"] = getWords(
"[mask; seq 15; arm 20 20; tct 106; vcal 200; adc]");
898 macros[
"tbmonly"] = getWords(
"[reset tbm; tbm disable triggers; seq 10; adc]");
908 if (fSigdelaysSetup.size()==0){
909 fSigdelaysSetup = p->getTbSigDelays();
910 fSigdelays = p->getTbSigDelays();
919 verbose = p->verbose;
920 defaultTarget = p->defaultTarget;
922 fPeriod = p->fPeriod;
923 fPgRunning = p->fPgRunning;
928 fBufsize=p->fBufsize;
930 fSigdelaysSetup = p->fSigdelaysSetup;
931 setApi( p->fApi, p->fPixSetup);
942 int CmdProc::tbmset(
int address,
int value){
946 uint8_t base = (address & 0xF0);
947 if( base == 0xF0){ core = 1;}
948 else if(base==0xE0){ core = 0;}
949 else {out <<
"bad tbm register address "<< hex << address << dec <<
"\n";
return 1;};
951 uint8_t idx = (address & 0x0F) >> 1;
952 const char* apinames[] = {
"base0",
"base2",
"base4",
"invalid",
"base8",
"basea",
"basec",
"basee"};
953 fApi->
setTbmReg( apinames[ idx], value, core );
958 int CmdProc::tbmget(
string name,
const uint8_t core, uint8_t & value){
963 std::vector< std::pair<std::string,uint8_t> > regs = fApi->
_dut->
getTbmDACs(core);
964 for(
unsigned int i=0; i<regs.size(); i++){
965 if (name==regs[i].first){ value = regs[i].second; error=0;}
972 int CmdProc::tbmset(
string name, uint8_t cores,
int value, uint8_t valueMask){
978 if ((value & (~valueMask) )>0) {
979 out <<
"Warning! tbm set value " << hex << (int) value
980 <<
" has bits outside mask ("<<hex<< (
int) valueMask << ")\n";
983 uint8_t coreMask = 3;
984 if (cores==0){coreMask=1;}
else if(cores==1){ coreMask=2;}
988 for(
size_t core=0; core<2; core++){
989 if ( ((coreMask >> core) & 1) == 1 ){
990 std::vector< std::pair<std::string,uint8_t> > regs = fApi->
_dut->
getTbmDACs(core);
991 if (regs.size()==0) {
992 out <<
"TBM registers not set !?! This is not going to work.\n";
994 for(
unsigned int i=0; i<regs.size(); i++){
995 if (name==regs[i].first){
997 uint8_t present = regs[i].second;
998 uint8_t update = value & valueMask;
999 update |= (present & (~valueMask) );
1001 out <<
"changing tbm reg " << name <<
"["<<core<<
"]";
1002 out <<
" from 0x" << hex << (int) regs[i].second;
1003 out <<
" to 0x" << hex << (int) update <<
"\n";
1015 int CmdProc::tbmsetbit(
string name, uint8_t coreMask,
int bit,
int value){
1017 return tbmset(name, coreMask, (value & 1)<<bit, 1<<bit);
1022 int CmdProc::countHits(){
1024 vector<DRecord > data;
1025 int stat = runDaq(fBuf, 1, 0, 0);
1026 if (stat>0)
return -1;
1027 stat = getData(fBuf, data, 0);
1028 if (stat>0)
return -2;
1029 for(
unsigned int i=0; i<data.size(); i++){
1030 if (data[i].type==0) nhit++;
1037 int CmdProc::countErrors(
unsigned int ntrig,
int ftrigkhz,
int nroc,
bool setup){
1038 int stat = runDaq(fBuf, ntrig, ftrigkhz, 0, setup);
1039 if (stat>0)
return -1;
1040 vector<DRecord > data;
1042 stat = getData(fBuf, data, 0, nroc);
1046 if (fNumberOfEvents==ntrig)
return 0;
1047 if(verbose) cout <<
"number of events (" << fNumberOfEvents <<
") does not match triggers "<< ntrig << endl;
1053 int CmdProc::countGood(
unsigned int nloop,
unsigned int ntrig,
int ftrigkhz,
int nroc){
1054 tbmset(
"base4", 2, 0x80);
1056 setupDaq(ntrig, ftrigkhz, 0);
1057 for(
unsigned int k=0; k<nloop; k++){
1058 if (fFW35) tbmset(
"base4", 2, 0x80);
1059 if(fPrerun>0) runDaq(fPrerun, 10);
1060 int nerr=countErrors(ntrig, ftrigkhz, nroc,
false);
1064 for(
unsigned int i=0;i<8; i++){
1065 fDeser400XOR1sum[i] += ( (fDeser400XOR1 >> i) & 1);
1073 int CmdProc::tctscan(
unsigned int tctmin,
unsigned int tctmax){
1074 unsigned int tct0 = fTCT;
1076 if (tctmin==tctmax){
1077 tctmin = (fTCT>20) ? fTCT - 20 : 0;
1082 if (rocids.size()==0){
1083 out <<
"no rocs connected?\n";
1087 int wbc=fApi->
_dut->
getDAC(rocids[0],
"wbc");
1091 if(( (fSeq & 0x40)>0 ) && (tctmin < (wbc - fTRC) )){
1096 unsigned int tct1=tct0;
1098 for(fTCT = tctmin; fTCT<=tctmax; fTCT++){
1100 for(
unsigned i=0; i<10; i++) nhit +=countHits();
1102 out <<
"tct=" << dec << fTCT <<
" hits=" << nhit <<
"\n";
1103 if (nhit>n1){ n1=nhit; tct1=fTCT;}
1108 out <<
"tct set to " << tct1 <<
"\n";
1111 out <<
"no hits found, leaving tct at " << dec << tct0 <<
"\n";
1117 int CmdProc::tbmscan(){
1119 int stat = tbmget(
"basee", 0, phasereg);
1121 out <<
"error getting tbm delays from api \n";
1123 uint8_t p400c= (phasereg>>2) & 7;
1124 uint8_t p160c= (phasereg>>5) & 7;
1127 stat = tbmget(
"base0", 0, ntpreg);
1129 out <<
"error getting base0 register from api \n";
1133 if( (ntpreg & 0x40) > 0 ){
1137 out <<
"400\\160 0 1 2 3 4 5 6 7\n";
1138 for(uint8_t p400=0; p400<8; p400++){
1139 int xor1[8] = {0,0,0,0,0,0,0,0};
1140 out <<
" " << (int) p400 <<
" : ";
1141 for(uint8_t p160=0; p160<8; p160++){
1142 stat = tbmset(
"basee", 0, ((p160&7)<<5)+((p400&7)<<2));
1144 out <<
"error setting delay base E " << hex << ((p160<<5)+(p400<<2)) << dec <<
"\n";
1146 tbmset(
"base4", 2, 0x80);
1148 int good= countGood(10, 100, 10, nroc);
1149 for(
unsigned int i=0; i<8; i++){
1150 xor1[i] += good*fDeser400XOR1sum[i];
1153 if (good==10){ c=
'+';}
1154 else if (good>7) { c=
'o' ;}
1155 else if (good>0) { c=
'.' ;}
1157 if((p160==p160c)&&(p400==p400c)){
1158 out <<
"(" << c <<
")";
1160 out <<
" " << c <<
" ";
1165 if( (ntpreg & 0x40) == 0 ){
1167 for(
unsigned int i=0; i<8; i++){
1168 out << dec<< setw(4) << xor1[7-i];
1173 tbmset(
"basee",0,phasereg);
1180 int CmdProc::rawscan(
int level){
1182 int stat = tbmget(
"basee", 0, phasereg);
1184 out <<
"error getting tbm delays from api \n";
1188 stat = tbmget(
"base0", 0, ntpreg);
1190 out <<
"error getting base0 register from api \n";
1193 out <<
"400\\160 0 1 2 3 4 5 6 7\n";
1194 for(uint8_t p400=0; p400<8; p400++){
1195 out <<
" " << (int) p400 <<
" : ";
1196 for(uint8_t p160=0; p160<8; p160++){
1197 stat = tbmset(
"basee", 0, ((p160&7)<<5)+((p400&7)<<2));
1199 out <<
"error setting delay base E " << hex << ((p160<<5)+(p400<<2)) << dec <<
"\n";
1201 tbmset(
"base4", 2, 0x80);
1203 int stat = runDaq(fBuf, 100, 10, 0,
true);
1210 for(
unsigned int i=0; i<fBuf.size(); i++){
1211 if ((fBuf[i]&0xE000)==0xA000){
1218 out << (dec) << setw(5) << n ;
1224 tbmset(
"basee",0,phasereg);
1229 int CmdProc::rocscan(){
1230 uint8_t phasereg0, phasereg1;
1231 int stat = tbmget(
"basea", 0, phasereg0) + tbmget(
"basea", 1, phasereg1);
1233 out <<
"failed to get tbm registers from api\n";
1236 uint8_t thbits0= (phasereg0 & 0xC0);
1239 out <<
"token 0 | 1 |\n";
1240 out <<
"h/t 0 | 1 | 0 | 1 |\n" ;
1241 out <<
"rocs:-----------------|\n";
1242 for(uint8_t dly=0; dly<8; dly++){
1243 out <<
" " << dec << (int) dly <<
" : ";
1244 for(uint8_t th=0; th<4; th++){
1245 tbmset(
"basea", 0, (th<<6) | (dly<<3) | (dly));
1246 tbmset(
"basea", 1, (th<<6) | (dly<<3) | (dly));
1249 for(
unsigned int k=0; k<10; k++){
1250 good += ( (countErrors(100,1)==0) ? 1 : 0);
1253 if (good==10){ c=
'+';}
1254 else if (good>7) { c=
'o' ;}
1255 else if (good>0) { c=
'.' ;}
1257 if( (dly==(phasereg0&0x7)) && (th==(thbits0>>6)) ){
1258 out <<
"(" << c <<
")|";
1260 out <<
" " << c <<
" |";
1266 tbmset(
"basea",0,phasereg0);
1267 tbmset(
"basea",1,phasereg1);
1273 int CmdProc::levelscan(){
1276 if (fSigdelaysSetup.size()==0){
1277 fSigdelaysSetup = p->getTbSigDelays();
1278 fSigdelays = p->getTbSigDelays();
1281 for(
size_t i=0; i<fSigdelays.size(); i++){
1282 if (fSigdelays[i].first==
"level"){ l0=fSigdelays[i].second;}
1286 for(
unsigned int level=3; level<16; level++){
1288 setTestboardDelay(
"level", level);
1289 if (fFW35) tbmset(
"base4", 2, 0x80);
1291 int good = countGood(100,1,0,nroc);
1293 out << dec << setw(3) << level <<
" : ";
1294 out << setw(5) << good <<
" ";
1296 for(
unsigned int i=0; i<8; i++){
1297 out << dec<< setw(4) << fDeser400XOR1sum[7-i];
1303 setTestboardDelay(
"level",l0);
1307 int CmdProc::setTestboardPower(
string name, uint16_t value){
1308 std::vector<std::pair<std::string,double> > power_settings;
1309 power_settings.push_back(make_pair(name, 0.001*
float(value)));
1314 out <<
"invalid config \n";
1320 int CmdProc::setTestboardDelay(
string name, uint8_t value){
1323 if (fSigdelaysSetup.size()==0){
1324 fSigdelaysSetup = p->getTbSigDelays();
1325 fSigdelays = p->getTbSigDelays();
1328 vector<pair<string,uint8_t> > sigdelays;
1329 sigdelays = p->getTbSigDelays();
1333 for(
size_t i=0; i<fSigdelays.size(); i++){
1334 if (fSigdelays[i].first==name){
1335 fSigdelays[i] = std::make_pair(name, value);
1346 int CmdProc::bursttest(
int ntrig,
int trigsep,
int nburst){
1347 burst(fBuf, ntrig, trigsep, nburst);
1349 vector<DRecord > data;
1350 int stat = getData(fBuf, data, 0);
1353 for(
unsigned int i=0; i<fBuf.size(); i++){
1354 if((fBuf[i]&0xe000)==0xa000) {
1355 if(i>0) out <<
"\n";
1356 out << dec << setfill(
' ') << setw(4) << ++n <<
": ";
1358 out << setw(4) << setfill(
'0') << hex << fBuf[i] <<
" ";
1360 out << setfill(
' ') << endl;
1361 out << dec << stat <<
" errors\n";
1367 int CmdProc::adctest(
const string signalName){
1372 uint8_t gain = GAIN_1;
1377 if ( signalName==
"sda"){
1380 }
else if ( signalName==
"rda"){
1383 }
else if ( signalName==
"ctr"){
1384 vector< pair<string, uint8_t> > pgsetup;
1385 pgsetup.push_back( make_pair(
"sync", 20 ) );
1387 pgsetup.push_back( make_pair(
"resr", 20 ) );
1388 pgsetup.push_back( make_pair(
"cal", 20 ) );
1389 pgsetup.push_back( make_pair(
"trg", 20 ) );
1390 pgsetup.push_back( make_pair(
"tok", 0 ) );
1395 vector< pair<string, uint8_t> > pgsetup;
1398 pgsetup.push_back( make_pair(
"resr", 20 ) );
1399 pgsetup.push_back( make_pair(
"sync;tok", 0 ) );
1405 uint16_t nSample = 1024;
1406 unsigned int nDly = 20;
1407 vector<int> y(nDly * nSample);
1410 vector<int> yhist(2048);
1411 vector<pair<string,uint8_t> > sigdelays;
1412 for(
unsigned int dly=0; dly<nDly; dly++){
1416 setTestboardDelay(
"clk", dly);
1417 setTestboardDelay(
"ctr", dly);
1418 setTestboardDelay(
"sda", dly+15);
1419 setTestboardDelay(
"tin", dly+5);
1426 }
else if(source==2){
1428 setTestboardDelay(
"sda", dly);
1433 vector<uint16_t> data = fApi->daqADC(signalName, gain, nSample, source, start);
1435 if (data.size()<nSample) {
1436 cout <<
"Warning, data size = " << data.size() << endl;
1438 for(
unsigned int i=0; i<nSample; i++){
1439 int raw = data[i] & 0x0fff;
1440 if (raw & 0x0800) raw |= 0xfffff000;
1441 if (raw>ymax) ymax=raw;
1442 if (raw<ymin) ymin=raw;
1443 y[ nDly*i+ nDly-1-dly ]=raw;
1444 yhist[ raw/2 + 1024]++;
1456 setTestboardDelay(
"all");
1463 int ylo=ymin/2;
for(; yhist[ylo+1024]<yhist[ylo+1+1024]; ylo++){}
1464 int yhi=ymax/2;
for(; yhist[yhi+1024]<yhist[yhi-1+1024]; yhi--){}
1465 out << setw(6) << signalName
1466 <<
" low = " << fixed << setw(6) << setprecision(1) << ylo*scale*2 <<
" mV"
1467 <<
" high= " << fixed << setw(6) << setprecision(1) << yhi*scale*2 <<
" mV "
1468 <<
" amplitude = "<< fixed << setw(6) << setprecision(1) << (yhi-ylo)*scale*2 <<
" mVpp (differential)\n";
1470 out <<
"no signal found\n";
1478 int CmdProc::pixDecodeRaw(
int raw,
int level){
1479 int ph(0), error(0),x(0),y(0);
1483 ph = (raw & 0x0f) + ((raw >> 1) & 0xf0);
1484 error = (raw & 0x10) ? 128 : 0;
1485 if((error==128)&&(level>0)){ s=
", wrong stuffing bit";}
1487 int c1 = (raw >> 21) & 7;
if (c1>=6) {error |= 16;};
1488 int c0 = (raw >> 18) & 7;
if (c0>=6) {error |= 8;};
1491 int r2 = (raw >> 15) & 7;
if (r2>=6) {error |= 4;};
1492 int r1 = (raw >> 12) & 7;
if (r1>=6) {error |= 2;};
1493 int r0 = (raw >> 9) & 7;
if (r0>=6) {error |= 1;};
1494 int r = (r2*6 + r1)*6 + r0;
1496 y = 80 - r/2;
if ((
unsigned int)y >= 80){ error |= 32; s+=
", bad row";};
1497 x = 2*c + (r&1);
if ((
unsigned int)x >= 52) {error |= 64; s+=
", bad column";};
1499 out <<
"( " << dec << setw(2) << setfill(
' ') << x
1500 <<
", "<< dec << setw(2) << setfill(
' ') << y
1501 <<
": "<< setw(3) << ph <<
") ";
1503 if((error>0)&&(level>0)){
1504 out <<
"error =" << error <<
" " << s;
1510 int CmdProc::readRocs(uint8_t signal,
double scale, std::string units){
1519 if ( ! (fApi->
setDAC(
"readback", signal))){
1520 out <<
"Warning ! May have failed to write to readback register\n";
1525 fApi->
daqStart(fBufsize, fPixelConfigNeeded);
1532 out <<
"only got " << buf.size() <<
" events instead of 16 !\n";
1539 vector<uint16_t> values;
1541 for(
unsigned int i=0; i<buf.size(); i++){
1542 unsigned int iroc=0;
1543 for(
unsigned int k=0; k<buf[i].data.size(); k++){
1544 uint16_t w = buf[i].data[k];
1546 if( ( (nTBM == 0) && (k==0) )
1547 || ( (nTBM > 0 ) && ((w & 0xf000)== 0x4000)) ){
1548 uint8_t D = (w & 1);
1549 uint8_t S = (w >>1) & 1;
1550 if(verbose && (iroc==0)) cout <<
"S,D=" << (
int)S <<
"," << (int)D << endl;
1551 if (iroc==values.size()) { values.push_back(0); start.push_back(-1); }
1552 values[iroc] = ( values[iroc] << 1 ) + D;
1559 if(iroc>nRoc) nRoc= iroc;
1564 out <<
"readback failed, no roc headers!\n";
1570 for(uint8_t iroc=0; iroc<nRoc; iroc++){
1572 cout <<
"readback roc " << (int) iroc <<
" start=" << start[iroc]
1573 <<
" raw = " << bitset<16>( values[iroc] )
1574 <<
" aligned = " << bitset<16>((values[iroc] >> (15-start[iroc]) ) | (values[iroc]<<(start[iroc]+1))) << endl;
1577 uint16_t value = (values[iroc] >> (15-start[iroc]) ) | (values[iroc]<<(start[iroc]+1));
1578 uint8_t rocid= (value & 0xF000) >> 12;
1579 uint8_t cmd = (value & 0x0F00) >> 8;
1580 uint8_t data = (value & 0x00FF);
1581 out << dec << fixed << setfill(
' ') << setw(2) << (int) iroc
1582 <<
"(" << setw(2) << (int) rocid <<
")" <<
": "
1583 << fixed << setw(3) << (int) data;
1585 out <<
" ~ " << fixed << setw(6) << setprecision(3) << data*scale
1588 if ((cmd == signal)||(signal==0xff)){
1593 out <<
" readback inconsistent " << (int)cmd <<
" <> " << (
int) signal << "\n";
1596 out << dec << fixed << setfill(
' ') << setw(2) << (int) iroc <<
" no startbit?\n";
1599 if((nRoc>1)&&(nvalid>0)){
1600 out <<
"average:" << dec<<fixed << setw(3) << int(average/nvalid);
1602 out <<
" ~ " << fixed << setw(6) << setprecision(3) << float(average)/nvalid*scale
1616 int CmdProc::getBuffer(vector<uint16_t> & buf){
1620 if (fGetBufMethod==1){
1623 for(
unsigned int i=0; i<vre.size(); i++){
1624 for(
unsigned int j=0; j<vre.at(i).GetSize(); j++){
1625 buf.push_back( vre.at(i)[j] );
1637 int CmdProc::setupDaq(
int ntrig,
int ftrigkhz,
int verbosity){
1643 if( (fApi->
_dut->
getNTbms()>0) && ((fSeq & 0x02 ) ==0 ) ){
1644 out <<
"The current sequence does not contain a trigger!\n";
1645 }
else if( (fApi->
_dut->
getNTbms()==0) && ((fSeq & 0x01 ) ==0 ) ){
1646 out <<
"The current sequence does not contain a token!\n";
1650 if((ntrig==1) || (ftrigkhz==0)){
1653 length = 40000 / ftrigkhz;
1656 pg_sequence( fSeq, length );
1657 bool stat = fApi->
daqStart(fBufsize, fPixelConfigNeeded);
1659 for(
unsigned int i=0; i<8; i++){ fDeser400XOR1sum[i]=0;}
1661 fPixelConfigNeeded =
false;
1663 if(verbosity>0){ out <<
"something wrong with daqstart !!!" << endl;}
1667 if(verbose) out <<
"runDaq " << ftrigkhz <<
" " << length <<
" " << fPeriod << endl;
1668 int leff = 40* int(length / 40);
1670 out <<
"period will be truncated to " << dec<< leff <<
" BC = " << int(40000/leff) <<
" kHz !!" << endl;
1677 int CmdProc::restoreDaq(
int verbosity){
1678 bool stat = fApi->
daqStop(
false);
1679 if( (! stat ) && (verbosity>0) ){
1680 out <<
"something wrong with daqstop !" <<endl;
1687 int CmdProc::runDaq(vector<uint16_t> & buf,
int ntrig,
int ftrigkhz,
int verbosity,
bool setup){
1690 if(setup) setupDaq(ntrig, ftrigkhz, verbosity);
1696 if (verbosity>0){ out <<
"no data !" << endl;}
1697 if (setup) restoreDaq(verbosity);
1701 if(setup) restoreDaq(verbosity);
1708 int CmdProc::runDaq(
int ntrig,
int ftrigkhz,
int verbosity){
1712 if((ntrig==1) || (ftrigkhz==0)){
1715 length = 40000 / ftrigkhz;
1718 pg_sequence( fSeq, length );
1719 bool stat = fApi->
daqStart(fBufsize, fPixelConfigNeeded);
1721 if(verbosity>0){ out <<
"something wrong with daqstart !!!" << endl;}
1725 if(verbose) out <<
"runDaq f=" << dec << ftrigkhz <<
" length=" << length <<
" fPeriod=" << fPeriod << endl;
1726 int leff = 40* int(length / 40);
1728 out <<
"period will be truncated to " << dec<< leff <<
" BC = " << int(40000/leff) <<
" kHz !!" << endl;
1738 fPixelConfigNeeded =
false;
1745 int CmdProc::burst(vector<uint16_t> & buf,
int ntrig,
int trigsep,
int nburst,
int verbosity){
1749 if( (fApi->
_dut->
getNTbms()>0) && ((fSeq & 0x02 ) ==0 ) ){
1750 out <<
"The current sequence does not contain a trigger!\n";
1751 }
else if( (fApi->
_dut->
getNTbms()==0) && ((fSeq & 0x01 ) ==0 ) ){
1752 out <<
"The current sequence does not contain a token!\n";
1755 if(verbose) out << dec <<
"burst ntrig=" << ntrig <<
" separation " << trigsep <<
" bursts " << nburst <<
"\n";
1756 vector< pair<string, uint8_t> > pgsetup;
1757 pgsetup.push_back( make_pair(
"sync", 10) );
1758 pgsetup.push_back( make_pair(
"resr", fTRC) );
1759 pgsetup.push_back( make_pair(
"cal", fTCT ));
1760 for(
int i=0; i<ntrig; i++){
1761 pgsetup.push_back( make_pair(
"trg", trigsep-1 ));
1763 pgsetup.push_back( make_pair(
"token", 0));
1768 bool stat = fApi->
daqStart(fBufsize, fPixelConfigNeeded);
1770 if(verbosity>0){ out <<
"something wrong with daqstart !!!" << endl;}
1777 fPixelConfigNeeded =
false;
1780 if(verbosity>0){ out <<
"no data !" << endl;}
1789 int CmdProc::getData(vector<uint16_t> & buf, vector<DRecord > & data,
int verbosity,
int nroc_expected){
1802 for(
unsigned int i=0; i< buf.size(); i++){
1803 out << hex << setw(4) << setfill(
'0') << buf[i] <<
" ";
1805 out << dec << setfill(
' ') << endl;
1808 unsigned int nerr=0;
1814 fNumberOfEvents = 0;
1818 unsigned int lastHeaderErrorCount=0;
1819 fHeadersWithErrors.clear();
1825 uint8_t nRocPerToken = 8;
1832 bool tbmHeaderSeen=
false;
1833 unsigned int nevent=0;
1837 unsigned int nloop=0;
1840 while((i<buf.size())&&((nloop++)<buf.size())){
1842 uint16_t flag= ((buf[i]>>12)&0xE);
1843 if (buf[i]&0x1000) fDeser400err++;
1844 if ((buf[i]&0x0fff)==0xfff){
1846 if (fffCounter>1000){
1847 if(verbosity>0) out <<
"junk data, decoding aborted\n";
1849 return nerr + fDeser400err;
1860 if((fHeaderCount>0)&&((nerr+fDeser400err)>lastHeaderErrorCount)){
1861 fHeadersWithErrors.push_back(fHeaderCount);
1862 lastHeaderErrorCount=nerr+fDeser400err;
1866 if (buf[i]&0x0f00) {
1868 if (verbosity>0) out <<
"illegal deser400 header record \n";
1871 uint8_t h1=buf[i]&0xFF;
1874 if(verbosity>0) out <<
" unexpected end of data\n";
1876 fHeadersWithErrors.push_back(fHeaderCount);
1877 return nerr + fDeser400err;
1880 if (buf[i]&0x1000) fDeser400err++;
1881 if ((buf[i]&0xE000)==0x8000){
1882 uint8_t h2 = buf[i]&0xFF;
1883 data.push_back(
DRecord( 0xa, (h1<<8 | h2), buf[i-1], buf[i]) );
1887 out <<
" incomplete header ";
1888 out << hex << (int) buf[i-1] <<
" " << (
int) buf[i] << dec << "\n";
1899 if( !tbmHeaderSeen ){
1901 if(verbosity>0) out <<
"ROC header outside TBM header/trailer\n";
1904 if(nroc_expected==0){
1906 if(verbosity>0) out<<
"no rocs expected\n";
1909 if( (buf[i]&0x0004)>0 ) {
1911 if(verbosity>0) out <<
"zero-bit in roc header not zero\n";
1913 data.push_back(
DRecord(0x4, buf[i]&0x3, buf[i]) );
1914 uint8_t xordata = (buf[i] & 0x0ff0)>>4;
1917 if(verbosity>0) out <<
"Deser400 phase error\n";
1919 if ((tbm==0) && (roc==1)){
1921 fDeser400XOR1=xordata;
1922 }
else if(( tbm<2 )&&(!(XOR1==xordata) )){
1924 if (verbosity>0) out <<
"inconsistent XOR1 \n";
1925 }
else if ((tbm==2)&&(roc==1)){
1927 fDeser400XOR2=xordata;
1928 }
else if((tbm>1)&&(!(XOR2==xordata) )){
1930 if (verbosity>0) out <<
"inconsistent XOR2 \n";
1942 if(verbosity>0) out <<
"no hit expected here\n";
1948 if(verbosity>0) out <<
" unexpected end of data\n";
1950 fHeadersWithErrors.push_back(fHeaderCount);
1951 return nerr + fDeser400err;
1954 if (buf[i]&0x1000) fDeser400err++;
1956 flag = (buf[i]>>12)&0xe;
1959 uint32_t raw = ((d1 &0x0fff) << 12) + (d2 & 0x0fff);
1960 if( tbm09 && (roc == nRocPerToken) && (raw==0xffffff)){
1962 data.push_back(
DRecord(15, raw, buf[i-2], buf[i-1]) );
1964 data.push_back(
DRecord(0x0, raw, buf[i-2], buf[i-1]) );
1969 out <<
" unexpected qualifier in ROC hit:" << (int) flag <<
" "
1970 << hex << setw(4) << setfill(
'0') << buf[i-1]
1971 << dec << setfill(
' ') <<
" at position "<< i-1 <<
"\n";
1982 tbmHeaderSeen=
false;
1986 if(verbosity>0) out <<
"illegal data in deser400 trailer record \n";
1991 if(verbosity>0) out <<
"unexpected end of data\n";
1992 return nerr + fDeser400err;
1995 flag = (buf[i]>>12)&0xe;
1997 if(verbosity>0) out <<
"unexpected qualifier " << (int) flag <<
"in TBM trailer \n";
2000 if (buf[i]&0x1000) fDeser400err++;
2001 if (buf[i]&0x0f00) {
2003 if(verbosity>0) out <<
"illegal data in deser400 trailer record \n";
2006 data.push_back(
DRecord(0xe, (t1&0xFF)<<8 | (t2&(0xff)), t1, t2) );
2022 if((verbose) || (verbosity>0)){
2023 out <<
"unexpected qualifier " << hex << (int) flag <<
", skipped\n" << dec;
2031 if ((nloop>=buf.size())&&(buf.size()>1000) ){
2032 cout <<
"stuck at i=" << dec << i << endl;
2033 cout << hex << (int) buf[i-1] <<
" " << (
int) buf[i] << dec << endl;
2037 fNumberOfEvents = nevent;
2038 if((fHeaderCount>0)&&((nerr+fDeser400err)>lastHeaderErrorCount)){
2039 fHeadersWithErrors.push_back(fHeaderCount);
2045 while(i<buf.size() && (i<500) ){
2048 if ( (buf[i] & 0x8000) == 0x8000 ){
2050 data.push_back(
DRecord( 0x4, buf[i]&0x07, buf[i]));
2053 else if( (i+1)<buf.size() ){
2055 uint32_t raw = ((buf[i] & 0x0fff) << 12) + (buf[i+1] & 0x0fff);
2056 data.push_back(
DRecord( 0, raw, buf[i], buf[i+1] ) );
2059 out <<
"unexpected end of data\n";
2061 return nerr + fDeser400err;
2066 return nerr + fDeser400err;
2070 int CmdProc::printData(vector<uint16_t> buf,
int level){
2075 for(
unsigned int i=0; i<buf.size(); i++){
2077 if ((buf[i]&0xE000)==0xA000){ out <<
"\n";}
2079 out <<
" " <<hex << setw(4)<< setfill(
'0') << buf[i] << setfill(
' ');
2087 const int maxLines = 200;
2089 vector< DRecord > data;
2091 int stat = getData(buf, data, 100);
2095 uint8_t nRocPerToken = 8;
2104 for(
unsigned int i=0; (i<data.size())&&(lines<maxLines); i++){
2107 if((data[i].w1 & 0x1000)>0){
2111 if (data[i].type==15){
2114 out << setw(4) << setfill(
'0') << hex << data[i-1].w1
2116 << setw(4) << setfill(
'0') << hex << data[i-1].w2
2117 << setfill(
' ') <<
" ";
2119 out <<
"zero hit\n";
2121 out << dec << nstuff <<
" zero hits\n";
2128 if (data[i].type==4){
2131 out << setw(4) << setfill(
'0') << hex << data[i].w1 << setfill(
' ')
2132 << deserStat <<
" ";
2133 out <<
"ROC header ";
2135 out << dec << setw(2) << (int)(roc+nRocPerToken*(tbm-1)) ;
2137 out << dec << setw(2) << (int) roc;
2139 out <<
" ,D=" << (data[i].data & 1);
2140 if ((data[i].data &2 )>0) { out <<
" S";}
2141 if((tbm==0)&&(fApi->
_dut->
getNTbms()>0)) out <<
", Warning! TBM header expected first!";
2146 }
else if(!(data[i].type==15)){
2149 out << setw(4) << setfill(
'0') << hex << data[i].w1
2151 << setw(4) << setfill(
'0') << hex << data[i].w2
2152 << setfill(
' ') <<
" ";
2155 if (data[i].type==0){
2157 stat = pixDecodeRaw(data[i].data, level);
2159 out <<
" Warning! ROC header expected first!";
2163 }
else if (data[i].type==0xa){
2165 out <<
"TBM header, ";
2166 out <<
"event counter = " << dec << setfill(
' ') << setw(3) << (data[i].data >>8);
2167 int h2 = data[i].data&0xFF;
2168 int dataId=(h2&0xC0)>>6;
2169 out <<
", dataID=" << dec << setw(1) <<dataId <<
" ";
2171 out <<
",mode=" << (int) ((h2&0x30)>>4);
2172 if(h2 & 8) { out <<
", DisableTrigOut ";}
2173 if(h2 & 4) { out <<
", DisableTrigIn ";}
2174 if(h2 & 2) { out <<
", Pause ";}
2175 if(h2 & 1) { out <<
", DisablePKAM ";}
2177 out <<
",value=" << hex << setw(2) << setfill(
'0') << (int)(h2&0x3F) << setfill(
' ');
2182 }
else if (data[i].type==0xe){
2183 out <<
"TBM trailer";
2184 uint16_t t= data[i].data;
2185 if( t & 0x8000 ) { out <<
", NoTokenPass";}
2186 if( t & 0x4000 ) { out <<
", ResetTBM";}
2187 if( t & 0x2000 ) { out <<
", ResetROC";}
2188 if( t & 0x1000 ) { out <<
", SyncError";}
2189 if( t & 0x0800 ) { out <<
", SyncTrigger";}
2190 if( t & 0x0400 ) { out <<
", ClrTrgCntr";}
2191 if( t & 0x0200 ) { out <<
", Cal";}
2192 if( t & 0x0100 ) { out <<
", StackFullWarn";}
2193 if( t & 0x0080 ) { out <<
", StackFullnow";}
2194 if( t & 0x0040 ) { out <<
", PKAMReset";}
2195 out <<
", StackCount=" << (int) (t&0x003F);
2202 if(lines==maxLines){
2203 out <<
"dump aborted, line limit reached\n";
2209 for(
unsigned int i=0; i<data.size(); i++){
2210 if (data[i].type==0) nhit++;
2211 if (data[i].type==4) nRocHeader++;
2214 out << dec << nhit <<
" hits \n";
2217 if(stat-fDeser400err>0){
2218 out << dec << stat-fDeser400err <<
" decoding errors\n";
2221 out << dec << fDeser400err <<
" invalid 5-bit symbols!\n";
2224 out <<
"XOR eye sdata 1 = " << bitset<8>(fDeser400XOR1) << endl;
2225 if(tbm09) out <<
"XOR eye sdata 2 = " << bitset<8>(fDeser400XOR2) << endl;
2232 int CmdProc::sequence(
int seq){
2235 if( fPgRunning ) pg_sequence(seq);
2238 int CmdProc::pg_loop(
int value){
2239 uint16_t delay = pg_sequence( fSeq );
2242 cout <<
"calling api->daqTriggerLoop " << fBufsize << endl;
2244 cout <<
"return value " << retval << endl;
2246 cout <<
"calling api->daqTriggerLoop " << value << endl;
2248 cout <<
"return value " << retval << endl;
2254 int CmdProc::pg_stop(){
2264 int CmdProc::pg_sequence(
int seq,
int length){
2270 vector< pair<string, uint8_t> > pgsetup;
2271 uint16_t delay = 15 + 7 + 8*3 + 7 + 8*6;
2272 if (seq & 0x20 ) { pgsetup.push_back( make_pair(
"resettbm", 10) ); delay+=11;}
2273 if (seq & 0x10 ) { pgsetup.push_back( make_pair(
"sync", 10) ); delay+=11;}
2274 if (seq & 0x40 ) { pgsetup.push_back( make_pair(
"resr", fTRC) ); delay+=fTRC+1; }
2275 if (seq & 0x08 ) { pgsetup.push_back( make_pair(
"resr", fTRC) ); delay+=fTRC+1; }
2276 if (seq & 0x04 ) { pgsetup.push_back( make_pair(
"cal", fTCT )); delay+=fTCT+1; }
2277 if (seq & 0x02 ) { pgsetup.push_back( make_pair(
"trg", fTTK )); delay+=fTTK+1;}
2278 if (seq & 0x01 ) { pgsetup.push_back( make_pair(
"token", 1)); delay+=1; }
2279 pgsetup.push_back(make_pair(
"none", 0));
2293 int CmdProc::pg_restore(){
2295 std::vector<std::pair<std::string,uint8_t> > pg_setup
2296 = fPixSetup->getConfigParameters()->getTbPgSettings();
2311 int step, pattern, delay, value;
2312 string s, comment, filename;
2313 if( kw.match(
"ia") ){ out <<
"ia=" << fApi->
getTBia()<<
"\n";
return 0;}
2314 if( kw.match(
"id") ){ out <<
"id=" << fApi->
getTBid()<<
"\n";
return 0;}
2315 if( kw.match(
"va") ){ out <<
"va=" << fApi->
getTBva()<<
"\n";
return 0;}
2316 if( kw.match(
"vd") ){ out <<
"vd=" << fApi->
getTBvd()<<
"\n";
return 0;}
2317 if( kw.match(
"set",
"vd", value)){
return setTestboardPower(
"vd", value); }
2318 if( kw.match(
"getia") ){ out <<
"ia=" << fApi->
getTBia() <<
"mA\n";
return 0;}
2319 if( kw.match(
"getid") ){ out <<
"id=" << fApi->
getTBid() <<
"mA\n";
return 0;}
2320 if( kw.match(
"hvon") ){ fApi->
HVon();
return 0; }
2321 if( kw.match(
"hvoff") ){ fApi->
HVoff();
return 0; }
2322 if( kw.match(
"pon") ){ fApi->
Pon();
return 0; }
2323 if( kw.match(
"poff") ){ fApi->
Poff();
return 0; }
2324 if( kw.match(
"d1", s, fD_names, out ) ){ fApi->
SignalProbe(
"D1",s);
return 0;}
2325 if( kw.match(
"d2", s, fD_names, out ) ){ fApi->
SignalProbe(
"D2",s);
return 0;}
2326 if( kw.match(
"a1", s, fA_names, out ) ){ fApi->
SignalProbe(
"A1",s);
return 0;}
2327 if( kw.match(
"a2", s, fA_names, out ) ){ fApi->
SignalProbe(
"A2",s);
return 0;}
2328 if( kw.match(
"adc", s, fA_names, out ) ){ fApi->
SignalProbe(
"adc",s);
return 0;}
2329 if( kw.match(
"clock",
"external") ){ fApi->
setExternalClock(
true);
return 0;}
2330 if( kw.match(
"clock",
"internal") ){ fApi->
setExternalClock(
false);
return 0;}
2331 if( kw.match(
"seq", pattern)){ sequence(pattern);
return 0;}
2332 if( kw.match(
"seq",
"t")){ sequence( 2 );
return 0; }
2333 if( kw.match(
"seq",
"ct")){ sequence( 6 );
return 0; }
2334 if( kw.match(
"seq",
"rct")){ sequence( 14 );
return 0; }
2335 if( kw.match(
"seq",
"ctt")){ sequence( 7 );
return 0; }
2336 if( kw.match(
"seq",
"rctt")){ sequence( 15 );
return 0; }
2337 if( kw.match(
"pg",
"restore")){
return pg_restore();}
2338 if( kw.match(
"loop") ){
return pg_loop();}
2339 if( kw.match(
"loop", value) ){
return pg_loop(value);}
2340 if( kw.match(
"stop") ){
return pg_stop();}
2341 if( kw.match(
"pg",
"loop") ){
return pg_loop();}
2342 if( kw.match(
"pg",
"stop") ){
return pg_stop();}
2344 if( kw.match(
"sighi",s)){ fApi->
setSignalMode(s,2);
return 0;}
2345 if( kw.match(
"siglo",s)){ fApi->
setSignalMode(s,1);
return 0;}
2346 if( kw.match(
"signorm",s)){ fApi->
setSignalMode(s,0);
return 0;}
2347 if( kw.match(
"level",value)){ setTestboardDelay(
"level", value);
return 0;}
2348 if( kw.match(
"clk",value)){ setTestboardDelay(
"clk", value);
return 0;}
2349 if( kw.match(
"sda",value)){ setTestboardDelay(
"sda", value);
return 0;}
2350 if( kw.match(
"ctr",value)){ setTestboardDelay(
"ctr", value);
return 0;}
2351 if( kw.match(
"tbdly",value)){
2352 setTestboardDelay(
"clk",value);
2353 setTestboardDelay(
"ctr",value);
2354 setTestboardDelay(
"sda",value+15);
2355 setTestboardDelay(
"tin",value);
2358 if( kw.match(
"adctest", s, fA_names, out ) ){ adctest(s);
return 0;}
2359 if( kw.match(
"adctest") ){ adctest(
"clk"); adctest(
"ctr"); adctest(
"sda"); adctest(
"rda"); adctest(
"sdata1"); adctest(
"sdata2");
return 0;}
2360 if( kw.match(
"readrocs", value)){
return readRocs(value); }
2361 if( kw.match(
"readback")) {
return readRocs();}
2362 if( kw.match(
"readback",
"vd") ) {
return readRocs(8, 0.016,
"V"); }
2363 if( kw.match(
"readback",
"va") ) {
return readRocs(9, 0.016,
"V"); }
2364 if( kw.match(
"readback",
"vana")) {
return readRocs(10, 0.008,
"V"); }
2365 if( kw.match(
"readback",
"vbg") ) {
return readRocs(11, 0.008,
"V"); }
2366 if( kw.match(
"readback",
"iana")) {
return readRocs(12, 0.24,
"mA"); }
2367 if( kw.match(
"readback",
"ia") ) {
return readRocs(12, 0.24,
"mA"); }
2368 if( kw.match(
"scan",
"tct")){ tctscan();
return 0;}
2369 if( kw.match(
"tct", value)){ fTCT=value;
if (fSeq>0){sequence(fSeq);}
return 0;}
2370 if( kw.match(
"ttk", value)){ fTTK=value;
if (fSeq>0){sequence(fSeq);}
return 0;}
2371 if( kw.match(
"trc", value)){ fTRC=value;
if (fSeq>0){sequence(fSeq);}
return 0;}
2372 if( kw.match(
"getbufmethod",value)){ fGetBufMethod=value;
return 0;}
2374 if( kw.match(
"dread") ){
2375 fApi->
daqStart(fBufsize, fPixelConfigNeeded);
2379 for(
unsigned int i=0; i<buf.size(); i++){
2382 out <<
" ["<<buf.size()<<
"]\n";
2383 fPixelConfigNeeded =
false;
2386 if( kw.match(
"raw") ){
2387 int stat = runDaq( fBuf, 1,0, 0 );
2389 printData( fBuf, 0 );
2391 out <<
" error getting data ("<<dec<<(int)stat<<
")\n";
2396 if( kw.match(
"adc")){
2397 int stat = runDaq( fBuf, 1, 0, 1 );
2399 printData( fBuf, 1 );
2401 out <<
" error getting data\n";
2409 int ntrig, ftrigkhz;
2410 if( kw.match(
"errors", ntrig) ){
2411 int stat=countErrors(ntrig, 1, 16);
2415 out << dec<< (int) stat <<
"\n";
2421 if( kw.match(
"daq", ntrig, ftrigkhz) ){
2423 if(fPrerun>0) runDaq(ntrig, ftrigkhz);
2424 runDaq(fBuf, ntrig, ftrigkhz);
2426 vector<DRecord > data;
2427 int stat = getData(fBuf, data, 0);
2433 for(
unsigned int i=0; i<fBuf.size(); i++){
2435 if((fBuf[i]&0x8000)==0x8000){
2436 if(i>0) out <<
"\n";
2437 out << dec << setfill(
' ') << setw(4) << ++n <<
": ";
2439 out << setw(4) << setfill(
'0') << hex << fBuf[i] <<
" ";
2441 out << setfill(
' ') << endl;
2442 out<< dec << stat <<
" errors\n";
2444 for(
unsigned int i=0; i<fBuf.size(); i++){
2446 if((fBuf[i]&0xe000)==0xa000) {
2447 if(i>0) out <<
"\n";
2448 out << dec << setfill(
' ') << setw(4) << ++n <<
": ";
2450 out << setw(4) << setfill(
'0') << hex << fBuf[i] <<
" ";
2452 out << setfill(
' ') << endl;
2454 out <<
"no errors\n";
2456 out<< dec << stat <<
" errors! header #=";
2457 for(
unsigned int n=0; n<fHeadersWithErrors.size(); n++){
2458 out << fHeadersWithErrors[n] <<
" ";
2466 int trigsep, nburst;
2467 if( kw.match(
"burst", ntrig, trigsep, nburst) ){
return bursttest(ntrig, trigsep, nburst);}
2468 if( kw.match(
"burst", ntrig, trigsep) ){
return bursttest(ntrig, trigsep);}
2469 if( kw.match(
"burst",ntrig) ){
return bursttest(ntrig);}
2472 if( kw.greedy_match(
"pgset",step, pattern, delay, comment)){
2473 out <<
"pgset " << step <<
" " << pattern <<
" " << delay;
2478 if (kw.match(
"daqstart")){
bool stat=fApi->
daqStart(); out <<
"stat=" << stat <<
"\n";
return 0;}
2479 if (kw.match(
"daqstop")){
bool stat=fApi->
daqStop();out <<
"stat=" << stat <<
"\n";
return 0;}
2485 int CmdProc::roc(
Keyword kw,
int rocId){
2491 vector<int> col, row;
2493 for(
unsigned int i=0; i<fnDAC_names; i++){
2494 if (kw.match(fDAC_names[i],value)){ fApi->
setDAC(kw.keyword,value, rocId );
return 0 ; }
2496 if (kw.match(
"vcal",value,
"hi")){
2497 fApi->
setDAC(kw.keyword,value, rocId );
2501 if (kw.match(
"vcal",value,
"lo")){
2502 fApi->
setDAC(kw.keyword,value, rocId );
2503 fApi->
setDAC(
"ctrlreg", (fApi->
_dut->
getDAC(rocId,
"ctrlreg"))&0xfb, rocId);
2507 if (kw.match(
"hirange")) {fApi->
setDAC(
"ctrlreg", (fApi->
_dut->
getDAC(rocId,
"ctrlreg"))|4, rocId);
return 0 ;}
2508 if (kw.match(
"lorange")) {fApi->
setDAC(
"ctrlreg", (fApi->
_dut->
getDAC(rocId,
"ctrlreg"))&0xfb, rocId);
return 0 ;}
2509 if (kw.match(
"disable") ) {fApi->
setDAC(
"ctrlreg", (fApi->
_dut->
getDAC(rocId,
"ctrlreg"))|2, rocId);
return 0 ;}
2510 if (kw.match(
"enable")) {fApi->
setDAC(
"ctrlreg", (fApi->
_dut->
getDAC(rocId,
"ctrlreg"))&0xfd, rocId);
return 0 ;}
2511 if (kw.match(
"mask") ) { fApi->
_dut->
maskAllPixels(
true, rocId); fPixelConfigNeeded =
true;
return 0 ;}
2514 if ( kw.match(
"arm", col, 0, 51, row, 0, 79)
2515 || kw.match(
"pixd", col, 0, 51, row, 0, 79)
2516 || kw.match(
"pixe", col, 0, 51, row, 0, 79)
2520 for(
unsigned int c=0; c<col.size(); c++){
2521 for(
unsigned int r=0; r<row.size(); r++){
2522 if(verbose) { cout << kw.keyword <<
" roc " << rocId <<
": " << col[c] <<
"," << row[r] << endl; }
2523 if (kw.keyword==
"arm"){
2526 }
else if (kw.keyword==
"pixd"){
2530 }
else if (kw.keyword==
"pixe"){
2537 fPixelConfigNeeded =
true;
2547 int CmdProc::tbm(
Keyword kw,
int cores){
2554 if(verbose) { cout <<
"tbm " << kw.keyword <<
" ,cores =" << cores << endl;}
2555 int address, value, value1, value2, value3;
2556 if (kw.match(
"tbmset", address, value)) {
return tbmset(address, value); }
2557 if (kw.match(
"enable",
"pkam") ){
return tbmsetbit(
"base0",cores, 0, 0);}
2558 if (kw.match(
"disable",
"pkam") ){
return tbmsetbit(
"base0",cores, 0, 1);}
2559 if (kw.match(
"accept",
"triggers") ){
return tbmsetbit(
"base0",cores, 4, 0);}
2560 if (kw.match(
"ignore",
"triggers") ){
return tbmsetbit(
"base0",cores, 4, 1);}
2561 if (kw.match(
"enable",
"triggers") ){
return tbmsetbit(
"base0",cores, 6, 0);}
2562 if (kw.match(
"disable",
"triggers") ){
return tbmsetbit(
"base0",cores, 6, 1);}
2563 if (kw.match(
"ntp") ){
return tbmsetbit(
"base0",cores, 6, 1);}
2564 if (kw.match(
"enable",
"autoreset")){
return tbmsetbit(
"base0",cores, 7, 0);}
2565 if (kw.match(
"disable",
"autoreset")){
return tbmsetbit(
"base0",cores, 7, 1);}
2566 if (kw.match(
"mode",
"cal" ) ){
return tbmset(
"base2",cores, 0xC0);}
2567 if (kw.match(
"mode",
"clear") ){
return tbmset(
"base2",cores, 0x00);}
2568 if (kw.match(
"inject",
"trg") ){
return tbmset(
"base4",cores, 1);}
2569 if (kw.match(
"reset",
"roc") ){
return tbmset(
"base4",cores, (1<<2));}
2570 if (kw.match(
"inject",
"cal") ){
return tbmset(
"base4",cores, (1<<3));}
2571 if (kw.match(
"reset",
"tbm") ){
return tbmset(
"base4",cores, (1<<4));}
2572 if (kw.match(
"clear",
"stack") ){
return tbmset(
"base4",cores, (1<<5));}
2573 if (kw.match(
"clear",
"token") ){
return tbmset(
"base4",cores, (1<<6));}
2574 if (kw.match(
"clear",
"counter") ){
return tbmset(
"base4",cores, (1<<7));}
2575 if (kw.match(
"pkamcounter",value)){
return tbmset(
"base8",cores, value);}
2576 if (kw.match(
"autoreset",value) ){
return tbmset(
"basec",cores, value);}
2577 if (kw.match(
"dly",value) ){
return tbmset(
"basea", cores,
2578 (value&0x7) | ((value&0x7)<<3) , 0x38 | 0x07 );}
2579 if (kw.match(
"dly0",value) ){
return tbmset(
"basea", cores, (value&0x7) , 0x07);}
2580 if (kw.match(
"dly1",value) ){
return tbmset(
"basea", cores, (value&0x7)<<3, 0x38);}
2581 if (kw.match(
"dlyhdr",value)){
return tbmset(
"basea", cores, (value&0x1)<<6, 0x40);}
2582 if (kw.match(
"dlytok",value)){
return tbmset(
"basea", cores, (value&0x1)<<7, 0x80);}
2583 if (kw.match(
"phase400",value) ){
return tbmset(
"basee", 0, (value&0x7)<<2, 0x1c);}
2584 if (kw.match(
"phase160",value) ){
return tbmset(
"basee", 0, (value&0x7)<<5, 0xe0);}
2585 if (kw.match(
"phases") ){
2587 out <<
" TOK H/T port 0 1\n";
2588 tbmget(
"basea", 0, phases);
2589 out <<
"rocs(A) : " << (int) (phases>>7) <<
" " << (int) ((phases>>6) &1) <<
" " << (
int) ((phases>>3) &7)<<
" " << (int) (phases &7) <<
"\n";
2590 tbmget(
"basea", 1, phases);
2591 out <<
"rocs(B) : " << (int) (phases>>7) <<
" " << (int) ((phases>>6) &1) <<
" " << (
int) ((phases>>3) &7)<<
" " << (int) (phases &7) <<
"\n";
2592 tbmget(
"basee",0, phases);
2593 out <<
"160 MHz : " << dec << (int) ( phases >> 5 ) <<
"\n";
2594 out <<
"400 MHz : " << dec << (int) ( (phases) >> 2 & 7) <<
"\n";
2597 if (kw.match(
"phases",value1, value2) ){
2598 return tbmset(
"basee", 0, ((value1&0x7)<<5) | ((value2&0x7)<<2), 0xfc);
2600 if (kw.match(
"phases",value1, value2,value3) ){
2601 tbmset(
"basea", cores, (value3&0x7) | ((value3&0x7)<<3) , 0x38 | 0x07 );
2602 tbmset(
"basee", 0, ((value1&0x7)<<5) | ((value2&0x7)<<2), 0xfc);
2605 if (kw.match(
"scan",
"tbm")){
return tbmscan();}
2606 if (kw.match(
"scan",
"rocs")){
return rocscan();}
2607 if (kw.match(
"scan",
"level")){
return levelscan();}
2608 if (kw.match(
"scan",
"raw", value)){
return rawscan(value);}
2614 bool CmdProc::process(
Keyword keyword,
Target target,
bool forceTarget){
2623 cout <<
"keyword --> " << keyword.str() <<
" " << target.str() << endl;
2626 if (target.name==
"do"){
2627 Arg::varvalue = target.value();
2630 if (keyword.match(
"info")){
2635 if( keyword.match(
"macros")){
2637 for( map<
string, deque<string> >::iterator it=macros.begin();
2638 it!=macros.end(); it++){
2639 out << it->first <<
":";
2640 for(
unsigned int i=0; i<it->second.size(); i++){
2641 out << it->second[i] <<
" ";
2648 if( keyword.match(
"help") ){
2649 out <<
"Documentation can be found at ";
2650 out <<
"http://cms.web.psi.ch/phase1/software/cmdline.html\n";
2654 if( keyword.match(
"help",
"seq") ){
2655 out <<
"1=tok, 2=trg, 4=cal, 8=res, 16=sync, 32=reset-tbm\n";
2662 if (keyword.match(
"exec", filename)){
2666 ifstream inputFile( filename.c_str());
2667 if ( inputFile.is_open()) {
2669 while( getline( inputFile, line ) ){
2671 out << p->out.str();
2678 out <<
" Unable to open file ";;
2683 if (keyword.match(
"verbose")){ verbose=
true;
return true;}
2684 if (keyword.match(
"quiet")){ verbose=
false;
return true;}
2685 if (keyword.match(
"target")){ out << defaultTarget.str();
return true;}
2687 if (keyword.match(
"prerun",value)){ fPrerun=value;
return true;}
2690 if ( keyword.match(
"echo",
"roc")){ out <<
"roc " << target.value() <<
"\n";
return true;}
2691 if ( keyword.match(
"echo",
"%")){ out <<
"%" << target.value() <<
"\n";
return true;}
2692 if ( keyword.greedy_match(
"echo", message) || keyword.greedy_match(
"log",message) ){
2693 out << message <<
"\n";
2699 if ( keyword.match(
"decode", event)){
2700 vector<uint16_t> evbuf;
2702 for(
unsigned int i=0; i<fBuf.size(); i++){
2705 if ((fBuf[i]&0x8000)==0x8000){n++;}
2707 if ((fBuf[i]&0xe000)==0xa000){ n++;}
2709 if (n==event) {evbuf.push_back( fBuf[i]); }
2713 printData(evbuf, 1);
2717 if ( keyword.greedy_match(
"decode", message) ){
2719 vector<uint16_t> buf;
2720 for(
unsigned int i=0; i<keyword.narg(); i++){
2722 ss << hex << keyword.argv[i].raw();
2738 if (target.name==
"tb") {
2739 stat = tb( keyword );
2740 if ( stat >=0 )
return (stat==0);
2743 else if (target.name==
"tbm") {
2744 stat = tbm( keyword );
2745 if ( stat >=0 )
return (stat==0);
2748 else if (target.name==
"tbma") {
2749 stat = tbm( keyword, 0 );
2750 if ( stat >=0 )
return (stat==0);
2753 else if (target.name==
"tbmb") {
2754 stat = tbm( keyword, 1 );
2755 if ( stat >=0 )
return (stat==0);
2758 else if (target.name==
"roc") {
2759 stat = roc(keyword, target.value());
2760 if ( stat >=0 )
return (stat==0);
2762 out <<
"unknown " << target.name <<
" command";
2767 stat = tb( keyword );
2768 if ( stat >=0 )
return (stat==0);
2770 stat = tbm( keyword );
2771 if ( stat >=0 )
return (stat==0);
2774 stat = roc(keyword, target.value());
2775 if ( stat >=0 )
return (stat==0);
2777 out <<
"unrecognized command";
2786 int CmdProc::exec(std::string s){
2790 if( (s.size()==0) || (s[0]==
'#') || (s[0]==
'-') )
return 0;
2795 for(
unsigned int i=0; i<s.size(); i++){
2796 t.push_back( tolower( s[i] ));
2801 Token words( getWords(s) );
2803 words.macros=¯os;
2807 vector < Statement *> stmts;
2808 while( (!words.empty()) && (j++ < 2000)){
2810 bool stat= c->parse( words );
2812 stmts.push_back( c );
2814 if (!words.empty()) {
2815 if (words.front()==
";") {
2818 out <<
"expected ';' instead of '" << words.front() <<
"'";
2825 for(
unsigned int i=0; i<stmts.size(); i++){
2826 ok |= stmts[i]->exec(
this, defaultTarget);
size_t getNMaskedPixels(uint8_t rocid)
bool setExternalClock(bool enable)
void setPatternGenerator(std::vector< std::pair< std::string, uint8_t > > pg_setup)
void daqTriggerLoopHalt()
bool setDAC(std::string dacName, uint8_t dacValue, uint8_t rocI2C)
PixSetup * fPixSetup
all necessary stuff in one place
virtual bool setParameter(std::string parName, std::string sval)
set the string value of a parameter
void doTest()
function connected to "DoTest" button of PixTab
bool SignalProbe(std::string probe, std::string name)
void testPixel(uint8_t column, uint8_t row, bool enable)
void maskAllPixels(bool mask, uint8_t rocid)
void setSignalMode(std::string signal, uint8_t mode)
void setToolTips()
implement this to provide updated tool tips if the user changes test parameters
void setTestboardDelays(std::vector< std::pair< std::string, uint8_t > > sig_delays)
TDirectory * fDirectory
where the root histograms will end up
uint16_t daqTriggerLoop(uint16_t period=1000)
void setTestboardPower(std::vector< std::pair< std::string, double > > power_settings)
void testAllPixels(bool enable)
void SetCalibrateBits(bool enable)
bool setTbmReg(std::string regName, uint8_t regValue, uint8_t tbmid)
std::vector< uint16_t > daqGetBuffer()
std::list< TH1 * > fHistList
list of histograms available in PixTab::next and PixTab::previous
std::vector< uint8_t > getRocI2Caddr()
void maskPixel(uint8_t column, uint8_t row, bool mask)
void update()
signal to PixTab to update the canvas
uint8_t getDAC(size_t rocId, std::string dacName)
pxar::pxarCore * fApi
pointer to the API
std::vector< Event > daqGetEventBuffer()
uint16_t daqTrigger(uint32_t nTrig=1, uint16_t period=0)
void init()
sets all test parameters
std::vector< std::pair< std::string, uint8_t > > getTbmDACs(size_t tbmId)
std::vector< rawEvent > daqGetRawEventBuffer()