diff options
author | tlatorre <tlatorre@uchicago.edu> | 2018-08-14 10:08:27 -0500 |
---|---|---|
committer | tlatorre <tlatorre@uchicago.edu> | 2018-08-14 10:08:27 -0500 |
commit | 24c8bcfe7f76b20124e2862ea050f815c0f768e7 (patch) | |
tree | e5bdbd638a2c7f38f1c094cc9e95cbdfe05b9481 /src/zdab_utils.c | |
parent | 0b7f199c0d93074484ea580504485a32dc29f5e2 (diff) | |
download | sddm-24c8bcfe7f76b20124e2862ea050f815c0f768e7.tar.gz sddm-24c8bcfe7f76b20124e2862ea050f815c0f768e7.tar.bz2 sddm-24c8bcfe7f76b20124e2862ea050f815c0f768e7.zip |
move everything to src directory
Diffstat (limited to 'src/zdab_utils.c')
-rw-r--r-- | src/zdab_utils.c | 199 |
1 files changed, 199 insertions, 0 deletions
diff --git a/src/zdab_utils.c b/src/zdab_utils.c new file mode 100644 index 0000000..d946eef --- /dev/null +++ b/src/zdab_utils.c @@ -0,0 +1,199 @@ +#include "Record_Info.h" +#include <stdint.h> +#include "zdab_utils.h" +#include "pack2b.h" +#include <stdlib.h> /* for size_t */ +#include <stdio.h> /* for fprintf() */ + +int isOrphan(aPmtEventRecord *pmtRecord) +{ + /* Returns non-zero if the specified event is an orphan. */ + int i; + + uint32_t *mtc_data = (uint32_t *) &pmtRecord->TriggerCardData; + + for (i = 0; i < 6; ++i) { + if (*mtc_data != 0) return 0; + ++mtc_data; + } + + return 1; +} + +// PH 04/23/98 +// Swap 4-byte integer/floats between native and external format +void swap_int32(int32_t *val_pt, int count) +{ + int32_t *last = val_pt + count; + while (val_pt < last) { + *val_pt = ((*val_pt << 24) & 0xff000000) | + ((*val_pt << 8) & 0x00ff0000) | + ((*val_pt >> 8) & 0x0000ff00) | + ((*val_pt >> 24) & 0x000000ff); + ++val_pt; + } + return; +} + +// Swap 2-byte integers between native and external format +void swap_int16(int16_t *val_pt, int count) +{ + char tmp; + int i; + for (i=0; i<count; ++i) { + tmp = ((char *) val_pt)[0]; + ((char *) val_pt)[0] = ((char *) val_pt)[1]; + ((char *) val_pt)[1] = tmp; + ++val_pt; + } + return; +} + +void unpack_ev(uint32_t *data, EVBank *b) +{ + unpack((uint8_t *) data, "l",&b->run); + unpack((uint8_t *) (data+1), "l",&b->evn); + unpack((uint8_t *) (data+2), "l",&b->dtp); + unpack((uint8_t *) (data+3), "l",&b->jdy); + unpack((uint8_t *) (data+4), "l",&b->ut1); + unpack((uint8_t *) (data+5), "l",&b->ut2); + unpack((uint8_t *) (data+6), "l",&b->dte); + unpack((uint8_t *) (data+7), "l",&b->hmsc); + unpack((uint8_t *) (data+8), "l",&b->gtr1); + unpack((uint8_t *) (data+9), "l",&b->gtr2); + unpack((uint8_t *) (data+10),"l",&b->npm); + unpack((uint8_t *) (data+11),"l",&b->nph); + unpack((uint8_t *) (data+12),"l",&b->sub_run); + unpack((uint8_t *) (data+13),"l",&b->mc_pck); + unpack((uint8_t *) (data+14),"l",&b->rec); + unpack((uint8_t *) (data+15),"l",&b->vpck); + unpack((uint8_t *) (data+16),"l",&b->gtr_id); + unpack((uint8_t *) (data+17),"l",&b->trg_type); + unpack((uint8_t *) (data+18),"l",&b->peak); + unpack((uint8_t *) (data+19),"l",&b->diff); + unpack((uint8_t *) (data+20),"l",&b->integral); + unpack((uint8_t *) (data+21),"l",&b->err); + unpack((uint8_t *) (data+22),"l",&b->data_set); + unpack((uint8_t *) (data+22),"lll",&b->spare1[0], + &b->spare1[1], + &b->spare1[2]); + unpack((uint8_t *) (data+26),"l",&b->ncd_status); + unpack((uint8_t *) (data+27),"l",&b->num_muxg); + unpack((uint8_t *) (data+29),"l",&b->num_mux); + unpack((uint8_t *) (data+29),"l",&b->num_scope); + unpack((uint8_t *) (data+30),"lllll",&b->spare2[0], + &b->spare2[1], + &b->spare2[2], + &b->spare2[3], + &b->spare2[4]); + unpack((uint8_t *) (data+35),"l",&b->ncd_clk_up); + unpack((uint8_t *) (data+36),"l",&b->ncd_clk_lw); + unpack((uint8_t *) (data+37),"l",&b->ncd_reg); + unpack((uint8_t *) (data+38),"l",&b->ncd_gtid); + unpack((uint8_t *) (data+39),"l",&b->ncd_sync); + unpack((uint8_t *) (data+40),"l",&b->spare3[0], + &b->spare3[1], + &b->spare3[2], + &b->spare3[3], + &b->spare3[4], + &b->spare3[5], + &b->spare3[6], + &b->spare3[7], + &b->spare3[8], + &b->spare3[9]); +} + +void unpack_pmt(uint32_t *data, PMTBank *b) +{ + unpack((uint8_t *) data,"l",&b->pn); + unpack((uint8_t *) (data+1),"l",&b->pf); + unpack((uint8_t *) (data+2),"f",&b->pt); + unpack((uint8_t *) (data+3),"f",&b->phl); + unpack((uint8_t *) (data+4),"f",&b->phs); + unpack((uint8_t *) (data+5),"f",&b->plx); + unpack((uint8_t *) (data+6),"f",&b->pt0); + unpack((uint8_t *) (data+7),"l",&b->pif); + unpack((uint8_t *) (data+8),"f",&b->pit); + unpack((uint8_t *) (data+9),"f",&b->pihl); + unpack((uint8_t *) (data+10),"f",&b->pihs); + unpack((uint8_t *) (data+11),"f",&b->pilx); + unpack((uint8_t *) (data+12),"f",&b->pit0); + unpack((uint8_t *) (data+13),"l",&b->cell); + unpack((uint8_t *) (data+14),"l",&b->pin); + unpack((uint8_t *) (data+15),"l",&b->tslh); + unpack((uint8_t *) (data+16),"l",&b->hca); + unpack((uint8_t *) (data+17),"l",&b->eca_val); + unpack((uint8_t *) (data+18),"l",&b->pca_val); + unpack((uint8_t *) (data+19),"l",&b->anxx); + unpack((uint8_t *) (data+20),"l",&b->ept); + unpack((uint8_t *) (data+21),"l",&b->ehl); + unpack((uint8_t *) (data+22),"l",&b->ehs); + unpack((uint8_t *) (data+23),"l",&b->elx); + unpack((uint8_t *) (data+24),"l",&b->pt1); + unpack((uint8_t *) (data+25),"l",&b->ptm); + unpack((uint8_t *) (data+26),"l",&b->ptms); + unpack((uint8_t *) (data+27),"l",&b->qm); + unpack((uint8_t *) (data+28),"l",&b->qms); + unpack((uint8_t *) (data+29),"l",&b->qrc); +} + +int swap_PmtRecord(aPmtEventRecord *aPmtRecord, size_t size) +{ + /* Swap a Pmt Event Record. This function swaps both the Pmt event record + * and the PMT hits and sub fields. Returns -1 if the PMT record has too + * many hits. */ + SWAP_INT32(aPmtRecord, sizeof(aPmtEventRecord)/sizeof(uint32_t)); + + int npmt = aPmtRecord->NPmtHit; + + if (npmt > MAX_NHIT) { + fprintf(stderr, "Read error: Bad ZDAB -- %d pmt hit!", npmt); + return -1; + } else { + if (size < sizeof(aPmtEventRecord) + 3*npmt*4) { + fprintf(stderr, "swap_PmtRecord: size of record is %zu bytes, but there are %i PMT hits", size, npmt); + return -1; + } + // swap the hit data + SWAP_INT32(aPmtRecord + 1, 3*npmt); + // swap the sub-fields + uint32_t *sub_header = &aPmtRecord->CalPckType; + while (*sub_header & SUB_NOT_LAST) { + if (size < (sub_header - (uint32_t *) aPmtRecord)*4 + (*sub_header & SUB_LENGTH_MASK)*4 + 4) { + fprintf(stderr, "swap_PmtRecord: size of record is %zu bytes, " + "but sub-field requires %lu bytes", + size, + (sub_header - (uint32_t *) aPmtRecord)*4 + (*sub_header & SUB_LENGTH_MASK)*4 + 4); + return -1; + } + sub_header += (*sub_header & SUB_LENGTH_MASK); + SWAP_INT32(sub_header, 1); // swap the sub-field header + // get number of data words (-1 because we don't want to include header size) + uint32_t data_words = (*sub_header & SUB_LENGTH_MASK) - 1; + if (size < (sub_header - (uint32_t *) aPmtRecord)*4 + (*sub_header & SUB_LENGTH_MASK)*4) { + fprintf(stderr, "swap_PmtRecord: size of record is %zu bytes, " + "but sub-field requires %lu bytes", + size, + (sub_header - (uint32_t *) aPmtRecord)*4 + (*sub_header & SUB_LENGTH_MASK)*4); + return -1; + } + SWAP_INT32(sub_header+1, data_words); + } + } + + return 0; +} + +void swap_TrigRecord(struct TriggerInfo *aTrigRecord) +{ + /* Byte swap a Trigger Record. */ + SWAP_INT32(aTrigRecord, sizeof(struct TriggerInfo)/sizeof(uint32_t)); +} + +void swap_RunRecord(struct RunRecord *aRunRecord) +{ + /* Byte swap a Run Record. */ + SWAP_INT32(aRunRecord, sizeof(struct RunRecord)/sizeof(uint32_t)); +} + + |