/*  anr.h

This file is part of a program that implements a Software-Defined Radio.

Copyright (C) 2012, 2013 Warren Pratt, NR0V

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.

The author can be reached by email at

warren@wpratt.com

*/

#ifndef _anr_h
#define _anr_h

#define ANR_DLINE_SIZE 2048

typedef struct _anr
{
    int run;
    int position;
    int buff_size;
    double *in_buff;
    double *out_buff;
    int dline_size;
    int mask;
    int n_taps;
    int delay;
    double two_mu;
    double gamma;
    double d [ANR_DLINE_SIZE];
    double w [ANR_DLINE_SIZE];
    int in_idx;

    double lidx;
    double lidx_min;
    double lidx_max;
    double ngamma;
    double den_mult;
    double lincr;
    double ldecr;
} anr, *ANR;

extern ANR create_anr   (
                int run,
                int position,
                int buff_size,
                double *in_buff,
                double *out_buff,
                int dline_size,
                int n_taps,
                int delay,
                double two_mu,
                double gamma,

                double lidx,
                double lidx_min,
                double lidx_max,
                double ngamma,
                double den_mult,
                double lincr,
                double ldecr
            );

extern void destroy_anr (ANR a);

extern void flush_anr (ANR a);

extern void xanr (ANR a, int position);

extern void setBuffers_anr (ANR a, double* in, double* out);

extern void setSamplerate_anr (ANR a, int rate);

extern void setSize_anr (ANR a, int size);

// RXA Properties

extern __declspec (dllexport) void SetRXAANRRun (int channel, int setit);

extern __declspec (dllexport) void SetRXAANRVals (int channel, int taps, int delay, double gain, double leakage);

extern __declspec (dllexport) void SetRXAANRTaps (int channel, int taps);

extern __declspec (dllexport) void SetRXAANRDelay (int channel, int delay);

extern __declspec (dllexport) void SetRXAANRGain (int channel, double gain);

extern __declspec (dllexport) void SetRXAANRLeakage (int channel, double leakage);

extern __declspec (dllexport) void SetRXAANRPosition (int channel, int position);

#endif
