Exemple #1
0
        /// <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);
        }
Exemple #2
0
        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);
        }
Exemple #3
0
        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);
        }
Exemple #4
0
 /// <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;
 }