serialport_mtp 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/lib/serialport_mtp.rb +352 -0
- metadata +88 -0
- metadata.gz.sig +0 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: df2c9010297a3d6f8745c36a8a1497070a1c3328
|
4
|
+
data.tar.gz: 15c6168b6efe2176135dd43a36795de46583df07
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: b9f377253f514833b0435cfaf332a05c266e1211ac744d8d2b91f83c59a58f1aec8a73c2ec01f1c7321d94b80263dd82f5cbe82870b60a6fc42e6d90411b59a4
|
7
|
+
data.tar.gz: c532bbc26069d612efca340e65958b13ecd5908f3a982c8abfaccee9395a9847a4ef25252c20ca2a9b2d983cb3c072b23760a667383206939d43d14f1c79f81c
|
checksums.yaml.gz.sig
ADDED
Binary file
|
data.tar.gz.sig
ADDED
Binary file
|
@@ -0,0 +1,352 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
# file: serialport_mtp.rb
|
4
|
+
|
5
|
+
# original code at https://github.com/lazyatom/a2_printer
|
6
|
+
|
7
|
+
# This gem can be used with the mini thermal printer, connected via
|
8
|
+
# the TX+RX pins on the Raspberry Pi
|
9
|
+
|
10
|
+
require 'serialport'
|
11
|
+
|
12
|
+
|
13
|
+
class SerialPortMTP
|
14
|
+
|
15
|
+
def initialize(port: "/dev/ttyAMA0", baud_rate: 19200, heat_time: 150)
|
16
|
+
|
17
|
+
#params for serial port
|
18
|
+
@port, @baud_rate, @data_bits, @stop_bits, @parity = port, baud_rate,
|
19
|
+
8, 1, SerialPort::NONE
|
20
|
+
|
21
|
+
@heat_time = heat_time
|
22
|
+
@print_mode = 0
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
def start()
|
27
|
+
|
28
|
+
@serial = SerialPort.new(@port, @baud_rate, @data_bits, @stop_bits, @parity)
|
29
|
+
@serial.sync = true
|
30
|
+
reset()
|
31
|
+
|
32
|
+
heat_interval = 50 # 2 is default from page 23 of datasheet. Controls speed of printing and darkness
|
33
|
+
print_density = 15 # Not sure what the default is. Testing shows the max helps darken text. From page 23.
|
34
|
+
print_break_time = 15 # Not sure what the default is. Testing shows the max helps darken text. From page 23.
|
35
|
+
|
36
|
+
write_bytes(27, 55)
|
37
|
+
write_bytes(7) # Default 64 dots = 8*('7'+1)
|
38
|
+
write_bytes(@heat_time) # Default 80 or 800us
|
39
|
+
write_bytes(heat_interval) # Default 2 or 20us
|
40
|
+
|
41
|
+
# Modify the print density and timeout
|
42
|
+
write_bytes(18, 35)
|
43
|
+
print_setting = (print_density << 4) | print_break_time
|
44
|
+
write_bytes(print_setting) # Combination of print_density and print_break_time
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_page
|
48
|
+
write_bytes(18, 84)
|
49
|
+
end
|
50
|
+
|
51
|
+
# reset printer
|
52
|
+
def reset
|
53
|
+
write_bytes(27, 64)
|
54
|
+
end
|
55
|
+
|
56
|
+
# reset formatting
|
57
|
+
def set_default
|
58
|
+
online
|
59
|
+
normal
|
60
|
+
underline_off
|
61
|
+
justify(:left)
|
62
|
+
set_line_height(32)
|
63
|
+
set_barcode_height(50)
|
64
|
+
end
|
65
|
+
|
66
|
+
# Feeds by the specified number of lines
|
67
|
+
def feed(lines=1)
|
68
|
+
# The datasheet claims sending bytes 27, 100, <x> will work
|
69
|
+
# but it feeds much much more.
|
70
|
+
lines.times { write(10) }
|
71
|
+
end
|
72
|
+
|
73
|
+
# Feeds by the specified number of rows of pixels
|
74
|
+
def feed_rows(rows)
|
75
|
+
write_bytes(27, 74, rows)
|
76
|
+
end
|
77
|
+
|
78
|
+
def flush
|
79
|
+
write_bytes(12)
|
80
|
+
end
|
81
|
+
|
82
|
+
def test_page
|
83
|
+
write_bytes(18, 84)
|
84
|
+
end
|
85
|
+
|
86
|
+
def print(string)
|
87
|
+
string.bytes { |b| write(b) }
|
88
|
+
end
|
89
|
+
|
90
|
+
def println(string)
|
91
|
+
print(string + "\n")
|
92
|
+
end
|
93
|
+
|
94
|
+
def write(c)
|
95
|
+
return if (c == 0x13)
|
96
|
+
write_bytes(c)
|
97
|
+
end
|
98
|
+
|
99
|
+
def write_bytes(*bytes)
|
100
|
+
bytes.each { |b| @serial.putc(b) }
|
101
|
+
end
|
102
|
+
|
103
|
+
# Character commands
|
104
|
+
|
105
|
+
INVERSE_MASK = (1 << 1)
|
106
|
+
UPDOWN_MASK = (1 << 2)
|
107
|
+
BOLD_MASK = (1 << 3)
|
108
|
+
DOUBLE_HEIGHT_MASK = (1 << 4)
|
109
|
+
DOUBLE_WIDTH_MASK = (1 << 5)
|
110
|
+
STRIKE_MASK = (1 << 6)
|
111
|
+
|
112
|
+
def set_print_mode(mask)
|
113
|
+
@print_mode |= mask;
|
114
|
+
write_print_mode
|
115
|
+
end
|
116
|
+
|
117
|
+
def unset_print_mode(mask)
|
118
|
+
@print_mode &= ~mask;
|
119
|
+
write_print_mode
|
120
|
+
end
|
121
|
+
|
122
|
+
def write_print_mode
|
123
|
+
write_bytes(27, 33, @print_mode)
|
124
|
+
end
|
125
|
+
|
126
|
+
# This will reset bold, inverse, strikeout, upside down and font size
|
127
|
+
# It does not reset underline, justification or line height
|
128
|
+
def normal
|
129
|
+
@print_mode = 0
|
130
|
+
write_print_mode
|
131
|
+
end
|
132
|
+
|
133
|
+
def inverse_on
|
134
|
+
set_print_mode(INVERSE_MASK)
|
135
|
+
end
|
136
|
+
|
137
|
+
def inverse_off
|
138
|
+
unset_print_mode(INVERSE_MASK)
|
139
|
+
end
|
140
|
+
|
141
|
+
def upside_down_on
|
142
|
+
set_print_mode(UPDOWN_MASK);
|
143
|
+
end
|
144
|
+
|
145
|
+
def upside_down_off
|
146
|
+
unset_print_mode(UPDOWN_MASK);
|
147
|
+
end
|
148
|
+
|
149
|
+
def double_height_on
|
150
|
+
set_print_mode(DOUBLE_HEIGHT_MASK)
|
151
|
+
end
|
152
|
+
|
153
|
+
def double_height_off
|
154
|
+
unset_print_mode(DOUBLE_HEIGHT_MASK)
|
155
|
+
end
|
156
|
+
|
157
|
+
def double_width_on
|
158
|
+
set_print_mode(DOUBLE_WIDTH_MASK)
|
159
|
+
end
|
160
|
+
|
161
|
+
def double_width_off
|
162
|
+
unset_print_mode(DOUBLE_WIDTH_MASK)
|
163
|
+
end
|
164
|
+
|
165
|
+
def strike_on
|
166
|
+
set_print_mode(STRIKE_MASK)
|
167
|
+
end
|
168
|
+
|
169
|
+
def strike_off
|
170
|
+
unset_print_mode(STRIKE_MASK)
|
171
|
+
end
|
172
|
+
|
173
|
+
def bold_on
|
174
|
+
set_print_mode(BOLD_MASK)
|
175
|
+
end
|
176
|
+
|
177
|
+
def bold_off
|
178
|
+
unset_print_mode(BOLD_MASK)
|
179
|
+
end
|
180
|
+
|
181
|
+
def set_size(size)
|
182
|
+
byte = case size
|
183
|
+
when :small
|
184
|
+
0
|
185
|
+
when :medium
|
186
|
+
10
|
187
|
+
when :large
|
188
|
+
25
|
189
|
+
end
|
190
|
+
|
191
|
+
write_bytes(29, 33, byte, 10)
|
192
|
+
end
|
193
|
+
|
194
|
+
# Underlines of different weights can be produced:
|
195
|
+
# 0 - no underline
|
196
|
+
# 1 - normal underline
|
197
|
+
# 2 - thick underline
|
198
|
+
def underline_on(weight=1)
|
199
|
+
write_bytes(27, 45, weight)
|
200
|
+
end
|
201
|
+
|
202
|
+
def underline_off
|
203
|
+
underline_on(0)
|
204
|
+
end
|
205
|
+
|
206
|
+
def justify(position)
|
207
|
+
byte = case position
|
208
|
+
when :left
|
209
|
+
0
|
210
|
+
when :center
|
211
|
+
1
|
212
|
+
when :right
|
213
|
+
2
|
214
|
+
end
|
215
|
+
|
216
|
+
write_bytes(0x1B, 0x61, byte)
|
217
|
+
end
|
218
|
+
|
219
|
+
# Bitmaps
|
220
|
+
|
221
|
+
class Bitmap
|
222
|
+
attr_reader :width, :height
|
223
|
+
|
224
|
+
def initialize(width_or_source, height=nil, source=nil)
|
225
|
+
if height.nil? && source.nil?
|
226
|
+
set_source(width_or_source)
|
227
|
+
extract_width_and_height_from_data
|
228
|
+
else
|
229
|
+
set_source(source)
|
230
|
+
@width = width_or_source
|
231
|
+
@height = height
|
232
|
+
end
|
233
|
+
end
|
234
|
+
|
235
|
+
def each_block
|
236
|
+
row_start = 0
|
237
|
+
width_in_bytes = width / 8
|
238
|
+
while row_start < height do
|
239
|
+
chunk_height = ((height - row_start) > 255) ? 255 : (height - row_start)
|
240
|
+
bytes = (0...(width_in_bytes * chunk_height)).map { @data.getbyte }
|
241
|
+
yield width_in_bytes, chunk_height, bytes
|
242
|
+
row_start += 255
|
243
|
+
end
|
244
|
+
end
|
245
|
+
|
246
|
+
private
|
247
|
+
|
248
|
+
def set_source(source)
|
249
|
+
if source.respond_to?(:getbyte)
|
250
|
+
@data = source
|
251
|
+
else
|
252
|
+
@data = StringIO.new(source.map(&:chr).join)
|
253
|
+
end
|
254
|
+
end
|
255
|
+
|
256
|
+
def extract_width_and_height_from_data
|
257
|
+
tmp = @data.getbyte
|
258
|
+
@width = (@data.getbyte << 8) + tmp
|
259
|
+
tmp = @data.getbyte
|
260
|
+
@height = (@data.getbyte << 8) + tmp
|
261
|
+
end
|
262
|
+
end
|
263
|
+
|
264
|
+
def print_bitmap(*args)
|
265
|
+
bitmap = Bitmap.new(*args)
|
266
|
+
return if (bitmap.width > 384) # maximum width of the printer
|
267
|
+
bitmap.each_block do |w, h, bytes|
|
268
|
+
write_bytes(18, 42)
|
269
|
+
write_bytes(h, w)
|
270
|
+
write_bytes(*bytes)
|
271
|
+
end
|
272
|
+
end
|
273
|
+
|
274
|
+
# def print_bitmap(stream)
|
275
|
+
# tmp = stream.getbyte
|
276
|
+
# width = (stream.getbyte << 8) + tmp
|
277
|
+
#
|
278
|
+
# tmp = stream.getbyte
|
279
|
+
# height = (stream.getbyte << 8) + tmp
|
280
|
+
#
|
281
|
+
# print_bitmap(width, height, stream)
|
282
|
+
# end
|
283
|
+
|
284
|
+
# Barcodes
|
285
|
+
|
286
|
+
def set_barcode_height(val)
|
287
|
+
# default is 50
|
288
|
+
write_bytes(29, 104, val)
|
289
|
+
end
|
290
|
+
|
291
|
+
UPC_A = 0
|
292
|
+
UPC_E = 1
|
293
|
+
EAN13 = 2
|
294
|
+
EAN8 = 3
|
295
|
+
CODE39 = 4
|
296
|
+
I25 = 5
|
297
|
+
CODEBAR = 6
|
298
|
+
CODE93 = 7
|
299
|
+
CODE128 = 8
|
300
|
+
CODE11 = 9
|
301
|
+
MSI = 10
|
302
|
+
|
303
|
+
def print_barcode(text, type)
|
304
|
+
write_bytes(29, 107, type) # set the type first
|
305
|
+
text.bytes { |b| write(b) }
|
306
|
+
write(0) # Terminator
|
307
|
+
end
|
308
|
+
|
309
|
+
# Take the printer offline. Print commands sent after this will be
|
310
|
+
# ignored until `online` is called
|
311
|
+
def offline
|
312
|
+
write_bytes(27, 61, 0)
|
313
|
+
end
|
314
|
+
|
315
|
+
# Take the printer back online. Subsequent print commands will be
|
316
|
+
# obeyed.
|
317
|
+
def online
|
318
|
+
write_bytes(27, 61, 1)
|
319
|
+
end
|
320
|
+
|
321
|
+
# Put the printer into a low-energy state immediately
|
322
|
+
def sleep
|
323
|
+
sleep_after(0)
|
324
|
+
end
|
325
|
+
|
326
|
+
# Put the printer into a low-energy state after the given number
|
327
|
+
# of seconds
|
328
|
+
def sleep_after(seconds)
|
329
|
+
write_bytes(27, 56, seconds)
|
330
|
+
end
|
331
|
+
|
332
|
+
# Wake the printer from a low-energy state. This command will wait
|
333
|
+
# for 50ms (as directed by the datasheet) before allowing further
|
334
|
+
# commands to be send.
|
335
|
+
def wake
|
336
|
+
write_bytes(255)
|
337
|
+
# delay(50) # ?
|
338
|
+
end
|
339
|
+
|
340
|
+
# ==== not working? ====
|
341
|
+
def tab
|
342
|
+
write(9)
|
343
|
+
end
|
344
|
+
|
345
|
+
def set_char_spacing(spacing)
|
346
|
+
write_bytes(27, 32, 0, 10)
|
347
|
+
end
|
348
|
+
|
349
|
+
def set_line_height(val=32)
|
350
|
+
write_bytes(27, 51, val) # default is 32
|
351
|
+
end
|
352
|
+
end
|
metadata
ADDED
@@ -0,0 +1,88 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: serialport_mtp
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- James Robertson
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain:
|
11
|
+
- |
|
12
|
+
-----BEGIN CERTIFICATE-----
|
13
|
+
MIIDljCCAn6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBIMRIwEAYDVQQDDAlnZW1t
|
14
|
+
YXN0ZXIxHjAcBgoJkiaJk/IsZAEZFg5qYW1lc3JvYmVydHNvbjESMBAGCgmSJomT
|
15
|
+
8ixkARkWAmV1MB4XDTE1MDgyNzIwMTY0MloXDTE2MDgyNjIwMTY0MlowSDESMBAG
|
16
|
+
A1UEAwwJZ2VtbWFzdGVyMR4wHAYKCZImiZPyLGQBGRYOamFtZXNyb2JlcnRzb24x
|
17
|
+
EjAQBgoJkiaJk/IsZAEZFgJldTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
|
18
|
+
ggEBALq5jZZxDbWp3izaWWYocJ9F6Ll4pNzBpFwxZLVH1QFqr6rP8x+ouwJ1od18
|
19
|
+
1hgqfIq5r8CdiZhhrnEBYC6Sq6ivxwhm6oDUFPg8G+mZM4h9KHX7sX+NNDLNTwsR
|
20
|
+
NRAEM1UjvSeLfnmKButZTRtR36wShfy2vqxtAWCQ1LwKTtRAOo7S+GNetGXb7wRC
|
21
|
+
qa+qLeqvUKof9vLDgiKCKH92KLzf/Tcf8UpJ1KYmMuBWw/V8EeGi89SQrzPlMFij
|
22
|
+
GG+x73l8uvuiMh9qc1W3PzKHD/YZocU+2XytVhXDufEI73IC7Ln7uMhBkfjdF1HI
|
23
|
+
AJ9Ejnunh5ClrRqlV0t3BClNi90CAwEAAaOBijCBhzAJBgNVHRMEAjAAMAsGA1Ud
|
24
|
+
DwQEAwIEsDAdBgNVHQ4EFgQU2NpW7+cKz3KDK7aGb5GiL5VeyJUwJgYDVR0RBB8w
|
25
|
+
HYEbZ2VtbWFzdGVyQGphbWVzcm9iZXJ0c29uLmV1MCYGA1UdEgQfMB2BG2dlbW1h
|
26
|
+
c3RlckBqYW1lc3JvYmVydHNvbi5ldTANBgkqhkiG9w0BAQUFAAOCAQEAg9y1o8T0
|
27
|
+
sBpmHci6ekn68ELuF5gJx4+PNZahoQEgqznaE7PSRHGE+54MwWPqBEKqHi8E+0nv
|
28
|
+
OrGo0bGFwvd6y4MwuFelygUZjSNUB+PXMnaVp2ghzjpAGLQ4xNwgPpbe4NsvxN5y
|
29
|
+
HngBQup1HF244mZuO94WUm1rBWYv158PgHoyXG5lty406QLwVjpJrP6QU0T9woWX
|
30
|
+
D6AuoZDfWWQkOmwLU3CGC+LIiaz1TBWGAVOd1I0gpGx651LbiU8SyEhNRnIFz0tI
|
31
|
+
MHjXTcOEOj4I+WjeDSWFks3b+3nyfjSyQW3I6DTtwzW6hKMaAQZWgjddCbOsHbof
|
32
|
+
4bxShMp7fn3hMQ==
|
33
|
+
-----END CERTIFICATE-----
|
34
|
+
date: 2015-08-27 00:00:00.000000000 Z
|
35
|
+
dependencies:
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: serialport
|
38
|
+
requirement: !ruby/object:Gem::Requirement
|
39
|
+
requirements:
|
40
|
+
- - "~>"
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: '1.3'
|
43
|
+
- - ">="
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 1.3.1
|
46
|
+
type: :runtime
|
47
|
+
prerelease: false
|
48
|
+
version_requirements: !ruby/object:Gem::Requirement
|
49
|
+
requirements:
|
50
|
+
- - "~>"
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: '1.3'
|
53
|
+
- - ">="
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: 1.3.1
|
56
|
+
description:
|
57
|
+
email: james@r0bertson.co.uk
|
58
|
+
executables: []
|
59
|
+
extensions: []
|
60
|
+
extra_rdoc_files: []
|
61
|
+
files:
|
62
|
+
- lib/serialport_mtp.rb
|
63
|
+
homepage: https://github.com/jrobertson/serialport_mtp
|
64
|
+
licenses:
|
65
|
+
- MIT
|
66
|
+
metadata: {}
|
67
|
+
post_install_message:
|
68
|
+
rdoc_options: []
|
69
|
+
require_paths:
|
70
|
+
- lib
|
71
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
77
|
+
requirements:
|
78
|
+
- - ">="
|
79
|
+
- !ruby/object:Gem::Version
|
80
|
+
version: '0'
|
81
|
+
requirements: []
|
82
|
+
rubyforge_project:
|
83
|
+
rubygems_version: 2.4.8
|
84
|
+
signing_key:
|
85
|
+
specification_version: 4
|
86
|
+
summary: This gem can be used with the mini thermal printer, connected via the TX+RX
|
87
|
+
pins on the Raspberry Pi
|
88
|
+
test_files: []
|
metadata.gz.sig
ADDED
Binary file
|