#include "raw_reader.h" #include "data_types.h" #include #include int64_t read_raw(FILE *fp, int64_t n_frames, size_t frame_size, char* out_buf, Header* header_out) { char *tmp = malloc(frame_size); Header h; int64_t frames_read = 0; while (frames_read < n_frames) { // Read header to temp buffer, return on fail if (fread(&h, sizeof(Header), 1, fp) != 1) { break; } if(header_out){ memcpy(header_out, &h, sizeof(Header)); header_out++; } // Read frame to temporary buffer if (fread(tmp, frame_size, 1, fp) != 1) { break; } // Decode frame and write to numpy output array decode_moench03((uint16_t *)tmp, (uint16_t *)out_buf); out_buf += frame_size; frames_read++; } free(tmp); return frames_read; } void decode_moench03(const uint16_t *buf, uint16_t *out_buf) { int adc_numbers[32] = {12, 13, 14, 15, 12, 13, 14, 15, 8, 9, 10, 11, 8, 9, 10, 11, 4, 5, 6, 7, 4, 5, 6, 7, 0, 1, 2, 3, 0, 1, 2, 3}; for (int n_pixel = 0; n_pixel < 5000; n_pixel++) { for (int i_sc = 0; i_sc < 32; i_sc++) { // analog part int adc_nr = adc_numbers[i_sc]; int col = ((adc_nr * 25) + (n_pixel % 25)); int row = 0; if (i_sc / 4 % 2 == 0) { row = 199 - (n_pixel / 25); } else { row = 200 + (n_pixel / 25); } int i_analog = n_pixel * 32 + i_sc; out_buf[row * 400 + col] = buf[i_analog] & 0x3FFF; } } }