extface 0.5.9 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: bfe76bc059c789a5646a9da7fc5b40a4a56c6e67
4
- data.tar.gz: 2cfadeb3180e60562574111190856e8e6a0e49d1
3
+ metadata.gz: cd1126c53dc93e2a74c7924b5f1d539a41a7c127
4
+ data.tar.gz: d9426f418c1464e4745f970d75f8b008fb3f1793
5
5
  SHA512:
6
- metadata.gz: 1fe34ae4dfccfe58dec45ab0c3a6194650fe01b446e32bf66ee6c7c7331957c35122065c27740685ca003c22dbb8d4220c8c97f911651b93ca81aab2a87a6809
7
- data.tar.gz: e7ecc09793575cc0f6ca1a121d8d2e0a3bc42b441ca78e05d96f0849726e078d938051298ffd5dec5929e4ecb8d70915ac3d0ed3a1c599c26fa9ca811384163f
6
+ metadata.gz: 09b1d1f4967722d9af90f14f6c892d769f788b7d1584c385d9ed0336f78bbdc4178127feded977132b7638d1d31c083104aecef5f31d614d57b4f2649081c77a
7
+ data.tar.gz: 0b353b388d3788f067cc2dd25467f6f3216de1274e8a0452982f22a658b410e9d1b9e105887d3885886042bb3a9f1a7b91b9ea54bae71b86ac0c4c38461d800a
@@ -0,0 +1,352 @@
1
+ module Extface
2
+ class Driver::Datecs::Dp25 < Extface::Driver::Base::Fiscal
3
+ NAME = 'Datecs DP25'.freeze
4
+
5
+ RESPONSE_TIMEOUT = 3 #seconds
6
+ INVALID_FRAME_RETRIES = 6 #count (bad length, bad checksum)
7
+ ACKS_MAX_WAIT = 60 #count / nothing is forever
8
+ NAKS_MAX_COUNT = 3 #count
9
+ BAD_SEQ_MAX_COUNT = 3
10
+ NO_RESP_MAX_COUNT = 3
11
+
12
+ TAX_GROUPS_MAP = {
13
+ 1 => "\xc0",
14
+ 2 => "\xc1",
15
+ 3 => "\xc2",
16
+ 4 => "\xc3",
17
+ 5 => "\xc4",
18
+ 6 => "\xc5",
19
+ 7 => "\xc6",
20
+ 8 => "\xc7"
21
+ }
22
+
23
+ PAYMENT_TYPE_MAP = {
24
+ 1 => "P",
25
+ 2 => "N",
26
+ 3 => "C",
27
+ 4 => "D",
28
+ 5 => "B"
29
+ }
30
+
31
+ include Extface::Driver::Datecs::CommandsV1
32
+
33
+ def handle(buffer)
34
+ #if i = buffer.index(/[\x03\x16\x15]/) # find position of frame possible delimiter
35
+ if i = buffer.index("\x03") || buffer.index("\x16") || buffer.index("\x15")
36
+ rpush buffer[0..i] # this will make data available for #pull(timeout) method
37
+ return i+1 # return number of bytes processed
38
+ end
39
+ end
40
+
41
+ #tests
42
+ def non_fiscal_test
43
+ device.session("Non Fiscal Text") do |s|
44
+ s.notify "Printing Non Fiscal Text"
45
+ s.open_non_fiscal_doc
46
+ s.print "********************************"
47
+ s.print "Extface Print Test".center(32)
48
+ s.print "********************************"
49
+ s.fsend Printer::PAPER_MOVE, "1"
50
+ s.print "Driver: " + "#{self.class::NAME}".truncate(24)
51
+ s.close_non_fiscal_doc
52
+ s.notify "Printing finished"
53
+ end
54
+ end
55
+
56
+ def fiscal_test
57
+ sale_and_pay_items_session([
58
+ SaleItem.new( price: 0.01, text1: "Extface Test" )
59
+ ])
60
+ end
61
+
62
+ #reports
63
+ def z_report_session
64
+ device.session("Z Report") do |s|
65
+ s.notify "Z Report Start"
66
+ s.fsend Closure::DAY_FIN_REPORT, "0"
67
+ s.notify "Z Report End"
68
+ end
69
+ end
70
+
71
+ def x_report_session
72
+ device.session("X Report") do |s|
73
+ s.notify "X Report Start"
74
+ s.fsend Closure::DAY_FIN_REPORT, "2"
75
+ s.notify "X Report End"
76
+ end
77
+ end
78
+
79
+ def period_report_session(from, to, detailed = true)
80
+ device.session("Period Report #{ '(detailed)' if detailed }") do |s|
81
+ s.notify "Period Report Start #{ '(detailed)' if detailed }"
82
+ s.fsend detailed ? Reports::REPORT_FP_BY_DATE : Reports::COMPACT_REPORT_FP_BY_DATE, "#{from.strftime('%d%m%y')},#{to.strftime('%d%m%y')}"
83
+ s.notify "Period Report End"
84
+ end
85
+ end
86
+
87
+ #print
88
+ def open_non_fiscal_doc
89
+ fsend Sales::START_NON_FISCAL_DOC
90
+ @print_session = true
91
+ end
92
+
93
+ def print(text) #up to 38 sybols, TODO check
94
+ raise "Not in print session" unless @print_session
95
+ fsend Sales::PRINT_NON_FISCAL_TEXT, text
96
+ end
97
+
98
+ def close_non_fiscal_doc
99
+ fsend Sales::END_NON_FISCAL_DOC
100
+ @print_session = false
101
+ end
102
+
103
+ def check_status
104
+ flush #clear receive buffer
105
+ fsend(Info::GET_STATUS, 'X') # get 6 bytes status
106
+ errors.empty?
107
+ end
108
+
109
+ #fiscal
110
+ def open_fiscal_doc(operator = "1", password = "1")
111
+ fsend Sales::START_FISCAL_DOC, "#{operator.presence || "1"},#{password.presence || "1"},1"
112
+ @fiscal_session = true
113
+ end
114
+
115
+ def close_fiscal_doc
116
+ raise "Not in fiscal session" unless @fiscal_session
117
+ fsend Sales::END_FISCAL_DOC
118
+ @fiscal_session = false
119
+ end
120
+
121
+ def add_sale(sale_item)
122
+ raise "Not in fiscal session" unless @fiscal_session
123
+ fsend Sales::SALE_AND_SHOW, build_sale_data(sale_item)
124
+ end
125
+
126
+ def add_comment(text)
127
+ raise "Not in fiscal session" unless @fiscal_session
128
+ end
129
+
130
+ def add_payment(value = nil, type_num = nil)
131
+ raise "Not in fiscal session" unless @fiscal_session
132
+ payment_data = "".tap() do |data|
133
+ data << "\t"
134
+ data << PAYMENT_TYPE_MAP[type_num || 1]
135
+ data << ("%.2f" % value) unless value.blank?
136
+ end
137
+ fsend(Sales::TOTAL, payment_data)
138
+ end
139
+
140
+ def total_payment
141
+ raise "Not in fiscal session" unless @fiscal_session
142
+ fsend(Sales::TOTAL, "\t")
143
+ end
144
+
145
+ #basket
146
+ def sale_and_pay_items_session(items = [], operator = "1", password = "1")
147
+ device.session("Fiscal Doc") do |s|
148
+ s.notify "Fiscal Doc Start"
149
+ s.open_fiscal_doc
150
+ s.notify "Register Sale"
151
+ items.each do |item|
152
+ s.add_sale(item)
153
+ end
154
+ s.notify "Register Payment"
155
+ s.total_payment
156
+ s.notify "Close Fiscal Receipt"
157
+ s.close_fiscal_doc
158
+ s.notify "Fiscal Doc End"
159
+ end
160
+ end
161
+
162
+ def cancel_doc_session
163
+ device.session("Doc cancel") do |s|
164
+ s.notify "Doc Cancel Start"
165
+ s.fsend Sales::CANCEL_FISCAL_DOC
166
+ s.paper_cut
167
+ s.notify "Doc Cancel End"
168
+ end
169
+ end
170
+
171
+ #common
172
+ def fsend(cmd, data = "") #return data or nil
173
+ packet_data = build_packet(cmd, data) #store packet to be able to re-transmit it with the same sequence number
174
+ result = false
175
+ invalid_frames = 0 #counter for bad responses
176
+ nak_messages = 0 #counter for rejected packets (should re-transmit the packet)
177
+ no_resp = 0
178
+ flush #prevent double packet response issue like daisy driver
179
+ push packet_data #send packet
180
+ ACKS_MAX_WAIT.times do |retries|
181
+ errors.clear
182
+ if resp = frecv(RESPONSE_TIMEOUT)
183
+ if resp.valid?
184
+ human_status_errors(resp.status)
185
+ if errors.empty?
186
+ result = resp.data
187
+ break
188
+ else
189
+ raise errors.full_messages.join(',')
190
+ end
191
+ else #ack, nak or bad
192
+ if resp.nak?
193
+ nak_messages += 1
194
+ if nak_messages > NAKS_MAX_COUNT
195
+ errors.add :base, "#{NAKS_MAX_COUNT} NAKs Received. Abort!"
196
+ break
197
+ end
198
+ elsif !resp.ack?
199
+ invalid_frames += 1
200
+ if invalid_frames > INVALID_FRAME_RETRIES
201
+ errors.add :base, "#{INVALID_FRAME_RETRIES} Broken Packets Received. Abort!"
202
+ break
203
+ end
204
+ end
205
+ push packet_data unless resp.ack?
206
+ end
207
+ else
208
+ no_resp += 1
209
+ if no_resp > NO_RESP_MAX_COUNT
210
+ p "No reply in #{NO_RESP_MAX_COUNT * RESPONSE_TIMEOUT} seconds. Abort!"
211
+ errors.add :base, "No reply in #{NO_RESP_MAX_COUNT * RESPONSE_TIMEOUT} seconds. Abort!"
212
+ return result
213
+ end
214
+ end
215
+ errors.add :base, "#{ACKS_MAX_WAIT} ACKs Received. Abort!"
216
+ end
217
+ return result
218
+ end
219
+
220
+ def frecv(timeout) # return Frame or nil
221
+ rframe = nil
222
+ BAD_SEQ_MAX_COUNT.times do
223
+ errors.clear
224
+ if frame_bytes = pull(timeout)
225
+ rframe = Frame.new(frame_bytes.b)
226
+ if rframe.seq.nil? || rframe.seq.ord == sequence_number(false) #accept only current sequence number as reply
227
+ break
228
+ else
229
+ errors.add :base, "Sequence mismatch"
230
+ p "Invalid sequence (expected: #{sequence_number(false).to_s(16)}, got: #{rframe.seq.ord.to_s(16)})"
231
+ rframe = nil #invalidate mismatch sequence frame for the last retry
232
+ end
233
+ else
234
+ errors.add :base, "No data received from device"
235
+ break
236
+ end
237
+ end
238
+ return rframe
239
+ end
240
+
241
+ def build_packet(cmd, data = "")
242
+ "".b.tap() do |packet|
243
+ packet << STX #Preamble. 1 byte long. Value: 01H.
244
+ packet << 0x20 + 4 + data.b.length #Number of bytes from <01> preamble (excluded) to <05> (included) plus the fixed offset of 20H
245
+ packet << sequence_number #Sequence number of the frame. Length : 1 byte. Value: 20H – FFH.
246
+ packet << cmd #Length: 1 byte. Value: 20H - 7FH.
247
+ packet << data.b #Length: 0 - 218 bytes for Host to printer
248
+ packet << PA1 #Post-amble. Length: 1 byte. Value: 05H.
249
+ packet << Frame.bcc(packet[1..-1])#Control sum (0000H-FFFFH). Length: 4 bytes. Value of each byte: 30H-3FH
250
+ packet << ETX #Terminator. Length: 1 byte. Value: 03H.
251
+ end
252
+ end
253
+
254
+ def paper_cut
255
+ device.session('Paper Cut') do |s|
256
+ s.push build_packet(Printer::PAPER_CUT)
257
+ end
258
+ end
259
+
260
+ def human_status_errors(status) #6 bytes status
261
+ status_0 = status[0].ord
262
+ errors.add :base, "Fiscal Device General Error" unless (status_0 & 0x20).zero?
263
+ errors.add :base, "Invalid Command" unless (status_0 & 0x02).zero?
264
+ errors.add :base, "Date & Time Not Set" unless (status_0 & 0x04).zero?
265
+ errors.add :base, "Syntax Error" unless (status_0 & 0x01).zero?
266
+ status_1 = status[1].ord
267
+ errors.add :base, "Unpermitted Command In This Mode" unless (status_1 & 0x02).zero?
268
+ errors.add :base, "Field Overflow" unless (status_1 & 0x01).zero?
269
+ end
270
+
271
+ private
272
+ def build_sale_data(item)
273
+ "".b.tap() do |data|
274
+ data << item.text1.truncate(30) unless item.text1.blank?
275
+ data << "\x0a#{text2}" unless item.text2.blank?
276
+ data << "\t"
277
+ data << TAX_GROUPS_MAP[item.tax_group || 2]
278
+ data << ("%.2f" % item.price)
279
+ data << "*#{item.qty.to_s}" unless item.qty.blank?
280
+ data << ",#{item.percent}" unless item.percent.blank?
281
+ data << ",;#{'%.2f' % item.neto}" unless item.neto.blank?
282
+ end
283
+ end
284
+
285
+ def sequence_number(increment = true)
286
+ @seq ||= 0x1f
287
+ @seq += 1 if increment
288
+ @seq = 0x1f if @seq == 0x7f
289
+ @seq
290
+ end
291
+
292
+ class Frame
293
+ include ActiveModel::Validations
294
+ attr_reader :frame, :len, :seq, :cmd, :data, :status, :bcc
295
+
296
+ validates_presence_of :frame#, unless: :unpacked?
297
+ validate :bcc_validation
298
+ validate :len_validation
299
+
300
+ def initialize(buffer)
301
+ if match = buffer.match(/\x01(.{1})(.{1})(.{1})(.*)\x04(.{6})\x05(.{4})\x03/nm)
302
+ @frame = match.to_a.first
303
+ @len, @seq, @cmd, @data, @status, @bcc = match.captures
304
+ else
305
+ if buffer[/^\x16+$/] # only ACKs
306
+ @ack = true
307
+ elsif buffer.index("\x15")
308
+ @nak = true
309
+ end
310
+ end
311
+ end
312
+
313
+ def ack?; !!@ack; end #should wait, response is yet to come
314
+
315
+ def nak?; !!@nak; end #should retry command with same seq
316
+
317
+ private
318
+
319
+ def unpacked? # is it packed or unpacked message?
320
+ @ack || @nak
321
+ end
322
+
323
+ def bcc_validation
324
+ unless unpacked? || frame.blank?
325
+ calc_bcc = self.class.bcc frame[1..-6]
326
+ errors.add(:bcc, I18n.t('errors.messages.invalid')) if bcc != calc_bcc
327
+ end
328
+ end
329
+
330
+ def len_validation
331
+ unless unpacked? || frame.blank?
332
+ errors.add(:len, I18n.t('errors.messages.invalid')) if frame.nil? || len.ord != (frame[1..-6].length + 0x20)
333
+ end
334
+ end
335
+
336
+ class << self
337
+ def bcc(buffer)
338
+ sum = 0
339
+ buffer.each_byte do |byte|
340
+ sum += byte
341
+ end
342
+ "".tap() do |bcc|
343
+ 4.times do |halfbyte|
344
+ bcc.insert 0, (0x30 + ((sum >> (halfbyte*4)) & 0x0f)).chr
345
+ end
346
+ end
347
+ end
348
+ end
349
+ end
350
+
351
+ end
352
+ end
@@ -241,10 +241,10 @@ module Extface
241
241
  def build_packet(cmd, data = "")
242
242
  "".b.tap() do |packet|
243
243
  packet << STX #Preamble. 1 byte long. Value: 01H.
244
- packet << 0x20 + 4 + data.length #Number of bytes from <01> preamble (excluded) to <05> (included) plus the fixed offset of 20H
244
+ packet << 0x20 + 4 + data.b.length #Number of bytes from <01> preamble (excluded) to <05> (included) plus the fixed offset of 20H
245
245
  packet << sequence_number #Sequence number of the frame. Length : 1 byte. Value: 20H – FFH.
246
246
  packet << cmd #Length: 1 byte. Value: 20H - 7FH.
247
- packet << data #Length: 0 - 218 bytes for Host to printer
247
+ packet << data.b #Length: 0 - 218 bytes for Host to printer
248
248
  packet << PA1 #Post-amble. Length: 1 byte. Value: 05H.
249
249
  packet << Frame.bcc(packet[1..-1])#Control sum (0000H-FFFFH). Length: 4 bytes. Value of each byte: 30H-3FH
250
250
  packet << ETX #Terminator. Length: 1 byte. Value: 03H.
@@ -270,8 +270,8 @@ module Extface
270
270
 
271
271
  private
272
272
  def build_sale_data(item)
273
- "".tap() do |data|
274
- data << item.text1 unless item.text1.blank?
273
+ "".b.tap() do |data|
274
+ data << item.text1.truncate(30) unless item.text1.blank?
275
275
  data << "\x0a#{text2}" unless item.text2.blank?
276
276
  data << "\t"
277
277
  data << TAX_GROUPS_MAP[item.tax_group || 2]
@@ -349,4 +349,4 @@ module Extface
349
349
  end
350
350
 
351
351
  end
352
- end
352
+ end
@@ -0,0 +1,12 @@
1
+
2
+ <%= button_to 'Paper Cut', fiscal_device_path(@device), remote: true, name: :paper_cut, value: true, class: 'btn btn-warning' %>
3
+
4
+ <%= button_to 'Non Fiscal Test', fiscal_device_path(@device), remote: true, name: :non_fiscal_test, value: true, class: 'btn btn-warning' %>
5
+
6
+ <%= button_to 'Fiscal Test', fiscal_device_path(@device), remote: true, name: :fiscal_test, value: true, class: 'btn btn-warning' %>
7
+
8
+ <%= button_to 'X Report', fiscal_device_path(@device), remote: true, name: :x_report, value: true, class: 'btn btn-warning' %>
9
+ <%= button_to 'Z Report', fiscal_device_path(@device), remote: true, name: :z_report, value: true, class: 'btn btn-warning' %>
10
+
11
+ <%= button_to 'Cancel Fiscal Doc', fiscal_device_path(@device), remote: true, name: :cancel_fiscal_doc, value: true, class: 'btn btn-danger' %>
12
+
@@ -1,3 +1,3 @@
1
1
  module Extface
2
- VERSION = "0.5.9"
2
+ VERSION = "0.6.0"
3
3
  end
Binary file
@@ -1,61 +1,11 @@
1
- # Logfile created on 2016-08-30 20:10:05 -0400 by logger.rb/44203
2
- D, [2016-08-30T20:10:05.445384 #10681] DEBUG -- : --> 1D 72 49
3
- D, [2016-08-30T20:10:43.555111 #10749] DEBUG -- : --> 1D 72 49
4
- D, [2016-08-30T20:12:21.189809 #10888] DEBUG -- : --> 1D 72 49
5
- D, [2016-08-30T20:12:47.637313 #10956] DEBUG -- : --> 1D 72 49
6
- D, [2016-08-30T20:13:03.193540 #11002] DEBUG -- : --> 1D 72 49
7
- D, [2016-08-30T20:13:04.239676 #11002] DEBUG -- : --> 0D 0A 0D 0A 0D 0A
8
- D, [2016-08-30T20:13:14.243196 #11002] DEBUG -- : --> 0D 0A 0D 0A 0D 0A
9
- D, [2016-08-30T20:13:44.485910 #11097] DEBUG -- : --> 1D 72 49
10
- D, [2016-08-30T20:13:47.566834 #11097] DEBUG -- : --> 0D 0A 0D 0A 0D 0A
11
- D, [2016-08-30T20:13:57.568682 #11097] DEBUG -- : --> 0D 0A 0D 0A 0D 0A
12
- D, [2016-08-30T20:14:16.703247 #11185] DEBUG -- : --> 1D 72 49
13
- D, [2016-08-30T20:15:06.313416 #11278] DEBUG -- : --> 1D 72 49
14
- D, [2016-08-30T20:17:07.375733 #11444] DEBUG -- : --> 1D 72 49
15
- D, [2016-08-30T20:17:24.647971 #11493] DEBUG -- : --> 1D 72 49
16
- D, [2016-08-30T20:18:37.464329 #11616] DEBUG -- : --> 1D 72 49
17
- D, [2016-08-30T20:19:20.679790 #11685] DEBUG -- : --> 1D 72 49
18
- D, [2016-08-30T20:21:02.922394 #11869] DEBUG -- : --> 1D 72 49
19
- D, [2016-08-30T20:21:32.495893 #11940] DEBUG -- : --> 1D 72 49
20
- D, [2016-08-30T20:22:00.172068 #11996] DEBUG -- : --> 1D 72 49
21
- D, [2016-08-30T20:22:30.752293 #12059] DEBUG -- : --> 1D 72 49
22
- D, [2016-08-30T20:23:11.439869 #12131] DEBUG -- : --> 1D 72 49
23
- D, [2016-08-30T20:25:12.466082 #12347] DEBUG -- : --> 1D 72 49
24
- D, [2016-08-30T20:25:13.544813 #12347] DEBUG -- : --> 1D 72 49
25
- D, [2016-08-30T20:25:36.772943 #12409] DEBUG -- : --> 1D 72 49
26
- D, [2016-08-30T20:25:37.826787 #12409] DEBUG -- : --> 1D 72 49
27
- D, [2016-08-30T20:26:08.174733 #12492] DEBUG -- : --> 1D 72 49
28
- D, [2016-08-30T20:26:09.309872 #12492] DEBUG -- : --> 1D 72 49
29
- D, [2016-08-30T20:26:25.326032 #12549] DEBUG -- : --> 1D 72 49
30
- D, [2016-08-30T20:26:26.422158 #12549] DEBUG -- : --> 1D 72 49
31
- D, [2016-08-30T20:30:26.748199 #12939] DEBUG -- : --> 1D 72 49
32
- D, [2016-08-30T20:30:27.768289 #12939] DEBUG -- : --> 0D 0A 0D 0A 0D 0A
33
- D, [2016-08-30T20:30:37.770416 #12939] DEBUG -- : --> 0D 0A 0D 0A 0D 0A
34
- D, [2016-08-30T20:30:47.797936 #12939] DEBUG -- : --> 1D 72 49
35
- D, [2016-08-30T20:30:48.838943 #12939] DEBUG -- : --> 1D 72 49
36
- D, [2016-08-30T20:31:48.872915 #13113] DEBUG -- : --> 1D 72 49
37
- D, [2016-08-30T20:31:49.905292 #13113] DEBUG -- : --> 0D 0A 0D 0A 0D 0A
38
- D, [2016-08-30T20:31:49.912748 #13113] DEBUG -- : --> 1B 69
39
- D, [2016-08-30T20:31:51.017460 #13113] DEBUG -- : --> 1D 72 49
40
- D, [2016-08-30T20:31:52.122170 #13113] DEBUG -- : --> 1D 72 49
41
- D, [2016-08-30T20:32:18.631939 #13201] DEBUG -- : --> 1D 72 49
42
- D, [2016-08-30T20:32:19.685756 #13201] DEBUG -- : --> 0D 0A 0D 0A 0D 0A
43
- D, [2016-08-30T20:32:19.691691 #13201] DEBUG -- : --> 1B 69
44
- D, [2016-08-30T20:32:20.805019 #13201] DEBUG -- : --> 1D 72 49
45
- D, [2016-08-30T20:32:21.901567 #13201] DEBUG -- : --> 1D 72 49
46
- D, [2016-08-30T20:32:58.169297 #13288] DEBUG -- : --> 1D 72 49
47
- D, [2016-08-30T20:32:59.194279 #13288] DEBUG -- : --> 0D 0A 0D 0A 0D 0A
48
- D, [2016-08-30T20:32:59.200145 #13288] DEBUG -- : --> 1B 69
49
- D, [2016-08-30T20:33:00.306228 #13288] DEBUG -- : --> 1D 72 49
50
- D, [2016-08-30T20:33:01.409001 #13288] DEBUG -- : --> 1D 72 49
51
- D, [2016-08-30T20:33:54.473995 #13365] DEBUG -- : --> 1D 72 49
52
- D, [2016-08-30T20:33:55.558490 #13365] DEBUG -- : --> 0D 0A 0D 0A 0D 0A
53
- D, [2016-08-30T20:33:55.564694 #13365] DEBUG -- : --> 1B 69
54
- D, [2016-08-30T20:33:57.764655 #13365] DEBUG -- : --> 1D 72 49
55
- D, [2016-08-30T20:34:07.768330 #13365] DEBUG -- : --> 1D 72 49
56
- D, [2016-08-30T20:34:59.749887 #13488] DEBUG -- : --> 1D 72 49
57
- D, [2016-08-30T20:35:09.752793 #13488] DEBUG -- : --> 1D 72 49
58
- D, [2016-08-30T20:35:52.810287 #13603] DEBUG -- : --> 1D 72 49
59
- D, [2016-08-30T20:36:02.812555 #13603] DEBUG -- : --> 1D 72 49
60
- D, [2016-08-30T20:42:42.680478 #14028] DEBUG -- : --> 1D 72 49
61
- D, [2016-08-30T20:42:52.680945 #14028] DEBUG -- : --> 1D 72 49
1
+ # Logfile created on 2017-03-28 20:49:40 -0400 by logger.rb/44203
2
+ D, [2017-03-28T20:49:40.028578 #9345] DEBUG -- : --> 1D 72 49
3
+ D, [2017-03-28T20:49:41.104858 #9345] DEBUG -- : --> 0D 0A 0D 0A 0D 0A
4
+ D, [2017-03-28T20:49:41.110390 #9345] DEBUG -- : --> 1B 69
5
+ D, [2017-03-28T20:49:42.173477 #9345] DEBUG -- : --> 1D 72 49
6
+ D, [2017-03-28T20:49:43.268342 #9345] DEBUG -- : --> 1D 72 49
7
+ D, [2017-03-28T20:51:06.085122 #9490] DEBUG -- : --> 1D 72 49
8
+ D, [2017-03-28T20:51:07.158484 #9490] DEBUG -- : --> 0D 0A 0D 0A 0D 0A
9
+ D, [2017-03-28T20:51:07.161589 #9490] DEBUG -- : --> 1B 69
10
+ D, [2017-03-28T20:51:08.278707 #9490] DEBUG -- : --> 1D 72 49
11
+ D, [2017-03-28T20:51:09.379386 #9490] DEBUG -- : --> 1D 72 49