Files
CPXV2/SystemX.Net.CP.PCAdaptor.UIM/SystemX.Net.PCAdaptor/XPCAdaptor/XPCAdaptorSub/TaskCommand.cs
2024-06-26 10:30:00 +09:00

413 lines
17 KiB
C#

using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using SystemX.Common;
using SystemX.Net.BaseProtocol;
using SystemX.Net.XAdaptor.PC.O2Sensor.NgCode;
using SystemX.Net.Schedule;
using SystemX.Net.XAdaptor;
using static SystemX.Net.Platform.Common.Util.LogMessage;
namespace SystemX.Net.XAdaptor.PC
{
public partial class XAdaptorPC
{
//private async void SendCommandEvent(byte[] senderData, ScheduleEvent e)
private void SendCommandEvent(byte[] senderData, ScheduleEvent e)
{
try
{
thisConnInfo.m_iSendCommandCnt++;
if (thisConnInfo.m_iSendCommandCnt + 1 == int.MaxValue)
thisConnInfo.m_iSendCommandCnt = 0;
if (FlowCommandControl == null)
return;
//소켓 샌드 행위 내부 결과
if (e.PROCESS_RESULT == false)
{
//해당 패킷 횟수 상승 일단 회 차시 기록남기고 드랍
FlowCommandControl.SendPacketCycle();
}
}
catch (Exception ex)
{
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") +
@"General <SendCommandEvent> failed.[SystemX.Net.XAdaptor.PC.XPCAdaptor : SendCommandEvent]\r\n" + ex.Message,
ConsoleColor.Yellow, LogMessageLevel.DEBUG);
}
}
//private async void RecvCommandEvent(byte[] senderData, ScheduleEvent e)
private void RecvCommandEvent(byte[] senderData, ScheduleEvent e)
{
try
{
thisConnInfo.m_iRecvCommandCnt++;
if (thisConnInfo.m_iRecvCommandCnt + 1 == int.MaxValue)
thisConnInfo.m_iRecvCommandCnt = 0;
if (FlowCommandControl == null)
return;
int iStoreCnt = senderData.Count();
byte[] recvStoreBuffer = senderData;
//소켓 리시브 행위 결과 전송
if (e.PROCESS_RESULT == false)
{
//받기 실패 단순 실패 응답
FlowCommandControl.InsertSendQueue(DateTime.Now, XCommons.SetSimpleResponsPacket(new BASE_PROTOCOL(BASE_PROTOCOL.PROTOCOL_CODE.SIMPLE_RESPONSE), false), null, false, false);
}
else
{
BASE_PROTOCOL GET_PROTOCOL = XCommons.GetHeaderProtocol(iStoreCnt, recvStoreBuffer);
BASE_PROTOCOL.PROTOCOL_CODE GET_CODE = GET_PROTOCOL.GET_CURRENT_PROTOCOL;
//응답
if (GET_CODE == BASE_PROTOCOL.PROTOCOL_CODE.SIMPLE_RESPONSE)
{
if (XCommons.GetSimpleResponsResult(iStoreCnt, recvStoreBuffer))
FlowCommandControl.SetSendPacketDrop();
else
FlowCommandControl.SendPacketCycle();
}
//파일 끝 응답
else if (GET_CODE == BASE_PROTOCOL.PROTOCOL_CODE.RAW_END)
{
if (XCommons.GetSimpleResponsResult(iStoreCnt, recvStoreBuffer))
FlowCommandControl.RawStoreQueuePOP();
else
FlowStreamControl.RawStoreQueuePOP();
}
//일반 응답
else
{
//성공 응답
FlowCommandControl.InsertSendQueue(DateTime.Now, XCommons.SetSimpleResponsPacket(new BASE_PROTOCOL(BASE_PROTOCOL.PROTOCOL_CODE.SIMPLE_RESPONSE), true), null, false, false);
//받은 큐에 넣어놓기
FlowCommandControl.InsertRecvQueue(senderData, null, e.nLABEL);
}
}
}
catch (Exception ex)
{
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") +
@"General <RecvCommandEvent> failed.[SystemX.Net.XAdaptor.PC.XPCAdaptor : RecvCommandEvent]\r\n" + ex.Message,
ConsoleColor.Yellow, LogMessageLevel.DEBUG);
}
}
private async void WatchRecvCommandQueue()
{
await Task.Delay(250).ConfigureAwait(false);
thisConnInfo.OnCommandTime();
thisConnInfo.OnCommandCheckTime();
while (!m_bTaskCommandBlock)
{
await Task.Delay(10).ConfigureAwait(false);
try
{
CommandCT.ThrowIfCancellationRequested();
}
catch (OperationCanceledException CancelEx)
{
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") +
@" Work Canceled. [SystemX.Net.XAdaptor.PC.XPCAdaptor : RecvProcessTask.WatchRecvCommandQueue]\r\n" + CancelEx.Message,
ConsoleColor.Yellow, LogMessageLevel.DEBUG);
break;
}
//
try
{
if (StateClientSocketConnect == false)
continue;
if (thisConnInfo.stCommandCheckTime.ElapsedMilliseconds >= 60000)
{
await SendCommandConnectState().ConfigureAwait(false);
thisConnInfo.OnCommandCheckTime();
}
if (bTaskCommandWaitLock == false)
{
bool bResult = QueryRecvCommandQueue();
}
}
catch (Exception ex)
{
//throw new CommonScheduleException("General Queue Process failed.[SystemX.Net.XAdaptor.PC.XPCAdaptor : RecvProcessTask.WatchRecvQueue]");
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") +
@"General Queue Process failed.[SystemX.Net.XAdaptor.PC.XPCAdaptor : RecvProcessTask.WatchRecvCommandQueue]\r\n" + ex.Message,
ConsoleColor.Yellow, LogMessageLevel.DEBUG);
}
}
}
private bool CommandQueueCheck()
{
if (ClientCommandSock == null)
return false;
if (ClientCommandSock != null)
{
if (ClientCommandSock.CONNECT == false)
return false;
}
if (FlowCommandControl == null)
return false;
//Login 타임아웃
if (thisConnInfo.bHostLoginState == false)
{
if (thisConnInfo.stLoginTimeOut.ElapsedMilliseconds >= LOGIN_TIMEOUT)
{
AdaptorAbort(true);
return false;
}
}
return true;
}
private bool QueryRecvCommandQueue()
{
bool bState = true;
try
{
if (CommandQueueCheck() == false)
return false;
bTaskCommandWaitLock = true;
if (FlowCommandControl.GetCurrentRecvProcessData() != null)
return false;
thisConnInfo.m_iSendCommandQueueSize = FlowCommandControl.GetSendQueueSize();
thisConnInfo.m_iRecvCommandQueueSize = FlowCommandControl.GetRecvQueueSize();
if ((thisConnInfo.m_iSendCommandQueueSize + 1) == int.MaxValue)
thisConnInfo.m_iSendCommandQueueSize = 0;
if ((thisConnInfo.m_iRecvCommandQueueSize + 1) == int.MaxValue)
thisConnInfo.m_iRecvCommandQueueSize = 0;
XData getXData = FlowCommandControl.GetResultPacketData();
if (getXData == null)
return false;
BASE_PROTOCOL GET_PROTOCOL = getXData.BaseProtocol;
BASE_PROTOCOL.PROTOCOL_CODE CODE = GET_PROTOCOL.GET_CURRENT_PROTOCOL;
HEADER_PACKET getHeader = getXData.HeaderPacket;
object objData = getXData.objData;
thisConnInfo.OnCommandCheckTime();
switch (CODE)
{
case BASE_PROTOCOL.PROTOCOL_CODE.CONNECT_STATE:
{
PING_PACKET GetPingPacket = (PING_PACKET)objData;
string strGetMsg = GetPingPacket.objCheckMsg[0].Data;
strCheckCommandMsg = strGetMsg;
if (strCheckCommandMsg.IndexOf("TLRL") >= 0)
{
string[] getStationCheck = strCheckCommandMsg.Split(';');
if (getStationCheck.Length >= 2)
{
int nGetStaionID = Convert.ToInt32(getStationCheck[1]);
if (dicTestListNeedReload.ContainsKey(nGetStaionID))
{
if (dicTestListNeedReload[nGetStaionID] == false)
dicTestListNeedReload[nGetStaionID] = true;
}
else
dicTestListNeedReload.Add(nGetStaionID, true);
}
}
}
break;
case BASE_PROTOCOL.PROTOCOL_CODE.DATASET_TRANSEFER:
{
/*bQueryResult = getXData.bReplayResult;
if (bQueryResult)
{
//Query 문 실행 성공
QueryDataSet = objData as DataSet;
}
else
{
//Query 문 실행 실패(구문 오류 또는 연결 오류)
QueryDataSet = null;
}*/
}
break;
case BASE_PROTOCOL.PROTOCOL_CODE.HOST_INFO_CHECK:
{
thisConnInfo.stLoginTimeOut.Restart();
thisConnInfo.bHostLoginState = false;
SYSTEM_HOST_PACKET usPacket = (SYSTEM_HOST_PACKET)objData;
string strGetHostID = usPacket.objHostID[0].Data;
string strGetSection = usPacket.objSection[0].Data;
string strGetTestCode = usPacket.objTestCode[0].Data;
string strGetMessage = usPacket.objMessage[0].Data;
if (strGetMessage.IndexOf("[SUCCESS]") >= 0)
{
thisConnInfo.bHostLoginState = true;
SubscribeConnectInfo.bSubscriberClientResult = true;
if (SubscribeConnectInfo.bUIMUseMode)
{
SubscribeConnectInfo.SessionTimeSet();
SubscribeConnectInfo.bSessionStarted = true;
}
}
AdaptorInformation.LOGIN_RESULT = thisConnInfo.bHostLoginState;
AdaptorInformation.LOGIN_MESSAGE = strGetMessage;
OnLoginAlarm(null, null);
if (thisConnInfo.bHostLoginState)
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"Middleware login reply infomation : " + strGetMessage, ConsoleColor.Green, LogMessageLevel.DEBUG);
else
{
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"The middleware connection will be closed after " + (LOGIN_TIMEOUT / 1000).ToString() + " seconds. ", ConsoleColor.Red, LogMessageLevel.DEBUG);
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"Middleware login reply infomation : " + strGetMessage, ConsoleColor.Red, LogMessageLevel.DEBUG);
}
}
break;
case BASE_PROTOCOL.PROTOCOL_CODE.SYSTEM_QUERY:
{
QUERY_PACKET usPacket = (QUERY_PACKET)objData;
string strGetQuery = usPacket.objQueryText[0].Data;
}
break;
case BASE_PROTOCOL.PROTOCOL_CODE.USER_QUERY:
break;
case BASE_PROTOCOL.PROTOCOL_CODE.RAW_SIZE:
break;
case BASE_PROTOCOL.PROTOCOL_CODE.ETC:
break;
case BASE_PROTOCOL.PROTOCOL_CODE.INITILALIZE_INFO:
{
GetConnectionInfo = (COMM_INFO_PACKET)objData;
StateClientGetInformation = true;
if (ConnectStartStyleAuto == false)
{
//if (getXData.nLabel == PacketFlowControl.CommInfoManualToken)
// break;
if (GetConnectionInfo.objConnLocalAddress[0].Data.CompareTo("AUTO") == 0)
break;
}
//ConnectionInfoRecvEvent?.BeginInvoke(null, null, null, null);
//ConnectionInfoRecvEvent?.Invoke(null, null);
if (GetConnectionInfo.bPortDistribution == false)
{
OnConnectionInfoRecv(null, null);
thisConnInfo.InitialInfoState = true;
}
SubscribeConnectInfo.Initialize();
if (GetConnectionInfo.bPortDistribution)
{
SubscribeConnectInfo.nChangeCommandPort = GetConnectionInfo.usPortCommandNumber;
SubscribeConnectInfo.nChangeStreamPort = GetConnectionInfo.usPortStreamNumber;
AdaptorAbort();
SubscribeConnectInfo.bReqConnectAbort = false;
SubscribeConnectInfo.bSetChangeConnect = true;
}
else
{
string strSetInfoID = string.Empty;
string strSetInfoKey = string.Empty;
string strSetInfoTestCode = string.Empty;
if (LoginID.Length > 0)
{
//UIM 모드 : 사용자 프로그램(Session 존재)
SubscribeConnectInfo.bUIMUseMode = true;
strSetInfoID = LoginID;
strSetInfoKey = LoginKEY;
strSetInfoTestCode = "";
}
else
{
strSetInfoID = LoadInfo.HOST_ID;
strSetInfoKey = LoadInfo.SECTION;
strSetInfoTestCode = LoadInfo.TEST_CODE;
}
if (Login(strSetInfoID, strSetInfoKey, strSetInfoTestCode,
SubscribeConnectInfo.bUIMUseMode, LoadInfo.SIMPLE_LOOKUP_OPTION) == false)
{
AdaptorAbort();
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"SystemX.Net.XAdaptor.PC Login Unknown Error. [SystemX.Net.PCAdaptor : XPCAdaptor.QueryRecvCommandQueue]", ConsoleColor.Red, LogMessageLevel.DEBUG);
}
}
}
break;
}
thisConnInfo.OffCommandTime();
RecvWaitEvent?.BeginInvoke(waitCommandParam, null, new AsyncCallback(RecvWaitEnd), null);
}
catch (Exception ex)
{
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @" General Queue Process <Command> failed.[SystemX.Net.XAdaptor.PC.XPCAdaptor : RecvProcessTask.QueryRecvCommandQueue]\r\n" + ex.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG);
bState = false;
}
finally
{
bTaskCommandWaitLock = false;
}
return bState;
}
}
}