예제 #1
0
        static string GetUanPath(RxObject rx, SetupObject setup)
        {
            //用配置文件读取程序安装位置
            List <AntennaStp> antennas = setup.antenna.allAntennas;
            int i;

            for (i = 0; i < antennas.Count; i++)
            {
                if (rx.at.antennaNum == antennas[i].antenna)
                {
                    break;
                }
            }
            //DLL路径加上相对路径
            string path;

            if (antennas[i].uan_path == null)
            {
                path = GetDllPath() + "\\" + antennas[i].type + ".uan";
            }
            else
            {
                path = ".\\project\\" + setup.name + "\\" + antennas[i].uan_path;
            }
            return(path);
        }
예제 #2
0
        /// <summary>
        ///从setup文件中获取发射机的频率
        /// </summary>
        private static double GetFrequence(RxObject rx, SetupObject setup)
        {
            List <WaveformStp> waveform = setup.waveform.allWaveforms;
            List <AntennaStp>  antenna  = setup.antenna.allAntennas;

            if (rx.at.waveformNum == -1)
            {
                for (int j = 0; j < antenna.Count; j++)
                {
                    if (rx.at.antennaNum == antenna[j].antenna)
                    {
                        rx.at.waveformNum = antenna[j].waveform;
                    }
                }
            }

            //接收机频率有用么?

            int i;

            for (i = 0; i < waveform.Count; i++)
            {
                if (rx.at.waveformNum == waveform[i].waveform)
                {
                    break;
                }
            }
            if (i > waveform.Count - 1)
            {
                LogFileManager.ObjLog.info("如果这是点状接收机,则没问题。如果是态势,则有问题");
                return(0);
            }
            return(waveform[i].CarrierFrequency);
        }
예제 #3
0
        /// <summary>
        ///获取每个发射机的频段信息
        /// </summary>
        public static List <FrequencyBand> GetTxFrequenceBand(string txpath, string setuppath, int txindex)
        {
            List <FrequencyBand> TxFrequenceBand = new List <FrequencyBand>();
            List <TxObject>      txs             = TxReader(txpath);
            SetupObject          setupfile       = SetupFileProceed.GetSetupFile.GetSetup(setuppath);
            WaveformStp          txwaveform      = GetTxWaveForm(txs[txindex], setupfile);

            if (txwaveform.type == null)
            {
                throw new Exception("波形信息错误");
            }
            if (txwaveform.type == "Sinusoid")
            {
                if (txwaveform.bandwidth < 2)
                {
                    FrequencyBand temp = new FrequencyBand((int)(txwaveform.CarrierFrequency - 1), (int)(txwaveform.CarrierFrequency + 1), (txs[txindex].at.power));
                    TxFrequenceBand.Add(temp);
                }
                else
                {
                    FrequencyBand temp = new FrequencyBand((int)(txwaveform.CarrierFrequency - txwaveform.bandwidth / 2), (int)(txwaveform.CarrierFrequency + txwaveform.bandwidth / 2), (txs[txindex].at.power));
                    TxFrequenceBand.Add(temp);
                }
            }
            else
            {
                psd          TxDivFrequence = new psd(txwaveform.type, txwaveform.PulseWidth, (long)txwaveform.CarrierFrequency, txwaveform.Rolloff, txwaveform.FrequencyVariation, txwaveform.StartFrequency, txwaveform.StopFrequency);
                DivFrequency Frequencyinfo  = TxDivFrequence.GetFandPSD();
                TxFrequenceBand = GetBandInformation((txs[txindex].at.power), Frequencyinfo);
            }
            return(TxFrequenceBand);
        }
예제 #4
0
        /// <summary>
        ///从setup文件中获取发射机的载波频率
        /// </summary>
        private static double GetTxCarrierFrequence(TxObject tx, SetupObject setup)
        {
            List <WaveformStp> waveform = setup.waveform.allWaveforms;
            List <AntennaStp>  antenna  = setup.antenna.allAntennas;

            if (tx.at.waveformNum == -1)
            {
                for (int j = 0; j < antenna.Count; j++)
                {
                    if (tx.at.antennaNum == antenna[j].antenna)
                    {
                        tx.at.waveformNum = antenna[j].waveform;
                    }
                }
            }
            int i;

            for (i = 0; i < waveform.Count; i++)
            {
                if (tx.at.waveformNum == waveform[i].waveform)
                {
                    break;
                }
            }
            return(waveform[i].CarrierFrequency);
        }
예제 #5
0
        //获取setup文件对象,path为setup路径
        public static SetupObject GetSetup(string path)
        {
            FileInfo fi = new FileInfo(path);

            if (!fi.Exists)
            {
                return(null);

                throw new Exception("输入路径不存在");
            }
            string[] paths = path.Split(new char[] { '.' });
            if (paths.Length < 1 || !paths[paths.Length - 1].Equals("setup"))
            {
                return(null);

                throw new Exception("这不是一个setup文件");
            }
            StreamReader sr = new StreamReader(path);
            string       s  = sr.ReadToEnd();

            sr.Close();
            SetupObject setupfile = new SetupObject(s);

            return(setupfile);
        }
예제 #6
0
        /// <summary>
        ///从setup中获取发射机波形信息
        /// </summary>
        private static WaveformStp GetTxWaveForm(TxObject tx, SetupObject setup)
        {
            WaveformStp        txwaveform = new WaveformStp();
            List <WaveformStp> waveform   = setup.waveform.allWaveforms;
            List <AntennaStp>  antenna    = setup.antenna.allAntennas;

            if (tx.at.waveformNum == -1)
            {
                for (int j = 0; j < antenna.Count; j++)
                {
                    if (tx.at.antennaNum == antenna[j].antenna)
                    {
                        tx.at.waveformNum = antenna[j].waveform;
                    }
                }
            }
            int i;

            for (i = 0; i < waveform.Count; i++)
            {
                if (tx.at.waveformNum == waveform[i].waveform)
                {
                    txwaveform = waveform[i];
                }
            }
            return(txwaveform);
        }
예제 #7
0
        /// <summary>
        ///从setup中获取发射频率带宽????
        /// </summary>
        private static double GetWidth(RxObject rx, SetupObject setup)
        {
            if (rx.at.waveformNum == -1)
            {
                LogFileManager.ObjLog.info("如果这是点状接收机,则没问题。如果是态势,则有问题");
                return(0);
            }
            double             temp;
            List <WaveformStp> waveform = setup.waveform.allWaveforms;
            int i;

            for (i = 0; i < waveform.Count; i++)
            {
                if (rx.at.waveformNum == waveform[i].waveform)
                {
                    break;
                }
            }
            switch (waveform[i].type)
            {
            case "Sinusoid":
                temp = waveform[i].bandwidth;
                break;

            case "RaisedCosine":
                temp = 10000000 * (1 + waveform[i].Rolloff) / (waveform[i].PulseWidth / 0.0000001);
                break;

            case "Chirp":
                temp = waveform[i].StopFrequency - waveform[i].StartFrequency;
                break;

            case "Blackman":
                temp = 60000000 / (waveform[i].PulseWidth / 0.0000001);
                break;

            case "Gaussian":
                temp = 23190000 / (waveform[i].PulseWidth / 0.0000001);
                break;

            case "GaussianDerivative":
                temp = 16480000 / (waveform[i].PulseWidth / 0.0000001);;
                break;

            case "Hamming":
                temp = 40000000 / (waveform[i].PulseWidth / 0.0000001);;
                break;

            case "RootRaisedCosine":
                temp = 10000000 * (1 + waveform[i].Rolloff) / (waveform[i].PulseWidth / 0.0000001);
                break;

            default:
                temp = 0;
                break;
            }
            return(temp / 1000000);
        }
예제 #8
0
        public static StartupServer Create(Uri baseAddress = null)
        {
            var appEnv = CallContextServiceLocator.Locator.ServiceProvider.GetRequiredService<IApplicationEnvironment>();

            var config = new ConfigurationBuilder();
            var configDict = new Dictionary<string, string>();
            configDict["Hosting:Environment"] = "Test";
            config.AddInMemoryCollection(configDict.AsEnumerable());
            var conf = config.Build();

            var env = new HostingEnvironment();
            env.Initialize($"{appEnv.ApplicationBasePath}/../../src/Accounting", conf);
            var startup = new Accounting.Startup(appEnv, env);

            var setup = new SetupObject();

            Action<IApplicationBuilder> buildApp = (app) =>
            {
                app.Use(async (context, next) =>
                {
                    var req = context.Request;
                        
                    if (req.Path == testSetupPathString && setup.Setup != null)
                    {
                        await setup.Setup(context);
                    }
                    else
                    {
                        await next();
                    }
                });
                startup.Configure(app);
            };

            Action<IServiceCollection> buildServices = (services) =>
            {
                startup.ConfigureServices(services);
                services.Remove(services.Where(sp => sp.ServiceType == typeof(IConfigureOptions<AntiforgeryOptions>)).First());
                services.TryAddEnumerable(ServiceDescriptor.Transient<IConfigureOptions<AntiforgeryOptions>, TestAntiforgeryOptionsSetup>());
                services.AddSingleton<IAntiforgeryTokenSerializer, TestAntiforgeryTokenSerializer>();
                services.AddSingleton<IAntiforgeryTokenGenerator, TestAntiforgeryTokenGenerator>();
            };

            StartupServer server = new StartupServer(CreateBuilder(conf, app => buildApp(app), services => buildServices(services)));
            server.setupObject = setup;
            server.BaseAddress = baseAddress;
            return server;
        }
예제 #9
0
        /// <summary>
        /// 读取UAN(王楠)
        /// </summary>
        /// <param name="rx"></param>
        /// <param name="setup"></param>
        /// <returns></returns>
        public static string GetUan(RxObject rx, SetupObject setup)
        {
            DateTime     startime = DateTime.Now;
            StreamReader sr       = new StreamReader(GetUanPath(rx, setup));

            //string s = sr.ReadToEnd();
            if (string.IsNullOrEmpty(s2))
            {
                s2 = sr.ReadToEnd();
                DateTime finishtime = DateTime.Now;
                TimeSpan span       = finishtime - startime;
                LogFileManager.ObjLog.debug("第" + (++indexUanRead) + "次读取uan文件到内存中耗时:" + span);
            }
            sr.Close();
            return(s2);
        }
예제 #10
0
        /// <summary>
        /// 读取UAN(王楠)
        /// </summary>
        /// <param name="tx">发射</param>
        /// <param name="setup">设置</param>
        /// <returns>UAN字符串</returns>
        public static string GetUan(TxObject tx, SetupObject setup)
        {
            DateTime     startime = DateTime.Now;//记录开始时间
            StreamReader sr       = new StreamReader(GetUanPath(tx, setup));

            //string s = sr.ReadToEnd();
            if (string.IsNullOrEmpty(s1))                    //判断是否读到结尾
            {
                s1 = sr.ReadToEnd();                         //将读取的流转化为string类型
                DateTime finishtime = DateTime.Now;          //记录结束时间
                TimeSpan span       = finishtime - startime; //读取所花时间
                LogFileManager.ObjLog.debug("第" + (++indexUanRead) + "次读取uan文件到内存中耗时:" + span);
            }
            sr.Close();//读取关闭
            return(s1);
        }
예제 #11
0
        public static void Calculate(string setuppath, string terpath, string txpath, string rxpath)
        {
            //此判断用来将ter文件中的三角面读入Intersection.Tris中
            Terrain     newTer        = new Terrain(terpath);
            string      DirectoryPath = GetDirectory(setuppath) + "result\\";
            SetupObject setupOne      = SetupFileProceed.GetSetupFile.GetSetup(setuppath);
            int         txTotal       = setupOne.tr.FirstAvailableTxNumber;
            string      ProName       = GetProName(setuppath);
            List <Node> txs           = TxFileProceed.GetTx(txpath, setuppath, terpath);

            myLog.Info(txs.Count);
            List <List <ReceiveBall> > rxs = RxFileProceed.GetRx(rxpath, setuppath, terpath);

            myLog.Info(rxs.Count);
            //rxs.AddRange(TxFileProceed.GetTxAsRx(txpath, setuppath, terpath));
            City buildings = new City(GetDirectory(setuppath) + ProName + ".city");

            buildings.RestructTerrainByBuildings(newTer.TerRect);
            if (buildings.Build != null && buildings.Build.Count != 0)
            {
                newTer.OutPutNewTerrain(GetDirectory(setuppath));
            }                                                    //输出新地形
            int?[] index   = { null, null };
            int    txindex = 0;

            for (int i = 0; i < txs.Count; i++)
            {
                List <FrequencyBand> txFrequencyBand = TxFileProceed.GetTxFrequenceBand(txpath, setuppath, i);//获取频段信息
                myLog.Debug("这是第" + (i + 1) + "个发射机的射线追踪==========================================================================");
                for (int j = 0; j < rxs.Count; j++)
                {
                    //该接收区只有一个接收机
                    if (rxs[j].Count == 1)
                    {
                        if (rxs[j][0].GetType().ToString().Equals("CalculateModelClasses.ReceiveArea"))
                        {
                            //电磁态势的追踪模块
                            ReceiveArea reArea = (ReceiveArea)rxs[j][0];
                            //第一步:构建态势区域
                            myLog.Debug("构建态势区域");
                            reArea.CreateAreaSituation(newTer.TerRect);
                            //第二步:正向追踪,获取路径
                            myLog.Debug("正向追踪,获取粗略路径");
                            RayTubeMethod areaTracing = new RayTubeMethod(txs[i], reArea, newTer, buildings, 64);
                            //读取发射天线的极化信息
                            string txPol = GetRxTxPol("tx", txs[i].TxNum);
                            //读取接收天线的极化信息(删除??)
                            string rxPol = GetRxTxPol("areaSituation", rxs[j][0].RxNum);
                            //第三步:反向追踪,获取准确路径
                            //for (int m = 0; m < reArea.areaSituationNodes.Count; m++)
                            //{
                            //    areaTracing.ReverseAreaTracingPathsAndDeleteRepeatedPaths(reArea.areaSituationNodes[m].paths);
                            //}
                            //获取发射天线的4个参数
                            ReadUan.GetGainPara(txs[i].UAN);
                            for (int m = 0; m < reArea.areaSituationNodes.Count; m++)
                            {
                                reArea.areaSituationNodes[m].classifiedFrequencyPaths = new List <List <CalculateModelClasses.Path> >();
                                if (reArea.areaSituationNodes[m].paths.Count != 0)
                                {
                                    PathsafterPolization(reArea.areaSituationNodes[m].paths, txPol, rxPol);//极化代码
                                    //第四步:分频段求每条路径上的场强
                                    reArea.areaSituationNodes[m].classifiedFrequencyPaths = new List <List <CalculateModelClasses.Path> >();
                                    //areaTracing.ScreenAreaSituationPathsByFrequencyAndCalculateEField(txFrequencyBand, reArea.areaSituationNodes[m].paths, reArea.areaSituationNodes[m].classifiedFrequencyPaths);
                                    //计算每个频段上的各个路径叠加的总场强
                                    for (int n = 0; n < txFrequencyBand.Count; n++)
                                    {
                                        EField tempEfield = new EField();
                                        tempEfield.X = tempEfield.GetTolEx(reArea.areaSituationNodes[m].classifiedFrequencyPaths[n]);
                                        tempEfield.Y = tempEfield.GetTolEy(reArea.areaSituationNodes[m].classifiedFrequencyPaths[n]);
                                        tempEfield.Z = tempEfield.GetTolEz(reArea.areaSituationNodes[m].classifiedFrequencyPaths[n]);
                                        //得到每个频段上各个路径叠加的场强
                                        reArea.areaSituationNodes[m].totleEfields.Add(tempEfield);
                                        //得到各个频段上各个路径后得到的总场强
                                        reArea.areaSituationNodes[m].totleEfield.X += tempEfield.X;
                                        reArea.areaSituationNodes[m].totleEfield.Y += tempEfield.Y;
                                        reArea.areaSituationNodes[m].totleEfield.Z += tempEfield.Z;
                                    }
                                }
                            }
                            //文件输出
                            string path = ".\\.\\project\\station\\areaSituationResult.txt";
                            if (!System.IO.File.Exists(path))
                            {
                                System.IO.File.Create(path).Close();
                            }
                            StringBuilder sb = new StringBuilder();
                            for (int m = 0; m < reArea.areaSituationNodes.Count; m++)
                            {
                                if (reArea.areaSituationNodes[m].paths.Count != 0)
                                {
                                    //string appendText1 =  m+" "  + reArea.areaSituationNodes[m].paths.Count+" " ;
                                    //sb.Append(appendText1);
                                    //string appendText2 = "Ex " + reArea.areaSituationNodes[m].totleEfield.X.Re + "+j" + reArea.areaSituationNodes[m].totleEfield.X.Im + ",Ey " + reArea.areaSituationNodes[m].totleEfield.Y.Re + "+j" + reArea.areaSituationNodes[m].totleEfield.Y.Im + ",Ez " + reArea.areaSituationNodes[m].totleEfield.Z.Re + "+j" + reArea.areaSituationNodes[m].totleEfield.Z.Im + "\r\n";
                                    //sb.Append(appendText2);
                                    string appendText1 = "第" + m + "个态势点上有" + reArea.areaSituationNodes[m].paths.Count + "条路径,";
                                    sb.Append(appendText1);
                                    string appendText2 = "总场强为:Ex " + reArea.areaSituationNodes[m].totleEfield.X.Re + "+j" + reArea.areaSituationNodes[m].totleEfield.X.Im + ",Ey " + reArea.areaSituationNodes[m].totleEfield.Y.Re + "+j" + reArea.areaSituationNodes[m].totleEfield.Y.Im + ",Ez " + reArea.areaSituationNodes[m].totleEfield.Z.Re + "+j" + reArea.areaSituationNodes[m].totleEfield.Z.Im + "\r\n";
                                    sb.Append(appendText2);
                                }
                                //else
                                //{
                                //    string appendText1 = "没有到达第" + m + "个态势点的路径\r\n";
                                //    sb.Append(appendText1);
                                //}
                            }
                            StreamWriter stw = new StreamWriter(path);
                            stw.Write(sb);
                            stw.Flush(); //清空缓冲区
                            stw.Close(); //关闭流
                            //---------------------------------
                            myLog.Debug("结果计算和文件输出过程结束,进入下一个接收机的追踪--------------------------------------");
                        }
                        else
                        {
                            if (("tx_" + txs[i].NodeName).Equals(rxs[j][0].RxName))
                            {
                                myLog.Debug("这是第" + (i + 1) + "个发射机第" + (j + 1) + "个接收机的射线追踪:是同一个发射机");
                                continue;
                            }
                            myLog.Debug("这是第" + (i + 1) + "个发射机第" + (j + 1) + "个接收机的射线追踪*****************************************************");
                            index[0] = j;
                            RayTubeMethod rayTubeMethod = new RayTubeMethod(txs[i], rxs[j][0], newTer, buildings, 32);
                            rayTubeMethod.ReverseTracingPathsAndDeleteRepeatedPaths();
                            rayTubeMethod.UpdateRayInForNodes();
                            //       PunctiformLaunchMethod punctiformMethod = new PunctiformLaunchMethod(txs[i], rxs[j][0], newTer, buildings, 64, txFrequencyBand);
                            //        List<CalculateModelClasses.Path> temp = punctiformMethod.GetPunctiformRxPath(tx, rxs[j][0], newTer,cityBuilding, 32, 128,TxFrequencyBand);

                            //        if (rayTubeMethod.ReceivedPaths.Count != 0)//若存在直射射线
                            //         {
                            //             string txPol = GetRxTxPol("tx", txs[i].TxNum);//极化代码
                            //             string rxPol = null;
                            //              if (rxs[j][0].isTx == true)
                            //              {
                            //                  rxPol = GetRxTxPol("tx", rxs[j][0].RxNum);
                            //              }
                            //              else
                            //              {
                            //                  rxPol = GetRxTxPol("rx", rxs[j][0].RxNum);//
                            //              }
                            //               PathsafterPolization(rayTubeMethod.ReceivedPaths, txPol, rxPol);//
                            //          }
                            myLog.Debug("射线追踪过程结束,进入射线筛选和计算过程-----------------------------------------");
                            //输出结果
                            ReadUan.GetGainPara(rxs[j][0].UAN);
                            List <List <CalculateModelClasses.Path> > ClassifiedPaths = rayTubeMethod.ScreenPunctiformPathsByFrequencyAndCalculateEField(txFrequencyBand);
                            for (int m = 0; m < txFrequencyBand.Count; m++)
                            {
                                P2mFileOutput.p2mfileoutput(ClassifiedPaths[m], DirectoryPath, ProName, txs[i].TxNum, txTotal, txindex, rxs[j][0], txs[i].Position, txFrequencyBand[m].MidPointFrequence, txFrequencyBand[m].FrequenceWidthMin, txFrequencyBand[m].FrequenceWidthMax);
                            }
                            List <CalculateModelClasses.Path> totalPowerPath = GetTotalPowerPath(ClassifiedPaths);
                            PowerOutput.GetRxTotalPower(totalPowerPath, DirectoryPath, ProName, txs[i].TxNum, txTotal, rxs[j][0], txs[i].Position);
                            myLog.Debug("结果计算和文件输出过程结束,进入下一个接收机的追踪---------------------------------------");
                        }
                    }
                    else
                    {
                        throw new Exception("没有接收机");
                    }
                }
            }
            GC.Collect();
        }
예제 #12
0
        //参数是接收机和发射机之间的路径
        private static string GetRxTxPol(string rxOrTx, int rxTxNum)
        {
            string      pathSet = ConfigurationManager.AppSettings["setupath"];
            SetupObject so      = SetupFileProceed.GetSetupFile.GetSetup(pathSet);

            SetupFileObject.TotalAntenna      ta    = so.antenna;
            List <SetupFileObject.AntennaStp> asAll = ta.allAntennas;
            //从tx,rx,setup文件中得到信息
            string pathTx = ConfigurationManager.AppSettings["txpath"];
            //存放rxtx的文件内容
            string s;
            int    tantNum = -1;
            int    rantNum = -1;

            try
            {
                if (rxOrTx == "tx")
                {
                    StreamReader st = new StreamReader(pathTx);
                    s = st.ReadToEnd();
                    int    tstart  = s.IndexOf("TxSet " + Convert.ToString(rxTxNum));
                    int    tbstart = s.IndexOf("<antenna>", tstart);
                    int    tastart = s.IndexOf("antenna", tbstart + 7);
                    string str     = s.Substring(tastart + 8);
                    tantNum = Convert.ToInt32(s.Substring(tastart + 8, 1));
                    st.Close();
                    s = "";
                    if (tantNum == -1)
                    {
                        throw new Exception("读取天线的编号出现问题");
                    }
                }
                else if (rxOrTx == "rx")
                {
                    //读取文件rxset
                    string       pathRx = ConfigurationManager.AppSettings["rxpath"];
                    StreamReader sr     = new StreamReader(pathRx);
                    s = sr.ReadToEnd();
                    int    tstart  = s.IndexOf("RxSet " + Convert.ToString(rxTxNum));
                    int    tbstart = s.IndexOf("<antenna>", tstart);
                    int    tastart = s.IndexOf("antenna", tbstart + 7);
                    string str     = s.Substring(tastart + 8);
                    rantNum = Convert.ToInt32(s.Substring(tastart + 8, 1));
                    s       = "";
                    if (rantNum == -1)
                    {
                        throw new Exception("读取天线的编号出现问题");
                    }
                    sr.Close();
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                throw e;
            }
            for (int an = 0; an < asAll.Count; an++)
            {
                if (tantNum == asAll[an].antenna)
                {
                    //返回天线极化类型
                    return(asAll[an].polarization);
                }
                if (rantNum == asAll[an].antenna)
                {
                    //返回天线的极化类型
                    return(asAll[an].polarization);
                }
            }
            return("");
        }
예제 #13
0
 //path是传入的路径参数,获取setup文件中的天线信息
 public static List <AntennaStp> GetAntennaStp(SetupObject setup)
 {
     return(setup.antenna.allAntennas);
 }
예제 #14
0
 //path是传入的路径参数,获取setup文件中的波形信息
 public static List <WaveformStp> GetWaveformStp(SetupObject setup)
 {
     return(setup.waveform.allWaveforms);
 }