/***************************************************************************
 *
 * Copyright 2015-2019 BES.
 * All rights reserved. All unpublished rights reserved.
 *
 * No part of this work may be used or reproduced in any form or by any
 * means, or stored in a database or retrieval system, without prior written
 * permission of BES.
 *
 * Use of this work is governed by a license granted by BES.
 * This work contains confidential and proprietary information of
 * BES. which is protected by copyright, trade secret,
 * trademark and other intellectual property rights.
 *
 ****************************************************************************/
#ifndef __HAL_HWFFT__
#define __HAL_HWFFT__

#ifdef __cplusplus
extern "C" {
#endif

//#include "cmsis_os.h"

#define HWFFT_USE_BUSY_WAIT 1
#define HAVE_EQUIVALENT_MODE 1 /* 128in 128out not 128in 130out mode  */

struct hwfft_t {
    int mode;
    int order;
    int sym_fft;
    //osSemaphoreId _osSemaphoreId;
   // osSemaphoreDef_t _osSemaphoreDef;
//#ifdef CMSIS_OS_RTX
//    uint32_t _semaphore_data[2];
//#endif
};

enum hwfft_mode_t {
    HWFFT_MODE_FFT = 0x1,
    HWFFT_MODE_IFFT = 0x2,
    HWFFT_MODE_EQVL_FFT = 0x4,
    HWFFT_MODE_EQVL_IFFT = 0x8,
};

enum hwfft_order_t {
    HWFFT_ORDER_64SAMP  = 64,
    HWFFT_ORDER_128SAMP = 128,
    HWFFT_ORDER_256SAMP = 256,
    HWFFT_ORDER_512SAMP = 512,
};

bool hwfft_is_enable(void);
int hwfft_destroy(struct hwfft_t *fft_inst);
/*
生成hwfft_t 结构体
mode: hwfft_mode_t类型HWFFT_MODE_FFT:  复数， 输入n个复数，输出n个复数，此时sym_fft必须为0；
                                                                  实数，输入n个实数，输出是n/2+1 个复数，此时sym_fft必须为1；
                                      HWFFT_MODE_IFFT:  复数， 输入n个复数，输出n个复数，此时sym_fft必须为0；
                                                                   实数，输入 n/2+1个复数，输出n个实数；此时sym_fft必须为1；
                                      HWFFT_MODE_EQVL_FFT: 兼容软件spx_fft计算fft模式
                                      HWFFT_MODE_EQVL_IFFT: 兼容软件spx_ifft计算ifft模式
                                                                 
order: hwfft_order_t类型，支持 512/256/128/64 点的 fft/ifft

sym_fft:  1: 将利用fft的对称性;对fft，输入n个实数，输出是n/2+1 个复数；
                对ifft， 输入 n/2+1个复数，输出n个实数；n 为fft/ifft点数
              0: 输入n个复数，输出n个复数
*/
int hwfft_create(struct hwfft_t *fft_inst, int mode, int order, int sym_fft);
/*
计算fft/ifft
fft_inst: hwfft_create生成的对应结构体
in: 输入buf
out: 输出buf
*/
int hwfft_fft_process(struct hwfft_t *fft_inst, short *in, short *out);
/*
连续计算多次 fft/ifft
fft_inst: hwfft_create生成的对应结构体
in: 输入buf，多次fft的输入buf必须是连续的
out: 输出buf
num: 计算次数
mode: 0 一直等到fft完成函数才返回
         1 dma配置完成，fft开始函数即可返回，cpu可以在硬件fft 时运行其他程序
*/
int hwfft_multifft_process(struct hwfft_t *fft_inst, short *in, short *out, unsigned short num,unsigned char mode);

#ifdef __cplusplus
}
#endif

#endif
