public void ProcessSamples(byte[] packet)
        {
            float timeInterval = 1.0f / SampleRate;
            float[] samples = new float[packet.Length/2];

            for (int k = 0; k < packet.Length / 2; k++)
            {
                short sh = BitConverter.ToInt16(packet, k*2);
                float currentValue = sh/1.0f;

                if (AdcMcp)
                {
                    currentValue = currentValue/32768.0f/1/1.5f*1.2f*23;
                    currentValue /= 10; // shunt

                    currentValue /= Gain; // gain

                    var voltageCorrection = LastHighresVoltage / 15220.588235294117647058823529412f;
                    currentValue -=voltageCorrection;

                    currentValue *= 1000000;
                    if (Gain == 10)
                        currentValue -= 148.3f;
                    if (Gain == 1)
                        currentValue -= 1300;
                    if (Gain == 1000)
                    {
                        currentValue -= 3.6f;

                        var adc = k%4;
                        switch(adc)
                        {
                            case 0:
                                currentValue += 0.18f;
                                break;
                            case 1:
                                currentValue += 0.12f;
                                break;
                            case 2:
                                currentValue += 0.37f;
                                break;
                            case 3:
                                currentValue += 0.34f;
                                break;
                        }
                    }
                    if (Gain == 100)
                    {
                        currentValue -= 2.5f;
                    }

                    if (Gain == 1000)
                        currentValue /= 1.03f;
                    else
                        currentValue /= 1.02f;
                    currentValue /= 1000000;
                }
                else
                {
                    currentValue = (currentValue - 2048)/2048.0f;
                    currentValue *= 2.5f*23;

                    currentValue /= 10; // shunt

                    currentValue /= Gain; // gain

                    currentValue -= LastHighresVoltage/15220.588235294117647058823529412f;
                    currentValue /= 2;

                    if (Gain == 1000)
                        currentValue -= 0.000149f;
                    if (Gain == 10)
                        currentValue -= 0.0013f;
                }
                if (currentValue < -20.0f/1000 || (currentValue > 20.0f / 1000 && currentValue < 100.0f/1000))
                {
                    err++;
                }
                samples[k] = currentValue;
            }

            var dpk = new DataPacket(samples, DataType.DutCurrent, (float)timeInterval);

            if (Data != null)
                Data(dpk);
        }
        void ProcessWaveform(DataPacket data)
        {
            AcquisitionLength = 1+(int)(AcquisitionTime*Source.SampleRate);
            if (AcquisitionLength < 15) AcquisitionLength = 15;

            Pretrigger = (int) (PretriggerTime*Source.SampleRate) + AcquisitionLength / 2;

            lock (samplesOverflowSink)
            {
                samplesOverflowSink.AddRange(data.Samples);

                var pretriggerSampleDepth = (int) Source.SampleRate;

                if (samplesOverflowSink.Count > pretriggerSampleDepth)
                {
                    samplesOverflowSink.RemoveRange(0, samplesOverflowSink.Count - pretriggerSampleDepth);
                }

                var triggerInfo = new TriggerInfo(true, 0); // dummy

                while (triggerInfo.Triggered && samplesOverflowSink.Count >= AcquisitionLength + Pretrigger) // always keep 1 waveform extra in memory
                {
                    triggerInfo = Trigger.IsTriggered(samplesOverflowSink, 0);

                    // Skip the waveform (if we keep trigger) till we satisfy the pretrigger requirement.
                    while (triggerInfo.Triggered && triggerInfo.TriggerPoint < Pretrigger)
                    {
                        triggerInfo = Trigger.IsTriggered(samplesOverflowSink, triggerInfo.TriggerPoint );
                    }
                    // Only process when actually triggered.
                    if (!triggerInfo.Triggered) break;

                    // We take the waveform from the buffer at the triggerpoint, but also subtracting the pre-trigger sample depth.
                    var waveformStart = triggerInfo.TriggerPoint - Pretrigger;

                    // Get these samples, and put them into the waveform.
                    var waveformSamples = samplesOverflowSink.Skip(waveformStart).Take(AcquisitionLength).ToArray();
                    if (waveformSamples.Length != AcquisitionLength) break;
                    var waveform = new Waveform(1, AcquisitionLength);
                    var timestamp = -Pretrigger*data.TimeInterval;
                    foreach(var s in waveformSamples)
                    {
                        timestamp += data.TimeInterval;
                        waveform.Store(timestamp, new float[1] {s});
                    }

                    FireTriggeredWaveform(waveform);

                    samplesOverflowSink.RemoveRange(0, waveformStart+AcquisitionLength-1);

                }
            }
        }
        void Source_Data(DataPacket data)
        {
            // Store each sample.
            foreach (var s in data.Samples)
            {
                overviewTimestamp += data.TimeInterval;
                overviewWf.Store(overviewTimestamp, new float[1] { s });
            }

            if (DateTime.Now.Subtract(overviewWfLastCapture).TotalMilliseconds >= LongAcquisitionTime *1000)
            {
                if (OverviewWaveform != null)
                    OverviewWaveform(overviewWf);

                overviewWf = new Waveform(1, 6000000);
                overviewTimestamp = 0.0f;
                overviewWfLastCapture = DateTime.Now;

            }
        }
        private void GenerateDataElapse(object sender, EventArgs eventArgs)
        {
            var r = new Random();
            int generatingSamples = samplesPerSecond /100;

            float[] samples = new float[generatingSamples];
            var timeInterval = 1.0f/samplesPerSecond;

            for (int i = 0; i < generatingSamples; i++)
            {
                var k = i + sampleCounter;

                var t = timeInterval*k;

                accumulatedPhase += timeInterval*1.0f*freq;
                accumulatedPhase %= 1;

                var s = Math.Sin(2*Math.PI*accumulatedPhase);
                s *= 1/Math.Sqrt(2);
                s += r.Next(-1005, 1005)/100000.0f;

                samples[i] = (float) (s);
            }
            sampleCounter += generatingSamples;

            var dpk = new DataPacket(samples, DataType.DutCurrent, (float)timeInterval);

            if (Data != null)
                Data(dpk);
        }