using ExtensionsDev; using System; using System.Collections.Generic; using System.Data.Entity; using System.IO; using System.Linq; using System.Threading.Tasks; using System.Windows.Forms; using XdCxRhDW.Api; using XdCxRhDW.Api.AddIns; using XdCxRhDW.Dto; using XdCxRhDW.Entity; using XdCxRhDW.Repostory; namespace XdCxRhDW.App.EditForms { public partial class TarDfoLeoX2Calc : DevExpress.XtraEditors.XtraForm { private string mainSatInfo; private string adja1SatInfo; private double RefFreqDownMHz; private string CapDir; public TarDfoLeoX2Calc() { InitializeComponent(); this.Text = "两星频差预测"; this.layoutControl1.UseDefault(); this.StartPosition = FormStartPosition.CenterParent; } public TarDfoLeoX2Calc(double lon, double lat) : this() { this.txtTar.Text = $"{lon:f3},{lat:f3}"; } private async void TarDfoLeoX2Calc_Load(object sender, EventArgs e) { try { using (RHDWContext db = new RHDWContext()) { var rec = await db.TxInfos.Where(p => p.TxType == EnumTxType.Rec).FirstOrDefaultAsync(); this.txtRec.Text = $"{rec.Lon},{rec.Lat}"; var refstation = await db.TxInfos.Where(p => p.TxType == EnumTxType.Ref).FirstOrDefaultAsync(); this.txtRef.Text = $"{refstation.Lon},{refstation.Lat}"; } await GetAppSetAsync(); this.lcX1.Text = "主星坐标X"; this.lcY1.Text = "主星坐标Y"; this.lcZ1.Text = "主星坐标Z"; this.lcVX1.Text = "主星坐标VX"; this.lcVY1.Text = "主星坐标VY"; this.lcVZ1.Text = "主星坐标VZ"; this.lcX2.Text = "邻星坐标X"; this.lcY2.Text = "邻星坐标Y"; this.lcZ2.Text = "邻星坐标Z"; this.lcVX2.Text = "邻星坐标VX"; this.lcVY2.Text = "邻星坐标VY"; this.lcVZ2.Text = "邻星坐标VZ"; var main = mainSatInfo.Split(','); int idx = 0; txtX1.EditValue = main[++idx]; txtY1.EditValue = main[++idx]; txtZ1.EditValue = main[++idx]; txtVX1.EditValue = main[++idx]; txtVY1.EditValue = main[++idx]; txtVZ1.EditValue = main[++idx]; var adja = adja1SatInfo.Split(','); idx = 0; txtX2.EditValue = adja[++idx]; txtY2.EditValue = adja[++idx]; txtZ2.EditValue = adja[++idx]; txtVX2.EditValue = adja[++idx]; txtVY2.EditValue = adja[++idx]; txtVZ2.EditValue = adja[++idx]; txtRefFuMhz.EditValue = RefFreqDownMHz; } catch (Exception ex) { await LogHelper.Error("查询天线信息出错", ex); DxHelper.MsgBoxHelper.ShowError("查询天线信息出错"); } } private async Task GetAppSetAsync() { try { mainSatInfo = "23467,-1608418.46,5994257.60,3139819.89,-6632.8731,-373.9909,-2678.2335"; adja1SatInfo = "40892,-4629555.87,4978929.91,1487241.78,-4890.2693,-3337.6709,-4031.3087"; RefFreqDownMHz = 265; CapDir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "信号仿真", "低轨双星仿真数据"); var svtItem = ServerContext.Instance.GetRandomOne(EnumSvrType.LeoX2Task54); if (svtItem == null) { return; } var rsp = await HttpHelper.GetRequestAsync($"{svtItem.BaseHttpAddr}LeoSat2TaskProcessing/GetAppSetting", 10); if (rsp.code == 200) { mainSatInfo = rsp.data.MainSatInfo; adja1SatInfo = rsp.data.Adja1SatInfo; RefFreqDownMHz = rsp.data.RefFreqDownMHz; } } catch (Exception) { } } private async void btnOk_Click(object sender, EventArgs e) { await DfoCalcAsync(false); } private async Task DfoCalcAsync(bool beCreateData) { try { this.listBoxRes.Items.Clear(); var strTar = txtTar.Text.Replace(",", ","); var strRef = txtRef.Text.Replace(",", ","); var strRec = txtRec.Text.Replace(",", ","); var tarfuHz = (Convert.ToDouble(txtTarFuMhz.Text) + 44) * 1e6; var reffuHz = (Convert.ToDouble(txtRefFuMhz.Text) + 44) * 1e6; var DtarfuHz = (Convert.ToDouble(txtTarFuMhz.Text)) * 1e6; var DreffuHz = (Convert.ToDouble(txtRefFuMhz.Text)) * 1e6; double x1 = Convert.ToDouble(txtX1.Text); double y1 = Convert.ToDouble(txtY1.Text); double z1 = Convert.ToDouble(txtZ1.Text); double vx1 = Convert.ToDouble(txtVX1.Text); double vy1 = Convert.ToDouble(txtVY1.Text); double vz1 = Convert.ToDouble(txtVZ1.Text); double[] ephX1 = new double[6] { x1, y1, z1, vx1, vy1, vz1 }; double x2 = Convert.ToDouble(txtX2.Text); double y2 = Convert.ToDouble(txtY2.Text); double z2 = Convert.ToDouble(txtZ2.Text); double vx2 = Convert.ToDouble(txtVX2.Text); double vy2 = Convert.ToDouble(txtVY2.Text); double vz2 = Convert.ToDouble(txtVZ2.Text); double[] ephX2 = new double[6] { x2, y2, z2, vx2, vy2, vz2 }; double[] targetPos = GetDoubles(strTar); double[] refPos = GetDoubles(strRef); double[] recPos = GetDoubles(strRec); var tarEcef = PhysicsHelper.GeoToEcef((targetPos[0], targetPos[1], targetPos[2])); var recEcef = PhysicsHelper.GeoToEcef((recPos[0], recPos[1], recPos[2])); var refEcef = PhysicsHelper.GeoToEcef((refPos[0], refPos[1], refPos[2])); var xlEcef1 = (x1, y1, z1); var x2Ecef1 = (x2, y2, z2); var dt1 = PhysicsHelper.Dto(tarEcef, xlEcef1, recEcef); var dt2 = PhysicsHelper.Dto(tarEcef, x2Ecef1, recEcef); var refdt1 = PhysicsHelper.Dto(refEcef, xlEcef1, recEcef); var refdt2 = PhysicsHelper.Dto(refEcef, x2Ecef1, recEcef); var df1 = DfoCalcAPI.DfoCalc(targetPos, ephX1, tarfuHz); var df2 = DfoCalcAPI.DfoCalc(targetPos, ephX2, tarfuHz); var refdf1 = DfoCalcAPI.DfoCalc(refPos, ephX1, reffuHz); var refdf2 = DfoCalcAPI.DfoCalc(refPos, ephX2, reffuHz); List list = new List(); var tardt = dt2 - dt1; var refdt = refdt2 - refdt1; var tardf = df2 - df1; var refdf = refdf2 - refdf1; list.Add($"目标主邻时差预测值:{tardt * 1e6:f3}us"); list.Add($"参考主邻时差预测值:{refdt * 1e6:f3}us"); list.Add($"目标主邻频差预测值:{tardf:f3}Hz "); list.Add($"参考主邻频差预测值:{refdf:f3}Hz"); this.listBoxRes.Items.AddRange(list.ToArray()); if (beCreateData) { long fsHz = 96000; int brustCount = 15; await Task.Run(() => { try { Directory.CreateDirectory(CapDir); var t1 = DateTime.Now; var f1 = $"{CapDir}\\{t1:yyyyMMddHHmmss}_D{DtarfuHz * 1e-6}_FS{fsHz}_ch1.dat"; var f2 = $"{CapDir}\\{t1:yyyyMMddHHmmss}_D{DtarfuHz * 1e-6}_FS{fsHz}_ch2.dat"; DataEmulationHelper.GenBrustFiles(f1, f2, fsHz, brustCount, tardt, tardf); var reff1 = $"{CapDir}\\{t1:yyyyMMddHHmmss}_D{DreffuHz * 1e-6}_FS{fsHz}_ch1.dat"; var reff2 = $"{CapDir}\\{t1:yyyyMMddHHmmss}_D{DreffuHz * 1e-6}_FS{fsHz}_ch2.dat"; DataEmulationHelper.GenBrustFiles(reff1, reff2, fsHz, brustCount, refdt, refdf); System.Diagnostics.Process.Start("explorer.exe", CapDir); } catch (Exception ex) { DxHelper.MsgBoxHelper.ShowError("频差预测出错"); } }); } } catch (Exception ex) { await LogHelper.Error("频差预测出错", ex); DxHelper.MsgBoxHelper.ShowError("频差预测出错"); } } private double[] GetDoubles(string str) { double lon = Convert.ToDouble(str.Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries)[0]); double lat = Convert.ToDouble(str.Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries)[1]); double[] ds = new double[3] { lon, lat, 0 }; return ds; } private async void btnCreate_Click(object sender, EventArgs e) { await DfoCalcAsync(true); } } }