#pragma once

/*****************************************************************//**
 * \file   RFPCProcessCls.h
 * \brief  距离时域脉冲相干法（Range Time domain Pulse Coherent）处理流程与相关文件
 * 
 * 参考资料
 * 合成孔径雷达成像算法与实现，cumming 洪文译, 第四章 合成孔径的概念
 * 雷达信号处理基础，Mark A.Richards,邢孟道译
 * 合成孔径雷达成像原理，皮亦鸣
 * InSAR原理与应用，刘国祥
 * 弹载SAR回波信号仿真研究，林江红
 * 星载合成孔径雷达原始回波数据模拟研究，吕辉
 * SAR回波仿真信号生成算法的性能比较研究，韦立登
 * 星载合成孔径雷达影像正射校正方法研究，陈尔学
 * 注：吕辉 多普勒计算公式 与 陈尔学的多普勒计算公式存在差异，中间省略了一些变换过程
 * 
 * 
 * \author 陈增辉
 * \date   October 2024
 *********************************************************************/

#include "BaseConstVariable.h"

#include "SARSatelliteSimulationAbstractCls.h"
#include "SARSimulationTaskSetting.h"
#include "SatelliteOribtModel.h"
#include "EchoDataFormat.h"
#include "SigmaDatabase.h"



 /***** 工具函数 *******************************/


CUDA_AntSate_PtrList* malloc_AntSate_PtrList(long PRFCount);
void Free_AntSate_PtrList(CUDA_AntSate_PtrList* ant);
void COPY_AntStation_FROM_HOST_GPU(
	std::shared_ptr<SatelliteOribtNode[]> sateOirbtNodes,
	std::shared_ptr<CUDA_AntSate_PtrList> gpupptr,
	long startPID,
	long PRF_len
);




class RFPCProcessCls
{
public:
	RFPCProcessCls();
	~RFPCProcessCls();
public:
	void setTaskSetting(std::shared_ptr < AbstractSARSatelliteModel> TaskSetting);
	void setEchoSimulationDataSetting(std::shared_ptr < EchoL0Dataset> EchoSimulationData);
	void setTaskFileName(QString EchoFileName);
	void setDEMTiffPath(QString DEMTiffPath);
	void setSloperPath(QString SloperPath);
	void setLandCoverPath(QString LandCoverPath);
	void setOutEchoPath(QString OutEchoPath);

 
private:
	std::shared_ptr <AbstractSARSatelliteModel> TaskSetting; // 仿真任务设置
	std::shared_ptr <EchoL0Dataset> EchoSimulationData; //  回波设置
	std::shared_ptr<SigmaDatabase> SigmaDatabasePtr;
	long PluseCount; // 脉冲数量
	long PlusePoint; // 脉冲点数
	QString LandCoverPath;
	QString OutEchoPath; // 输出回波路径
	QString TaskFileName;
	QString tmpfolderPath;
	QString OutEchoMaskPath;

public:
	ErrorCode Process(long num_thread); // 处理
private: // 处理流程
	ErrorCode InitParams();// 1. 初始化参数
 	ErrorCode InitEchoMaskArray();
	//ErrorCode RFPCMainProcess(long num_thread);
	ErrorCode RFPCMainProcess_GPU();

	std::shared_ptr<SatelliteOribtNode[]> getSatelliteOribtNodes(double prf_time, double dt, bool antflag, long double imageStarttime);

private:
	QString demxyzPath;
	QString demmaskPath;
	QString demsloperPath;
};

void RFPCProcessMain(long num_thread,QString TansformPatternFilePath,QString ReceivePatternFilePath,QString simulationtaskName, QString OutEchoPath, QString GPSXmlPath,QString TaskXmlPath,
	QString demTiffPath, QString sloperPath, QString LandCoverPath);




