Beispiel #1
0
        private static PARAM_AISpec WispInventoryAISpec(ushort tagPopulation = 4)
        {
            var antennaConfig = new PARAM_AntennaConfiguration()
            {
                AntennaID = 1,
                AirProtocolInventoryCommandSettings = new UNION_AirProtocolInventoryCommandSettings(),
            };
            var inventoryCommand = new PARAM_C1G2InventoryCommand()
            {
                C1G2RFControl = new PARAM_C1G2RFControl()
                {
                    ModeIndex = 0, Tari = 0
                },
                C1G2SingulationControl = new PARAM_C1G2SingulationControl()
                {
                    Session = new TwoBits(1), TagPopulation = tagPopulation
                },
                TagInventoryStateAware = false,
            };

            antennaConfig.AirProtocolInventoryCommandSettings.Add(inventoryCommand);

            var enabledAntennas = new UInt16Array();

            enabledAntennas.Add(1);

            return(new PARAM_AISpec()
            {
                AntennaIDs = enabledAntennas,

                AISpecStopTrigger = new PARAM_AISpecStopTrigger()
                {
                    AISpecStopTriggerType = ENUM_AISpecStopTriggerType.Null
                },

                InventoryParameterSpec = new PARAM_InventoryParameterSpec[]
                {
                    new PARAM_InventoryParameterSpec()
                    {
                        InventoryParameterSpecID = 1234,
                        ProtocolID = ENUM_AirProtocols.EPCGlobalClass1Gen2,
                        AntennaConfiguration = new PARAM_AntennaConfiguration[] { antennaConfig },
                    }
                }
            });
        }
Beispiel #2
0
        /// <summary></summary>
        private void SetReaderConfig()
        {
            MSG_SET_READER_CONFIG msg = new MSG_SET_READER_CONFIG();

            PARAM_KeepaliveSpec pKeepalive = new PARAM_KeepaliveSpec();

            msg.KeepaliveSpec = pKeepalive;
            pKeepalive.KeepaliveTriggerType = ENUM_KeepaliveTriggerType.Periodic;
            pKeepalive.PeriodicTriggerValue = 15000;

            PARAM_ImpinjLinkMonitorConfiguration pLinkMonitor = new PARAM_ImpinjLinkMonitorConfiguration();

            pLinkMonitor.LinkDownThreshold = 4;
            pLinkMonitor.LinkMonitorMode   = ENUM_ImpinjLinkMonitorMode.Enabled;
            msg.Custom.Add(pLinkMonitor);

            //
            msg.AntennaConfiguration = new PARAM_AntennaConfiguration[1];
            var pAntConfig = new PARAM_AntennaConfiguration();

            msg.AntennaConfiguration[0] = pAntConfig;

            pAntConfig.AntennaID = 0;
            pAntConfig.AirProtocolInventoryCommandSettings = new UNION_AirProtocolInventoryCommandSettings();

            var pInventoryCommand = new PARAM_C1G2InventoryCommand();

            pAntConfig.AirProtocolInventoryCommandSettings.Add(pInventoryCommand);
            pInventoryCommand.TagInventoryStateAware = false;

            MSG_ERROR_MESSAGE?msgErr = null;
            var msgResp = this.BaseClient?.SET_READER_CONFIG(
                msg:      msg,
                msg_err:  out msgErr,
                time_out: 3000);

            this.CheckLLRPError(msgResp, msgErr);
        }
Beispiel #3
0
        public static PARAM_C1G2InventoryCommand CreateInventoryCommand(int Q)
        {
            // Create the Inventory Command and RF Control parameters
            PARAM_C1G2InventoryCommand c1g2Inv = new PARAM_C1G2InventoryCommand();



            // Set the session.
            PARAM_C1G2SingulationControl c1g2Sing = new PARAM_C1G2SingulationControl();

            c1g2Sing.Session               = new TwoBits(1);
            c1g2Sing.TagPopulation         = (ushort)Math.Pow(2, Q);
            c1g2Sing.TagTransitTime        = 0;
            c1g2Inv.C1G2SingulationControl = c1g2Sing;
            c1g2Inv.TagInventoryStateAware = false;

            // Set the search mode.
            PARAM_ImpinjInventorySearchMode impISM = new PARAM_ImpinjInventorySearchMode();

            impISM.InventorySearchMode = ENUM_ImpinjInventorySearchType.Dual_Target;
            c1g2Inv.Custom.Add(impISM);
            return(c1g2Inv);
        }
Beispiel #4
0
        /// <summary></summary>
        private void SetAntennaConfig()
        {
            MSG_SET_READER_CONFIG msg = new MSG_SET_READER_CONFIG();

            msg.ResetToFactoryDefault = false;

            msg.AntennaConfiguration = new PARAM_AntennaConfiguration[1];

            // Antenna Configuration
            PARAM_AntennaConfiguration pAntennaConfig = new PARAM_AntennaConfiguration();

            msg.AntennaConfiguration[0] = pAntennaConfig;

            pAntennaConfig.AntennaID = 0;
            pAntennaConfig.AirProtocolInventoryCommandSettings = new UNION_AirProtocolInventoryCommandSettings();

            // C1G2 Inventory Command
            PARAM_C1G2InventoryCommand pInventoryCommand = new PARAM_C1G2InventoryCommand();

            pAntennaConfig.AirProtocolInventoryCommandSettings.Add(pInventoryCommand);

            pInventoryCommand.TagInventoryStateAware = false;

            PARAM_ImpinjFixedFrequencyList pFixedFreqList = new PARAM_ImpinjFixedFrequencyList();

            pInventoryCommand.Custom.Add(pFixedFreqList);

            pFixedFreqList.FixedFrequencyMode = ENUM_ImpinjFixedFrequencyMode.Disabled;
            pFixedFreqList.ChannelList        = new UInt16Array();


            MSG_ERROR_MESSAGE?msgErr = null;
            MSG_SET_READER_CONFIG_RESPONSE?msgResp = this.BaseClient?.SET_READER_CONFIG(
                msg: msg,
                msg_err: out msgErr,
                time_out: this.Timeout);
        }
Beispiel #5
0
        static void Main(string[] args)
        {
            LLRPClient reader;
            int        i;

            #region ProcessCommandLine

            if (args.Length < 1)
            {
                usage();
                return;
            }

            /* get the options. Skip the last one as its the hostname */
            for (i = 0; i < args.Length - 1; i++)
            {
                if ((args[i] == "-p") && (i < (args.Length - 1)))
                {
                    i++;
                    m_password = System.Convert.ToUInt32(args[i]);
                }
                else if ((args[i] == "-n") && (i < (args.Length - 1)))
                {
                    i++;
                    m_newPassword = System.Convert.ToUInt32(args[i]);
                }
                else if (args[i] == "-t")
                {
                    m_tid = ENUM_ImpinjSerializedTIDMode.Enabled;
                }
                else if (args[i] == "-s")
                {
                    m_shortRange = ENUM_ImpinjQTAccessRange.Short_Range;
                }
                else if ((args[i] == "-v") && (i < (args.Length - 1)))
                {
                    i++;
                    m_Verbose = System.Convert.ToUInt32(args[i]);
                }
                else if ((args[i] == "-q") && (i < (args.Length - 1)))
                {
                    i++;
                    m_qtmode = System.Convert.ToUInt32(args[i]);
                }
                else
                {
                    usage();
                    return;
                }
            }

            m_readerName = args[i];

            Console.WriteLine(
                "Impinj C# LTK.NET RFID Application DocSample5 reader - " +
                m_readerName + "\n");

            Console.WriteLine(
                " qtMode:" + m_qtmode.ToString() +
                " Verbose:" + m_Verbose.ToString() +
                " Range:" + m_shortRange.ToString() +
                " SerializeTID:" + m_tid.ToString() +
                " OldPassword:"******" NewPassword:"******"Initializing\n");

                //Create an instance of LLRP reader client.
                reader = new LLRPClient();

                //Impinj Best Practice! Always Install the Impinj extensions
                Impinj_Installer.Install();
            }
            #endregion

            #region EventHandlers
            {
                Console.WriteLine("Adding Event Handlers\n");
                reader.OnReaderEventNotification += new delegateReaderEventNotification(reader_OnReaderEventNotification);
                reader.OnRoAccessReportReceived  += new delegateRoAccessReport(reader_OnRoAccessReportReceived);
            }
            #endregion

            #region Connecting
            {
                Console.WriteLine("Connecting To Reader\n");

                ENUM_ConnectionAttemptStatusType status;

                //Open the reader connection.  Timeout after 5 seconds
                bool ret = reader.Open(m_readerName, 5000, out status);

                //Ensure that the open succeeded and that the reader
                // returned the correct connection status result

                if (!ret || status != ENUM_ConnectionAttemptStatusType.Success)
                {
                    Console.WriteLine("Failed to Connect to Reader \n");
                    return;
                }
            }
            #endregion

            #region EnableExtensions
            {
                Console.WriteLine("Enabling Impinj Extensions\n");

                MSG_IMPINJ_ENABLE_EXTENSIONS imp_msg =
                    new MSG_IMPINJ_ENABLE_EXTENSIONS();
                MSG_ERROR_MESSAGE msg_err;

                imp_msg.MSG_ID = msgID++;
                // note :this doesn't need to bet set as the library will default

                //Send the custom message and wait for 8 seconds
                MSG_CUSTOM_MESSAGE cust_rsp = reader.CUSTOM_MESSAGE(imp_msg, out msg_err, 8000);
                MSG_IMPINJ_ENABLE_EXTENSIONS_RESPONSE msg_rsp =
                    cust_rsp as MSG_IMPINJ_ENABLE_EXTENSIONS_RESPONSE;

                if (msg_rsp != null)
                {
                    if (msg_rsp.LLRPStatus.StatusCode != ENUM_StatusCode.M_Success)
                    {
                        Console.WriteLine(msg_rsp.LLRPStatus.StatusCode.ToString());
                        reader.Close();
                        return;
                    }
                }
                else if (msg_err != null)
                {
                    Console.WriteLine(msg_err.ToString());
                    reader.Close();
                    return;
                }
                else
                {
                    Console.WriteLine("Enable Extensions Command Timed out\n");
                    reader.Close();
                    return;
                }
            }
            #endregion

            #region FactoryDefault
            {
                Console.WriteLine("Factory Default the Reader\n");

                // factory default the reader
                MSG_SET_READER_CONFIG msg_cfg = new MSG_SET_READER_CONFIG();
                MSG_ERROR_MESSAGE     msg_err;

                msg_cfg.ResetToFactoryDefault = true;
                msg_cfg.MSG_ID = msgID++;
                //this doesn't need to bet set as the library will default

                //if SET_READER_CONFIG affects antennas it could take several seconds to return
                MSG_SET_READER_CONFIG_RESPONSE rsp_cfg = reader.SET_READER_CONFIG(msg_cfg, out msg_err, 12000);

                if (rsp_cfg != null)
                {
                    if (rsp_cfg.LLRPStatus.StatusCode != ENUM_StatusCode.M_Success)
                    {
                        Console.WriteLine(rsp_cfg.LLRPStatus.StatusCode.ToString());
                        reader.Close();
                        return;
                    }
                }
                else if (msg_err != null)
                {
                    Console.WriteLine(msg_err.ToString());
                    reader.Close();
                    return;
                }
                else
                {
                    Console.WriteLine("SET_READER_CONFIG Command Timed out\n");
                    reader.Close();
                    return;
                }
            }
            #endregion

            #region getReaderCapabilities
            {
                Console.WriteLine("Getting Reader Capabilities\n");

                MSG_GET_READER_CAPABILITIES cap = new MSG_GET_READER_CAPABILITIES();
                cap.MSG_ID        = msgID++;
                cap.RequestedData = ENUM_GetReaderCapabilitiesRequestedData.All;

                //Send the custom message and wait for 8 seconds
                MSG_ERROR_MESSAGE msg_err;
                MSG_GET_READER_CAPABILITIES_RESPONSE msg_rsp =
                    reader.GET_READER_CAPABILITIES(cap, out msg_err, 8000);

                if (msg_rsp != null)
                {
                    if (msg_rsp.LLRPStatus.StatusCode != ENUM_StatusCode.M_Success)
                    {
                        Console.WriteLine(msg_rsp.LLRPStatus.StatusCode.ToString());
                        reader.Close();
                        return;
                    }
                }
                else if (msg_err != null)
                {
                    Console.WriteLine(msg_err.ToString());
                    reader.Close();
                    return;
                }
                else
                {
                    Console.WriteLine("GET reader Capabilities Command Timed out\n");
                    reader.Close();
                    return;
                }

                // Get the reader model number since some features are not
                // available on Speedway revolution.
                PARAM_GeneralDeviceCapabilities dev_cap = msg_rsp.GeneralDeviceCapabilities;

                // Check to make sure the model number mathces and that this device
                // is an impinj reader (deviceManufacturerName == 25882)
                if ((dev_cap == null) ||
                    (dev_cap.DeviceManufacturerName != 25882))
                {
                    Console.WriteLine("Could not determine reader model number\n");
                    reader.Close();
                    return;
                }

                // Need to parse version number strings and compare to make sure
                // that the reader version is higher than 4.4.
                Version readerVersion  = new Version(dev_cap.ReaderFirmwareVersion);
                Version minimumVersion = new Version("4.4.0.0");

                if (readerVersion < minimumVersion)
                {
                    Console.WriteLine("Must use Octane 4.4 or later\n");
                    reader.Close();
                    return;
                }
            }
            #endregion

            #region SetReaderConfig
            {
                Console.WriteLine("Adding SET_READER_CONFIG n");

                // Communicate that message to the reader
                MSG_SET_READER_CONFIG msg = new MSG_SET_READER_CONFIG();
                msg.MSG_ID = msgID++;

                msg.ResetToFactoryDefault = false;

                // turn off all reports
                msg.ROReportSpec = new PARAM_ROReportSpec();
                msg.ROReportSpec.TagReportContentSelector = new PARAM_TagReportContentSelector();
                msg.ROReportSpec.TagReportContentSelector.EnableAccessSpecID             = false;
                msg.ROReportSpec.TagReportContentSelector.EnableAntennaID                = false;
                msg.ROReportSpec.TagReportContentSelector.EnableChannelIndex             = false;
                msg.ROReportSpec.TagReportContentSelector.EnableFirstSeenTimestamp       = false;
                msg.ROReportSpec.TagReportContentSelector.EnableInventoryParameterSpecID = false;
                msg.ROReportSpec.TagReportContentSelector.EnableLastSeenTimestamp        = false;
                msg.ROReportSpec.TagReportContentSelector.EnablePeakRSSI     = false;
                msg.ROReportSpec.TagReportContentSelector.EnableROSpecID     = false;
                msg.ROReportSpec.TagReportContentSelector.EnableSpecIndex    = false;
                msg.ROReportSpec.TagReportContentSelector.EnableTagSeenCount = false;

                /* report all tags immediately */
                msg.ROReportSpec.ROReportTrigger = ENUM_ROReportTriggerType.Upon_N_Tags_Or_End_Of_ROSpec;
                msg.ROReportSpec.N = 1;

                /* turn on serialized TID if we are asked to */
                PARAM_ImpinjTagReportContentSelector impinjTagData = new PARAM_ImpinjTagReportContentSelector();
                impinjTagData.ImpinjEnableGPSCoordinates = new PARAM_ImpinjEnableGPSCoordinates();
                impinjTagData.ImpinjEnableGPSCoordinates.GPSCoordinatesMode = ENUM_ImpinjGPSCoordinatesMode.Disabled;
                impinjTagData.ImpinjEnablePeakRSSI = new PARAM_ImpinjEnablePeakRSSI();
                impinjTagData.ImpinjEnablePeakRSSI.PeakRSSIMode           = ENUM_ImpinjPeakRSSIMode.Disabled;
                impinjTagData.ImpinjEnableRFPhaseAngle                    = new PARAM_ImpinjEnableRFPhaseAngle();
                impinjTagData.ImpinjEnableRFPhaseAngle.RFPhaseAngleMode   = ENUM_ImpinjRFPhaseAngleMode.Disabled;
                impinjTagData.ImpinjEnableSerializedTID                   = new PARAM_ImpinjEnableSerializedTID();
                impinjTagData.ImpinjEnableSerializedTID.SerializedTIDMode = m_tid;
                msg.ROReportSpec.Custom.Add(impinjTagData);

                /* report access specs immediately as well */
                msg.AccessReportSpec = new PARAM_AccessReportSpec();
                msg.AccessReportSpec.AccessReportTrigger = ENUM_AccessReportTriggerType.End_Of_AccessSpec;

                // set the antenna configuration for all antennas
                msg.AntennaConfiguration              = new PARAM_AntennaConfiguration[1];
                msg.AntennaConfiguration[0]           = new PARAM_AntennaConfiguration();
                msg.AntennaConfiguration[0].AntennaID = 0; /* all antennas  */

                // use DRM autset mode
                PARAM_C1G2InventoryCommand c1g2Inv = new PARAM_C1G2InventoryCommand();
                c1g2Inv.C1G2RFControl           = new PARAM_C1G2RFControl();
                c1g2Inv.C1G2RFControl.ModeIndex = 1000;
                c1g2Inv.C1G2RFControl.Tari      = 0;

                // Use session 1 so we don't get too many reads
                c1g2Inv.C1G2SingulationControl                = new PARAM_C1G2SingulationControl();
                c1g2Inv.C1G2SingulationControl.Session        = new TwoBits(1);
                c1g2Inv.C1G2SingulationControl.TagPopulation  = 1;
                c1g2Inv.C1G2SingulationControl.TagTransitTime = 0;

                // add to the message
                msg.AntennaConfiguration[0].AirProtocolInventoryCommandSettings.Add(c1g2Inv);

                MSG_ERROR_MESSAGE msg_err;
                MSG_SET_READER_CONFIG_RESPONSE rsp = reader.SET_READER_CONFIG(msg, out msg_err, 12000);
                if (rsp != null)
                {
                    if (rsp.LLRPStatus.StatusCode != ENUM_StatusCode.M_Success)
                    {
                        Console.WriteLine(rsp.LLRPStatus.StatusCode.ToString());
                        reader.Close();
                        return;
                    }
                }
                else if (msg_err != null)
                {
                    Console.WriteLine(msg_err.ToString());
                    reader.Close();
                    return;
                }
                else
                {
                    Console.WriteLine("SET_READER_CONFIG Command Timed out\n");
                    reader.Close();
                    return;
                }
            }
            #endregion

            #region ADDRoSpecWithXML
            {
                Console.WriteLine("Adding RoSpec from XML file \n");

                Org.LLRP.LTK.LLRPV1.DataType.Message obj;
                ENUM_LLRP_MSG_TYPE msg_type;

                // read the XML from a file and validate its an ADD_ROSPEC
                try
                {
                    string filename;
                    filename = @"..\..\addRoSpec.xml";
                    FileStream   fs = new FileStream(filename, FileMode.Open);
                    StreamReader sr = new StreamReader(fs);
                    string       s  = sr.ReadToEnd();
                    fs.Close();

                    LLRPXmlParser.ParseXMLToLLRPMessage(s, out obj, out msg_type);

                    if (obj == null || msg_type != ENUM_LLRP_MSG_TYPE.ADD_ROSPEC)
                    {
                        Console.WriteLine("Could not extract message from XML");
                        reader.Close();
                        return;
                    }
                }
                catch
                {
                    Console.WriteLine("Unable to convert to valid XML");
                    reader.Close();
                    return;
                }

                MSG_ADD_ROSPEC msg = (MSG_ADD_ROSPEC)obj;
                msg.MSG_ID = msgID++;

                // Communicate that message to the reader
                MSG_ERROR_MESSAGE       msg_err;
                MSG_ADD_ROSPEC_RESPONSE rsp = reader.ADD_ROSPEC(msg, out msg_err, 12000);
                if (rsp != null)
                {
                    if (rsp.LLRPStatus.StatusCode != ENUM_StatusCode.M_Success)
                    {
                        Console.WriteLine(rsp.LLRPStatus.StatusCode.ToString());
                        reader.Close();
                        return;
                    }
                }
                else if (msg_err != null)
                {
                    Console.WriteLine(msg_err.ToString());
                    reader.Close();
                    return;
                }
                else
                {
                    Console.WriteLine("ADD_ROSPEC Command Timed out\n");
                    reader.Close();
                    return;
                }
            }
            #endregion

            #region ADDAccessSpec
            {
                /* This section adds a second accessSpec identical to the
                 * first (except for its ID).  This is duplicate code with
                 * the goal of showing an example of how to build LLRP specs
                 * from C# objects rather than XML */
                Console.WriteLine("Adding AccessSpec from C# objects \n");

                // create the target tag filter spec to perform access only on these tags
                // This only requires a single filter (LTK/LLRP supports up to 2 )
                PARAM_C1G2TargetTag[] targetTag = new PARAM_C1G2TargetTag[1];
                targetTag[0]         = new PARAM_C1G2TargetTag();
                targetTag[0].Match   = true;
                targetTag[0].MB      = new TwoBits(1);
                targetTag[0].Pointer = 16;
                targetTag[0].TagData = LLRPBitArray.FromHexString("");
                targetTag[0].TagMask = LLRPBitArray.FromHexString("");

                PARAM_C1G2TagSpec tagSpec = new PARAM_C1G2TagSpec();
                tagSpec.C1G2TargetTag = targetTag;

                PARAM_AccessCommand accessCmd = new PARAM_AccessCommand();
                accessCmd.AirProtocolTagSpec = new UNION_AirProtocolTagSpec();
                accessCmd.AirProtocolTagSpec.Add(tagSpec);

                switch (m_qtmode)
                {
                case 0:
                    PARAM_C1G2Read readStdTID = new PARAM_C1G2Read();
                    readStdTID.AccessPassword = 0;
                    readStdTID.MB             = new TwoBits(2);
                    readStdTID.OpSpecID       = 1;
                    readStdTID.WordCount      = 2;
                    readStdTID.WordPointer    = 0;
                    accessCmd.AccessCommandOpSpec.Add(readStdTID);
                    break;

                case 1:
                    PARAM_C1G2Write writePassword = new PARAM_C1G2Write();
                    writePassword.OpSpecID       = 2;
                    writePassword.MB             = new TwoBits(0);
                    writePassword.AccessPassword = m_password;
                    writePassword.WordPointer    = 2;
                    writePassword.WriteData      = new UInt16Array();
                    writePassword.WriteData.Add((UInt16)((m_newPassword >> 16) & 0x0000ffff));
                    writePassword.WriteData.Add((UInt16)(m_newPassword & 0x0000ffff));
                    accessCmd.AccessCommandOpSpec.Add(writePassword);
                    break;

                case 2:
                    PARAM_C1G2Read readSerializedTID = new PARAM_C1G2Read();
                    readSerializedTID.AccessPassword = 0;
                    readSerializedTID.MB             = new TwoBits(2);
                    readSerializedTID.OpSpecID       = 3;
                    readSerializedTID.WordCount      = 6;
                    readSerializedTID.WordPointer    = 0;
                    accessCmd.AccessCommandOpSpec.Add(readSerializedTID);

                    PARAM_C1G2Read readPublicEPC = new PARAM_C1G2Read();
                    readPublicEPC.AccessPassword = 0;
                    readPublicEPC.MB             = new TwoBits(2);
                    readPublicEPC.OpSpecID       = 4;
                    readPublicEPC.WordCount      = 6;
                    readPublicEPC.WordPointer    = 6;
                    accessCmd.AccessCommandOpSpec.Add(readPublicEPC);

                    PARAM_C1G2Read readUser = new PARAM_C1G2Read();
                    readUser.AccessPassword = 0;
                    readUser.MB             = new TwoBits(3);
                    readUser.OpSpecID       = 5;
                    readUser.WordCount      = 32;
                    readUser.WordPointer    = 0;
                    accessCmd.AccessCommandOpSpec.Add(readUser);
                    break;

                case 3:
                    PARAM_ImpinjGetQTConfig getQT = new PARAM_ImpinjGetQTConfig();
                    getQT.OpSpecID       = 6;
                    getQT.AccessPassword = m_password;
                    accessCmd.AccessCommandOpSpec.Add(getQT);
                    break;

                case 4:
                    PARAM_ImpinjSetQTConfig setQTPrivate = new PARAM_ImpinjSetQTConfig();
                    setQTPrivate.OpSpecID       = 7;
                    setQTPrivate.AccessPassword = m_password;
                    setQTPrivate.Persistence    = ENUM_ImpinjQTPersistence.Permanent;
                    setQTPrivate.DataProfile    = ENUM_ImpinjQTDataProfile.Private;
                    setQTPrivate.AccessRange    = m_shortRange;
                    accessCmd.AccessCommandOpSpec.Add(setQTPrivate);
                    break;

                case 5:
                    PARAM_ImpinjSetQTConfig setQTPublic = new PARAM_ImpinjSetQTConfig();
                    setQTPublic.OpSpecID       = 8;
                    setQTPublic.AccessPassword = m_password;
                    setQTPublic.Persistence    = ENUM_ImpinjQTPersistence.Permanent;
                    setQTPublic.DataProfile    = ENUM_ImpinjQTDataProfile.Public;
                    setQTPublic.AccessRange    = m_shortRange;
                    accessCmd.AccessCommandOpSpec.Add(setQTPublic);
                    break;

                case 6:
                    PARAM_ImpinjSetQTConfig setQTPeek = new PARAM_ImpinjSetQTConfig();
                    setQTPeek.OpSpecID       = 9;
                    setQTPeek.AccessPassword = m_password;
                    setQTPeek.Persistence    = ENUM_ImpinjQTPersistence.Temporary;
                    setQTPeek.DataProfile    = ENUM_ImpinjQTDataProfile.Private;
                    setQTPeek.AccessRange    = ENUM_ImpinjQTAccessRange.Normal_Range;
                    accessCmd.AccessCommandOpSpec.Add(setQTPeek);

                    PARAM_C1G2Read readSerializedTIDPeek = new PARAM_C1G2Read();
                    readSerializedTIDPeek.AccessPassword = 0;
                    readSerializedTIDPeek.MB             = new TwoBits(2);
                    readSerializedTIDPeek.OpSpecID       = 10;
                    readSerializedTIDPeek.WordCount      = 6;
                    readSerializedTIDPeek.WordPointer    = 0;
                    accessCmd.AccessCommandOpSpec.Add(readSerializedTIDPeek);

                    PARAM_C1G2Read readPrivateEPC = new PARAM_C1G2Read();
                    readPrivateEPC.AccessPassword = 0;
                    readPrivateEPC.MB             = new TwoBits(1);
                    readPrivateEPC.OpSpecID       = 11;
                    readPrivateEPC.WordCount      = 8;
                    readPrivateEPC.WordPointer    = 2;
                    accessCmd.AccessCommandOpSpec.Add(readPrivateEPC);

                    PARAM_C1G2Read readUserPeek = new PARAM_C1G2Read();
                    readUserPeek.AccessPassword = 0;
                    readUserPeek.MB             = new TwoBits(3);
                    readUserPeek.OpSpecID       = 12;
                    readUserPeek.WordCount      = 32;
                    readUserPeek.WordPointer    = 0;
                    accessCmd.AccessCommandOpSpec.Add(readUserPeek);
                    break;

                case 7:
                    PARAM_C1G2Write writeUser = new PARAM_C1G2Write();
                    writeUser.AccessPassword = m_password;
                    writeUser.OpSpecID       = 13;
                    writeUser.WordPointer    = 0;
                    writeUser.MB             = new TwoBits(3);

                    writeUser.WriteData = new UInt16Array();
                    for (int x = 0; x < 32; x++)
                    {
                        writeUser.WriteData.Add((UInt16)m_random.Next(65536));
                    }

                    accessCmd.AccessCommandOpSpec.Add(writeUser);
                    break;

                case 8:
                    PARAM_C1G2Write writePubEPC = new PARAM_C1G2Write();
                    writePubEPC.AccessPassword = m_password;
                    writePubEPC.MB             = new TwoBits(2);
                    writePubEPC.OpSpecID       = 14;
                    writePubEPC.WordPointer    = 6;

                    writePubEPC.WriteData = new UInt16Array();
                    for (int x = 0; x < 6; x++)
                    {
                        writePubEPC.WriteData.Add((UInt16)m_random.Next(65536));
                    }

                    accessCmd.AccessCommandOpSpec.Add(writePubEPC);
                    break;

                case 9:
                    PARAM_C1G2Read readRsvd = new PARAM_C1G2Read();
                    readRsvd.AccessPassword = m_password;
                    readRsvd.MB             = new TwoBits(0);
                    readRsvd.OpSpecID       = 15;
                    readRsvd.WordCount      = 4;
                    readRsvd.WordPointer    = 0;
                    accessCmd.AccessCommandOpSpec.Add(readRsvd);
                    break;
                }

                // create the stop trigger for the Access Spec
                PARAM_AccessSpecStopTrigger stop = new PARAM_AccessSpecStopTrigger();
                stop.AccessSpecStopTrigger = ENUM_AccessSpecStopTriggerType.Null;
                stop.OperationCountValue   = 0;

                // Create and set up the basic accessSpec
                PARAM_AccessSpec accessSpec = new PARAM_AccessSpec();
                accessSpec.AccessSpecID = 24;
                accessSpec.AntennaID    = 0;
                accessSpec.ROSpecID     = 0;
                accessSpec.CurrentState = ENUM_AccessSpecState.Disabled;
                accessSpec.ProtocolID   = ENUM_AirProtocols.EPCGlobalClass1Gen2;

                // add the access command and stop trigger to the accessSpec
                accessSpec.AccessCommand         = accessCmd;
                accessSpec.AccessSpecStopTrigger = stop;

                // Add the Access Spec to the ADD_ACCESSSPEC message
                MSG_ADD_ACCESSSPEC addAccess = new MSG_ADD_ACCESSSPEC();
                addAccess.MSG_ID     = msgID++;
                addAccess.AccessSpec = accessSpec;

                // communicate the message to the reader
                MSG_ERROR_MESSAGE           msg_err;
                MSG_ADD_ACCESSSPEC_RESPONSE rsp = reader.ADD_ACCESSSPEC(addAccess, out msg_err, 12000);
                if (rsp != null)
                {
                    if (rsp.LLRPStatus.StatusCode != ENUM_StatusCode.M_Success)
                    {
                        Console.WriteLine(rsp.LLRPStatus.StatusCode.ToString());
                        reader.Close();
                        return;
                    }
                }
                else if (msg_err != null)
                {
                    Console.WriteLine(msg_err.ToString());
                    reader.Close();
                    return;
                }
                else
                {
                    Console.WriteLine("ADD_ACCESSSPEC Command Timed out\n");
                    reader.Close();
                    return;
                }
            }
            #endregion

            #region EnableAccessSpec
            {
                Console.WriteLine("Enabling AccessSpec\n");
                MSG_ENABLE_ACCESSSPEC msg = new MSG_ENABLE_ACCESSSPEC();
                msg.MSG_ID = msgID++;

                MSG_ERROR_MESSAGE msg_err;
                msg.AccessSpecID = 24; // this better match the ACCESSSPEC we created above
                MSG_ENABLE_ACCESSSPEC_RESPONSE rsp = reader.ENABLE_ACCESSSPEC(msg, out msg_err, 12000);
                if (rsp != null)
                {
                    if (rsp.LLRPStatus.StatusCode != ENUM_StatusCode.M_Success)
                    {
                        Console.WriteLine(rsp.LLRPStatus.StatusCode.ToString());
                        reader.Close();
                        return;
                    }
                }
                else if (msg_err != null)
                {
                    Console.WriteLine(msg_err.ToString());
                    reader.Close();
                    return;
                }
                else
                {
                    Console.WriteLine("ENABLE_ACCESSSPEC Command Timed out\n");
                    reader.Close();
                    return;
                }
            }
            #endregion

            #region EnableRoSpec
            {
                Console.WriteLine("Enabling RoSpec\n");
                MSG_ENABLE_ROSPEC msg = new MSG_ENABLE_ROSPEC();
                msg.MSG_ID = msgID++;
                MSG_ERROR_MESSAGE msg_err;
                msg.ROSpecID = 1111; // this better match the ROSpec we created above
                MSG_ENABLE_ROSPEC_RESPONSE rsp = reader.ENABLE_ROSPEC(msg, out msg_err, 12000);
                if (rsp != null)
                {
                    if (rsp.LLRPStatus.StatusCode != ENUM_StatusCode.M_Success)
                    {
                        Console.WriteLine(rsp.LLRPStatus.StatusCode.ToString());
                        reader.Close();
                        return;
                    }
                }
                else if (msg_err != null)
                {
                    Console.WriteLine(msg_err.ToString());
                    reader.Close();
                    return;
                }
                else
                {
                    Console.WriteLine("ENABLE_ROSPEC Command Timed out\n");
                    reader.Close();
                    return;
                }
            }
            #endregion

            #region StartRoSpec
            {
                Console.WriteLine("Starting RoSpec\n");
                MSG_START_ROSPEC msg = new MSG_START_ROSPEC();
                msg.MSG_ID = msgID++;

                MSG_ERROR_MESSAGE msg_err;
                msg.ROSpecID = 1111; // this better match the RoSpec we created above
                MSG_START_ROSPEC_RESPONSE rsp = reader.START_ROSPEC(msg, out msg_err, 12000);
                if (rsp != null)
                {
                    if (rsp.LLRPStatus.StatusCode != ENUM_StatusCode.M_Success)
                    {
                        Console.WriteLine(rsp.LLRPStatus.StatusCode.ToString());
                        reader.Close();
                        return;
                    }
                }
                else if (msg_err != null)
                {
                    Console.WriteLine(msg_err.ToString());
                    reader.Close();
                    return;
                }
                else
                {
                    Console.WriteLine("START_ROSPEC Command Timed out\n");
                    reader.Close();
                    return;
                }
            }
            #endregion

            // this should be plenty long enough to do these commands
            Thread.Sleep(3000);

            #region StopRoSpec
            {
                Console.WriteLine("Stopping RoSpec\n");
                MSG_STOP_ROSPEC   msg = new MSG_STOP_ROSPEC();
                MSG_ERROR_MESSAGE msg_err;
                msg.ROSpecID = 1111; // this better match the RoSpec we created above
                MSG_STOP_ROSPEC_RESPONSE rsp = reader.STOP_ROSPEC(msg, out msg_err, 12000);
                if (rsp != null)
                {
                    if (rsp.LLRPStatus.StatusCode != ENUM_StatusCode.M_Success)
                    {
                        Console.WriteLine(rsp.LLRPStatus.StatusCode.ToString());
                        reader.Close();
                        return;
                    }
                }
                else if (msg_err != null)
                {
                    Console.WriteLine(msg_err.ToString());
                    reader.Close();
                    return;
                }
                else
                {
                    Console.WriteLine("STOP_ROSPEC Command Timed out\n");
                    reader.Close();
                    return;
                }
            }
            #endregion

            #region Clean Up Reader Configuration
            {
                Console.WriteLine("Factory Default the Reader\n");

                // factory default the reader
                MSG_SET_READER_CONFIG msg_cfg = new MSG_SET_READER_CONFIG();
                MSG_ERROR_MESSAGE     msg_err;

                msg_cfg.ResetToFactoryDefault = true;
                msg_cfg.MSG_ID = msgID++;; // note this doesn't need to bet set as the library will default

                // Note that if SET_READER_CONFIG affects antennas it could take several seconds to return
                MSG_SET_READER_CONFIG_RESPONSE rsp_cfg = reader.SET_READER_CONFIG(msg_cfg, out msg_err, 12000);

                if (rsp_cfg != null)
                {
                    if (rsp_cfg.LLRPStatus.StatusCode != ENUM_StatusCode.M_Success)
                    {
                        Console.WriteLine(rsp_cfg.LLRPStatus.StatusCode.ToString());
                        reader.Close();
                        return;
                    }
                }
                else if (msg_err != null)
                {
                    Console.WriteLine(msg_err.ToString());
                    reader.Close();
                    return;
                }
                else
                {
                    Console.WriteLine("SET_READER_CONFIG Command Timed out\n");
                    reader.Close();
                    return;
                }
            }

            #endregion

            Console.WriteLine("  Received " + opSpecCount + " OpSpec Results.");
            Console.WriteLine("  Received " + reportCount + " Tag Reports.");
            Console.WriteLine("  Received " + eventCount + " Events.");
            Console.WriteLine("Closing\n");
            // clean up the reader
            reader.Close();
            reader.OnReaderEventNotification -= new delegateReaderEventNotification(reader_OnReaderEventNotification);
            reader.OnRoAccessReportReceived  -= new delegateRoAccessReport(reader_OnRoAccessReportReceived);
        }
Beispiel #6
0
        public static PARAM_C1G2InventoryCommand CreateInventoryCommand(ushort pos, String mask, int truncate, int MB)
        {
            // Create the Inventory Command and RF Control parameters
            PARAM_C1G2InventoryCommand c1g2Inv = new PARAM_C1G2InventoryCommand();


            // Setup the tag filter
            c1g2Inv.C1G2Filter = new PARAM_C1G2Filter[1];

            c1g2Inv.C1G2Filter[0] = new PARAM_C1G2Filter();
            c1g2Inv.C1G2Filter[0].C1G2TagInventoryMask = new PARAM_C1G2TagInventoryMask();
            // Filter on EPC (memory bank #1)
            c1g2Inv.C1G2Filter[0].C1G2TagInventoryMask.MB = new TwoBits((ushort)MB);
            // Start filtering at the address 0x20 (the start of the third word).
            // The first two words of the EPC are the checksum and Protocol Control bits.
            //E20030093116008216007210
            //c1g2Inv.C1G2Filter[0].C1G2TagInventoryMask.Pointer = (ushort)(0x20 + 4 * pos);

            //c1g2Inv.C1G2Filter[0].C1G2TagInventoryMask.Pointer = (ushort)(0x00 + 4 * pos);
            //c1g2Inv.C1G2Filter[0].C1G2TagInventoryMask.TagMask = LLRPBitArray.FromHexString(mask);

            c1g2Inv.C1G2Filter[0].C1G2TagInventoryMask.Pointer = (ushort)(0x20 + pos);
            c1g2Inv.C1G2Filter[0].C1G2TagInventoryMask.TagMask = LLRPBitArray.FromBinString(mask);
            c1g2Inv.C1G2Filter[0].T        = (ENUM_C1G2TruncateAction)truncate;
            c1g2Inv.TagInventoryStateAware = false;
            c1g2Inv.C1G2Filter[0].C1G2TagInventoryStateAwareFilterAction        = new PARAM_C1G2TagInventoryStateAwareFilterAction();
            c1g2Inv.C1G2Filter[0].C1G2TagInventoryStateAwareFilterAction.Action = ENUM_C1G2StateAwareAction.DeassertSLOrB_AssertSLOrA;
            c1g2Inv.C1G2Filter[0].C1G2TagInventoryStateAwareFilterAction.Target = ENUM_C1G2StateAwareTarget.SL;



            /* c1g2Inv.C1G2Filter[1] = new PARAM_C1G2Filter();
             * c1g2Inv.C1G2Filter[1].C1G2TagInventoryMask = new PARAM_C1G2TagInventoryMask();
             * // Filter on EPC (memory bank #1)
             * c1g2Inv.C1G2Filter[1].C1G2TagInventoryMask.MB = new TwoBits(1);
             * // Start filtering at the address 0x20 (the start of the third word).
             * // The first two words of the EPC are the checksum and Protocol Control bits.
             * //E20030093116008216007210
             * c1g2Inv.C1G2Filter[1].C1G2TagInventoryMask.Pointer = (ushort)(0x20 + 4 * 0);
             * c1g2Inv.C1G2Filter[1].C1G2TagInventoryMask.TagMask = LLRPBitArray.FromHexString("D");
             * c1g2Inv.C1G2Filter[1].T = (ENUM_C1G2TruncateAction)truncate;
             * c1g2Inv.TagInventoryStateAware = true;
             * //c1g2Inv.C1G2Filter[1].C1G2TagInventoryStateAwareFilterAction = new PARAM_C1G2TagInventoryStateAwareFilterAction();
             * //c1g2Inv.C1G2Filter[1].C1G2TagInventoryStateAwareFilterAction.Action = ENUM_C1G2StateAwareAction.DeassertSLOrB_AssertSLOrA;
             * //c1g2Inv.C1G2Filter[1].C1G2TagInventoryStateAwareFilterAction.Target = ENUM_C1G2StateAwareTarget.SL;
             */
            // Set the session.
            PARAM_C1G2SingulationControl c1g2Sing = new PARAM_C1G2SingulationControl();

            c1g2Sing.Session        = new TwoBits(1);
            c1g2Sing.TagPopulation  = 64;
            c1g2Sing.TagTransitTime = 0;
            c1g2Sing.C1G2TagInventoryStateAwareSingulationAction = new PARAM_C1G2TagInventoryStateAwareSingulationAction();
            //c1g2Sing.C1G2TagInventoryStateAwareSingulationAction.I = ENUM_C1G2TagInventoryStateAwareI.State_A;
            //c1g2Sing.C1G2TagInventoryStateAwareSingulationAction.S = ENUM_C1G2TagInventoryStateAwareS.SL;

            c1g2Inv.C1G2SingulationControl = c1g2Sing;


            // Set the search mode.
            PARAM_ImpinjInventorySearchMode impISM = new PARAM_ImpinjInventorySearchMode();

            impISM.InventorySearchMode = ENUM_ImpinjInventorySearchType.Dual_Target;
            c1g2Inv.Custom.Add(impISM);
            return(c1g2Inv);
        }
Beispiel #7
0
        public void ADDRoSpec()
        {
            Console.WriteLine("Adding RoSpec\n");

            // set up the basic parameters in the ROSpec. Use all the defaults from the reader
            MSG_ADD_ROSPEC    msg = new MSG_ADD_ROSPEC();
            MSG_ERROR_MESSAGE msg_err;

            msg.ROSpec = new PARAM_ROSpec();
            msg.ROSpec.CurrentState = ENUM_ROSpecState.Disabled;
            msg.ROSpec.Priority     = 0x00;
            msg.ROSpec.ROSpecID     = 1111;

            // setup the start and stop triggers in the Boundary Spec
            msg.ROSpec.ROBoundarySpec = new PARAM_ROBoundarySpec();
            msg.ROSpec.ROBoundarySpec.ROSpecStartTrigger = new PARAM_ROSpecStartTrigger();
            msg.ROSpec.ROBoundarySpec.ROSpecStartTrigger.ROSpecStartTriggerType = ENUM_ROSpecStartTriggerType.Null;

            msg.ROSpec.ROBoundarySpec.ROSpecStopTrigger = new PARAM_ROSpecStopTrigger();
            msg.ROSpec.ROBoundarySpec.ROSpecStopTrigger.ROSpecStopTriggerType = ENUM_ROSpecStopTriggerType.Null;
            msg.ROSpec.ROBoundarySpec.ROSpecStopTrigger.DurationTriggerValue  = 0; // ignored by reader

            // Add a single Antenna Inventory to the ROSpec
            msg.ROSpec.SpecParameter = new UNION_SpecParameter();
            PARAM_AISpec aiSpec = new PARAM_AISpec();

            aiSpec.AntennaIDs = new UInt16Array();
            aiSpec.AntennaIDs.Add(1);
            aiSpec.AntennaIDs.Add(2);
            aiSpec.AISpecStopTrigger = new PARAM_AISpecStopTrigger();
            aiSpec.AISpecStopTrigger.AISpecStopTriggerType = ENUM_AISpecStopTriggerType.Null;

            // use all the defaults from the reader.  Just specify the minimum required
            aiSpec.InventoryParameterSpec    = new PARAM_InventoryParameterSpec[1];
            aiSpec.InventoryParameterSpec[0] = new PARAM_InventoryParameterSpec();
            aiSpec.InventoryParameterSpec[0].InventoryParameterSpecID = 1234;
            aiSpec.InventoryParameterSpec[0].ProtocolID                            = ENUM_AirProtocols.EPCGlobalClass1Gen2;
            aiSpec.InventoryParameterSpec[0].AntennaConfiguration                  = new PARAM_AntennaConfiguration[1];
            aiSpec.InventoryParameterSpec[0].AntennaConfiguration[0]               = new PARAM_AntennaConfiguration();
            aiSpec.InventoryParameterSpec[0].AntennaConfiguration[0].AntennaID     = 0;
            aiSpec.InventoryParameterSpec[0].AntennaConfiguration[0].RFTransmitter = new PARAM_RFTransmitter();
            aiSpec.InventoryParameterSpec[0].AntennaConfiguration[0].RFTransmitter.ChannelIndex  = 1;
            aiSpec.InventoryParameterSpec[0].AntennaConfiguration[0].RFTransmitter.TransmitPower = 91;
            // Add the inventory command to the AI spec.
            PARAM_C1G2InventoryCommand c1g2Inv = CreateInventoryCommand();

            aiSpec.InventoryParameterSpec[0].AntennaConfiguration[0].AirProtocolInventoryCommandSettings.Add(c1g2Inv);
            msg.ROSpec.SpecParameter.Add(aiSpec);

            MSG_ADD_ROSPEC_RESPONSE rsp = reader.ADD_ROSPEC(msg, out msg_err, 12000);

            if (rsp != null)
            {
                if (rsp.LLRPStatus.StatusCode != ENUM_StatusCode.M_Success)
                {
                    Console.WriteLine(rsp.LLRPStatus.StatusCode.ToString());
                    reader.Close();
                    return;
                }
            }
            else if (msg_err != null)
            {
                Console.WriteLine(msg_err.ToString());
                reader.Close();
                return;
            }
            else
            {
                Console.WriteLine("ADD_ROSPEC Command Timed out\n");
                reader.Close();
                return;
            }
        }
Beispiel #8
0
        private void Set_Reader_Config()
        {
            try
            {
                MSG_SET_READER_CONFIG msg = new MSG_SET_READER_CONFIG();

                msg.AccessReportSpec = new PARAM_AccessReportSpec();
                msg.AccessReportSpec.AccessReportTrigger = ENUM_AccessReportTriggerType.End_Of_AccessSpec;

                PARAM_C1G2InventoryCommand cmd = new PARAM_C1G2InventoryCommand();
                cmd.C1G2RFControl = new PARAM_C1G2RFControl();

                cmd.C1G2RFControl.ModeIndex = 1000;

                // 1000 = AD - Auto Dense Interrogator
                // 1001 = AS - Auto Single Interrogator
                //    0 = 0 - High Speed 640k bps
                //    1 = 1 - Hybrid 80k/160k bps
                //    2 = 2 - Dense Reader M=4 HiSpd
                //    3 = 3 - Dense Reader M=8 LoSpd
                //    4 = 4 - Dense Reader MaxMiller
                cmd.C1G2RFControl.Tari = 0;
                cmd.C1G2SingulationControl = new PARAM_C1G2SingulationControl();
                cmd.C1G2SingulationControl.Session = new TwoBits(1);
                cmd.C1G2SingulationControl.TagPopulation = 32;

                cmd.C1G2SingulationControl.Session.Equals(1);

                cmd.C1G2SingulationControl.TagTransitTime = 0;
                cmd.TagInventoryStateAware = false;
                PARAM_ImpinjInventorySearchMode search_mode = new PARAM_ImpinjInventorySearchMode();

                search_mode.InventorySearchMode = ENUM_ImpinjInventorySearchType.Dual_Target;

                //search_mode.InventorySearchMode = ENUM_ImpinjInventorySearchType.Dual_Target;
                cmd.AddCustomParameter(search_mode);

                //msg.AntennaConfiguration[0].AntennaID = 0;  // 0 = all 4 antennas

                //msg.AntennaConfiguration = new PARAM_AntennaConfiguration[1];
                /*
                if (cbAnt1.Checked == true)
                {
                    msg.AntennaConfiguration[0].AntennaID = 1;
                }

                if (cbAnt2.Checked == true)
                {
                    msg.AntennaConfiguration[0].AntennaID = 2;
                }

                if (cbAnt3.Checked == true)
                {
                    msg.AntennaConfiguration[0].AntennaID = 3;
                }

                if (cbAnt4.Checked == true)
                {
                    msg.AntennaConfiguration[0].AntennaID = 4;
                }
               */
                msg.AntennaConfiguration = new PARAM_AntennaConfiguration[0];
                msg.AntennaConfiguration[0].AntennaID = 0;
                //
                msg.AntennaConfiguration[0] = new PARAM_AntennaConfiguration();
                msg.AntennaConfiguration[0].AirProtocolInventoryCommandSettings = new UNION_AirProtocolInventoryCommandSettings();
                //msg.AntennaConfiguration[0] = new PARAM_AntennaConfiguration();

                msg.AntennaConfiguration[0].AirProtocolInventoryCommandSettings = new UNION_AirProtocolInventoryCommandSettings();
                msg.AntennaConfiguration[0].AirProtocolInventoryCommandSettings.Add(cmd);
                msg.AntennaConfiguration[0].RFReceiver = new PARAM_RFReceiver();
                msg.AntennaConfiguration[0].RFReceiver.ReceiverSensitivity = 1;// (ushort)tbReaderSensitivity.Value;
                // 1 = max, 2 = -70, 3 = -69, 4 = -68, 5 = -67...
                msg.AntennaConfiguration[0].RFTransmitter = new PARAM_RFTransmitter();
                msg.AntennaConfiguration[0].RFTransmitter.ChannelIndex = 1;
                msg.AntennaConfiguration[0].RFTransmitter.HopTableID = 1;
                msg.AntennaConfiguration[0].RFTransmitter.TransmitPower = 30;//(ushort)tbTxPower.Value;

                //###########################################################################################
                //###########################################################################################
                //###########################################################################################
                // made change so Matho could test channel index values for Japanese readers
                //ushort i;
                //i = ushort.Parse(tbChannelIndex.Text);
                //msg.AntennaConfiguration[0].RFTransmitter.ChannelIndex = i;
                //MessageBox.Show("Channel Index = " + i.ToString());
                // made change so Matho could test channel index values for Japanese readers
                //###########################################################################################
                //###########################################################################################
                //###########################################################################################

                //////if you want to set antenana property. un-comment following code. Impinj reader does not support
                //msg.AntennaProperties = new PARAM_AntennaProperties[1];
                //msg.AntennaProperties[0] = new PARAM_AntennaProperties();
                //msg.AntennaProperties[0].AntennaConnected = true;
                //msg.AntennaProperties[0].AntennaGain = 0;
                //msg.AntennaProperties[0].AntennaID = 0;
                //////If you want to enable fixed frequency feature. un-comment following code.
                //PARAM_ImpinjFixedFrequencyList fix_list = new PARAM_ImpinjFixedFrequencyList();
                //fix_list.FixedFrequencyMode = ENUM_FixedFrequencyMode.Disabled;
                //cmd.AddCustomParameter(fix_list);
                //////If you want to enable reduced power list, un-comment following code and add channels
                //PARAM_ImpinjReducedPowerFrequencyList power_list = new PARAM_ImpinjReducedPowerFrequencyList();
                //power_list.ReducedPowerMode = ENUM_ImpinjReducedPowerMode.Enabled;
                //power_list.ChannelList.Add(chanellist);
                //cmd.AddCustomParameter(power_list);
                //////If you want to enable low duty cycle, un-comment following code
                //PARAM_ImpinjLowDutyCycle lowDuty = new PARAM_ImpinjLowDutyCycle();
                //lowDuty.LowDutyCycleMode =  ENUM_ImpinjLowDutyCycleMode.Disabled;
                //lowDuty.EmptyFieldTimeout = 0;
                //lowDuty.FieldPingInterval = 0;
                //cmd.AddCustomParameter(lowDuty);
                //////If you want to select reader events to send to application, change the following code
                //msg.EventsAndReports = new PARAM_EventsAndReports();
                //msg.EventsAndReports.HoldEventsAndReportsUponReconnect = false;
                //msg.KeepaliveSpec = new PARAM_KeepaliveSpec();
                //msg.KeepaliveSpec.KeepaliveTriggerType = ENUM_KeepaliveTriggerType.Null;
                //msg.KeepaliveSpec.PeriodicTriggerValue = 0;
                msg.ReaderEventNotificationSpec = new PARAM_ReaderEventNotificationSpec();
                msg.ReaderEventNotificationSpec.EventNotificationState = new PARAM_EventNotificationState[7];
                msg.ReaderEventNotificationSpec.EventNotificationState[0] = new PARAM_EventNotificationState();
                msg.ReaderEventNotificationSpec.EventNotificationState[0].EventType = ENUM_NotificationEventType.AISpec_Event;
                msg.ReaderEventNotificationSpec.EventNotificationState[0].NotificationState = false;

                msg.ReaderEventNotificationSpec.EventNotificationState[1] = new PARAM_EventNotificationState();
                msg.ReaderEventNotificationSpec.EventNotificationState[1].EventType = ENUM_NotificationEventType.Antenna_Event;
                msg.ReaderEventNotificationSpec.EventNotificationState[1].NotificationState = false;

                msg.ReaderEventNotificationSpec.EventNotificationState[2] = new PARAM_EventNotificationState();
                msg.ReaderEventNotificationSpec.EventNotificationState[2].EventType = ENUM_NotificationEventType.GPI_Event;
                msg.ReaderEventNotificationSpec.EventNotificationState[2].NotificationState = false;

                msg.ReaderEventNotificationSpec.EventNotificationState[3] = new PARAM_EventNotificationState();
                msg.ReaderEventNotificationSpec.EventNotificationState[3].EventType = ENUM_NotificationEventType.Reader_Exception_Event;
                msg.ReaderEventNotificationSpec.EventNotificationState[3].NotificationState = false;

                msg.ReaderEventNotificationSpec.EventNotificationState[4] = new PARAM_EventNotificationState();
                msg.ReaderEventNotificationSpec.EventNotificationState[4].EventType = ENUM_NotificationEventType.Upon_Hopping_To_Next_Channel;
                msg.ReaderEventNotificationSpec.EventNotificationState[4].NotificationState = false;

                msg.ReaderEventNotificationSpec.EventNotificationState[5] = new PARAM_EventNotificationState();
                msg.ReaderEventNotificationSpec.EventNotificationState[5].EventType = ENUM_NotificationEventType.ROSpec_Event;
                msg.ReaderEventNotificationSpec.EventNotificationState[5].NotificationState = false;

                msg.ReaderEventNotificationSpec.EventNotificationState[6] = new PARAM_EventNotificationState();
                msg.ReaderEventNotificationSpec.EventNotificationState[6].EventType = ENUM_NotificationEventType.Report_Buffer_Fill_Warning;
                msg.ReaderEventNotificationSpec.EventNotificationState[6].NotificationState = false;

                msg.ROReportSpec = new PARAM_ROReportSpec();
                msg.ROReportSpec.N = 1;
                msg.ROReportSpec.ROReportTrigger = ENUM_ROReportTriggerType.Upon_N_Tags_Or_End_Of_ROSpec;

                msg.ROReportSpec.TagReportContentSelector = new PARAM_TagReportContentSelector();

                msg.ROReportSpec.TagReportContentSelector.AirProtocolEPCMemorySelector = new UNION_AirProtocolEPCMemorySelector();
                PARAM_C1G2EPCMemorySelector c1g2mem = new PARAM_C1G2EPCMemorySelector();
                c1g2mem.EnableCRC = false;
                c1g2mem.EnablePCBits = false;
                msg.ROReportSpec.TagReportContentSelector.AirProtocolEPCMemorySelector.Add(c1g2mem);

                msg.ROReportSpec.TagReportContentSelector.EnableAccessSpecID = false;
                msg.ROReportSpec.TagReportContentSelector.EnableAntennaID = false;
                msg.ROReportSpec.TagReportContentSelector.EnableChannelIndex = false;
                msg.ROReportSpec.TagReportContentSelector.EnableFirstSeenTimestamp = true;
                msg.ROReportSpec.TagReportContentSelector.EnableInventoryParameterSpecID = false;
                msg.ROReportSpec.TagReportContentSelector.EnableLastSeenTimestamp = false;
                msg.ROReportSpec.TagReportContentSelector.EnablePeakRSSI = true;
                msg.ROReportSpec.TagReportContentSelector.EnableROSpecID = false;
                msg.ROReportSpec.TagReportContentSelector.EnableSpecIndex = false;
                msg.ROReportSpec.TagReportContentSelector.EnableTagSeenCount = false;

                /////If you want to enable GPIO function, un-comment following code.

                //msg.GPIPortCurrentState = new PARAM_GPIPortCurrentState[1];
                //msg.GPIPortCurrentState[0] = new PARAM_GPIPortCurrentState();
                //msg.GPIPortCurrentState[0].Config = true;
                //msg.GPIPortCurrentState[0].GPIPortNum = 2;
                //msg.GPIPortCurrentState[0].State = ENUM_GPIPortState.Low;

                //msg.GPOWriteData = new PARAM_GPOWriteData[1];
                //msg.GPOWriteData[0] = new PARAM_GPOWriteData();
                //msg.GPOWriteData[0].GPOData = true;
                //msg.GPOWriteData[0].GPOPortNumber = 1;

                //////If you want to use tag direction function, un-comment following code

                //PARAM_ImpinjTagDirectionReporting imp_tag_reporting = new PARAM_ImpinjTagDirectionReporting();

                //imp_tag_reporting.AntennaConfiguration = ENUM_ImpinjTagDirectionAntennaConfiguration.Dual_Antenna;
                //imp_tag_reporting.EnableTagDirection = true;
                //msg.ROReportSpec.AddCustomParameter(imp_tag_reporting);

                /////If you want to set sub-region, un-comment following code

                //PARAM_ImpinjSubRegulatoryRegion sub_region = new PARAM_ImpinjSubRegulatoryRegion();
                //sub_region.RegulatoryRegion = ENUM_ImpinjRegulatoryRegion.FCC_Part_15_247;
                //msg.AddCustomParameter(sub_region);

                //msg.ResetToFactoryDefault = false;

                MSG_SET_READER_CONFIG_RESPONSE rsp = reader.SET_READER_CONFIG(msg, out msg_err, 2121);

            }
            catch (Exception ex)
            {
                //MessageBox.Show(ex.ToString());
            }
        }
Beispiel #9
0
        private void Set_Reader_Config()
        {
            MSG_SET_READER_CONFIG msg = new MSG_SET_READER_CONFIG();

            msg.AccessReportSpec = new PARAM_AccessReportSpec();
            msg.AccessReportSpec.AccessReportTrigger = ENUM_AccessReportTriggerType.End_Of_AccessSpec;

            msg.AntennaConfiguration    = new PARAM_AntennaConfiguration[1];
            msg.AntennaConfiguration[0] = new PARAM_AntennaConfiguration();
            msg.AntennaConfiguration[0].AirProtocolInventoryCommandSettings = new UNION_AirProtocolInventoryCommandSettings();

            PARAM_C1G2InventoryCommand cmd = new PARAM_C1G2InventoryCommand();

            cmd.C1G2RFControl                         = new PARAM_C1G2RFControl();
            cmd.C1G2RFControl.ModeIndex               = 2;
            cmd.C1G2RFControl.Tari                    = 0;
            cmd.C1G2SingulationControl                = new PARAM_C1G2SingulationControl();
            cmd.C1G2SingulationControl.Session        = new LTKD.TwoBits(1);
            cmd.C1G2SingulationControl.TagPopulation  = 0;
            cmd.C1G2SingulationControl.TagTransitTime = 1000;
            cmd.TagInventoryStateAware                = false;

            msg.AntennaConfiguration[0].AirProtocolInventoryCommandSettings.Add(cmd);
            msg.AntennaConfiguration[0].AntennaID = 0;


            msg.AntennaConfiguration[0].RFReceiver = new PARAM_RFReceiver();
            msg.AntennaConfiguration[0].RFReceiver.ReceiverSensitivity = 12;

            msg.AntennaConfiguration[0].RFTransmitter = new PARAM_RFTransmitter();
            msg.AntennaConfiguration[0].RFTransmitter.ChannelIndex  = 1;
            msg.AntennaConfiguration[0].RFTransmitter.HopTableID    = 1;
            msg.AntennaConfiguration[0].RFTransmitter.TransmitPower = 61;

            //msg.AntennaProperties = new PARAM_AntennaProperties[1];
            //msg.AntennaProperties[0] = new PARAM_AntennaProperties();
            //msg.AntennaProperties[0].AntennaConnected = true;
            //msg.AntennaProperties[0].AntennaGain = 0;
            //msg.AntennaProperties[0].AntennaID = 1;

            msg.EventsAndReports = new PARAM_EventsAndReports();
            msg.EventsAndReports.HoldEventsAndReportsUponReconnect = false;

            msg.KeepaliveSpec = new PARAM_KeepaliveSpec();
            msg.KeepaliveSpec.KeepaliveTriggerType = ENUM_KeepaliveTriggerType.Null;
            msg.KeepaliveSpec.PeriodicTriggerValue = 0;

            msg.ReaderEventNotificationSpec = new PARAM_ReaderEventNotificationSpec();
            msg.ReaderEventNotificationSpec.EventNotificationState                      = new PARAM_EventNotificationState[5];
            msg.ReaderEventNotificationSpec.EventNotificationState[0]                   = new PARAM_EventNotificationState();
            msg.ReaderEventNotificationSpec.EventNotificationState[0].EventType         = ENUM_NotificationEventType.AISpec_Event;
            msg.ReaderEventNotificationSpec.EventNotificationState[0].NotificationState = true;

            msg.ReaderEventNotificationSpec.EventNotificationState[1]                   = new PARAM_EventNotificationState();
            msg.ReaderEventNotificationSpec.EventNotificationState[1].EventType         = ENUM_NotificationEventType.Antenna_Event;
            msg.ReaderEventNotificationSpec.EventNotificationState[1].NotificationState = true;

            msg.ReaderEventNotificationSpec.EventNotificationState[2]                   = new PARAM_EventNotificationState();
            msg.ReaderEventNotificationSpec.EventNotificationState[2].EventType         = ENUM_NotificationEventType.GPI_Event;
            msg.ReaderEventNotificationSpec.EventNotificationState[2].NotificationState = true;

            msg.ReaderEventNotificationSpec.EventNotificationState[3]                   = new PARAM_EventNotificationState();
            msg.ReaderEventNotificationSpec.EventNotificationState[3].EventType         = ENUM_NotificationEventType.Reader_Exception_Event;
            msg.ReaderEventNotificationSpec.EventNotificationState[3].NotificationState = true;

            msg.ReaderEventNotificationSpec.EventNotificationState[4]                   = new PARAM_EventNotificationState();
            msg.ReaderEventNotificationSpec.EventNotificationState[4].EventType         = ENUM_NotificationEventType.RFSurvey_Event;
            msg.ReaderEventNotificationSpec.EventNotificationState[4].NotificationState = true;

            msg.ROReportSpec   = new PARAM_ROReportSpec();
            msg.ROReportSpec.N = 1;
            msg.ROReportSpec.ROReportTrigger          = ENUM_ROReportTriggerType.Upon_N_Tags_Or_End_Of_ROSpec;
            msg.ROReportSpec.TagReportContentSelector = new PARAM_TagReportContentSelector();
            msg.ROReportSpec.TagReportContentSelector.AirProtocolEPCMemorySelector = new UNION_AirProtocolEPCMemorySelector();
            PARAM_C1G2EPCMemorySelector c1g2mem = new PARAM_C1G2EPCMemorySelector();

            c1g2mem.EnableCRC    = true;
            c1g2mem.EnablePCBits = true;
            msg.ROReportSpec.TagReportContentSelector.AirProtocolEPCMemorySelector.Add(c1g2mem);

            msg.ROReportSpec.TagReportContentSelector.EnableAccessSpecID             = true;
            msg.ROReportSpec.TagReportContentSelector.EnableAntennaID                = true;
            msg.ROReportSpec.TagReportContentSelector.EnableChannelIndex             = true;
            msg.ROReportSpec.TagReportContentSelector.EnableFirstSeenTimestamp       = true;
            msg.ROReportSpec.TagReportContentSelector.EnableInventoryParameterSpecID = true;
            msg.ROReportSpec.TagReportContentSelector.EnableLastSeenTimestamp        = true;
            msg.ROReportSpec.TagReportContentSelector.EnablePeakRSSI     = true;
            msg.ROReportSpec.TagReportContentSelector.EnableROSpecID     = false;
            msg.ROReportSpec.TagReportContentSelector.EnableSpecIndex    = true;
            msg.ROReportSpec.TagReportContentSelector.EnableTagSeenCount = true;

            msg.ResetToFactoryDefault = false;

            MSG_SET_READER_CONFIG_RESPONSE rsp = reader.SET_READER_CONFIG(msg, out msg_err, 3000);

            if (rsp != null)
            {
                textBox2.Text = rsp.ToString();
            }
            else if (msg_err != null)
            {
                textBox2.Text = rsp.ToString();
            }
            else
            {
                textBox2.Text = "Commmand time out!";
            }
        }
Beispiel #10
0
        private void Set_Reader_Config()
        {
            MSG_SET_READER_CONFIG msg = new MSG_SET_READER_CONFIG();
            //msg.AccessReportSpec = new PARAM_AccessReportSpec();
            //msg.AccessReportSpec.AccessReportTrigger = ENUM_AccessReportTriggerType.End_Of_AccessSpec;

            PARAM_C1G2InventoryCommand cmd = new PARAM_C1G2InventoryCommand();

            cmd.C1G2RFControl                         = new PARAM_C1G2RFControl();
            cmd.C1G2RFControl.ModeIndex               = 2;
            cmd.C1G2RFControl.Tari                    = 0;
            cmd.C1G2SingulationControl                = new PARAM_C1G2SingulationControl();
            cmd.C1G2SingulationControl.Session        = new TwoBits(1);
            cmd.C1G2SingulationControl.TagPopulation  = 0;
            cmd.C1G2SingulationControl.TagTransitTime = 1000;
            cmd.TagInventoryStateAware                = false;

            PARAM_ImpinjInventorySearchMode search_mode = new PARAM_ImpinjInventorySearchMode();

            search_mode.InventorySearchMode = ENUM_ImpinjInventorySearchType.Dual_Target;
            cmd.AddCustomParameter(search_mode);

            msg.AntennaConfiguration    = new PARAM_AntennaConfiguration[1];
            msg.AntennaConfiguration[0] = new PARAM_AntennaConfiguration();
            msg.AntennaConfiguration[0].AirProtocolInventoryCommandSettings = new UNION_AirProtocolInventoryCommandSettings();

            msg.AntennaConfiguration[0].AirProtocolInventoryCommandSettings.Add(cmd);
            msg.AntennaConfiguration[0].AntennaID = 0;

            msg.AntennaConfiguration[0].RFReceiver = new PARAM_RFReceiver();
            msg.AntennaConfiguration[0].RFReceiver.ReceiverSensitivity = 12;

            msg.AntennaConfiguration[0].RFTransmitter = new PARAM_RFTransmitter();
            msg.AntennaConfiguration[0].RFTransmitter.ChannelIndex  = 1;
            msg.AntennaConfiguration[0].RFTransmitter.HopTableID    = 1;
            msg.AntennaConfiguration[0].RFTransmitter.TransmitPower = 61;

            ////msg.AntennaProperties = new PARAM_AntennaProperties[1];
            ////msg.AntennaProperties[0] = new PARAM_AntennaProperties();
            ////msg.AntennaProperties[0].AntennaConnected = true;
            ////msg.AntennaProperties[0].AntennaGain = 0;
            ////msg.AntennaProperties[0].AntennaID = 1;



            //PARAM_ImpinjFixedFrequencyList fix_list = new PARAM_ImpinjFixedFrequencyList();
            //fix_list.FixedFrequencyMode = ENUM_FixedFrequencyMode.Disabled;
            //cmd.AddCustomParameter(fix_list);

            //PARAM_ImpinjPresetPowerFrequencyList power_list = new PARAM_ImpinjPresetPowerFrequencyList();
            //power_list.PresetPowerMode = ENUM_PresetPowerMode.Disabled;
            //power_list.Reserved = 0;
            //cmd.AddCustomParameter(power_list);

            //PARAM_ImpinjLowDutyCycle lowDuty = new PARAM_ImpinjLowDutyCycle();
            //lowDuty.LowDutyCycleMode = ENUM_LowDutyCycleMode.Disabled;
            //lowDuty.EmptyFieldTimeout = 0;
            //lowDuty.FieldPingInterval = 0;
            //cmd.AddCustomParameter(lowDuty);

            //msg.EventsAndReports = new PARAM_EventsAndReports();
            //msg.EventsAndReports.HoldEventsAndReportsUponReconnect = false;

            //msg.KeepaliveSpec = new PARAM_KeepaliveSpec();
            //msg.KeepaliveSpec.KeepaliveTriggerType = ENUM_KeepaliveTriggerType.Null;
            //msg.KeepaliveSpec.PeriodicTriggerValue = 0;

            //msg.ReaderEventNotificationSpec = new PARAM_ReaderEventNotificationSpec();
            //msg.ReaderEventNotificationSpec.EventNotificationState = new PARAM_EventNotificationState[5];
            //msg.ReaderEventNotificationSpec.EventNotificationState[0] = new PARAM_EventNotificationState();
            //msg.ReaderEventNotificationSpec.EventNotificationState[0].EventType = ENUM_NotificationEventType.AISpec_Event;
            //msg.ReaderEventNotificationSpec.EventNotificationState[0].NotificationState = true;

            //msg.ReaderEventNotificationSpec.EventNotificationState[1] = new PARAM_EventNotificationState();
            //msg.ReaderEventNotificationSpec.EventNotificationState[1].EventType = ENUM_NotificationEventType.Antenna_Event;
            //msg.ReaderEventNotificationSpec.EventNotificationState[1].NotificationState = true;

            //msg.ReaderEventNotificationSpec.EventNotificationState[2] = new PARAM_EventNotificationState();
            //msg.ReaderEventNotificationSpec.EventNotificationState[2].EventType = ENUM_NotificationEventType.GPI_Event;
            //msg.ReaderEventNotificationSpec.EventNotificationState[2].NotificationState = true;

            //msg.ReaderEventNotificationSpec.EventNotificationState[3] = new PARAM_EventNotificationState();
            //msg.ReaderEventNotificationSpec.EventNotificationState[3].EventType = ENUM_NotificationEventType.Reader_Exception_Event;
            //msg.ReaderEventNotificationSpec.EventNotificationState[3].NotificationState = true;

            //msg.ReaderEventNotificationSpec.EventNotificationState[4] = new PARAM_EventNotificationState();
            //msg.ReaderEventNotificationSpec.EventNotificationState[4].EventType = ENUM_NotificationEventType.RFSurvey_Event;
            //msg.ReaderEventNotificationSpec.EventNotificationState[4].NotificationState = true;

            msg.ROReportSpec   = new PARAM_ROReportSpec();
            msg.ROReportSpec.N = 1;
            msg.ROReportSpec.ROReportTrigger = ENUM_ROReportTriggerType.Upon_N_Tags_Or_End_Of_ROSpec;

            msg.ROReportSpec.TagReportContentSelector = new PARAM_TagReportContentSelector();
            msg.ROReportSpec.TagReportContentSelector.AirProtocolEPCMemorySelector = new UNION_AirProtocolEPCMemorySelector();
            PARAM_C1G2EPCMemorySelector c1g2mem = new PARAM_C1G2EPCMemorySelector();

            c1g2mem.EnableCRC    = true;
            c1g2mem.EnablePCBits = true;
            msg.ROReportSpec.TagReportContentSelector.AirProtocolEPCMemorySelector.Add(c1g2mem);

            msg.ROReportSpec.TagReportContentSelector.EnableAccessSpecID             = true;
            msg.ROReportSpec.TagReportContentSelector.EnableAntennaID                = true;
            msg.ROReportSpec.TagReportContentSelector.EnableChannelIndex             = true;
            msg.ROReportSpec.TagReportContentSelector.EnableFirstSeenTimestamp       = true;
            msg.ROReportSpec.TagReportContentSelector.EnableInventoryParameterSpecID = true;
            msg.ROReportSpec.TagReportContentSelector.EnableLastSeenTimestamp        = true;
            msg.ROReportSpec.TagReportContentSelector.EnablePeakRSSI     = true;
            msg.ROReportSpec.TagReportContentSelector.EnableROSpecID     = false;
            msg.ROReportSpec.TagReportContentSelector.EnableSpecIndex    = true;
            msg.ROReportSpec.TagReportContentSelector.EnableTagSeenCount = true;

            msg.GPIPortCurrentState               = new PARAM_GPIPortCurrentState[1];
            msg.GPIPortCurrentState[0]            = new PARAM_GPIPortCurrentState();
            msg.GPIPortCurrentState[0].Config     = true;
            msg.GPIPortCurrentState[0].GPIPortNum = 2;
            msg.GPIPortCurrentState[0].State      = ENUM_GPIPortState.Low;

            msg.GPOWriteData                  = new PARAM_GPOWriteData[1];
            msg.GPOWriteData[0]               = new PARAM_GPOWriteData();
            msg.GPOWriteData[0].GPOData       = true;
            msg.GPOWriteData[0].GPOPortNumber = 1;

            //PARAM_ImpinjTagDirectionReporting imp_tag_reporting = new PARAM_ImpinjTagDirectionReporting();

            //imp_tag_reporting.AntennaConfiguration = ENUM_TagDirectionAntennaConfiguration.Dual_Antenna;
            //imp_tag_reporting.EnableTagDirection = true;
            //imp_tag_reporting.Reserved = 0;

            //msg.ROReportSpec.AddCustomParameter(imp_tag_reporting);

            ////PARAM_ImpinjSubRegulatoryRegion sub_region = new PARAM_ImpinjSubRegulatoryRegion();
            ////sub_region.RegulatoryRegion = ENUM_ImpinjRegulatoryRegion.FCC_Part_15_247;
            ////msg.AddCustomParameter(sub_region);

            //msg.ResetToFactoryDefault = false;

            MSG_SET_READER_CONFIG_RESPONSE rsp = reader.SET_READER_CONFIG(msg, out msg_err, 12000);

            if (rsp != null)
            {
                textBox2.Text = rsp.ToString();
            }
            else if (msg_err != null)
            {
                textBox2.Text = rsp.ToString();
            }
            else
            {
                textBox2.Text = "Commmand time out!";
            }
        }
Beispiel #11
0
        // Sets the client's configuration
        public void Set_Reader_Config(ReaderManager.ReaderConfig readerconfig)
        {
            // find number of antennas to set
            byte   numAntennaToSet = 0;
            ushort antennaSet      = 0;

            for (int i = 0; i < readerconfig.antennaID.Length; i++)
            {
                if (readerconfig.antennaID[i])
                {
                    antennaSet = (ushort)i;
                    numAntennaToSet++;
                }
            }
            MSG_SET_READER_CONFIG msg = new MSG_SET_READER_CONFIG();

            msg.AccessReportSpec = new PARAM_AccessReportSpec();
            msg.AccessReportSpec.AccessReportTrigger = ENUM_AccessReportTriggerType.End_Of_AccessSpec;

            PARAM_C1G2InventoryCommand cmd = new PARAM_C1G2InventoryCommand();

            cmd.C1G2RFControl = new PARAM_C1G2RFControl();
            //cmd.C1G2RFControl.ModeIndex = 1000;
            cmd.C1G2RFControl.ModeIndex               = readerconfig.modeIndex;
            cmd.C1G2RFControl.Tari                    = 0;
            cmd.C1G2SingulationControl                = new PARAM_C1G2SingulationControl();
            cmd.C1G2SingulationControl.Session        = new TwoBits(0);
            cmd.C1G2SingulationControl.TagPopulation  = readerconfig.tagPopulation;
            cmd.C1G2SingulationControl.TagTransitTime = readerconfig.tagTransitTime;
            cmd.TagInventoryStateAware                = false;

            msg.AntennaConfiguration = new PARAM_AntennaConfiguration[numAntennaToSet];
            for (ushort i = 1; i < numAntennaToSet + 1; i++)
            {
                msg.AntennaConfiguration[i - 1] = new PARAM_AntennaConfiguration();
                msg.AntennaConfiguration[i - 1].AirProtocolInventoryCommandSettings = new UNION_AirProtocolInventoryCommandSettings();
                msg.AntennaConfiguration[i - 1].AirProtocolInventoryCommandSettings.Add(cmd);

                msg.AntennaConfiguration[i - 1].AntennaID = antennaSet;

                msg.AntennaConfiguration[i - 1].RFReceiver = new PARAM_RFReceiver();
                msg.AntennaConfiguration[i - 1].RFReceiver.ReceiverSensitivity = readerconfig.readerSensitivity;

                msg.AntennaConfiguration[i - 1].RFTransmitter = new PARAM_RFTransmitter();
                msg.AntennaConfiguration[i - 1].RFTransmitter.ChannelIndex  = readerconfig.channelIndex;
                msg.AntennaConfiguration[i - 1].RFTransmitter.HopTableID    = readerconfig.hopTableIndex;
                msg.AntennaConfiguration[i - 1].RFTransmitter.TransmitPower = (ushort)(61 - (readerconfig.attenuation * 4));
            }
            //msg.AntennaProperties = new PARAM_AntennaProperties[1];
            //msg.AntennaProperties[0] = new PARAM_AntennaProperties();
            //msg.AntennaProperties[0].AntennaConnected = true;
            //msg.AntennaProperties[0].AntennaGain = 0;
            //msg.AntennaProperties[0].AntennaID = 1;

            msg.EventsAndReports = new PARAM_EventsAndReports();
            msg.EventsAndReports.HoldEventsAndReportsUponReconnect = false;

            msg.KeepaliveSpec = new PARAM_KeepaliveSpec();
            msg.KeepaliveSpec.KeepaliveTriggerType = ENUM_KeepaliveTriggerType.Null;
            msg.KeepaliveSpec.PeriodicTriggerValue = readerconfig.periodicTriggerValue;

            msg.ReaderEventNotificationSpec = new PARAM_ReaderEventNotificationSpec();
            msg.ReaderEventNotificationSpec.EventNotificationState                      = new PARAM_EventNotificationState[5];
            msg.ReaderEventNotificationSpec.EventNotificationState[0]                   = new PARAM_EventNotificationState();
            msg.ReaderEventNotificationSpec.EventNotificationState[0].EventType         = ENUM_NotificationEventType.AISpec_Event;
            msg.ReaderEventNotificationSpec.EventNotificationState[0].NotificationState = false;

            msg.ReaderEventNotificationSpec.EventNotificationState[1]                   = new PARAM_EventNotificationState();
            msg.ReaderEventNotificationSpec.EventNotificationState[1].EventType         = ENUM_NotificationEventType.Antenna_Event;
            msg.ReaderEventNotificationSpec.EventNotificationState[1].NotificationState = true;

            msg.ReaderEventNotificationSpec.EventNotificationState[2]                   = new PARAM_EventNotificationState();
            msg.ReaderEventNotificationSpec.EventNotificationState[2].EventType         = ENUM_NotificationEventType.GPI_Event;
            msg.ReaderEventNotificationSpec.EventNotificationState[2].NotificationState = false;

            msg.ReaderEventNotificationSpec.EventNotificationState[3]                   = new PARAM_EventNotificationState();
            msg.ReaderEventNotificationSpec.EventNotificationState[3].EventType         = ENUM_NotificationEventType.Reader_Exception_Event;
            msg.ReaderEventNotificationSpec.EventNotificationState[3].NotificationState = true;

            msg.ReaderEventNotificationSpec.EventNotificationState[4]                   = new PARAM_EventNotificationState();
            msg.ReaderEventNotificationSpec.EventNotificationState[4].EventType         = ENUM_NotificationEventType.RFSurvey_Event;
            msg.ReaderEventNotificationSpec.EventNotificationState[4].NotificationState = true;

            msg.ROReportSpec   = new PARAM_ROReportSpec();
            msg.ROReportSpec.N = 1;
            msg.ROReportSpec.ROReportTrigger          = ENUM_ROReportTriggerType.Upon_N_Tags_Or_End_Of_AISpec;
            msg.ROReportSpec.TagReportContentSelector = new PARAM_TagReportContentSelector();
            msg.ROReportSpec.TagReportContentSelector.AirProtocolEPCMemorySelector = new UNION_AirProtocolEPCMemorySelector();
            PARAM_C1G2EPCMemorySelector c1g2mem = new PARAM_C1G2EPCMemorySelector();

            c1g2mem.EnableCRC    = false;
            c1g2mem.EnablePCBits = false;
            msg.ROReportSpec.TagReportContentSelector.AirProtocolEPCMemorySelector.Add(c1g2mem);

            msg.ROReportSpec.TagReportContentSelector.EnableAccessSpecID             = false;
            msg.ROReportSpec.TagReportContentSelector.EnableAntennaID                = true;
            msg.ROReportSpec.TagReportContentSelector.EnableChannelIndex             = false;
            msg.ROReportSpec.TagReportContentSelector.EnableFirstSeenTimestamp       = true;
            msg.ROReportSpec.TagReportContentSelector.EnableInventoryParameterSpecID = false;
            msg.ROReportSpec.TagReportContentSelector.EnableLastSeenTimestamp        = false;
            msg.ROReportSpec.TagReportContentSelector.EnablePeakRSSI     = true;
            msg.ROReportSpec.TagReportContentSelector.EnableROSpecID     = false;
            msg.ROReportSpec.TagReportContentSelector.EnableSpecIndex    = false;
            msg.ROReportSpec.TagReportContentSelector.EnableTagSeenCount = true;

            msg.ResetToFactoryDefault = false;

            MSG_SET_READER_CONFIG_RESPONSE rsp = client.SET_READER_CONFIG(msg, out msg_err, 3000);

            if (rsp != null)
            {
                //textBox2.Text = rsp.ToString() + "\n";
                WriteMessage(rsp.ToString(), "setReaderConfig");
            }
            else if (msg_err != null)
            {
                WriteMessage("setReaderConfig " + rsp.ToString() + "\n");
            }
            else
            {
                WriteMessage("setReaderConfig Commmand time out!" + "\n");
            }
        }
        /// <summary>
        /// Set Tari
        /// </summary>
        /// <param name="tari"></param>
        /// <returns>object</returns>
        private object SetTari(Object tari)
        {
            PARAM_C1G2RFControl rfControl = GetRFcontrol();
            uint modeIndex = rfControl.ModeIndex;
            PARAM_C1G2UHFRFModeTableEntry RFMode = (PARAM_C1G2UHFRFModeTableEntry)RFModeCache[modeIndex];
            uint maxTari = RFMode.MaxTariValue;
            uint minTari = RFMode.MinTariValue; 
            rfControl.Tari = Convert.ToUInt16(GetTariValue((Gen2.Tari)tari));
            if (rfControl.Tari < minTari || rfControl.Tari > maxTari)
            {
                throw new ReaderException("Tari value is out of range for this RF mode");
            }
            //Get the AntennaId value
            List<PARAM_AntennaConfiguration> antConfigList = new List<PARAM_AntennaConfiguration>();
            //Get the TagInventoryStateAware value
            foreach (int antennaId in antennaPorts)
            {
                PARAM_AntennaConfiguration antConfig = new PARAM_AntennaConfiguration();
                //Get the ModeIndex value
                UNION_AirProtocolInventoryCommandSettings airProtocolInventoryList = new UNION_AirProtocolInventoryCommandSettings();

                PARAM_C1G2InventoryCommand inventoryCommand = new PARAM_C1G2InventoryCommand();

                inventoryCommand.C1G2RFControl = rfControl;
                //Set the default TagInventoryStateAware value
                inventoryCommand.TagInventoryStateAware = false;
                airProtocolInventoryList.Add(inventoryCommand);

                antConfig.AirProtocolInventoryCommandSettings = airProtocolInventoryList;
                //Set the default AntennaId value
                antConfig.AntennaID = (ushort)(antennaId);
                antConfigList.Add(antConfig);
            }
            MSG_SET_READER_CONFIG setReadConfig = new MSG_SET_READER_CONFIG();
            setReadConfig.AntennaConfiguration = antConfigList.ToArray();
            try
            {
                MSG_SET_READER_CONFIG_RESPONSE response = (MSG_SET_READER_CONFIG_RESPONSE)SendLlrpMessage(setReadConfig);               
            }
            catch (Exception ex)
            {
                throw new ReaderException(ex.Message);
            }
            return tari;
        }
 /// <summary>
 /// Set RF Control
 /// </summary>
 /// <param name="rfControl"></param>
 private void SetRFControl(PARAM_C1G2RFControl rfControl)
 {
     MSG_SET_READER_CONFIG setConfig = new MSG_SET_READER_CONFIG();
     List<PARAM_AntennaConfiguration> antCfglist = new List<PARAM_AntennaConfiguration>();
     PARAM_AntennaConfiguration antCfg = new PARAM_AntennaConfiguration();
     UNION_AirProtocolInventoryCommandSettings airProtocolList = new UNION_AirProtocolInventoryCommandSettings();
     PARAM_C1G2InventoryCommand airProtocol = new PARAM_C1G2InventoryCommand();
     airProtocol.C1G2RFControl = rfControl;
     airProtocolList.Add(airProtocol);
     antCfg.AirProtocolInventoryCommandSettings = airProtocolList;
     antCfg.AntennaID = (ushort)0;
     antCfglist.Add(antCfg);
     setConfig.AntennaConfiguration = antCfglist.ToArray();
     try
     {
         MSG_SET_READER_CONFIG_RESPONSE setResponse = (MSG_SET_READER_CONFIG_RESPONSE)SendLlrpMessage(setConfig);
     }
     catch (Exception ex)
     {
         throw new ReaderException(ex.Message);
     }
 }
 /// <summary>
 /// Set Session
 /// </summary>
 /// <param name="val"></param>
 /// <returns>object</returns>
 private object SetSession(Object val)
 {
     PARAM_C1G2SingulationControl singulation = new PARAM_C1G2SingulationControl();
     List<PARAM_AntennaConfiguration> antConfigList = new List<PARAM_AntennaConfiguration>();
     foreach (int antennaId in antennaPorts)
     {
         singulation.Session = new LTKD.TwoBits(Convert.ToUInt16(val));
         PARAM_AntennaConfiguration antConfig = new PARAM_AntennaConfiguration();
         UNION_AirProtocolInventoryCommandSettings airProtocolInventoryList = new UNION_AirProtocolInventoryCommandSettings();
         PARAM_C1G2InventoryCommand inventoryCommand = new PARAM_C1G2InventoryCommand();
         inventoryCommand.C1G2SingulationControl = singulation;
         airProtocolInventoryList.Add(inventoryCommand);
         antConfig.AirProtocolInventoryCommandSettings = airProtocolInventoryList;
         //Set the default AntennaId value
         antConfig.AntennaID = (ushort)(antennaId);
         antConfigList.Add(antConfig);
     }
     MSG_SET_READER_CONFIG setReadConfig = new MSG_SET_READER_CONFIG();
     setReadConfig.AntennaConfiguration = antConfigList.ToArray();
     try
     {
         MSG_SET_READER_CONFIG_RESPONSE response = (MSG_SET_READER_CONFIG_RESPONSE)SendLlrpMessage(setReadConfig);
     }
     catch (Exception ex)
     {
         throw new ReaderException(ex.Message);
     }
     return val;
 }
        private void BuildRoSpec(ReadPlan rp, int timeOut, List<PARAM_ROSpec> roSpecList, bool isStandaloneOp)
        {
            string response = string.Empty;
            if (rp is MultiReadPlan)
            {
                MultiReadPlan mrp = (MultiReadPlan)rp;
                numPlans = mrp.Plans.Length;
                foreach (ReadPlan r in mrp.Plans)
                {
                    // Ideally, totalWeight=0 would allow reader to
                    // dynamically adjust timing based on tags observed.
                    // For now, just divide equally.
                    int subtimeout =
                        (mrp.TotalWeight != 0) ? (int)timeOut * r.Weight / mrp.TotalWeight
                        : timeOut / mrp.Plans.Length;
                    totalWeight = (uint)mrp.TotalWeight;
                    subtimeout = Math.Min(subtimeout, UInt16.MaxValue);
                    BuildRoSpec(r, subtimeout, roSpecList,false);
                }
            }
            else if (rp is SimpleReadPlan)
            {
                //MSG_ADD_ROSPEC msg = new MSG_ADD_ROSPEC();
                // Create a Reader Operation Spec (ROSpec).
                PARAM_ROSpec roSpec = new PARAM_ROSpec();
                roSpec.CurrentState = ENUM_ROSpecState.Disabled;
                roSpec.Priority = 0;
                roSpec.ROSpecID = ++roSpecId;
                //Add rospec id and protocol in the hashtable. So that it can be used to populate the tagdata's protocol member with the read tag protocol.
                roSpecProtcolTable.Add(roSpec.ROSpecID,((SimpleReadPlan)rp).Protocol);
                // Set up the ROBoundarySpec
                // This defines the start and stop triggers.
                roSpec.ROBoundarySpec = new PARAM_ROBoundarySpec();
                // Set the start trigger to null.
                // This means the ROSpec will start as soon as it is enabled.
                roSpec.ROBoundarySpec.ROSpecStartTrigger = new PARAM_ROSpecStartTrigger();
                uint asyncOnTime = Convert.ToUInt16(ParamGet("/reader/read/asyncOnTime"));
                if (continuousReading && numPlans > 1)
                {                    
                    roSpec.ROBoundarySpec.ROSpecStartTrigger.ROSpecStartTriggerType = ENUM_ROSpecStartTriggerType.Periodic;
                    PARAM_PeriodicTriggerValue pValue = new PARAM_PeriodicTriggerValue();
                    pValue.Offset = 0;
                    pValue.Period = asyncOnTime;                    
                    roSpec.ROBoundarySpec.ROSpecStartTrigger.PeriodicTriggerValue = pValue;
                }
                else
                {
                    roSpec.ROBoundarySpec.ROSpecStartTrigger.ROSpecStartTriggerType = ENUM_ROSpecStartTriggerType.Null;
                }

                // Set the stop trigger is null. This means the ROSpec
                // will keep running until an STOP_ROSPEC message is sent.
                roSpec.ROBoundarySpec.ROSpecStopTrigger = new PARAM_ROSpecStopTrigger();
                roSpec.ROBoundarySpec.ROSpecStopTrigger.ROSpecStopTriggerType = ENUM_ROSpecStopTriggerType.Null;

                roSpec.SpecParameter = new UNION_SpecParameter();
                PARAM_AISpec aiSpec = new PARAM_AISpec();
                // Select which antenna ports we want to use based on the read plan settings
                aiSpec.AntennaIDs = new LTKD.UInt16Array();
                SimpleReadPlan srp = (SimpleReadPlan)rp;
                //Check for fast search enable                
                isFastSearch = srp.UseFastSearch;
                //Validate protocol
                ValidateProtocol(srp.Protocol);
                int[] antennas = srp.Antennas;
                if (null == antennas)
                {
                    aiSpec.AntennaIDs.Add(0);               //0 :  applys to all antennae, 
                }
                else
                {
                    foreach (int antenna in antennas)
                        aiSpec.AntennaIDs.Add((ushort)antenna);
                }
                //Specify AI spec trigger type
                aiSpec.AISpecStopTrigger = new PARAM_AISpecStopTrigger();
                //Specify Report spec
                roSpec.ROReportSpec = new PARAM_ROReportSpec();
                if (continuousReading)
                {
                    // ASYNC Mode - Set the AI stop trigger to null. AI spec will run until the ROSpec stops.
                    if(numPlans  > 1)
                    {
                         // ASYNC Mode - Set the AI stop trigger to Duration - AsyncOnTime. AI spec will run until the Disable ROSpec is sent.
                        aiSpec.AISpecStopTrigger.AISpecStopTriggerType = ENUM_AISpecStopTriggerType.Duration;
                        aiSpec.AISpecStopTrigger.DurationTrigger = (uint)timeOut;
                    }
                    else
                    {
                        aiSpec.AISpecStopTrigger.AISpecStopTriggerType = ENUM_AISpecStopTriggerType.Null;
                        aiSpec.AISpecStopTrigger.DurationTrigger = 0;
                    }
                    // Receive a report every time a tag is read.
                    roSpec.ROReportSpec.N = 1;
                }
                else
                {
                    // SYNC Mode - Set the AI stop trigger to inputted duration. AI spec will run for particular duration
                    aiSpec.AISpecStopTrigger.AISpecStopTriggerType = ENUM_AISpecStopTriggerType.Duration;
                    aiSpec.AISpecStopTrigger.DurationTrigger = (uint)timeOut;
                    roSpec.ROReportSpec.N = 0;                    
                }
                PARAM_InventoryParameterSpec inventoryParam = new PARAM_InventoryParameterSpec();
                List<PARAM_InventoryParameterSpec> invParamList = new List<PARAM_InventoryParameterSpec>();
                inventoryParam.InventoryParameterSpecID = 1;
                TagFilter tagFilter = srp.Filter;
                //Filter
                if(tagFilter != null)
                {
                    List<PARAM_AntennaConfiguration> antennaConfigList = new List<PARAM_AntennaConfiguration>();
                    PARAM_AntennaConfiguration antConfig = new PARAM_AntennaConfiguration();
                    antConfig.AntennaID = 0;
                    if (TagProtocol.GEN2.Equals(srp.Protocol))
                    {
                    List<PARAM_C1G2Filter> filterList = new List<PARAM_C1G2Filter>();
                    PARAM_C1G2Filter filter = new PARAM_C1G2Filter();
                    PARAM_C1G2TagInventoryMask mask;
                    filter.T = ENUM_C1G2TruncateAction.Do_Not_Truncate;

                    PARAM_C1G2InventoryCommand inventoryCommand = new PARAM_C1G2InventoryCommand();
                    inventoryCommand.TagInventoryStateAware = false;

                    PARAM_C1G2TagInventoryStateUnawareFilterAction unAwareAction = new PARAM_C1G2TagInventoryStateUnawareFilterAction();
                    unAwareAction.Action = ENUM_C1G2StateUnawareAction.Select_Unselect;            

                    if (tagFilter is Gen2.Select)
                    {
                        Gen2.Select selectFilter = (Gen2.Select)tagFilter;
                        mask = new PARAM_C1G2TagInventoryMask();

                        // Memory Bank
                        mask.MB = new LTKD.TwoBits((ushort)selectFilter.Bank);
                        mask.TagMask = LTKD.LLRPBitArray.FromHexString(ByteFormat.ToHex(selectFilter.Mask).Split('x')[1].ToString());
                        mask.Pointer = (ushort)selectFilter.BitPointer;
                        filter.C1G2TagInventoryMask = mask;

                        if (selectFilter.Invert)
                        {
                            unAwareAction.Action = ENUM_C1G2StateUnawareAction.Unselect_Select;
                        }
                        filter.C1G2TagInventoryStateUnawareFilterAction = unAwareAction;                                        
                    }
                    else if (tagFilter is TagData)
                    {
                        TagData tagDataFilter = (TagData)tagFilter;
                        mask = new PARAM_C1G2TagInventoryMask();

                        // EPC Memory Bank 
                        mask.MB = new LTKD.TwoBits((ushort)Gen2.Bank.EPC);
                        mask.TagMask = LTKD.LLRPBitArray.FromHexString(tagDataFilter.EpcString);
                        //For epc bit pointer is 32
                        mask.Pointer = 32;

                        filter.C1G2TagInventoryMask = mask;
                        filter.C1G2TagInventoryStateUnawareFilterAction = unAwareAction;                    
                    }
                    else
                    {
                        throw new Exception("Unsupported operation");
                    }
                    filterList.Add(filter);
                    inventoryCommand.C1G2Filter = filterList.ToArray();
                    antConfig.AirProtocolInventoryCommandSettings.Add(inventoryCommand);
                    antennaConfigList.Add(antConfig);
                    inventoryParam.AntennaConfiguration = antennaConfigList.ToArray();
                    }
                    else if (TagProtocol.ISO180006B.Equals(srp.Protocol))
                    {
                        if (tagFilter is Iso180006b.Select)
                        {
                            PARAM_ThingMagicISO180006BTagPattern tagPattern = new PARAM_ThingMagicISO180006BTagPattern();
                            //Filter type
                            tagPattern.FilterType = ENUM_ThingMagicISO180006BFilterType.ISO180006BSelect;
                            //Invert
                            tagPattern.Invert = ((Iso180006b.Select)tagFilter).Invert;
                            //Address
                            tagPattern.Address = Convert.ToByte(((Iso180006b.Select)tagFilter).Address.ToString("X"));
                            //Mask
                            tagPattern.Mask = ((Iso180006b.Select)tagFilter).Mask;
                            //SelectOp
                            tagPattern.SelectOp = new Org.LLRP.LTK.LLRPV1.DataType.TwoBits(Convert.ToUInt16(((Iso180006b.Select)tagFilter).Op));
                            //TagData
                            tagPattern.TagData = LTKD.ByteArray.FromHexString(ByteFormat.ToHex(((Iso180006b.Select)tagFilter).Data).Split('x')[1]);
                            PARAM_ThingMagicISO180006BInventoryCommand iso18k6bInventoryCmd = new PARAM_ThingMagicISO180006BInventoryCommand();
                            iso18k6bInventoryCmd.ThingMagicISO180006BTagPattern = tagPattern;
                            antConfig.AirProtocolInventoryCommandSettings.Add(iso18k6bInventoryCmd);
                            antennaConfigList.Add(antConfig);
                            inventoryParam.AntennaConfiguration = antennaConfigList.ToArray();
                        }
                        else if(tagFilter is TagData)
                        {
                            PARAM_ThingMagicISO180006BTagPattern tagPattern = new PARAM_ThingMagicISO180006BTagPattern();
                            //Filter type
                            tagPattern.FilterType = ENUM_ThingMagicISO180006BFilterType.ISO180006BTagData;
                            //Invert
                            tagPattern.Invert = false;
                            //Address
                            tagPattern.Address = 0;
                            //Mask
                            tagPattern.Mask = 0xff;
                            //SelectOp
                            tagPattern.SelectOp = new Org.LLRP.LTK.LLRPV1.DataType.TwoBits(Convert.ToUInt16(((Iso180006b.SelectOp.EQUALS))));
                            //TagData
                            tagPattern.TagData = LTKD.ByteArray.FromHexString(((TagData)tagFilter).EpcString);
                            PARAM_ThingMagicISO180006BInventoryCommand iso18k6bInventoryCmd = new PARAM_ThingMagicISO180006BInventoryCommand();
                            iso18k6bInventoryCmd.ThingMagicISO180006BTagPattern = tagPattern;
                            antConfig.AirProtocolInventoryCommandSettings.Add(iso18k6bInventoryCmd);
                            antennaConfigList.Add(antConfig);
                            inventoryParam.AntennaConfiguration = antennaConfigList.ToArray();
                        }
                        else
                        {
                            throw new Exception("Unsupported operation");
                        }
                    }
                }
                if (isFastSearch)
                {
                    List<PARAM_AntennaConfiguration> antennaConfigList = new List<PARAM_AntennaConfiguration>();
                    PARAM_AntennaConfiguration antConfig = new PARAM_AntennaConfiguration();                    
                    PARAM_ThingMagicFastSearchMode fastSearch = new PARAM_ThingMagicFastSearchMode();
                    fastSearch.ThingMagicFastSearch = ENUM_ThingMagicFastSearchValue.Enabled;
                    PARAM_C1G2InventoryCommand inventoryCommandFastSearch = new PARAM_C1G2InventoryCommand();
                    inventoryCommandFastSearch.AddCustomParameter(fastSearch);
                    antConfig.AirProtocolInventoryCommandSettings.Add(inventoryCommandFastSearch);
                    antennaConfigList.Add(antConfig);
                    inventoryParam.AntennaConfiguration = antennaConfigList.ToArray();
                }

                //Emebeded tagops
                TagOp tagOperation = srp.Op;
                PARAM_AccessCommand accessCommand = new PARAM_AccessCommand();
                PARAM_AccessSpec accessSpec = new PARAM_AccessSpec();
                if (null != tagOperation)
                {
                    
                    accessSpec.AccessSpecID = ++AccessSpecID;
                    accessSpec.AccessCommand = accessCommand;
                    accessSpec.ROSpecID = roSpecId;

                    PARAM_AccessSpecStopTrigger trigger = new PARAM_AccessSpecStopTrigger();
                    if (!isStandaloneOp)//Embedded operation
                    {
                        if (tagOperation is Gen2.NxpGen2TagOp.EasAlarm)
                        {
                            throw new FeatureNotSupportedException("Gen2.NxpGen2TagOp.EasAlarm command can be standalone tag operation ");
                        }
                        if (tagOperation is Gen2.NXP.G2X.ResetReadProtect)
                        {
                            throw new FeatureNotSupportedException("NXP Reset Read protect command can be embedded only if the chip-type is G2il");
                        }
                        accessSpec.AntennaID = 0;
                        trigger.AccessSpecStopTrigger = ENUM_AccessSpecStopTriggerType.Null;
                        trigger.OperationCountValue = 0;
                    }
                    else
                    { //standalone operation
                        if (tagOperation is Gen2.Alien.Higgs2.PartialLoadImage)
                        {
                            if (null != tagFilter)
                            {
                                throw new ReaderException("Filter is not supported on this operation.");
                            }
                        }
                        accessSpec.AntennaID = Convert.ToUInt16(ParamGet("/reader/tagop/antenna"));
                        trigger.AccessSpecStopTrigger = ENUM_AccessSpecStopTriggerType.Operation_Count;
                        trigger.OperationCountValue = 1;
                    }

                    accessCommand.AccessCommandOpSpec.Add(BuildOpSpec(srp));
                    accessSpec.ProtocolID = ENUM_AirProtocols.EPCGlobalClass1Gen2;
                    accessSpec.CurrentState = ENUM_AccessSpecState.Disabled;
                    accessSpec.AccessSpecStopTrigger = trigger;
                    
                    // Add a list of target tags to the tag spec.

                    PARAM_C1G2TagSpec tagSpec = new PARAM_C1G2TagSpec();
                    PARAM_C1G2TargetTag targetTag = new PARAM_C1G2TargetTag();
                    targetTag.MB = new LTKD.TwoBits(0);
                    targetTag.Match = false;
                    targetTag.Pointer = 0;
                    targetTag.TagData = LTKD.LLRPBitArray.FromBinString("0");
                    targetTag.TagMask = LTKD.LLRPBitArray.FromBinString("0");

                    List<PARAM_C1G2TargetTag> targetTagList = new List<PARAM_C1G2TargetTag>();
                    targetTagList.Add(targetTag);
                    tagSpec.C1G2TargetTag = targetTagList.ToArray();
                    

                     //Add the tag spec to the access command.
                    accessCommand.AirProtocolTagSpec.Add(tagSpec);
                    AddAccessSpec(accessSpec);
                    EnableAccessSpec(accessSpec.AccessSpecID);
                }
                
                // Reading Gen2 Tags, specify in InventorySpec
                if (TagProtocol.GEN2 == srp.Protocol)
                {
                    inventoryParam.ProtocolID = ENUM_AirProtocols.EPCGlobalClass1Gen2;
                }
                else if (TagProtocol.ISO180006B == srp.Protocol)
                {
                    inventoryParam.ProtocolID = ENUM_AirProtocols.Unspecified;
                    PARAM_ThingMagicCustomAirProtocols airProtocol = new PARAM_ThingMagicCustomAirProtocols();
                    airProtocol.customProtocolId = ENUM_ThingMagicCustomAirProtocolList.Iso180006b;
                    inventoryParam.Custom.Add(airProtocol);
                }
                else
                {
                    throw new FeatureNotSupportedException("Only GEN2 and ISO18K6B protocol is supported as of now");
                }
                invParamList.Add(inventoryParam);
                aiSpec.InventoryParameterSpec = invParamList.ToArray();
                // Specify what type of tag reports we want to receive and when we want to receive them.
                roSpec.ROReportSpec.ROReportTrigger = ENUM_ROReportTriggerType.Upon_N_Tags_Or_End_Of_ROSpec;

                roSpec.SpecParameter.Add(aiSpec);
                // Selecting which fields we want in the report.
                roSpec.ROReportSpec.TagReportContentSelector = new PARAM_TagReportContentSelector();
                roSpec.ROReportSpec.TagReportContentSelector.EnableAccessSpecID = true;
                roSpec.ROReportSpec.TagReportContentSelector.EnableAntennaID = true;
                roSpec.ROReportSpec.TagReportContentSelector.EnableChannelIndex = true;
                roSpec.ROReportSpec.TagReportContentSelector.EnableFirstSeenTimestamp = true;
                roSpec.ROReportSpec.TagReportContentSelector.EnableInventoryParameterSpecID = true;
                roSpec.ROReportSpec.TagReportContentSelector.EnableLastSeenTimestamp = true;
                roSpec.ROReportSpec.TagReportContentSelector.EnablePeakRSSI = true;
                roSpec.ROReportSpec.TagReportContentSelector.EnableROSpecID = true;
                roSpec.ROReportSpec.TagReportContentSelector.EnableSpecIndex = true;
                roSpec.ROReportSpec.TagReportContentSelector.EnableTagSeenCount = true;                

                // By default both PC and CRC bits are set, so sent from tmmpd
                PARAM_C1G2EPCMemorySelector gen2MemSelector = new PARAM_C1G2EPCMemorySelector();
                gen2MemSelector.EnableCRC = true;
                gen2MemSelector.EnablePCBits = true;
                roSpec.ROReportSpec.TagReportContentSelector.AirProtocolEPCMemorySelector.Add(gen2MemSelector);
                // Since Spruce release firmware doesn't support phase, don't add PARAM_ThingMagicTagReportContentSelector 
                // custom paramter in ROReportSpec
                string[] ver = softwareVersion.Split('.');
                if (((Convert.ToInt32(ver[0]) == 4) && 
                    (Convert.ToInt32(ver[1]) >= 17)) ||
                    (Convert.ToInt32(ver[0]) > 4))
                {
                        PARAM_ThingMagicTagReportContentSelector tagReportContentSelector = new PARAM_ThingMagicTagReportContentSelector();
                        tagReportContentSelector.PhaseMode = ENUM_ThingMagicPhaseMode.Enabled;
                        roSpec.ROReportSpec.AddCustomParameter(tagReportContentSelector);                
                }
                roSpecList.Add(roSpec);
            }
        }
        private string SetReaderConfig()
        {
            string response = string.Empty;
            MSG_SET_READER_CONFIG msg = new MSG_SET_READER_CONFIG();
            msg.AccessReportSpec = new PARAM_AccessReportSpec();
            msg.AccessReportSpec.AccessReportTrigger = ENUM_AccessReportTriggerType.End_Of_AccessSpec;

            msg.AntennaConfiguration = new PARAM_AntennaConfiguration[1];
            msg.AntennaConfiguration[0] = new PARAM_AntennaConfiguration();
            msg.AntennaConfiguration[0].AirProtocolInventoryCommandSettings = new UNION_AirProtocolInventoryCommandSettings();

            PARAM_C1G2InventoryCommand cmd = new PARAM_C1G2InventoryCommand();
            cmd.C1G2RFControl = new PARAM_C1G2RFControl();
            cmd.C1G2RFControl.ModeIndex = 2;
            cmd.C1G2RFControl.Tari = 0;
            cmd.C1G2SingulationControl = new PARAM_C1G2SingulationControl();
            cmd.C1G2SingulationControl.Session = new LTKD.TwoBits(1);
            cmd.C1G2SingulationControl.TagPopulation = 0;
            cmd.C1G2SingulationControl.TagTransitTime = 1000;
            cmd.TagInventoryStateAware = false;

            msg.AntennaConfiguration[0].AirProtocolInventoryCommandSettings.Add(cmd);
            msg.AntennaConfiguration[0].AntennaID = 0;


            msg.AntennaConfiguration[0].RFReceiver = new PARAM_RFReceiver();
            msg.AntennaConfiguration[0].RFReceiver.ReceiverSensitivity = 12;

            msg.AntennaConfiguration[0].RFTransmitter = new PARAM_RFTransmitter();
            msg.AntennaConfiguration[0].RFTransmitter.ChannelIndex = 1;
            msg.AntennaConfiguration[0].RFTransmitter.HopTableID = 1;
            msg.AntennaConfiguration[0].RFTransmitter.TransmitPower = 61;

            msg.EventsAndReports = new PARAM_EventsAndReports();
            msg.EventsAndReports.HoldEventsAndReportsUponReconnect = false;

            msg.KeepaliveSpec = new PARAM_KeepaliveSpec();
            msg.KeepaliveSpec.KeepaliveTriggerType = ENUM_KeepaliveTriggerType.Null;
            msg.KeepaliveSpec.PeriodicTriggerValue = 0;

            msg.ReaderEventNotificationSpec = new PARAM_ReaderEventNotificationSpec();
            msg.ReaderEventNotificationSpec.EventNotificationState = new PARAM_EventNotificationState[5];
            msg.ReaderEventNotificationSpec.EventNotificationState[0] = new PARAM_EventNotificationState();
            msg.ReaderEventNotificationSpec.EventNotificationState[0].EventType = ENUM_NotificationEventType.AISpec_Event;
            msg.ReaderEventNotificationSpec.EventNotificationState[0].NotificationState = true;

            msg.ReaderEventNotificationSpec.EventNotificationState[1] = new PARAM_EventNotificationState();
            msg.ReaderEventNotificationSpec.EventNotificationState[1].EventType = ENUM_NotificationEventType.Antenna_Event;
            msg.ReaderEventNotificationSpec.EventNotificationState[1].NotificationState = true;

            msg.ReaderEventNotificationSpec.EventNotificationState[2] = new PARAM_EventNotificationState();
            msg.ReaderEventNotificationSpec.EventNotificationState[2].EventType = ENUM_NotificationEventType.GPI_Event;
            msg.ReaderEventNotificationSpec.EventNotificationState[2].NotificationState = true;

            msg.ReaderEventNotificationSpec.EventNotificationState[3] = new PARAM_EventNotificationState();
            msg.ReaderEventNotificationSpec.EventNotificationState[3].EventType = ENUM_NotificationEventType.Reader_Exception_Event;
            msg.ReaderEventNotificationSpec.EventNotificationState[3].NotificationState = true;

            msg.ReaderEventNotificationSpec.EventNotificationState[4] = new PARAM_EventNotificationState();
            msg.ReaderEventNotificationSpec.EventNotificationState[4].EventType = ENUM_NotificationEventType.RFSurvey_Event;
            msg.ReaderEventNotificationSpec.EventNotificationState[4].NotificationState = true;

            msg.ROReportSpec = new PARAM_ROReportSpec();
            msg.ROReportSpec.N = 1;
            msg.ROReportSpec.ROReportTrigger = ENUM_ROReportTriggerType.Upon_N_Tags_Or_End_Of_ROSpec;
            msg.ROReportSpec.TagReportContentSelector = new PARAM_TagReportContentSelector();
            msg.ROReportSpec.TagReportContentSelector.AirProtocolEPCMemorySelector = new UNION_AirProtocolEPCMemorySelector();
            PARAM_C1G2EPCMemorySelector c1g2mem = new PARAM_C1G2EPCMemorySelector();
            c1g2mem.EnableCRC = true;
            c1g2mem.EnablePCBits = true;
            msg.ROReportSpec.TagReportContentSelector.AirProtocolEPCMemorySelector.Add(c1g2mem);

            msg.ROReportSpec.TagReportContentSelector.EnableAccessSpecID = true;
            msg.ROReportSpec.TagReportContentSelector.EnableAntennaID = true;
            msg.ROReportSpec.TagReportContentSelector.EnableChannelIndex = true;
            msg.ROReportSpec.TagReportContentSelector.EnableFirstSeenTimestamp = true;
            msg.ROReportSpec.TagReportContentSelector.EnableInventoryParameterSpecID = true;
            msg.ROReportSpec.TagReportContentSelector.EnableLastSeenTimestamp = true;
            msg.ROReportSpec.TagReportContentSelector.EnablePeakRSSI = true;
            msg.ROReportSpec.TagReportContentSelector.EnableROSpecID = false;
            msg.ROReportSpec.TagReportContentSelector.EnableSpecIndex = true;
            msg.ROReportSpec.TagReportContentSelector.EnableTagSeenCount = true;

            msg.ResetToFactoryDefault = false;

            MSG_SET_READER_CONFIG_RESPONSE rsp = llrp.SET_READER_CONFIG(msg, out errorMessage, 3000);

            if (rsp != null)
            {
                response = rsp.ToString();
            }
            else if (errorMessage != null)
            {
                response = errorMessage.ToString();
            }
            else
            {
                response = "Command time out!";
            }
            return response;

        }
Beispiel #17
0
        /// <summary>ROSpec 追加</summary>
        protected virtual void AddROSpec(uint roSpecId, bool isEnabledImpinjExtensions = false)
        {
            MSG_ADD_ROSPEC msg = new MSG_ADD_ROSPEC();

            PARAM_ROSpec pROSpec = new PARAM_ROSpec();

            msg.ROSpec = pROSpec;

            pROSpec.ROSpecID     = roSpecId;
            pROSpec.Priority     = 0;
            pROSpec.CurrentState = ENUM_ROSpecState.Disabled;

            //
            PARAM_ROBoundarySpec pBoundary = new PARAM_ROBoundarySpec();

            pROSpec.ROBoundarySpec = pBoundary;

            // 開始トリガ
            pBoundary.ROSpecStartTrigger = new PARAM_ROSpecStartTrigger();
            pBoundary.ROSpecStartTrigger.ROSpecStartTriggerType = ENUM_ROSpecStartTriggerType.Null;
            // 停止トリガ
            pBoundary.ROSpecStopTrigger = new PARAM_ROSpecStopTrigger();
            pBoundary.ROSpecStopTrigger.ROSpecStopTriggerType = ENUM_ROSpecStopTriggerType.Null;
            pBoundary.ROSpecStopTrigger.DurationTriggerValue  = 0;

            // レポートスペック
            PARAM_ROReportSpec pReport = new PARAM_ROReportSpec();

            pROSpec.ROReportSpec    = pReport;
            pReport.N               = 1;
            pReport.ROReportTrigger = ENUM_ROReportTriggerType.Upon_N_Tags_Or_End_Of_ROSpec;


            PARAM_TagReportContentSelector pContentSelector = new PARAM_TagReportContentSelector();

            pReport.TagReportContentSelector          = pContentSelector;
            pContentSelector.EnableAntennaID          = true;
            pContentSelector.EnablePeakRSSI           = true;
            pContentSelector.EnableROSpecID           = true;
            pContentSelector.EnableFirstSeenTimestamp = true;


            if (isEnabledImpinjExtensions)
            {
                var pImpinjContentSelector = new PARAM_ImpinjTagReportContentSelector();
                pReport.Custom.Add(pImpinjContentSelector);

                pImpinjContentSelector.ImpinjEnablePeakRSSI = new PARAM_ImpinjEnablePeakRSSI()
                {
                    PeakRSSIMode = ENUM_ImpinjPeakRSSIMode.Enabled
                };
                pImpinjContentSelector.ImpinjEnableRFPhaseAngle = new PARAM_ImpinjEnableRFPhaseAngle()
                {
                    RFPhaseAngleMode = ENUM_ImpinjRFPhaseAngleMode.Enabled
                };
            }

            pROSpec.SpecParameter = new UNION_SpecParameter();


            // AISpec
            PARAM_AISpec pAI = new PARAM_AISpec();

            pROSpec.SpecParameter.Add(pAI);
            pAI.AntennaIDs = new UInt16Array();
            pAI.AntennaIDs.Add(0);

            // AISpec Stop Trigger
            PARAM_AISpecStopTrigger pAISpecStopTrigger = new PARAM_AISpecStopTrigger();

            pAI.AISpecStopTrigger = pAISpecStopTrigger;
            pAISpecStopTrigger.AISpecStopTriggerType = ENUM_AISpecStopTriggerType.Null;

            PARAM_InventoryParameterSpec pInventory = new PARAM_InventoryParameterSpec();

            pAI.InventoryParameterSpec    = new PARAM_InventoryParameterSpec[1];
            pAI.InventoryParameterSpec[0] = pInventory;

            pInventory.InventoryParameterSpecID = 4567;
            pInventory.ProtocolID = ENUM_AirProtocols.EPCGlobalClass1Gen2;

            if (this.Settings != null)
            {
                pAI.AntennaIDs = new UInt16Array();
                foreach (var ant in this.Settings.Antennas.Where(ant => ant.IsEnabled))
                {
                    pAI.AntennaIDs.Add(ant.Id);
                }

                pInventory.AntennaConfiguration =
                    new PARAM_AntennaConfiguration[this.Settings.Antennas.Count];

                for (ushort aid = 0; aid < this.Settings.Antennas.Count; ++aid)
                {
                    PARAM_AntennaConfiguration pAntenna = new PARAM_AntennaConfiguration();
                    pInventory.AntennaConfiguration[aid] = pAntenna;

                    var antenna = this.Settings.Antennas[aid];
                    pAntenna.AntennaID     = antenna.Id;
                    pAntenna.RFTransmitter = new PARAM_RFTransmitter();
                    pAntenna.RFTransmitter.ChannelIndex  = 1;
                    pAntenna.RFTransmitter.HopTableID    = 0;
                    pAntenna.RFTransmitter.TransmitPower = antenna.Tx.Id;

                    pAntenna.RFReceiver = new PARAM_RFReceiver();
                    pAntenna.RFReceiver.ReceiverSensitivity = antenna.Rx.Id;


                    pAntenna.AirProtocolInventoryCommandSettings = new UNION_AirProtocolInventoryCommandSettings();
                    var pInventoryCommand = new PARAM_C1G2InventoryCommand();
                    pAntenna.AirProtocolInventoryCommandSettings.Add(pInventoryCommand);

                    pInventoryCommand.TagInventoryStateAware  = false;
                    pInventoryCommand.C1G2RFControl           = new PARAM_C1G2RFControl();
                    pInventoryCommand.C1G2RFControl.ModeIndex = 1000;
                    pInventoryCommand.C1G2RFControl.Tari      = 0;

                    pInventoryCommand.C1G2SingulationControl                = new PARAM_C1G2SingulationControl();
                    pInventoryCommand.C1G2SingulationControl.Session        = new TwoBits(false, false);
                    pInventoryCommand.C1G2SingulationControl.TagPopulation  = 32;
                    pInventoryCommand.C1G2SingulationControl.TagTransitTime = 0;
                }
            }

            MSG_ERROR_MESSAGE?      msgErr  = null;
            MSG_ADD_ROSPEC_RESPONSE?msgResp = this.BaseClient?.ADD_ROSPEC(
                msg:      msg,
                msg_err:  out msgErr,
                time_out: 3000);

            this.CheckLLRPError(msgResp, msgErr);
        }