#ifndef _GPURFPC_H_
#define _GPURFPC_H_

#include "BaseConstVariable.h"
#include "GPUTool.cuh"
#include <cuda_runtime.h>
#include <device_launch_parameters.h>
#include <cublas_v2.h>
#include <cuComplex.h>

/**  CUDA 调用参数 ************************************************************************************/
 


#define RFPCPIDIVLIGHT -4*PI/(LIGHTSPEED/1e9)


extern "C" struct SateState {
	double Px, Py, Pz, Vx, Vy, Vz,antDirectX, antDirectY, antDirectZ;
};


extern "C" struct  GoalState {
	double Tx, Ty, Tz, TsX, TsY, TsZ;
	size_t cls;
};



 
extern "C" struct  CUDASigmaParam {
	float p1;
	float p2;
	float p3;
	float p4;
	float p5;
	float p6;
};

extern "C" struct SloperDs
{
	double* SloperX;
	double* SloperY;
	double* SloperZ;
	double* SloperAngle;

};

extern "C" struct DEMDs
{
	double* demX;
	double* demY;
	double* demZ;
};

extern "C" struct LandDataDs
{
	unsigned char* landData;
};

extern "C" struct GPSPointsDs
{
	double* Pxs;
	double* Pys;
	double* Pzs;
	double* Vxs;
	double* Vys;
	double* Vzs;
};


extern "C" struct RFPCTask
{
	double startFreq;
	double stepFreq;
	long freqNum;
	long prfNum;

	double Rnear;
	double Rfar;
	double Rref;

	double Pt = 1;

	SateState* antlist = nullptr;
	GoalState* goallist = nullptr;
	cuComplex* d_echoData = nullptr; // 回波
	CUDASigmaParam sigma0_cls;
	double maxGain=48;
	double GainWeight=10; // 2度范围

	size_t targetnum;

};


extern  __device__ double GPU_getSigma0dB_params(
	const double p1, const double p2, const  double p3, const  double p4, const  double p5, const  double p6,
	double theta);

extern  __device__ double GPU_getSigma0dB(CUDASigmaParam param, double theta);
extern  __device__ float GPU_getSigma0dB(CUDASigmaParam param, float theta);


extern  __device__ CUDAVectorEllipsoidal GPU_SatelliteAntDirectNormal(
	double RstX, double RstY, double RstZ,
	double  AntXaxisX, double  AntXaxisY, double  AntXaxisZ,
	double  AntYaxisX, double  AntYaxisY, double  AntYaxisZ,
	double  AntZaxisX, double  AntZaxisY, double  AntZaxisZ,
	double  AntDirectX, double  AntDirectY, double  AntDirectZ
);

extern  __device__ double GPU_BillerInterpAntPattern(double* antpattern,
	double starttheta, double startphi, double dtheta, double dphi,
	long thetapoints, long phipoints,
	double searththeta, double searchphi);



extern "C" void CUDA_RFPC_MainProcess(
	// 天线
	double* antX, double* antY, double* antZ, // 天线坐标
	double* antXaxisX, double* antXaxisY, double* antXaxisZ, // 天线坐标系的X轴
	double* antYaxisX, double* antYaxisY, double* antYaxisZ,// 天线坐标系的Y轴
	double* antZaxisX, double* antZaxisY, double* antZaxisZ,// 天线坐标系的Z轴
	double* antDirectX, double* antDirectY, double* antDirectZ,// 天线的指向
	long PRFCount, long FreqNum,   // 脉冲数量，频率数量
	float f0, float dfreq,// 起始频率，终止频率
	double Pt,// 发射能量
	double refPhaseRange,
	// 天线方向图
	double* TransAntpattern, double Transtarttheta, double Transstartphi, double Transdtheta, double Transdphi, int Transthetapoints, int Transphipoints, // 发射天线方向图
	double* ReceiveAntpattern, double Receivestarttheta, double Receivestartphi, double Receivedtheta, double Receivedphi, int Receivethetapoints, int Receivephipoints,//接收天线方向图
	double maxTransAntPatternValue,double maxReceiveAntPatternValue,
	double NearR, double FarR, // 距离范围


	// 地面
	double* targetX, double* targetY, double* targetZ, long* demCls, long TargetPixelNumber, // 地面坐标、地表覆盖类型，像素数
	double* demSlopeX, double* demSlopeY, double* demSlopeZ, // 地表坡度矢量
	CUDASigmaParam* sigma0Paramslist, long sigmaparamslistlen,// 插值图像
 
	float* out_echoReal, float* out_echoImag,// 输出回波

	float* d_temp_R, float* d_temp_amp
);



extern "C" double* hostSigmaData_toDevice(int devid);
extern "C" void ProcessRFPCTask(RFPCTask& task,long devid,float* h_R,float* h_amp);






#endif



 