#ifndef BlockCheck_HH #define BlockCheck_HH #include #include #include class BlockCheck { public: BlockCheck() { } BlockCheck(unsigned s, unsigned e, unsigned b, const std::vector &h) { initialise(s,e,b,h); } void initialise(unsigned s, unsigned e, unsigned b, const std::vector &h) { fSlink=s; fEcon=e; fBlock=b; fHgcrocNumber=&h; if(fPrintLevel>1) { std::cout << "BlockCheck[" << fSlink << "][" << fEcon << "][" << fBlock << "]::initialise() " << "Number of HGCROCs = " << h.size() << ", numbers ="; for(unsigned n(0);n4) { std::cout << "BlockCheck[" << fSlink << "][" << fEcon << "][" << fBlock << "]::processBx(" << std::hex << a << std::dec << ") " << "Entered" << std::endl; } //if(a==0) return false; if(!fActivePacket) { if(a!=0) { fActivePacket=true; fActiveHgcroc=true; //for(unsigned h(0);h4) { std::cout << "BlockCheck[" << fSlink << "][" << fEcon << "][" << fBlock << "]::processBx() " << "New packet found" << std::endl; std::cout << "New HGCROC found" << std::endl; fHgcrocBoe.print(); } if(fHgcrocBoe.numberOfWords()==1) { fActiveHgcroc=false; fHgcrocSeen[fHgcrocBoe.hgcroc()]=true; if(fPrintLevel>4) { std::cout << "BlockCheck[" << fSlink << "][" << fEcon << "][" << fBlock << "]::processBx() " << "HGCROC " << unsigned(fHgcrocBoe.hgcroc()) << " completed" << std::endl; } } } } else { assert(a!=0); if(!fActiveHgcroc) { fActiveHgcroc=true; fHgcroc=(*fHgcrocNumber)[fNumberSeen]; fNumberSeen++; checkHeader(a,false); fWords=1; if(fPrintLevel>4) { std::cout << "BlockCheck[" << fSlink << "][" << fEcon << "][" << fBlock << "]::processBx() " << "New HGCROC found" << std::endl; fHgcrocBoe.print(); } if(fHgcrocBoe.numberOfWords()==1) { fActiveHgcroc=false; fHgcrocSeen[fHgcrocBoe.hgcroc()]=true; if(fPrintLevel>4) { std::cout << "BlockCheck[" << fSlink << "][" << fEcon << "][" << fBlock << "]::processBx() " << "HGCROC " << unsigned(fHgcrocBoe.hgcroc()) << " completed" << std::endl; } } } else { assert((a>>24)==fL1Accept); assert((a&0xffffff)==fWords); fWords++; if(fWords==fHgcrocBoe.numberOfWords()) { fActiveHgcroc=false; fHgcrocSeen[fHgcrocBoe.hgcroc()]=true; if(fPrintLevel>4) { std::cout << "BlockCheck[" << fSlink << "][" << fEcon << "][" << fBlock << "]::processBx() " << "HGCROC " << unsigned(fHgcrocBoe.hgcroc()) << " completed" << std::endl; } if(fNumberSeen==(*fHgcrocNumber).size()) { fActivePacket=false; if(fPrintLevel>4) { std::cout << "BlockCheck[" << fSlink << "][" << fEcon << "][" << fBlock << "]::processBx() " << "Packet ended" << std::endl; } fL1Accept++; return true; } } } } return false; } void checkHeader(uint32_t a, bool first) { fHgcrocBoe.word(a); if(first) fBx=fHgcrocBoe.bx(); //assert(!fHgcrocSeen[fHgcrocBoe.hgcroc()]); //fHgcrocSeen[fHgcrocBoe.hgcroc()]=true; assert(fHgcrocBoe.econ()==fEcon); assert(fHgcrocBoe.hgcroc()==fHgcroc); assert(fHgcrocBoe.bx()==fBx); assert(fHgcrocBoe.l1a()==fL1Accept); } static unsigned fPrintLevel; private: unsigned fSlink; unsigned fEcon; unsigned fBlock; unsigned fHgcroc; unsigned fNumberSeen; const std::vector *fHgcrocNumber; bool fActivePacket; bool fActiveHgcroc; uint8_t fL1Accept; uint8_t fBx; HgcrocBoe fHgcrocBoe; unsigned fWords; bool fHgcrocSeen[18]; }; unsigned BlockCheck::fPrintLevel(1); #endif