革博士程序V1仓库
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

317 строки
14 KiB

  1. using MvCodeReaderSDKNet;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Runtime.InteropServices;
  6. using System.Text;
  7. using System.Threading;
  8. using System.Threading.Tasks;
  9. namespace LeatherApp.Device
  10. {
  11. /// <summary>
  12. /// 扫描器操作类
  13. /// </summary>
  14. public class ScannerCodeDev
  15. {
  16. public Action<DateTime,WarningEnum, string> WarningEvent;
  17. public Action<string> ScanerEvent;
  18. //
  19. MvCodeReader.MV_CODEREADER_DEVICE_INFO_LIST m_stDeviceList;
  20. private MvCodeReader m_cMyDevice;
  21. bool m_bGrabbing = false;
  22. Thread m_hReceiveThread = null;
  23. public bool start(int devIndex=0)
  24. {
  25. try
  26. {
  27. m_stDeviceList = new MvCodeReader.MV_CODEREADER_DEVICE_INFO_LIST();
  28. m_cMyDevice = new MvCodeReader();
  29. //====枚举设备
  30. if (!DeviceListAcq())
  31. return false;
  32. //====打开设置
  33. if (m_stDeviceList.nDeviceNum == 0 )
  34. {
  35. ShowErrorMsg("No stDevInfo, please select", 0);
  36. return false;
  37. }
  38. // ch:获取选择的设备信息 | en:Get selected stDevInfo information
  39. MvCodeReader.MV_CODEREADER_DEVICE_INFO stDevInfo =
  40. (MvCodeReader.MV_CODEREADER_DEVICE_INFO)Marshal.PtrToStructure(m_stDeviceList.pDeviceInfo[devIndex],
  41. typeof(MvCodeReader.MV_CODEREADER_DEVICE_INFO));
  42. // ch:打开设备 | en:Open stDevInfo
  43. if (null == m_cMyDevice)
  44. {
  45. m_cMyDevice = new MvCodeReader();
  46. if (null == m_cMyDevice)
  47. {
  48. return false;
  49. }
  50. }
  51. int nRet = m_cMyDevice.MV_CODEREADER_CreateHandle_NET(ref stDevInfo);
  52. if (MvCodeReader.MV_CODEREADER_OK != nRet)
  53. {
  54. ShowErrorMsg("MV_CODEREADER_CreateHandle_NET fail!", nRet);
  55. return false;
  56. }
  57. nRet = m_cMyDevice.MV_CODEREADER_OpenDevice_NET();
  58. if (MvCodeReader.MV_CODEREADER_OK != nRet)
  59. {
  60. m_cMyDevice.MV_CODEREADER_DestroyHandle_NET();
  61. ShowErrorMsg("Device open fail!", nRet);
  62. return false;
  63. }
  64. // ch:设置采集连续模式 | en:Set Continues Aquisition Mode
  65. nRet = m_cMyDevice.MV_CODEREADER_SetEnumValue_NET("TriggerMode", (uint)MvCodeReader.MV_CODEREADER_TRIGGER_MODE.MV_CODEREADER_TRIGGER_MODE_OFF);
  66. if (MvCodeReader.MV_CODEREADER_OK != nRet)
  67. {
  68. ShowErrorMsg("Set TriggerMode Off Fail!", nRet);
  69. return false;
  70. }
  71. //bnGetParam_Click(null, null);// ch:获取参数 | en:Get parameters
  72. //====开始采集
  73. // ch:标志位置位true | en:Set position bit true
  74. m_hReceiveThread = new Thread(ReceiveThreadProcess);
  75. m_hReceiveThread.Start();
  76. m_bGrabbing = true;
  77. // ch:开始采集 | en:Start Grabbing
  78. nRet = m_cMyDevice.MV_CODEREADER_StartGrabbing_NET();
  79. if (MvCodeReader.MV_CODEREADER_OK != nRet)
  80. {
  81. stop();
  82. //m_bGrabbing = false;
  83. //m_hReceiveThread.Join();
  84. ShowErrorMsg("Start Grabbing Fail!", nRet);
  85. return false;
  86. }
  87. return true;
  88. }
  89. catch (Exception ex)
  90. {
  91. WarningEvent?.Invoke(DateTime.Now,WarningEnum.Normal, ex.Message);
  92. return false;
  93. }
  94. }
  95. public bool stop()
  96. {
  97. if (!m_bGrabbing) return true;
  98. try
  99. {
  100. // ch:标志位设为false | en:Set flag bit false
  101. m_bGrabbing = false;
  102. // ch:停止采集 | en:Stop Grabbing
  103. int nRet = m_cMyDevice.MV_CODEREADER_StopGrabbing_NET();
  104. if (nRet != MvCodeReader.MV_CODEREADER_OK)
  105. {
  106. ShowErrorMsg("Stop Grabbing Fail!", nRet);
  107. }
  108. if (null != m_hReceiveThread)
  109. {
  110. m_hReceiveThread.Join();
  111. }
  112. //==关闭设备
  113. // ch:取流标志位清零 | en:Reset flow flag bit
  114. if (m_bGrabbing == true)
  115. {
  116. m_bGrabbing = false;
  117. // ch:停止采集 | en:Stop Grabbing
  118. m_cMyDevice.MV_CODEREADER_StopGrabbing_NET();
  119. m_hReceiveThread.Join();
  120. }
  121. // ch:关闭设备 | en:Close Device
  122. m_cMyDevice.MV_CODEREADER_CloseDevice_NET();
  123. m_cMyDevice.MV_CODEREADER_DestroyHandle_NET();
  124. return true;
  125. }
  126. catch
  127. {
  128. return false;
  129. }
  130. }
  131. //枚举设备
  132. private bool DeviceListAcq()
  133. {
  134. // ch:创建设备列表 | en:Create Device List
  135. System.GC.Collect();
  136. m_stDeviceList.nDeviceNum = 0;
  137. int nRet = MvCodeReader.MV_CODEREADER_EnumDevices_NET(ref m_stDeviceList, MvCodeReader.MV_CODEREADER_GIGE_DEVICE);
  138. if (0 != nRet)
  139. {
  140. ShowErrorMsg("Enumerate devices fail!", nRet);
  141. return false;
  142. }
  143. if (0 == m_stDeviceList.nDeviceNum)
  144. {
  145. ShowErrorMsg("None Device!", 0);
  146. return false;
  147. }
  148. return true;
  149. }
  150. //设置连续模式
  151. private bool setMode()
  152. {
  153. int nRet = m_cMyDevice.MV_CODEREADER_SetEnumValue_NET("TriggerMode", (uint)MvCodeReader.MV_CODEREADER_TRIGGER_MODE.MV_CODEREADER_TRIGGER_MODE_OFF);
  154. if (MvCodeReader.MV_CODEREADER_OK != nRet)
  155. {
  156. ShowErrorMsg("Set TriggerMode Off Fail!", nRet);
  157. return false;
  158. }
  159. return true;
  160. }
  161. public void ReceiveThreadProcess()
  162. {
  163. int nRet = MvCodeReader.MV_CODEREADER_OK;
  164. IntPtr pData = IntPtr.Zero;
  165. MvCodeReader.MV_CODEREADER_IMAGE_OUT_INFO_EX2 stFrameInfoEx2 = new MvCodeReader.MV_CODEREADER_IMAGE_OUT_INFO_EX2();
  166. IntPtr pstFrameInfoEx2 = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(MvCodeReader.MV_CODEREADER_IMAGE_OUT_INFO_EX2)));
  167. Marshal.StructureToPtr(stFrameInfoEx2, pstFrameInfoEx2, false);
  168. while (m_bGrabbing)
  169. {
  170. nRet = m_cMyDevice.MV_CODEREADER_GetOneFrameTimeoutEx2_NET(ref pData, pstFrameInfoEx2, 1000);
  171. if (nRet == MvCodeReader.MV_CODEREADER_OK)
  172. {
  173. stFrameInfoEx2 = (MvCodeReader.MV_CODEREADER_IMAGE_OUT_INFO_EX2)Marshal.PtrToStructure(pstFrameInfoEx2, typeof(MvCodeReader.MV_CODEREADER_IMAGE_OUT_INFO_EX2));
  174. }
  175. if (nRet == MvCodeReader.MV_CODEREADER_OK)
  176. {
  177. if (0 >= stFrameInfoEx2.nFrameLen)
  178. {
  179. continue;
  180. }
  181. 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));
  182. List<string> barCodes = new List<string>();
  183. for (int i = 0; i < stBcrResultEx2.nCodeNum; ++i)
  184. {
  185. //DataGridViewRow cDataRow = new DataGridViewRow();
  186. //cDataRow.CreateCells(dataGridView1);
  187. //cDataRow.Cells[0].Value = this.dataGridView1.Rows.Count;
  188. //DateTime cDateTime = DateTime.Now;
  189. //cDataRow.Cells[1].Value = cDateTime.ToString();
  190. //cDataRow.Cells[2].Value = stBcrResultEx2.stBcrInfoEx2[i].nTotalProcCost.ToString();
  191. //cDataRow.Cells[3].Value = stBcrResultEx2.stBcrInfoEx2[i].sAlgoCost.ToString();
  192. //cDataRow.Cells[4].Value = stBcrResultEx2.stBcrInfoEx2[i].sPPM.ToString();
  193. //cDataRow.Cells[5].Value = GetBarType((MvCodeReader.MV_CODEREADER_CODE_TYPE)stBcrResultEx2.stBcrInfoEx2[i].nBarType);
  194. String strCode = System.Text.Encoding.Default.GetString(stBcrResultEx2.stBcrInfoEx2[i].chCode);
  195. //cDataRow.Cells[6].Value = String.IsNullOrEmpty(strCode) ? "NoRead" : strCode;//barcode
  196. //cDataRow.Cells[7].Value = stBcrResultEx2.stBcrInfoEx2[i].stCodeQuality.nOverQuality.ToString();
  197. //cDataRow.Cells[8].Value = stBcrResultEx2.stBcrInfoEx2[i].nIDRScore.ToString();
  198. if (!String.IsNullOrEmpty(strCode))
  199. barCodes.Add(strCode.Replace("\0", "").Trim());
  200. }
  201. ScanerEvent?.BeginInvoke(barCodes[0], null, null);
  202. }
  203. }
  204. }
  205. private static String GetBarType(MvCodeReader.MV_CODEREADER_CODE_TYPE nBarType)
  206. {
  207. switch (nBarType)
  208. {
  209. case MvCodeReader.MV_CODEREADER_CODE_TYPE.MV_CODEREADER_TDCR_DM:
  210. return "DM码";
  211. case MvCodeReader.MV_CODEREADER_CODE_TYPE.MV_CODEREADER_TDCR_QR:
  212. return "QR码";
  213. case MvCodeReader.MV_CODEREADER_CODE_TYPE.MV_CODEREADER_BCR_EAN8:
  214. return "EAN8码";
  215. case MvCodeReader.MV_CODEREADER_CODE_TYPE.MV_CODEREADER_BCR_UPCE:
  216. return "UPCE码";
  217. case MvCodeReader.MV_CODEREADER_CODE_TYPE.MV_CODEREADER_BCR_UPCA:
  218. return "UPCA码";
  219. case MvCodeReader.MV_CODEREADER_CODE_TYPE.MV_CODEREADER_BCR_EAN13:
  220. return "EAN13码";
  221. case MvCodeReader.MV_CODEREADER_CODE_TYPE.MV_CODEREADER_BCR_ISBN13:
  222. return "ISBN13码";
  223. case MvCodeReader.MV_CODEREADER_CODE_TYPE.MV_CODEREADER_BCR_CODABAR:
  224. return "库德巴码";
  225. case MvCodeReader.MV_CODEREADER_CODE_TYPE.MV_CODEREADER_BCR_ITF25:
  226. return "交叉25码";
  227. case MvCodeReader.MV_CODEREADER_CODE_TYPE.MV_CODEREADER_BCR_CODE39:
  228. return " Code 39码";
  229. case MvCodeReader.MV_CODEREADER_CODE_TYPE.MV_CODEREADER_BCR_CODE93:
  230. return "Code 93码";
  231. case MvCodeReader.MV_CODEREADER_CODE_TYPE.MV_CODEREADER_BCR_CODE128:
  232. return "Code 128码";
  233. case MvCodeReader.MV_CODEREADER_CODE_TYPE.MV_CODEREADER_TDCR_PDF417:
  234. return "PDF417码";
  235. case MvCodeReader.MV_CODEREADER_CODE_TYPE.MV_CODEREADER_BCR_MATRIX25:
  236. return "MATRIX25码";
  237. case MvCodeReader.MV_CODEREADER_CODE_TYPE.MV_CODEREADER_BCR_MSI:
  238. return "MSI码";
  239. case MvCodeReader.MV_CODEREADER_CODE_TYPE.MV_CODEREADER_BCR_CODE11:
  240. return "Code 11码";
  241. case MvCodeReader.MV_CODEREADER_CODE_TYPE.MV_CODEREADER_BCR_INDUSTRIAL25:
  242. return "industria125码";
  243. case MvCodeReader.MV_CODEREADER_CODE_TYPE.MV_CODEREADER_BCR_CHINAPOST:
  244. return "中国邮政码";
  245. case MvCodeReader.MV_CODEREADER_CODE_TYPE.MV_CODEREADER_BCR_ITF14:
  246. return "交叉14码";
  247. case MvCodeReader.MV_CODEREADER_CODE_TYPE.MV_CODEREADER_TDCR_ECC140:
  248. return "ECC140码";
  249. default:
  250. return "/";
  251. }
  252. }
  253. // ch:显示错误信息 | en:Show error message
  254. private void ShowErrorMsg(string csMessage, int nErrorNum)
  255. {
  256. string errorMsg;
  257. if (nErrorNum == 0)
  258. {
  259. errorMsg = csMessage;
  260. }
  261. else
  262. {
  263. errorMsg = csMessage + ": Error =" + String.Format("{0:X}", nErrorNum);
  264. }
  265. switch (nErrorNum)
  266. {
  267. case MvCodeReader.MV_CODEREADER_E_HANDLE: errorMsg += " Error or invalid handle "; break;
  268. case MvCodeReader.MV_CODEREADER_E_SUPPORT: errorMsg += " Not supported function "; break;
  269. case MvCodeReader.MV_CODEREADER_E_BUFOVER: errorMsg += " Cache is full "; break;
  270. case MvCodeReader.MV_CODEREADER_E_CALLORDER: errorMsg += " Function calling order error "; break;
  271. case MvCodeReader.MV_CODEREADER_E_PARAMETER: errorMsg += " Incorrect parameter "; break;
  272. case MvCodeReader.MV_CODEREADER_E_RESOURCE: errorMsg += " Applying resource failed "; break;
  273. case MvCodeReader.MV_CODEREADER_E_NODATA: errorMsg += " No data "; break;
  274. case MvCodeReader.MV_CODEREADER_E_PRECONDITION: errorMsg += " Precondition error, or running environment changed "; break;
  275. case MvCodeReader.MV_CODEREADER_E_VERSION: errorMsg += " Version mismatches "; break;
  276. case MvCodeReader.MV_CODEREADER_E_NOENOUGH_BUF: errorMsg += " Insufficient memory "; break;
  277. case MvCodeReader.MV_CODEREADER_E_UNKNOW: errorMsg += " Unknown error "; break;
  278. case MvCodeReader.MV_CODEREADER_E_GC_GENERIC: errorMsg += " General error "; break;
  279. case MvCodeReader.MV_CODEREADER_E_GC_ACCESS: errorMsg += " Node accessing condition error "; break;
  280. case MvCodeReader.MV_CODEREADER_E_ACCESS_DENIED: errorMsg += " No permission "; break;
  281. case MvCodeReader.MV_CODEREADER_E_BUSY: errorMsg += " Device is busy, or network disconnected "; break;
  282. case MvCodeReader.MV_CODEREADER_E_NETER: errorMsg += " Network error "; break;
  283. }
  284. WarningEvent?.Invoke(DateTime.Now,WarningEnum.Low, errorMsg);
  285. }
  286. }
  287. }