module: delay_double
description: delay for "double" signal. Coded by Min Park 11/19/08
             (converted 08/02/09)
parameters:  double nom_delay, double control_gain
inputs:  double in, double control
outputs:  double out
classes:  
static_variables: double buf[1000] double before double delay_time
                  int nn int index double residue int max_index  
init:  
   before = 0.0;
   max_index = 1000;
   for( nn=0 ; nn<max_index ; nn++){
      buf[nn]=0.0;
   }
   delay_time = 0.0;
   printf("Initialization for delay_double is done.\n");
end:  
code:  

   // Detects the rising edge of the input.
   if( before == 0.0 and in != 0.0){
      delay_time = nom_delay + control_gain*control;
      if( delay_time < 0.0 ){
         printf("Error! delay can't be smaller than 0.\n");
         delay_time = 0.0;
      }
      if( delay_time >= 1000*Ts ){
         printf("Error! delay can't be larger than %e sec.\n",1000*Ts);
         delay_time = 999*Ts;
      }
   }

   index = (int)(delay_time/Ts);
   if( delay_time/Ts == floor(delay_time/Ts) ){
      buf[index] = in;
   }
   else{
      residue = delay_time/Ts-floor(delay_time/Ts);
      buf[index] = (in-before)*(1-residue)+before;
   }

   out = buf[0];

   for( nn=0 ; nn<(max_index-1) ; nn++){
      buf[nn] = buf[nn+1];
   }
   buf[max_index-1] = 0.0;

   before = in;


functions:  
custom_classes_definition:  
custom_classes_code:  
