dat.c
| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | #include "evutils/dat.h" | ||
| 2 | |||
| 3 | typedef struct dat_state_s { | ||
| 4 | uint64_t ts_offset; /* accumulated 2^32 timestamp wraps */ | ||
| 5 | uint32_t last_ts; /* last raw 32-bit timestamp seen */ | ||
| 6 | uint8_t have_last; /* whether last_ts is valid */ | ||
| 7 | } dat_state_t; | ||
| 8 | |||
| 9 | 17 | size_t DAT_state_size(void) { | |
| 10 | 17 | return sizeof(dat_state_t); | |
| 11 | } | ||
| 12 | |||
| 13 | EVUTILS_TARGET_CLONES | ||
| 14 | 95 | parser_result_t DAT_parse_chunk_soa( | |
| 15 | dat_state_t *state, | ||
| 16 | const dat_input_buffer_t *input_buffer, | ||
| 17 | event_buffer_soa_t *event_buffer, | ||
| 18 | trigger_buffer_soa_t *trigger_buffer) { | ||
| 19 | |||
| 20 | (void)trigger_buffer; /* DAT CD files carry no triggers */ | ||
| 21 | |||
| 22 | 95 | const uint32_t *restrict current = input_buffer->begin; | |
| 23 | 95 | const uint32_t *restrict end = input_buffer->end; | |
| 24 | |||
| 25 | 95 | timestamp_t* restrict out_ts = event_buffer->t; | |
| 26 | 95 | uint16_t* restrict out_x = event_buffer->x; | |
| 27 | 95 | uint16_t* restrict out_y = event_buffer->y; | |
| 28 | 95 | uint8_t* restrict out_p = event_buffer->p; | |
| 29 | |||
| 30 | 95 | size_t n = event_buffer->size; | |
| 31 | 95 | const size_t capacity = event_buffer->capacity; | |
| 32 | |||
| 33 | 95 | uint64_t ts_offset = state->ts_offset; | |
| 34 | 95 | uint32_t last_ts = state->last_ts; | |
| 35 | 95 | uint8_t have_last = state->have_last; | |
| 36 | |||
| 37 | 95 | parse_status_t status = EVUTILS_PARSE_OK; | |
| 38 | |||
| 39 | /* Each event is two uint32 words: [timestamp, data]. */ | ||
| 40 | 87696102 | while (current + 2 <= end && n < capacity) { | |
| 41 | 87696007 | uint32_t ts_raw = current[0]; | |
| 42 | 87696007 | uint32_t data = current[1]; | |
| 43 | 87696007 | current += 2; | |
| 44 | |||
| 45 | 87696007 | if (have_last && ts_raw < last_ts) { | |
| 46 | 2 | ts_offset += (uint64_t)1 << 32; /* 32-bit timestamp wrapped */ | |
| 47 | } | ||
| 48 | 87696007 | last_ts = ts_raw; | |
| 49 | 87696007 | have_last = 1; | |
| 50 | |||
| 51 | 87696007 | out_ts[n] = ts_offset | (uint64_t)ts_raw; | |
| 52 | 87696007 | out_x[n] = (uint16_t)(data & 0x3FFF); | |
| 53 | 87696007 | out_y[n] = (uint16_t)((data >> 14) & 0x3FFF); | |
| 54 | 87696007 | out_p[n] = (uint8_t)((data >> 28) & 0x1); | |
| 55 | 87696007 | n++; | |
| 56 | } | ||
| 57 | |||
| 58 | 95 | event_buffer->size = n; | |
| 59 | 95 | state->ts_offset = ts_offset; | |
| 60 | 95 | state->last_ts = last_ts; | |
| 61 | 95 | state->have_last = have_last; | |
| 62 | |||
| 63 | 95 | return (parser_result_t){ | |
| 64 | .current = (const void *)current, | ||
| 65 | .status = status | ||
| 66 | }; | ||
| 67 | } | ||
| 68 |