Esempio n. 1
0
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);
	}
}
Esempio n. 2
0
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;

}
Esempio n. 3
0
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;
}