示例#1
0
 private static void CalcolaFrequenzaDebug(TimeReference elapsed, TimeReference now)
 {
     if (!elapsed.IsLowResZero)
     {
         mDebugFrequency = elapsed.CalculateHiResFrequency();
     }
 }
示例#2
0
        private static void ApplicaNuovaFrequenza(TimeReference delta)
        {
            long mNewFrequency = delta.CalculateHiResFrequency();

            //applica la media geometrica tra vecchia e nuova frequenza
            //compensa l'oscillazione del valore dovuta al fatto che la mNewFrequency una volta viene in eccesso e una volta viene in difetto
            //ed è ugualmente veloce verso numeri grossi e verso numeri piccoli (a differenza della media aritmetica)
            long mCompFrequency = mCurrentFrequency == 0 ? mNewFrequency : (long)(Math.Sign(mNewFrequency) * Math.Sqrt(Math.Abs((double)mCurrentFrequency * mNewFrequency)));

#if timedebug
            double TimeError       = (delta.HiResNano - delta.LowResNano) / (double)NANO_IN_MILLI;
            long   TargetFrequency = (long)Math.Round(mOriginalFrequency * testmultiplier);
            long   anew            = Math.Abs(mCompFrequency);
            long   atar            = Math.Abs(TargetFrequency);
            double PercError       = (anew > atar) ? (anew - atar) * 100.0 / anew : -(atar - anew) * 100.0 / atar;

            if (mCorrectionCount == 0)
            {
                System.Diagnostics.Debug.WriteLine(" TIME \t  ERROR  \t   OLD   \t   NEW   \t   COM   \t  TARGET  \t DELAY \tWINDOW SIZE");
            }

            System.Diagnostics.Debug.WriteLine(string.Format(System.Globalization.CultureInfo.InvariantCulture,
                                                             "{0:00.000}\t{1:+00.00000;-00.00000}\t{2:000000000}\t{3:000000000}\t{4:000000000}\t{5:000000000}\t{6:+00.0;-00.0}ms\t[LR {7}ms HR {8:0.00}ms REF {9:0.00}ms]", DateTime.Now.Subtract(startDT).TotalSeconds, PercError, mCurrentFrequency, mNewFrequency, mCompFrequency, TargetFrequency, TimeError, delta.LowRes, delta.HiResNano / (double)NANO_IN_MILLI, delta.ReferenceNano / (double)NANO_IN_MILLI));
#else
            double TimeError = (delta.HiResNano - delta.LowResNano) / (double)NANO_IN_MILLI;
            System.Diagnostics.Debug.WriteLine($"CLOCK CORRECTION:\t{mCurrentFrequency:000000000}\t{mNewFrequency:000000000}\t{mCompFrequency:000000000}\t{TimeError:0.00}ms\tΔHiRes\t{delta.HiRes}\tΔLowRes\t{delta.LowRes}");
#endif
            mCurrentFrequency = mCompFrequency;
            mCorrectionCount++;
        }
示例#3
0
        private static void ApplicaNuovaFrequenza(TimeReference elapsed, TimeReference now)
        {
            long newfreq = elapsed.CalculateHiResFrequency();

#if timedebug
            long target = (long)Math.Round(mOriginalFrequency * testmultiplier);
            System.Diagnostics.Debug.WriteLine(String.Format("{0} -> {1} target {2} err {3:+0.00000;-0.00000}% trigger with {4:+00.000;-00.000}", mCurrentFrequency, newfreq, target, (newfreq - target) * 100.0 / target, elapsed.Error));
#else
            System.Diagnostics.Debug.WriteLine(String.Format("{0} -> {1}", mCurrentFrequency, newfreq));
#endif

            AssignFrequency(newfreq, now.HiRes);

#if timedebug
            AlignmentCount++;
#endif
        }