#include "nx/Message.h" #include //---------------------------------------------------------------------------- ///>11)&0x7); if (getNxLastEpoch()) fifoFill += 8; snprintf(buf, sizeof(buf), "Msg:%u Roc:%u ", getMessageType(), getRocNumber()); os << buf; snprintf(buf, sizeof(buf), "HIT @%15.9f Nx:%d Chn:%3d Ts:%5d%s(%2d) Adc:%4d Pu:%d Of:%d", timeInSec, getNxNumber(), getNxChNum(), getNxTs(), (getNxLastEpoch() ? "-e" : " "), fifoFill, getNxAdcValue(), getNxPileup(), getNxOverflow()); os << buf << std::endl; break; case base::MSG_EPOCH: snprintf(buf, sizeof(buf), "Msg:%u Roc:%u ", getMessageType(), getRocNumber()); os << buf; snprintf(buf, sizeof(buf), "EPO @%15.9f Epo:%10u 0x%08x Miss: %3d%c", timeInSec, getEpochNumber(), getEpochNumber(), getEpochMissed(), (getEpochMissed()==0xff) ? '+' : ' '); os << buf << std::endl; break; case base::MSG_SYNC: snprintf(buf, sizeof(buf), "Msg:%u Roc:%u ", getMessageType(), getRocNumber()); os << buf; snprintf(buf, sizeof(buf), "SYN @%15.9f Chn:%d Ts:%5d%s Data:%8d 0x%06x Flag:%d", timeInSec, getSyncChNum(), getSyncTs(), ((getSyncEpochLSB() != (epoch&0x1)) ? "-e" : " "), getSyncData(), getSyncData(), getSyncStFlag()); os << buf << std::endl; break; case base::MSG_AUX: snprintf(buf, sizeof(buf), "Msg:%u Roc:%u ", getMessageType(), getRocNumber()); os << buf; snprintf(buf, sizeof(buf), "AUX @%15.9f Chn:%d Ts:%5d%s Falling:%d Overflow:%d", timeInSec, getAuxChNum(), getAuxTs(), ((getAuxEpochLSB() != (epoch&0x1)) ? "-e" : " "), getAuxFalling(), getAuxOverflow()); os << buf << std::endl; break; default: kind = kind & ~base::msg_print_Human; if (kind==0) kind = base::msg_print_Prefix | base::msg_print_Data; } // return, if message was correctly printed in human-readable form if (kind & base::msg_print_Human) return; } if (kind & base::msg_print_Prefix) { snprintf(buf, sizeof(buf), "Msg:%u Roc:%u ", getMessageType(), getRocNumber()); os << buf; } if (kind & base::msg_print_Data) { uint8_t* arr = (uint8_t*) &data; switch (getMessageType()) { case base::MSG_NOP: snprintf(buf, sizeof(buf), "NOP (raw %02X:%02X:%02X:%02X:%02X:%02X)", arr[0], arr[1], arr[2], arr[3], arr[4], arr[5]); break; case base::MSG_HIT: snprintf(buf, sizeof(buf), "Nx:%1x Chn:%02x Ts:%04x Last:%1x Msb:%1x Adc:%03x Pup:%1x Oflw:%1x", getNxNumber(), getNxChNum(), getNxTs(), getNxLastEpoch(), getNxLtsMsb(), getNxAdcValue(), getNxPileup(), getNxOverflow()); break; case base::MSG_EPOCH: snprintf(buf, sizeof(buf), "Epoch:%08x Missed:%02x", getEpochNumber(), getEpochMissed()); break; case base::MSG_SYNC: snprintf(buf, sizeof(buf), "SyncChn:%1x EpochLSB:%1x Ts:%04x Data:%06x Flag:%1x", getSyncChNum(), getSyncEpochLSB(), getSyncTs(), getSyncData(), getSyncStFlag()); break; case base::MSG_AUX: snprintf(buf, sizeof(buf), "AuxChn:%02x EpochLSB:%1x Ts:%04x Falling:%1x Overflow:%1x", getAuxChNum(), getAuxEpochLSB(), getAuxTs(), getAuxFalling(), getAuxOverflow()); break; case base::MSG_SYS: { char sysbuf[256]; switch (getSysMesType()) { case base::SYSMSG_DAQ_START: snprintf(sysbuf, sizeof(sysbuf), "DAQ started"); break; case base::SYSMSG_DAQ_FINISH: snprintf(sysbuf, sizeof(sysbuf), "DAQ finished"); break; case base::SYSMSG_NX_PARITY: { uint32_t data = getSysMesData(); uint32_t nxb3_flg = (data>>31) & 0x01; uint32_t nxb3_val = (data>>24) & 0x7f; uint32_t nxb2_flg = (data>>23) & 0x01; uint32_t nxb2_val = (data>>16) & 0x7f; uint32_t nxb1_flg = (data>>15) & 0x01; uint32_t nxb1_val = (data>>8 ) & 0x7f; uint32_t nxb0_flg = (data>>7 ) & 0x01; uint32_t nxb0_val = (data ) & 0x7f; snprintf(sysbuf, sizeof(sysbuf),"Nx:%1x %1d%1d%1d%1d:%02x:%02x:%02x:%02x nX parity error", getNxNumber(), nxb3_flg, nxb2_flg, nxb1_flg, nxb0_flg, nxb3_val, nxb2_val, nxb1_val, nxb0_val); } break; case base::SYSMSG_SYNC_PARITY: snprintf(sysbuf, sizeof(sysbuf), "SYNC parity error "); break; case base::SYSMSG_DAQ_RESUME: snprintf(sysbuf, sizeof(sysbuf), "DAQ resume after high/low water"); break; case base::SYSMSG_FIFO_RESET: snprintf(sysbuf, sizeof(sysbuf), "FIFO reset"); break; case base::SYSMSG_USER: { const char* subtyp = ""; if (getSysMesData()==base::SYSMSG_USER_CALIBR_ON) subtyp = "Calibration ON"; else if (getSysMesData()==base::SYSMSG_USER_CALIBR_OFF) subtyp = "Calibration OFF"; else if (getSysMesData()==base::SYSMSG_USER_RECONFIGURE) subtyp = "Reconfigure"; snprintf(sysbuf, sizeof(sysbuf), "User message 0x%08x %s", getSysMesData(), subtyp); break; } case base::SYSMSG_PACKETLOST: snprintf(sysbuf, sizeof(sysbuf), "Packet lost"); break; default: snprintf(sysbuf, sizeof(sysbuf), "unknown system message type "); break; } snprintf(buf, sizeof(buf), "SysType:%2x Data:%8x : %s", getSysMesType(), getSysMesData(), sysbuf); break; } default: snprintf(buf, sizeof(buf), "Error - unexpected MessageType: %1x", getMessageType()); } } os << buf << std::endl; } bool nx::Message::convertFromOld(void* src) { data = 0; uint8_t* arr = (uint8_t*) src; setMessageType((arr[0] >> 5) & 0x7); setRocNumber((arr[0] >> 2) & 0x7); switch (getMessageType()) { case base::MSG_HIT: setNxNumber(arr[0] & 0x3); setNxLtsMsb((arr[1] >> 5) & 0x7); setNxTs(((arr[1] & 0x1f) << 9) | (arr[2] << 1) | (arr[3] >> 7)); setNxChNum(arr[3] & 0x7f); setNxAdcValue(((arr[4] & 0x7f) << 5) | ((arr[5] & 0xf8) >> 3)); setNxPileup((arr[5] >> 2) & 0x1); setNxOverflow((arr[5] >> 1) & 0x1); setNxLastEpoch(arr[5] & 0x1); break; case base::MSG_EPOCH: setEpochNumber((arr[1] << 24) | (arr[2] << 16) | (arr[3] << 8) | arr[4]); setEpochMissed(arr[5]); break; case base::MSG_SYNC: setSyncChNum(arr[0] & 0x3); setSyncEpochLSB(arr[1] >> 7); setSyncTs(((arr[1] & 0x7f) << 7) | ((arr[2] & 0xfc) >> 1)); setSyncData(((arr[2] & 0x3) << 22) | (arr[3] << 14) | (arr[4] << 6) | (arr[5] >> 2)); setSyncStFlag(arr[5] & 0x3); break; case base::MSG_AUX: setAuxChNum(((arr[0] & 0x3) << 5) | ((arr[1] & 0xf8) >> 3)); setAuxEpochLSB((arr[1] & 0x4) >> 2); setAuxTs(((arr[1] & 0x3) << 12) | (arr[2] << 4) | ((arr[3] & 0xe0) >> 4)); setAuxFalling((arr[3] >> 4) & 1); setAuxOverflow((arr[3] >> 3) & 1); break; case base::MSG_SYS: setSysMesType(arr[1]); setSysMesData((arr[2] << 24) | (arr[3] << 16) | (arr[4] << 8) | arr[5]); break; default: return false; } return true; } bool nx::Message::convertToOld(void* tgt) { uint8_t* data = (uint8_t*) tgt; for (int n=0;n<6;n++) data[n] = 0; data[0] = ((getMessageType() & 0x7) << 5) | ((getRocNumber() & 0x7) << 2); switch (getMessageType()) { case base::MSG_HIT: data[0] = data[0] | (getNxNumber() & 0x3); data[1] = ((getNxTs() >> 9) & 0x1f) | ((getNxLtsMsb() << 5) & 0xe0); data[2] = (getNxTs() >> 1); data[3] = ((getNxTs() << 7) & 0x80) | (getNxChNum() & 0x7f); data[4] = (getNxAdcValue() >> 5) & 0x7f; data[5] = ((getNxAdcValue() << 3) & 0xf8) | (getNxLastEpoch() & 0x1) | ((getNxOverflow() & 0x1) << 1) | ((getNxPileup() & 0x1) << 2); break; case base::MSG_EPOCH: data[1] = (getEpochNumber() >> 24) & 0xff; data[2] = (getEpochNumber() >> 16) & 0xff; data[3] = (getEpochNumber() >> 8) & 0xff; data[4] = getEpochNumber() & 0xff; data[5] = getEpochMissed(); break; case base::MSG_SYNC: data[0] = data[0] | (getSyncChNum() & 0x3); data[1] = (getSyncEpochLSB() << 7) | ((getSyncTs() >> 7) & 0x7f); data[2] = ((getSyncTs() << 1) & 0xfc) | ((getSyncData() >> 22) & 0x3); data[3] = (getSyncData() >> 14) & 0xff; data[4] = (getSyncData() >> 6) & 0xff; data[5] = ((getSyncData() << 2) & 0xfc) | (getSyncStFlag() & 0x3); break; case base::MSG_AUX: data[0] = data[0] | ((getAuxChNum() >> 5) & 0x3); data[1] = ((getAuxChNum() << 3) & 0xf8) | ((getAuxEpochLSB() << 2) & 0x4) | ((getAuxTs() >> 12) & 0x3); data[2] = (getAuxTs() >> 4) & 0xff; data[3] = ((getAuxTs() << 4) & 0xe0) | (getAuxFalling() << 4) | (getAuxOverflow() << 3); break; case base::MSG_SYS: data[1] = getSysMesType(); data[2] = (getSysMesData() >> 24) & 0xff; data[3] = (getSysMesData() >> 16) & 0xff; data[4] = (getSysMesData() >> 8) & 0xff; data[5] = getSysMesData() & 0xff; break; default: return false; } return true; }