Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
wisp
GitHub Repository: wisp/impinj-reader-app
Path: blob/master/LLRP/LLRPClient.cs
179 views
/*
***************************************************************************
*  Copyright 2008 Impinj, Inc.
*
*  Licensed under the Apache License, Version 2.0 (the "License");
*  you may not use this file except in compliance with the License.
*  You may obtain a copy of the License at
*
*      http://www.apache.org/licenses/LICENSE-2.0
*
*  Unless required by applicable law or agreed to in writing, software
*  distributed under the License is distributed on an "AS IS" BASIS,
*  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*  See the License for the specific language governing permissions and
*  limitations under the License.
*
***************************************************************************
*/

/*
***************************************************************************
*
*  This code is generated by Impinj LLRP .Net generator. Modification is
*  not recommended.
*
***************************************************************************
*/

/*
***************************************************************************
* File Name:       LLRPClient.cs
*
* Version:         1.0
* Author:          Impinj
* Organization:    Impinj
* Date:            Jan. 18, 2008
*
* Description:     This file contains implementation of LLRP client. LLRP
*                 client is used to build LLRP based application
***************************************************************************
*/


using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Runtime.Remoting;
using System.Collections;
using System.Xml;
using System.Xml.Serialization;
using System.Data;

using LLRP.DataType;

namespace LLRP
{

    //delegates for sending asyn. messages
    public delegate void delegateReaderEventNotification(MSG_READER_EVENT_NOTIFICATION msg);
    public delegate void delegateRoAccessReport(MSG_RO_ACCESS_REPORT msg);
    public delegate void delegateKeepAlive(MSG_KEEPALIVE msg);

    //Delegates for sending encapsulated asyn. messages
    public delegate void delegateEncapReaderEventNotification(ENCAPED_READER_EVENT_NOTIFICATION msg);
    public delegate void delegateEncapRoAccessReport(ENCAPED_RO_ACCESS_REPORT msg);
    public delegate void delegateEncapKeepAlive(ENCAPED_KEEP_ALIVE msg);

    [Serializable]
    public class ClientManualResetEvent
    {
        public ManualResetEvent evt;
        public byte[] data;
        public UInt32 msg_id;

        public ClientManualResetEvent(bool status)
        {
            evt = new ManualResetEvent(status);
        }
    }

    //add comments
    public class LLRPClient : IDisposable
    {
        #region Network Parameters
        private CommunicationInterface cI;
        private int LLRP_TCP_PORT = 5084;
        private int MSG_TIME_OUT = 10000;
        #endregion

        #region Private Members
        private ManualResetEvent conn_evt;
        private ENUM_ConnectionAttemptStatusType conn_status_type;
        private string reader_name;
        #endregion


        public event delegateReaderEventNotification OnReaderEventNotification;
        public event delegateRoAccessReport OnRoAccessReportReceived;
        public event delegateKeepAlive OnKeepAlive;

        public event delegateEncapReaderEventNotification OnEncapedReaderEventNotification;
        public event delegateEncapRoAccessReport OnEncapedRoAccessReportReceived;
        public event delegateEncapKeepAlive OnEncapedKeepAlive;

        protected void TriggerReaderEventNotification(MSG_READER_EVENT_NOTIFICATION msg)
        {
            try
            {
                if (OnReaderEventNotification != null) OnReaderEventNotification(msg);
                if (OnEncapedReaderEventNotification != null)
                {
                    ENCAPED_READER_EVENT_NOTIFICATION ntf = new ENCAPED_READER_EVENT_NOTIFICATION();
                    ntf.reader = reader_name;
                    ntf.ntf = msg;
                }
            }
            catch { }
        }

        protected void TriggerRoAccessReport(MSG_RO_ACCESS_REPORT msg)
        {
            try
            {
                if (OnRoAccessReportReceived != null) OnRoAccessReportReceived(msg);
                if (OnEncapedRoAccessReportReceived != null)
                {
                    ENCAPED_RO_ACCESS_REPORT report = new ENCAPED_RO_ACCESS_REPORT();
                    report.reader = reader_name;
                    report.report = msg;

                    OnEncapedRoAccessReportReceived(report);
                }
            }
            catch { }
        }

        protected void TriggerKeepAlive(MSG_KEEPALIVE msg)
        {
            try
            {
                if (OnKeepAlive != null) OnKeepAlive(msg);
                if (OnEncapedKeepAlive != null)
                {
                    ENCAPED_KEEP_ALIVE keepalive = new ENCAPED_KEEP_ALIVE();
                    keepalive.reader = reader_name;
                    keepalive.keep_alive = msg;

                    OnEncapedKeepAlive(keepalive);
                }
            }
            catch { }
        }

        #region Properties
        public string ReaderName
        {
            get { return reader_name; }
        }
        #endregion

        #region Assistance Functions
        public void SetMessageTimeOut(int time_out)
        {
            this.MSG_TIME_OUT = time_out;
        }

        public int GetMessageTimeOut()
        {
            return MSG_TIME_OUT;
        }

        #endregion

        #region Private Events
        ClientManualResetEvent _event_CUSTOM_MESSAGE;
        ClientManualResetEvent _event_GET_READER_CAPABILITIES;
        ClientManualResetEvent _event_GET_READER_CAPABILITIES_RESPONSE;
        ClientManualResetEvent _event_ADD_ROSPEC;
        ClientManualResetEvent _event_ADD_ROSPEC_RESPONSE;
        ClientManualResetEvent _event_DELETE_ROSPEC;
        ClientManualResetEvent _event_DELETE_ROSPEC_RESPONSE;
        ClientManualResetEvent _event_START_ROSPEC;
        ClientManualResetEvent _event_START_ROSPEC_RESPONSE;
        ClientManualResetEvent _event_STOP_ROSPEC;
        ClientManualResetEvent _event_STOP_ROSPEC_RESPONSE;
        ClientManualResetEvent _event_ENABLE_ROSPEC;
        ClientManualResetEvent _event_ENABLE_ROSPEC_RESPONSE;
        ClientManualResetEvent _event_DISABLE_ROSPEC;
        ClientManualResetEvent _event_DISABLE_ROSPEC_RESPONSE;
        ClientManualResetEvent _event_GET_ROSPECS;
        ClientManualResetEvent _event_GET_ROSPECS_RESPONSE;
        ClientManualResetEvent _event_ADD_ACCESSSPEC;
        ClientManualResetEvent _event_ADD_ACCESSSPEC_RESPONSE;
        ClientManualResetEvent _event_DELETE_ACCESSSPEC;
        ClientManualResetEvent _event_DELETE_ACCESSSPEC_RESPONSE;
        ClientManualResetEvent _event_ENABLE_ACCESSSPEC;
        ClientManualResetEvent _event_ENABLE_ACCESSSPEC_RESPONSE;
        ClientManualResetEvent _event_DISABLE_ACCESSSPEC;
        ClientManualResetEvent _event_DISABLE_ACCESSSPEC_RESPONSE;
        ClientManualResetEvent _event_GET_ACCESSSPECS;
        ClientManualResetEvent _event_GET_ACCESSSPECS_RESPONSE;
        ClientManualResetEvent _event_GET_READER_CONFIG;
        ClientManualResetEvent _event_GET_READER_CONFIG_RESPONSE;
        ClientManualResetEvent _event_SET_READER_CONFIG;
        ClientManualResetEvent _event_SET_READER_CONFIG_RESPONSE;
        ClientManualResetEvent _event_CLOSE_CONNECTION;
        ClientManualResetEvent _event_CLOSE_CONNECTION_RESPONSE;
        ClientManualResetEvent _event_GET_REPORT;
        ClientManualResetEvent _event_RO_ACCESS_REPORT;
        ClientManualResetEvent _event_KEEPALIVE;
        ClientManualResetEvent _event_KEEPALIVE_ACK;
        ClientManualResetEvent _event_READER_EVENT_NOTIFICATION;
        ClientManualResetEvent _event_ENABLE_EVENTS_AND_REPORTS;
        ClientManualResetEvent _event_ERROR_MESSAGE;


        #endregion

        #region Methods
        public LLRPClient()
        {
            cI = new TCPIPClient();
        }

        public bool Open(string llrp_reader_name, int timeout, out ENUM_ConnectionAttemptStatusType status)
        {
            reader_name = llrp_reader_name;

            status = ENUM_ConnectionAttemptStatusType.Failed_Reason_Other_Than_A_Connection_Already_Exists;
            cI.OnMessageReceived += new delegateMessageReceived(ProcesssMessage);

            try { cI.Open(llrp_reader_name, LLRP_TCP_PORT); }
            catch { cI.OnMessageReceived -= new delegateMessageReceived(ProcesssMessage); return false; }


            conn_evt = new ManualResetEvent(false);
            if (conn_evt.WaitOne(timeout, false))
            {
                status = conn_status_type;
                if (status == ENUM_ConnectionAttemptStatusType.Success) return true;
            }

            reader_name = llrp_reader_name;

            try
            {
                cI.Close();
                cI.OnMessageReceived -= new delegateMessageReceived(ProcesssMessage);
            }
            catch
            {
            }
            return false;
        }

        public bool Close()
        {
            try
            {
                MSG_CLOSE_CONNECTION msg = new MSG_CLOSE_CONNECTION();
                MSG_ERROR_MESSAGE msg_err;
                MSG_CLOSE_CONNECTION_RESPONSE rsp = this.CLOSE_CONNECTION(msg, out msg_err, MSG_TIME_OUT);

                if (rsp == null || rsp.LLRPStatus.StatusCode != ENUM_StatusCode.M_Success) return false;

                cI.Close();
                cI.OnMessageReceived -= new delegateMessageReceived(ProcesssMessage);

                return true;
            }
            catch
            {
                return false;
            }
        }

        public void Dispose()
        {
            this.Close();
        }

        private void ProcesssMessage(Int16 ver, Int16 msg_type, Int32 msg_id, byte[] data)
        {
            BitArray bArr;
            int cursor = 0;
            int length;

            switch ((ENUM_LLRP_MSG_TYPE)msg_type)
            {

                case ENUM_LLRP_MSG_TYPE.CUSTOM_MESSAGE:
                    _event_CUSTOM_MESSAGE.data = new byte[data.Length];
                    if (data.Length > 0) Array.Copy(data, _event_CUSTOM_MESSAGE.data, data.Length);
                    _event_CUSTOM_MESSAGE.evt.Set();
                    break;

                case ENUM_LLRP_MSG_TYPE.GET_READER_CAPABILITIES:
                    _event_GET_READER_CAPABILITIES.data = new byte[data.Length];
                    if (data.Length > 0) Array.Copy(data, _event_GET_READER_CAPABILITIES.data, data.Length);
                    _event_GET_READER_CAPABILITIES.evt.Set();
                    break;

                case ENUM_LLRP_MSG_TYPE.GET_READER_CAPABILITIES_RESPONSE:
                    _event_GET_READER_CAPABILITIES_RESPONSE.data = new byte[data.Length];
                    if (data.Length > 0) Array.Copy(data, _event_GET_READER_CAPABILITIES_RESPONSE.data, data.Length);
                    _event_GET_READER_CAPABILITIES_RESPONSE.evt.Set();
                    break;

                case ENUM_LLRP_MSG_TYPE.ADD_ROSPEC:
                    _event_ADD_ROSPEC.data = new byte[data.Length];
                    if (data.Length > 0) Array.Copy(data, _event_ADD_ROSPEC.data, data.Length);
                    _event_ADD_ROSPEC.evt.Set();
                    break;

                case ENUM_LLRP_MSG_TYPE.ADD_ROSPEC_RESPONSE:
                    _event_ADD_ROSPEC_RESPONSE.data = new byte[data.Length];
                    if (data.Length > 0) Array.Copy(data, _event_ADD_ROSPEC_RESPONSE.data, data.Length);
                    _event_ADD_ROSPEC_RESPONSE.evt.Set();
                    break;

                case ENUM_LLRP_MSG_TYPE.DELETE_ROSPEC:
                    _event_DELETE_ROSPEC.data = new byte[data.Length];
                    if (data.Length > 0) Array.Copy(data, _event_DELETE_ROSPEC.data, data.Length);
                    _event_DELETE_ROSPEC.evt.Set();
                    break;

                case ENUM_LLRP_MSG_TYPE.DELETE_ROSPEC_RESPONSE:
                    _event_DELETE_ROSPEC_RESPONSE.data = new byte[data.Length];
                    if (data.Length > 0) Array.Copy(data, _event_DELETE_ROSPEC_RESPONSE.data, data.Length);
                    _event_DELETE_ROSPEC_RESPONSE.evt.Set();
                    break;

                case ENUM_LLRP_MSG_TYPE.START_ROSPEC:
                    _event_START_ROSPEC.data = new byte[data.Length];
                    if (data.Length > 0) Array.Copy(data, _event_START_ROSPEC.data, data.Length);
                    _event_START_ROSPEC.evt.Set();
                    break;

                case ENUM_LLRP_MSG_TYPE.START_ROSPEC_RESPONSE:
                    _event_START_ROSPEC_RESPONSE.data = new byte[data.Length];
                    if (data.Length > 0) Array.Copy(data, _event_START_ROSPEC_RESPONSE.data, data.Length);
                    _event_START_ROSPEC_RESPONSE.evt.Set();
                    break;

                case ENUM_LLRP_MSG_TYPE.STOP_ROSPEC:
                    _event_STOP_ROSPEC.data = new byte[data.Length];
                    if (data.Length > 0) Array.Copy(data, _event_STOP_ROSPEC.data, data.Length);
                    _event_STOP_ROSPEC.evt.Set();
                    break;

                case ENUM_LLRP_MSG_TYPE.STOP_ROSPEC_RESPONSE:
                    _event_STOP_ROSPEC_RESPONSE.data = new byte[data.Length];
                    if (data.Length > 0) Array.Copy(data, _event_STOP_ROSPEC_RESPONSE.data, data.Length);
                    _event_STOP_ROSPEC_RESPONSE.evt.Set();
                    break;

                case ENUM_LLRP_MSG_TYPE.ENABLE_ROSPEC:
                    _event_ENABLE_ROSPEC.data = new byte[data.Length];
                    if (data.Length > 0) Array.Copy(data, _event_ENABLE_ROSPEC.data, data.Length);
                    _event_ENABLE_ROSPEC.evt.Set();
                    break;

                case ENUM_LLRP_MSG_TYPE.ENABLE_ROSPEC_RESPONSE:
                    _event_ENABLE_ROSPEC_RESPONSE.data = new byte[data.Length];
                    if (data.Length > 0) Array.Copy(data, _event_ENABLE_ROSPEC_RESPONSE.data, data.Length);
                    _event_ENABLE_ROSPEC_RESPONSE.evt.Set();
                    break;

                case ENUM_LLRP_MSG_TYPE.DISABLE_ROSPEC:
                    _event_DISABLE_ROSPEC.data = new byte[data.Length];
                    if (data.Length > 0) Array.Copy(data, _event_DISABLE_ROSPEC.data, data.Length);
                    _event_DISABLE_ROSPEC.evt.Set();
                    break;

                case ENUM_LLRP_MSG_TYPE.DISABLE_ROSPEC_RESPONSE:
                    _event_DISABLE_ROSPEC_RESPONSE.data = new byte[data.Length];
                    if (data.Length > 0) Array.Copy(data, _event_DISABLE_ROSPEC_RESPONSE.data, data.Length);
                    _event_DISABLE_ROSPEC_RESPONSE.evt.Set();
                    break;

                case ENUM_LLRP_MSG_TYPE.GET_ROSPECS:
                    _event_GET_ROSPECS.data = new byte[data.Length];
                    if (data.Length > 0) Array.Copy(data, _event_GET_ROSPECS.data, data.Length);
                    _event_GET_ROSPECS.evt.Set();
                    break;

                case ENUM_LLRP_MSG_TYPE.GET_ROSPECS_RESPONSE:
                    _event_GET_ROSPECS_RESPONSE.data = new byte[data.Length];
                    if (data.Length > 0) Array.Copy(data, _event_GET_ROSPECS_RESPONSE.data, data.Length);
                    _event_GET_ROSPECS_RESPONSE.evt.Set();
                    break;

                case ENUM_LLRP_MSG_TYPE.ADD_ACCESSSPEC:
                    _event_ADD_ACCESSSPEC.data = new byte[data.Length];
                    if (data.Length > 0) Array.Copy(data, _event_ADD_ACCESSSPEC.data, data.Length);
                    _event_ADD_ACCESSSPEC.evt.Set();
                    break;

                case ENUM_LLRP_MSG_TYPE.ADD_ACCESSSPEC_RESPONSE:
                    _event_ADD_ACCESSSPEC_RESPONSE.data = new byte[data.Length];
                    if (data.Length > 0) Array.Copy(data, _event_ADD_ACCESSSPEC_RESPONSE.data, data.Length);
                    _event_ADD_ACCESSSPEC_RESPONSE.evt.Set();
                    break;

                case ENUM_LLRP_MSG_TYPE.DELETE_ACCESSSPEC:
                    _event_DELETE_ACCESSSPEC.data = new byte[data.Length];
                    if (data.Length > 0) Array.Copy(data, _event_DELETE_ACCESSSPEC.data, data.Length);
                    _event_DELETE_ACCESSSPEC.evt.Set();
                    break;

                case ENUM_LLRP_MSG_TYPE.DELETE_ACCESSSPEC_RESPONSE:
                    _event_DELETE_ACCESSSPEC_RESPONSE.data = new byte[data.Length];
                    if (data.Length > 0) Array.Copy(data, _event_DELETE_ACCESSSPEC_RESPONSE.data, data.Length);
                    _event_DELETE_ACCESSSPEC_RESPONSE.evt.Set();
                    break;

                case ENUM_LLRP_MSG_TYPE.ENABLE_ACCESSSPEC:
                    _event_ENABLE_ACCESSSPEC.data = new byte[data.Length];
                    if (data.Length > 0) Array.Copy(data, _event_ENABLE_ACCESSSPEC.data, data.Length);
                    _event_ENABLE_ACCESSSPEC.evt.Set();
                    break;

                case ENUM_LLRP_MSG_TYPE.ENABLE_ACCESSSPEC_RESPONSE:
                    _event_ENABLE_ACCESSSPEC_RESPONSE.data = new byte[data.Length];
                    if (data.Length > 0) Array.Copy(data, _event_ENABLE_ACCESSSPEC_RESPONSE.data, data.Length);
                    _event_ENABLE_ACCESSSPEC_RESPONSE.evt.Set();
                    break;

                case ENUM_LLRP_MSG_TYPE.DISABLE_ACCESSSPEC:
                    _event_DISABLE_ACCESSSPEC.data = new byte[data.Length];
                    if (data.Length > 0) Array.Copy(data, _event_DISABLE_ACCESSSPEC.data, data.Length);
                    _event_DISABLE_ACCESSSPEC.evt.Set();
                    break;

                case ENUM_LLRP_MSG_TYPE.DISABLE_ACCESSSPEC_RESPONSE:
                    _event_DISABLE_ACCESSSPEC_RESPONSE.data = new byte[data.Length];
                    if (data.Length > 0) Array.Copy(data, _event_DISABLE_ACCESSSPEC_RESPONSE.data, data.Length);
                    _event_DISABLE_ACCESSSPEC_RESPONSE.evt.Set();
                    break;

                case ENUM_LLRP_MSG_TYPE.GET_ACCESSSPECS:
                    _event_GET_ACCESSSPECS.data = new byte[data.Length];
                    if (data.Length > 0) Array.Copy(data, _event_GET_ACCESSSPECS.data, data.Length);
                    _event_GET_ACCESSSPECS.evt.Set();
                    break;

                case ENUM_LLRP_MSG_TYPE.GET_ACCESSSPECS_RESPONSE:
                    _event_GET_ACCESSSPECS_RESPONSE.data = new byte[data.Length];
                    if (data.Length > 0) Array.Copy(data, _event_GET_ACCESSSPECS_RESPONSE.data, data.Length);
                    _event_GET_ACCESSSPECS_RESPONSE.evt.Set();
                    break;

                case ENUM_LLRP_MSG_TYPE.GET_READER_CONFIG:
                    _event_GET_READER_CONFIG.data = new byte[data.Length];
                    if (data.Length > 0) Array.Copy(data, _event_GET_READER_CONFIG.data, data.Length);
                    _event_GET_READER_CONFIG.evt.Set();
                    break;

                case ENUM_LLRP_MSG_TYPE.GET_READER_CONFIG_RESPONSE:
                    _event_GET_READER_CONFIG_RESPONSE.data = new byte[data.Length];
                    if (data.Length > 0) Array.Copy(data, _event_GET_READER_CONFIG_RESPONSE.data, data.Length);
                    _event_GET_READER_CONFIG_RESPONSE.evt.Set();
                    break;

                case ENUM_LLRP_MSG_TYPE.SET_READER_CONFIG:
                    _event_SET_READER_CONFIG.data = new byte[data.Length];
                    if (data.Length > 0) Array.Copy(data, _event_SET_READER_CONFIG.data, data.Length);
                    _event_SET_READER_CONFIG.evt.Set();
                    break;

                case ENUM_LLRP_MSG_TYPE.SET_READER_CONFIG_RESPONSE:
                    _event_SET_READER_CONFIG_RESPONSE.data = new byte[data.Length];
                    if (data.Length > 0) Array.Copy(data, _event_SET_READER_CONFIG_RESPONSE.data, data.Length);
                    _event_SET_READER_CONFIG_RESPONSE.evt.Set();
                    break;

                case ENUM_LLRP_MSG_TYPE.CLOSE_CONNECTION:
                    _event_CLOSE_CONNECTION.data = new byte[data.Length];
                    if (data.Length > 0) Array.Copy(data, _event_CLOSE_CONNECTION.data, data.Length);
                    _event_CLOSE_CONNECTION.evt.Set();
                    break;

                case ENUM_LLRP_MSG_TYPE.CLOSE_CONNECTION_RESPONSE:
                    _event_CLOSE_CONNECTION_RESPONSE.data = new byte[data.Length];
                    if (data.Length > 0) Array.Copy(data, _event_CLOSE_CONNECTION_RESPONSE.data, data.Length);
                    _event_CLOSE_CONNECTION_RESPONSE.evt.Set();
                    break;

                case ENUM_LLRP_MSG_TYPE.GET_REPORT:
                    _event_GET_REPORT.data = new byte[data.Length];
                    if (data.Length > 0) Array.Copy(data, _event_GET_REPORT.data, data.Length);
                    _event_GET_REPORT.evt.Set();
                    break;

                case ENUM_LLRP_MSG_TYPE.RO_ACCESS_REPORT:
                    try
                    {
                        bArr = Util.ConvertByteArrayToBitArray(data);
                        length = bArr.Count;
                        MSG_RO_ACCESS_REPORT rpt = MSG_RO_ACCESS_REPORT.FromBitArray(ref bArr, ref cursor, length);
                        delegateRoAccessReport roaccess = new delegateRoAccessReport(TriggerRoAccessReport);
                        roaccess.BeginInvoke(rpt, null, null);
                    }
                    catch
                    {
                    }
                    break;

                case ENUM_LLRP_MSG_TYPE.KEEPALIVE:
                    try
                    {
                        bArr = Util.ConvertByteArrayToBitArray(data);
                        length = bArr.Count;
                        MSG_KEEPALIVE msg = MSG_KEEPALIVE.FromBitArray(ref bArr, ref cursor, length);
                        delegateKeepAlive rMsg = new delegateKeepAlive(TriggerKeepAlive);
                        rMsg.BeginInvoke(msg, null, null);
                    }
                    catch
                    {
                    }
                    break;

                case ENUM_LLRP_MSG_TYPE.KEEPALIVE_ACK:
                    _event_KEEPALIVE_ACK.data = new byte[data.Length];
                    if (data.Length > 0) Array.Copy(data, _event_KEEPALIVE_ACK.data, data.Length);
                    _event_KEEPALIVE_ACK.evt.Set();
                    break;

                case ENUM_LLRP_MSG_TYPE.READER_EVENT_NOTIFICATION:
                    try
                    {
                        bArr = Util.ConvertByteArrayToBitArray(data);
                        length = bArr.Count;
                        MSG_READER_EVENT_NOTIFICATION ntf = MSG_READER_EVENT_NOTIFICATION.FromBitArray(ref bArr, ref cursor, length);
                        if (conn_evt != null && ntf.ReaderEventNotificationData.ConnectionAttemptEvent != null)
                        {
                            conn_status_type = ntf.ReaderEventNotificationData.ConnectionAttemptEvent.Status;
                            conn_evt.Set();
                        }
                        else
                        {
                            delegateReaderEventNotification rEvent = new delegateReaderEventNotification(TriggerReaderEventNotification);
                            rEvent.BeginInvoke(ntf, null, null);
                        }
                    }
                    catch
                    {
                    }
                    break;

                case ENUM_LLRP_MSG_TYPE.ENABLE_EVENTS_AND_REPORTS:
                    _event_ENABLE_EVENTS_AND_REPORTS.data = new byte[data.Length];
                    if (data.Length > 0) Array.Copy(data, _event_ENABLE_EVENTS_AND_REPORTS.data, data.Length);
                    _event_ENABLE_EVENTS_AND_REPORTS.evt.Set();
                    break;

                case ENUM_LLRP_MSG_TYPE.ERROR_MESSAGE:
                    _event_ERROR_MESSAGE.data = new byte[data.Length];
                    if (data.Length > 0) Array.Copy(data, _event_ERROR_MESSAGE.data, data.Length);
                    _event_ERROR_MESSAGE.evt.Set();
                    break;

                default:
                    break;
            }
        }

        #endregion


        public MSG_CUSTOM_MESSAGE CUSTOM_MESSAGE(MSG_CUSTOM_MESSAGE msg, out MSG_ERROR_MESSAGE msg_err, int time_out)
        {
            msg_err = null;
            //Add your code here
            _event_CUSTOM_MESSAGE = new ClientManualResetEvent(false);
            _event_CUSTOM_MESSAGE.msg_id = msg.MSG_ID;
            _event_ERROR_MESSAGE = new ClientManualResetEvent(false);

            WaitHandle[] waitHandles = new WaitHandle[] { _event_CUSTOM_MESSAGE.evt, _event_ERROR_MESSAGE.evt };

            bool[] bit_array = msg.ToBitArray();
            byte[] data = Util.ConvertBitArrayToByteArray(bit_array);

            cI.Send(data);

            int wait_result = WaitHandle.WaitAny(waitHandles, time_out, false);

            int cursor = 0;
            int length;
            BitArray bArr;

            try
            {
                switch (wait_result)
                {
                    case 0:
                        bArr = Util.ConvertByteArrayToBitArray(_event_CUSTOM_MESSAGE.data);
                        length = bArr.Count;
                        MSG_CUSTOM_MESSAGE msg_rsp = MSG_CUSTOM_MESSAGE.FromBitArray(ref bArr, ref cursor, length);
                        return msg_rsp;
                    case 1:
                        bArr = Util.ConvertByteArrayToBitArray(_event_ERROR_MESSAGE.data);
                        length = bArr.Count;
                        msg_err = MSG_ERROR_MESSAGE.FromBitArray(ref bArr, ref cursor, length);
                        return null;
                    default:
                        return null;
                }
            }
            catch
            {
                return null;
            }
        }


        public MSG_GET_READER_CAPABILITIES_RESPONSE GET_READER_CAPABILITIES(MSG_GET_READER_CAPABILITIES msg, out MSG_ERROR_MESSAGE msg_err, int time_out)
        {
            msg_err = null;
            //Add your code here
            _event_GET_READER_CAPABILITIES_RESPONSE = new ClientManualResetEvent(false);
            _event_GET_READER_CAPABILITIES_RESPONSE.msg_id = msg.MSG_ID;
            _event_ERROR_MESSAGE = new ClientManualResetEvent(false);

            WaitHandle[] waitHandles = new WaitHandle[] { _event_GET_READER_CAPABILITIES_RESPONSE.evt, _event_ERROR_MESSAGE.evt };

            bool[] bit_array = msg.ToBitArray();
            byte[] data = Util.ConvertBitArrayToByteArray(bit_array);

            cI.Send(data);

            int wait_result = WaitHandle.WaitAny(waitHandles, time_out, false);

            int cursor = 0;
            int length;
            BitArray bArr;

            try
            {
                switch (wait_result)
                {
                    case 0:
                        bArr = Util.ConvertByteArrayToBitArray(_event_GET_READER_CAPABILITIES_RESPONSE.data);
                        length = bArr.Count;
                        MSG_GET_READER_CAPABILITIES_RESPONSE msg_rsp = MSG_GET_READER_CAPABILITIES_RESPONSE.FromBitArray(ref bArr, ref cursor, length);
                        if (msg_rsp.MSG_ID != msg.MSG_ID) return null;
                        else
                            return msg_rsp;
                    case 1:
                        bArr = Util.ConvertByteArrayToBitArray(_event_ERROR_MESSAGE.data);
                        length = bArr.Count;
                        msg_err = MSG_ERROR_MESSAGE.FromBitArray(ref bArr, ref cursor, length);
                        return null;
                    default:
                        return null;
                }
            }
            catch
            {
                return null;
            }
        }

        public MSG_ADD_ROSPEC_RESPONSE ADD_ROSPEC(MSG_ADD_ROSPEC msg, out MSG_ERROR_MESSAGE msg_err, int time_out)
        {
            msg_err = null;
            //Add your code here
            _event_ADD_ROSPEC_RESPONSE = new ClientManualResetEvent(false);
            _event_ADD_ROSPEC_RESPONSE.msg_id = msg.MSG_ID;
            _event_ERROR_MESSAGE = new ClientManualResetEvent(false);

            WaitHandle[] waitHandles = new WaitHandle[] { _event_ADD_ROSPEC_RESPONSE.evt, _event_ERROR_MESSAGE.evt };

            bool[] bit_array = msg.ToBitArray();
            byte[] data = Util.ConvertBitArrayToByteArray(bit_array);

            cI.Send(data);

            int wait_result = WaitHandle.WaitAny(waitHandles, time_out, false);

            int cursor = 0;
            int length;
            BitArray bArr;

            try
            {
                switch (wait_result)
                {
                    case 0:
                        bArr = Util.ConvertByteArrayToBitArray(_event_ADD_ROSPEC_RESPONSE.data);
                        length = bArr.Count;
                        MSG_ADD_ROSPEC_RESPONSE msg_rsp = MSG_ADD_ROSPEC_RESPONSE.FromBitArray(ref bArr, ref cursor, length);
                        if (msg_rsp.MSG_ID != msg.MSG_ID) return null;
                        else
                            return msg_rsp;
                    case 1:
                        bArr = Util.ConvertByteArrayToBitArray(_event_ERROR_MESSAGE.data);
                        length = bArr.Count;
                        msg_err = MSG_ERROR_MESSAGE.FromBitArray(ref bArr, ref cursor, length);
                        return null;
                    default:
                        return null;
                }
            }
            catch
            {
                return null;
            }
        }

        public MSG_DELETE_ROSPEC_RESPONSE DELETE_ROSPEC(MSG_DELETE_ROSPEC msg, out MSG_ERROR_MESSAGE msg_err, int time_out)
        {
            msg_err = null;
            //Add your code here
            _event_DELETE_ROSPEC_RESPONSE = new ClientManualResetEvent(false);
            _event_DELETE_ROSPEC_RESPONSE.msg_id = msg.MSG_ID;
            _event_ERROR_MESSAGE = new ClientManualResetEvent(false);

            WaitHandle[] waitHandles = new WaitHandle[] { _event_DELETE_ROSPEC_RESPONSE.evt, _event_ERROR_MESSAGE.evt };

            bool[] bit_array = msg.ToBitArray();
            byte[] data = Util.ConvertBitArrayToByteArray(bit_array);

            cI.Send(data);

            int wait_result = WaitHandle.WaitAny(waitHandles, time_out, false);

            int cursor = 0;
            int length;
            BitArray bArr;

            try
            {
                switch (wait_result)
                {
                    case 0:
                        bArr = Util.ConvertByteArrayToBitArray(_event_DELETE_ROSPEC_RESPONSE.data);
                        length = bArr.Count;
                        MSG_DELETE_ROSPEC_RESPONSE msg_rsp = MSG_DELETE_ROSPEC_RESPONSE.FromBitArray(ref bArr, ref cursor, length);
                        if (msg_rsp.MSG_ID != msg.MSG_ID) return null;
                        else
                            return msg_rsp;
                    case 1:
                        bArr = Util.ConvertByteArrayToBitArray(_event_ERROR_MESSAGE.data);
                        length = bArr.Count;
                        msg_err = MSG_ERROR_MESSAGE.FromBitArray(ref bArr, ref cursor, length);
                        return null;
                    default:
                        return null;
                }
            }
            catch
            {
                return null;
            }
        }

        public MSG_START_ROSPEC_RESPONSE START_ROSPEC(MSG_START_ROSPEC msg, out MSG_ERROR_MESSAGE msg_err, int time_out)
        {
            msg_err = null;
            //Add your code here
            _event_START_ROSPEC_RESPONSE = new ClientManualResetEvent(false);
            _event_START_ROSPEC_RESPONSE.msg_id = msg.MSG_ID;
            _event_ERROR_MESSAGE = new ClientManualResetEvent(false);

            WaitHandle[] waitHandles = new WaitHandle[] { _event_START_ROSPEC_RESPONSE.evt, _event_ERROR_MESSAGE.evt };

            bool[] bit_array = msg.ToBitArray();
            byte[] data = Util.ConvertBitArrayToByteArray(bit_array);

            cI.Send(data);

            int wait_result = WaitHandle.WaitAny(waitHandles, time_out, false);

            int cursor = 0;
            int length;
            BitArray bArr;

            try
            {
                switch (wait_result)
                {
                    case 0:
                        bArr = Util.ConvertByteArrayToBitArray(_event_START_ROSPEC_RESPONSE.data);
                        length = bArr.Count;
                        MSG_START_ROSPEC_RESPONSE msg_rsp = MSG_START_ROSPEC_RESPONSE.FromBitArray(ref bArr, ref cursor, length);
                        if (msg_rsp.MSG_ID != msg.MSG_ID) return null;
                        else
                            return msg_rsp;
                    case 1:
                        bArr = Util.ConvertByteArrayToBitArray(_event_ERROR_MESSAGE.data);
                        length = bArr.Count;
                        msg_err = MSG_ERROR_MESSAGE.FromBitArray(ref bArr, ref cursor, length);
                        return null;
                    default:
                        return null;
                }
            }
            catch
            {
                return null;
            }
        }

        public MSG_STOP_ROSPEC_RESPONSE STOP_ROSPEC(MSG_STOP_ROSPEC msg, out MSG_ERROR_MESSAGE msg_err, int time_out)
        {
            msg_err = null;

            //Add your code here

            _event_STOP_ROSPEC_RESPONSE = new ClientManualResetEvent(false);
            _event_STOP_ROSPEC_RESPONSE.msg_id = msg.MSG_ID;
            _event_ERROR_MESSAGE = new ClientManualResetEvent(false);

            WaitHandle[] waitHandles = new WaitHandle[] { _event_STOP_ROSPEC_RESPONSE.evt, _event_ERROR_MESSAGE.evt };

            bool[] bit_array = msg.ToBitArray();
            byte[] data = Util.ConvertBitArrayToByteArray(bit_array);

            cI.Send(data);

            int wait_result = WaitHandle.WaitAny(waitHandles, time_out, false);

            int cursor = 0;
            int length;
            BitArray bArr;

            try
            {
                switch (wait_result)
                {
                    case 0:
                        bArr = Util.ConvertByteArrayToBitArray(_event_STOP_ROSPEC_RESPONSE.data);
                        length = bArr.Count;
                        MSG_STOP_ROSPEC_RESPONSE msg_rsp = MSG_STOP_ROSPEC_RESPONSE.FromBitArray(ref bArr, ref cursor, length);
                        if (msg_rsp.MSG_ID != msg.MSG_ID)
                            return null;
                        else
                            return msg_rsp;
                    case 1:
                        bArr = Util.ConvertByteArrayToBitArray(_event_ERROR_MESSAGE.data);
                        length = bArr.Count;
                        msg_err = MSG_ERROR_MESSAGE.FromBitArray(ref bArr, ref cursor, length);
                        return null;
                    default:
                        return null;
                }
            }
            catch
            {
                return null;
            }
        }

        public MSG_ENABLE_ROSPEC_RESPONSE ENABLE_ROSPEC(MSG_ENABLE_ROSPEC msg, out MSG_ERROR_MESSAGE msg_err, int time_out)
        {
            msg_err = null;
            //Add your code here
            _event_ENABLE_ROSPEC_RESPONSE = new ClientManualResetEvent(false);
            _event_ENABLE_ROSPEC_RESPONSE.msg_id = msg.MSG_ID;
            _event_ERROR_MESSAGE = new ClientManualResetEvent(false);

            WaitHandle[] waitHandles = new WaitHandle[] { _event_ENABLE_ROSPEC_RESPONSE.evt, _event_ERROR_MESSAGE.evt };

            bool[] bit_array = msg.ToBitArray();
            byte[] data = Util.ConvertBitArrayToByteArray(bit_array);

            cI.Send(data);

            int wait_result = WaitHandle.WaitAny(waitHandles, time_out, false);

            int cursor = 0;
            int length;
            BitArray bArr;

            try
            {
                switch (wait_result)
                {
                    case 0:
                        bArr = Util.ConvertByteArrayToBitArray(_event_ENABLE_ROSPEC_RESPONSE.data);
                        length = bArr.Count;
                        MSG_ENABLE_ROSPEC_RESPONSE msg_rsp = MSG_ENABLE_ROSPEC_RESPONSE.FromBitArray(ref bArr, ref cursor, length);
                        if (msg_rsp.MSG_ID != msg.MSG_ID) return null;
                        else
                            return msg_rsp;
                    case 1:
                        bArr = Util.ConvertByteArrayToBitArray(_event_ERROR_MESSAGE.data);
                        length = bArr.Count;
                        msg_err = MSG_ERROR_MESSAGE.FromBitArray(ref bArr, ref cursor, length);
                        return null;
                    default:
                        return null;
                }
            }
            catch
            {
                return null;
            }
        }

        public MSG_DISABLE_ROSPEC_RESPONSE DISABLE_ROSPEC(MSG_DISABLE_ROSPEC msg, out MSG_ERROR_MESSAGE msg_err, int time_out)
        {
            msg_err = null;
            //Add your code here
            _event_DISABLE_ROSPEC_RESPONSE = new ClientManualResetEvent(false);
            _event_DISABLE_ROSPEC_RESPONSE.msg_id = msg.MSG_ID;
            _event_ERROR_MESSAGE = new ClientManualResetEvent(false);

            WaitHandle[] waitHandles = new WaitHandle[] { _event_DISABLE_ROSPEC_RESPONSE.evt, _event_ERROR_MESSAGE.evt };

            bool[] bit_array = msg.ToBitArray();
            byte[] data = Util.ConvertBitArrayToByteArray(bit_array);

            cI.Send(data);

            int wait_result = WaitHandle.WaitAny(waitHandles, time_out, false);

            int cursor = 0;
            int length;
            BitArray bArr;

            try
            {
                switch (wait_result)
                {
                    case 0:
                        bArr = Util.ConvertByteArrayToBitArray(_event_DISABLE_ROSPEC_RESPONSE.data);
                        length = bArr.Count;
                        MSG_DISABLE_ROSPEC_RESPONSE msg_rsp = MSG_DISABLE_ROSPEC_RESPONSE.FromBitArray(ref bArr, ref cursor, length);
                        if (msg_rsp.MSG_ID != msg.MSG_ID) return null;
                        else
                            return msg_rsp;
                    case 1:
                        bArr = Util.ConvertByteArrayToBitArray(_event_ERROR_MESSAGE.data);
                        length = bArr.Count;
                        msg_err = MSG_ERROR_MESSAGE.FromBitArray(ref bArr, ref cursor, length);
                        return null;
                    default:
                        return null;
                }
            }
            catch
            {
                return null;
            }
        }

        public MSG_GET_ROSPECS_RESPONSE GET_ROSPECS(MSG_GET_ROSPECS msg, out MSG_ERROR_MESSAGE msg_err, int time_out)
        {
            msg_err = null;
            //Add your code here
            _event_GET_ROSPECS_RESPONSE = new ClientManualResetEvent(false);
            _event_GET_ROSPECS_RESPONSE.msg_id = msg.MSG_ID;
            _event_ERROR_MESSAGE = new ClientManualResetEvent(false);

            WaitHandle[] waitHandles = new WaitHandle[] { _event_GET_ROSPECS_RESPONSE.evt, _event_ERROR_MESSAGE.evt };

            bool[] bit_array = msg.ToBitArray();
            byte[] data = Util.ConvertBitArrayToByteArray(bit_array);

            cI.Send(data);

            int wait_result = WaitHandle.WaitAny(waitHandles, time_out, false);

            int cursor = 0;
            int length;
            BitArray bArr;

            try
            {
                switch (wait_result)
                {
                    case 0:
                        bArr = Util.ConvertByteArrayToBitArray(_event_GET_ROSPECS_RESPONSE.data);
                        length = bArr.Count;
                        MSG_GET_ROSPECS_RESPONSE msg_rsp = MSG_GET_ROSPECS_RESPONSE.FromBitArray(ref bArr, ref cursor, length);
                        if (msg_rsp.MSG_ID != msg.MSG_ID) return null;
                        else
                            return msg_rsp;
                    case 1:
                        bArr = Util.ConvertByteArrayToBitArray(_event_ERROR_MESSAGE.data);
                        length = bArr.Count;
                        msg_err = MSG_ERROR_MESSAGE.FromBitArray(ref bArr, ref cursor, length);
                        return null;
                    default:
                        return null;
                }
            }
            catch
            {
                return null;
            }
        }

        public MSG_ADD_ACCESSSPEC_RESPONSE ADD_ACCESSSPEC(MSG_ADD_ACCESSSPEC msg, out MSG_ERROR_MESSAGE msg_err, int time_out)
        {
            msg_err = null;
            //Add your code here
            _event_ADD_ACCESSSPEC_RESPONSE = new ClientManualResetEvent(false);
            _event_ADD_ACCESSSPEC_RESPONSE.msg_id = msg.MSG_ID;
            _event_ERROR_MESSAGE = new ClientManualResetEvent(false);

            WaitHandle[] waitHandles = new WaitHandle[] { _event_ADD_ACCESSSPEC_RESPONSE.evt, _event_ERROR_MESSAGE.evt };

            bool[] bit_array = msg.ToBitArray();
            byte[] data = Util.ConvertBitArrayToByteArray(bit_array);

            cI.Send(data);

            int wait_result = WaitHandle.WaitAny(waitHandles, time_out, false);

            int cursor = 0;
            int length;
            BitArray bArr;

            try
            {
                switch (wait_result)
                {
                    case 0:
                        bArr = Util.ConvertByteArrayToBitArray(_event_ADD_ACCESSSPEC_RESPONSE.data);
                        length = bArr.Count;
                        MSG_ADD_ACCESSSPEC_RESPONSE msg_rsp = MSG_ADD_ACCESSSPEC_RESPONSE.FromBitArray(ref bArr, ref cursor, length);
                        if (msg_rsp.MSG_ID != msg.MSG_ID) return null;
                        else
                            return msg_rsp;
                    case 1:
                        bArr = Util.ConvertByteArrayToBitArray(_event_ERROR_MESSAGE.data);
                        length = bArr.Count;
                        msg_err = MSG_ERROR_MESSAGE.FromBitArray(ref bArr, ref cursor, length);
                        return null;
                    default:
                        return null;
                }
            }
            catch
            {
                return null;
            }
        }

        public MSG_DELETE_ACCESSSPEC_RESPONSE DELETE_ACCESSSPEC(MSG_DELETE_ACCESSSPEC msg, out MSG_ERROR_MESSAGE msg_err, int time_out)
        {
            msg_err = null;
            //Add your code here
            _event_DELETE_ACCESSSPEC_RESPONSE = new ClientManualResetEvent(false);
            _event_DELETE_ACCESSSPEC_RESPONSE.msg_id = msg.MSG_ID;
            _event_ERROR_MESSAGE = new ClientManualResetEvent(false);

            WaitHandle[] waitHandles = new WaitHandle[] { _event_DELETE_ACCESSSPEC_RESPONSE.evt, _event_ERROR_MESSAGE.evt };

            bool[] bit_array = msg.ToBitArray();
            byte[] data = Util.ConvertBitArrayToByteArray(bit_array);

            cI.Send(data);

            int wait_result = WaitHandle.WaitAny(waitHandles, time_out, false);

            int cursor = 0;
            int length;
            BitArray bArr;

            try
            {
                switch (wait_result)
                {
                    case 0:
                        bArr = Util.ConvertByteArrayToBitArray(_event_DELETE_ACCESSSPEC_RESPONSE.data);
                        length = bArr.Count;
                        MSG_DELETE_ACCESSSPEC_RESPONSE msg_rsp = MSG_DELETE_ACCESSSPEC_RESPONSE.FromBitArray(ref bArr, ref cursor, length);
                        if (msg_rsp.MSG_ID != msg.MSG_ID) return null;
                        else
                            return msg_rsp;
                    case 1:
                        bArr = Util.ConvertByteArrayToBitArray(_event_ERROR_MESSAGE.data);
                        length = bArr.Count;
                        msg_err = MSG_ERROR_MESSAGE.FromBitArray(ref bArr, ref cursor, length);
                        return null;
                    default:
                        return null;
                }
            }
            catch
            {
                return null;
            }
        }

        public MSG_ENABLE_ACCESSSPEC_RESPONSE ENABLE_ACCESSSPEC(MSG_ENABLE_ACCESSSPEC msg, out MSG_ERROR_MESSAGE msg_err, int time_out)
        {
            msg_err = null;
            //Add your code here
            _event_ENABLE_ACCESSSPEC_RESPONSE = new ClientManualResetEvent(false);
            _event_ENABLE_ACCESSSPEC_RESPONSE.msg_id = msg.MSG_ID;
            _event_ERROR_MESSAGE = new ClientManualResetEvent(false);

            WaitHandle[] waitHandles = new WaitHandle[] { _event_ENABLE_ACCESSSPEC_RESPONSE.evt, _event_ERROR_MESSAGE.evt };

            bool[] bit_array = msg.ToBitArray();
            byte[] data = Util.ConvertBitArrayToByteArray(bit_array);

            cI.Send(data);

            int wait_result = WaitHandle.WaitAny(waitHandles, time_out, false);

            int cursor = 0;
            int length;
            BitArray bArr;

            try
            {
                switch (wait_result)
                {
                    case 0:
                        bArr = Util.ConvertByteArrayToBitArray(_event_ENABLE_ACCESSSPEC_RESPONSE.data);
                        length = bArr.Count;
                        MSG_ENABLE_ACCESSSPEC_RESPONSE msg_rsp = MSG_ENABLE_ACCESSSPEC_RESPONSE.FromBitArray(ref bArr, ref cursor, length);
                        if (msg_rsp.MSG_ID != msg.MSG_ID) return null;
                        else
                            return msg_rsp;
                    case 1:
                        bArr = Util.ConvertByteArrayToBitArray(_event_ERROR_MESSAGE.data);
                        length = bArr.Count;
                        msg_err = MSG_ERROR_MESSAGE.FromBitArray(ref bArr, ref cursor, length);
                        return null;
                    default:
                        return null;
                }
            }
            catch
            {
                return null;
            }
        }

        public MSG_DISABLE_ACCESSSPEC_RESPONSE DISABLE_ACCESSSPEC(MSG_DISABLE_ACCESSSPEC msg, out MSG_ERROR_MESSAGE msg_err, int time_out)
        {
            msg_err = null;
            //Add your code here
            _event_DISABLE_ACCESSSPEC_RESPONSE = new ClientManualResetEvent(false);
            _event_DISABLE_ACCESSSPEC_RESPONSE.msg_id = msg.MSG_ID;
            _event_ERROR_MESSAGE = new ClientManualResetEvent(false);

            WaitHandle[] waitHandles = new WaitHandle[] { _event_DISABLE_ACCESSSPEC_RESPONSE.evt, _event_ERROR_MESSAGE.evt };

            bool[] bit_array = msg.ToBitArray();
            byte[] data = Util.ConvertBitArrayToByteArray(bit_array);

            cI.Send(data);

            int wait_result = WaitHandle.WaitAny(waitHandles, time_out, false);

            int cursor = 0;
            int length;
            BitArray bArr;

            try
            {
                switch (wait_result)
                {
                    case 0:
                        bArr = Util.ConvertByteArrayToBitArray(_event_DISABLE_ACCESSSPEC_RESPONSE.data);
                        length = bArr.Count;
                        MSG_DISABLE_ACCESSSPEC_RESPONSE msg_rsp = MSG_DISABLE_ACCESSSPEC_RESPONSE.FromBitArray(ref bArr, ref cursor, length);
                        if (msg_rsp.MSG_ID != msg.MSG_ID) return null;
                        else
                            return msg_rsp;
                    case 1:
                        bArr = Util.ConvertByteArrayToBitArray(_event_ERROR_MESSAGE.data);
                        length = bArr.Count;
                        msg_err = MSG_ERROR_MESSAGE.FromBitArray(ref bArr, ref cursor, length);
                        return null;
                    default:
                        return null;
                }
            }
            catch
            {
                return null;
            }
        }

        public MSG_GET_ACCESSSPECS_RESPONSE GET_ACCESSSPECS(MSG_GET_ACCESSSPECS msg, out MSG_ERROR_MESSAGE msg_err, int time_out)
        {
            msg_err = null;
            //Add your code here
            _event_GET_ACCESSSPECS_RESPONSE = new ClientManualResetEvent(false);
            _event_GET_ACCESSSPECS_RESPONSE.msg_id = msg.MSG_ID;
            _event_ERROR_MESSAGE = new ClientManualResetEvent(false);

            WaitHandle[] waitHandles = new WaitHandle[] { _event_GET_ACCESSSPECS_RESPONSE.evt, _event_ERROR_MESSAGE.evt };

            bool[] bit_array = msg.ToBitArray();
            byte[] data = Util.ConvertBitArrayToByteArray(bit_array);

            cI.Send(data);

            int wait_result = WaitHandle.WaitAny(waitHandles, time_out, false);

            int cursor = 0;
            int length;
            BitArray bArr;

            try
            {
                switch (wait_result)
                {
                    case 0:
                        bArr = Util.ConvertByteArrayToBitArray(_event_GET_ACCESSSPECS_RESPONSE.data);
                        length = bArr.Count;
                        MSG_GET_ACCESSSPECS_RESPONSE msg_rsp = MSG_GET_ACCESSSPECS_RESPONSE.FromBitArray(ref bArr, ref cursor, length);
                        if (msg_rsp.MSG_ID != msg.MSG_ID) return null;
                        else
                            return msg_rsp;
                    case 1:
                        bArr = Util.ConvertByteArrayToBitArray(_event_ERROR_MESSAGE.data);
                        length = bArr.Count;
                        msg_err = MSG_ERROR_MESSAGE.FromBitArray(ref bArr, ref cursor, length);
                        return null;
                    default:
                        return null;
                }
            }
            catch
            {
                return null;
            }
        }

        public MSG_GET_READER_CONFIG_RESPONSE GET_READER_CONFIG(MSG_GET_READER_CONFIG msg, out MSG_ERROR_MESSAGE msg_err, int time_out)
        {
            msg_err = null;
            //Add your code here
            _event_GET_READER_CONFIG_RESPONSE = new ClientManualResetEvent(false);
            _event_GET_READER_CONFIG_RESPONSE.msg_id = msg.MSG_ID;
            _event_ERROR_MESSAGE = new ClientManualResetEvent(false);

            WaitHandle[] waitHandles = new WaitHandle[] { _event_GET_READER_CONFIG_RESPONSE.evt, _event_ERROR_MESSAGE.evt };

            bool[] bit_array = msg.ToBitArray();
            byte[] data = Util.ConvertBitArrayToByteArray(bit_array);

            cI.Send(data);

            int wait_result = WaitHandle.WaitAny(waitHandles, time_out, false);

            int cursor = 0;
            int length;
            BitArray bArr;

            try
            {
                switch (wait_result)
                {
                    case 0:
                        bArr = Util.ConvertByteArrayToBitArray(_event_GET_READER_CONFIG_RESPONSE.data);
                        length = bArr.Count;
                        MSG_GET_READER_CONFIG_RESPONSE msg_rsp = MSG_GET_READER_CONFIG_RESPONSE.FromBitArray(ref bArr, ref cursor, length);
                        if (msg_rsp.MSG_ID != msg.MSG_ID) return null;
                        else
                            return msg_rsp;
                    case 1:
                        bArr = Util.ConvertByteArrayToBitArray(_event_ERROR_MESSAGE.data);
                        length = bArr.Count;
                        msg_err = MSG_ERROR_MESSAGE.FromBitArray(ref bArr, ref cursor, length);
                        return null;
                    default:
                        return null;
                }
            }
            catch
            {
                return null;
            }
        }

        public MSG_SET_READER_CONFIG_RESPONSE SET_READER_CONFIG(MSG_SET_READER_CONFIG msg, out MSG_ERROR_MESSAGE msg_err, int time_out)
        {
            msg_err = null;
            //Add your code here
            _event_SET_READER_CONFIG_RESPONSE = new ClientManualResetEvent(false);
            _event_SET_READER_CONFIG_RESPONSE.msg_id = msg.MSG_ID;
            _event_ERROR_MESSAGE = new ClientManualResetEvent(false);

            WaitHandle[] waitHandles = new WaitHandle[] { _event_SET_READER_CONFIG_RESPONSE.evt, _event_ERROR_MESSAGE.evt };

            bool[] bit_array = msg.ToBitArray();
            byte[] data = Util.ConvertBitArrayToByteArray(bit_array);

            cI.Send(data);

            int wait_result = WaitHandle.WaitAny(waitHandles, time_out, false);

            int cursor = 0;
            int length;
            BitArray bArr;

            try
            {
                switch (wait_result)
                {
                    case 0:
                        bArr = Util.ConvertByteArrayToBitArray(_event_SET_READER_CONFIG_RESPONSE.data);
                        length = bArr.Count;
                        MSG_SET_READER_CONFIG_RESPONSE msg_rsp = MSG_SET_READER_CONFIG_RESPONSE.FromBitArray(ref bArr, ref cursor, length);
                        if (msg_rsp.MSG_ID != msg.MSG_ID) return null;
                        else
                            return msg_rsp;
                    case 1:
                        bArr = Util.ConvertByteArrayToBitArray(_event_ERROR_MESSAGE.data);
                        length = bArr.Count;
                        msg_err = MSG_ERROR_MESSAGE.FromBitArray(ref bArr, ref cursor, length);
                        return null;
                    default:
                        return null;
                }
            }
            catch
            {
                return null;
            }
        }

        public MSG_CLOSE_CONNECTION_RESPONSE CLOSE_CONNECTION(MSG_CLOSE_CONNECTION msg, out MSG_ERROR_MESSAGE msg_err, int time_out)
        {
            msg_err = null;
            //Add your code here
            _event_CLOSE_CONNECTION_RESPONSE = new ClientManualResetEvent(false);
            _event_CLOSE_CONNECTION_RESPONSE.msg_id = msg.MSG_ID;
            _event_ERROR_MESSAGE = new ClientManualResetEvent(false);

            WaitHandle[] waitHandles = new WaitHandle[] { _event_CLOSE_CONNECTION_RESPONSE.evt, _event_ERROR_MESSAGE.evt };

            bool[] bit_array = msg.ToBitArray();
            byte[] data = Util.ConvertBitArrayToByteArray(bit_array);

            cI.Send(data);

            int wait_result = WaitHandle.WaitAny(waitHandles, time_out, false);

            int cursor = 0;
            int length;
            BitArray bArr;

            try
            {
                switch (wait_result)
                {
                    case 0:
                        bArr = Util.ConvertByteArrayToBitArray(_event_CLOSE_CONNECTION_RESPONSE.data);
                        length = bArr.Count;
                        MSG_CLOSE_CONNECTION_RESPONSE msg_rsp = MSG_CLOSE_CONNECTION_RESPONSE.FromBitArray(ref bArr, ref cursor, length);
                        if (msg_rsp.MSG_ID != msg.MSG_ID) return null;
                        else
                            return msg_rsp;
                    case 1:
                        bArr = Util.ConvertByteArrayToBitArray(_event_ERROR_MESSAGE.data);
                        length = bArr.Count;
                        msg_err = MSG_ERROR_MESSAGE.FromBitArray(ref bArr, ref cursor, length);
                        return null;
                    default:
                        return null;
                }
            }
            catch
            {
                return null;
            }
        }

        public void GET_REPORT(MSG_GET_REPORT msg, out MSG_ERROR_MESSAGE msg_err, int time_out)
        {
            msg_err = null;
            _event_ERROR_MESSAGE = new ClientManualResetEvent(false);

            bool[] bit_array = msg.ToBitArray();
            byte[] data = Util.ConvertBitArrayToByteArray(bit_array);

            cI.Send(data);

            bool wait_result = _event_ERROR_MESSAGE.evt.WaitOne(time_out, false);
            if (wait_result)
            {
                BitArray bArr = Util.ConvertByteArrayToBitArray(_event_ENABLE_EVENTS_AND_REPORTS.data);
                int cursor = 0;
                int length = bArr.Count;
                msg_err = MSG_ERROR_MESSAGE.FromBitArray(ref bArr, ref cursor, length);
                return;
            }
        }

        public void KEEPALIVE_ACK(MSG_KEEPALIVE_ACK msg, out MSG_ERROR_MESSAGE msg_err, int time_out)
        {
            msg_err = null;
            _event_ERROR_MESSAGE = new ClientManualResetEvent(false);

            bool[] bit_array = msg.ToBitArray();
            byte[] data = Util.ConvertBitArrayToByteArray(bit_array);

            cI.Send(data);

            bool wait_result = _event_ERROR_MESSAGE.evt.WaitOne(time_out, false);
            if (wait_result)
            {
                BitArray bArr = Util.ConvertByteArrayToBitArray(_event_ENABLE_EVENTS_AND_REPORTS.data);
                int cursor = 0;
                int length = bArr.Count;
                msg_err = MSG_ERROR_MESSAGE.FromBitArray(ref bArr, ref cursor, length);
                return;
            }
        }

        public void ENABLE_EVENTS_AND_REPORTS(MSG_ENABLE_EVENTS_AND_REPORTS msg, out MSG_ERROR_MESSAGE msg_err, int time_out)
        {
            msg_err = null;
            _event_ERROR_MESSAGE = new ClientManualResetEvent(false);

            bool[] bit_array = msg.ToBitArray();
            byte[] data = Util.ConvertBitArrayToByteArray(bit_array);

            cI.Send(data);

            bool wait_result = _event_ERROR_MESSAGE.evt.WaitOne(time_out, false);
            if (wait_result)
            {
                BitArray bArr = Util.ConvertByteArrayToBitArray(_event_ENABLE_EVENTS_AND_REPORTS.data);
                int cursor = 0;
                int length = bArr.Count;
                msg_err = MSG_ERROR_MESSAGE.FromBitArray(ref bArr, ref cursor, length);
                return;
            }
        }

    }
}