#ifndef _CMPA_H
#define _CMPA_H
#include "filters.h"
#include "hc.h"
#include "synapse.h"
#include "complex.h"

#ifndef TWOPI
#define TWOPI 6.2831853
#endif
#define Broad_ALL		0x80
#define Linear_ALL		0x40
#define NonLinear_ALL		0x20

#define FeedBack_NL		(NonLinear_ALL|0x01)
#define FeedForward_NL		(NonLinear_ALL|0x02)
#define Broad_Linear		(Broad_ALL|Linear_ALL|0x01)
#define Sharp_Linear		(Linear_ALL|0x02)
#define Broad_Linear_High	(Broad_ALL|Linear_ALL|0x03)

/*/############################################################################## */
typedef struct __AuditoryNerve TAuditoryNerve;
typedef struct __BasilarMembrane TBasilarMembrane;
double cochlea_f2x(int species,double f);
double cochlea_x2f(int species,double x);

double runAN(TAuditoryNerve* p,double x);
void runAN2(TAuditoryNerve *p, const double *in, double *out, const int length);

void initAuditoryNerve(TAuditoryNerve *p,int model, int species, double tdres, double cf, double spont);
void initBasilarMembrane(TBasilarMembrane* bm,int model, int species, double tdres, double cf);

/*/############################################################################## */

/** The class the define the basic structure of the time-varing filter
    
    the class consists of following components: \n
    1. tuning filter(bmfilter), the tau is controlled by the control path\n
    2. wideband pass filter(wbfilter)\n
    3. outer hair cell model(ohc)\n
    4. nonlinear function after the outer haircell(afterohc)
 */
struct __BasilarMembrane{ /* class of basilar membrane */

  double (*run)(TBasilarMembrane *p, double x);
  void (*run2)(TBasilarMembrane *p, const double *in, double *out, const int length);

  int bmmodel; /* determine if the bm is broad_linear, sharp_linear or other */
  double tdres;
  int bmorder,wborder;

  double tau,TauMax,TauMin;
  double TauWB,TauWBMin;
  double A,B; 
  /* --------Model -------------- */
  TGammaTone bmfilter; /*/NonLinear Filter */
  TGammaTone gfagain; /*/Linear Filter */
  TGammaTone wbfilter; /*/Control Path filter */
  THairCell ohc;
  TNonLinear afterohc;
};

/** Class of the auditory nerve fiber, this is a complete model of the fiber

    The class consists of all the parts of the auditory nerve fiber\n
    1. time-varying tuning filter with control path: TBasilarMembrane(bm, 3rd order)\n
    2. the gammatone filter after the 3rd-order nonlinear filter(gffilter)\n
    3. inner hair cell model(ihc)\n
    4. synapse model, from Westman,1986(syn)\n
    5. spike generator, from Carney,1993(sg)
 */
struct __AuditoryNerve{
/*/ Run Function */
  double (*run)(TAuditoryNerve *p, double x);
  void  (*run2)(TAuditoryNerve *p, const double *in,  double *out,  const int length);
/*/ Model Structor */
  TBasilarMembrane bm;
  THairCell ihc;
  TNonLinear ihcppi; /*/From ihc->ppi */
  Tsynapse syn;
/*/  TSpikeGenerator sg; */
/*/ Model Parameters */
  double tdres,cf,spont;
  int species,model;
  /* This parameter indicates if we are using sout only or spikes */
  int ifspike;
};

#endif