using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace DW5S.KxcApi
{
public static class GDOPApi
{
private const string GDOPDll = @"AddIns\GDOP误差椭圆\GDOP_Draw_11.dll";
private const string ErrellipDll = @"AddIns\GDOP误差椭圆\DLL_GDOP_Analysis0415";
///
/// 两星一地误差椭圆
///
/// 主星位置 长度6
/// 邻星位置 长度6
/// 超短波 长度3
/// 参考站 长度3
/// 定位点 长度3
/// 时差误差(s)
///
/// 0.5
///
///
[DllImport(ErrellipDll, EntryPoint = "Error_Ellipse_2X1D", CallingConvention = CallingConvention.Cdecl)]
public extern static IntPtr Error_Ellipse_2X1D(double[] main_eph, double[] neigh_eph, double[] cdbAnt, double[] refStation, double[] Select_Point, double dto_err,
double eph_err, double Pe, ref int LOP_Len);
///
/// 获取三星双时差GDOP 带参考
/// mainxyz :xyz vx vy vz
/// adaj1xyz :xyz vx vy vz
/// adaj2xyz :xyz vx vy vz
/// refPos: 参考经度,纬度
/// dtousErr: 时差误差
/// ephLocErr: 星历位置误差
/// level: gdop输出等级
/// levlen:level 长度
/// resCount:每一级的数据个数
/// res :数据
/// satllh :卫星位置
/// 返回值:0 成功
///
[DllImport(GDOPDll, EntryPoint = "Gdop3SatRefByXyz", CallingConvention = CallingConvention.Cdecl)]
public static extern int Gdop3SatRefByXyz(double[] mainxyz, double[] adaj1xyz, double[] adaj2xyz, double[] refPos
, double dtousErr, double ephLocErr
, double[] level, int levlen, int[] resCount, out IntPtr res, double[] satllh);
[DllImport(GDOPDll, EntryPoint = "Gdop3SatRefByXyz_new", CallingConvention = CallingConvention.Cdecl)]
public static extern int Gdop3SatRefByXyz_new(double[] mainxyz, double[] adaj1xyz, double[] adaj2xyz, double[] refPos
, double dtousErr, double ephLocErr
, double[] level, int levlen, int[] resCount, out IntPtr lpoints, out IntPtr res, double[] satllh);
///
/// 获取三星双时差GDOP 无参考
/// mainxyz :xyz vx vy vz
/// adaj1xyz :xyz vx vy vz
/// adaj2xyz :xyz vx vy vz
/// dtousErr: 时差误差
/// ephLocErr: 星历位置误差
/// level: gdop输出等级
/// levlen:level 长度
/// resCount:每一级的数据个数
/// res :数据
/// satllh :卫星位置
/// 返回值:0 成功
///
[DllImport(GDOPDll, EntryPoint = "Gdop3SatNoRefByXyz", CallingConvention = CallingConvention.Cdecl)]
public static extern int Gdop3SatNoRefByXyz(double[] mainxyz, double[] adaj1xyz, double[] adaj2xyz
, double dtousErr, double ephLocErr
, double[] level, int levlen, int[] resCount, out IntPtr res, double[] satllh);
[DllImport(GDOPDll, EntryPoint = "Gdop3SatNoRefByXyz_new", CallingConvention = CallingConvention.Cdecl)]
public static extern int Gdop3SatNoRefByXyz_new(double[] mainxyz, double[] adaj1xyz, double[] adaj2xyz
, double dtousErr, double ephLocErr
, double[] level, int levlen, int[] resCount, out IntPtr lpoints, out IntPtr res, double[] satllh);
///
/// 获取双星GDOP
/// mainxyz :xyz vx vy vz
/// adajxyz :xyz vx vy vz
/// refPos: 参考经度,纬度
/// fuHz1: 主上行
/// fuHz2: 邻上行
/// dtousErr: 时差误差
/// dfoHzErr: 频差误差
/// ephLocErr: 星历位置误差
/// ephVLocErr: 星历速度误差
/// level: gdop输出等级
/// levlen:level 长度
/// resCount:每一级的数据个数
/// res :数据
/// satllh :卫星位置
/// 返回值:0 成功
///
[DllImport(GDOPDll, EntryPoint = "Gdop2SatDRefByXyz", CallingConvention = CallingConvention.Cdecl)]
public static extern int Gdop2SatDRefByXyz(double[] mainxyz, double[] adajxyz, double[] refPos
, double fuHz1, double fuHz2, double dtousErr, double dfoHzErr, double ephLocErr, double ephVLocErr
, double[] level, int levlen, int[] resCount, out IntPtr res, double[] satllh);
[DllImport(GDOPDll, EntryPoint = "Gdop2SatDRefByXyz_new", CallingConvention = CallingConvention.Cdecl)]
public static extern int Gdop2SatDRefByXyz_new(double[] mainxyz, double[] adajxyz, double[] refPos
, double fuHz1, double fuHz2, double dtousErr, double dfoHzErr, double ephLocErr, double ephVLocErr
, double[] level, int levlen, int[] resCount, out IntPtr lpoints, out IntPtr res, double[] satllh);
///
/// 获取三星双频差GDOP
/// mainxyz :xyz vx vy vz
/// adaj1xyz :xyz vx vy vz
/// adaj2xyz :xyz vx vy vz
/// refPos: 参考经度,纬度
/// fuHz1: 主上行
/// fuHz2: 邻上行
/// dfo_err: 频差误差
/// eph_pos_err: 星历位置误差
/// eph_vel_err: 星历速度误差
/// level: gdop输出等级
/// levlen:level 长度
/// resCount:每一级的数据个数
/// res :数据
/// satllh :卫星位置
/// 返回值:0 成功
///
[DllImport(GDOPDll, EntryPoint = "Gdop3SatDFByXyz", CallingConvention = CallingConvention.Cdecl)]
public static extern int Gdop3SatDFByXyz(double[] mainxyz, double[] adaj1xyz, double[] adaj2xyz, double[] refPos
, double fuHz1, double fuHz2, double dfo_err, double eph_pos_err, double eph_vel_err
, double[] level, int levlen, int[] resCount, out IntPtr res, double[] satllh);
[DllImport(GDOPDll, EntryPoint = "Gdop3SatDFByXyz_new", CallingConvention = CallingConvention.Cdecl)]
public static extern int Gdop3SatDFByXyz_new(double[] mainxyz, double[] adaj1xyz, double[] adaj2xyz, double[] refPos
, double fuHz1, double fuHz2, double dfo_err, double eph_pos_err, double eph_vel_err
, double[] level, int levlen, int[] resCount, out IntPtr lpoints, out IntPtr res, double[] satllh);
///
/// 获取2X1D GDOP
/// mainxyz :xyz vx vy vz
/// adajxyz :xyz vx vy vz
/// cdbPos: 地面站经度,纬度
/// refPos: 参考经度,纬度
/// dtousErr: 时差误差
/// ephLocErr: 星历位置误差
/// level: gdop输出等级
/// levlen:level 长度
/// resCount:每一级的数据个数
/// res :数据
/// satllh :卫星位置 长度6
/// 返回值:0 成功
///
[DllImport(GDOPDll, EntryPoint = "Gdop2Sat1DRefByXyz", CallingConvention = CallingConvention.Cdecl)]
public static extern int Gdop2Sat1DRefByXyz(double[] mainxyz, double[] adajxyz, double[] cdbPos
, double[] refPos, double dtousErr, double ephLocErr
, double[] level, int levlen, int[] resCount, out IntPtr res, double[] satllh);
[DllImport(GDOPDll, EntryPoint = "Gdop2Sat1DRefByXyz_new", CallingConvention = CallingConvention.Cdecl)]
public static extern int Gdop2Sat1DRefByXyz_new(double[] mainxyz, double[] adajxyz, double[] cdbPos
, double[] refPos, double dtousErr, double ephLocErr
, double[] level, int levlen, int[] resCount, out IntPtr lpoints, out IntPtr res, double[] satllh);
///
/// 获取2X1D no ref GDOP
/// mainxyz :xyz vx vy vz
/// adajxyz :xyz vx vy vz
/// cdbPos: 地面站经度,纬度
/// dtousErr: 时差误差
/// ephLocErr: 星历位置误差
/// level: gdop输出等级
/// levlen:level 长度
/// resCount:每一级的数据个数
/// res :数据
/// satllh :卫星位置 长度6
/// 返回值:0 成功
///
[DllImport(GDOPDll, EntryPoint = "Gdop2Sat1DNoRefByXyz", CallingConvention = CallingConvention.Cdecl)]
public static extern int Gdop2Sat1DNoRefByXyz(double[] mainxyz, double[] adajxyz, double[] cdbPos
, double dtousErr, double ephLocErr
, double[] level, int levlen, int[] resCount, out IntPtr res, double[] satllh);
[DllImport(GDOPDll, EntryPoint = "Gdop2Sat1DNoRefByXyz_new", CallingConvention = CallingConvention.Cdecl)]
public static extern int Gdop2Sat1DNoRefByXyz_new(double[] mainxyz, double[] adajxyz, double[] cdbPos
, double dtousErr, double ephLocErr
, double[] level, int levlen, int[] resCount, out IntPtr lpoints, out IntPtr res, double[] satllh);
///
/// 获取XD_CX ref GDOP
/// mainxyz :xyz vx vy vz
/// cdbPos: 地面站经度,纬度
/// cxPos: 侧向站经度,纬度
/// refPos: 参考经度,纬度
/// dto_err: 时差误差
/// doa_err: 侧向误差
/// eph_err: 星历位置误差
/// level: gdop输出等级
/// levlen:level 长度
/// resCount:每一级的数据个数
/// res :数据
/// satllh :卫星位置 长度6
/// 返回值:0 成功
///
[DllImport(GDOPDll, EntryPoint = "GdopXDCXRefByXyz", CallingConvention = CallingConvention.Cdecl)]
public static extern int GdopXDCXRefByXyz(double[] mainxyz, double[] cdbPos, double[] cxPos, double[] refPos
, double dto_err, double doa_err, double eph_err
, double[] level, int levlen, int[] resCount, out IntPtr res, double[] satllh);
[DllImport(GDOPDll, EntryPoint = "GdopXDCXRefByXyz_new", CallingConvention = CallingConvention.Cdecl)]
public static extern int GdopXDCXRefByXyz_new(double[] mainxyz, double[] cdbPos, double[] cxPos, double[] refPos
, double dto_err, double doa_err, double eph_err
, double[] level, int levlen, int[] resCount, out IntPtr lpoints, out IntPtr res, double[] satllh);
///
/// 获取XD_CX no ref GDOP
/// mainxyz :xyz vx vy vz
/// cdbPos: 地面站经度,纬度
/// cxPos: 侧向站经度,纬度
/// refPos: 参考经度,纬度
/// dto_err: 时差误差
/// doa_err: 侧向误差
/// eph_err: 星历位置误差
/// level: gdop输出等级
/// levlen:level 长度
/// resCount:每一级的数据个数
/// res :数据
/// satllh :卫星位置 长度6
/// 返回值:0 成功
///
[DllImport(GDOPDll, EntryPoint = "GdopXDCXNoRefByXyz", CallingConvention = CallingConvention.Cdecl)]
public static extern int GdopXDCXNoRefByXyz(double[] mainxyz, double[] cdbPos, double[] cxPos
, double dto_err, double doa_err, double eph_err
, double[] level, int levlen, int[] resCount, out IntPtr res, double[] satllh);
///
/// 获取XD_CX no ref GDOP
/// mainxyz :xyz vx vy vz
/// cdbPos: 地面站经度,纬度
/// cxPos: 侧向站经度,纬度
/// refPos: 参考经度,纬度
/// dto_err: 时差误差
/// doa_err: 侧向误差
/// eph_err: 星历位置误差
/// level: gdop输出等级
/// levlen:level 长度
/// resCount:每一级的数据个数
/// res :数据
/// satllh :卫星位置 长度6
/// 返回值:0 成功
///
[DllImport(GDOPDll, EntryPoint = "GdopXDCXNoRefByXyz_new", CallingConvention = CallingConvention.Cdecl)]
public static extern int GdopXDCXNoRefByXyz_new(double[] mainxyz, double[] cdbPos, double[] cxPos
, double dto_err, double doa_err, double eph_err
, double[] level, int levlen, int[] resCount, out IntPtr lpoints, out IntPtr res, double[]satllh);
/////
///// XD时差线
///// main_sat_pos 卫星星历 xyz
///// mbwx_rec_pos 目标接收站位置 llh
///// ckwx_rec_pos 参考接收站位置 llh
///// cdb_rec_pos 地面接收站位置 llh
///// ref_pos 参考位置 llh
///// target_dto 目标时差 llh
///// ref_dto 参考时差 llh
///// reslen 时差线个数
///// res 值
/////
//[DllImport(GDOPDll, EntryPoint = "SCX_XD", CallingConvention = CallingConvention.Cdecl)]
//public static extern int SCX_XD(double[] mainxyz, double[] mbrecPos, double[] ckrefPos, double[] cdbPos, double[] refPos,
// double target_dto, double ref_dto,ref int resCount, out IntPtr res);
///
/// XD时差线
/// main_sat_pos 卫星星历 xyz
/// mbwx_rec_pos 目标接收站位置 llh
/// ckwx_rec_pos 参考接收站位置 llh
/// cdb_rec_pos 地面接收站位置 llh
/// ref_pos 参考位置 llh
/// target_dto 目标时差 llh
/// ref_dto 参考时差 llh
/// linecount 线条数
/// reslen 线条数对应点数
/// res 总点数
///
[DllImport(GDOPDll, EntryPoint = "SCX_XD_new", CallingConvention = CallingConvention.Cdecl)]
public static extern int SCX_XD_new(double[] mainxyz, double[] mbrecPos, double[] ckrefPos, double[] cdbPos, double[] refPos,
double target_dto, double ref_dto,ref int linecount, out IntPtr reslen,out IntPtr res);
///
/// XD时差线
/// main_sat_pos 卫星星历 xyz
/// mbwx_rec_pos 目标接收站位置 llh
/// cdb_rec_pos 地面接收站位置 llh
/// target_dto 目标时差 llh
/// ref_dto 参考时差 llh
/// reslen 时差线个数
/// res 值
///
[DllImport(GDOPDll, EntryPoint = "SCX_XD_NoRef", CallingConvention = CallingConvention.Cdecl)]
public static extern int SCX_XD_NoRef(double[] mainxyz, double[] mbrecPos, double[] cdbPos,
double target_dto,ref int resCount, out IntPtr res);
///
/// XD时差线
/// main_sat_pos 卫星星历 xyz
/// mbwx_rec_pos 目标接收站位置 llh
/// cdb_rec_pos 地面接收站位置 llh
/// target_dto 目标时差 llh
/// ref_dto 参考时差 llh
/// reslen 时差线个数
/// res 值
///
[DllImport(GDOPDll, EntryPoint = "SCX_XD_NoRef_new", CallingConvention = CallingConvention.Cdecl)]
public static extern int SCX_XD_NoRef_new(double[] mainxyz, double[] mbrecPos, double[] cdbPos,
double target_dto, ref int linecount, out IntPtr reslen, out IntPtr res);
//单星、星地、低轨、
//GDOP_EXPORT int SCX_XD_NoRef_new(double* main_sat_pos, double* mbwx_rec_pos, double* cdb_rec_pos,
//double target_dto, int* linecount, int** reslen, double** res);
[DllImport(GDOPDll, EntryPoint = "FreeGDOPBuf", CallingConvention = CallingConvention.Cdecl)]
public static extern void FreeGDOPBuf(IntPtr val);
}
}