Motorola EMDK: как остановить сканирование данных при изменении статуса?

Фон:

Я использую Motorola EMDK v2.5 для.NET, чтобы получить данные сканирования RFID с портативного сканера MC 919Z. Я хочу продолжать получать данные метки rfid, пока пользователь нажимает кнопку на устройстве. Как только он уберет палец с кнопки, я хочу прекратить чтение данных RFID.

События eMDK, которые я использую:

Теперь Motorola выставила два события:

  • StatusNotify: Событие, которое срабатывает при изменении состояния кнопки (нажата или нет).
  • ReadNotify: событие, которое запускается для чтения тегов RFID.

Проблема:

Эти два события, кажется, препятствуют тому, чтобы друг друга инициировали. Если теги читаются, событие изменения статуса кнопки не срабатывает. Если происходит событие изменения состояния кнопки, теги не читаются.

Итак, вопрос в том, как я могу гарантировать, что оба события будут запущены в тандеме.

1 ответ

Вам нужно будет сделать несколько вещей (извините за код VB, но это должно быть тривиально для преобразования в C#):

  • Используете ли вы Actions.Inventory.Perform() или же Actions.TagAccess.OperationSequence.PerformSequence() вам понадобится TriggerInfo определены и переданы этим методам вместо обычного вызова без аргументов. Эта структура содержит фактические события триггера.

    Imports Symbol
    Imports Symbol.RFID3
    Imports Symbol.RFID3.Events
    Imports Symbol.RFID3.TagAccess
    
    Private Sub DoRead()
        triggernfo = New TriggerInfo()
        triggernfo.TagReportTrigger = 1
        triggernfo.StartTrigger.Type = START_TRIGGER_TYPE.START_TRIGGER_TYPE_HANDHELD
        triggernfo.StartTrigger.Handheld.HandheldEvent = HANDHELD_TRIGGER_EVENT_TYPE.HANDHELD_TRIGGER_PRESSED
        triggernfo.StopTrigger.Type = STOP_TRIGGER_TYPE.STOP_TRIGGER_TYPE_HANDHELD_WITH_TIMEOUT
        triggernfo.StopTrigger.Handheld.HandheldEvent = HANDHELD_TRIGGER_EVENT_TYPE.HANDHELD_TRIGGER_RELEASED
        triggernfo.StopTrigger.Handheld.Timeout = 0 'Default handheld timeout value
    
    'Then you need to pass it to the Perform() OR PerformSequence() call:
        _Reader.Actions.TagAccess.OperationSequence.PerformSequence(Nothing, triggernfo, Nothing)
    'OR
        _Reader.Actions.Inventory.Perform(Nothing, triggernfo, Nothing)
    End Sub
    

Суть в том, что вам не нужно звонить Perform() или же PerformSequence() чтобы начать чтение каждый раз, вы можете просто определить процедуру после Form.Load который подключается к ридеру и вызывает Perform() с триггером в нем, и он будет автоматически активироваться только при использовании триггера. В зависимости от того, как вы закодировали, я думаю, что вы можете использовать ваши текущие обратные вызовы делегатов, как они есть, если один из делегатов Read использует GetReadTags() (Я размышляю сейчас, потому что я не видел ваш код).

Наконец, в своем вызове делегата статуса вы можете поймать Symbol.RFID3.Events.STATUS_EVENT_TYPE.HANDHELD_TRIGGER_EVENT как EventData. Если вы копаете дальше, у вас есть внутри eventData.HandheldTriggerEventData.HandheldTriggerEvent это может быть HANDHELD_TRIGGER_EVENT_TYPE.HANDHELD_TRIGGER_PRESSED или же HANDHELD_TRIGGER_EVENT_TYPE.HANDHELD_TRIGGER_RELEASED, Ничего не стоит, что вам не нужно ничего делать с этим событием, чтобы фактически прочитать теги, триггер и чтение произойдут в любом случае, даже если вы ничего не сделаете здесь.

На самом деле, путаница с Событием (например, остановка или запуск чтения) может привести к ошибкам броска триггера, поэтому, если у вас нет острой необходимости (как у меня было сегодня), переходите к объекту TriggerInfo и оставляйте делегат Status в покое;)

Другие вопросы по тегам