/// <summary>
        /// Method to retrieve correlation samples
        /// </summary>
        /// <param name="bGetMissingCounts">bool to retreive correlation tag present or not </param>
        /// <param name="nonEmptyGroups"></param>
        /// <param name="counts">Values retrieved</param>
        public void getCorrelationCounts(bool bGetMissingCounts, uint nonEmptyGroups, uint[] counts)
        {
            // The correlation sample session has finished. Gather the results.
            byte getMissingCounts = (byte)(bGetMissingCounts ? 1 : 0);
            uint groupBit         = 1;

            for (ushort correlationOffset = 0; correlationOffset < 256; correlationOffset += 16)
            {
                if ((nonEmptyGroups & groupBit) != 0)
                {
                    PbMsgRfidBackDoor backDoorMessage = new PbMsgRfidBackDoor(
                        RfidCommandType.RBDC_GetCorrelationCounts,
                        getMissingCounts, correlationOffset, 0);
                    PbRspRfidBackdoorGetCorrelationCounts backDoorCorrelationSamples =
                        (PbRspRfidBackdoorGetCorrelationCounts)marshalMessage(backDoorMessage,
                                                                              typeof(PbRspRfidBackdoorGetCorrelationCounts));
                    ushort[] correlationCounts = backDoorCorrelationSamples.correlationCounts;
                    MyDebug.Assert(backDoorCorrelationSamples.correlationOffset == correlationOffset, "Error in getCorrelationCounts");
                    for (uint i = 0; i < correlationCounts.Length; i++)
                    {
                        counts[correlationOffset + i] += correlationCounts[i];
                    }
                }
                groupBit <<= 1;
            }
        }
        private object backDoor(RfidCommandType backDoorCommand,
                                byte param1, ushort param2, ushort param3)
        {
            PbMsgRfidBackDoor message = new PbMsgRfidBackDoor(backDoorCommand,
                                                              param1, param2, param3);

            return(marshalMessage(message, typeof(PbRspRfidBackDoor)));
        }
        private object backDoor(RfidCommandType backDoorCommand, Type responseType,
                                byte param1, ushort param2, ushort param3)
        {
            PbMsgRfidBackDoor message = new PbMsgRfidBackDoor(backDoorCommand,
                                                              param1, param2, param3);

            return(marshalMessage(message, responseType));
        }
        /// <summary>
        /// Get the tag characterization data from a tag characterization session initiated
        /// with a call to characterizeTag().
        /// </summary>
        /// <returns>The tag characterization data</returns>
        public PbRspRfidBackDoorGetTagCharacterizationResults getCharacterizeTagResults()
        {
            PbMsgRfidBackDoor message = new PbMsgRfidBackDoor(
                RfidCommandType.RBDC_GetTagCharacterizationResults, 0, 0, 0);

            return((PbRspRfidBackDoorGetTagCharacterizationResults)marshalMessage(message,
                                                                                  typeof(PbRspRfidBackDoorGetTagCharacterizationResults)));
        }