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("Camera L connection terminated"); //_isCrevisOpen[0] = false; PUB.flag.set(eVarBool.FG_RDY_CAMERA_L, false, "DISC"); } private void Ws_ConnectedL(object sender, EventArgs e) { PUB.log.AddAT("Camera L connection successful"); //_isCrevisOpen[0] = true; } private void Ws_DisconnectedR(object sender, EventArgs e) { var ws = sender as WatsonWebsocket.WatsonWsClient; PUB.log.AddAT("Camera R connection terminated"); //_isCrevisOpen[2] = false; PUB.flag.set(eVarBool.FG_RDY_CAMERA_R, false, "DISC"); } private void Ws_ConnectedR(object sender, EventArgs e) { PUB.log.AddAT("Camera R connection successful"); //_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(); 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("command"), camera = jsondata.Value("camera"), live = jsondata.Value("live"), stream = jsondata.Value("stream"), listen = jsondata.Value("listen"), trig = jsondata.Value("trig"), license = jsondata.Value("license"), reel = jsondata.Value("reel"), conv = jsondata.Value("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("Left camera ready"); } } else { if (PUB.flag.get(eVarBool.FG_RDY_CAMERA_R) == false) { PUB.flag.set(eVarBool.FG_RDY_CAMERA_R, true, "WEBSOCKET"); PUB.log.Add("Right camera ready"); } } } 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("Status message analysis failed: " + ex.Message); } } else { //처리가능한 상황에서만 큐에 데이터를 넣는다 if (idx == 0 && PUB.flag.get(eVarBool.FG_PRC_VISIONL) == false) { PUB.log.AddAT("Left side vision not in verification state, deleting barcode data\n" + data); return; } if (idx != 0 && PUB.flag.get(eVarBool.FG_PRC_VISIONR) == false) { PUB.log.AddAT("Right side vision not in verification state, deleting barcode data\n" + data); return; } PUB.log.Add($"QR verification ({(idx == 0 ? "L" : "R")}) received: " + 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("Vision (L) previous task completed, not processing"); } 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("Vision (R) previous task completed, not processing"); } } } } //바코드 원본의 데이터큐 //ConcurrentQueue BarcodeQueL = new ConcurrentQueue(); //ConcurrentQueue BarcodeQueR = new ConcurrentQueue(); //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($"Transmission {idx} failed {ex.Message}"); sendok = false; } if (sendok == false) { try { if (idx == 0) CameraConTimeL = DateTime.Now; else CameraConTimeR = DateTime.Now; if(ws != null) { PUB.log.AddAT($"Closing socket due to transmission {idx} failure"); ws.Stop(); } } catch (Exception ex) { PUB.log.AddE($"Socket {idx} termination failed: {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(); /// /// 바코드큐에있는 데이터를 분석하고 시작한다. /// /// /// /// List ProcessRecvBarcodeData(int vIdx, string JsonStr) { //PUB.logVision.Add($"[{vIdx}]ProcessBarcodeQue"); //PUB.logVision.Flush(); List retval = new List(); if (JsonStr.isEmpty()) { PUB.log.AddE("Cannot proceed due to missing barcode receive value (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("guid"), command = jsondata.Value("command"), data = jsondata.Value("data[]"), time = jsondata.Value("time"), file = jsondata.Value("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($"Camera ({vIdx}) ProcessBarcodeQue failed {ex.Message}"); PUB.logVision.Flush(); } return retval; } } }