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)); }
public ScanResult ReadInterleavedScan(DroppedFrameResponse droppedFrameResponse) { return(ReadInterleavedScan(droppedFrameResponse, useSymmetricXCoordinates: true, timeoutMilliseconds: DefaultTimeout)); }
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)); }