geboshi_V1/LeatherProject/LeatherApp/Device/ScannerCodeDev.cs
2024-03-07 14:03:22 +08:00

317 lines
14 KiB
C#

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);
}
}
}