Skip to content

Commit

Permalink
fix shifted frames bug (bad sequence)
Browse files Browse the repository at this point in the history
  • Loading branch information
AlexVangelov committed Aug 21, 2015
1 parent 2a3e726 commit 4e52867
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 18 deletions.
21 changes: 16 additions & 5 deletions app/models/extface/driver/daisy_fx1200.rb
Expand Up @@ -18,6 +18,7 @@ class Driver::DaisyFx1200 < Extface::Driver::Base::Fiscal
INVALID_FRAME_RETRIES = 6 #count (bad length, bad checksum)
ACKS_MAX_WAIT = 60 #count / nothing is forever
NAKS_MAX_COUNT = 3 #count
BAD_SEQ_MAX_COUNT = 3

TAX_GROUPS_MAP = {
1 => "\xc0",
Expand Down Expand Up @@ -243,12 +244,22 @@ def fsend(cmd, data = "") #return data or nil
end

def frecv(timeout) # return RespFrame or nil
if frame_bytes = pull(timeout)
return RespFrame.new(frame_bytes.b)
else
errors.add :base, "No data received from device"
return nil
rframe = nil
BAD_SEQ_MAX_COUNT.times do
if frame_bytes = pull(timeout)
rframe = RespFrame.new(frame_bytes.b)
if rframe.seq.ord == sequence_number(false) #accept only current sequence number as reply
break
else
errors.add :base, "Sequence mismatch"
rframe = nil #invalidate mismatch sequence frame for the last retry
end
else
errors.add :base, "No data received from device"
break
end
end
return rframe
end

private
Expand Down
28 changes: 20 additions & 8 deletions app/models/extface/driver/datecs/fp550.rb
Expand Up @@ -6,6 +6,7 @@ class Driver::Datecs::Fp550 < Extface::Driver::Base::Fiscal
INVALID_FRAME_RETRIES = 6 #count (bad length, bad checksum)
ACKS_MAX_WAIT = 60 #count / nothing is forever
NAKS_MAX_COUNT = 3 #count
BAD_SEQ_MAX_COUNT = 3

TAX_GROUPS_MAP = {
1 => "\xc0",
Expand Down Expand Up @@ -206,13 +207,24 @@ def fsend(cmd, data = "") #return data or nil
return result
end

def frecv(timeout) # return RespFrame or nil
if frame_bytes = pull(timeout)
return Frame.new(frame_bytes.b)
else
errors.add :base, "No data received from device"
return nil
def frecv(timeout) # return Frame or nil
rframe = nil
BAD_SEQ_MAX_COUNT.times do
if frame_bytes = pull(timeout)
rframe = Frame.new(frame_bytes.b)
if rframe.seq.ord == sequence_number(false) #accept only current sequence number as reply
break
else
errors.add :base, "Sequence mismatch"
p "Invalid sequence (expected: #{sequence_number(false).to_s(16)}, got: #{rframe.seq.ord.to_s(16)})"
rframe = nil #invalidate mismatch sequence frame for the last retry
end
else
errors.add :base, "No data received from device"
break
end
end
return rframe
end

def build_packet(cmd, data = "")
Expand Down Expand Up @@ -259,9 +271,9 @@ def build_sale_data(item)
end
end

def sequence_number
def sequence_number(increment = true)
@seq ||= 0x1f
@seq += 1
@seq += 1 if increment
@seq = 0x1f if @seq == 0x7f
@seq
end
Expand Down
21 changes: 16 additions & 5 deletions app/models/extface/driver/eltrade_tm_u220.rb
Expand Up @@ -11,6 +11,7 @@ class Driver::EltradeTmU220 < Extface::Driver::Base::Fiscal
RESPONSE_TIMEOUT = 3 #seconds
INVALID_FRAME_RETRIES = 6 #count
BUSY_MAX_WAIT_CYCLES = 60 #count
BAD_SEQ_MAX_COUNT = 3

FLAG_TRUE = "\xff\xff"
FLAG_FALSE = "\x00\x00"
Expand Down Expand Up @@ -260,12 +261,22 @@ def fsend(cmd, data = "") #return data or nil
end

def frecv(timeout) # return RespFrame or nil
if frame_bytes = pull(timeout)
return Frame.new(frame_bytes.b)
else
errors.add :base, "No data received from device"
return nil
rframe = nil
BAD_SEQ_MAX_COUNT.times do
if frame_bytes = pull(timeout)
rframe = Frame.new(frame_bytes.b)
if rframe.seq.ord == sequence_number(false) #accept only current sequence number as reply
break
else
errors.add :base, "Sequence mismatch"
rframe = nil #invalidate mismatch sequence frame for the last retry
end
else
errors.add :base, "No data received from device"
break
end
end
return rframe
end

def pbcd(byte)
Expand Down

0 comments on commit 4e52867

Please sign in to comment.