static void test_time_conversion_check_result(uint64_t a, uint64_t b, uint64_t limit, bool is32) { if (a != b) { uint64_t diff = is32 ? abs_int32(a - b) : abs_int64(a - b); if (diff <= limit) LTRACEF("ROUNDED by %llu (up to %llu allowed)\n", diff, limit); else TRACEF("FAIL, off by %llu\n", diff); } }
int XiaEventReader::treat_buffer(uint16_t *buffer) { //DGF_MAXBUF uint16_t nwords = buffer[DGF_H_NWORDS]; uint16_t module = buffer[DGF_H_MODULE]; uint16_t fmt = buffer[DGF_H_FORMAT] & DGF_FORMAT_MASK; uint16_t timehi = buffer[DGF_H_TIMESTAMP]; uint16_t timemi = buffer[DGF_H_TIMESTAMP+1]; uint16_t timelo = buffer[DGF_H_TIMESTAMP+2]; // calc time uint64_t buftime = get48bittime(timehi, timemi, timelo); if(fmt==DGF_FORMAT_UNIX) { uint16_t *evbuf = &buffer[DGF_BUFHEADLEN]; if(evbuf[0]!=1) { fprintf(stderr, "incorrect start of eventbuffer for unixtimestamp, 1 expected but %u found\n", evbuf[0]); exit(1); } uint16_t *utimebuf = &evbuf[DGF_EVENTHEADLEN]; unix_timestamp = (utimebuf[1] << 16) | utimebuf[0]; unix_timestamp_found = 1; return 1; } // check if current buffer corresponds to previous buffers int64_t diff = buftime - currenttime; if((currenttime!=-1)&&(abs_int64(diff)>20)) { // make events make_events(); return 0; } currenttime = (int64_t)buftime; // get index of empty buffer int bufindex = get_emptybuffer(); // set module nr dgf_buffers[bufindex].module = module; uint16_t *evbuf = &buffer[DGF_BUFHEADLEN]; while((evbuf-buffer)<nwords) { uint16_t pat = evbuf[DGF_E_PATTERN]; uint16_t evtimemi = evbuf[DGF_E_TIMESTAMP]; uint16_t evtimelo = evbuf[DGF_E_TIMESTAMP+1]; evbuf = &evbuf[DGF_EVENTHEADLEN]; uint64_t evtime = get48bittime(timehi, evtimemi, evtimelo); // check if evtime is smaller than buffertime if(evtime<buftime) { timehi++; evtime = get48bittime(timehi, evtimemi, evtimelo); } reset_current_dgfevent(bufindex); set_dgfeventtime(bufindex, evtime); for(int i=0; i<DGF_NCHAN; i++) { // check if channel i had a hit if(!(pat & (1 << i))) { //printf("pat %d\n", i); continue; } uint16_t chtimelo=0; uint16_t en=0; uint16_t ndat=0; switch(fmt) { // long format case 0x0100: case 0x1100: case 0x0101: case 0x1101: ndat = evbuf[DGF_C_LNWORDS]; chtimelo = evbuf[DGF_C_LTRIGGER_TIME]; en = evbuf[DGF_C_LENERGY]; evbuf = evbuf + ndat; break; // PSA format case 0x0102: case 0x1102: chtimelo = evbuf[DGF_C_PTRIGGER_TIME]; en = evbuf[DGF_C_PENERGY]; evbuf = evbuf + DGF_PCHANHEADLEN; break; // short format case 0x0103: case 0x1103: chtimelo = evbuf[DGF_C_STRIGGER_TIME]; en = evbuf[DGF_C_SENERGY]; evbuf = evbuf + DGF_SCHANHEADLEN; break; default: fprintf(stderr, "unknown format: 0x%04x\n", fmt); exit(1); } // calculate uint64_t chtime = get48bittime(timehi, evtimemi, chtimelo); if(chtime<evtime) { uint64_t buf1 = get32bittime(timehi, evtimemi); uint64_t buf2 = chtimelo; buf1++; chtime = buf1 << 16; chtime = chtime | buf2; } // advance to next event evbuf = &evbuf[ndat]; // add to event array int veto = (pat & (1 << (i+12))) ? 1 : 0; add_hit2dgfevent(bufindex, i, en, chtime, veto); } dgf_buffers[bufindex].evcnt++; } return 1; }
static int test_abs(void) { // TEST abs_int: 0 TEST(0 == abs_int32(0)); TEST(0 == abs_int32((int8_t)0)); TEST(0 == abs_int32((int16_t)0)); TEST(0 == abs_int32((int32_t)0)); TEST(0 == abs_int64((int8_t)0)); TEST(0 == abs_int64((int16_t)0)); TEST(0 == abs_int64((int32_t)0)); TEST(0 == abs_int64((int64_t)0)); TEST(0 == abs_int((int8_t)0)); TEST(0 == abs_int((int16_t)0)); TEST(0 == abs_int((int32_t)0)); TEST(0 == abs_int((int64_t)0)); // TEST abs_int: INT_MAX TEST((uint32_t)INT8_MAX == abs_int32((int8_t)INT8_MAX)); TEST((uint32_t)INT16_MAX == abs_int32((int16_t)INT16_MAX)); TEST((uint32_t)INT32_MAX == abs_int32((int32_t)INT32_MAX)); TEST((uint64_t)INT8_MAX == abs_int64((int8_t)INT8_MAX)); TEST((uint64_t)INT16_MAX == abs_int64((int16_t)INT16_MAX)); TEST((uint64_t)INT32_MAX == abs_int64((int32_t)INT32_MAX)); TEST((uint64_t)INT64_MAX == abs_int64((int64_t)INT64_MAX)); TEST((uint64_t)INT8_MAX == abs_int((int8_t)INT8_MAX)); TEST((uint64_t)INT16_MAX == abs_int((int16_t)INT16_MAX)); TEST((uint64_t)INT32_MAX == abs_int((int32_t)INT32_MAX)); TEST((uint64_t)INT64_MAX == abs_int((int64_t)INT64_MAX)); // TEST abs_int: INT_MIN TEST(-(uint32_t)INT8_MIN == abs_int32((int8_t)INT8_MIN)); TEST(-(uint32_t)INT16_MIN == abs_int32((int16_t)INT16_MIN)); TEST(-(uint32_t)INT32_MIN == abs_int32((int32_t)INT32_MIN)); TEST(-(uint64_t)INT8_MIN == abs_int64((int8_t)INT8_MIN)); TEST(-(uint64_t)INT16_MIN == abs_int64((int16_t)INT16_MIN)); TEST(-(uint64_t)INT32_MIN == abs_int64((int32_t)INT32_MIN)); TEST(-(uint64_t)INT64_MIN == abs_int64((int64_t)INT64_MIN)); TEST(-(uint64_t)INT8_MIN == abs_int((int8_t)INT8_MIN)); TEST(-(uint64_t)INT16_MIN == abs_int((int16_t)INT16_MIN)); TEST(-(uint64_t)INT32_MIN == abs_int((int32_t)INT32_MIN)); TEST(-(uint64_t)INT64_MIN == abs_int((int64_t)INT64_MIN)); // TEST abs_int: int8_t for (uint8_t i = 0; i < INT8_MAX; ++i) { TEST(i == abs_int32((int8_t)i)); TEST(i == abs_int64((int8_t)i)); TEST(i == abs_int32((int8_t)-(int8_t)i)); TEST(i == abs_int64((int8_t)-(int8_t)i)); TEST(i == abs_int((int8_t)i)); TEST(i == abs_int((int8_t)-(int8_t)i)); } // TEST abs_int: int16_t for (uint16_t i = 0; i < INT16_MAX; ++i) { TEST(i == abs_int32((int16_t)i)); TEST(i == abs_int64((int16_t)i)); TEST(i == abs_int32((int16_t)-(int16_t)i)); TEST(i == abs_int64((int16_t)-(int16_t)i)); TEST(i == abs_int((int16_t)i)); TEST(i == abs_int((int16_t)-(int16_t)i)); } // TEST abs_int: int32_t for (uint32_t i = 0; i < INT32_MAX; i += 0x1001) { TEST(i == abs_int32((int32_t)i)); TEST(i == abs_int64((int32_t)i)); TEST(i == abs_int32((int32_t)-(int32_t)i)); TEST(i == abs_int64((int32_t)-(int32_t)i)); TEST(i == abs_int((int32_t)i)); TEST(i == abs_int((int32_t)-(int32_t)i)); } // TEST abs_int: int64_t for (uint64_t i = 0; i < INT64_MAX; i += 0x1001000101001) { TEST(i == abs_int64((int64_t)i)); TEST(i == abs_int64(-(int64_t)i)); TEST(i == abs_int((int64_t)i)); TEST(i == abs_int(-(int64_t)i)); } return 0; ONERR: return EINVAL; }