--- /dev/null
+#include "Corner_Turn.h"
+
+/************************************************************************************/
+
+void Corner_Turn_init(DOLProcess * p)
+{
+ int i,j;
+
+ for (i=0; i<NUMBER_OF_RANGE_BINS; i=i+1)
+ {
+ for (j=0; j<NFFT; j=j+1)
+ {
+ p->local->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; i<NUMBER_OF_RANGE_BINS; i++)
+ {
+ samples_out[i]=p->local->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; i<NUMBER_OF_RANGE_BINS; i++)
+ {
+ samples_out[i]=p->local->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;
+}