Class: Tamashii::Agent::CardReader

Inherits:
Component
  • Object
show all
Defined in:
lib/tamashii/agent/card_reader.rb

Constant Summary collapse

ERROR_RESET_TIMER =
5

Instance Method Summary collapse

Methods inherited from Component

#check_new_event, #handle_new_event, #restart_current_component_async, #run, #run!, #run_worker_loop, #send_event, #stop, #stop_threads

Methods included from Tamashii::Agent::Common::Loggable

#logger, #progname

Constructor Details

#initialize(master) ⇒ CardReader

Returns a new instance of CardReader.



15
16
17
18
19
# File 'lib/tamashii/agent/card_reader.rb', line 15

def initialize(master)
  super
  @reader = Adapter::CardReader.object
  logger.debug "Using card_reader instance: #{@reader.class}"
end

Instance Method Details

#clean_upObject



80
81
82
83
# File 'lib/tamashii/agent/card_reader.rb', line 80

def clean_up
  super
  @reader.shutdown
end

#handle_cardObject



51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/tamashii/agent/card_reader.rb', line 51

def handle_card
  # read card
  return false unless @reader.picc_request(MFRC522::PICC_REQA)

  begin
    uid, sak = @reader.picc_select
    process_uid(uid.join("-"))
    reset_error_timer
  rescue CommunicationError, UnexpectedDataError => e
    logger.error "Error when selecting card: #{e.message}"
    set_error_timer
  rescue => e
    logger.error "GemError when selecting card: #{e.message}"
    set_error_timer
  end
  @reader.picc_halt
  true
end

#process_event(event) ⇒ Object

override



76
77
78
# File 'lib/tamashii/agent/card_reader.rb', line 76

def process_event(event)
  # silent is gold
end

#process_uid(uid) ⇒ Object



70
71
72
73
# File 'lib/tamashii/agent/card_reader.rb', line 70

def process_uid(uid)
  logger.info "New card detected, UID: #{uid}"
  @master.send_event(Event.new(Event::CARD_DATA, uid))
end

#reset_error_timerObject



21
22
23
24
25
26
# File 'lib/tamashii/agent/card_reader.rb', line 21

def reset_error_timer
  return unless @error_timer_task
  @error_timer_task.cancel
  @error_timer_task = nil
  logger.info "Error timer is reset"
end

#set_error_timerObject



28
29
30
31
32
# File 'lib/tamashii/agent/card_reader.rb', line 28

def set_error_timer
  return if @error_timer_task && !@error_timer_task.unscheduled?
  logger.info "Error timer is set"
  @error_timer_task = Concurrent::ScheduledTask.execute(ERROR_RESET_TIMER) { restart_current_component_async }
end

#worker_loopObject

override



35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/tamashii/agent/card_reader.rb', line 35

def worker_loop
  loop do
    if !handle_new_event(true)
      # no event available
      sleep 0.1
    end
    if handle_card
      # card is sent, sleep to prevent duplicate sent
      sleep 1.0
    else
      # no card available
      sleep 0.1
    end
  end
end