#ifndef BOARDCONTROLLERCOMMANDCODER_H #define BOARDCONTROLLERCOMMANDCODER_H #include using namespace std; //use when to compile on outdated slc #include #include #include #include "../CentralHeaders/BitConstants.h" class BoardControllerCommandCoder{ public: BoardControllerCommandCoder(); ~BoardControllerCommandCoder(); uint64_t sendT_TH(uint32_t branch, uint32_t FECaddr, uint32_t temperaturThreshold); uint64_t sendT_TH(uint32_t temperaturThreshold); uint64_t sendAV_TH(uint32_t branch, uint32_t FECaddr, uint32_t AVThreshold); uint64_t sendAV_TH(uint32_t AVThreshold); uint64_t sendAC_TH(uint32_t branch, uint32_t FECaddr, uint32_t ACThreshold); uint64_t sendAC_TH(uint32_t ACThreshold); uint64_t sendDV_TH(uint32_t branch, uint32_t FECaddr, uint32_t DVThreshold); uint64_t sendDV_TH(uint32_t DVThreshold); uint64_t sendDC_TH(uint32_t branch, uint32_t FECaddr, uint32_t DCThreshold); uint64_t sendDC_TH(uint32_t DCThreshold); uint64_t sendTSMWORD(uint32_t branch, uint32_t FECaddr, uint32_t valueTSMWORD); uint64_t sendTSMWORD(uint32_t valueTSMWORD); uint64_t sendUSRATIO(uint32_t branch, uint32_t FECaddr, uint32_t valueUSRATIO); uint64_t sendUSRATIO(uint32_t valueUSRATIO); uint64_t sendCSR0(uint32_t branch, uint32_t FECaddr, uint32_t valueCSR0); uint64_t sendCSR0(uint32_t valueCSR0); uint64_t sendCSR1(uint32_t branch, uint32_t FECaddr, uint32_t valueCSR1); uint64_t sendCSR1(uint32_t valueCSR1); uint64_t sendCSR2(uint32_t branch, uint32_t FECaddr, uint32_t valueCSR2); uint64_t sendCSR2(uint32_t valueCSR2); uint64_t sendCSR3(uint32_t branch, uint32_t FECaddr, uint32_t valueCSR3); uint64_t sendCSR3(uint32_t valueCSR3); uint32_t sendCNTLAT(uint32_t branch, uint32_t FECaddr); uint32_t sendCNTLAT(); uint32_t sendCNTCLR(uint32_t branch, uint32_t FECaddr); uint32_t sendCNTCLR(); uint32_t sendCSR1CLR(uint32_t branch, uint32_t FECaddr); uint32_t sendCSR1CLR(); uint32_t sendALRST(uint32_t branch, uint32_t FECaddr); uint32_t sendALRST(); uint32_t sendBCRST(uint32_t branch, uint32_t FECaddr); uint32_t sendBCRST(); uint32_t sendSTCNV(uint32_t branch, uint32_t FECaddr); uint32_t sendSTCNV(); uint32_t receiveT_TH(uint32_t branch, uint32_t FECaddr); uint32_t receiveAV_TH(uint32_t branch, uint32_t FECaddr); uint32_t receiveAC_TH(uint32_t branch, uint32_t FECaddr); uint32_t receiveDV_TH(uint32_t branch, uint32_t FECaddr); uint32_t receiveDC_TH(uint32_t branch, uint32_t FECaddr); uint32_t receiveTEMP(uint32_t branch, uint32_t FECaddr); uint32_t receiveAV(uint32_t branch, uint32_t FECaddr); uint32_t receiveAC(uint32_t branch, uint32_t FECaddr); uint32_t receiveDV(uint32_t branch, uint32_t FECaddr); uint32_t receiveDC(uint32_t branch, uint32_t FECaddr); uint32_t receiveL1CNT(uint32_t branch, uint32_t FECaddr); uint32_t receiveL2CNT(uint32_t branch, uint32_t FECaddr); uint32_t receiveSCLKCNT(uint32_t branch, uint32_t FECaddr); uint32_t receiveDSTBCNT(uint32_t branch, uint32_t FECaddr); uint32_t receiveTSMWORD(uint32_t branch, uint32_t FECaddr); uint32_t receiveUSRATIO(uint32_t branch, uint32_t FECaddr); uint32_t receiveCSR0(uint32_t branch, uint32_t FECaddr); uint32_t receiveCSR1(uint32_t branch, uint32_t FECaddr); uint32_t receiveCSR2(uint32_t branch, uint32_t FECaddr); uint32_t receiveCSR3(uint32_t branch, uint32_t FECaddr); uint32_t codeT_TH(float temperaturThreshold); uint32_t codeAV_TH(float AVThreshold); uint32_t codeAC_TH(float ACThreshold); uint32_t codeDV_TH(float DVThreshold); uint32_t codeDC_TH(float DCThreshold); float decodeT_TH(uint32_t temperaturThreshold); float decodeAV_TH(uint32_t AVThreshold); float decodeAC_TH(uint32_t ACThreshold); float decodeDV_TH(uint32_t DVThreshold); float decodeDC_TH(uint32_t DCThreshold); uint32_t codeCSR0(uint32_t ADCmode, uint32_t EMASK, uint32_t IMASK); uint32_t decodeCSR0_ADCmode(uint32_t valueCSR0); uint32_t decodeCSR0_EMASK(uint32_t valueCSR0); uint32_t decodeCSR0_IMASK(uint32_t valueCSR0); uint32_t codeAddress(uint32_t Branch, uint32_t FECaddr); uint32_t getDecodedAddressBranch(uint32_t Address); uint32_t getDecodedAddressFECaddr(uint32_t Address); enum eCSR1{ TEMP_OVER_TH, AV_UNDER_TH, AC_OVER_TH, DV_UNDER_TH, DC_OVER_TH, MADC_PERROR, PAPS_ERROR, ALPS_ERROR, PAR_ERROR, BC_INSTR_ERROR, BC_H_ERROR, BC_H_ABT, ALTRO_PROTOCOL_ERROR, ST_ERROR, MISSED_SCLK, BC_INT }; bool decodeCSR1(eCSR1 bit,uint32_t valueCSR1); // ATM == Altro Test Mode enum eCSR2{ PAPS_EN_ALTRO_SW, PAPS_EN_PASA_SW, CLOCK_EN_RDOCLK_EN, CLOCK_EN_ADCCLK_EN, ATM_ADC_ADD0, ATM_ADC_ADD1, NU1, NU2, NU3, ATM_TSM_ONOFF }; uint32_t codeCSR2(uint32_t HADD, uint32_t selftest, uint32_t AltroTestMode, uint32_t clock_en, uint32_t paps_en); bool decodeCSR2(eCSR1 bit,uint32_t valueCSR2); uint32_t decodeCSR2_HADD(uint32_t valueCSR2); uint32_t decodeCSR2_ATM_AltroAddress(uint32_t valueCSR2); uint32_t codeAltroTestMode(uint32_t AltroAddress, uint32_t adc_add0, uint32_t adc_add1, uint32_t TSMOnOff); uint32_t codeclock_en(uint32_t rdoclk_en, uint32_t adcclk_en); uint32_t codepaps_en(uint32_t altro_sw, uint32_t pasa_se); uint32_t codeCSR3(uint32_t cnvend, uint32_t rdclkDIFFsclkRatio); uint32_t decodeCSR3_rdclkDIFFsclkRatio(uint32_t valueCSR3); bool decodeCSR3_cnvend(uint32_t valueCSR3); private: enum eBCRegAddr{ /**Temperature Threshold*/ T_TH = 0x1, /**Analog Voltage Threshold*/ AV_TH = 0x2, /**Analog Current Threshold*/ AC_TH = 0x3, /**Digital Voltage Threshold*/ DV_TH = 0x4, /**Digital Voltage Threshold*/ DC_TH = 0x5, /**Temperature*/ TEMP = 0x6, /**Analog Voltage*/ AV = 0x7, /**Analog Current*/ AC = 0x8, /**Digital Voltage*/ DV = 0x9, /**Digital Current*/ DC = 0xA, /**L1 Counter*/ L1CNT = 0xB, /**L2 Counter*/ L2CNT = 0xC, /**Sampling Clock Counter*/ SCLKCNT = 0xD, /**Data Strobe Counter*/ DSTBCNT = 0xE, /**Test Mode Watch*/ TSMWORD = 0xF, /**Under Sampling Ratio*/ USRATIO = 0x10, /**Configuration Status Register 0*/ CSR0 = 0x11, /**Configuration Status Register 1*/ CSR1 = 0x12, /**Configuration Status Register 2*/ CSR2 = 0x13, /**Configuration Status Register 3*/ CSR3 = 0x14, /**Counter Latch*/ CNTLAT = 0x16, /**Counter Clear*/ CNTCLR = 0x17, /**CSR1 Clear*/ CSR1CLR = 0x18, /**ALTRO Reset*/ ALRST = 0x19, /**BC Reset*/ BCRST = 0x1A, /**Start Conversion mADC*/ STCNV = 0x1B, /**Scan Event Length*/ SCEVL = 0x1C, /**Read Event Length*/ EVLRDO = 0x1D, /**Start Test Mode*/ STTSM = 0x1E, /**Read Acquisition Memory*/ ACQRDO = 0x1F }; enum eScope{ /**to one Altro Channel*/ LOCAL, /**to all Altro Channels*/ BROADCAST }; uint32_t instruction(eScope broadcast, uint32_t branch, uint32_t FECaddr, eBCRegAddr registerAddress); uint32_t getParity(uint32_t ino); float kT_THFactor; float kAV_THFactor; float kAC_THFactor; float kDV_THFactor; float kDC_THFactor; }; #endif // BOARDCONTROLLERCOMMANDCODER_H