private void deviceThread() { List <Fmd> preenrollmentFmds = new List <Fmd>(); Reader activeReader = null; CaptureResult captureResult; STATE state = STATE.IDLE; COMMAND com = COMMAND.NONE; int enrollCount = 0; try { ReaderCollection readers = ReaderCollection.GetReaders(); foreach (var reader in readers) { if (reader.Description.Name == Id) { activeReader = reader; break; } } if (activeReader != null) { activeReader.Open(Constants.CapturePriority.DP_PRIORITY_EXCLUSIVE); } while (true) { cancelToken.Token.ThrowIfCancellationRequested(); if (state == STATE.IDLE) { com = queue.Take(cancelToken.Token); } else { // non blocking take if (queue.Count > 0) { com = queue.Take(); } } StopOngoingStream(ref state, activeReader, com); switch (com) { case COMMAND.LIVECAPTURE_START: activeReader.StartStreaming(); state = STATE.TEST; break; case COMMAND.LIVECAPTURE_STOP: state = STATE.IDLE; break; case COMMAND.SINGLECAPTURE_START: state = STATE.GETSINGLE; break; case COMMAND.SINGLECAPTURE_STOP: state = STATE.IDLE; break; case COMMAND.ENROLLMENT_START: state = STATE.GETFINGER; enrollCount = 0; preenrollmentFmds.Clear(); resultBios.Clear(); break; case COMMAND.ENROLLMENT_STOP: state = STATE.IDLE; break; } com = COMMAND.NONE; switch (state) { case STATE.TEST: SendBaseMessage("Please, touch the scanner"); captureResult = activeReader.GetStreamImage(Constants.Formats.Fid.ANSI, Constants.CaptureProcessing.DP_IMG_PROC_DEFAULT, activeReader.Capabilities.Resolutions[0]); if (captureResult.ResultCode == Constants.ResultCode.DP_DEVICE_FAILURE || captureResult.ResultCode == Constants.ResultCode.DP_DEVICE_BUSY) { Console.WriteLine("DEVICE_FAILURE, perfoming RESET" + captureResult.ResultCode); activeReader.Reset(); activeReader.StartStreaming(); break; } if (!CheckIfReaderIsOnline(captureResult, activeReader)) { state = STATE.IDLE; break; } if (captureResult.ResultCode == Constants.ResultCode.DP_SUCCESS) { OnBiometricsCaptured(new FingerImageDP(captureResult.Data)); } else { System.Console.WriteLine(captureResult.ResultCode); } break; case STATE.GETSINGLE: state = STATE.GETSINGLEIMAGE; SendBaseMessage("Please, touch the scanner"); break; case STATE.GETSINGLEIMAGE: captureResult = activeReader.Capture(Constants.Formats.Fid.ANSI, Constants.CaptureProcessing.DP_IMG_PROC_DEFAULT, 50, activeReader.Capabilities.Resolutions[0]); if (!CheckIfReaderIsOnline(captureResult, activeReader)) { state = STATE.IDLE; break; } if (!CheckCaptureResult(captureResult)) { break; } OnSingleCaptured(new FingerImageDP(captureResult.Data)); state = STATE.GETSINGLE; break; case STATE.GETFINGER: SendBaseMessage("Put finger on the scanner and then lift it up, when Image is captured"); state = STATE.GETIMAGE; break; case STATE.GETIMAGE: captureResult = activeReader.Capture(Constants.Formats.Fid.ANSI, Constants.CaptureProcessing.DP_IMG_PROC_DEFAULT, 50, activeReader.Capabilities.Resolutions[0]); if (!CheckIfReaderIsOnline(captureResult, activeReader)) { state = STATE.IDLE; break; } if (!CheckCaptureResult(captureResult)) { break; } FingerImageDP image = new FingerImageDP(captureResult.Data); OnBiometricsCaptured(image); enrollCount++; OnSendProgressMessage(enrollCount * 20); var template = _devControl.Extract(image); if (template == null) { OnBiometricsEnrolled(null); break; } preenrollmentFmds.Add((template as TemplateDP).fmd); if (enrollCount > 4) { state = STATE.IDLE; DataResult <Fmd> resultEnrollment = DPUruNet.Enrollment.CreateEnrollmentFmd(Constants.Formats.Fmd.ANSI, preenrollmentFmds); if (resultEnrollment.ResultCode == Constants.ResultCode.DP_SUCCESS) { resultBios.Add(new TemplateDP(resultEnrollment.Data)); SendPopUpMessage("Successfully registered"); OnBiometricsEnrolled(resultBios.ToList()); break; } SendPopUpMessage("Can't create template, please repeat"); OnBiometricsEnrolled(null); } else { state = STATE.GETFINGER; } break; case STATE.IDLE: break; } } } catch { } finally { activeReader.Reset(); } }
private void OnSingleCaptured(FingerImageDP image) { Ambassador.AddMessage(new MBiometricsSingleCaptured(this, image)); }