#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include </usr/local/include/fftw3.h>

#include <dbDefs.h>
#include <registryFunction.h>
#include <subRecord.h>
#include <aSubRecord.h>
#include <epicsExport.h>

int aFTsubDebug;

static long aFTsubInit(aSubRecord *precord)
{
 if (aFTsubDebug)
    printf("Record %s called aFTsub(%p)\n",
           precord->name, (void*) precord);
  return 0;
}

static long aFTsubProcess(aSubRecord *precord)
{
  int i;
  long nord;
  fftw_complex *in, *out;
  fftw_plan p;

  double *ain;
  int *bin;
  double *pout;
  double re,im,mag;

  ain = (double *)precord->a;
  bin = (int *)precord->b;
  nord = precord->nea;

  pout = (double *)precord->vala;

  in =(fftw_complex*)fftw_malloc(sizeof(fftw_complex)*bin[0]);
  out=(fftw_complex*)fftw_malloc(sizeof(fftw_complex)*bin[0]);

  for (i=0;i<bin[0]; i++) {
    in[i][0]=ain[i];
    in[i][1]=0.0;
  }

  p = fftw_plan_dft_1d(bin[0],in,out,FFTW_FORWARD,FFTW_ESTIMATE);
  fftw_execute(p);

  for (i=0; i<bin[0]; i++) {
    re = out[i][0];
    im = out[i][1];
    mag = sqrt(re*re + im*im);
    pout[i]=mag;
  }

  fftw_destroy_plan(p);
  fftw_free(in);
  fftw_free(out);
  
  return 0;
}
epicsExportAddress(int, aFTsubDebug);
epicsRegisterFunction(aFTsubInit);
epicsRegisterFunction(aFTsubProcess);