Commit 9aebee07 authored by Joanne Hugé's avatar Joanne Hugé

iq_file_trx

parent ae8dae1e
......@@ -176,6 +176,7 @@ typedef struct {
int sample_rate;
int rx_drop_pcm;
int align_rx;
int iq_file_trx;
int disable_rx;
uint8_t * rx_buf;
ring_buffer_t * trxr_rbuf[MAX_CHANNELS];
......@@ -266,6 +267,11 @@ static struct sockaddr_ll connect_sk_addr;
static struct sockaddr_ll recv_connect_sk_addr;
static ecpri_iq_packet standard_iq_packet;
#define MAX_IQ_FILE_SIZE 1228800
static int iq_file_size;
static uint8_t iq_file_bytes[MAX_IQ_FILE_SIZE];
static int iq_file_index = 0;
static void print_debug(FILE * f, int print_header) {
char buffer[200];
if(print_header) {
......@@ -1103,6 +1109,7 @@ int start(TRXEcpriState * s) {
uint8_t dst_mac[6];
uint8_t src_mac[6];
int if_index;
FILE *read_ptr;
log_info("TRX_ECPRI", "raw socket setup");
......@@ -1253,6 +1260,22 @@ int start(TRXEcpriState * s) {
standard_iq_packet.oran_header[5] = 0x00;
standard_iq_packet.oran_header[6] = 0x00;
if(s->iq_file_trx) {
read_ptr = fopen("/root/ecpri-iq-file.bin","rb");
fseek(read_ptr, 0L, SEEK_END);
iq_file_size = ftell(read_ptr);
rewind(read_ptr);
if(iq_file_size % (32 * sizeof(float))) {
log_info("INIT_WRITE_DATA", "IQ file size not a multiple of 32 (%d)", iq_file_size);
exit(EXIT_FAILURE);
}
log_info("INIT_WRITE_DATA", "IQ file size: %d", iq_file_size);
fread(iq_file_bytes, iq_file_size, 1, read_ptr);
}
start_threads(s);
return 0;
}
......@@ -1280,6 +1303,7 @@ static void trx_ecpri_write(TRXState *s1, trx_timestamp_t timestamp, const void
int64_t count_left, nc, offset;
float ** _samples = (float **) __samples;
int64_t a;
int nc_sample, nc1, nc2;
TRXEcpriState *s = s1->opaque;
#ifdef DISABLE_WRITE
......@@ -1328,50 +1352,30 @@ static void trx_ecpri_write(TRXState *s1, trx_timestamp_t timestamp, const void
count_left = count;
while((nc = rbuf_contiguous_copy(NULL, &trxw_rbuf[i], count_left * 2))) {
if(__samples) {
memcpy((uint8_t *) trx_write_float_tab, ((uint8_t *) _samples[i]) + offset, nc * 2);
if(s->iq_file_trx &&
(write_counter.counter + (count - count_left) - nc / 2) >= (1104 * 7 * 2 * 10 * 256 * 2)) {
nc_sample = ((1104 * 7 * 2 * 10 * 256) - (write_counter.counter + (count - count_left))) * 2;
nc1 = nc - nc_sample;
nc2 = 0;
memcpy((uint8_t *) trx_write_float_tab, ((uint8_t *) _samples[i]) + offset, nc_sample * 2);
if((iq_file_size - iq_file_index) < (nc1 * 2)) {
nc2 = nc1 - (iq_file_size - iq_file_index);
nc1 = iq_file_size - iq_file_index;
}
memcpy((uint8_t *) trx_write_float_tab, iq_file_bytes + iq_file_index, nc1 * 2);
iq_file_index = (iq_file_index + nc1 * 2) % iq_file_size;
memcpy((uint8_t *) trx_write_float_tab, iq_file_bytes + iq_file_index, nc2 * 2);
iq_file_index = (iq_file_index + nc2 * 2) % iq_file_size;
} else {
memcpy((uint8_t *) trx_write_float_tab, ((uint8_t *) _samples[i]) + offset, nc * 2);
}
float_to_int16(trx_write_int_tab, trx_write_float_tab, nc / 2, 32767);
for(int k = 0; k < nc / 2; k++)
trx_write_int_tab[k] = htons(trx_write_int_tab[k]);
memcpy(rbuf_write(&trxw_rbuf[i]), (uint8_t *) trx_write_int_tab, nc);
//int mismatch = 0;
//for(int k = 0; k < nc / 4; k++) {
// if(trx_write_int_tab[k] != 0xffff8f62) {
// printf("k = %d (%d)\n", k, nc / 2);
// printf("%x \n", trx_write_int_tab[k]);
// printf("%f \n", trx_write_float_tab[k]);
// printf("%f , offset = %d, k = %d, count = %d, nc = %d\n", ((float*)(((uint8_t *) _samples[i]) + offset))[k], offset, k, count, nc);
// mismatch++;
// break;
// }
//}
//if(mismatch) {
// //printf("\n%d/%d mismatch\n", mismatch, payload_size/2);
// //for(int k = 0; k < nc / 2; k++) {
// // printf("%x%x ", trx_write_int_tab[2 * k], trx_write_int_tab[2 * k+1]);
// //}
// //printf("\n");
//}
}
else
log_exit("TRX_ECPRI_WRITE", "samples empty during FDD mode");
//int mismatch = 0;
//for(int k = 0; k < nc / 2; k++) {
// if(trx_write_int_tab[k] != 0xffff8f62) {
// printf("k = %d (%d)\n", k, nc / 2);
// printf("%x \n", trx_write_int_tab[k]);
// printf("%f \n", trx_write_float_tab[k]);
// printf("%f , offset = %d, k = %d, count = %d, nc = %d\n", ((float*)(((uint8_t *) _samples[i]) + offset))[k], offset, k, count, nc);
// mismatch++;
// break;
// }
//}
//if(mismatch) {
// //printf("\n%d/%d mismatch\n", mismatch, payload_size/2);
// //for(int k = 0; k < nc / 2; k++) {
// // printf("%x%x ", trx_write_int_tab[2 * k], trx_write_int_tab[2 * k+1]);
// //}
// //printf("\n");
//}
rbuf_increment_write(&trxw_rbuf[i], nc);
count_left -= nc / 2;
offset += nc * 2;
......@@ -1740,6 +1744,8 @@ int trx_driver_init(TRXState *s1)
s->rx_drop_pcm = (int) val;
trx_get_param_double(s1, &val, "align_rx");
s->align_rx = (int) val;
trx_get_param_double(s1, &val, "iq_file_trx");
s->iq_file_trx = (int) val;
trx_get_param_double(s1, &val, "disable_rx");
s->disable_rx = (int) val;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment