/// <summary> /// parse the fragment string, /// "start=t1&end=t2&decimation=2" decimation is optional /// </summary> /// <param name="fragment"></param> /// <returns></returns> public static WaveFragment Parse(FixedIntervalWaveSignal waveSig, string fragment) { //"start=t1&end=t2&decimation=2&count=1000" decimation is optional if (fragment.StartsWith("#")) { fragment = fragment.Substring(1); } var sections = fragment.Split(new char[] { '&' }); var result = new WaveFragment { DecimationFactor = 1, Start = waveSig.StartTime, End = waveSig.EndTime + waveSig.SampleInterval, Count = 0 }; foreach (var sec in sections) { if (sec.Contains("start")) { result.Start = double.Parse(sec.Substring(6)); } if (sec.Contains("end")) { result.End = double.Parse(sec.Substring(4)) + waveSig.SampleInterval; } if (sec.Contains("decimation")) { result.DecimationFactor = long.Parse(sec.Substring(11)); } if (sec.Contains("count")) { result.Count = long.Parse(sec.Substring(6)) > 0 ? long.Parse(sec.Substring(6)) : 0; } } //end smaller then start then read all if (result.Start >= result.End) { result.Start = waveSig.StartTime; result.End = waveSig.EndTime; } if (result.Start < waveSig.StartTime) { result.Start = waveSig.StartTime; } if (result.End > waveSig.EndTime) { result.End = waveSig.EndTime; } //calc the decimationfactor is count valid if (result.Count > 0) { //todo can be optimized a little result.DecimationFactor = (long)Math.Floor(((result.End - result.Start) / waveSig.SampleInterval + 1) / result.Count); } if (result.DecimationFactor < 1) { result.DecimationFactor = 1; } return(result); }
public async Task <ICursor> GetCursorAsync(Signal signal, string dataFragment) { var waveSig = signal as FixedIntervalWaveSignal; if (waveSig == null) { throw new Exception(ErrorMessages.NotValidSignalError); } if (signal.ExtraInformation.Keys.Contains("expression")) { string code = (string)signal.ExtraInformation["expression"]; if (code.Contains("JDBC.Signal")) { MatchCollection mc = Regex.Matches(code, "(?<=JDBC.Signal\\(\").*?(?=\"\\))"); List <Match> matchList = mc.Cast <Match>().ToList(); FixedIntervalWaveSignal codeSig = (FixedIntervalWaveSignal)await myCoreService.GetOneByPathAsync(matchList.FirstOrDefault().Value); waveSig.StartTime = codeSig.StartTime; waveSig.EndTime = codeSig.EndTime; waveSig.SampleInterval = codeSig.SampleInterval; waveSig.Unit = codeSig.Unit; await myCoreService.SaveAsync(waveSig); } else { throw new Exception(ErrorMessages.NotValidExpressionStringError); } } else { throw new Exception(ErrorMessages.ExpressionNotFoundError); } WaveFragment frag = null; try { frag = WaveFragment.Parse(waveSig, dataFragment); } catch (Exception) { throw new Exception(ErrorMessages.NotValidSignalFragmentError); } var startIndex = (long)Math.Ceiling((frag.Start - waveSig.StartTime) / waveSig.SampleInterval); var count = (long)Math.Floor((frag.End - frag.Start) / waveSig.SampleInterval / frag.DecimationFactor) + 1; ICursor <double> myCursor = new Cursor <double>(myCoreService, signal, new List <long> { startIndex }, new List <long> { count }, new List <long> { frag.DecimationFactor }); return(myCursor); }
public Signal CreateSignal(string datatype, string name, string initPathString = "") { Signal signal = null; if (datatype.Equals("Expression")) { signal = new FixedIntervalWaveSignal(name, "Expression", initPathString); return(signal); } throw new Exception(ErrorMessages.NotValidSignalError); }
/// <summary> /// review todo 建议在写一个新的CreateSignal方法,可以动态的从反射获取的signal type中动态实例化,用ActivatorActivator.CreateInstence方法,可以bimianhardcode /// </summary> /// <param name="datatype"></param> /// <param name="name"></param> /// <param name="initString">StartTime=0&SampleInterval=1&Unit=s</param> /// <returns></returns> public Signal CreateSignal(string datatype, string name, string initString) { Signal signal = null; switch (datatype) { case "FixedWave-int": signal = new FixedIntervalWaveSignal(name, "FixedWave-int", initString); break; case "FixedWave-double": signal = new FixedIntervalWaveSignal(name, "FixedWave-double", initString); break; default: throw new Exception(ErrorMessages.NotValidSignalError); } return signal; }