Пример #1
0
        void Start18K6CRequest(uint tagStopCount, SelectFlags flags)
        {
            // Set up the rest of the HST_INV_CFG register.  First, we have to read its
            // current value
            UInt32 registerValue = 0;

            MacReadRegister(MACREGISTER.HST_INV_CFG, ref registerValue);
            registerValue &= ~0x0000FFC0U;              // reserver bit 0:5 ~ 16:31

            // TBD - an optimization could be to only write back the register if
            // the value changes

            // Set the tag stop count and enabled flags and then write the register
            // back
            if ((flags & SelectFlags.SELECT) != 0)
            {
                registerValue |= (1 << 14);
            }
            if ((flags & SelectFlags.DISABLE_INVENTORY) != 0)
            {
                registerValue |= (1 << 15);
            }
            registerValue |= tagStopCount << 6;
            MacWriteRegister(MACREGISTER.HST_INV_CFG, registerValue);

            // Set the enabled flag in the HST_INV_EPC_MATCH_CFG register properly.  To
            // do so, have to read the register value first.  Then set the bit properly
            // and then write the register value back to the MAC.
            MacReadRegister(MACREGISTER.HST_INV_EPC_MATCH_CFG, ref registerValue);
            if ((flags & SelectFlags.POST_MATCH) != 0)
            {
                registerValue |= 0x01;
            }
            else
            {
                registerValue &= ~(uint)0x01;;
            }

            MacWriteRegister(MACREGISTER.HST_INV_EPC_MATCH_CFG, registerValue);
        }         // Radio::Start18K6CRequest
        public int Start18K6CRead(uint bank, uint offset, uint count, UInt16[] data, uint accessPassword, uint retry, SelectFlags flags)
        {
            // Perform the common 18K6C tag operation setup
            Start18K6CRequest(retry, flags);

            Setup18K6CReadRegisters(bank, offset, count);

            // Set up the access password register
            MacWriteRegister(MACREGISTER.HST_TAGACC_ACCPWD, accessPassword);

            // Issue the read command
            _deviceHandler.SendAsync(0, 0, DOWNLINKCMD.RFIDCMD, PacketData(0xf000, (UInt32)HST_CMD.READ), (UInt32)SENDREMARK.INVENTORY);

            return(0);
        }         //  Start18K6CRead
Пример #3
0
        public SelectStatement ParseSelect(string input, int offset, Context context, SelectFlags flags, SelectStatement parent)
        {
            int originalOffset = offset;
            var statement      = new SelectStatement();

            if (parent != null)
            {
                statement.Parent = parent;
            }
            statement.UsedFlags = flags;

            Token next = NextToken(input, offset);

            if (next.Kind != TokenKind.Keyword || next.KeywordValue != Keyword.Select)
            {
                throw new Exception("Failed initial check");
            }
            offset += next.InputLength;

            var exprFlags = new ExpressionFlags {
                GeneralWildcardAllowed = true, IdentifierAllowed = true, WildcardAllowed = true, SingleValueSubSelectAllowed = true
            };

            do
            {
                next = NextToken(input, offset);
                if (next.Kind == TokenKind.Keyword && next.KeywordValue == Keyword.From)
                {
                    offset += next.InputLength;
                    break;
                }
                else if (next.Kind == TokenKind.None)
                {
                    throw new Exception("Unexpected end of input");
                }
                else if (next.Kind == TokenKind.Comma)
                {
                    offset += next.InputLength;
                }

                var expr = ParseExpression(input, offset, context, statement, exprFlags, false, false);

                if (statement.OutputColumns.Count > 0 && expr.IsWildcard() && !expr.IsOnlyReference())
                {
                    throw new Exception("Unexpected token *");
                }

                statement.OutputColumns.Add(expr);
                offset += expr.FullText.Length;

                // Disallow general wildflags after first column
                exprFlags.GeneralWildcardAllowed = false;
            } while (true);

            var source = ParseReference(input, offset, context, statement, new ReferenceFlags()
            {
                TableOnly = true
            });

            statement.MainSource = source;
            offset += source.InputLength;

            // If we have a parent, they're going to resolve our references for us
            if (parent == null)
            {
                ResolveSelectReferences(statement, context);
            }

            // Prepare flags for WHERE and ORDER BY expressions
            exprFlags.GeneralWildcardAllowed = false;
            exprFlags.WildcardAllowed        = false;
            exprFlags.IdentifierAllowed      = false;

            do
            {
                next    = NextToken(input, offset);
                offset += next.InputLength;

                if (next.Kind == TokenKind.Keyword)
                {
                    if (next.KeywordValue == Keyword.Where)
                    {
                        if (statement.FilterConditions != null)
                        {
                            throw new Exception("Unexpected WHERE when filter has already been set");
                        }

                        statement.FilterConditions = ParseExpression(input, offset, context, statement, exprFlags, parent == null, false);
                        offset += statement.FilterConditions.FullText.Length;
                    }
                    else if (next.KeywordValue == Keyword.Order)
                    {
                        next = NextToken(input, offset);
                        if (next.Kind != TokenKind.Keyword || next.KeywordValue != Keyword.By)
                        {
                            throw new Exception("Unexpected token after ORDER");
                        }

                        offset += next.InputLength;

                        bool firstOrder = true;

                        while (true)
                        {
                            next = NextToken(input, offset);

                            if (next.Kind == TokenKind.Comma)
                            {
                                if (!firstOrder)
                                {
                                    offset += next.InputLength;
                                }
                                else
                                {
                                    throw new Exception("Order by clause cannot start with a comma");
                                }
                            }
                            else if (next.Kind == TokenKind.Operator && next.OperatorValue == Operator.ParenthesisRight)
                            {
                                if (flags.StopOnUnmatchedParenthesis)
                                {
                                    offset += next.InputLength;
                                    break;
                                }
                                else
                                {
                                    throw new Exception("Missing left parenthesis");
                                }
                            }
                            else if (next.Kind == TokenKind.Keyword || next.Kind == TokenKind.None)
                            {
                                break;
                            }

                            firstOrder = false;

                            var ordering = new Ordering
                            {
                                OrderExpression = ParseExpression(input, offset, context, statement, exprFlags, parent == null, false)
                            };
                            offset += ordering.OrderExpression.FullText.Length;

                            next = NextToken(input, offset);
                            if (next.Kind == TokenKind.Keyword && (next.KeywordValue == Keyword.Asc || next.KeywordValue == Keyword.Desc))
                            {
                                ordering.Kind = next.KeywordValue == Keyword.Asc ? OrderingKind.Ascending : OrderingKind.Descending;
                                offset       += next.InputLength;
                            }

                            statement.OutputOrder.Add(ordering);
                        }
                    }
                }
                else if (next.Kind == TokenKind.Operator && next.OperatorValue == Operator.ParenthesisRight)
                {
                    if (!flags.StopOnUnmatchedParenthesis)
                    {
                        offset += next.InputLength;
                        break;
                    }
                    else
                    {
                        throw new Exception("Missing left parenthesis");
                    }
                }
                else if (next.Kind != TokenKind.None)
                {
                    throw new Exception($"Unexpected token in query at offset {offset}");
                }
            } while (next.Kind != TokenKind.None && next.Kind != TokenKind.SemiColon);

            offset = Math.Min(input.Length, offset);
            statement.OriginalText = input[originalOffset..offset];