コード例 #1
0
ファイル: AP820Scanner.cs プロジェクト: dmcclean/automation
        public ScanResult ReadInterleavedScan(DroppedFrameResponse droppedFrameResponse, bool useSymmetricXCoordinates, uint timeoutMilliseconds)
        {
            AssertValidHandle();

            byte[] buffer1 = new byte[BufferLength];
            byte[] buffer2 = new byte[BufferLength];

            bool success = GetScanRawData(buffer1, timeoutMilliseconds);

            if (!success)
            {
                return(null);
            }

            if (ScanResult.PeekImageNumber(buffer1) % 2 == 0)
            {
                // we want to start with an odd-numbered buffer, so repeat the process
                success = GetScanRawData(buffer1, timeoutMilliseconds);

                if (!success)
                {
                    return(null);
                }
            }

            // we now have a valid first image, get the second one
            success = GetScanRawData(buffer2, timeoutMilliseconds);
            if (!success)
            {
                return(null);
            }

            return(ScanResult.FromBufferPair(_scannerInformation, buffer1, buffer2, droppedFrameResponse, useSymmetricXCoordinates));
        }
コード例 #2
0
ファイル: AP820Scanner.cs プロジェクト: dmcclean/automation
 public ScanResult ReadInterleavedScan(DroppedFrameResponse droppedFrameResponse)
 {
     return(ReadInterleavedScan(droppedFrameResponse, useSymmetricXCoordinates: true, timeoutMilliseconds: DefaultTimeout));
 }
コード例 #3
0
ファイル: ScanResult.cs プロジェクト: dmcclean/automation
        public static ScanResult FromBufferPair(ScannerInformation scanInfo, byte[] buffer1, byte[] buffer2, DroppedFrameResponse droppedFrameResponse, bool useSymmetricXCoordinates)
        {
            var numXPixels = scanInfo.NumXPixels;

            if (numXPixels != ExpectedNumberOfXPixels)
            {
                throw new ArgumentException("Unsupported number of X pixels.");
            }

            var encoderPosition   = ReadSigned27BitValue(buffer1, EncoderPositionOffset);
            var imageNumber       = buffer1[ImageNumberOffset];
            var secondImageNumber = buffer2[ImageNumberOffset];

            if (secondImageNumber != imageNumber + 1)
            {
                // buffer pair is not sequential, we dropped a frame
                switch (droppedFrameResponse)
                {
                case DroppedFrameResponse.ThrowException:
                default:
                    throw new ApplicationException("Non-sequential buffer pair.");

                case DroppedFrameResponse.Ignore:
                case DroppedFrameResponse.IgnoreOnce:
                    return(null);

                case DroppedFrameResponse.ReturnNonInterleaved:
                    return(FromSingleBuffer(scanInfo, buffer2, useSymmetricXCoordinates));
                }
            }

            var xScale = scanInfo.XScaleFactor;
            var zScale = scanInfo.ZScaleFactor;
            var iScale = 1.0 / byte.MaxValue;

            var xOffset = useSymmetricXCoordinates ? -(scanInfo.ScanRangeEnd / 10.0) / 2 : 0;

            var points = new Vector3[2 * numXPixels];

            for (int i = 0; i < numXPixels; i++)
            {
                var offset = ScanDataOffset + i * StrideOfScanData;

                points[2 * i]     = ReadVector(buffer1, offset, xScale, zScale, iScale, xOffset);
                points[2 * i + 1] = ReadVector(buffer2, offset, xScale, zScale, iScale, xOffset);
            }

            return(new ScanResult(encoderPosition, imageNumber, secondImageNumber, points));
        }