X-Git-Url: http://sraa.de/git/?a=blobdiff_plain;f=aesa%2Fsrc%2FCorner_Turn.c;fp=aesa%2Fsrc%2FCorner_Turn.c;h=3994cafce51e8ef6babe9169958a7409ab7f9464;hb=3e585a14456b930a77ea0ac81bed4c69a4a032ac;hp=0000000000000000000000000000000000000000;hpb=2bc58585fc542a6e5819eeecaee1f4820185149f;p=jump.git diff --git a/aesa/src/Corner_Turn.c b/aesa/src/Corner_Turn.c new file mode 100644 index 0000000..3994caf --- /dev/null +++ b/aesa/src/Corner_Turn.c @@ -0,0 +1,213 @@ +#include "Corner_Turn.h" + +/************************************************************************************/ + +void Corner_Turn_init(DOLProcess * p) +{ + int i,j; + + for (i=0; ilocal->Channels_A[i][j].real = 0.0; + p->local->Channels_A[i][j].imag = 0.0; + p->local->Channels_B[i][j].real = 0.0; + p->local->Channels_B[i][j].imag = 0.0; + } + } + + p->local->buffer_mode = 0; + // p->local->pulse_counter_in = 0; + p->local->pulse_counter_out = 0; + p->local->bin_counter_in = 0; + // p->local->bin_counter_out = 0; + p->local->n_batches = 0; + p->local->n_iterations = 0; + + p->local->hold_input = 0; + p->local->hold_output = 0; + + p->local->excount = 0; + +} + +/************************************************************************************/ + +int Corner_Turn_fire(DOLProcess * p) +{ + // ComplexNumber next_sample; + ComplexNumber samples_in[NFFT]; + ComplexNumber samples_out[NUMBER_OF_RANGE_BINS]; + p->local->excount++; + + if(!p->local->hold_input){ + DOL_read((void*)PORT_DATA_IN, &samples_in, NFFT*sizeof(ComplexNumber), p); + } + + if (p->local->buffer_mode == 0) // if buffer_mode = 0: input buffer is A, output buffer is B + { + + // !!!!!!!!!!!!!!!!!! Not sure about syntax. check the dest adrs and & + // p->local->Channels_A[p->local->bin_counter_in][p->local->pulse_counter_in] = next_sample; + if(!p->local->hold_input){ + memcpy(&(p->local->Channels_A[p->local->bin_counter_in][0]) , &samples_in, NFFT*sizeof(int)); + } + + // next_sample = p->local->Channels_B[p->local->bin_counter_out][p->local->pulse_counter_out]; + if(!p->local->hold_output){ + int i; + for (i=0; ilocal->Channels_B[i][p->local->pulse_counter_out]; + } + // DOL_write((void*)PORT_DATA_OUT, &(next_sample), sizeof(ComplexNumber), p); + + DOL_write((void*)PORT_DATA_OUT, &(samples_out[0]), NUMBER_OF_RANGE_BINS*sizeof(ComplexNumber), p); + } + } + + else // if buffer_mode = 1: input buffer is B, output buffer is A + { + // p->local->Channels_B[p->local->bin_counter_in][p->local->pulse_counter_in] = next_sample; + if(!p->local->hold_input){ + memcpy(&(p->local->Channels_B[p->local->bin_counter_in][0]) , &samples_in, NFFT*sizeof(int)); + } + // next_sample = p->local->Channels_A[p->local->bin_counter_out][p->local->pulse_counter_out]; + if(!p->local->hold_output){ + int i; + for (i=0; ilocal->Channels_A[i][p->local->pulse_counter_out]; + } + + // DOL_write((void*)PORT_DATA_OUT, &(next_sample), sizeof(ComplexNumber), p); + DOL_write((void*)PORT_DATA_OUT, &(samples_out[0]), NUMBER_OF_RANGE_BINS*sizeof(ComplexNumber), p); + } + } + + // // p->local->pulse_counter_in = p->local->pulse_counter_in + 1; + + // // if (p->local->pulse_counter_in == NFFT) + // // { + // // p->local->pulse_counter_in = 0; + + // p->local->bin_counter_in = p->local->bin_counter_in + 1; + // if (p->local->bin_counter_in == NUMBER_OF_RANGE_BINS) + // { + // p->local->bin_counter_in = 0; + // } + // // } + + // // p->local->bin_counter_out = p->local->bin_counter_out + 1; + // // if (p->local->bin_counter_out == NUMBER_OF_RANGE_BINS) + // // { + // // p->local->bin_counter_out = 0; + + // p->local->pulse_counter_out = p->local->pulse_counter_out + 1; + // if (p->local->pulse_counter_out == NFFT) + // { + // p->local->pulse_counter_out = 0; + // p->local->buffer_mode = p->local->buffer_mode ^ 0x01; // Switch buffer mode + + // p->local->n_batches = p->local->n_batches + 1; + + // //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + // // Probably this shouldn't be changed, but not sure. check it late! + // if (p->local->n_batches == (NUMBER_OF_PULSES/NFFT)) + // { + // p->local->n_batches = 0; + // p->local->n_iterations = p->local->n_iterations + 1; + // } + // } + // // } + + #if NUMBER_OF_RANGE_BINS > NFFT // this is the case that we have to hold the output + + + if(!p->local->hold_output) + { + p->local->pulse_counter_out = p->local->pulse_counter_out + 1; + } + + p->local->bin_counter_in = p->local->bin_counter_in + 1; + + + if (p->local->pulse_counter_out >= NFFT) + { + if (p->local->bin_counter_in < NUMBER_OF_RANGE_BINS ) // -1 + { + p->local->hold_output = 1 ; + } + else + { + p->local->bin_counter_in = 0; + p->local->pulse_counter_out = 0; + p->local->hold_output = 0; + p->local->n_batches = p->local->n_batches + 1; + + + p->local->buffer_mode = p->local->buffer_mode ^ 0x01; + + } + } + + + #elif NUMBER_OF_RANGE_BINS < NFFT // this is the case that we have to hold the input + + if (!p->local->hold_input) + { + p->local->bin_counter_in = p->local->bin_counter_in + 1; + } + + p->local->pulse_counter_out = p->local->pulse_counter_out + 1; + + if (p->local->bin_counter_in == NUMBER_OF_RANGE_BINS) + { + if(p->local->pulse_counter_out < NFFT) + { + p->local->hold_input = 1; + } + else // pulse_counter_out == NUMBER OF RANGE BINS + { + p->local->bin_counter_in = 0; + p->local->pulse_counter_out = 0; + p->local->hold_input = 0; + p->local->n_batches = p->local->n_batches + 1; + + p->local->buffer_mode = p->local->buffer_mode ^ 0x01; + + } + } + + + #else // in this case we have equal number of iterations over input and output + p->local->bin_counter_in = p->local->bin_counter_in + 1; + p->local->pulse_counter_out = p->local->pulse_counter_out + 1; + + if (p->local->bin_counter_in == NFFT - 1) // not sure about the -1!! do test + { + p->local->bin_counter_in = 0; + p->local->pulse_counter_out = 0; + p->local->n_batches = p->local->n_batches + 1; + + p->local->buffer_mode = p->local->buffer_mode ^ 0x01; + } + + #endif + + if (p->local->n_batches == (NUMBER_OF_PULSES/NFFT)) + { + p->local->n_batches = 0; + p->local->n_iterations = p->local->n_iterations + 1; + } + if (p->local->n_iterations == NUMBER_OF_ITERATIONS) + { + printf("\n\n:: Corner Turn process finished ::\n\n"); + // printf("\ttotal number of executions: %d",p->local->excount); + + DOL_detach(p); + } + + return 0; +}