
#ifndef _BPBASIC0_CUDA_H_
#define _BPBASIC0_CUDA_H_
#include <cstdio>
#include <cufft.h>
#include <cmath>
#include <cuda_runtime.h>
#include "BaseConstVariable.h"

//#define cudaCheckError(ans) { gpuAssert((ans), __FILE__, __LINE__); }
//inline void gpuAssert(cudaError_t code, const char* file, int line) {
//    if (code != cudaSuccess) {
//        fprintf(stderr, "CUDA Error: %s %s %d\n", cudaGetErrorString(code), file, line);
//        exit(code);
//    }
//}
//
//#define c LIGHTSPEED
 

struct GPUDATA {
    long Nfft, K, Np, nx, ny; // 傅里叶点数、频点数、脉冲数、图像列、图像行
    double* AntX, * AntY, * AntZ, * minF; // 天线坐标、起始频率
    double* x_mat, * y_mat, * z_mat,*R_mat;// 地面坐标
    double* r_vec; // 坐标范围
    double* Freq;// 频率
    cuComplex* phdata;// 回波
    cuComplex* im_final;// 图像
    double R0; // 参考斜距
    double deltaF; // 频点范围
};


struct GPUDATA_single {
    long Nfft, K, Np, nx, ny; // 傅里叶点数、频点数、脉冲数、图像列、图像行
    float* AntX, * AntY, * AntZ, * minF; // 天线坐标、起始频率
    float* x_mat, * y_mat, * z_mat;// 地面坐标
    float* r_vec; // 坐标范围
    float* Freq;// 频率
    cuComplex* phdata;// 回波
    cuComplex* im_final;// 图像
    float R0; // 参考斜距
    float deltaF; // 频点范围
};



extern "C" {
    void bpBasic0CUDA(GPUDATA& data, int flag,double* h_R=nullptr);
    void initGPUData(GPUDATA& h_data, GPUDATA& d_data);
    void freeGPUData(GPUDATA& d_data);
    void freeHostData(GPUDATA& d_data);
    void BPBasic0(GPUDATA& h_data);
};


extern "C" {
    // 函数废弃，因为这个成像精度不够
    void bpBasic0CUDA_single(GPUDATA_single& data, int flag, float* h_R = nullptr);
    void initGPUData_single(GPUDATA_single& h_data, GPUDATA_single& d_data);
    void freeGPUData_single(GPUDATA_single& d_data);
    void freeHostData_single(GPUDATA_single& d_data);
    void BPBasic0_single(GPUDATA_single& h_data);

    void copy_Host_Single_GPUData(GPUDATA_single& h_data, GPUDATA& d_data);


};


#endif