383 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			383 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using Emgu.CV;
 | |
| using Newtonsoft.Json.Linq;
 | |
| using System;
 | |
| using System.Collections.Concurrent;
 | |
| using System.Collections.Generic;
 | |
| using System.Drawing;
 | |
| using System.Linq;
 | |
| using System.Text;
 | |
| using System.Threading.Tasks;
 | |
| using WatsonWebsocket;
 | |
| using AR;
 | |
| 
 | |
| namespace Project
 | |
| {
 | |
| 	public partial class FMain
 | |
| 	{
 | |
| 		//DateTime lastRecvWSL = new DateTime(1982, 11, 23);
 | |
| 		//DateTime lastRecvWSR = new DateTime(1982, 11, 23);
 | |
| 		string lastBarcodeRawL = string.Empty;
 | |
| 		string lastBarcodeRawR = string.Empty;
 | |
| 
 | |
| 
 | |
| 		void AttachCameraEventL()
 | |
| 		{
 | |
| 			//크레비스오픈 - 210203
 | |
| 			//PUB.log.Add("카메라 이벤트 생성");
 | |
| 			PUB.wsL.MessageReceived += Ws_DataArrivalL;
 | |
| 			PUB.wsL.ServerConnected += Ws_ConnectedL;
 | |
| 			PUB.wsL.ServerDisconnected += Ws_DisconnectedL;
 | |
| 		}
 | |
| 		void DetachCameraEventL()
 | |
| 		{
 | |
| 			//크레비스오픈 - 210203
 | |
| 			//PUB.log.Add("카메라 이벤트 해제");
 | |
| 			PUB.wsL.MessageReceived -= Ws_DataArrivalL;
 | |
| 			PUB.wsL.ServerConnected -= Ws_ConnectedL;
 | |
| 			PUB.wsL.ServerDisconnected -= Ws_DisconnectedL;
 | |
| 
 | |
| 		}
 | |
| 		void AttachCameraEventR()
 | |
| 		{
 | |
| 			//크레비스오픈 - 210203
 | |
| 			//if (COMM.SETTING.Data.Log_CameraConn) PUB.log.Add("카메라 이벤트 생성");
 | |
| 			PUB.wsR.MessageReceived += Ws_DataArrivalR;
 | |
| 			PUB.wsR.ServerConnected += Ws_ConnectedR;
 | |
| 			PUB.wsR.ServerDisconnected += Ws_DisconnectedR;
 | |
| 		}
 | |
| 		void DetachCameraEventR()
 | |
| 		{
 | |
| 			//크레비스오픈 - 210203
 | |
| 			//if (COMM.SETTING.Data.Log_CameraConn) PUB.log.Add("카메라 이벤트 해제");
 | |
| 			PUB.wsR.MessageReceived -= Ws_DataArrivalR;
 | |
| 			PUB.wsR.ServerConnected -= Ws_ConnectedR;
 | |
| 			PUB.wsR.ServerDisconnected -= Ws_DisconnectedR;
 | |
| 		}
 | |
| 		private void Ws_DisconnectedL(object sender, EventArgs e)
 | |
| 		{
 | |
| 			var ws = sender as WatsonWebsocket.WatsonWsClient;
 | |
| 			PUB.log.AddAT("카메라L 접속 종료");
 | |
| 			//_isCrevisOpen[0] = false;
 | |
| 			PUB.flag.set(eVarBool.FG_RDY_CAMERA_L, false, "DISC");
 | |
| 		}
 | |
| 
 | |
| 		private void Ws_ConnectedL(object sender, EventArgs e)
 | |
| 		{
 | |
| 			PUB.log.AddAT("카메라L 접속 성공");
 | |
| 			//_isCrevisOpen[0] = true;
 | |
| 		}
 | |
| 		private void Ws_DisconnectedR(object sender, EventArgs e)
 | |
| 		{
 | |
| 			var ws = sender as WatsonWebsocket.WatsonWsClient;
 | |
| 			PUB.log.AddAT("카메라R 접속 종료");
 | |
| 			//_isCrevisOpen[2] = false;
 | |
| 			PUB.flag.set(eVarBool.FG_RDY_CAMERA_R, false, "DISC");
 | |
| 		}
 | |
| 
 | |
| 		private void Ws_ConnectedR(object sender, EventArgs e)
 | |
| 		{
 | |
| 			PUB.log.AddAT("카메라R 접속 성공");
 | |
| 			//_isCrevisOpen[2] = true;
 | |
| 		}
 | |
| 
 | |
| 		private void Ws_DataArrivalL(object sender, MessageReceivedEventArgs e)
 | |
| 		{
 | |
| 			Ws_DataArrival(0, sender as WatsonWsClient, e);
 | |
| 		}
 | |
| 		private void Ws_DataArrivalR(object sender, MessageReceivedEventArgs e)
 | |
| 		{
 | |
| 			Ws_DataArrival(1, sender as WatsonWsClient, e);
 | |
| 		}
 | |
| 
 | |
| 		private void Ws_DataArrival(int idx, WatsonWsClient ws, MessageReceivedEventArgs e)
 | |
| 		{
 | |
| 			//throw new NotImplementedException();
 | |
| 			var data = Encoding.UTF8.GetString(e.Data);// Pub.ws.Get<String>();
 | |
| 			if (idx == 0) VAR.TIME[eVarTime.lastRecvWSL] = DateTime.Now;
 | |
| 			else VAR.TIME[eVarTime.lastRecvWSR] = DateTime.Now;
 | |
| 
 | |
| 
 | |
| 
 | |
| 			if (data.Contains("\"command\":\"status"))
 | |
| 			{
 | |
| 				//PUB.logVision.Add($"[{idx}]상태메세지수신");
 | |
| 				//PUB.logVision.Flush();
 | |
| 				try
 | |
| 				{
 | |
| 					var jsondata = JObject.Parse(data);
 | |
| 					var msgdata = new
 | |
| 					{
 | |
| 						command = jsondata.Value<String>("command"),
 | |
| 						camera = jsondata.Value<String>("camera"),
 | |
| 						live = jsondata.Value<String>("live"),
 | |
| 						stream = jsondata.Value<String>("stream"),
 | |
| 						listen = jsondata.Value<String>("listen"),
 | |
| 						trig = jsondata.Value<String>("trig"),
 | |
| 						license = jsondata.Value<String>("license"),
 | |
|                         reel = jsondata.Value<String>("reel"),
 | |
|                         conv = jsondata.Value<String>("conv"),
 | |
|                     };
 | |
| 
 | |
|                     if (idx == 0)
 | |
|                     {
 | |
|                         PUB.flag.set(eVarBool.VS_DETECT_REEL_L, (msgdata.reel == "1"), "WS");
 | |
|                         PUB.flag.set(eVarBool.VS_DETECT_CONV_L, (msgdata.conv == "1"), "WS");
 | |
|                     }   
 | |
|                     else
 | |
|                     {
 | |
|                         PUB.flag.set(eVarBool.VS_DETECT_REEL_R, (msgdata.reel == "1"), "WS");
 | |
|                         PUB.flag.set(eVarBool.VS_DETECT_CONV_R, (msgdata.conv == "1"), "WS");
 | |
|                     }
 | |
|                     
 | |
| 
 | |
|                     if (msgdata.license == "1" && msgdata.camera == "1")
 | |
| 					{
 | |
| 						if (idx == 0)
 | |
| 						{
 | |
|                             if(PUB.flag.get(eVarBool.FG_RDY_CAMERA_L)==false)
 | |
|                             {
 | |
|                                 PUB.flag.set(eVarBool.FG_RDY_CAMERA_L, true, "WEBSOCKET");
 | |
|                                 PUB.log.Add("왼쪽카메라 준비 완료");
 | |
|                             }
 | |
| 						}
 | |
| 						else
 | |
| 						{
 | |
|                             if (PUB.flag.get(eVarBool.FG_RDY_CAMERA_R) == false)
 | |
|                             {
 | |
|                                 PUB.flag.set(eVarBool.FG_RDY_CAMERA_R, true, "WEBSOCKET");
 | |
|                                 PUB.log.Add("오른쪽카메라 준비 완료");
 | |
|                             }
 | |
|                                 
 | |
| 						}
 | |
| 					}
 | |
| 					else
 | |
| 					{
 | |
| 						if (idx == 0) PUB.flag.set(eVarBool.FG_RDY_CAMERA_L, false, "WEBSOCKET");
 | |
| 						else PUB.flag.set(eVarBool.FG_RDY_CAMERA_R, false, "WEBSOCKET");
 | |
| 					}
 | |
| 				}
 | |
| 				catch (Exception ex)
 | |
| 				{
 | |
| 					PUB.log.AddE("상태메시지 분석실패: " + ex.Message);
 | |
| 				}
 | |
| 			}
 | |
| 			else
 | |
| 			{
 | |
| 				//처리가능한 상황에서만 큐에 데이터를 넣는다
 | |
| 				if (idx == 0 && PUB.flag.get(eVarBool.FG_PRC_VISIONL) == false)
 | |
| 				{
 | |
| 					PUB.log.AddAT("(좌)측 비젼 검증상태가 아니므로 바코드 데이터 삭제\n" + data);
 | |
| 					return;
 | |
| 				}
 | |
| 				if (idx != 0 && PUB.flag.get(eVarBool.FG_PRC_VISIONR) == false)
 | |
| 				{
 | |
| 					PUB.log.AddAT("(우)측 비젼 검증상태가 아니므로 바코드 데이터 삭제\n" + data);
 | |
| 					return;
 | |
| 				}
 | |
| 
 | |
| 				PUB.log.Add($"QR검증({(idx == 0 ? "L" : "R")})수신: " + data);
 | |
| 				var guid = idx == 0 ? PUB.Result.ItemDataL.guid : PUB.Result.ItemDataR.guid;
 | |
| 
 | |
| 				//BarcodeParsing(idx, guid, data, "WS");
 | |
| 				var qrDataList = ProcessRecvBarcodeData(idx, data);
 | |
| 				if (qrDataList.Count > 0)  //바코드데이터가 존재 했다
 | |
| 				{
 | |
| 					//처리가 완료되지 않은경우엠ㄴ 사용한다.
 | |
| 					if (idx == 0)
 | |
| 					{
 | |
| 						if (PUB.flag.get(eVarBool.FG_END_VISIONL) == false)
 | |
| 						{
 | |
| 							var Complete = RecvQRProcess(qrDataList, eWorkPort.Left);
 | |
| 							if (Complete) PUB.flag.set(eVarBool.FG_END_VISIONL, true, "DATA_ARRIVAL");
 | |
| 						}
 | |
| 						else PUB.log.AddAT("비젼(L) 이전작업이 완료되어 처리하지 않음");
 | |
| 					}
 | |
| 					else
 | |
| 					{
 | |
| 						if (PUB.flag.get(eVarBool.FG_END_VISIONR) == false)
 | |
| 						{
 | |
| 							var Complete = RecvQRProcess(qrDataList, eWorkPort.Right);
 | |
| 							if (Complete) PUB.flag.set(eVarBool.FG_END_VISIONR, true, "DATA_ARRIVAL");
 | |
| 						}
 | |
| 						else PUB.log.AddAT("비젼(R) 이전작업이 완료되어 처리하지 않음");
 | |
| 					}
 | |
| 				}
 | |
| 
 | |
| 			}
 | |
| 
 | |
| 		}
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|         //바코드 원본의 데이터큐
 | |
|         //ConcurrentQueue<string> BarcodeQueL = new ConcurrentQueue<string>();
 | |
|         //ConcurrentQueue<string> BarcodeQueR = new ConcurrentQueue<string>();
 | |
| 
 | |
|         //bool BarcodeParsing(int idx, string guid, string jsonstr, string source, Boolean force = false)
 | |
|         //{
 | |
| 
 | |
|         //	//값이있다면 바코드 큐에 집어 넣는다.
 | |
|         //	if (idx == 0)
 | |
|         //	{
 | |
|         //		lastBarcodeRawL = jsonstr;
 | |
|         //		lock (BarcodeQueL)
 | |
|         //			BarcodeQueL.Enqueue(jsonstr);
 | |
|         //	}
 | |
|         //	else
 | |
|         //	{
 | |
|         //		lastBarcodeRawR = jsonstr;
 | |
|         //		lock (BarcodeQueR)
 | |
|         //			BarcodeQueR.Enqueue(jsonstr);
 | |
|         //	}
 | |
| 
 | |
|         //	return true;
 | |
|         //}
 | |
| 
 | |
|         //DateTime WSLLastRecv = DateTime.Now;
 | |
|         //DateTime WSRLastRecv = DateTime.Now;
 | |
| 		bool WS_Send(eWorkPort idx, WatsonWebsocket.WatsonWsClient ws, string guid, string cmd,string data)
 | |
| 		{
 | |
|             if (ws == null) return false;
 | |
| 
 | |
| 			//데이터 생성
 | |
| 			var msg = new
 | |
| 			{
 | |
| 				guid = guid,
 | |
| 				command = cmd,
 | |
|                 data = data
 | |
| 			};
 | |
| 
 | |
| 			var json = Newtonsoft.Json.JsonConvert.SerializeObject(msg);
 | |
| 			Boolean sendok = false;
 | |
| 			try
 | |
| 			{
 | |
| 				//PUB.log.Add($"전송({idx}),ID:{guid},명령:{cmd}");
 | |
| 				ws.SendAsync(json);
 | |
| 				sendok = true;
 | |
| 			}
 | |
| 			catch (Exception ex)
 | |
| 			{
 | |
| 				PUB.log.AddE($"전송{idx}실패{ex.Message}");
 | |
| 				sendok = false;
 | |
| 			}
 | |
| 
 | |
| 			if (sendok == false)
 | |
| 			{
 | |
| 				try
 | |
| 				{
 | |
| 					if (idx == 0) CameraConTimeL = DateTime.Now;
 | |
| 					else CameraConTimeR = DateTime.Now;
 | |
| 
 | |
|                     if(ws != null)
 | |
|                     {
 | |
|                         PUB.log.AddAT($"전송{idx} 실패로 소켓을 닫습니다");
 | |
|                         ws.Stop();
 | |
|                     }
 | |
| 				}
 | |
| 				catch (Exception ex)
 | |
| 				{
 | |
| 					PUB.log.AddE($"소켓{idx} 종료 실패:{ex.Message}");
 | |
| 				}
 | |
| 			}
 | |
|             return sendok;
 | |
| 		}
 | |
| 
 | |
| 		//System.Diagnostics.Stopwatch wat = new System.Diagnostics.Stopwatch();
 | |
| 		//System.Diagnostics.Stopwatch wat0 = new System.Diagnostics.Stopwatch();
 | |
| 		//System.Diagnostics.Stopwatch wat1 = new System.Diagnostics.Stopwatch();
 | |
| 		//System.Diagnostics.Stopwatch wat2 = new System.Diagnostics.Stopwatch();
 | |
| 
 | |
| 
 | |
| 		/// <summary>
 | |
| 		/// 바코드큐에있는 데이터를 분석하고 시작한다.
 | |
| 		/// </summary>
 | |
| 		/// <param name="Idx"></param>
 | |
| 		/// <param name="Process"></param>
 | |
| 		/// <returns></returns>
 | |
| 		List<string> ProcessRecvBarcodeData(int vIdx, string JsonStr)
 | |
| 		{
 | |
| 			//PUB.logVision.Add($"[{vIdx}]ProcessBarcodeQue");
 | |
| 			//PUB.logVision.Flush();
 | |
| 			List<string> retval = new List<string>();
 | |
| 
 | |
| 			if (JsonStr.isEmpty())
 | |
| 			{
 | |
| 				PUB.log.AddE("바코드 수신값(JSON) 이 없어 진행할 수 없습니다");
 | |
| 				return retval;
 | |
| 			}
 | |
| 
 | |
| 			if (vIdx == 0)
 | |
| 				lastBarcodeRawL = JsonStr;
 | |
| 			else
 | |
| 				lastBarcodeRawR = JsonStr;
 | |
| 
 | |
| 			try
 | |
| 			{
 | |
| 				//모델에서 고정값을 입력한게 있다면 그것을 사용한다
 | |
| 				var itemC = PUB.Result.ItemDataC;
 | |
| 				if (itemC.VisionData.VNAME.isEmpty() && PUB.Result.vModel.Def_Vname.isEmpty() == false)
 | |
| 				{
 | |
| 					itemC.VisionData.VNAME = PUB.Result.vModel.Def_Vname;
 | |
| 					itemC.VisionData.VNAME_Trust = true;
 | |
| 					PUB.log.Add($"Defaul V.Name Set to {PUB.Result.vModel.Def_Vname}");
 | |
| 				}
 | |
| 				if (itemC.VisionData.MFGDATE.isEmpty() && PUB.Result.vModel.Def_MFG.isEmpty() == false)
 | |
| 				{
 | |
| 					itemC.VisionData.MFGDATE = PUB.Result.vModel.Def_MFG;
 | |
| 					itemC.VisionData.MFGDATE_Trust = true;
 | |
| 					PUB.log.Add($"Defaul MFGDATE Set to {PUB.Result.vModel.Def_MFG}");
 | |
| 				}
 | |
| 
 | |
| 				var jsondata = JObject.Parse(JsonStr);
 | |
| 				var msgdata = new
 | |
| 				{
 | |
| 					guid = jsondata.Value<String>("guid"),
 | |
| 					command = jsondata.Value<String>("command"),
 | |
| 					data = jsondata.Value<String>("data[]"),
 | |
| 					time = jsondata.Value<String>("time"),
 | |
| 					file = jsondata.Value<String>("file")
 | |
| 				};
 | |
| 
 | |
| 				var datas = jsondata.GetValue("data");
 | |
| 				if (datas.Type == JTokenType.String)
 | |
| 				{
 | |
| 					var bcdstr = datas.ToString();
 | |
| 
 | |
| 					//새로운 바코드라면 추가한다
 | |
| 					if (retval.Contains(bcdstr) == false)
 | |
| 						retval.Add(bcdstr);
 | |
| 				}
 | |
| 				else
 | |
| 				{
 | |
| 					//데이터가 배열로 들어있는 경우이다
 | |
| 					foreach (var data in datas)
 | |
| 					{
 | |
| 						var dataarr = new
 | |
| 						{
 | |
| 							barcode = data.ToString()
 | |
| 						};
 | |
| 						if (dataarr.barcode.isEmpty()) continue;
 | |
| 						if (retval.Contains(dataarr.barcode) == false)
 | |
| 							retval.Add(dataarr.barcode);
 | |
| 					}
 | |
| 				}
 | |
| 
 | |
| 				//입력된 바코드 데이터를 확인한다.
 | |
| 				//각 데이터는 아래처럼 변수에 추가를 해줘야ㅏ한ㄷ.ㅏ
 | |
| 				//ImageProcessResult[vIdx].Add(item.data);
 | |
| 
 | |
| 
 | |
| 			}
 | |
| 			catch (Exception ex)
 | |
| 			{
 | |
| 				PUB.logVision.Add($"카메라(${vIdx})  ProcessBarcodeQue 실패{ex.Message}"); PUB.logVision.Flush();
 | |
| 			}
 | |
| 
 | |
| 			return retval;
 | |
| 		}
 | |
| 
 | |
| 
 | |
| 	}
 | |
| }
 | 
