Initial commit of AESA implementation.
[jump.git] / aesa / src / Corner_Turn.c
diff --git a/aesa/src/Corner_Turn.c b/aesa/src/Corner_Turn.c
new file mode 100644 (file)
index 0000000..3994caf
--- /dev/null
@@ -0,0 +1,213 @@
+#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;
+}