private void SocketIO_ProcessMessage(object sender, SocketIOArgs data)
        {
            if (EmIO_Manager == null)//Not connected to Em
            {
                SocketIO_Client.Write(data.GetSocketCommandString(data.Command + 2));
                return;
            }
            else if (!EmIO_Manager.IsSynced)//Not ready for IO updates.
            {
                SocketIO_Client.Write(data.GetSocketCommandString(data.Command + 2));
                return;
            }

            if (!SocketIO_InSync)
            {
                SocketIO_InSync = true;
                this.Queue(false, new Action(() => SocketIO_InSyncEvent?.Invoke(this, true)));
            }

            switch (data.Command)
            {
            case 1:     //Write Outputs
                this.Queue(false, new Action(() => SocketIO_UpdateEmInputsEvent?.Invoke(data)));
                break;

            case 10:     //Read Inputs
                this.Queue(false, new Action(() => SocketIO_UpdateEmOutputsEvent?.Invoke()));
                break;
            }
        }
        private void SocketIO_ClientCleanup()
        {
            SocketIO_ProcessMessageEvent  -= SocketIO_ProcessMessage;
            SocketIO_UpdateEmInputsEvent  -= ARCLManager_SocketComms_SocketIO_UpdateEmInputsEvent;
            SocketIO_UpdateEmOutputsEvent -= ARCLManager_SocketComms_SocketIO_UpdateEmOutputsEvent;

            if (SocketIO_InSync)
            {
                SocketIO_InSync = false;
                SocketIO_InSyncEvent?.Invoke(this, false);
            }

            if (SocketIO_Client == null)
            {
                return;
            }

            SocketIO_Client.DataReceived -= SocketIO_Client_DataReceived;
            SocketIO_Client.Error        -= SocketIO_Client_Error;

            SocketIO_Client.Close();
            SocketIO_Client.Dispose();
            SocketIO_Client = null;
        }