commit 2b0b5201b59032facf81a2f326dcbb5e9f63439e Author: BlubbFish Date: Thu Mar 9 20:49:20 2017 +0000 picoscopereader hinzugefügt diff --git a/PicoSopeReader.sln b/PicoSopeReader.sln new file mode 100644 index 0000000..7060d3f --- /dev/null +++ b/PicoSopeReader.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PicoSopeReader", "PicoSopeReader\PicoSopeReader.csproj", "{DB1DED6E-A9EA-4075-8500-21D1686A64C9}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {DB1DED6E-A9EA-4075-8500-21D1686A64C9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DB1DED6E-A9EA-4075-8500-21D1686A64C9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DB1DED6E-A9EA-4075-8500-21D1686A64C9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DB1DED6E-A9EA-4075-8500-21D1686A64C9}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/PicoSopeReader/Imports.cs b/PicoSopeReader/Imports.cs new file mode 100644 index 0000000..f1aff34 --- /dev/null +++ b/PicoSopeReader/Imports.cs @@ -0,0 +1,478 @@ +/************************************************************************** +* +* Filename: Imports.cs +* +* Copyright: Pico Technology Limited 2007 +* +* Author: MJL +* +* Description: +* This file contains all the .NET wrapper calls needed to support +* the console example. It also has the enums and structs required +* by the (wrapped) function calls. +* +* History: +* 14Dec06 MJL Created +* +* Revision Info: "file %n date %f revision %v" +* "" +* +***************************************************************************/ + +using System; +using System.Runtime.InteropServices; +using System.Text; + +namespace PicoSopeReader +{ + class Imports + { + #region constants + public const string _DRIVER_FILENAME = "ps5000.dll"; + + public const int MaxValue = 32512; + #endregion + + #region Driver enums + + public enum Channel : int + { + ChannelA, + ChannelB, + ChannelC, + ChannelD, + External, + Aux, + None, + } + + public enum Range : int + { + Range_10MV, + Range_20MV, + Range_50MV, + Range_100MV, + Range_200MV, + Range_500MV, + Range_1V, + Range_2V, + Range_5V, + Range_10V, + Range_20V, + Range_50V, + } + + public enum ReportedTimeUnits : int + { + FemtoSeconds, + PicoSeconds, + NanoSeconds, + MicroSeconds, + MilliSeconds, + Seconds, + } + + public enum SiggenWaveType : int + { + Sine, + Square, + Triangle, + RampUp, + RampDown, + SinXOverX, + Gaussian, + HalfSine, + DcVoltage, + MAX_WAVE_TYPES + } + + public enum SiggenSweepType : int + { + Up, + Down, + UpDown, + DownUp + } + + public enum SiggenTrigType : int + { + Rising, + Falling, + GateHigh, + GateLow + } + + public enum SiggenTrigSource : int + { + None, + ScopeTrigger, + AuxIn, + ExtIn, + SoftwareTrigger + } + + public enum SiggenIndexMode : int + { + Single, + Dual, + Quad, + } + + public enum EtsMode : int + { + Off, + Fast, + Slow, + } + + public enum ThresholdMode : int + { + Level, + Window + } + + public enum ThresholdDirection : int + { + // Values for level threshold mode + // + Above, + Below, + Rising, + Falling, + RisingOrFalling, + + // Values for window threshold mode + // + Inside = Above, + Outside = Below, + Enter = Rising, + Exit = Falling, + EnterOrExit = RisingOrFalling, + + None = Rising, + } + + public enum DownSamplingMode : int + { + None, + Aggregate + } + + public enum PulseWidthType : int + { + None, + LessThan, + GreaterThan, + InRange, + OutOfRange + } + + public enum TriggerState : int + { + DontCare, + True, + False, + } + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct TriggerChannelProperties + { + public short ThresholdMajor; + public short ThresholdMinor; + public ushort Hysteresis; + public Channel Channel; + public ThresholdMode ThresholdMode; + + + public TriggerChannelProperties( + short thresholdMajor, + short thresholdMinor, + ushort hysteresis, + Channel channel, + ThresholdMode thresholdMode) + { + this.ThresholdMajor = thresholdMajor; + this.ThresholdMinor = thresholdMinor; + this.Hysteresis = hysteresis; + this.Channel = channel; + this.ThresholdMode = thresholdMode; + } + } + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct TriggerConditions + { + public TriggerState ChannelA; + public TriggerState ChannelB; + public TriggerState ChannelC; + public TriggerState ChannelD; + public TriggerState External; + public TriggerState Aux; + public TriggerState Pwq; + + public TriggerConditions( + TriggerState channelA, + TriggerState channelB, + TriggerState channelC, + TriggerState channelD, + TriggerState external, + TriggerState aux, + TriggerState pwq) + { + this.ChannelA = channelA; + this.ChannelB = channelB; + this.ChannelC = channelC; + this.ChannelD = channelD; + this.External = external; + this.Aux = aux; + this.Pwq = pwq; + } + } + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct PwqConditions + { + public TriggerState ChannelA; + public TriggerState ChannelB; + public TriggerState ChannelC; + public TriggerState ChannelD; + public TriggerState External; + public TriggerState Aux; + + public PwqConditions( + TriggerState channelA, + TriggerState channelB, + TriggerState channelC, + TriggerState channelD, + TriggerState external, + TriggerState aux) + { + this.ChannelA = channelA; + this.ChannelB = channelB; + this.ChannelC = channelC; + this.ChannelD = channelD; + this.External = external; + this.Aux = aux; + } + } + #endregion + + #region Driver Imports + #region Callback delegates + public delegate void ps5000BlockReady(short handle, short status, IntPtr pVoid); + + public delegate void ps5000StreamingReady( + short handle, + int noOfSamples, + uint startIndex, + short ov, + uint triggerAt, + short triggered, + short autoStop, + IntPtr pVoid); + + public delegate void ps5000DataReady( + short handle, + int noOfSamples, + short overflow, + uint triggerAt, + short triggered, + IntPtr pVoid); + #endregion + + [DllImport(_DRIVER_FILENAME, EntryPoint = "ps5000OpenUnit")] + public static extern short OpenUnit(out short handle); + + [DllImport(_DRIVER_FILENAME, EntryPoint = "ps5000CloseUnit")] + public static extern short CloseUnit(short handle); + + [DllImport(_DRIVER_FILENAME, EntryPoint = "ps5000RunBlock")] + public static extern short RunBlock( + short handle, + int noOfPreTriggerSamples, + int noOfPostTriggerSamples, + uint timebase, + short oversample, + out int timeIndisposedMs, + ushort segmentIndex, + ps5000BlockReady lpPs5000BlockReady, + IntPtr pVoid); + + [DllImport(_DRIVER_FILENAME, EntryPoint = "ps5000Stop")] + public static extern short Stop(short handle); + + [DllImport(_DRIVER_FILENAME, EntryPoint = "ps5000SetChannel")] + public static extern short SetChannel( + short handle, + Channel channel, + short enabled, + short dc, + Range range); + + [DllImport(_DRIVER_FILENAME, EntryPoint = "ps5000SetDataBuffers")] + public static extern short SetDataBuffers( + short handle, + Channel channel, + short[] bufferMax, + short[] bufferMin, + int bufferLth); + + [DllImport(_DRIVER_FILENAME, EntryPoint = "ps5000SetDataBuffer")] + public static extern short SetDataBuffer( + short handle, + Channel channel, + short[] buffer, + long bufferLth); + + [DllImport(_DRIVER_FILENAME, EntryPoint = "ps5000SetEts")] + public static extern short SetEts( + short handle, + EtsMode mode, + short etsCycles, + short etsInterleave, + out int sampleTimePicoseconds); + + [DllImport(_DRIVER_FILENAME, EntryPoint = "ps5000SetTriggerChannelDirections")] + public static extern short SetTriggerChannelDirections( + short handle, + ThresholdDirection channelA, + ThresholdDirection channelB, + ThresholdDirection channelC, + ThresholdDirection channelD, + ThresholdDirection ext, + ThresholdDirection aux); + + [DllImport(_DRIVER_FILENAME, EntryPoint = "ps5000GetTimebase")] + public static extern short GetTimebase( + short handle, + uint timebase, + int noSamples, + out int timeIntervalNanoseconds, + short oversample, + out int maxSamples, + ushort segmentIndex); + + [DllImport(_DRIVER_FILENAME, EntryPoint = "ps5000GetValues")] + public static extern short GetValues( + short handle, + uint startIndex, + ref uint noOfSamples, + uint downSampleRatio, + DownSamplingMode downSampleDownSamplingMode, + ushort segmentIndex, + out short overflow); + + [DllImport(_DRIVER_FILENAME, EntryPoint = "ps5000SetPulseWidthQualifier")] + public static extern short SetPulseWidthQualifier( + short handle, + PwqConditions[] conditions, + short numConditions, + ThresholdDirection direction, + uint lower, + uint upper, + PulseWidthType type); + + [DllImport(_DRIVER_FILENAME, EntryPoint = "ps5000SetTriggerChannelProperties")] + public static extern short SetTriggerChannelProperties( + short handle, + TriggerChannelProperties[] channelProperties, + short numChannelProperties, + short auxOutputEnable, + int autoTriggerMilliseconds); + + [DllImport(_DRIVER_FILENAME, EntryPoint = "ps5000SetTriggerChannelConditions")] + public static extern short SetTriggerChannelConditions( + short handle, + TriggerConditions[] conditions, + short numConditions); + + [DllImport(_DRIVER_FILENAME, EntryPoint = "ps5000SetTriggerDelay")] + public static extern short SetTriggerDelay(short handle, uint delay); + + [DllImport(_DRIVER_FILENAME, EntryPoint = "ps5000GetUnitInfo")] + public static extern short GetUnitInfo(short handle, StringBuilder infoString, short stringLength, out short requiredSize, int info); + + [DllImport(_DRIVER_FILENAME, EntryPoint = "ps5000SetSigGenBuiltIn")] + public static extern short SetSiggenBuiltIn( + short handle, + int offsetVoltage, + uint pkToPk, + SiggenWaveType siggenWaveType, + float startFrequency, + float stopFrequency, + float increment, + float dwellTime, + SiggenSweepType sweepType, + bool whiteNoise, + uint shots, + uint sweeps, + SiggenTrigType triggerType, + SiggenTrigSource triggerSource, + short extInThreshold); + + [DllImport(_DRIVER_FILENAME, EntryPoint = "ps5000SetSigGenArbitrary")] + public static extern short SetSiggenArbitrary( + short handle, + int offsetVoltage, + uint pkToPk, + uint startDeltaPhase, + uint stopDeltaPhase, + uint deltaPhaseIncrement, + uint dwellCount, + short[] arbitraryWaveform, + uint arbitraryWaveformSize, + SiggenSweepType sweepType, + bool whiteNoise, + SiggenIndexMode indexMode, + uint shots, + uint sweeps, + SiggenTrigType triggerType, + SiggenTrigSource triggerSource, + short extInThreshold); + + [DllImport(_DRIVER_FILENAME, EntryPoint = "ps5000RunStreaming")] + public static extern short RunStreaming( + short handle, + ref uint sampleInterval, + ReportedTimeUnits sampleIntervalTimeUnits, + uint maxPreTriggerSamples, + uint maxPostPreTriggerSamples, + bool autoStop, + uint downSamplingRation, + uint overviewBufferSize); + + [DllImport(_DRIVER_FILENAME, EntryPoint = "ps5000GetStreamingLatestValues")] + public static extern short GetStreamingLatestValues( + short handle, + ps5000StreamingReady lpPs5000StreamingReady, + IntPtr pVoid); + + [DllImport(_DRIVER_FILENAME, EntryPoint = "ps5000SetNoOfCaptures")] + public static extern short SetNoOfRapidCaptures( + short handle, + ushort nWaveforms); + + [DllImport(_DRIVER_FILENAME, EntryPoint = "ps5000MemorySegments")] + public static extern short MemorySegments( + short handle, + ushort nSegments, + out int nMaxSamples); + + [DllImport(_DRIVER_FILENAME, EntryPoint = "ps5000SetDataBufferBulk")] + public static extern short SetDataBuffersRapid( + short handle, + Channel channel, + short[] buffer, + int bufferLth, + ushort waveform); + + [DllImport(_DRIVER_FILENAME, EntryPoint = "ps5000GetValuesBulk")] + public static extern short GetValuesRapid( + short handle, + ref uint noOfSamples, + ushort fromSegmentIndex, + ushort toSegmentIndex, + short[] overflows); + #endregion + } +} diff --git a/PicoSopeReader/PicoReader.cs b/PicoSopeReader/PicoReader.cs new file mode 100644 index 0000000..ece116b --- /dev/null +++ b/PicoSopeReader/PicoReader.cs @@ -0,0 +1,147 @@ +using System; +using System.IO; +using System.Threading; + +namespace PicoSopeReader +{ + class PicoReader + { + private readonly short _handle; + uint _timebase; + short _oversample; + bool _ready = false; + ushort[] inputRanges = { 10, 20, 50, 100, 200, 500, 1000, 2000, 5000, 10000, 20000, 50000 }; + + public PicoReader(short handle) + { + _handle = handle; + } + public void Run() + { + char ch = ' '; + while (ch != 'X') + { + Console.WriteLine(""); + Console.WriteLine("+-----------------------------------------------------+"); + Console.WriteLine("|Wilkommen zum PicoScopeReader: |"); + Console.WriteLine("|Programiert von Philip Schell |"); + Console.WriteLine("| |"); + Console.WriteLine("|Programm released under LGPLv3 |"); + Console.WriteLine("| |"); + Console.WriteLine("| S - Start Reading X - exit |"); + Console.WriteLine("+-----------------------------------------------------+"); + ch = char.ToUpper(Console.ReadKey().KeyChar); + Console.WriteLine("\n"); + switch (ch) + { + case 'B': + Tracking(); + break; + + default: + Console.WriteLine("Invalid operation"); + break; + } + } + } + private void Tracking() + { + Console.WriteLine("Chan A einschalten und auf 5V: {0}", Imports.SetChannel(_handle, Imports.Channel.ChannelA, 1, 1, Imports.Range.Range_5V)); + + Console.WriteLine("Chan B einschalten und auf 1V: {0}", Imports.SetChannel(_handle, Imports.Channel.ChannelB, 1, 1, Imports.Range.Range_1V)); + + int tmp; + Console.WriteLine("Disable ETS: {0}", Imports.SetEts(_handle, Imports.EtsMode.Off, 0, 0, out tmp)); + + int timeInterval; + int maxSamples; + uint sampleCount = (int)(1 * 1e6); + _timebase = 5; //timebase = 5 => 24ns => 40mhz + _oversample = 1; + Console.WriteLine("Zeit Setzen: {0}", Imports.GetTimebase(_handle, _timebase, (int)sampleCount, out timeInterval, _oversample, out maxSamples, 0)); + + short triggerVoltage = mv_to_adc(3000, (short)Imports.Range.Range_5V); + Console.WriteLine("max {0} {1}:", Imports.MaxValue, triggerVoltage); + + Imports.TriggerChannelProperties[] sourceDetails = new Imports.TriggerChannelProperties[] { + new Imports.TriggerChannelProperties( + triggerVoltage, + triggerVoltage, + 1, + Imports.Channel.ChannelA, + Imports.ThresholdMode.Level)}; + Console.WriteLine("Trigger Einstellungen auf Chan A setzen: {0}", Imports.SetTriggerChannelProperties(_handle, sourceDetails, (short)sourceDetails.Length, 0, 0)); + + Imports.TriggerConditions[] cond = new Imports.TriggerConditions[] { + new Imports.TriggerConditions( + Imports.TriggerState.True, + Imports.TriggerState.DontCare, + Imports.TriggerState.DontCare, + Imports.TriggerState.DontCare, + Imports.TriggerState.DontCare, + Imports.TriggerState.DontCare, + Imports.TriggerState.DontCare)}; + Console.WriteLine("Trigger Bedingung auf Chan A setzen: {0}", Imports.SetTriggerChannelConditions(_handle, cond, (short)cond.Length)); + + Imports.ThresholdDirection dir_i = Imports.ThresholdDirection.Falling; + Imports.ThresholdDirection dir_n = Imports.ThresholdDirection.None; + Console.WriteLine("Trigger Richtung auf Chan A setzen: {0}", Imports.SetTriggerChannelDirections(_handle, dir_i, dir_n, dir_n, dir_n, dir_n, dir_n)); + + Console.WriteLine("Trigger Verzögerung setzen: {0}", Imports.SetTriggerDelay(_handle, 0)); + + Console.WriteLine("Alloc Buffer A (Chan A)"); + short[] Buffer_A = new short[sampleCount]; + + Console.WriteLine("Alloc Buffer B (Chan B)"); + short[] Buffer_B = new short[sampleCount]; + + Console.WriteLine("Buffer ChanA Setzen: {0}", Imports.SetDataBuffer(_handle, Imports.Channel.ChannelA, Buffer_A, sampleCount)); + + Console.WriteLine("Buffer ChanB Setzen: {0}", Imports.SetDataBuffer(_handle, Imports.Channel.ChannelB, Buffer_B, sampleCount)); + + + _ready = false; + int timeIndisposed; + Console.WriteLine("Trigger Starten: {0}", Imports.RunBlock(_handle, 0, (int)sampleCount, _timebase, _oversample, out timeIndisposed, 0, BlockCallback, IntPtr.Zero)); + + Console.WriteLine("======================================================\n" + + "Gestartet, wenn Sie keine Lust mehr haben, drücken sie irgend eine Taste"); + while (!_ready && !Console.KeyAvailable) + { + Thread.Sleep(100); + } + if (Console.KeyAvailable) + Console.ReadKey(true); + + Imports.Stop(_handle); + if (_ready) + { + short overflow; + Console.WriteLine("Bekomme werte zurück: {0}", Imports.GetValues(_handle, 0, ref sampleCount, 1, Imports.DownSamplingMode.None, 0, out overflow)); + Console.WriteLine("Buffergröße {0}", sampleCount); + StreamWriter chan_a = new StreamWriter("Chan_A.txt"); + StreamWriter chan_b = new StreamWriter("Chan_B.txt"); + for (int i = 0; i < sampleCount; i++) + { + chan_a.WriteLine(adc_to_mv(Buffer_A[i], (short)Imports.Range.Range_5V)); + chan_b.WriteLine(adc_to_mv(Buffer_B[i], (short)Imports.Range.Range_1V)); + } + chan_a.Close(); + chan_b.Close(); + Console.WriteLine("Dateien geschrieben!"); + } + } + short mv_to_adc(short mv, short ch) + { + return (short)((mv * Imports.MaxValue) / inputRanges[ch]); + } + int adc_to_mv(int raw, int ch) + { + return (raw * inputRanges[ch]) / Imports.MaxValue; + } + void BlockCallback(short handle, short status, IntPtr pVoid) + { + _ready = true; + } + } +} diff --git a/PicoSopeReader/PicoSopeReader.csproj b/PicoSopeReader/PicoSopeReader.csproj new file mode 100644 index 0000000..2c886a1 --- /dev/null +++ b/PicoSopeReader/PicoSopeReader.csproj @@ -0,0 +1,61 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {DB1DED6E-A9EA-4075-8500-21D1686A64C9} + Exe + Properties + PicoSopeReader + PicoSopeReader + v3.5 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + 3.5 + + + 3.5 + + + 3.5 + + + + + + + + + + + + + \ No newline at end of file diff --git a/PicoSopeReader/Program.cs b/PicoSopeReader/Program.cs new file mode 100644 index 0000000..6671d8d --- /dev/null +++ b/PicoSopeReader/Program.cs @@ -0,0 +1,57 @@ +using System; +using System.Threading; + +namespace PicoSopeReader +{ + class Program + { + static void Main(string[] args) + { + Console.WriteLine("PS5000 Reader Programm"); + Console.WriteLine("Version 1.0\n"); + Console.WriteLine("\n\nGerät öffnen..."); + short handle = 0; + short status = 0; + try + { + status = Imports.OpenUnit(out handle); + } + catch (System.DllNotFoundException) + { + Console.WriteLine("Konnte die Treiber DLL Datei nicht finden! ({0})",Imports._DRIVER_FILENAME); + WaitForKeyAndExit(); + } + catch (Exception e) + { + Console.WriteLine(e); + WaitForKeyAndExit(); + } + finally + { + Console.WriteLine("Handle: {0}", handle); + if (status != 0) + { + Console.WriteLine("Unable to open device"); + Console.WriteLine("Error code : {0}", status); + WaitForKeyAndExit(); + } + else + { + Console.WriteLine("Device opened successfully\n"); + PicoReader prog = new PicoReader(handle); + prog.Run(); + Imports.CloseUnit(handle); + } + } + + } + private static void WaitForKeyAndExit() + { + while (!Console.KeyAvailable) + Thread.Sleep(100); + if (Console.KeyAvailable) + Console.ReadKey(true); + Environment.Exit(1); + } + } +} diff --git a/PicoSopeReader/Properties/AssemblyInfo.cs b/PicoSopeReader/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..9e71f05 --- /dev/null +++ b/PicoSopeReader/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// Allgemeine Informationen über eine Assembly werden über die folgenden +// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern, +// die mit einer Assembly verknüpft sind. +[assembly: AssemblyTitle("PicoSopeReader")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("PicoSopeReader")] +[assembly: AssemblyCopyright("Copyright © 2010")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Durch Festlegen von ComVisible auf "false" werden die Typen in dieser Assembly unsichtbar +// für COM-Komponenten. Wenn Sie auf einen Typ in dieser Assembly von +// COM zugreifen müssen, legen Sie das ComVisible-Attribut für diesen Typ auf "true" fest. +[assembly: ComVisible(false)] + +// Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird +[assembly: Guid("83a98d9b-1322-451c-9d00-d4f2c8b4e822")] + +// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten: +// +// Hauptversion +// Nebenversion +// Buildnummer +// Revision +// +// Sie können alle Werte angeben oder die standardmäßigen Build- und Revisionsnummern +// übernehmen, indem Sie "*" eingeben: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/PicoSopeReader/bin/Release/PicoSopeReader.exe b/PicoSopeReader/bin/Release/PicoSopeReader.exe new file mode 100644 index 0000000..11ee2ab Binary files /dev/null and b/PicoSopeReader/bin/Release/PicoSopeReader.exe differ diff --git a/dotnet example/ConsoleExample.cs b/dotnet example/ConsoleExample.cs new file mode 100644 index 0000000..2a90ed0 --- /dev/null +++ b/dotnet example/ConsoleExample.cs @@ -0,0 +1,1066 @@ + /************************************************************************** + * + * Filename: ConsoleExample.cs + * + * Copyright: Pico Technology Limited 2007 + * + * Author: MJL + * + * Description: + * This is a console-mode program that demonstrates how to use the + * PS5000 driver using .NET + * + * Examples: + * Collect a block of samples immediately + * Collect a block of samples when a trigger event occurs + * Collect a block using ETS + * Collect a stream of data immediately + * Collect a stream of data when a trigger event occurs + * Set Signal Generator, using built in or custom signals + * + * History: + * 14Dec06 MJL Created + * + * Revision Info: "file %n date %f revision %v" + * "" + * + ***************************************************************************/ + +using System; +using System.IO; +using System.Threading; + +namespace ps5000example +{ + struct ChannelSettings + { + public bool DCcoupled; + public Imports.Range range; + public bool enabled; + } + + class Pwq + { + public Imports.PwqConditions[] conditions; + public short nConditions; + public Imports.ThresholdDirection direction; + public uint lower; + public uint upper; + public Imports.PulseWidthType type; + + public Pwq(Imports.PwqConditions[] conditions, + short nConditions, + Imports.ThresholdDirection direction, + uint lower, uint upper, + Imports.PulseWidthType type) + { + this.conditions = conditions; + this.nConditions = nConditions; + this.direction = direction; + this.lower = lower; + this.upper = upper; + this.type = type; + } + } + + class ConsoleExample + { + private readonly short _handle; + public const int BUFFER_SIZE = 1024; + public const int MAX_CHANNELS = 4; + public const int QUAD_SCOPE = 4; + public const int DUAL_SCOPE = 2; + + uint _timebase = 8; + short _oversample = 1; + bool _scaleVoltages = true; + + ushort[] inputRanges = { 10, 20, 50, 100, 200, 500, 1000, 2000, 5000, 10000, 20000, 50000 }; + bool _ready = false; + int _sampleCount; + uint _startIndex; + bool _autoStop; + private ChannelSettings [] _channelSettings; + private int _channelCount; + private Imports.Range _firstRange; + private Imports.Range _lastRange; + private Imports.ps5000BlockReady _callbackDelegate; + + /**************************************************************************** + * Callback + * used by PS5000 data streaimng collection calls, on receipt of data. + * used to set global flags etc checked by user routines + ****************************************************************************/ + void StreamingCallback(short handle, + int noOfSamples, + uint startIndex, + short ov, + uint triggerAt, + short triggered, + short autoStop, + IntPtr pVoid) + { + // used for streaming + _sampleCount = noOfSamples; + _startIndex = startIndex; + _autoStop = autoStop != 0; + + // flag to say done reading data + _ready = true; + } + + /**************************************************************************** + * Callback + * used by PS5000 data block collection calls, on receipt of data. + * used to set global flags etc checked by user routines + ****************************************************************************/ + void BlockCallback(short handle, short status, IntPtr pVoid) + { + // flag to say done reading data + _ready = true; + } + + /**************************************************************************** + * SetDefaults - restore default settings + ****************************************************************************/ + void SetDefaults() + { + int sampleTime; + Imports.SetEts(_handle, Imports.EtsMode.Off, 0, 0, out sampleTime); // Turn off ETS + + for (int i = 0; i < _channelCount; i++) // reset channels to most recent settings + { + Imports.SetChannel(_handle, Imports.Channel.ChannelA + i, + (short)(_channelSettings[(int)(Imports.Channel.ChannelA + i)].enabled ? 1 : 0), + (short) (_channelSettings[(int)(Imports.Channel.ChannelA + i)].DCcoupled ? 1 : 0), + _channelSettings[(int)(Imports.Channel.ChannelA + i)].range); + } + } + + /**************************************************************************** + * adc_to_mv + * + * If the user selects scaling to millivolts, + * Convert an 16-bit ADC count into millivolts + ****************************************************************************/ + int adc_to_mv(int raw, int ch) + { + return (_scaleVoltages) ? (raw * inputRanges[ch]) / Imports.MaxValue : raw; + } + + /**************************************************************************** + * mv_to_adc + * + * Convert a millivolt value into a 16-bit ADC count + * + * (useful for setting trigger thresholds) + ****************************************************************************/ + short mv_to_adc(short mv, short ch) + { + return (short)((mv * Imports.MaxValue) / inputRanges[ch]); + } + + /**************************************************************************** + * BlockDataHandler + * - Used by all block data routines + * - acquires data (user sets trigger mode before calling), displays 10 items + * and saves all to data.txt + * Input : + * - unit : the unit to use. + * - text : the text to display before the display of data slice + * - offset : the offset into the data buffer to start the display's slice. + ****************************************************************************/ + void BlockDataHandler(string text, int offset) + { + uint sampleCount = BUFFER_SIZE; + PinnedArray[] minPinned = new PinnedArray[_channelCount]; + PinnedArray[] maxPinned = new PinnedArray[_channelCount]; + + int timeIndisposed; + + for (int i = 0; i < _channelCount; i++) + { + short [] minBuffers = new short[sampleCount]; + short [] maxBuffers = new short[sampleCount]; + minPinned[i] = new PinnedArray(minBuffers); + maxPinned[i] = new PinnedArray(maxBuffers); + Imports.SetDataBuffers(_handle, (Imports.Channel)i, minBuffers, maxBuffers, (int)sampleCount); + } + + /* find the maximum number of samples, the time interval (in timeUnits), + * the most suitable time units, and the maximum _oversample at the current _timebase*/ + int timeInterval; + int maxSamples; + while (Imports.GetTimebase(_handle, _timebase, (int)sampleCount, out timeInterval, _oversample, out maxSamples, 0) != 0) + { + _timebase++; + } + Console.WriteLine("Timebase: {0}\toversample:{1}", _timebase, _oversample); + + /* Start it collecting, then wait for completion*/ + _ready = false; + _callbackDelegate = BlockCallback; + Imports.RunBlock(_handle, 0, (int)sampleCount, _timebase, _oversample, out timeIndisposed, 0, _callbackDelegate, + IntPtr.Zero); + + /*Console.WriteLine("Run Block : {0}", status);*/ + Console.WriteLine("Waiting for data...Press a key to abort"); + + while (!_ready && !Console.KeyAvailable) + { + Thread.Sleep(100); + } + if(Console.KeyAvailable) Console.ReadKey(true); // clear the key + + Imports.Stop(_handle); + + if (_ready) + { + short overflow; + Imports.GetValues(_handle, 0, ref sampleCount, 1, Imports.DownSamplingMode.None, 0, out overflow); + + /* Print out the first 10 readings, converting the readings to mV if required */ + Console.WriteLine(text); + Console.WriteLine("Value {0}", (_scaleVoltages) ? ("mV") : ("ADC Counts")); + + for (int i = offset; i < offset + 10; i++) + { + for (int j = 0; j < _channelCount; j++) + { + if (_channelSettings[j].enabled) + { + Console.Write("{0}\t", adc_to_mv(minPinned[j].Target[i], (int)_channelSettings[(int)(Imports.Channel.ChannelA + j)].range)); + } + } + Console.WriteLine(); + } + + sampleCount = Math.Min(sampleCount, BUFFER_SIZE); + TextWriter writer = new StreamWriter("data.txt", false); + for (int i = 0; i < sampleCount; i++) + { + for (int j = 0; j < _channelCount; j++) + { + writer.Write("{0}", (i * timeInterval)); + if (_channelSettings[j].enabled) + { + writer.WriteLine(", {0}, {1}, {2}, {3}", + minPinned[j].Target[i], + adc_to_mv(minPinned[j].Target[i], + (int)_channelSettings[(int)(Imports.Channel.ChannelA + j)].range), + maxPinned[j].Target[i], + adc_to_mv(maxPinned[j].Target[i], + (int)_channelSettings[(int)(Imports.Channel.ChannelA + j)].range)); + } + } + writer.WriteLine(); + } + writer.Close(); + } + else + { + Console.WriteLine("data collection aborted"); + WaitForKey(); + } + } + private void RapidBlockDataHandler(ushort nRapidCaptures) + { + short status; + int numChannels = _channelCount; + uint numSamples = BUFFER_SIZE; + + // Run the rapid block capture + int timeIndisposed; + _ready = false; + + _callbackDelegate = BlockCallback; + Imports.RunBlock(_handle, + 0, + (int)numSamples, + _timebase, + _oversample, + out timeIndisposed, + 0, + _callbackDelegate, + IntPtr.Zero); + + + // Set up the data arrays and pin them + short[][][] values = new short[nRapidCaptures][][]; + PinnedArray[,] pinned = new PinnedArray[nRapidCaptures, numChannels]; + + for (ushort segment = 0; segment < nRapidCaptures; segment++) + { + values[segment] = new short[numChannels][]; + for (short channel = 0; channel < numChannels; channel++) + { + if (_channelSettings[channel].enabled) + { + values[segment][channel] = new short[numSamples]; + pinned[segment, channel] = new PinnedArray(values[segment][channel]); + + status = Imports.SetDataBuffersRapid(_handle, + (Imports.Channel)channel, + values[segment][channel], + (int)numSamples, + segment); + } + else + { + status = Imports.SetDataBuffersRapid(_handle, + (Imports.Channel)channel, + null, + 0, + segment); + + } + } + } + + // Read the data + short [] overflows = new short[nRapidCaptures]; + + status = Imports.GetValuesRapid(_handle, ref numSamples, 0, (ushort)(nRapidCaptures - 1), overflows); + + + // Un-pin the arrays + foreach (PinnedArray p in pinned) + { + if (p != null) + p.Dispose(); + } + + //TODO: Do what ever is required with the data here. + } + + short SetTrigger(Imports.TriggerChannelProperties[] channelProperties, short nChannelProperties, Imports.TriggerConditions[] triggerConditions, short nTriggerConditions, Imports.ThresholdDirection[] directions, Pwq pwq, uint delay, short auxOutputEnabled, int autoTriggerMs) + { + short status; + + if ( + (status = + Imports.SetTriggerChannelProperties(_handle, channelProperties, nChannelProperties, auxOutputEnabled, + autoTriggerMs)) != 0) + { + return status; + } + + if ((status = Imports.SetTriggerChannelConditions(_handle, triggerConditions, nTriggerConditions)) != 0) + { + return status; + } + + if (directions == null) directions = new Imports.ThresholdDirection[] { Imports.ThresholdDirection.None, + Imports.ThresholdDirection.None, Imports.ThresholdDirection.None, Imports.ThresholdDirection.None, + Imports.ThresholdDirection.None, Imports.ThresholdDirection.None}; + + if ((status = Imports.SetTriggerChannelDirections(_handle, + directions[(int)Imports.Channel.ChannelA], + directions[(int)Imports.Channel.ChannelB], + directions[(int)Imports.Channel.ChannelC], + directions[(int)Imports.Channel.ChannelD], + directions[(int)Imports.Channel.External], + directions[(int)Imports.Channel.Aux])) != 0) + { + return status; + } + + if ((status = Imports.SetTriggerDelay(_handle, delay)) != 0) + { + return status; + } + + if (pwq == null) pwq = new Pwq(null, 0, Imports.ThresholdDirection.None, 0, 0, Imports.PulseWidthType.None); + + status = Imports.SetPulseWidthQualifier(_handle, pwq.conditions, + pwq.nConditions, pwq.direction, + pwq.lower, pwq.upper, pwq.type); + + return status; + } + + /**************************************************************************** + * CollectBlockImmediate + * this function demonstrates how to collect a single block of data + * from the unit (start collecting immediately) + ****************************************************************************/ + void CollectBlockImmediate() + { + Console.WriteLine("Collect block immediate..."); + Console.WriteLine("Press a key to start"); + WaitForKey(); + + SetDefaults(); + + /* Trigger disabled */ + SetTrigger(null, 0, null, 0, null, null, 0, 0, 0); + + BlockDataHandler("First 10 readings", 0); + } + + void CollectBlockRapid() + { + + ushort numRapidCaptures; + + Console.WriteLine("Collect rapid block..."); + Console.WriteLine("Specify number of captures:"); + do + { + numRapidCaptures = ushort.Parse(Console.ReadLine()); + } while (Imports.SetNoOfRapidCaptures(_handle, numRapidCaptures) > 0); + + int maxSamples; + Imports.MemorySegments(_handle, numRapidCaptures, out maxSamples); + + Console.WriteLine("Collecting {0} rapid blocks. Press a key to start", numRapidCaptures); + + WaitForKey(); + + SetDefaults(); + + /* Trigger is optional, disable it for now */ + SetTrigger(null, 0, null, 0, null, null, 0, 0, 0); + + RapidBlockDataHandler(numRapidCaptures); + } + + + + private static void WaitForKey() + { + while(!Console.KeyAvailable) Thread.Sleep(100); + if (Console.KeyAvailable) Console.ReadKey(true); // clear the key + } + + /**************************************************************************** + * CollectBlockEts + * this function demonstrates how to collect a block of + * data using equivalent time sampling (ETS). + ****************************************************************************/ + + void CollectBlockEts() + { + int ets_sampletime; + short triggerVoltage = mv_to_adc(100, (short)_channelSettings[(int)Imports.Channel.ChannelA].range); // ChannelInfo stores ADC counts + Imports.TriggerChannelProperties[] sourceDetails = new Imports.TriggerChannelProperties[] { + new Imports.TriggerChannelProperties( triggerVoltage, triggerVoltage, 10, Imports.Channel.ChannelA, Imports.ThresholdMode.Level )}; + + Imports.TriggerConditions[] conditions = new Imports.TriggerConditions[] { + new Imports.TriggerConditions(Imports.TriggerState.True, + Imports.TriggerState.DontCare, + Imports.TriggerState.DontCare, + Imports.TriggerState.DontCare, + Imports.TriggerState.DontCare, + Imports.TriggerState.DontCare, + Imports.TriggerState.DontCare)}; + + Imports.ThresholdDirection[] directions = new Imports.ThresholdDirection[] + { Imports.ThresholdDirection.Rising, + Imports.ThresholdDirection.None, + Imports.ThresholdDirection.None, + Imports.ThresholdDirection.None, + Imports.ThresholdDirection.None, + Imports.ThresholdDirection.None }; + + Console.WriteLine("Collect ETS block..."); + Console.WriteLine("Collects when value rises past {0}mV", adc_to_mv(sourceDetails[0].ThresholdMajor, + (int)_channelSettings[(int)Imports.Channel.ChannelA].range)); + Console.WriteLine("Press a key to start..."); + + WaitForKey(); + + SetDefaults(); + + /* Trigger enabled + * Rising edge + * Threshold = 1500mV + * 10% pre-trigger (negative is pre-, positive is post-) */ + short status = SetTrigger(sourceDetails, 1, conditions, 1, directions, null, 0, 0, 0); + + Console.WriteLine("Set Trigger : {0}", status); + + /* Enable ETS in fast mode, the computer will store 100 cycles but interleave only 10 */ + status = Imports.SetEts(_handle, Imports.EtsMode.Fast, 20, 4, out ets_sampletime); + Console.WriteLine("Set ETS : {0}", status); + Console.WriteLine("ETS Sample Time is: {0}", ets_sampletime); + + BlockDataHandler("Ten readings after trigger", BUFFER_SIZE / 10 - 5); // 10% of data is pre-trigger + } + + /**************************************************************************** + * CollectBlockTriggered + * this function demonstrates how to collect a single block of data from the + * unit, when a trigger event occurs. + ****************************************************************************/ + void CollectBlockTriggered() + { + short triggerVoltage = mv_to_adc(1000, (short)_channelSettings[(int)Imports.Channel.ChannelA].range); // ChannelInfo stores ADC counts + Imports.TriggerChannelProperties[] sourceDetails = new Imports.TriggerChannelProperties[] { + new Imports.TriggerChannelProperties(triggerVoltage, + triggerVoltage, + 256*10, + Imports.Channel.ChannelA, + Imports.ThresholdMode.Level)}; + + Imports.TriggerConditions[] conditions = new Imports.TriggerConditions[] { + new Imports.TriggerConditions(Imports.TriggerState.True, + Imports.TriggerState.DontCare, + Imports.TriggerState.DontCare, + Imports.TriggerState.DontCare, + Imports.TriggerState.DontCare, + Imports.TriggerState.DontCare, + Imports.TriggerState.DontCare)}; + + Imports.ThresholdDirection[] directions = new Imports.ThresholdDirection[] + { Imports.ThresholdDirection.Falling, + Imports.ThresholdDirection.None, + Imports.ThresholdDirection.None, + Imports.ThresholdDirection.None, + Imports.ThresholdDirection.None, + Imports.ThresholdDirection.None }; + + Console.WriteLine("Collect block triggered..."); + Console.WriteLine("Collects when value rises past {0}mV", + adc_to_mv(sourceDetails[0].ThresholdMajor, + (int)_channelSettings[(int)Imports.Channel.ChannelA].range)); + Console.WriteLine("Press a key to start..."); + WaitForKey(); + + SetDefaults(); + + /* Trigger enabled + * Rising edge + * Threshold = 100mV */ + SetTrigger(sourceDetails, 1, conditions, 1, directions, null, 0, 0, 0); + + BlockDataHandler("Ten readings after trigger", 0); + } + + /**************************************************************************** + * Initialise unit' structure with Variant specific defaults + ****************************************************************************/ + void GetDeviceInfo() + { + string[] description = { + "Driver Version", + "USB Version", + "Hardware Version", + "Variant Info", + "Serial", + "Error Code" + }; + System.Text.StringBuilder line = new System.Text.StringBuilder(80); + + if (_handle >= 0) + { + + for (int i = 0; i < 5; i++) + { + short requiredSize; + Imports.GetUnitInfo(_handle, line, 80, out requiredSize, i); + Console.WriteLine("{0}: {1}", description[i], line); + } + } + } + + /**************************************************************************** + * Select input voltage ranges for channels A and B + ****************************************************************************/ + void SetVoltages() + { + /* See what ranges are available... */ + for (int i = (int)_firstRange; i <= (int)_lastRange; i++) + { + Console.WriteLine("{0} . {1} mV", i, inputRanges[i]); + } + + /* Ask the user to select a range */ + Console.WriteLine("Specify voltage range ({0}..{1})", _firstRange, _lastRange); + Console.WriteLine("99 - switches channel off"); + for (int ch = 0; ch < _channelCount; ch++) + { + Console.WriteLine(""); + uint range; + do + { + Console.WriteLine("Channel: {0}", (char)('A' + ch)); + range = uint.Parse(Console.ReadLine()); + } while (range != 99 && (range < (uint)_firstRange || range > (uint)_lastRange)); + + + if (range != 99) + { + _channelSettings[ch].range = (Imports.Range)range; + Console.WriteLine(" - {0} mV", inputRanges[range]); + _channelSettings[ch].enabled = true; + } + else + { + Console.WriteLine("Channel Switched off"); + _channelSettings[ch].enabled = false; + } + } + } + + /**************************************************************************** + * + * Select _timebase, set _oversample to on and time units as nano seconds + * + ****************************************************************************/ + void SetTimebase() + { + int timeInterval; + int maxSamples; + + Console.WriteLine("Specify timebase (not 0): "); + do + { + _timebase = uint.Parse(Console.ReadLine()); + } while (_timebase == 0); + + Imports.GetTimebase(_handle, _timebase, BUFFER_SIZE, out timeInterval, 1, out maxSamples, 0); + Console.WriteLine("Timebase {0} - {1} ns", _timebase, timeInterval); + _oversample = 1; + } + + /**************************************************************************** + * Toggles the signal generator + * - allows user to set frequency and waveform + * - allows for custom waveform (values 0..4192) of up to 8192 samples long + ***************************************************************************/ + void SetSignalGenerator() + { + short status; + short waveform; + long frequency; + + short[] arbitraryWaveform = new short[8192]; + short waveformSize = 0; + + Console.WriteLine("Enter frequency in Hz: "); // Ask user to enter signal frequency; + do + { + frequency = long.Parse(Console.ReadLine()); + } while (frequency < 1000 || frequency > 10000000); + + if (frequency > 0) // Ask user to enter type of signal + { + Console.WriteLine("Signal generator On"); + Console.WriteLine("Enter type of waveform (0..9 or 99)"); + Console.WriteLine("0:\tSINE"); + Console.WriteLine("1:\tSQUARE"); + Console.WriteLine("2:\tTRIANGLE"); + Console.WriteLine("99:\tUSER WAVEFORM"); + Console.WriteLine(" \t(see manual for more)"); + + do + { + waveform = short.Parse(Console.ReadLine()); + } while (waveform != 99 && (waveform < 0 || waveform >= (short)Imports.SiggenWaveType.MAX_WAVE_TYPES)); + + if (waveform == 99) // custom waveform selected - user needs to select file + { + waveformSize = 0; + + Console.WriteLine("Select a waveform file to load: "); + string fileName; + fileName = Console.ReadLine(); + if (File.Exists(fileName)) + { + TextReader reader = new StreamReader(fileName); + // Having opened file, read in data - one number per line (at most 8192 lines), with values in (0..4191) + string text = reader.ReadLine(); + while (text != null && waveformSize < arbitraryWaveform.Length) + { + arbitraryWaveform[waveformSize++] = short.Parse(text); + text = reader.ReadLine(); + } + } + else + { + Console.WriteLine("Invalid filename"); + return; + } + } + } + else + { + waveform = 0; + Console.WriteLine("Signal generator Off"); + } + + if (waveformSize > 0) + { + double delta = ((frequency * waveformSize) / 8192) * 4294967296.0 * 8e-9; // delta >= 10 + status = Imports.SetSiggenArbitrary(_handle, 0, 4000000, (uint)delta, (uint)delta, 0, 0, arbitraryWaveform, + (uint)waveformSize, Imports.SiggenSweepType.Up, false, Imports.SiggenIndexMode.Single, 0, 0, + Imports.SiggenTrigType.Rising, Imports.SiggenTrigSource.None, 0); + } + else + { + status = Imports.SetSiggenBuiltIn(_handle, 0, 4000000, (Imports.SiggenWaveType)waveform, frequency, frequency, 0, 0, + Imports.SiggenSweepType.Up, false, 0, 0, Imports.SiggenTrigType.Rising, Imports.SiggenTrigSource.None, 0); + } + Console.WriteLine("Set Signal Generator : {0}", status); + } + + /**************************************************************************** + * Stream Data Handler + * - Used by the two stream data examples - untriggered and triggered + * Inputs: + * - unit - the unit to sample on + * - preTrigger - the number of samples in the pre-trigger phase + * (0 if no trigger has been set) + ***************************************************************************/ + void StreamDataHandler(uint preTrigger) + { + uint sampleCount = BUFFER_SIZE*10; /* *10 is to make sure buffer large enough */ + short[][] minBuffers = new short[_channelCount][]; + short[][] maxBuffers = new short[_channelCount][]; + + uint sampleInterval = 1; + + for (int i = 0; i < _channelCount; i++) // create data buffers + { + minBuffers[i] = new short[sampleCount]; + maxBuffers[i] = new short[sampleCount]; + Imports.SetDataBuffers(_handle, (Imports.Channel) i, minBuffers[i], maxBuffers[i], (int) sampleCount); + } + + Console.WriteLine("Waiting for trigger...Press a key to abort"); + _autoStop = false; + short status = Imports.RunStreaming(_handle, ref sampleInterval, Imports.ReportedTimeUnits.MicroSeconds, + preTrigger, 1000000 - preTrigger, true, 1000, sampleCount); + Console.WriteLine("Run Streaming : {0} ", status); + + Console.WriteLine("Streaming data...Press a key to abort"); + + TextWriter writer = new StreamWriter("test.out", false); + while (!_autoStop && !Console.KeyAvailable) + { + /* Poll until data is received. Until then, GetStreamingLatestValues wont call the callback */ + Thread.Sleep(100); + _ready = false; + Imports.GetStreamingLatestValues(_handle, StreamingCallback, IntPtr.Zero); + + if (_ready && _sampleCount > 0) /* can be ready and have no data, if autoStop has fired */ + { + Console.WriteLine("Collected {0} samples, index = {1}", _sampleCount, _startIndex); + + for (uint i = _startIndex; i < (_startIndex + _sampleCount); i++) + { + for (int j = 0; j < _channelCount; j++) + { + if (_channelSettings[j].enabled) + { + writer.Write("{0}, {1}, {2}, {3},", + minBuffers[j][i], + adc_to_mv(minBuffers[j][i], (int) _channelSettings[(int) (Imports.Channel.ChannelA + j)].range), + maxBuffers[j][i], + adc_to_mv(maxBuffers[j][i], (int) _channelSettings[(int) (Imports.Channel.ChannelA + j)].range)); + } + } + writer.WriteLine(); + } + } + } + if (Console.KeyAvailable) Console.ReadKey(true); // clear the key + + Imports.Stop(_handle); + writer.Close(); + + if (!_autoStop) + { + Console.WriteLine("data collection aborted"); + WaitForKey(); + } + } + + + /**************************************************************************** + * CollectStreamingImmediate + * this function demonstrates how to collect a stream of data + * from the unit (start collecting immediately) + ***************************************************************************/ + void CollectStreamingImmediate() + { + SetDefaults(); + + Console.WriteLine("Collect streaming..."); + Console.WriteLine("Data is written to disk file (test.out)"); + Console.WriteLine("Press a key to start"); + WaitForKey(); + + /* Trigger disabled */ + SetTrigger(null, 0, null, 0, null, null, 0, 0, 0); + + StreamDataHandler(0); + } + + /**************************************************************************** + * CollectStreamingTriggered + * this function demonstrates how to collect a stream of data + * from the unit (start collecting on trigger) + ***************************************************************************/ + void CollectStreamingTriggered() + { + short triggerVoltage = mv_to_adc( 100, (short) _channelSettings[(int) Imports.Channel.ChannelA].range); // ChannelInfo stores ADC counts + + Imports.TriggerChannelProperties[] sourceDetails = new Imports.TriggerChannelProperties[] { + new Imports.TriggerChannelProperties( triggerVoltage, triggerVoltage, 256 * 10, Imports.Channel.ChannelA, Imports.ThresholdMode.Level )}; + + Imports.TriggerConditions[] conditions = new Imports.TriggerConditions[] { + new Imports.TriggerConditions(Imports.TriggerState.True, + Imports.TriggerState.DontCare, + Imports.TriggerState.DontCare, + Imports.TriggerState.DontCare, + Imports.TriggerState.DontCare, + Imports.TriggerState.DontCare, + Imports.TriggerState.DontCare)}; + + Imports.ThresholdDirection[] directions = new Imports.ThresholdDirection[] + { Imports.ThresholdDirection.Rising, + Imports.ThresholdDirection.None, + Imports.ThresholdDirection.None, + Imports.ThresholdDirection.None, + Imports.ThresholdDirection.None, + Imports.ThresholdDirection.None }; + + Console.WriteLine("Collect streaming triggered..."); + Console.WriteLine("Data is written to disk file (test.out)"); + Console.WriteLine("Press a key to start"); + WaitForKey(); + SetDefaults(); + + /* Trigger enabled + * Rising edge + * Threshold = 100mV */ + + SetTrigger(sourceDetails, 1, conditions, 1, directions, null, 0, 0, 0); + + StreamDataHandler(100000); + } + + public void Run() + { + // setup devices + GetDeviceInfo(); + _timebase = 1; + + _firstRange = Imports.Range.Range_100MV; + _lastRange = Imports.Range.Range_20V; + _channelCount = DUAL_SCOPE; + _channelSettings = new ChannelSettings[MAX_CHANNELS]; + + for (int i = 0; i < MAX_CHANNELS; i++) + { + _channelSettings[i].enabled = true; + _channelSettings[i].DCcoupled = true; + _channelSettings[i].range = Imports.Range.Range_5V; + } + + // main loop - read key and call routine + char ch = ' '; + while (ch != 'X') + { + Console.WriteLine(""); + Console.WriteLine("B - immediate block V - Set voltages"); + Console.WriteLine("T - triggered block I - Set timebase"); + Console.WriteLine("R - rapid block F - toggle signal generator on/off"); + Console.WriteLine("E - ETS block A - ADC counts/mV"); + Console.WriteLine("S - immediate streaming Y - KölscheJung"); + Console.WriteLine("W - triggered streaming"); + Console.WriteLine(" X - exit"); + Console.WriteLine("Operation:"); + + ch = char.ToUpper(Console.ReadKey().KeyChar); + + Console.WriteLine("\n"); + switch (ch) + { + case 'B': + CollectBlockImmediate(); + break; + + case 'T': + CollectBlockTriggered(); + break; + + case 'R': + CollectBlockRapid(); + break; + + case 'S': + CollectStreamingImmediate(); + break; + + case 'W': + CollectStreamingTriggered(); + break; + + case 'F': + SetSignalGenerator(); + break; + + case 'E': + CollectBlockEts(); + break; + + case 'V': + SetVoltages(); + break; + + case 'I': + SetTimebase(); + break; + + case 'A': + _scaleVoltages = !_scaleVoltages; + if (_scaleVoltages) + { + Console.WriteLine("Readings will be scaled in mV"); + } + else + { + Console.WriteLine("Readings will be scaled in ADC counts"); + } + break; + + case 'X': + /* Handled by outer loop */ + break; + case 'Y': + Console.WriteLine("Fun27"); + Meins(); + break; + + default: + Console.WriteLine("Invalid operation"); + break; + } + } + } + + private void Meins() + { + Console.WriteLine("Chan A einschalten und auf 5V: {0}", Imports.SetChannel(_handle, Imports.Channel.ChannelA, 1, 1, Imports.Range.Range_5V)); + + Console.WriteLine("Chan B einschalten und auf 1V: {0}", Imports.SetChannel(_handle, Imports.Channel.ChannelB, 1, 1, Imports.Range.Range_1V)); + + int tmp; + Console.WriteLine("Disable ETS: {0}", Imports.SetEts(_handle, Imports.EtsMode.Off, 0, 0,out tmp)); + + int timeInterval; + int maxSamples; + uint sampleCount = (int)(1*1e6); + _timebase = 5; //timebase = 5 => 24ns => 40mhz + _oversample = 1; + //(noSamples = Maximum Samples, oversample = 1, segemnt Index = 0); + Console.WriteLine("Zeit Setzen: {0}", Imports.GetTimebase(_handle, _timebase, (int)sampleCount, out timeInterval, _oversample, out maxSamples, 0)); + + short triggerVoltage = mv_to_adc(3000, (short)Imports.Range.Range_5V); + Console.WriteLine("max {0} {1}:", Imports.MaxValue, triggerVoltage); + + Imports.TriggerChannelProperties[] sourceDetails = new Imports.TriggerChannelProperties[] { + new Imports.TriggerChannelProperties( + triggerVoltage, + triggerVoltage, + 1, + Imports.Channel.ChannelA, + Imports.ThresholdMode.Level)}; + Console.WriteLine("Trigger Einstellungen auf Chan A setzen: {0}", Imports.SetTriggerChannelProperties(_handle, sourceDetails, (short)sourceDetails.Length, 0, 0)); + + Imports.TriggerConditions[] cond = new Imports.TriggerConditions[] { + new Imports.TriggerConditions( + Imports.TriggerState.True, + Imports.TriggerState.DontCare, + Imports.TriggerState.DontCare, + Imports.TriggerState.DontCare, + Imports.TriggerState.DontCare, + Imports.TriggerState.DontCare, + Imports.TriggerState.DontCare)}; + Console.WriteLine("Trigger Bedingung auf Chan A setzen: {0}", Imports.SetTriggerChannelConditions(_handle, cond, (short)cond.Length)); + + Imports.ThresholdDirection dir_i = Imports.ThresholdDirection.Falling; + Imports.ThresholdDirection dir_n = Imports.ThresholdDirection.None; + Console.WriteLine("Trigger Richtung auf Chan A setzen: {0}", Imports.SetTriggerChannelDirections(_handle, dir_i, dir_n, dir_n, dir_n, dir_n, dir_n)); + + Console.WriteLine("Trigger Verzögerung setzen: {0}", Imports.SetTriggerDelay(_handle, 0)); + + Console.WriteLine("Alloc Buffer A (Chan A)"); + short[] Buffer_A = new short[sampleCount]; + + Console.WriteLine("Alloc Buffer B (Chan B)"); + short[] Buffer_B = new short[sampleCount]; + + Console.WriteLine("Buffer ChanA Setzen: {0}", Imports.SetDataBuffer(_handle, Imports.Channel.ChannelA, Buffer_A, sampleCount)); + + Console.WriteLine("Buffer ChanB Setzen: {0}", Imports.SetDataBuffer(_handle, Imports.Channel.ChannelB, Buffer_B, sampleCount)); + + + _ready = false; + int timeIndisposed; + Console.WriteLine("Trigger Starten: {0}", Imports.RunBlock(_handle, 0, (int)sampleCount, _timebase, _oversample, out timeIndisposed, 0, BlockCallback, IntPtr.Zero)); + + Console.WriteLine("======================================================\n" + + "Gestartet, wenn Sie keine Lust mehr haben, drücken sie irgend eine Taste"); + while (!_ready && !Console.KeyAvailable) + { + Thread.Sleep(100); + } + if (Console.KeyAvailable) + Console.ReadKey(true); + + Imports.Stop(_handle); + if (_ready) + { + short overflow; + Console.WriteLine("Bekomme werte zurück: {0}", Imports.GetValues(_handle, 0, ref sampleCount, 1, Imports.DownSamplingMode.None, 0, out overflow)); + Console.WriteLine("Buffergröße {0}", sampleCount); + StreamWriter chan_a = new StreamWriter("Chan_A.txt"); + StreamWriter chan_b = new StreamWriter("Chan_B.txt"); + for (int i = 0; i < sampleCount; i++) + { + chan_a.WriteLine(adc_to_mv(Buffer_A[i], (short)Imports.Range.Range_5V)); + chan_b.WriteLine(adc_to_mv(Buffer_B[i], (short)Imports.Range.Range_1V)); + } + chan_a.Close(); + chan_b.Close(); + Console.WriteLine("Dateien geschrieben!"); + } + } + + private ConsoleExample(short handle) + { + _handle = handle; + } + + static void Main() + { + Console.WriteLine("PS5000 driver example program"); + Console.WriteLine("Version 1.0\n"); + + //open unit and show splash screen + Console.WriteLine("\n\nOpening the device..."); + short handle; + short status = Imports.OpenUnit(out handle); + Console.WriteLine("Handle: {0}", handle); + if (status != 0) + { + Console.WriteLine("Unable to open device"); + Console.WriteLine("Error code : {0}", status); + WaitForKey(); + } + else + { + Console.WriteLine("Device opened successfully\n"); + + ConsoleExample consoleExample = new ConsoleExample(handle); + consoleExample.Run(); + + Imports.CloseUnit(handle); + } + } + } +} diff --git a/dotnet example/Imports.cs b/dotnet example/Imports.cs new file mode 100644 index 0000000..22db5c4 --- /dev/null +++ b/dotnet example/Imports.cs @@ -0,0 +1,478 @@ +/************************************************************************** +* +* Filename: Imports.cs +* +* Copyright: Pico Technology Limited 2007 +* +* Author: MJL +* +* Description: +* This file contains all the .NET wrapper calls needed to support +* the console example. It also has the enums and structs required +* by the (wrapped) function calls. +* +* History: +* 14Dec06 MJL Created +* +* Revision Info: "file %n date %f revision %v" +* "" +* +***************************************************************************/ + +using System; +using System.Runtime.InteropServices; +using System.Text; + +namespace ps5000example +{ + class Imports + { + #region constants + private const string _DRIVER_FILENAME = "ps5000.dll"; + + public const int MaxValue = 32512; + #endregion + + #region Driver enums + + public enum Channel : int + { + ChannelA, + ChannelB, + ChannelC, + ChannelD, + External, + Aux, + None, + } + + public enum Range : int + { + Range_10MV, + Range_20MV, + Range_50MV, + Range_100MV, + Range_200MV, + Range_500MV, + Range_1V, + Range_2V, + Range_5V, + Range_10V, + Range_20V, + Range_50V, + } + + public enum ReportedTimeUnits : int + { + FemtoSeconds, + PicoSeconds, + NanoSeconds, + MicroSeconds, + MilliSeconds, + Seconds, + } + + public enum SiggenWaveType : int + { + Sine, + Square, + Triangle, + RampUp, + RampDown, + SinXOverX, + Gaussian, + HalfSine, + DcVoltage, + MAX_WAVE_TYPES + } + + public enum SiggenSweepType : int + { + Up, + Down, + UpDown, + DownUp + } + + public enum SiggenTrigType : int + { + Rising, + Falling, + GateHigh, + GateLow + } + + public enum SiggenTrigSource : int + { + None, + ScopeTrigger, + AuxIn, + ExtIn, + SoftwareTrigger + } + + public enum SiggenIndexMode : int + { + Single, + Dual, + Quad, + } + + public enum EtsMode : int + { + Off, + Fast, + Slow, + } + + public enum ThresholdMode : int + { + Level, + Window + } + + public enum ThresholdDirection : int + { + // Values for level threshold mode + // + Above, + Below, + Rising, + Falling, + RisingOrFalling, + + // Values for window threshold mode + // + Inside = Above, + Outside = Below, + Enter = Rising, + Exit = Falling, + EnterOrExit = RisingOrFalling, + + None = Rising, + } + + public enum DownSamplingMode : int + { + None, + Aggregate + } + + public enum PulseWidthType : int + { + None, + LessThan, + GreaterThan, + InRange, + OutOfRange + } + + public enum TriggerState : int + { + DontCare, + True, + False, + } + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct TriggerChannelProperties + { + public short ThresholdMajor; + public short ThresholdMinor; + public ushort Hysteresis; + public Channel Channel; + public ThresholdMode ThresholdMode; + + + public TriggerChannelProperties( + short thresholdMajor, + short thresholdMinor, + ushort hysteresis, + Channel channel, + ThresholdMode thresholdMode) + { + this.ThresholdMajor = thresholdMajor; + this.ThresholdMinor = thresholdMinor; + this.Hysteresis = hysteresis; + this.Channel = channel; + this.ThresholdMode = thresholdMode; + } + } + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct TriggerConditions + { + public TriggerState ChannelA; + public TriggerState ChannelB; + public TriggerState ChannelC; + public TriggerState ChannelD; + public TriggerState External; + public TriggerState Aux; + public TriggerState Pwq; + + public TriggerConditions( + TriggerState channelA, + TriggerState channelB, + TriggerState channelC, + TriggerState channelD, + TriggerState external, + TriggerState aux, + TriggerState pwq) + { + this.ChannelA = channelA; + this.ChannelB = channelB; + this.ChannelC = channelC; + this.ChannelD = channelD; + this.External = external; + this.Aux = aux; + this.Pwq = pwq; + } + } + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct PwqConditions + { + public TriggerState ChannelA; + public TriggerState ChannelB; + public TriggerState ChannelC; + public TriggerState ChannelD; + public TriggerState External; + public TriggerState Aux; + + public PwqConditions( + TriggerState channelA, + TriggerState channelB, + TriggerState channelC, + TriggerState channelD, + TriggerState external, + TriggerState aux) + { + this.ChannelA = channelA; + this.ChannelB = channelB; + this.ChannelC = channelC; + this.ChannelD = channelD; + this.External = external; + this.Aux = aux; + } + } + #endregion + + #region Driver Imports + #region Callback delegates + public delegate void ps5000BlockReady(short handle, short status, IntPtr pVoid); + + public delegate void ps5000StreamingReady( + short handle, + int noOfSamples, + uint startIndex, + short ov, + uint triggerAt, + short triggered, + short autoStop, + IntPtr pVoid); + + public delegate void ps5000DataReady( + short handle, + int noOfSamples, + short overflow, + uint triggerAt, + short triggered, + IntPtr pVoid); + #endregion + + [DllImport(_DRIVER_FILENAME, EntryPoint = "ps5000OpenUnit")] + public static extern short OpenUnit(out short handle); + + [DllImport(_DRIVER_FILENAME, EntryPoint = "ps5000CloseUnit")] + public static extern short CloseUnit(short handle); + + [DllImport(_DRIVER_FILENAME, EntryPoint = "ps5000RunBlock")] + public static extern short RunBlock( + short handle, + int noOfPreTriggerSamples, + int noOfPostTriggerSamples, + uint timebase, + short oversample, + out int timeIndisposedMs, + ushort segmentIndex, + ps5000BlockReady lpPs5000BlockReady, + IntPtr pVoid); + + [DllImport(_DRIVER_FILENAME, EntryPoint = "ps5000Stop")] + public static extern short Stop(short handle); + + [DllImport(_DRIVER_FILENAME, EntryPoint = "ps5000SetChannel")] + public static extern short SetChannel( + short handle, + Channel channel, + short enabled, + short dc, + Range range); + + [DllImport(_DRIVER_FILENAME, EntryPoint = "ps5000SetDataBuffers")] + public static extern short SetDataBuffers( + short handle, + Channel channel, + short[] bufferMax, + short[] bufferMin, + int bufferLth); + + [DllImport(_DRIVER_FILENAME, EntryPoint = "ps5000SetDataBuffer")] + public static extern short SetDataBuffer( + short handle, + Channel channel, + short[] buffer, + long bufferLth); + + [DllImport(_DRIVER_FILENAME, EntryPoint = "ps5000SetEts")] + public static extern short SetEts( + short handle, + EtsMode mode, + short etsCycles, + short etsInterleave, + out int sampleTimePicoseconds); + + [DllImport(_DRIVER_FILENAME, EntryPoint = "ps5000SetTriggerChannelDirections")] + public static extern short SetTriggerChannelDirections( + short handle, + ThresholdDirection channelA, + ThresholdDirection channelB, + ThresholdDirection channelC, + ThresholdDirection channelD, + ThresholdDirection ext, + ThresholdDirection aux); + + [DllImport(_DRIVER_FILENAME, EntryPoint = "ps5000GetTimebase")] + public static extern short GetTimebase( + short handle, + uint timebase, + int noSamples, + out int timeIntervalNanoseconds, + short oversample, + out int maxSamples, + ushort segmentIndex); + + [DllImport(_DRIVER_FILENAME, EntryPoint = "ps5000GetValues")] + public static extern short GetValues( + short handle, + uint startIndex, + ref uint noOfSamples, + uint downSampleRatio, + DownSamplingMode downSampleDownSamplingMode, + ushort segmentIndex, + out short overflow); + + [DllImport(_DRIVER_FILENAME, EntryPoint = "ps5000SetPulseWidthQualifier")] + public static extern short SetPulseWidthQualifier( + short handle, + PwqConditions[] conditions, + short numConditions, + ThresholdDirection direction, + uint lower, + uint upper, + PulseWidthType type); + + [DllImport(_DRIVER_FILENAME, EntryPoint = "ps5000SetTriggerChannelProperties")] + public static extern short SetTriggerChannelProperties( + short handle, + TriggerChannelProperties[] channelProperties, + short numChannelProperties, + short auxOutputEnable, + int autoTriggerMilliseconds); + + [DllImport(_DRIVER_FILENAME, EntryPoint = "ps5000SetTriggerChannelConditions")] + public static extern short SetTriggerChannelConditions( + short handle, + TriggerConditions[] conditions, + short numConditions); + + [DllImport(_DRIVER_FILENAME, EntryPoint = "ps5000SetTriggerDelay")] + public static extern short SetTriggerDelay(short handle, uint delay); + + [DllImport(_DRIVER_FILENAME, EntryPoint = "ps5000GetUnitInfo")] + public static extern short GetUnitInfo(short handle, StringBuilder infoString, short stringLength, out short requiredSize, int info); + + [DllImport(_DRIVER_FILENAME, EntryPoint = "ps5000SetSigGenBuiltIn")] + public static extern short SetSiggenBuiltIn( + short handle, + int offsetVoltage, + uint pkToPk, + SiggenWaveType siggenWaveType, + float startFrequency, + float stopFrequency, + float increment, + float dwellTime, + SiggenSweepType sweepType, + bool whiteNoise, + uint shots, + uint sweeps, + SiggenTrigType triggerType, + SiggenTrigSource triggerSource, + short extInThreshold); + + [DllImport(_DRIVER_FILENAME, EntryPoint = "ps5000SetSigGenArbitrary")] + public static extern short SetSiggenArbitrary( + short handle, + int offsetVoltage, + uint pkToPk, + uint startDeltaPhase, + uint stopDeltaPhase, + uint deltaPhaseIncrement, + uint dwellCount, + short[] arbitraryWaveform, + uint arbitraryWaveformSize, + SiggenSweepType sweepType, + bool whiteNoise, + SiggenIndexMode indexMode, + uint shots, + uint sweeps, + SiggenTrigType triggerType, + SiggenTrigSource triggerSource, + short extInThreshold); + + [DllImport(_DRIVER_FILENAME, EntryPoint = "ps5000RunStreaming")] + public static extern short RunStreaming( + short handle, + ref uint sampleInterval, + ReportedTimeUnits sampleIntervalTimeUnits, + uint maxPreTriggerSamples, + uint maxPostPreTriggerSamples, + bool autoStop, + uint downSamplingRation, + uint overviewBufferSize); + + [DllImport(_DRIVER_FILENAME, EntryPoint = "ps5000GetStreamingLatestValues")] + public static extern short GetStreamingLatestValues( + short handle, + ps5000StreamingReady lpPs5000StreamingReady, + IntPtr pVoid); + + [DllImport(_DRIVER_FILENAME, EntryPoint = "ps5000SetNoOfCaptures")] + public static extern short SetNoOfRapidCaptures( + short handle, + ushort nWaveforms); + + [DllImport(_DRIVER_FILENAME, EntryPoint = "ps5000MemorySegments")] + public static extern short MemorySegments( + short handle, + ushort nSegments, + out int nMaxSamples); + + [DllImport(_DRIVER_FILENAME, EntryPoint = "ps5000SetDataBufferBulk")] + public static extern short SetDataBuffersRapid( + short handle, + Channel channel, + short[] buffer, + int bufferLth, + ushort waveform); + + [DllImport(_DRIVER_FILENAME, EntryPoint = "ps5000GetValuesBulk")] + public static extern short GetValuesRapid( + short handle, + ref uint noOfSamples, + ushort fromSegmentIndex, + ushort toSegmentIndex, + short[] overflows); + #endregion + } +} diff --git a/dotnet example/PinnedArray.cs b/dotnet example/PinnedArray.cs new file mode 100644 index 0000000..031eace --- /dev/null +++ b/dotnet example/PinnedArray.cs @@ -0,0 +1,47 @@ +using System; +using System.Runtime.InteropServices; + +namespace ps5000example +{ + public class PinnedArray + { + GCHandle _pinnedHandle; + private bool _disposed; + + public PinnedArray(int arraySize) : this(new T[arraySize]) { } + + public PinnedArray(T[] array) + { + _pinnedHandle = GCHandle.Alloc(array, GCHandleType.Pinned); + } + + ~PinnedArray() + { + Dispose(); + } + + public T[] Target + { + get { return (T[])_pinnedHandle.Target; } + } + + public static implicit operator T[](PinnedArray a) + { + if (a == null) + return null; + else + return (T[])a._pinnedHandle.Target; + } + + public void Dispose() + { + if (!_disposed) + { + _pinnedHandle.Free(); + _disposed = true; + + GC.SuppressFinalize(this); + } + } + } +} \ No newline at end of file diff --git a/dotnet example/Properties/AssemblyInfo.cs b/dotnet example/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..6b968d6 --- /dev/null +++ b/dotnet example/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("ps5000example")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("ps5000example")] +[assembly: AssemblyCopyright("Copyright © 2007")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(true)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("6709ad7a-5daa-4134-b34d-ec6a3ca23a4b")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/dotnet example/Properties/app.manifest b/dotnet example/Properties/app.manifest new file mode 100644 index 0000000..c82c909 --- /dev/null +++ b/dotnet example/Properties/app.manifest @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dotnet example/bin/Release/PS5000.dll b/dotnet example/bin/Release/PS5000.dll new file mode 100644 index 0000000..d562e09 Binary files /dev/null and b/dotnet example/bin/Release/PS5000.dll differ diff --git a/dotnet example/bin/Release/data.txt b/dotnet example/bin/Release/data.txt new file mode 100644 index 0000000..f480f3c --- /dev/null +++ b/dotnet example/bin/Release/data.txt @@ -0,0 +1,3072 @@ +0, 6656, 1023, 0, 0 +0, 2048, 314, 0, 0 + +2, 6144, 944, 0, 0 +2, 1792, 275, 0, 0 + +4, 5376, 826, 0, 0 +4, 2048, 314, 0, 0 + +6, 4864, 748, 0, 0 +6, 1792, 275, 0, 0 + +8, 4608, 708, 0, 0 +8, 2048, 314, 0, 0 + +10, 4352, 669, 0, 0 +10, 1792, 275, 0, 0 + +12, 4096, 629, 0, 0 +12, 1792, 275, 0, 0 + +14, 3840, 590, 0, 0 +14, 1536, 236, 0, 0 + +16, 3584, 551, 0, 0 +16, 1792, 275, 0, 0 + +18, 3328, 511, 0, 0 +18, 1792, 275, 0, 0 + +20, 2816, 433, 0, 0 +20, 1792, 275, 0, 0 + +22, 2816, 433, 0, 0 +22, 1536, 236, 0, 0 + +24, 2816, 433, 0, 0 +24, 1536, 236, 0, 0 + +26, 2560, 393, 0, 0 +26, 1280, 196, 0, 0 + +28, 2304, 354, 0, 0 +28, 1280, 196, 0, 0 + +30, 2048, 314, 0, 0 +30, 1280, 196, 0, 0 + +32, 2048, 314, 0, 0 +32, 1280, 196, 0, 0 + +34, 2048, 314, 0, 0 +34, 1280, 196, 0, 0 + +36, 2048, 314, 0, 0 +36, 1280, 196, 0, 0 + +38, 1792, 275, 0, 0 +38, 1024, 157, 0, 0 + +40, 1792, 275, 0, 0 +40, 1280, 196, 0, 0 + +42, 1792, 275, 0, 0 +42, 1024, 157, 0, 0 + +44, 1536, 236, 0, 0 +44, 1024, 157, 0, 0 + +46, 1536, 236, 0, 0 +46, 1024, 157, 0, 0 + +48, 1536, 236, 0, 0 +48, 1024, 157, 0, 0 + +50, 1280, 196, 0, 0 +50, 1024, 157, 0, 0 + +52, 1536, 236, 0, 0 +52, 1024, 157, 0, 0 + +54, 1280, 196, 0, 0 +54, 768, 118, 0, 0 + +56, 1280, 196, 0, 0 +56, 1024, 157, 0, 0 + +58, 1280, 196, 0, 0 +58, 1024, 157, 0, 0 + +60, 1280, 196, 0, 0 +60, 768, 118, 0, 0 + +62, 1280, 196, 0, 0 +62, 1024, 157, 0, 0 + +64, 1280, 196, 0, 0 +64, 768, 118, 0, 0 + +66, 1024, 157, 0, 0 +66, 768, 118, 0, 0 + +68, 1280, 196, 0, 0 +68, 1024, 157, 0, 0 + +70, 1024, 157, 0, 0 +70, 768, 118, 0, 0 + +72, 1024, 157, 0, 0 +72, 768, 118, 0, 0 + +74, 1024, 157, 0, 0 +74, 768, 118, 0, 0 + +76, 1024, 157, 0, 0 +76, 768, 118, 0, 0 + +78, 1024, 157, 0, 0 +78, 768, 118, 0, 0 + +80, 1024, 157, 0, 0 +80, 768, 118, 0, 0 + +82, 1024, 157, 0, 0 +82, 768, 118, 0, 0 + +84, 1024, 157, 0, 0 +84, 768, 118, 0, 0 + +86, 1024, 157, 0, 0 +86, 768, 118, 0, 0 + +88, 1024, 157, 0, 0 +88, 768, 118, 0, 0 + +90, 1024, 157, 0, 0 +90, 768, 118, 0, 0 + +92, 1024, 157, 0, 0 +92, 768, 118, 0, 0 + +94, 1024, 157, 0, 0 +94, 512, 78, 0, 0 + +96, 1024, 157, 0, 0 +96, 768, 118, 0, 0 + +98, 1024, 157, 0, 0 +98, 512, 78, 0, 0 + +100, 1024, 157, 0, 0 +100, 768, 118, 0, 0 + +102, 1024, 157, 0, 0 +102, 768, 118, 0, 0 + +104, 1024, 157, 0, 0 +104, 768, 118, 0, 0 + +106, 1024, 157, 0, 0 +106, 512, 78, 0, 0 + +108, 1024, 157, 0, 0 +108, 768, 118, 0, 0 + +110, 1024, 157, 0, 0 +110, 1024, 157, 0, 0 + +112, 1280, 196, 0, 0 +112, 1024, 157, 0, 0 + +114, 1280, 196, 0, 0 +114, 1024, 157, 0, 0 + +116, 1536, 236, 0, 0 +116, 1280, 196, 0, 0 + +118, 1536, 236, 0, 0 +118, 1280, 196, 0, 0 + +120, 1536, 236, 0, 0 +120, 1280, 196, 0, 0 + +122, 1536, 236, 0, 0 +122, 1280, 196, 0, 0 + +124, 1536, 236, 0, 0 +124, 1536, 236, 0, 0 + +126, 1536, 236, 0, 0 +126, 1280, 196, 0, 0 + +128, 1536, 236, 0, 0 +128, 1280, 196, 0, 0 + +130, 1536, 236, 0, 0 +130, 1280, 196, 0, 0 + +132, 1536, 236, 0, 0 +132, 1536, 236, 0, 0 + +134, 1536, 236, 0, 0 +134, 1280, 196, 0, 0 + +136, 1536, 236, 0, 0 +136, 1536, 236, 0, 0 + +138, 1280, 196, 0, 0 +138, 1280, 196, 0, 0 + +140, 1536, 236, 0, 0 +140, 1280, 196, 0, 0 + +142, 1280, 196, 0, 0 +142, 1280, 196, 0, 0 + +144, 1280, 196, 0, 0 +144, 1280, 196, 0, 0 + +146, 1280, 196, 0, 0 +146, 1024, 157, 0, 0 + +148, 1280, 196, 0, 0 +148, 1024, 157, 0, 0 + +150, 1280, 196, 0, 0 +150, 1024, 157, 0, 0 + +152, 1280, 196, 0, 0 +152, 1024, 157, 0, 0 + +154, 1280, 196, 0, 0 +154, 1024, 157, 0, 0 + +156, 1280, 196, 0, 0 +156, 1024, 157, 0, 0 + +158, 1024, 157, 0, 0 +158, 768, 118, 0, 0 + +160, 1024, 157, 0, 0 +160, 768, 118, 0, 0 + +162, 1024, 157, 0, 0 +162, 768, 118, 0, 0 + +164, 1024, 157, 0, 0 +164, 1024, 157, 0, 0 + +166, 1024, 157, 0, 0 +166, 768, 118, 0, 0 + +168, 1024, 157, 0, 0 +168, 1024, 157, 0, 0 + +170, 1024, 157, 0, 0 +170, 768, 118, 0, 0 + +172, 1024, 157, 0, 0 +172, 768, 118, 0, 0 + +174, 1024, 157, 0, 0 +174, 768, 118, 0, 0 + +176, 1024, 157, 0, 0 +176, 768, 118, 0, 0 + +178, 1024, 157, 0, 0 +178, 768, 118, 0, 0 + +180, 1024, 157, 0, 0 +180, 768, 118, 0, 0 + +182, 1024, 157, 0, 0 +182, 768, 118, 0, 0 + +184, 1024, 157, 0, 0 +184, 768, 118, 0, 0 + +186, 1024, 157, 0, 0 +186, 512, 78, 0, 0 + +188, 1024, 157, 0, 0 +188, 768, 118, 0, 0 + +190, 768, 118, 0, 0 +190, 768, 118, 0, 0 + +192, 1024, 157, 0, 0 +192, 768, 118, 0, 0 + +194, 768, 118, 0, 0 +194, 768, 118, 0, 0 + +196, 1024, 157, 0, 0 +196, 768, 118, 0, 0 + +198, 768, 118, 0, 0 +198, 768, 118, 0, 0 + +200, 1024, 157, 0, 0 +200, 768, 118, 0, 0 + +202, 768, 118, 0, 0 +202, 512, 78, 0, 0 + +204, 1024, 157, 0, 0 +204, 768, 118, 0, 0 + +206, 768, 118, 0, 0 +206, 768, 118, 0, 0 + +208, 1024, 157, 0, 0 +208, 768, 118, 0, 0 + +210, 768, 118, 0, 0 +210, 768, 118, 0, 0 + +212, 1024, 157, 0, 0 +212, 768, 118, 0, 0 + +214, 1024, 157, 0, 0 +214, 768, 118, 0, 0 + +216, 1024, 157, 0, 0 +216, 768, 118, 0, 0 + +218, 1024, 157, 0, 0 +218, 768, 118, 0, 0 + +220, 1024, 157, 0, 0 +220, 768, 118, 0, 0 + +222, 1024, 157, 0, 0 +222, 512, 78, 0, 0 + +224, 1024, 157, 0, 0 +224, 768, 118, 0, 0 + +226, 1024, 157, 0, 0 +226, 768, 118, 0, 0 + +228, 1024, 157, 0, 0 +228, 1024, 157, 0, 0 + +230, 1280, 196, 0, 0 +230, 1024, 157, 0, 0 + +232, 1536, 236, 0, 0 +232, 1280, 196, 0, 0 + +234, 1536, 236, 0, 0 +234, 1280, 196, 0, 0 + +236, 1792, 275, 0, 0 +236, 1536, 236, 0, 0 + +238, 1536, 236, 0, 0 +238, 1280, 196, 0, 0 + +240, 1792, 275, 0, 0 +240, 1536, 236, 0, 0 + +242, 1792, 275, 0, 0 +242, 1536, 236, 0, 0 + +244, 1792, 275, 0, 0 +244, 1792, 275, 0, 0 + +246, 1792, 275, 0, 0 +246, 1536, 236, 0, 0 + +248, 1792, 275, 0, 0 +248, 1536, 236, 0, 0 + +250, 1536, 236, 0, 0 +250, 1280, 196, 0, 0 + +252, 1536, 236, 0, 0 +252, 1536, 236, 0, 0 + +254, 1536, 236, 0, 0 +254, 1280, 196, 0, 0 + +256, 1536, 236, 0, 0 +256, 1536, 236, 0, 0 + +258, 1536, 236, 0, 0 +258, 1280, 196, 0, 0 + +260, 1536, 236, 0, 0 +260, 1280, 196, 0, 0 + +262, 1280, 196, 0, 0 +262, 1280, 196, 0, 0 + +264, 1536, 236, 0, 0 +264, 1280, 196, 0, 0 + +266, 1280, 196, 0, 0 +266, 1024, 157, 0, 0 + +268, 1280, 196, 0, 0 +268, 1280, 196, 0, 0 + +270, 1280, 196, 0, 0 +270, 1024, 157, 0, 0 + +272, 1280, 196, 0, 0 +272, 1280, 196, 0, 0 + +274, 1280, 196, 0, 0 +274, 1024, 157, 0, 0 + +276, 1280, 196, 0, 0 +276, 1024, 157, 0, 0 + +278, 1280, 196, 0, 0 +278, 1024, 157, 0, 0 + +280, 1280, 196, 0, 0 +280, 1024, 157, 0, 0 + +282, 1024, 157, 0, 0 +282, 768, 118, 0, 0 + +284, 1024, 157, 0, 0 +284, 1024, 157, 0, 0 + +286, 1024, 157, 0, 0 +286, 768, 118, 0, 0 + +288, 1280, 196, 0, 0 +288, 768, 118, 0, 0 + +290, 1024, 157, 0, 0 +290, 768, 118, 0, 0 + +292, 1024, 157, 0, 0 +292, 768, 118, 0, 0 + +294, 1024, 157, 0, 0 +294, 768, 118, 0, 0 + +296, 1024, 157, 0, 0 +296, 768, 118, 0, 0 + +298, 1024, 157, 0, 0 +298, 768, 118, 0, 0 + +300, 1024, 157, 0, 0 +300, 768, 118, 0, 0 + +302, 1024, 157, 0, 0 +302, 512, 78, 0, 0 + +304, 1024, 157, 0, 0 +304, 768, 118, 0, 0 + +306, 1024, 157, 0, 0 +306, 768, 118, 0, 0 + +308, 1024, 157, 0, 0 +308, 768, 118, 0, 0 + +310, 1024, 157, 0, 0 +310, 768, 118, 0, 0 + +312, 1024, 157, 0, 0 +312, 768, 118, 0, 0 + +314, 1024, 157, 0, 0 +314, 768, 118, 0, 0 + +316, 1024, 157, 0, 0 +316, 768, 118, 0, 0 + +318, 1024, 157, 0, 0 +318, 768, 118, 0, 0 + +320, 1024, 157, 0, 0 +320, 768, 118, 0, 0 + +322, 1024, 157, 0, 0 +322, 768, 118, 0, 0 + +324, 1024, 157, 0, 0 +324, 768, 118, 0, 0 + +326, 768, 118, 0, 0 +326, 512, 78, 0, 0 + +328, 1024, 157, 0, 0 +328, 768, 118, 0, 0 + +330, 768, 118, 0, 0 +330, 768, 118, 0, 0 + +332, 1024, 157, 0, 0 +332, 768, 118, 0, 0 + +334, 768, 118, 0, 0 +334, 768, 118, 0, 0 + +336, 1024, 157, 0, 0 +336, 768, 118, 0, 0 + +338, 1024, 157, 0, 0 +338, 512, 78, 0, 0 + +340, 1024, 157, 0, 0 +340, 768, 118, 0, 0 + +342, 768, 118, 0, 0 +342, 768, 118, 0, 0 + +344, 1024, 157, 0, 0 +344, 768, 118, 0, 0 + +346, 768, 118, 0, 0 +346, 512, 78, 0, 0 + +348, 1024, 157, 0, 0 +348, 768, 118, 0, 0 + +350, 768, 118, 0, 0 +350, 512, 78, 0, 0 + +352, 1024, 157, 0, 0 +352, 768, 118, 0, 0 + +354, 1024, 157, 0, 0 +354, 512, 78, 0, 0 + +356, 1024, 157, 0, 0 +356, 768, 118, 0, 0 + +358, 1024, 157, 0, 0 +358, 768, 118, 0, 0 + +360, 1024, 157, 0, 0 +360, 1024, 157, 0, 0 + +362, 1280, 196, 0, 0 +362, 1024, 157, 0, 0 + +364, 1280, 196, 0, 0 +364, 1280, 196, 0, 0 + +366, 1280, 196, 0, 0 +366, 1024, 157, 0, 0 + +368, 1536, 236, 0, 0 +368, 1280, 196, 0, 0 + +370, 1536, 236, 0, 0 +370, 1280, 196, 0, 0 + +372, 1536, 236, 0, 0 +372, 1280, 196, 0, 0 + +374, 1536, 236, 0, 0 +374, 1280, 196, 0, 0 + +376, 1536, 236, 0, 0 +376, 1280, 196, 0, 0 + +378, 1536, 236, 0, 0 +378, 1280, 196, 0, 0 + +380, 1536, 236, 0, 0 +380, 1280, 196, 0, 0 + +382, 1536, 236, 0, 0 +382, 1280, 196, 0, 0 + +384, 1536, 236, 0, 0 +384, 1280, 196, 0, 0 + +386, 1280, 196, 0, 0 +386, 1280, 196, 0, 0 + +388, 1536, 236, 0, 0 +388, 1280, 196, 0, 0 + +390, 1280, 196, 0, 0 +390, 1280, 196, 0, 0 + +392, 1280, 196, 0, 0 +392, 1280, 196, 0, 0 + +394, 1280, 196, 0, 0 +394, 1024, 157, 0, 0 + +396, 1280, 196, 0, 0 +396, 1024, 157, 0, 0 + +398, 1280, 196, 0, 0 +398, 1024, 157, 0, 0 + +400, 1280, 196, 0, 0 +400, 1024, 157, 0, 0 + +402, 1024, 157, 0, 0 +402, 1024, 157, 0, 0 + +404, 1024, 157, 0, 0 +404, 1024, 157, 0, 0 + +406, 1024, 157, 0, 0 +406, 768, 118, 0, 0 + +408, 1024, 157, 0, 0 +408, 1024, 157, 0, 0 + +410, 1024, 157, 0, 0 +410, 768, 118, 0, 0 + +412, 1024, 157, 0, 0 +412, 1024, 157, 0, 0 + +414, 1024, 157, 0, 0 +414, 768, 118, 0, 0 + +416, 1024, 157, 0, 0 +416, 1024, 157, 0, 0 + +418, 1024, 157, 0, 0 +418, 768, 118, 0, 0 + +420, 1024, 157, 0, 0 +420, 768, 118, 0, 0 + +422, 1024, 157, 0, 0 +422, 768, 118, 0, 0 + +424, 1024, 157, 0, 0 +424, 768, 118, 0, 0 + +426, 1024, 157, 0, 0 +426, 768, 118, 0, 0 + +428, 1024, 157, 0, 0 +428, 1024, 157, 0, 0 + +430, 1024, 157, 0, 0 +430, 512, 78, 0, 0 + +432, 1024, 157, 0, 0 +432, 768, 118, 0, 0 + +434, 768, 118, 0, 0 +434, 768, 118, 0, 0 + +436, 1024, 157, 0, 0 +436, 768, 118, 0, 0 + +438, 768, 118, 0, 0 +438, 512, 78, 0, 0 + +440, 1024, 157, 0, 0 +440, 1024, 157, 0, 0 + +442, 768, 118, 0, 0 +442, 768, 118, 0, 0 + +444, 1024, 157, 0, 0 +444, 768, 118, 0, 0 + +446, 1024, 157, 0, 0 +446, 768, 118, 0, 0 + +448, 1024, 157, 0, 0 +448, 768, 118, 0, 0 + +450, 1024, 157, 0, 0 +450, 768, 118, 0, 0 + +452, 1024, 157, 0, 0 +452, 768, 118, 0, 0 + +454, 768, 118, 0, 0 +454, 512, 78, 0, 0 + +456, 1024, 157, 0, 0 +456, 768, 118, 0, 0 + +458, 768, 118, 0, 0 +458, 512, 78, 0, 0 + +460, 1024, 157, 0, 0 +460, 768, 118, 0, 0 + +462, 1024, 157, 0, 0 +462, 768, 118, 0, 0 + +464, 1024, 157, 0, 0 +464, 768, 118, 0, 0 + +466, 1024, 157, 0, 0 +466, 512, 78, 0, 0 + +468, 1024, 157, 0, 0 +468, 768, 118, 0, 0 + +470, 1024, 157, 0, 0 +470, 768, 118, 0, 0 + +472, 1024, 157, 0, 0 +472, 768, 118, 0, 0 + +474, 1024, 157, 0, 0 +474, 768, 118, 0, 0 + +476, 1024, 157, 0, 0 +476, 1024, 157, 0, 0 + +478, 1024, 157, 0, 0 +478, 1024, 157, 0, 0 + +480, 1280, 196, 0, 0 +480, 1024, 157, 0, 0 + +482, 1280, 196, 0, 0 +482, 1280, 196, 0, 0 + +484, 1536, 236, 0, 0 +484, 1536, 236, 0, 0 + +486, 1536, 236, 0, 0 +486, 1280, 196, 0, 0 + +488, 1792, 275, 0, 0 +488, 1536, 236, 0, 0 + +490, 1536, 236, 0, 0 +490, 1536, 236, 0, 0 + +492, 1792, 275, 0, 0 +492, 1536, 236, 0, 0 + +494, 1536, 236, 0, 0 +494, 1536, 236, 0, 0 + +496, 1792, 275, 0, 0 +496, 1536, 236, 0, 0 + +498, 1536, 236, 0, 0 +498, 1280, 196, 0, 0 + +500, 1536, 236, 0, 0 +500, 1536, 236, 0, 0 + +502, 1536, 236, 0, 0 +502, 1280, 196, 0, 0 + +504, 1792, 275, 0, 0 +504, 1536, 236, 0, 0 + +506, 1536, 236, 0, 0 +506, 1280, 196, 0, 0 + +508, 1536, 236, 0, 0 +508, 1280, 196, 0, 0 + +510, 1536, 236, 0, 0 +510, 1280, 196, 0, 0 + +512, 1536, 236, 0, 0 +512, 1280, 196, 0, 0 + +514, 1280, 196, 0, 0 +514, 1280, 196, 0, 0 + +516, 1536, 236, 0, 0 +516, 1280, 196, 0, 0 + +518, 1280, 196, 0, 0 +518, 1024, 157, 0, 0 + +520, 1280, 196, 0, 0 +520, 1280, 196, 0, 0 + +522, 1280, 196, 0, 0 +522, 1024, 157, 0, 0 + +524, 1280, 196, 0, 0 +524, 1280, 196, 0, 0 + +526, 1280, 196, 0, 0 +526, 768, 118, 0, 0 + +528, 1280, 196, 0, 0 +528, 1024, 157, 0, 0 + +530, 1024, 157, 0, 0 +530, 768, 118, 0, 0 + +532, 1024, 157, 0, 0 +532, 1024, 157, 0, 0 + +534, 1024, 157, 0, 0 +534, 768, 118, 0, 0 + +536, 1024, 157, 0, 0 +536, 1024, 157, 0, 0 + +538, 1024, 157, 0, 0 +538, 768, 118, 0, 0 + +540, 1024, 157, 0, 0 +540, 1024, 157, 0, 0 + +542, 1024, 157, 0, 0 +542, 768, 118, 0, 0 + +544, 1024, 157, 0, 0 +544, 768, 118, 0, 0 + +546, 1024, 157, 0, 0 +546, 768, 118, 0, 0 + +548, 1024, 157, 0, 0 +548, 768, 118, 0, 0 + +550, 768, 118, 0, 0 +550, 768, 118, 0, 0 + +552, 1024, 157, 0, 0 +552, 768, 118, 0, 0 + +554, 1024, 157, 0, 0 +554, 768, 118, 0, 0 + +556, 1024, 157, 0, 0 +556, 768, 118, 0, 0 + +558, 1024, 157, 0, 0 +558, 512, 78, 0, 0 + +560, 1024, 157, 0, 0 +560, 768, 118, 0, 0 + +562, 1024, 157, 0, 0 +562, 768, 118, 0, 0 + +564, 1024, 157, 0, 0 +564, 768, 118, 0, 0 + +566, 768, 118, 0, 0 +566, 768, 118, 0, 0 + +568, 1024, 157, 0, 0 +568, 768, 118, 0, 0 + +570, 1024, 157, 0, 0 +570, 768, 118, 0, 0 + +572, 1024, 157, 0, 0 +572, 768, 118, 0, 0 + +574, 768, 118, 0, 0 +574, 768, 118, 0, 0 + +576, 1024, 157, 0, 0 +576, 768, 118, 0, 0 + +578, 1024, 157, 0, 0 +578, 768, 118, 0, 0 + +580, 1024, 157, 0, 0 +580, 768, 118, 0, 0 + +582, 768, 118, 0, 0 +582, 512, 78, 0, 0 + +584, 1024, 157, 0, 0 +584, 768, 118, 0, 0 + +586, 768, 118, 0, 0 +586, 768, 118, 0, 0 + +588, 1024, 157, 0, 0 +588, 768, 118, 0, 0 + +590, 768, 118, 0, 0 +590, 512, 78, 0, 0 + +592, 1024, 157, 0, 0 +592, 768, 118, 0, 0 + +594, 768, 118, 0, 0 +594, 512, 78, 0, 0 + +596, 1024, 157, 0, 0 +596, 768, 118, 0, 0 + +598, 768, 118, 0, 0 +598, 768, 118, 0, 0 + +600, 1024, 157, 0, 0 +600, 768, 118, 0, 0 + +602, 768, 118, 0, 0 +602, 512, 78, 0, 0 + +604, 1024, 157, 0, 0 +604, 768, 118, 0, 0 + +606, 768, 118, 0, 0 +606, 768, 118, 0, 0 + +608, 1024, 157, 0, 0 +608, 768, 118, 0, 0 + +610, 1024, 157, 0, 0 +610, 768, 118, 0, 0 + +612, 1280, 196, 0, 0 +612, 1024, 157, 0, 0 + +614, 1280, 196, 0, 0 +614, 1024, 157, 0, 0 + +616, 1536, 236, 0, 0 +616, 1280, 196, 0, 0 + +618, 1280, 196, 0, 0 +618, 1280, 196, 0, 0 + +620, 1536, 236, 0, 0 +620, 1280, 196, 0, 0 + +622, 1536, 236, 0, 0 +622, 1280, 196, 0, 0 + +624, 1536, 236, 0, 0 +624, 1536, 236, 0, 0 + +626, 1536, 236, 0, 0 +626, 1280, 196, 0, 0 + +628, 1536, 236, 0, 0 +628, 1536, 236, 0, 0 + +630, 1536, 236, 0, 0 +630, 1280, 196, 0, 0 + +632, 1536, 236, 0, 0 +632, 1280, 196, 0, 0 + +634, 1536, 236, 0, 0 +634, 1280, 196, 0, 0 + +636, 1536, 236, 0, 0 +636, 1280, 196, 0, 0 + +638, 1536, 236, 0, 0 +638, 1280, 196, 0, 0 + +640, 1280, 196, 0, 0 +640, 1280, 196, 0, 0 + +642, 1280, 196, 0, 0 +642, 1024, 157, 0, 0 + +644, 1280, 196, 0, 0 +644, 1280, 196, 0, 0 + +646, 1280, 196, 0, 0 +646, 1024, 157, 0, 0 + +648, 1280, 196, 0, 0 +648, 1280, 196, 0, 0 + +650, 1280, 196, 0, 0 +650, 768, 118, 0, 0 + +652, 1280, 196, 0, 0 +652, 1024, 157, 0, 0 + +654, 1024, 157, 0, 0 +654, 1024, 157, 0, 0 + +656, 1280, 196, 0, 0 +656, 1024, 157, 0, 0 + +658, 1024, 157, 0, 0 +658, 768, 118, 0, 0 + +660, 1280, 196, 0, 0 +660, 1024, 157, 0, 0 + +662, 1024, 157, 0, 0 +662, 768, 118, 0, 0 + +664, 1024, 157, 0, 0 +664, 1024, 157, 0, 0 + +666, 1024, 157, 0, 0 +666, 768, 118, 0, 0 + +668, 1024, 157, 0, 0 +668, 1024, 157, 0, 0 + +670, 1024, 157, 0, 0 +670, 768, 118, 0, 0 + +672, 1024, 157, 0, 0 +672, 768, 118, 0, 0 + +674, 1024, 157, 0, 0 +674, 768, 118, 0, 0 + +676, 1024, 157, 0, 0 +676, 768, 118, 0, 0 + +678, 1024, 157, 0, 0 +678, 768, 118, 0, 0 + +680, 1024, 157, 0, 0 +680, 768, 118, 0, 0 + +682, 768, 118, 0, 0 +682, 512, 78, 0, 0 + +684, 1024, 157, 0, 0 +684, 768, 118, 0, 0 + +686, 768, 118, 0, 0 +686, 768, 118, 0, 0 + +688, 1024, 157, 0, 0 +688, 768, 118, 0, 0 + +690, 768, 118, 0, 0 +690, 768, 118, 0, 0 + +692, 1024, 157, 0, 0 +692, 768, 118, 0, 0 + +694, 768, 118, 0, 0 +694, 768, 118, 0, 0 + +696, 1024, 157, 0, 0 +696, 768, 118, 0, 0 + +698, 768, 118, 0, 0 +698, 512, 78, 0, 0 + +700, 1024, 157, 0, 0 +700, 768, 118, 0, 0 + +702, 768, 118, 0, 0 +702, 512, 78, 0, 0 + +704, 1024, 157, 0, 0 +704, 768, 118, 0, 0 + +706, 768, 118, 0, 0 +706, 768, 118, 0, 0 + +708, 768, 118, 0, 0 +708, 768, 118, 0, 0 + +710, 1024, 157, 0, 0 +710, 768, 118, 0, 0 + +712, 1024, 157, 0, 0 +712, 768, 118, 0, 0 + +714, 1024, 157, 0, 0 +714, 768, 118, 0, 0 + +716, 1024, 157, 0, 0 +716, 768, 118, 0, 0 + +718, 1024, 157, 0, 0 +718, 768, 118, 0, 0 + +720, 1024, 157, 0, 0 +720, 768, 118, 0, 0 + +722, 1024, 157, 0, 0 +722, 768, 118, 0, 0 + +724, 1024, 157, 0, 0 +724, 768, 118, 0, 0 + +726, 1024, 157, 0, 0 +726, 768, 118, 0, 0 + +728, 1280, 196, 0, 0 +728, 1024, 157, 0, 0 + +730, 1280, 196, 0, 0 +730, 1024, 157, 0, 0 + +732, 1280, 196, 0, 0 +732, 1280, 196, 0, 0 + +734, 1536, 236, 0, 0 +734, 1280, 196, 0, 0 + +736, 1536, 236, 0, 0 +736, 1280, 196, 0, 0 + +738, 1536, 236, 0, 0 +738, 1280, 196, 0, 0 + +740, 1792, 275, 0, 0 +740, 1536, 236, 0, 0 + +742, 1536, 236, 0, 0 +742, 1536, 236, 0, 0 + +744, 1792, 275, 0, 0 +744, 1536, 236, 0, 0 + +746, 1536, 236, 0, 0 +746, 1536, 236, 0, 0 + +748, 1792, 275, 0, 0 +748, 1536, 236, 0, 0 + +750, 1536, 236, 0, 0 +750, 1536, 236, 0, 0 + +752, 1536, 236, 0, 0 +752, 1536, 236, 0, 0 + +754, 1536, 236, 0, 0 +754, 1280, 196, 0, 0 + +756, 1536, 236, 0, 0 +756, 1536, 236, 0, 0 + +758, 1536, 236, 0, 0 +758, 1280, 196, 0, 0 + +760, 1536, 236, 0, 0 +760, 1280, 196, 0, 0 + +762, 1280, 196, 0, 0 +762, 1280, 196, 0, 0 + +764, 1280, 196, 0, 0 +764, 1280, 196, 0, 0 + +766, 1280, 196, 0, 0 +766, 1280, 196, 0, 0 + +768, 1280, 196, 0, 0 +768, 1280, 196, 0, 0 + +770, 1024, 157, 0, 0 +770, 1024, 157, 0, 0 + +772, 1280, 196, 0, 0 +772, 1280, 196, 0, 0 + +774, 1280, 196, 0, 0 +774, 1024, 157, 0, 0 + +776, 1280, 196, 0, 0 +776, 1280, 196, 0, 0 + +778, 1024, 157, 0, 0 +778, 1024, 157, 0, 0 + +780, 1024, 157, 0, 0 +780, 1024, 157, 0, 0 + +782, 1024, 157, 0, 0 +782, 1024, 157, 0, 0 + +784, 1024, 157, 0, 0 +784, 1024, 157, 0, 0 + +786, 1024, 157, 0, 0 +786, 768, 118, 0, 0 + +788, 1024, 157, 0, 0 +788, 1024, 157, 0, 0 + +790, 1024, 157, 0, 0 +790, 768, 118, 0, 0 + +792, 1024, 157, 0, 0 +792, 768, 118, 0, 0 + +794, 1024, 157, 0, 0 +794, 768, 118, 0, 0 + +796, 1024, 157, 0, 0 +796, 768, 118, 0, 0 + +798, 1024, 157, 0, 0 +798, 768, 118, 0, 0 + +800, 1024, 157, 0, 0 +800, 768, 118, 0, 0 + +802, 1024, 157, 0, 0 +802, 768, 118, 0, 0 + +804, 1024, 157, 0, 0 +804, 768, 118, 0, 0 + +806, 768, 118, 0, 0 +806, 768, 118, 0, 0 + +808, 1024, 157, 0, 0 +808, 768, 118, 0, 0 + +810, 768, 118, 0, 0 +810, 768, 118, 0, 0 + +812, 768, 118, 0, 0 +812, 768, 118, 0, 0 + +814, 768, 118, 0, 0 +814, 768, 118, 0, 0 + +816, 1024, 157, 0, 0 +816, 768, 118, 0, 0 + +818, 768, 118, 0, 0 +818, 768, 118, 0, 0 + +820, 1024, 157, 0, 0 +820, 768, 118, 0, 0 + +822, 1024, 157, 0, 0 +822, 512, 78, 0, 0 + +824, 1024, 157, 0, 0 +824, 768, 118, 0, 0 + +826, 1024, 157, 0, 0 +826, 512, 78, 0, 0 + +828, 1024, 157, 0, 0 +828, 768, 118, 0, 0 + +830, 768, 118, 0, 0 +830, 768, 118, 0, 0 + +832, 768, 118, 0, 0 +832, 768, 118, 0, 0 + +834, 1024, 157, 0, 0 +834, 768, 118, 0, 0 + +836, 1024, 157, 0, 0 +836, 768, 118, 0, 0 + +838, 768, 118, 0, 0 +838, 512, 78, 0, 0 + +840, 1024, 157, 0, 0 +840, 768, 118, 0, 0 + +842, 768, 118, 0, 0 +842, 512, 78, 0, 0 + +844, 1024, 157, 0, 0 +844, 768, 118, 0, 0 + +846, 768, 118, 0, 0 +846, 768, 118, 0, 0 + +848, 768, 118, 0, 0 +848, 768, 118, 0, 0 + +850, 768, 118, 0, 0 +850, 768, 118, 0, 0 + +852, 768, 118, 0, 0 +852, 768, 118, 0, 0 + +854, 768, 118, 0, 0 +854, 512, 78, 0, 0 + +856, 1024, 157, 0, 0 +856, 768, 118, 0, 0 + +858, 1024, 157, 0, 0 +858, 768, 118, 0, 0 + +860, 1024, 157, 0, 0 +860, 1024, 157, 0, 0 + +862, 1280, 196, 0, 0 +862, 1024, 157, 0, 0 + +864, 1280, 196, 0, 0 +864, 1024, 157, 0, 0 + +866, 1280, 196, 0, 0 +866, 1280, 196, 0, 0 + +868, 1536, 236, 0, 0 +868, 1280, 196, 0, 0 + +870, 1280, 196, 0, 0 +870, 1280, 196, 0, 0 + +872, 1536, 236, 0, 0 +872, 1536, 236, 0, 0 + +874, 1536, 236, 0, 0 +874, 1280, 196, 0, 0 + +876, 1536, 236, 0, 0 +876, 1536, 236, 0, 0 + +878, 1536, 236, 0, 0 +878, 1280, 196, 0, 0 + +880, 1536, 236, 0, 0 +880, 1280, 196, 0, 0 + +882, 1536, 236, 0, 0 +882, 1280, 196, 0, 0 + +884, 1536, 236, 0, 0 +884, 1280, 196, 0, 0 + +886, 1536, 236, 0, 0 +886, 1280, 196, 0, 0 + +888, 1280, 196, 0, 0 +888, 1280, 196, 0, 0 + +890, 1280, 196, 0, 0 +890, 1024, 157, 0, 0 + +892, 1280, 196, 0, 0 +892, 1280, 196, 0, 0 + +894, 1280, 196, 0, 0 +894, 1024, 157, 0, 0 + +896, 1280, 196, 0, 0 +896, 1024, 157, 0, 0 + +898, 1280, 196, 0, 0 +898, 1024, 157, 0, 0 + +900, 1280, 196, 0, 0 +900, 1024, 157, 0, 0 + +902, 1280, 196, 0, 0 +902, 1024, 157, 0, 0 + +904, 1280, 196, 0, 0 +904, 1024, 157, 0, 0 + +906, 1024, 157, 0, 0 +906, 768, 118, 0, 0 + +908, 1024, 157, 0, 0 +908, 1024, 157, 0, 0 + +910, 1024, 157, 0, 0 +910, 1024, 157, 0, 0 + +912, 1024, 157, 0, 0 +912, 1024, 157, 0, 0 + +914, 1024, 157, 0, 0 +914, 768, 118, 0, 0 + +916, 1024, 157, 0, 0 +916, 768, 118, 0, 0 + +918, 1024, 157, 0, 0 +918, 768, 118, 0, 0 + +920, 1024, 157, 0, 0 +920, 768, 118, 0, 0 + +922, 1024, 157, 0, 0 +922, 768, 118, 0, 0 + +924, 1024, 157, 0, 0 +924, 768, 118, 0, 0 + +926, 1024, 157, 0, 0 +926, 768, 118, 0, 0 + +928, 1024, 157, 0, 0 +928, 768, 118, 0, 0 + +930, 1024, 157, 0, 0 +930, 768, 118, 0, 0 + +932, 768, 118, 0, 0 +932, 768, 118, 0, 0 + +934, 1024, 157, 0, 0 +934, 768, 118, 0, 0 + +936, 1024, 157, 0, 0 +936, 768, 118, 0, 0 + +938, 1024, 157, 0, 0 +938, 768, 118, 0, 0 + +940, 1024, 157, 0, 0 +940, 768, 118, 0, 0 + +942, 768, 118, 0, 0 +942, 768, 118, 0, 0 + +944, 1024, 157, 0, 0 +944, 768, 118, 0, 0 + +946, 768, 118, 0, 0 +946, 768, 118, 0, 0 + +948, 1024, 157, 0, 0 +948, 768, 118, 0, 0 + +950, 768, 118, 0, 0 +950, 768, 118, 0, 0 + +952, 1024, 157, 0, 0 +952, 768, 118, 0, 0 + +954, 768, 118, 0, 0 +954, 768, 118, 0, 0 + +956, 1024, 157, 0, 0 +956, 768, 118, 0, 0 + +958, 768, 118, 0, 0 +958, 512, 78, 0, 0 + +960, 1024, 157, 0, 0 +960, 768, 118, 0, 0 + +962, 1024, 157, 0, 0 +962, 768, 118, 0, 0 + +964, 1024, 157, 0, 0 +964, 768, 118, 0, 0 + +966, 1024, 157, 0, 0 +966, 768, 118, 0, 0 + +968, 1024, 157, 0, 0 +968, 768, 118, 0, 0 + +970, 1024, 157, 0, 0 +970, 768, 118, 0, 0 + +972, 1024, 157, 0, 0 +972, 768, 118, 0, 0 + +974, 1024, 157, 0, 0 +974, 768, 118, 0, 0 + +976, 1024, 157, 0, 0 +976, 1024, 157, 0, 0 + +978, 1024, 157, 0, 0 +978, 768, 118, 0, 0 + +980, 1280, 196, 0, 0 +980, 1280, 196, 0, 0 + +982, 1280, 196, 0, 0 +982, 1280, 196, 0, 0 + +984, 1536, 236, 0, 0 +984, 1536, 236, 0, 0 + +986, 1536, 236, 0, 0 +986, 1536, 236, 0, 0 + +988, 1792, 275, 0, 0 +988, 1536, 236, 0, 0 + +990, 1792, 275, 0, 0 +990, 1536, 236, 0, 0 + +992, 2048, 314, 0, 0 +992, 1792, 275, 0, 0 + +994, 1792, 275, 0, 0 +994, 1536, 236, 0, 0 + +996, 2048, 314, 0, 0 +996, 1792, 275, 0, 0 + +998, 1792, 275, 0, 0 +998, 1792, 275, 0, 0 + +1000, 1792, 275, 0, 0 +1000, 1792, 275, 0, 0 + +1002, 1792, 275, 0, 0 +1002, 1792, 275, 0, 0 + +1004, 1792, 275, 0, 0 +1004, 1792, 275, 0, 0 + +1006, 1792, 275, 0, 0 +1006, 1792, 275, 0, 0 + +1008, 1792, 275, 0, 0 +1008, 1792, 275, 0, 0 + +1010, 1792, 275, 0, 0 +1010, 1536, 236, 0, 0 + +1012, 1792, 275, 0, 0 +1012, 1792, 275, 0, 0 + +1014, 1792, 275, 0, 0 +1014, 1536, 236, 0, 0 + +1016, 1792, 275, 0, 0 +1016, 1792, 275, 0, 0 + +1018, 1792, 275, 0, 0 +1018, 1536, 236, 0, 0 + +1020, 1792, 275, 0, 0 +1020, 1792, 275, 0, 0 + +1022, 1536, 236, 0, 0 +1022, 1536, 236, 0, 0 + +1024, 1792, 275, 0, 0 +1024, 1536, 236, 0, 0 + +1026, 1536, 236, 0, 0 +1026, 1536, 236, 0, 0 + +1028, 1536, 236, 0, 0 +1028, 1536, 236, 0, 0 + +1030, 1536, 236, 0, 0 +1030, 1536, 236, 0, 0 + +1032, 1536, 236, 0, 0 +1032, 1280, 196, 0, 0 + +1034, 1536, 236, 0, 0 +1034, 1280, 196, 0, 0 + +1036, 1536, 236, 0, 0 +1036, 1280, 196, 0, 0 + +1038, 1536, 236, 0, 0 +1038, 1280, 196, 0, 0 + +1040, 1536, 236, 0, 0 +1040, 1280, 196, 0, 0 + +1042, 1280, 196, 0, 0 +1042, 1024, 157, 0, 0 + +1044, 1536, 236, 0, 0 +1044, 1280, 196, 0, 0 + +1046, 1280, 196, 0, 0 +1046, 1280, 196, 0, 0 + +1048, 1280, 196, 0, 0 +1048, 1280, 196, 0, 0 + +1050, 1280, 196, 0, 0 +1050, 1280, 196, 0, 0 + +1052, 1280, 196, 0, 0 +1052, 1024, 157, 0, 0 + +1054, 1024, 157, 0, 0 +1054, 1024, 157, 0, 0 + +1056, 1280, 196, 0, 0 +1056, 1024, 157, 0, 0 + +1058, 1280, 196, 0, 0 +1058, 1024, 157, 0, 0 + +1060, 1280, 196, 0, 0 +1060, 1024, 157, 0, 0 + +1062, 1024, 157, 0, 0 +1062, 1024, 157, 0, 0 + +1064, 1024, 157, 0, 0 +1064, 1024, 157, 0, 0 + +1066, 1024, 157, 0, 0 +1066, 768, 118, 0, 0 + +1068, 1024, 157, 0, 0 +1068, 1024, 157, 0, 0 + +1070, 1024, 157, 0, 0 +1070, 768, 118, 0, 0 + +1072, 1024, 157, 0, 0 +1072, 1024, 157, 0, 0 + +1074, 1024, 157, 0, 0 +1074, 768, 118, 0, 0 + +1076, 1024, 157, 0, 0 +1076, 1024, 157, 0, 0 + +1078, 1024, 157, 0, 0 +1078, 768, 118, 0, 0 + +1080, 1024, 157, 0, 0 +1080, 1024, 157, 0, 0 + +1082, 768, 118, 0, 0 +1082, 768, 118, 0, 0 + +1084, 1024, 157, 0, 0 +1084, 768, 118, 0, 0 + +1086, 1024, 157, 0, 0 +1086, 768, 118, 0, 0 + +1088, 1024, 157, 0, 0 +1088, 768, 118, 0, 0 + +1090, 1024, 157, 0, 0 +1090, 768, 118, 0, 0 + +1092, 1024, 157, 0, 0 +1092, 768, 118, 0, 0 + +1094, 768, 118, 0, 0 +1094, 768, 118, 0, 0 + +1096, 768, 118, 0, 0 +1096, 768, 118, 0, 0 + +1098, 768, 118, 0, 0 +1098, 512, 78, 0, 0 + +1100, 768, 118, 0, 0 +1100, 768, 118, 0, 0 + +1102, 768, 118, 0, 0 +1102, 768, 118, 0, 0 + +1104, 1024, 157, 0, 0 +1104, 768, 118, 0, 0 + +1106, 1024, 157, 0, 0 +1106, 768, 118, 0, 0 + +1108, 1024, 157, 0, 0 +1108, 1024, 157, 0, 0 + +1110, 1024, 157, 0, 0 +1110, 768, 118, 0, 0 + +1112, 1024, 157, 0, 0 +1112, 1024, 157, 0, 0 + +1114, 1024, 157, 0, 0 +1114, 1024, 157, 0, 0 + +1116, 1280, 196, 0, 0 +1116, 1280, 196, 0, 0 + +1118, 1280, 196, 0, 0 +1118, 1280, 196, 0, 0 + +1120, 1536, 236, 0, 0 +1120, 1536, 236, 0, 0 + +1122, 1536, 236, 0, 0 +1122, 1280, 196, 0, 0 + +1124, 1536, 236, 0, 0 +1124, 1536, 236, 0, 0 + +1126, 1536, 236, 0, 0 +1126, 1536, 236, 0, 0 + +1128, 1536, 236, 0, 0 +1128, 1536, 236, 0, 0 + +1130, 1536, 236, 0, 0 +1130, 1536, 236, 0, 0 + +1132, 1536, 236, 0, 0 +1132, 1280, 196, 0, 0 + +1134, 1536, 236, 0, 0 +1134, 1280, 196, 0, 0 + +1136, 1536, 236, 0, 0 +1136, 1280, 196, 0, 0 + +1138, 1536, 236, 0, 0 +1138, 1280, 196, 0, 0 + +1140, 1280, 196, 0, 0 +1140, 1280, 196, 0, 0 + +1142, 1280, 196, 0, 0 +1142, 1024, 157, 0, 0 + +1144, 1280, 196, 0, 0 +1144, 1280, 196, 0, 0 + +1146, 1280, 196, 0, 0 +1146, 1024, 157, 0, 0 + +1148, 1280, 196, 0, 0 +1148, 1024, 157, 0, 0 + +1150, 1280, 196, 0, 0 +1150, 1024, 157, 0, 0 + +1152, 1024, 157, 0, 0 +1152, 1024, 157, 0, 0 + +1154, 1024, 157, 0, 0 +1154, 768, 118, 0, 0 + +1156, 1024, 157, 0, 0 +1156, 1024, 157, 0, 0 + +1158, 1024, 157, 0, 0 +1158, 768, 118, 0, 0 + +1160, 1024, 157, 0, 0 +1160, 1024, 157, 0, 0 + +1162, 1024, 157, 0, 0 +1162, 768, 118, 0, 0 + +1164, 1024, 157, 0, 0 +1164, 1024, 157, 0, 0 + +1166, 1024, 157, 0, 0 +1166, 768, 118, 0, 0 + +1168, 1024, 157, 0, 0 +1168, 1024, 157, 0, 0 + +1170, 1024, 157, 0, 0 +1170, 768, 118, 0, 0 + +1172, 1024, 157, 0, 0 +1172, 768, 118, 0, 0 + +1174, 1024, 157, 0, 0 +1174, 768, 118, 0, 0 + +1176, 1024, 157, 0, 0 +1176, 768, 118, 0, 0 + +1178, 768, 118, 0, 0 +1178, 768, 118, 0, 0 + +1180, 1024, 157, 0, 0 +1180, 768, 118, 0, 0 + +1182, 1024, 157, 0, 0 +1182, 768, 118, 0, 0 + +1184, 768, 118, 0, 0 +1184, 768, 118, 0, 0 + +1186, 768, 118, 0, 0 +1186, 768, 118, 0, 0 + +1188, 1024, 157, 0, 0 +1188, 768, 118, 0, 0 + +1190, 768, 118, 0, 0 +1190, 768, 118, 0, 0 + +1192, 1024, 157, 0, 0 +1192, 768, 118, 0, 0 + +1194, 768, 118, 0, 0 +1194, 768, 118, 0, 0 + +1196, 1024, 157, 0, 0 +1196, 768, 118, 0, 0 + +1198, 1024, 157, 0, 0 +1198, 768, 118, 0, 0 + +1200, 768, 118, 0, 0 +1200, 1024, 157, 0, 0 + +1202, 768, 118, 0, 0 +1202, 768, 118, 0, 0 + +1204, 1024, 157, 0, 0 +1204, 768, 118, 0, 0 + +1206, 768, 118, 0, 0 +1206, 768, 118, 0, 0 + +1208, 768, 118, 0, 0 +1208, 768, 118, 0, 0 + +1210, 768, 118, 0, 0 +1210, 768, 118, 0, 0 + +1212, 1024, 157, 0, 0 +1212, 768, 118, 0, 0 + +1214, 1024, 157, 0, 0 +1214, 768, 118, 0, 0 + +1216, 1024, 157, 0, 0 +1216, 768, 118, 0, 0 + +1218, 1024, 157, 0, 0 +1218, 768, 118, 0, 0 + +1220, 1024, 157, 0, 0 +1220, 768, 118, 0, 0 + +1222, 768, 118, 0, 0 +1222, 768, 118, 0, 0 + +1224, 1024, 157, 0, 0 +1224, 1024, 157, 0, 0 + +1226, 1024, 157, 0, 0 +1226, 768, 118, 0, 0 + +1228, 1280, 196, 0, 0 +1228, 1024, 157, 0, 0 + +1230, 1280, 196, 0, 0 +1230, 1024, 157, 0, 0 + +1232, 1280, 196, 0, 0 +1232, 1280, 196, 0, 0 + +1234, 1280, 196, 0, 0 +1234, 1280, 196, 0, 0 + +1236, 1536, 236, 0, 0 +1236, 1280, 196, 0, 0 + +1238, 1536, 236, 0, 0 +1238, 1536, 236, 0, 0 + +1240, 1536, 236, 0, 0 +1240, 1536, 236, 0, 0 + +1242, 1536, 236, 0, 0 +1242, 1536, 236, 0, 0 + +1244, 1792, 275, 0, 0 +1244, 1536, 236, 0, 0 + +1246, 1536, 236, 0, 0 +1246, 1536, 236, 0, 0 + +1248, 1536, 236, 0, 0 +1248, 1536, 236, 0, 0 + +1250, 1536, 236, 0, 0 +1250, 1536, 236, 0, 0 + +1252, 1536, 236, 0, 0 +1252, 1536, 236, 0, 0 + +1254, 1536, 236, 0, 0 +1254, 1536, 236, 0, 0 + +1256, 1536, 236, 0, 0 +1256, 1536, 236, 0, 0 + +1258, 1280, 196, 0, 0 +1258, 1280, 196, 0, 0 + +1260, 1536, 236, 0, 0 +1260, 1536, 236, 0, 0 + +1262, 1280, 196, 0, 0 +1262, 1280, 196, 0, 0 + +1264, 1280, 196, 0, 0 +1264, 1280, 196, 0, 0 + +1266, 1280, 196, 0, 0 +1266, 1280, 196, 0, 0 + +1268, 1280, 196, 0, 0 +1268, 1280, 196, 0, 0 + +1270, 1280, 196, 0, 0 +1270, 1280, 196, 0, 0 + +1272, 1280, 196, 0, 0 +1272, 1280, 196, 0, 0 + +1274, 1280, 196, 0, 0 +1274, 1024, 157, 0, 0 + +1276, 1280, 196, 0, 0 +1276, 1024, 157, 0, 0 + +1278, 1280, 196, 0, 0 +1278, 1024, 157, 0, 0 + +1280, 1280, 196, 0, 0 +1280, 1280, 196, 0, 0 + +1282, 1280, 196, 0, 0 +1282, 1024, 157, 0, 0 + +1284, 1280, 196, 0, 0 +1284, 1024, 157, 0, 0 + +1286, 1280, 196, 0, 0 +1286, 1024, 157, 0, 0 + +1288, 1280, 196, 0, 0 +1288, 1024, 157, 0, 0 + +1290, 1024, 157, 0, 0 +1290, 768, 118, 0, 0 + +1292, 1024, 157, 0, 0 +1292, 1024, 157, 0, 0 + +1294, 1024, 157, 0, 0 +1294, 768, 118, 0, 0 + +1296, 1024, 157, 0, 0 +1296, 1024, 157, 0, 0 + +1298, 768, 118, 0, 0 +1298, 768, 118, 0, 0 + +1300, 1024, 157, 0, 0 +1300, 768, 118, 0, 0 + +1302, 768, 118, 0, 0 +1302, 768, 118, 0, 0 + +1304, 768, 118, 0, 0 +1304, 768, 118, 0, 0 + +1306, 768, 118, 0, 0 +1306, 512, 78, 0, 0 + +1308, 768, 118, 0, 0 +1308, 768, 118, 0, 0 + +1310, 768, 118, 0, 0 +1310, 768, 118, 0, 0 + +1312, 768, 118, 0, 0 +1312, 768, 118, 0, 0 + +1314, 768, 118, 0, 0 +1314, 512, 78, 0, 0 + +1316, 768, 118, 0, 0 +1316, 768, 118, 0, 0 + +1318, 768, 118, 0, 0 +1318, 512, 78, 0, 0 + +1320, 768, 118, 0, 0 +1320, 768, 118, 0, 0 + +1322, 768, 118, 0, 0 +1322, 768, 118, 0, 0 + +1324, 768, 118, 0, 0 +1324, 768, 118, 0, 0 + +1326, 768, 118, 0, 0 +1326, 512, 78, 0, 0 + +1328, 768, 118, 0, 0 +1328, 768, 118, 0, 0 + +1330, 768, 118, 0, 0 +1330, 512, 78, 0, 0 + +1332, 1024, 157, 0, 0 +1332, 768, 118, 0, 0 + +1334, 768, 118, 0, 0 +1334, 512, 78, 0, 0 + +1336, 768, 118, 0, 0 +1336, 768, 118, 0, 0 + +1338, 768, 118, 0, 0 +1338, 512, 78, 0, 0 + +1340, 1024, 157, 0, 0 +1340, 768, 118, 0, 0 + +1342, 768, 118, 0, 0 +1342, 512, 78, 0, 0 + +1344, 768, 118, 0, 0 +1344, 768, 118, 0, 0 + +1346, 768, 118, 0, 0 +1346, 512, 78, 0, 0 + +1348, 768, 118, 0, 0 +1348, 768, 118, 0, 0 + +1350, 768, 118, 0, 0 +1350, 512, 78, 0, 0 + +1352, 768, 118, 0, 0 +1352, 768, 118, 0, 0 + +1354, 768, 118, 0, 0 +1354, 512, 78, 0, 0 + +1356, 768, 118, 0, 0 +1356, 768, 118, 0, 0 + +1358, 768, 118, 0, 0 +1358, 512, 78, 0, 0 + +1360, 1024, 157, 0, 0 +1360, 768, 118, 0, 0 + +1362, 1024, 157, 0, 0 +1362, 768, 118, 0, 0 + +1364, 1280, 196, 0, 0 +1364, 1024, 157, 0, 0 + +1366, 1280, 196, 0, 0 +1366, 1024, 157, 0, 0 + +1368, 1280, 196, 0, 0 +1368, 1280, 196, 0, 0 + +1370, 1280, 196, 0, 0 +1370, 1024, 157, 0, 0 + +1372, 1536, 236, 0, 0 +1372, 1536, 236, 0, 0 + +1374, 1280, 196, 0, 0 +1374, 1024, 157, 0, 0 + +1376, 1536, 236, 0, 0 +1376, 1280, 196, 0, 0 + +1378, 1280, 196, 0, 0 +1378, 1280, 196, 0, 0 + +1380, 1536, 236, 0, 0 +1380, 1280, 196, 0, 0 + +1382, 1280, 196, 0, 0 +1382, 1280, 196, 0, 0 + +1384, 1280, 196, 0, 0 +1384, 1280, 196, 0, 0 + +1386, 1280, 196, 0, 0 +1386, 1280, 196, 0, 0 + +1388, 1280, 196, 0, 0 +1388, 1280, 196, 0, 0 + +1390, 1280, 196, 0, 0 +1390, 1024, 157, 0, 0 + +1392, 1280, 196, 0, 0 +1392, 1280, 196, 0, 0 + +1394, 1024, 157, 0, 0 +1394, 1024, 157, 0, 0 + +1396, 1280, 196, 0, 0 +1396, 1024, 157, 0, 0 + +1398, 1024, 157, 0, 0 +1398, 1024, 157, 0, 0 + +1400, 1024, 157, 0, 0 +1400, 1024, 157, 0, 0 + +1402, 1024, 157, 0, 0 +1402, 768, 118, 0, 0 + +1404, 1024, 157, 0, 0 +1404, 1024, 157, 0, 0 + +1406, 1024, 157, 0, 0 +1406, 768, 118, 0, 0 + +1408, 1024, 157, 0, 0 +1408, 1024, 157, 0, 0 + +1410, 768, 118, 0, 0 +1410, 768, 118, 0, 0 + +1412, 1024, 157, 0, 0 +1412, 768, 118, 0, 0 + +1414, 768, 118, 0, 0 +1414, 768, 118, 0, 0 + +1416, 1024, 157, 0, 0 +1416, 768, 118, 0, 0 + +1418, 768, 118, 0, 0 +1418, 768, 118, 0, 0 + +1420, 1024, 157, 0, 0 +1420, 768, 118, 0, 0 + +1422, 768, 118, 0, 0 +1422, 512, 78, 0, 0 + +1424, 1024, 157, 0, 0 +1424, 768, 118, 0, 0 + +1426, 768, 118, 0, 0 +1426, 512, 78, 0, 0 + +1428, 1024, 157, 0, 0 +1428, 768, 118, 0, 0 + +1430, 768, 118, 0, 0 +1430, 512, 78, 0, 0 + +1432, 768, 118, 0, 0 +1432, 768, 118, 0, 0 + +1434, 768, 118, 0, 0 +1434, 512, 78, 0, 0 + +1436, 768, 118, 0, 0 +1436, 768, 118, 0, 0 + +1438, 768, 118, 0, 0 +1438, 512, 78, 0, 0 + +1440, 768, 118, 0, 0 +1440, 768, 118, 0, 0 + +1442, 768, 118, 0, 0 +1442, 768, 118, 0, 0 + +1444, 768, 118, 0, 0 +1444, 768, 118, 0, 0 + +1446, 768, 118, 0, 0 +1446, 512, 78, 0, 0 + +1448, 768, 118, 0, 0 +1448, 768, 118, 0, 0 + +1450, 768, 118, 0, 0 +1450, 512, 78, 0, 0 + +1452, 768, 118, 0, 0 +1452, 768, 118, 0, 0 + +1454, 768, 118, 0, 0 +1454, 512, 78, 0, 0 + +1456, 768, 118, 0, 0 +1456, 768, 118, 0, 0 + +1458, 768, 118, 0, 0 +1458, 512, 78, 0, 0 + +1460, 768, 118, 0, 0 +1460, 768, 118, 0, 0 + +1462, 768, 118, 0, 0 +1462, 512, 78, 0, 0 + +1464, 768, 118, 0, 0 +1464, 768, 118, 0, 0 + +1466, 768, 118, 0, 0 +1466, 512, 78, 0, 0 + +1468, 1024, 157, 0, 0 +1468, 768, 118, 0, 0 + +1470, 768, 118, 0, 0 +1470, 512, 78, 0, 0 + +1472, 1024, 157, 0, 0 +1472, 768, 118, 0, 0 + +1474, 768, 118, 0, 0 +1474, 512, 78, 0, 0 + +1476, 1024, 157, 0, 0 +1476, 768, 118, 0, 0 + +1478, 1024, 157, 0, 0 +1478, 768, 118, 0, 0 + +1480, 1024, 157, 0, 0 +1480, 1024, 157, 0, 0 + +1482, 1280, 196, 0, 0 +1482, 1024, 157, 0, 0 + +1484, 1536, 236, 0, 0 +1484, 1280, 196, 0, 0 + +1486, 1536, 236, 0, 0 +1486, 1280, 196, 0, 0 + +1488, 1792, 275, 0, 0 +1488, 1536, 236, 0, 0 + +1490, 1792, 275, 0, 0 +1490, 1536, 236, 0, 0 + +1492, 2048, 314, 0, 0 +1492, 1792, 275, 0, 0 + +1494, 2048, 314, 0, 0 +1494, 1792, 275, 0, 0 + +1496, 2048, 314, 0, 0 +1496, 2048, 314, 0, 0 + +1498, 2048, 314, 0, 0 +1498, 1792, 275, 0, 0 + +1500, 2048, 314, 0, 0 +1500, 2048, 314, 0, 0 + +1502, 2048, 314, 0, 0 +1502, 1792, 275, 0, 0 + +1504, 2048, 314, 0, 0 +1504, 2048, 314, 0, 0 + +1506, 1792, 275, 0, 0 +1506, 1792, 275, 0, 0 + +1508, 2048, 314, 0, 0 +1508, 2048, 314, 0, 0 + +1510, 1792, 275, 0, 0 +1510, 1792, 275, 0, 0 + +1512, 2048, 314, 0, 0 +1512, 1792, 275, 0, 0 + +1514, 1792, 275, 0, 0 +1514, 1536, 236, 0, 0 + +1516, 1536, 236, 0, 0 +1516, 1792, 275, 0, 0 + +1518, 1536, 236, 0, 0 +1518, 1536, 236, 0, 0 + +1520, 1536, 236, 0, 0 +1520, 1536, 236, 0, 0 + +1522, 1536, 236, 0, 0 +1522, 1536, 236, 0, 0 + +1524, 1536, 236, 0, 0 +1524, 1280, 196, 0, 0 + +1526, 1280, 196, 0, 0 +1526, 1280, 196, 0, 0 + +1528, 1280, 196, 0, 0 +1528, 1280, 196, 0, 0 + +1530, 1280, 196, 0, 0 +1530, 1280, 196, 0, 0 + +1532, 1280, 196, 0, 0 +1532, 1280, 196, 0, 0 + +1534, 1280, 196, 0, 0 +1534, 1024, 157, 0, 0 + +1536, 1280, 196, 0, 0 +1536, 1024, 157, 0, 0 + +1538, 1280, 196, 0, 0 +1538, 1024, 157, 0, 0 + +1540, 1280, 196, 0, 0 +1540, 1024, 157, 0, 0 + +1542, 1024, 157, 0, 0 +1542, 1024, 157, 0, 0 + +1544, 1280, 196, 0, 0 +1544, 1024, 157, 0, 0 + +1546, 1024, 157, 0, 0 +1546, 1024, 157, 0, 0 + +1548, 1024, 157, 0, 0 +1548, 1024, 157, 0, 0 + +1550, 1024, 157, 0, 0 +1550, 1024, 157, 0, 0 + +1552, 1024, 157, 0, 0 +1552, 1024, 157, 0, 0 + +1554, 1024, 157, 0, 0 +1554, 768, 118, 0, 0 + +1556, 1024, 157, 0, 0 +1556, 768, 118, 0, 0 + +1558, 1024, 157, 0, 0 +1558, 768, 118, 0, 0 + +1560, 1024, 157, 0, 0 +1560, 768, 118, 0, 0 + +1562, 768, 118, 0, 0 +1562, 768, 118, 0, 0 + +1564, 1024, 157, 0, 0 +1564, 768, 118, 0, 0 + +1566, 768, 118, 0, 0 +1566, 768, 118, 0, 0 + +1568, 1024, 157, 0, 0 +1568, 768, 118, 0, 0 + +1570, 768, 118, 0, 0 +1570, 768, 118, 0, 0 + +1572, 1024, 157, 0, 0 +1572, 768, 118, 0, 0 + +1574, 1024, 157, 0, 0 +1574, 512, 78, 0, 0 + +1576, 1024, 157, 0, 0 +1576, 768, 118, 0, 0 + +1578, 1024, 157, 0, 0 +1578, 768, 118, 0, 0 + +1580, 1024, 157, 0, 0 +1580, 768, 118, 0, 0 + +1582, 768, 118, 0, 0 +1582, 768, 118, 0, 0 + +1584, 768, 118, 0, 0 +1584, 768, 118, 0, 0 + +1586, 768, 118, 0, 0 +1586, 768, 118, 0, 0 + +1588, 768, 118, 0, 0 +1588, 768, 118, 0, 0 + +1590, 768, 118, 0, 0 +1590, 768, 118, 0, 0 + +1592, 1024, 157, 0, 0 +1592, 768, 118, 0, 0 + +1594, 768, 118, 0, 0 +1594, 512, 78, 0, 0 + +1596, 1024, 157, 0, 0 +1596, 768, 118, 0, 0 + +1598, 768, 118, 0, 0 +1598, 768, 118, 0, 0 + +1600, 768, 118, 0, 0 +1600, 768, 118, 0, 0 + +1602, 768, 118, 0, 0 +1602, 512, 78, 0, 0 + +1604, 1024, 157, 0, 0 +1604, 768, 118, 0, 0 + +1606, 768, 118, 0, 0 +1606, 768, 118, 0, 0 + +1608, 1024, 157, 0, 0 +1608, 768, 118, 0, 0 + +1610, 1024, 157, 0, 0 +1610, 768, 118, 0, 0 + +1612, 1280, 196, 0, 0 +1612, 1024, 157, 0, 0 + +1614, 1280, 196, 0, 0 +1614, 1024, 157, 0, 0 + +1616, 1280, 196, 0, 0 +1616, 1280, 196, 0, 0 + +1618, 1280, 196, 0, 0 +1618, 1280, 196, 0, 0 + +1620, 1536, 236, 0, 0 +1620, 1536, 236, 0, 0 + +1622, 1536, 236, 0, 0 +1622, 1280, 196, 0, 0 + +1624, 1536, 236, 0, 0 +1624, 1536, 236, 0, 0 + +1626, 1536, 236, 0, 0 +1626, 1536, 236, 0, 0 + +1628, 1536, 236, 0, 0 +1628, 1536, 236, 0, 0 + +1630, 1536, 236, 0, 0 +1630, 1536, 236, 0, 0 + +1632, 1536, 236, 0, 0 +1632, 1536, 236, 0, 0 + +1634, 1536, 236, 0, 0 +1634, 1280, 196, 0, 0 + +1636, 1536, 236, 0, 0 +1636, 1280, 196, 0, 0 + +1638, 1280, 196, 0, 0 +1638, 1280, 196, 0, 0 + +1640, 1536, 236, 0, 0 +1640, 1280, 196, 0, 0 + +1642, 1280, 196, 0, 0 +1642, 1280, 196, 0, 0 + +1644, 1280, 196, 0, 0 +1644, 1280, 196, 0, 0 + +1646, 1280, 196, 0, 0 +1646, 1024, 157, 0, 0 + +1648, 1280, 196, 0, 0 +1648, 1280, 196, 0, 0 + +1650, 1024, 157, 0, 0 +1650, 1024, 157, 0, 0 + +1652, 1280, 196, 0, 0 +1652, 1024, 157, 0, 0 + +1654, 1024, 157, 0, 0 +1654, 1024, 157, 0, 0 + +1656, 1024, 157, 0, 0 +1656, 1024, 157, 0, 0 + +1658, 1024, 157, 0, 0 +1658, 1024, 157, 0, 0 + +1660, 1024, 157, 0, 0 +1660, 1024, 157, 0, 0 + +1662, 1024, 157, 0, 0 +1662, 768, 118, 0, 0 + +1664, 1024, 157, 0, 0 +1664, 1024, 157, 0, 0 + +1666, 1024, 157, 0, 0 +1666, 768, 118, 0, 0 + +1668, 1024, 157, 0, 0 +1668, 1024, 157, 0, 0 + +1670, 1024, 157, 0, 0 +1670, 768, 118, 0, 0 + +1672, 1024, 157, 0, 0 +1672, 768, 118, 0, 0 + +1674, 768, 118, 0, 0 +1674, 768, 118, 0, 0 + +1676, 768, 118, 0, 0 +1676, 1024, 157, 0, 0 + +1678, 768, 118, 0, 0 +1678, 768, 118, 0, 0 + +1680, 1024, 157, 0, 0 +1680, 1024, 157, 0, 0 + +1682, 1024, 157, 0, 0 +1682, 768, 118, 0, 0 + +1684, 768, 118, 0, 0 +1684, 768, 118, 0, 0 + +1686, 768, 118, 0, 0 +1686, 768, 118, 0, 0 + +1688, 768, 118, 0, 0 +1688, 768, 118, 0, 0 + +1690, 768, 118, 0, 0 +1690, 768, 118, 0, 0 + +1692, 1024, 157, 0, 0 +1692, 1024, 157, 0, 0 + +1694, 768, 118, 0, 0 +1694, 768, 118, 0, 0 + +1696, 1024, 157, 0, 0 +1696, 768, 118, 0, 0 + +1698, 768, 118, 0, 0 +1698, 768, 118, 0, 0 + +1700, 768, 118, 0, 0 +1700, 768, 118, 0, 0 + +1702, 768, 118, 0, 0 +1702, 768, 118, 0, 0 + +1704, 768, 118, 0, 0 +1704, 768, 118, 0, 0 + +1706, 768, 118, 0, 0 +1706, 512, 78, 0, 0 + +1708, 768, 118, 0, 0 +1708, 768, 118, 0, 0 + +1710, 768, 118, 0, 0 +1710, 768, 118, 0, 0 + +1712, 1024, 157, 0, 0 +1712, 768, 118, 0, 0 + +1714, 768, 118, 0, 0 +1714, 768, 118, 0, 0 + +1716, 1024, 157, 0, 0 +1716, 768, 118, 0, 0 + +1718, 768, 118, 0, 0 +1718, 768, 118, 0, 0 + +1720, 1024, 157, 0, 0 +1720, 1024, 157, 0, 0 + +1722, 768, 118, 0, 0 +1722, 768, 118, 0, 0 + +1724, 768, 118, 0, 0 +1724, 768, 118, 0, 0 + +1726, 1024, 157, 0, 0 +1726, 768, 118, 0, 0 + +1728, 1024, 157, 0, 0 +1728, 1024, 157, 0, 0 + +1730, 1024, 157, 0, 0 +1730, 1024, 157, 0, 0 + +1732, 1536, 236, 0, 0 +1732, 1280, 196, 0, 0 + +1734, 1536, 236, 0, 0 +1734, 1280, 196, 0, 0 + +1736, 1792, 275, 0, 0 +1736, 1536, 236, 0, 0 + +1738, 1792, 275, 0, 0 +1738, 1792, 275, 0, 0 + +1740, 2048, 314, 0, 0 +1740, 2048, 314, 0, 0 + +1742, 2048, 314, 0, 0 +1742, 1792, 275, 0, 0 + +1744, 2304, 354, 0, 0 +1744, 2048, 314, 0, 0 + +1746, 2304, 354, 0, 0 +1746, 2048, 314, 0, 0 + +1748, 2304, 354, 0, 0 +1748, 2304, 354, 0, 0 + +1750, 2304, 354, 0, 0 +1750, 2048, 314, 0, 0 + +1752, 2304, 354, 0, 0 +1752, 2304, 354, 0, 0 + +1754, 2048, 314, 0, 0 +1754, 2048, 314, 0, 0 + +1756, 2304, 354, 0, 0 +1756, 2048, 314, 0, 0 + +1758, 2048, 314, 0, 0 +1758, 1792, 275, 0, 0 + +1760, 2048, 314, 0, 0 +1760, 2048, 314, 0, 0 + +1762, 1792, 275, 0, 0 +1762, 1792, 275, 0, 0 + +1764, 1792, 275, 0, 0 +1764, 1792, 275, 0, 0 + +1766, 1792, 275, 0, 0 +1766, 1792, 275, 0, 0 + +1768, 1792, 275, 0, 0 +1768, 1792, 275, 0, 0 + +1770, 1536, 236, 0, 0 +1770, 1792, 275, 0, 0 + +1772, 1536, 236, 0, 0 +1772, 1536, 236, 0, 0 + +1774, 1536, 236, 0, 0 +1774, 1536, 236, 0, 0 + +1776, 1536, 236, 0, 0 +1776, 1536, 236, 0, 0 + +1778, 1280, 196, 0, 0 +1778, 1280, 196, 0, 0 + +1780, 1280, 196, 0, 0 +1780, 1280, 196, 0, 0 + +1782, 1280, 196, 0, 0 +1782, 1280, 196, 0, 0 + +1784, 1280, 196, 0, 0 +1784, 1280, 196, 0, 0 + +1786, 1024, 157, 0, 0 +1786, 1280, 196, 0, 0 + +1788, 1280, 196, 0, 0 +1788, 1024, 157, 0, 0 + +1790, 1024, 157, 0, 0 +1790, 1280, 196, 0, 0 + +1792, 1024, 157, 0, 0 +1792, 1024, 157, 0, 0 + +1794, 1024, 157, 0, 0 +1794, 1024, 157, 0, 0 + +1796, 1024, 157, 0, 0 +1796, 1024, 157, 0, 0 + +1798, 1024, 157, 0, 0 +1798, 768, 118, 0, 0 + +1800, 768, 118, 0, 0 +1800, 1024, 157, 0, 0 + +1802, 1024, 157, 0, 0 +1802, 768, 118, 0, 0 + +1804, 1024, 157, 0, 0 +1804, 1024, 157, 0, 0 + +1806, 1024, 157, 0, 0 +1806, 768, 118, 0, 0 + +1808, 1024, 157, 0, 0 +1808, 1024, 157, 0, 0 + +1810, 768, 118, 0, 0 +1810, 768, 118, 0, 0 + +1812, 1024, 157, 0, 0 +1812, 1024, 157, 0, 0 + +1814, 768, 118, 0, 0 +1814, 768, 118, 0, 0 + +1816, 1024, 157, 0, 0 +1816, 768, 118, 0, 0 + +1818, 768, 118, 0, 0 +1818, 768, 118, 0, 0 + +1820, 1024, 157, 0, 0 +1820, 768, 118, 0, 0 + +1822, 768, 118, 0, 0 +1822, 768, 118, 0, 0 + +1824, 1024, 157, 0, 0 +1824, 768, 118, 0, 0 + +1826, 768, 118, 0, 0 +1826, 768, 118, 0, 0 + +1828, 1024, 157, 0, 0 +1828, 1024, 157, 0, 0 + +1830, 768, 118, 0, 0 +1830, 768, 118, 0, 0 + +1832, 768, 118, 0, 0 +1832, 768, 118, 0, 0 + +1834, 768, 118, 0, 0 +1834, 768, 118, 0, 0 + +1836, 1024, 157, 0, 0 +1836, 768, 118, 0, 0 + +1838, 768, 118, 0, 0 +1838, 768, 118, 0, 0 + +1840, 1024, 157, 0, 0 +1840, 768, 118, 0, 0 + +1842, 768, 118, 0, 0 +1842, 768, 118, 0, 0 + +1844, 1024, 157, 0, 0 +1844, 768, 118, 0, 0 + +1846, 768, 118, 0, 0 +1846, 768, 118, 0, 0 + +1848, 768, 118, 0, 0 +1848, 768, 118, 0, 0 + +1850, 768, 118, 0, 0 +1850, 768, 118, 0, 0 + +1852, 768, 118, 0, 0 +1852, 768, 118, 0, 0 + +1854, 768, 118, 0, 0 +1854, 768, 118, 0, 0 + +1856, 768, 118, 0, 0 +1856, 768, 118, 0, 0 + +1858, 768, 118, 0, 0 +1858, 768, 118, 0, 0 + +1860, 1024, 157, 0, 0 +1860, 1024, 157, 0, 0 + +1862, 1024, 157, 0, 0 +1862, 1024, 157, 0, 0 + +1864, 1280, 196, 0, 0 +1864, 1024, 157, 0, 0 + +1866, 1280, 196, 0, 0 +1866, 1280, 196, 0, 0 + +1868, 1536, 236, 0, 0 +1868, 1280, 196, 0, 0 + +1870, 1280, 196, 0, 0 +1870, 1280, 196, 0, 0 + +1872, 1536, 236, 0, 0 +1872, 1536, 236, 0, 0 + +1874, 1536, 236, 0, 0 +1874, 1280, 196, 0, 0 + +1876, 1536, 236, 0, 0 +1876, 1536, 236, 0, 0 + +1878, 1280, 196, 0, 0 +1878, 1280, 196, 0, 0 + +1880, 1280, 196, 0, 0 +1880, 1536, 236, 0, 0 + +1882, 1280, 196, 0, 0 +1882, 1280, 196, 0, 0 + +1884, 1536, 236, 0, 0 +1884, 1536, 236, 0, 0 + +1886, 1536, 236, 0, 0 +1886, 1280, 196, 0, 0 + +1888, 1536, 236, 0, 0 +1888, 1280, 196, 0, 0 + +1890, 1280, 196, 0, 0 +1890, 1280, 196, 0, 0 + +1892, 1280, 196, 0, 0 +1892, 1280, 196, 0, 0 + +1894, 1280, 196, 0, 0 +1894, 1280, 196, 0, 0 + +1896, 1280, 196, 0, 0 +1896, 1280, 196, 0, 0 + +1898, 1280, 196, 0, 0 +1898, 1024, 157, 0, 0 + +1900, 1024, 157, 0, 0 +1900, 1024, 157, 0, 0 + +1902, 1024, 157, 0, 0 +1902, 1024, 157, 0, 0 + +1904, 1280, 196, 0, 0 +1904, 1024, 157, 0, 0 + +1906, 1024, 157, 0, 0 +1906, 1024, 157, 0, 0 + +1908, 1024, 157, 0, 0 +1908, 1024, 157, 0, 0 + +1910, 1024, 157, 0, 0 +1910, 1024, 157, 0, 0 + +1912, 1024, 157, 0, 0 +1912, 1024, 157, 0, 0 + +1914, 1024, 157, 0, 0 +1914, 768, 118, 0, 0 + +1916, 1024, 157, 0, 0 +1916, 1024, 157, 0, 0 + +1918, 768, 118, 0, 0 +1918, 768, 118, 0, 0 + +1920, 1024, 157, 0, 0 +1920, 1024, 157, 0, 0 + +1922, 768, 118, 0, 0 +1922, 768, 118, 0, 0 + +1924, 1024, 157, 0, 0 +1924, 1024, 157, 0, 0 + +1926, 768, 118, 0, 0 +1926, 768, 118, 0, 0 + +1928, 1024, 157, 0, 0 +1928, 768, 118, 0, 0 + +1930, 768, 118, 0, 0 +1930, 768, 118, 0, 0 + +1932, 1024, 157, 0, 0 +1932, 768, 118, 0, 0 + +1934, 768, 118, 0, 0 +1934, 768, 118, 0, 0 + +1936, 768, 118, 0, 0 +1936, 768, 118, 0, 0 + +1938, 768, 118, 0, 0 +1938, 768, 118, 0, 0 + +1940, 1024, 157, 0, 0 +1940, 768, 118, 0, 0 + +1942, 768, 118, 0, 0 +1942, 768, 118, 0, 0 + +1944, 1024, 157, 0, 0 +1944, 768, 118, 0, 0 + +1946, 768, 118, 0, 0 +1946, 768, 118, 0, 0 + +1948, 1024, 157, 0, 0 +1948, 768, 118, 0, 0 + +1950, 768, 118, 0, 0 +1950, 768, 118, 0, 0 + +1952, 1024, 157, 0, 0 +1952, 768, 118, 0, 0 + +1954, 768, 118, 0, 0 +1954, 768, 118, 0, 0 + +1956, 768, 118, 0, 0 +1956, 768, 118, 0, 0 + +1958, 768, 118, 0, 0 +1958, 512, 78, 0, 0 + +1960, 768, 118, 0, 0 +1960, 768, 118, 0, 0 + +1962, 768, 118, 0, 0 +1962, 512, 78, 0, 0 + +1964, 1024, 157, 0, 0 +1964, 1024, 157, 0, 0 + +1966, 768, 118, 0, 0 +1966, 768, 118, 0, 0 + +1968, 1024, 157, 0, 0 +1968, 768, 118, 0, 0 + +1970, 768, 118, 0, 0 +1970, 768, 118, 0, 0 + +1972, 1024, 157, 0, 0 +1972, 768, 118, 0, 0 + +1974, 1024, 157, 0, 0 +1974, 768, 118, 0, 0 + +1976, 1024, 157, 0, 0 +1976, 1024, 157, 0, 0 + +1978, 1024, 157, 0, 0 +1978, 1024, 157, 0, 0 + +1980, 1280, 196, 0, 0 +1980, 1024, 157, 0, 0 + +1982, 1280, 196, 0, 0 +1982, 1280, 196, 0, 0 + +1984, 2048, 314, 0, 0 +1984, 1280, 196, 0, 0 + +1986, 3328, 511, 0, 0 +1986, 1024, 157, 0, 0 + +1988, 4864, 748, 0, 0 +1988, 1280, 196, 0, 0 + +1990, 5888, 905, 0, 0 +1990, 1280, 196, 0, 0 + +1992, 6912, 1062, 0, 0 +1992, 1536, 236, 0, 0 + +1994, 7680, 1181, 0, 0 +1994, 1280, 196, 0, 0 + +1996, 8448, 1299, 0, 0 +1996, 1536, 236, 0, 0 + +1998, 9216, 1417, 0, 0 +1998, 1536, 236, 0, 0 + +2000, 9728, 1496, 0, 0 +2000, 1792, 275, 0, 0 + +2002, 10240, 1574, 0, 0 +2002, 1792, 275, 0, 0 + +2004, 11008, 1692, 0, 0 +2004, 1792, 275, 0, 0 + +2006, 11776, 1811, 0, 0 +2006, 1536, 236, 0, 0 + +2008, 12288, 1889, 0, 0 +2008, 1536, 236, 0, 0 + +2010, 12544, 1929, 0, 0 +2010, 1536, 236, 0, 0 + +2012, 13056, 2007, 0, 0 +2012, 1792, 275, 0, 0 + +2014, 13568, 2086, 0, 0 +2014, 1536, 236, 0, 0 + +2016, 14080, 2165, 0, 0 +2016, 1536, 236, 0, 0 + +2018, 14336, 2204, 0, 0 +2018, 1536, 236, 0, 0 + +2020, 14848, 2283, 0, 0 +2020, 1536, 236, 0, 0 + +2022, 15104, 2322, 0, 0 +2022, 1280, 196, 0, 0 + +2024, 15360, 2362, 0, 0 +2024, 1536, 236, 0, 0 + +2026, 15616, 2401, 0, 0 +2026, 1280, 196, 0, 0 + +2028, 15872, 2440, 0, 0 +2028, 1536, 236, 0, 0 + +2030, 16384, 2519, 0, 0 +2030, 1280, 196, 0, 0 + +2032, 16384, 2519, 0, 0 +2032, 1280, 196, 0, 0 + +2034, 16640, 2559, 0, 0 +2034, 1024, 157, 0, 0 + +2036, 16896, 2598, 0, 0 +2036, 1280, 196, 0, 0 + +2038, 17152, 2637, 0, 0 +2038, 1024, 157, 0, 0 + +2040, 17152, 2637, 0, 0 +2040, 1024, 157, 0, 0 + +2042, 17408, 2677, 0, 0 +2042, 1024, 157, 0, 0 + +2044, 17664, 2716, 0, 0 +2044, 1024, 157, 0, 0 + +2046, 17920, 2755, 0, 0 +2046, 1024, 157, 0, 0 + diff --git a/dotnet example/bin/Release/ps5000example.exe b/dotnet example/bin/Release/ps5000example.exe new file mode 100644 index 0000000..85730b7 Binary files /dev/null and b/dotnet example/bin/Release/ps5000example.exe differ diff --git a/dotnet example/ps5000example.csproj b/dotnet example/ps5000example.csproj new file mode 100644 index 0000000..ef3beb7 --- /dev/null +++ b/dotnet example/ps5000example.csproj @@ -0,0 +1,111 @@ + + + Debug + AnyCPU + 9.0.21022 + 2.0 + {105D08D9-97FD-43A7-AD6F-3DAD94F04644} + Exe + Properties + ps5000example + ps5000example + + + + + 2.0 + v3.5 + Full + false + false + LocalIntranet + false + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + true + Properties\app.manifest + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + true + x86 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + true + + + + + + + + + + + + + False + .NET Framework Client Profile + false + + + False + .NET Framework 2.0 %28x86%29 + false + + + False + .NET Framework 3.0 %28x86%29 + false + + + False + .NET Framework 3.5 + false + + + False + .NET Framework 3.5 SP1 + true + + + False + Windows Installer 3.1 + true + + + + + + + + \ No newline at end of file diff --git a/dotnet example/ps5000example.csproj.user b/dotnet example/ps5000example.csproj.user new file mode 100644 index 0000000..90b1e1e --- /dev/null +++ b/dotnet example/ps5000example.csproj.user @@ -0,0 +1,27 @@ + + + publish\ + + + + + + + + + + + de-DE + false + + + + + + + + + + + + \ No newline at end of file diff --git a/dotnet example/ps5000example.sln b/dotnet example/ps5000example.sln new file mode 100644 index 0000000..fa975f6 --- /dev/null +++ b/dotnet example/ps5000example.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual C# Express 2008 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ps5000example", "ps5000example.csproj", "{105D08D9-97FD-43A7-AD6F-3DAD94F04644}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {105D08D9-97FD-43A7-AD6F-3DAD94F04644}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {105D08D9-97FD-43A7-AD6F-3DAD94F04644}.Debug|Any CPU.Build.0 = Debug|Any CPU + {105D08D9-97FD-43A7-AD6F-3DAD94F04644}.Release|Any CPU.ActiveCfg = Release|Any CPU + {105D08D9-97FD-43A7-AD6F-3DAD94F04644}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal