using System; using System.Collections.Generic; using System.Data; using System.Diagnostics; using System.IO; using System.Linq; using System.Net; using System.Net.Sockets; using System.Runtime.InteropServices; using System.Runtime.Remoting.Messaging; using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; using SystemX.Common; using SystemX.Common.Serialization; using SystemX.Net.BaseProtocol; using SystemX.Net.Comm; using SystemX.Net.XAdaptor.PC.O2Sensor.NgCode; using SystemX.Net.Schedule; using static SystemX.Net.Platform.Common.Util.LogMessage; using WTimer = System.Windows.Forms.Timer; namespace SystemX.Net.XAdaptor.PC { public partial class XAdaptorPC { protected override void OnCommandConnectAlarm(object sender, EventArgs e) { // Safely raise the event for all subscribers base.OnCommandConnectAlarm(sender, e); } protected override void OnStreamConnectAlarm(object sender, EventArgs e) { // Safely raise the event for all subscribers base.OnStreamConnectAlarm(sender, e); } protected override void OnConnectionInfoRecv(object sender, EventArgs e) { // Safely raise the event for all subscribers base.OnConnectionInfoRecv(sender, e); } protected override void OnCommandDisconnectAlarm(object sender, EventArgs e) { // Safely raise the event for all subscribers base.OnCommandDisconnectAlarm(sender, e); } protected override void OnStreamDisconnectAlarm(object sender, EventArgs e) { // Safely raise the event for all subscribers base.OnStreamDisconnectAlarm(sender, e); } protected override void OnLoginAlarm(object sender, EventArgs e) { // Safely raise the event for all subscribers base.OnLoginAlarm(sender, e); } protected override void OnQueryCall(object sender, ResultEventArgs e) { // Safely raise the event for all subscribers base.OnQueryCall(sender, e); } protected override void OnBeginQueryCall(object sender, ResultEventArgs e) { // Safely raise the event for all subscribers base.OnBeginQueryCall(sender, e); } private void ClientCommandConnectEvent(object sender, ScheduleEvent e) { string strGetMsg = string.Empty; if (e != null) strGetMsg = e.STATE_MSG; XAdaptorLogWrite("Command Socket Connect"); streCommandConnectWatch.Restart(); thisConnInfo.ConnectCommandState = true; //ConnectCommandWaitEvent.Set(); bConnectCommandSocketFlag = true; thisConnInfo.OnCommandTime(); thisConnInfo.OnCommandCheckTime(); StateClientSocketConnect = true; //CommandConnectAlarmEvent?.BeginInvoke(null, null, null, null); //CommandConnectAlarmEvent?.Invoke(null, null); OnCommandConnectAlarm(null, null); } private void ClientCommandErrorEvent(object sender, ScheduleEvent e) { string strGetMsg = string.Empty; if (e != null) strGetMsg = e.STATE_MSG; XAdaptorLogWrite("Command Socket Disconnect"); ClearCommandWatchTask(); streCommandConnectWatch.Restart(); thisConnInfo.ConnectCommandState = false; //ConnectCommandWaitEvent.Reset(); bConnectCommandSocketFlag = false; StateClientSocketConnect = false; StateClientGetInformation = false; //SubscribeConnectInfo.Initialize(); //CommandDisconnectAlarmEvent?.BeginInvoke(null, null, null, null); //CommandDisconnectAlarmEvent?.Invoke(null, null); OnCommandDisconnectAlarm(null, null); } private void ClientStreamConnectEvent(object sender, ScheduleEvent e) { string strGetMsg = string.Empty; if (e != null) strGetMsg = e.STATE_MSG; XAdaptorLogWrite("Stream Socket Connect"); stFileSendTime.Restart(); stBackupFileSendTime.Restart(); streStreamConnectWatch.Restart(); thisConnInfo.ConnectStreamState = true; //ConnectStreamWaitEvent.Set(); bConnectStreamSocketFlag = true; thisConnInfo.OnStreamTime(); thisConnInfo.OnStreamCheckTime(); StateClientStreamSocketConnect = true; //StreamConnectAlarmEvent?.BeginInvoke(null, null, null, null); //StreamConnectAlarmEvent?.Invoke(null, null); OnStreamConnectAlarm(null, null); } private void ClientStreamErrorEvent(object sender, ScheduleEvent e) { string strGetMsg = string.Empty; if (e != null) strGetMsg = e.STATE_MSG; XAdaptorLogWrite("Stream Socket Disconnect"); ClearStreamWatchTask(); streStreamConnectWatch.Restart(); thisConnInfo.ConnectStreamState = false; //ConnectStreamWaitEvent.Reset(); bConnectStreamSocketFlag = false; StateClientStreamSocketConnect = false; //SubscribeConnectInfo.Initialize(); //StreamDisconnectAlarmEvent?.BeginInvoke(null, null, null, null); //StreamDisconnectAlarmEvent?.Invoke(null, null); OnStreamDisconnectAlarm(null, null); } private async Task SendCommandConnectState(bool bWaitRespons = false) { if (thisConnInfo.ConnectCommandState == false) return false; if (thisConnInfo.stCommandCheckTime.ElapsedMilliseconds < 60000) return true; bool bResult = true; try { thisConnInfo.OnCommandTime(); try { PING_PACKET MakePingPacket = new PING_PACKET(); int iSendSize = Marshal.SizeOf(MakePingPacket); byte[] ucSendArray = new byte[iSendSize]; MakePingPacket = (PING_PACKET)SystemXNetSerialization.RawDeSerialize(ucSendArray, MakePingPacket.GetType()); MakePingPacket.objCheckMsg[0].Data = "Who?"; byte[] ucSendByteInfo = XCommons.SpecialObjectToByteStream(new BASE_PROTOCOL(BASE_PROTOCOL.PROTOCOL_CODE.CONNECT_STATE), MakePingPacket); byte ucGetLabel = FlowCommandControl.InsertSendQueue(DateTime.Now, ucSendByteInfo, null, bWaitRespons); thisConnInfo.OnCommandCheckTime(); if (bWaitRespons) { await WaitTaskJoin(waitCommandParam, FlowCommandControl, ucGetLabel, false).ConfigureAwait(false); if (QueryResult.bQueryResult) bResult = true; else bResult = false; } } catch (Exception ex) { MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"Command Socket ping check error. [SystemX.Net.XAdaptor.PC : XPCAdaptor.SendCommandConnectState]\r\n" + ex.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG); } finally { } } finally { ; } return bResult; } private async Task SendStreamConnectState(bool bWaitRespons = false) { if (thisConnInfo.ConnectStreamState == false) return false; if (thisConnInfo.stStreamCheckTime.ElapsedMilliseconds < 60000) return true; bool bResult = true; try { thisConnInfo.OnStreamTime(); try { PING_PACKET MakePingPacket = new PING_PACKET(); int iSendSize = Marshal.SizeOf(MakePingPacket); byte[] ucSendArray = new byte[iSendSize]; MakePingPacket = (PING_PACKET)SystemXNetSerialization.RawDeSerialize(ucSendArray, MakePingPacket.GetType()); MakePingPacket.objCheckMsg[0].Data = "Who?"; byte[] ucSendByteInfo = XCommons.SpecialObjectToByteStream(new BASE_PROTOCOL(BASE_PROTOCOL.PROTOCOL_CODE.CONNECT_STATE), MakePingPacket); byte ucGetLabel = FlowStreamControl.InsertSendQueue(DateTime.Now, ucSendByteInfo, null, bWaitRespons); thisConnInfo.OnStreamCheckTime(); if (bWaitRespons) { await WaitTaskJoin(waitStreamParam, FlowStreamControl, ucGetLabel, false).ConfigureAwait(false); if (QueryResult.bQueryResult) bResult = true; else bResult = false; } } catch (Exception ex) { MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"Stream Socket ping check error. [SystemX.Net.XAdaptor.PC : XPCAdaptor.SendStreamConnectState]\r\n" + ex.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG); } finally { } } finally { ; } return bResult; } // The delegate must have the same signature as the method // it will call asynchronously. public delegate string AsyncMethodCaller(int callDuration, out int threadId); //public delegate void RecvWaitEventHandler(WaitParameter sender, EventArgs e); public delegate void RecvWaitEventHandler(WaitParameter sender, EventArgs e); private void RecvWaitEventCall(WaitParameter sender, EventArgs e) { try { } catch (Exception ex) { MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"RecvWaitEventCall failed. [SystemX.Net.XAdaptor.PC.XPCAdaptor : XPCAdaptor.EventCall()]\r\n" + ex.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG); } finally { sender.nSignaled = 1; } } private void RecvWaitEnd(IAsyncResult ar) { // Retrieve the delegate. AsyncResult result = (AsyncResult)ar; } /* private void WaitTskJoin(WaitParameter wp, PacketFlowControl getPF, byte ucGetLabel, bool bUseDataSet = true, long lTimeOut = COMMAND_TIME_OUT) { wp.Init(getPF); Thread t = new Thread(delegate () { QueryResult.Initialize(); QueryResult.xData = wp.TskCheckResult(ucGetLabel, lTimeOut); if (QueryResult.xData != null) { QueryResult.bQueryResult = QueryResult.xData.bReplayResult; if (bUseDataSet) QueryResult.QueryDataSet = QueryResult.xData.objData as DataSet; else { QueryResult.QueryDataSet = null; if (QueryResult.xData.objData is TRANSFER_PACKET) { TRANSFER_PACKET TransferResult = (TRANSFER_PACKET)QueryResult.xData.objData; byte ucCheckLabel = QueryResult.xData.nLabel; QueryResult.bFileRecvResult = TransferResult.bRecvResult; QueryResult.bFileProcessResult = TransferResult.bProcessResult; } else if (QueryResult.xData.objData is COMM_INFO_PACKET) { COMM_INFO_PACKET Result = (COMM_INFO_PACKET)QueryResult.xData.objData; byte ucCheckLabel = QueryResult.xData.nLabel; } } QueryResult.strVarParam1 = QueryResult.xData.HeaderPacket.objVarParam1[0].Data; QueryResult.strVarParam2 = QueryResult.xData.HeaderPacket.objVarParam2[0].Data; QueryResult.strVarParam3 = QueryResult.xData.HeaderPacket.objVarParam3[0].Data; } else getPF.STM.ClearLabel(ucGetLabel); }); t.Start(); t.Join(); } */ private void WaitThreadJoin(WaitParameter wp, PacketFlowControl getPF, byte ucGetLabel, bool bUseDataSet = true, long lTimeOut = COMMAND_TIME_OUT) { wp.Init(getPF); Thread t = new Thread(delegate () { QueryResult.Initialize(); QueryResult.xData = wp.ThreadWaitResult(ucGetLabel, lTimeOut); if (QueryResult.xData != null) { try { QueryResult.bQueryResult = QueryResult.xData.bReplayResult; if (bUseDataSet) QueryResult.QueryDataSet = QueryResult.xData.objData as DataSet; else { QueryResult.QueryDataSet = null; if (QueryResult.xData.objData is TRANSFER_PACKET) { TRANSFER_PACKET TransferResult = (TRANSFER_PACKET)QueryResult.xData.objData; byte ucCheckLabel = QueryResult.xData.nLabel; QueryResult.bFileRecvResult = TransferResult.bRecvResult; QueryResult.bFileProcessResult = TransferResult.bProcessResult; } else if (QueryResult.xData.objData is COMM_INFO_PACKET) { COMM_INFO_PACKET Result = (COMM_INFO_PACKET)QueryResult.xData.objData; byte ucCheckLabel = QueryResult.xData.nLabel; } } QueryResult.strVarParam1 = QueryResult.xData.HeaderPacket.objVarParam1[0].Data; QueryResult.strVarParam2 = QueryResult.xData.HeaderPacket.objVarParam2[0].Data; QueryResult.strVarParam3 = QueryResult.xData.HeaderPacket.objVarParam3[0].Data; } catch { QueryResult.bQueryResult = false; QueryResult.QueryDataSet = null; } finally { ;// } } else getPF.STM.ClearLabel(ucGetLabel); }); t.Start(); t.Join(); } private async Task WaitTaskJoin(WaitParameter wp, PacketFlowControl getPF, byte ucGetLabel, bool bUseDataSet = true) { wp.Init(getPF); bool bSetResult = true; QueryResult.Initialize(); QueryResult.xData = await wp.TaskWaitResult(ucGetLabel).ConfigureAwait(false); if (QueryResult.xData != null) { try { QueryResult.bQueryResult = QueryResult.xData.bReplayResult; if (bUseDataSet) QueryResult.QueryDataSet = QueryResult.xData.objData as DataSet; else { QueryResult.QueryDataSet = null; if (QueryResult.xData.objData is TRANSFER_PACKET) { TRANSFER_PACKET TransferResult = (TRANSFER_PACKET)QueryResult.xData.objData; byte ucCheckLabel = QueryResult.xData.nLabel; QueryResult.bFileRecvResult = TransferResult.bRecvResult; QueryResult.bFileProcessResult = TransferResult.bProcessResult; } else if (QueryResult.xData.objData is COMM_INFO_PACKET) { COMM_INFO_PACKET Result = (COMM_INFO_PACKET)QueryResult.xData.objData; byte ucCheckLabel = QueryResult.xData.nLabel; } } QueryResult.strVarParam1 = QueryResult.xData.HeaderPacket.objVarParam1[0].Data; QueryResult.strVarParam2 = QueryResult.xData.HeaderPacket.objVarParam2[0].Data; QueryResult.strVarParam3 = QueryResult.xData.HeaderPacket.objVarParam3[0].Data; } catch { QueryResult.bQueryResult = false; QueryResult.QueryDataSet = null; bSetResult = false; } finally { ;// } return bSetResult; } else { getPF.STM.ClearLabel(ucGetLabel); return false; } } private XData ComWaitResult(byte nCheckLabel) { XData getXData = null; bool bWaitLabel = false; if (nCheckLabel < 0 || nCheckLabel >= FlowCommandControl.STM.GetLabelSize()) return getXData; Stopwatch stWaitTImeWatch = new Stopwatch(); stWaitTImeWatch.Start(); while (stWaitTImeWatch.ElapsedMilliseconds <= COMMAND_TIME_OUT) { Application.DoEvents(); getXData = FlowCommandControl.STM.CheckLabel(nCheckLabel, ref bWaitLabel); if (bWaitLabel) break; Thread.Sleep(1); } return getXData; } public class WaitParameter { public int nSignaled; public bool tResult; private PacketFlowControl fc; public WaitParameter() { nSignaled = 0; tResult = false; } public void Init(PacketFlowControl getFc) { nSignaled = 0; tResult = false; fc = getFc; } /* public XData TskCheckResult(byte nCheckLabel, long lTimeOut = COMMAND_TIME_OUT) { XData getXData = null; bool bWaitLabel = false; if (nCheckLabel < 0 || nCheckLabel >= fc.STM.GetLabelSize()) return getXData; Stopwatch stWaitTImeWatch = new Stopwatch(); stWaitTImeWatch.Start(); while (true) { if (stWaitTImeWatch.ElapsedMilliseconds >= lTimeOut) break; if (nSignaled == 1) { getXData = fc.STM.CheckLabel(nCheckLabel, ref bWaitLabel); if (bWaitLabel) { tResult = true; break; } } Thread.Sleep(1); } return getXData; } */ public XData ThreadWaitResult(byte nCheckLabel, long lTimeOut = COMMAND_TIME_OUT) { XData getXData = null; bool bWaitLabel = false; if (nCheckLabel < 0 || nCheckLabel >= fc.STM.GetLabelSize()) return getXData; Stopwatch stWaitTImeWatch = new Stopwatch(); stWaitTImeWatch.Start(); while (true) { if (stWaitTImeWatch.ElapsedMilliseconds > lTimeOut) { fc.SetRefSocketPacketClear(); break; } if (nSignaled == 1) { getXData = fc.STM.CheckLabel(nCheckLabel, ref bWaitLabel); if (bWaitLabel) { tResult = true; break; } } Thread.Sleep(1); } return getXData; } public async Task TaskWaitResult(byte nCheckLabel) { XData getXData = null; bool bWaitLabel = false; if (nCheckLabel < 0 || nCheckLabel >= fc.STM.GetLabelSize()) return getXData; Stopwatch stWaitTImeWatch = new Stopwatch(); stWaitTImeWatch.Start(); while (true) { if(stWaitTImeWatch.ElapsedMilliseconds > COMMAND_TIME_OUT) { fc.SetRefSocketPacketClear(); break; } if (nSignaled == 1) { getXData = fc.STM.CheckLabel(nCheckLabel, ref bWaitLabel); if (bWaitLabel) { tResult = true; break; } } await Task.Delay(1).ConfigureAwait(false); } return getXData; } } } }