/// <summary> ///根据发射机文件和setup文件得到UAN文件的路径 /// </summary> static string GetUanPath(TxObject tx, SetupObject setup) { //用配置文件读取程序安装位置 List <AntennaStp> antennas = setup.antenna.allAntennas; int i; for (i = 0; i < antennas.Count; i++) { if (tx.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); }
/// <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); }
/// <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); }
public void Add(TxObject toTransmit) { if (ValidateAdd(toTransmit)) { _transmiterQueue.Enqueue(toTransmit); } }
public Transmiter(IEnvironment env, ILog log, IEventAggregator aggregator, ILog consoleLog) { _env = env; _log = log; _consoleLog = consoleLog; _aggregator = aggregator; _transmiterQueue = new ConcurrentQueue <TxObject>(); _txThread = new Thread(new ThreadStart(Process)); _aggregator.GetEvent <RadioTxEvent>().Subscribe((Action <RxObject>)((e) => { var toTx = new TxObject() { Enabled = true, Buffer = e.Buffer, Date = DateTime.Now, Id = Guid.NewGuid(), Ip = e.Ip, Port = e.Port, Resend = true, Disposed = false, Retries = 0 }; Add(toTx); })); }
private string GetHashForValidator(TxObject tx) { var hash = new StringBuilder(); hash.Append(tx.Ip).GetHashCode(); hash.Append(tx.Port).GetHashCode(); hash.Append(tx.Buffer[1]).GetHashCode(); hash.Append(tx.Buffer[2]).GetHashCode(); return(hash.ToString()); }
/// <summary> ///从setup中获取发射频率带宽 /// </summary> private static double GetWidth(TxObject tx, SetupObject setup) { double temp; List <WaveformStp> waveform = setup.waveform.allWaveforms; int i; for (i = 0; i < waveform.Count; i++) { if (tx.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); }
/// <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); }
public void Add(string ip, int port, byte[] buffer, bool retry) { var tx = new TxObject() { Enabled = true, Buffer = buffer, Date = DateTime.Now, Disposed = false, Ip = ip, Port = port, Resend = retry, Retries = 0 }; if (ValidateAdd(tx)) { _transmiterQueue.Enqueue(tx); } }
private bool ValidateAdd(TxObject txObject) { bool valid = true; var txHash = GetHashForValidator(txObject); for (int i = 0; i < _transmiterQueue.Count; i++) { var qTx = _transmiterQueue.ElementAt(i); if (!qTx.Disposed) { if (GetHashForValidator(qTx) == txHash) { valid = false; break; } } } return(valid); }
private void Send(TxObject tx) { try { IPEndPoint endPoint = null; using (var client = UdpFactory.CreateUdpRxClient(tx.Port, ref endPoint)) { endPoint = new IPEndPoint(IPAddress.Parse(tx.Ip), tx.Port); client.Send(tx.Buffer, tx.Buffer.Length, endPoint); Thread.Sleep(tx.Buffer.Length * 50); _consoleLog.Warn($"TX | IP: {tx.Ip} | {tx.Date.ToString()} | port: {tx.Port} | data: {BitConverter.ToString(tx.Buffer)}"); } } catch (Exception ex) { _log.Error(ex); } }
//path为Tx文件路径,setup为setup文件路径,terpath为ter文件路径 #region private static List <TxObject> TxReader(string path) { List <TxObject> tx = new List <TxObject>(); FileInfo fi = new FileInfo(path); if (!fi.Exists) { return(tx); throw new Exception("输入路径不存在"); } string[] paths = path.Split(new char[] { '.' }); if (paths.Length < 1 || !paths[paths.Length - 1].Equals("tx")) { return(tx); throw new Exception("这不是一个rx文件"); } StreamReader sr = new StreamReader(path, System.Text.Encoding.UTF8); string s = sr.ReadToEnd(); sr.Close(); string[] strseperator = new string[] { "begin_<points>", "begin_<grid>" }; string[] result = null; result = s.Split(strseperator, StringSplitOptions.RemoveEmptyEntries); for (int i = 0; i < result.Length; i++) { result[i].TrimStart(' '); TxObject temp = TxObject.txObjFac(result[i]); tx.Add(temp); } return(tx); }
private void Process() { while (true) { if (_isAlive) { TxObject toTx = null; if (_transmiterQueue.TryDequeue(out toTx)) { if (!toTx.Disposed) { if (toTx.Enabled) { Send(toTx); toTx.Enabled = false; if (toTx.Resend) { toTx.Retries++; } } if (toTx.Resend) { _transmiterQueue.Enqueue(toTx); } } } } else { break; } } }