using Ips.Library.Basic; using Ips.LocAlgorithm; using Ips.Sim.Interops; using Ips.Sim.Models; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Ips.Sim { public static class SimUtil { public static double[] GenSignalFile(string folder, long fs, double timeLen, double[] pos, double[] dfs, SimSatInfo mainSat, List adjaSats, double errRange = 0, bool hasRef = false, double[] refLla = null, long refFs = 0) { if (mainSat == null) throw new ArgumentNullException(nameof(mainSat)); if (adjaSats.IsNullOrEmpty()) throw new ArgumentNullException(nameof(adjaSats)); DirectoryUtil.CreateIfNotExists(folder); string mainFile = Path.Combine(folder, mainSat.FileName); var timeLenMs = Convert.ToInt32(timeLen * 1e3); var srcPos = new double[] { pos[0], pos[1], 0 }; double[] dts = new double[4]; int errDt = 0; if (errRange > 1e-6) { var rd = new Random(); var rdVal = (errRange / 111).E6(); var errLon = rd.Next(-rdVal, rdVal).E6m(); var errLat = rd.Next(-rdVal, rdVal).E6m(); pos[0] += errLon / 3; pos[1] += errLat; } if (!hasRef) { if (adjaSats.Count == 1) { var adjaSat = adjaSats[0]; string adjaFile = Path.Combine(folder, adjaSat.FileName); SignalEmulationApi.genSatSignal(mainSat.SatEph, adjaSat.SatEph, mainSat.RecGeod, adjaSat.RecGeod, pos, fs, timeLenMs, mainFile, adjaFile, dts); } else { var adja1Sat = adjaSats[0]; var adja2Sat = adjaSats[1]; string adja1File = Path.Combine(folder, adja1Sat.FileName); string adja2File = Path.Combine(folder, adja2Sat.FileName); double[] mainEph = mainSat.SatEph, adja1Eph = adja1Sat.SatEph, adja2Eph = adja2Sat.SatEph; double[] mainRec = mainSat.RecGeod, adja1Rec = adja1Sat.RecGeod, adja2Rec = adja2Sat.RecGeod; //double[] dfs = new[] { tarDf1, tarDf2 }; SignalEmulationApi.genSatSignals(mainEph, adja1Eph, adja2Eph, mainRec, adja1Rec, adja2Rec, pos, fs, timeLenMs, errDt, dfs, mainFile, adja1File, adja2File, dts); //var dtll1 = GeoUtil.CalcDtoCenter(pos, mainEph, adja1Eph, mainRec, adja1Rec); //var dtll2 = GeoUtil.CalcDtoCenter(pos, mainEph, adja2Eph, mainRec, adja2Rec); //var dttar1 = -dts[0] * 1e6; //var dttar2 = -dts[1] * 1e6; //var dtll = GeoUtil.CalcDtoCenter(pos, mainSat.SatEph, adja1Sat.SatEph, mainSat.RecGeod, adja1Sat.RecGeod); //var dttar1 = dts[0]; //var dttar2 = dts[1]; //var dttar1 = 4378; //var dttar2 = 4126; //var posResult1 = Task.Run(() => LocUtil.X3(dttar1, dttar2, mainRec, adja1Rec, mainRec, adja2Rec, mainEph, adja1Eph, mainEph, adja2Eph)).Result.Result; //var posResult2 = Task.Run(() => LocUtil.X3(dttar2, dttar1, mainRec, adja1Rec, mainRec, adja2Rec, mainEph, adja1Eph, mainEph, adja2Eph)).Result.Result; //var posResult1 = Task.Run(() => LocUtil.X3(dtll1, dtll2, mainRec, adja1Rec, mainRec, adja2Rec, mainEph, adja1Eph, mainEph, adja2Eph)).Result.Result; } } else { var adja1Sat = adjaSats[0]; var adja2Sat = adjaSats[1]; string adja1File = Path.Combine(folder, adja1Sat.FileName); string adja2File = Path.Combine(folder, adja2Sat.FileName); string refMainFile = Path.Combine(folder, mainSat.RefFileName); string refAdja1File = Path.Combine(folder, adja1Sat.RefFileName); string refAdja2File = Path.Combine(folder, adja2Sat.RefFileName); double[] mainEph = mainSat.SatEph, adja1Eph = adja1Sat.SatEph, adja2Eph = adja2Sat.SatEph; double[] mainRec = mainSat.RecGeod, adja1Rec = adja1Sat.RecGeod, adja2Rec = adja2Sat.RecGeod; //double[] dfs = new[] { tarDf1, tarDf2, refDf1, refDf2 }; SignalEmulationApi.genSatSignalsWithRef(mainEph, adja1Eph, adja2Eph, mainRec, adja1Rec, adja2Rec, pos, refLla, fs, refFs, timeLenMs, errDt, dfs, mainFile, adja1File, adja2File, refMainFile, refAdja1File, refAdja2File, dts); //var dttar1 = -dts[0] * 1e6; //var dttar2 = -dts[1] * 1e6; //var dtref1 = -dts[2] * 1e6; //var dtref2 = -dts[3] * 1e6; //var dttar3 = dtref1 - dttar1; //var dtref3 = dtref2 - dttar2; //var dt1 = Task.Run(() => Loc32Util.CalcDt(pos, mainEph, adja1Eph, mainRec, adja1Rec, refLla).Result).Result; //var dt2 = Task.Run(() => Loc32Util.CalcDt(pos, mainEph, adja2Eph, mainRec, adja2Rec, refLla).Result).Result; //var posResult = Task.Run(() => LocUtil.X3Ref(dttar1, dttar2, dtref1, dtref2, refLla, refLla, mainRec, adja1Rec, mainRec, adja2Rec, mainEph, adja1Eph, mainEph, adja2Eph)).Result.Result; //var posResult1 = Task.Run(() => Loc32Util.X3Ref(dttar1, dttar2, dtref1, dtref2, refLla, refLla, mainRec, adja1Rec, mainRec, adja2Rec, mainEph, adja1Eph, mainEph, adja2Eph)).Result.Result; //var dis1 = GeoUtil.DistinceLla(pos, posResult.Result1.ToArray()); //var dis2 = GeoUtil.DistinceLla(pos, posResult1.Result2.ToArray()); } return dts.Select(m => -m).ToArray(); } private static string GetSatSignalsWithRefArg(double[] majorSat, double[] minorSat1, double[] minorSat2, double[] majorRecv, double[] minorRecv1, double[] minorRecv2, double[] tarPos, double[] refPos, long fsample, int tlenms, int dtErrRange, string fmajor, string fminor1, string fminor2, string frmajor, string frminor1, string frminor2, double[] res) { return ""; } } }