|
- using MvCodeReaderSDKNet;
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Runtime.InteropServices;
- using System.Text;
- using System.Threading;
- using System.Threading.Tasks;
-
- namespace LeatherApp.Device
- {
- /// <summary>
- /// 扫描器操作类
- /// </summary>
- public class ScannerCodeDev
- {
- public Action<DateTime,WarningEnum, string> WarningEvent;
- public Action<string> ScanerEvent;
-
-
- //
- MvCodeReader.MV_CODEREADER_DEVICE_INFO_LIST m_stDeviceList;
- private MvCodeReader m_cMyDevice;
- bool m_bGrabbing = false;
- Thread m_hReceiveThread = null;
-
- public bool start(int devIndex=0)
- {
- try
- {
- m_stDeviceList = new MvCodeReader.MV_CODEREADER_DEVICE_INFO_LIST();
- m_cMyDevice = new MvCodeReader();
- //====枚举设备
- if (!DeviceListAcq())
- return false;
-
- //====打开设置
- if (m_stDeviceList.nDeviceNum == 0 )
- {
- ShowErrorMsg("No stDevInfo, please select", 0);
- return false;
- }
-
- // ch:获取选择的设备信息 | en:Get selected stDevInfo information
- MvCodeReader.MV_CODEREADER_DEVICE_INFO stDevInfo =
- (MvCodeReader.MV_CODEREADER_DEVICE_INFO)Marshal.PtrToStructure(m_stDeviceList.pDeviceInfo[devIndex],
- typeof(MvCodeReader.MV_CODEREADER_DEVICE_INFO));
-
- // ch:打开设备 | en:Open stDevInfo
- if (null == m_cMyDevice)
- {
- m_cMyDevice = new MvCodeReader();
- if (null == m_cMyDevice)
- {
- return false;
- }
- }
-
- int nRet = m_cMyDevice.MV_CODEREADER_CreateHandle_NET(ref stDevInfo);
- if (MvCodeReader.MV_CODEREADER_OK != nRet)
- {
- ShowErrorMsg("MV_CODEREADER_CreateHandle_NET fail!", nRet);
- return false;
- }
-
- nRet = m_cMyDevice.MV_CODEREADER_OpenDevice_NET();
- if (MvCodeReader.MV_CODEREADER_OK != nRet)
- {
- m_cMyDevice.MV_CODEREADER_DestroyHandle_NET();
- ShowErrorMsg("Device open fail!", nRet);
- return false;
- }
-
- // ch:设置采集连续模式 | en:Set Continues Aquisition Mode
- nRet = m_cMyDevice.MV_CODEREADER_SetEnumValue_NET("TriggerMode", (uint)MvCodeReader.MV_CODEREADER_TRIGGER_MODE.MV_CODEREADER_TRIGGER_MODE_OFF);
- if (MvCodeReader.MV_CODEREADER_OK != nRet)
- {
- ShowErrorMsg("Set TriggerMode Off Fail!", nRet);
- return false;
- }
- //bnGetParam_Click(null, null);// ch:获取参数 | en:Get parameters
-
- //====开始采集
- // ch:标志位置位true | en:Set position bit true
- m_hReceiveThread = new Thread(ReceiveThreadProcess);
- m_hReceiveThread.Start();
- m_bGrabbing = true;
-
- // ch:开始采集 | en:Start Grabbing
- nRet = m_cMyDevice.MV_CODEREADER_StartGrabbing_NET();
- if (MvCodeReader.MV_CODEREADER_OK != nRet)
- {
- stop();
- //m_bGrabbing = false;
- //m_hReceiveThread.Join();
- ShowErrorMsg("Start Grabbing Fail!", nRet);
- return false;
- }
-
- return true;
- }
- catch (Exception ex)
- {
- WarningEvent?.Invoke(DateTime.Now,WarningEnum.Normal, ex.Message);
- return false;
- }
- }
- public bool stop()
- {
- if (!m_bGrabbing) return true;
- try
- {
- // ch:标志位设为false | en:Set flag bit false
- m_bGrabbing = false;
-
- // ch:停止采集 | en:Stop Grabbing
- int nRet = m_cMyDevice.MV_CODEREADER_StopGrabbing_NET();
- if (nRet != MvCodeReader.MV_CODEREADER_OK)
- {
- ShowErrorMsg("Stop Grabbing Fail!", nRet);
- }
-
- if (null != m_hReceiveThread)
- {
- m_hReceiveThread.Join();
- }
-
- //==关闭设备
- // ch:取流标志位清零 | en:Reset flow flag bit
- if (m_bGrabbing == true)
- {
- m_bGrabbing = false;
- // ch:停止采集 | en:Stop Grabbing
- m_cMyDevice.MV_CODEREADER_StopGrabbing_NET();
- m_hReceiveThread.Join();
- }
-
- // ch:关闭设备 | en:Close Device
- m_cMyDevice.MV_CODEREADER_CloseDevice_NET();
- m_cMyDevice.MV_CODEREADER_DestroyHandle_NET();
- return true;
- }
- catch
- {
- return false;
- }
-
- }
-
- //枚举设备
- private bool DeviceListAcq()
- {
- // ch:创建设备列表 | en:Create Device List
- System.GC.Collect();
- m_stDeviceList.nDeviceNum = 0;
- int nRet = MvCodeReader.MV_CODEREADER_EnumDevices_NET(ref m_stDeviceList, MvCodeReader.MV_CODEREADER_GIGE_DEVICE);
- if (0 != nRet)
- {
- ShowErrorMsg("Enumerate devices fail!", nRet);
- return false;
- }
-
- if (0 == m_stDeviceList.nDeviceNum)
- {
- ShowErrorMsg("None Device!", 0);
- return false;
- }
-
- return true;
- }
- //设置连续模式
- private bool setMode()
- {
- int nRet = m_cMyDevice.MV_CODEREADER_SetEnumValue_NET("TriggerMode", (uint)MvCodeReader.MV_CODEREADER_TRIGGER_MODE.MV_CODEREADER_TRIGGER_MODE_OFF);
- if (MvCodeReader.MV_CODEREADER_OK != nRet)
- {
- ShowErrorMsg("Set TriggerMode Off Fail!", nRet);
- return false;
- }
- return true;
- }
- public void ReceiveThreadProcess()
- {
- int nRet = MvCodeReader.MV_CODEREADER_OK;
-
- IntPtr pData = IntPtr.Zero;
- MvCodeReader.MV_CODEREADER_IMAGE_OUT_INFO_EX2 stFrameInfoEx2 = new MvCodeReader.MV_CODEREADER_IMAGE_OUT_INFO_EX2();
- IntPtr pstFrameInfoEx2 = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(MvCodeReader.MV_CODEREADER_IMAGE_OUT_INFO_EX2)));
- Marshal.StructureToPtr(stFrameInfoEx2, pstFrameInfoEx2, false);
-
- while (m_bGrabbing)
- {
- nRet = m_cMyDevice.MV_CODEREADER_GetOneFrameTimeoutEx2_NET(ref pData, pstFrameInfoEx2, 1000);
- if (nRet == MvCodeReader.MV_CODEREADER_OK)
- {
- stFrameInfoEx2 = (MvCodeReader.MV_CODEREADER_IMAGE_OUT_INFO_EX2)Marshal.PtrToStructure(pstFrameInfoEx2, typeof(MvCodeReader.MV_CODEREADER_IMAGE_OUT_INFO_EX2));
- }
-
- if (nRet == MvCodeReader.MV_CODEREADER_OK)
- {
- if (0 >= stFrameInfoEx2.nFrameLen)
- {
- continue;
- }
-
- MvCodeReader.MV_CODEREADER_RESULT_BCR_EX2 stBcrResultEx2 = (MvCodeReader.MV_CODEREADER_RESULT_BCR_EX2)Marshal.PtrToStructure(stFrameInfoEx2.UnparsedBcrList.pstCodeListEx2, typeof(MvCodeReader.MV_CODEREADER_RESULT_BCR_EX2));
- List<string> barCodes = new List<string>();
- for (int i = 0; i < stBcrResultEx2.nCodeNum; ++i)
- {
- //DataGridViewRow cDataRow = new DataGridViewRow();
- //cDataRow.CreateCells(dataGridView1);
- //cDataRow.Cells[0].Value = this.dataGridView1.Rows.Count;
- //DateTime cDateTime = DateTime.Now;
- //cDataRow.Cells[1].Value = cDateTime.ToString();
- //cDataRow.Cells[2].Value = stBcrResultEx2.stBcrInfoEx2[i].nTotalProcCost.ToString();
- //cDataRow.Cells[3].Value = stBcrResultEx2.stBcrInfoEx2[i].sAlgoCost.ToString();
- //cDataRow.Cells[4].Value = stBcrResultEx2.stBcrInfoEx2[i].sPPM.ToString();
- //cDataRow.Cells[5].Value = GetBarType((MvCodeReader.MV_CODEREADER_CODE_TYPE)stBcrResultEx2.stBcrInfoEx2[i].nBarType);
- String strCode = System.Text.Encoding.Default.GetString(stBcrResultEx2.stBcrInfoEx2[i].chCode);
- //cDataRow.Cells[6].Value = String.IsNullOrEmpty(strCode) ? "NoRead" : strCode;//barcode
- //cDataRow.Cells[7].Value = stBcrResultEx2.stBcrInfoEx2[i].stCodeQuality.nOverQuality.ToString();
- //cDataRow.Cells[8].Value = stBcrResultEx2.stBcrInfoEx2[i].nIDRScore.ToString();
- if (!String.IsNullOrEmpty(strCode))
- barCodes.Add(strCode.Replace("\0", "").Trim());
- }
- ScanerEvent?.BeginInvoke(barCodes[0], null, null);
- }
- }
- }
- private static String GetBarType(MvCodeReader.MV_CODEREADER_CODE_TYPE nBarType)
- {
- switch (nBarType)
- {
- case MvCodeReader.MV_CODEREADER_CODE_TYPE.MV_CODEREADER_TDCR_DM:
- return "DM码";
- case MvCodeReader.MV_CODEREADER_CODE_TYPE.MV_CODEREADER_TDCR_QR:
- return "QR码";
- case MvCodeReader.MV_CODEREADER_CODE_TYPE.MV_CODEREADER_BCR_EAN8:
- return "EAN8码";
- case MvCodeReader.MV_CODEREADER_CODE_TYPE.MV_CODEREADER_BCR_UPCE:
- return "UPCE码";
- case MvCodeReader.MV_CODEREADER_CODE_TYPE.MV_CODEREADER_BCR_UPCA:
- return "UPCA码";
- case MvCodeReader.MV_CODEREADER_CODE_TYPE.MV_CODEREADER_BCR_EAN13:
- return "EAN13码";
- case MvCodeReader.MV_CODEREADER_CODE_TYPE.MV_CODEREADER_BCR_ISBN13:
- return "ISBN13码";
- case MvCodeReader.MV_CODEREADER_CODE_TYPE.MV_CODEREADER_BCR_CODABAR:
- return "库德巴码";
- case MvCodeReader.MV_CODEREADER_CODE_TYPE.MV_CODEREADER_BCR_ITF25:
- return "交叉25码";
- case MvCodeReader.MV_CODEREADER_CODE_TYPE.MV_CODEREADER_BCR_CODE39:
- return " Code 39码";
- case MvCodeReader.MV_CODEREADER_CODE_TYPE.MV_CODEREADER_BCR_CODE93:
- return "Code 93码";
- case MvCodeReader.MV_CODEREADER_CODE_TYPE.MV_CODEREADER_BCR_CODE128:
- return "Code 128码";
- case MvCodeReader.MV_CODEREADER_CODE_TYPE.MV_CODEREADER_TDCR_PDF417:
- return "PDF417码";
- case MvCodeReader.MV_CODEREADER_CODE_TYPE.MV_CODEREADER_BCR_MATRIX25:
- return "MATRIX25码";
- case MvCodeReader.MV_CODEREADER_CODE_TYPE.MV_CODEREADER_BCR_MSI:
- return "MSI码";
- case MvCodeReader.MV_CODEREADER_CODE_TYPE.MV_CODEREADER_BCR_CODE11:
- return "Code 11码";
- case MvCodeReader.MV_CODEREADER_CODE_TYPE.MV_CODEREADER_BCR_INDUSTRIAL25:
- return "industria125码";
- case MvCodeReader.MV_CODEREADER_CODE_TYPE.MV_CODEREADER_BCR_CHINAPOST:
- return "中国邮政码";
- case MvCodeReader.MV_CODEREADER_CODE_TYPE.MV_CODEREADER_BCR_ITF14:
- return "交叉14码";
- case MvCodeReader.MV_CODEREADER_CODE_TYPE.MV_CODEREADER_TDCR_ECC140:
- return "ECC140码";
- default:
- return "/";
- }
- }
-
- // ch:显示错误信息 | en:Show error message
- private void ShowErrorMsg(string csMessage, int nErrorNum)
- {
- string errorMsg;
- if (nErrorNum == 0)
- {
- errorMsg = csMessage;
- }
- else
- {
- errorMsg = csMessage + ": Error =" + String.Format("{0:X}", nErrorNum);
- }
-
- switch (nErrorNum)
- {
- case MvCodeReader.MV_CODEREADER_E_HANDLE: errorMsg += " Error or invalid handle "; break;
- case MvCodeReader.MV_CODEREADER_E_SUPPORT: errorMsg += " Not supported function "; break;
- case MvCodeReader.MV_CODEREADER_E_BUFOVER: errorMsg += " Cache is full "; break;
- case MvCodeReader.MV_CODEREADER_E_CALLORDER: errorMsg += " Function calling order error "; break;
- case MvCodeReader.MV_CODEREADER_E_PARAMETER: errorMsg += " Incorrect parameter "; break;
- case MvCodeReader.MV_CODEREADER_E_RESOURCE: errorMsg += " Applying resource failed "; break;
- case MvCodeReader.MV_CODEREADER_E_NODATA: errorMsg += " No data "; break;
- case MvCodeReader.MV_CODEREADER_E_PRECONDITION: errorMsg += " Precondition error, or running environment changed "; break;
- case MvCodeReader.MV_CODEREADER_E_VERSION: errorMsg += " Version mismatches "; break;
- case MvCodeReader.MV_CODEREADER_E_NOENOUGH_BUF: errorMsg += " Insufficient memory "; break;
- case MvCodeReader.MV_CODEREADER_E_UNKNOW: errorMsg += " Unknown error "; break;
- case MvCodeReader.MV_CODEREADER_E_GC_GENERIC: errorMsg += " General error "; break;
- case MvCodeReader.MV_CODEREADER_E_GC_ACCESS: errorMsg += " Node accessing condition error "; break;
- case MvCodeReader.MV_CODEREADER_E_ACCESS_DENIED: errorMsg += " No permission "; break;
- case MvCodeReader.MV_CODEREADER_E_BUSY: errorMsg += " Device is busy, or network disconnected "; break;
- case MvCodeReader.MV_CODEREADER_E_NETER: errorMsg += " Network error "; break;
- }
-
- WarningEvent?.Invoke(DateTime.Now,WarningEnum.Low, errorMsg);
- }
-
- }
- }
|