#pragma once
/*****************************************************************//**
 * \file   TBPImageAlgCls.h
 * \brief  BP成像算法
 *
 * 参考资料
 * 雷达成像技术， 邢孟道
 * 
 * 成像平面定义为 数据录取平面（P94, 雷达成像技术）
 * 数据录取平面定义为视线方向。
 * 
 *
 * \author 陈增辉
 * \date   October 2024
 *********************************************************************/
#define EIGEN_USE_BLAS
#define EIGEN_USE_LAPACK
#define EIGEN_ENABLE_AVX512
#define EIGEN_VECTORIZE_SSE
#define EIGEN_VECTORIZE_SSE2
#define EIGEN_VECTORIZE_SSSE3
#define EIGEN_VECTORIZE_SSE4_1
#define EIGEN_VECTORIZE_SSE4_2
#include "BaseConstVariable.h"

#include "SARSatelliteSimulationAbstractCls.h"
#include "SARSimulationTaskSetting.h"
#include "SatelliteOribtModel.h"
#include "EchoDataFormat.h"
#include "SARSimulationImageL1.h"
#include "LogInfoCls.h"

class TBPImageAlgCls
{
private:
	std::shared_ptr<SARSimulationImageL1Dataset> L1ds;
	std::shared_ptr < EchoL0Dataset> L0ds;
	QString imagePlanePath;
	bool GPURUN;
	QString outRasterXYZPath;
public:

	void setImagePlanePath(QString imagePlanePath);
	QString getImagePlanePath();

	void setEchoL0(std::shared_ptr < EchoL0Dataset> L0ds);
	void setImageL1(std::shared_ptr<SARSimulationImageL1Dataset> L1ds);

	std::shared_ptr < EchoL0Dataset> getEchoL1();
	std::shared_ptr<SARSimulationImageL1Dataset> getImageL0();

public:
	ErrorCode Process(long num_thread);
	void setGPU(bool flag);
	bool getGPU( );
private:
	//ErrorCode ProcessCPU(long num_thread);
	ErrorCode ProcessGPU();

private://临时成员变量
	QString TimeEchoDataPath;
	long TimeEchoRowCount;
	long TimeEchoColCount;

	void EchoFreqToTime( );


};


void CreatePixelXYZ(std::shared_ptr<EchoL0Dataset> echoL0ds,QString outPixelXYZPath);


void TBPImageProcess(QString echofile,QString outImageFolder,QString imagePlanePath,long num_thread);
 
void TBPImageGPUAlg2(std::shared_ptr<double> antPx, std::shared_ptr<double> antPy, std::shared_ptr<double> antPz,
	std::shared_ptr<double> img_x, std::shared_ptr<double> img_y, std::shared_ptr<double> img_z,
	std::shared_ptr<std::complex<double>> echoArr,
	std::shared_ptr<std::complex<double>> img_arr,
	double freq, double dx, double Rnear, double Rfar,double refRange,
	long rowcount, long colcount,
	long prfcount, long freqcount,
	long startPRFId, long startRowID
);