First commit
This commit is contained in:
commit
550aa7a6d4
734
Adafruit_Thermal.py
Normal file
734
Adafruit_Thermal.py
Normal file
@ -0,0 +1,734 @@
|
|||||||
|
#*************************************************************************
|
||||||
|
# This is a Python library for the Adafruit Thermal Printer.
|
||||||
|
# Pick one up at --> http://www.adafruit.com/products/597
|
||||||
|
# These printers use TTL serial to communicate, 2 pins are required.
|
||||||
|
# IMPORTANT: On 3.3V systems (e.g. Raspberry Pi), use a 10K resistor on
|
||||||
|
# the RX pin (TX on the printer, green wire), or simply leave unconnected.
|
||||||
|
#
|
||||||
|
# Adafruit invests time and resources providing this open source code.
|
||||||
|
# Please support Adafruit and open-source hardware by purchasing products
|
||||||
|
# from Adafruit!
|
||||||
|
#
|
||||||
|
# Written by Limor Fried/Ladyada for Adafruit Industries.
|
||||||
|
# Python port by Phil Burgess for Adafruit Industries.
|
||||||
|
# MIT license, all text above must be included in any redistribution.
|
||||||
|
#*************************************************************************
|
||||||
|
|
||||||
|
# This is pretty much a 1:1 direct Python port of the Adafruit_Thermal
|
||||||
|
# library for Arduino. All methods use the same naming conventions as the
|
||||||
|
# Arduino library, with only slight changes in parameter behavior where
|
||||||
|
# needed. This should simplify porting existing Adafruit_Thermal-based
|
||||||
|
# printer projects to Raspberry Pi, BeagleBone, etc. See printertest.py
|
||||||
|
# for an example.
|
||||||
|
#
|
||||||
|
# One significant change is the addition of the printImage() function,
|
||||||
|
# which ties this to the Python Imaging Library and opens the door to a
|
||||||
|
# lot of cool graphical stuff!
|
||||||
|
#
|
||||||
|
# TO DO:
|
||||||
|
# - Might use standard ConfigParser library to put thermal calibration
|
||||||
|
# settings in a global configuration file (rather than in the library).
|
||||||
|
# - Make this use proper Python library installation procedure.
|
||||||
|
# - Trap errors properly. Some stuff just falls through right now.
|
||||||
|
# - Add docstrings throughout!
|
||||||
|
|
||||||
|
from serial import Serial
|
||||||
|
import time
|
||||||
|
import sys
|
||||||
|
import math
|
||||||
|
|
||||||
|
class Adafruit_Thermal(Serial):
|
||||||
|
|
||||||
|
resumeTime = 0.0
|
||||||
|
byteTime = 0.0
|
||||||
|
dotPrintTime = 0.0
|
||||||
|
dotFeedTime = 0.0
|
||||||
|
prevByte = '\n'
|
||||||
|
column = 0
|
||||||
|
maxColumn = 32
|
||||||
|
charHeight = 24
|
||||||
|
lineSpacing = 8
|
||||||
|
barcodeHeight = 50
|
||||||
|
printMode = 0
|
||||||
|
defaultHeatTime = 200
|
||||||
|
firmwareVersion = 268
|
||||||
|
writeToStdout = False
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
# NEW BEHAVIOR: if no parameters given, output is written
|
||||||
|
# to stdout, to be piped through 'lp -o raw' (old behavior
|
||||||
|
# was to use default port & baud rate).
|
||||||
|
baudrate = 19200
|
||||||
|
if len(args) == 0:
|
||||||
|
self.writeToStdout = True
|
||||||
|
if len(args) == 1:
|
||||||
|
# If only port is passed, use default baud rate.
|
||||||
|
args = [ args[0], baudrate ]
|
||||||
|
elif len(args) == 2:
|
||||||
|
# If both passed, use those values.
|
||||||
|
baudrate = args[1]
|
||||||
|
|
||||||
|
# Firmware is assumed version 2.68. Can override this
|
||||||
|
# with the 'firmware=X' argument, where X is the major
|
||||||
|
# version number * 100 + the minor version number (e.g.
|
||||||
|
# pass "firmware=264" for version 2.64.
|
||||||
|
self.firmwareVersion = kwargs.get('firmware', 268)
|
||||||
|
|
||||||
|
if self.writeToStdout is False:
|
||||||
|
# Calculate time to issue one byte to the printer.
|
||||||
|
# 11 bits (not 8) to accommodate idle, start and
|
||||||
|
# stop bits. Idle time might be unnecessary, but
|
||||||
|
# erring on side of caution here.
|
||||||
|
self.byteTime = 11.0 / float(baudrate)
|
||||||
|
|
||||||
|
Serial.__init__(self, *args, **kwargs)
|
||||||
|
|
||||||
|
# Remainder of this method was previously in begin()
|
||||||
|
|
||||||
|
# The printer can't start receiving data immediately
|
||||||
|
# upon power up -- it needs a moment to cold boot
|
||||||
|
# and initialize. Allow at least 1/2 sec of uptime
|
||||||
|
# before printer can receive data.
|
||||||
|
self.timeoutSet(0.5)
|
||||||
|
|
||||||
|
self.wake()
|
||||||
|
self.reset()
|
||||||
|
|
||||||
|
# Description of print settings from p. 23 of manual:
|
||||||
|
# ESC 7 n1 n2 n3 Setting Control Parameter Command
|
||||||
|
# Decimal: 27 55 n1 n2 n3
|
||||||
|
# max heating dots, heating time, heating interval
|
||||||
|
# n1 = 0-255 Max heat dots, Unit (8dots), Default: 7 (64 dots)
|
||||||
|
# n2 = 3-255 Heating time, Unit (10us), Default: 80 (800us)
|
||||||
|
# n3 = 0-255 Heating interval, Unit (10us), Default: 2 (20us)
|
||||||
|
# The more max heating dots, the more peak current
|
||||||
|
# will cost when printing, the faster printing speed.
|
||||||
|
# The max heating dots is 8*(n1+1). The more heating
|
||||||
|
# time, the more density, but the slower printing
|
||||||
|
# speed. If heating time is too short, blank page
|
||||||
|
# may occur. The more heating interval, the more
|
||||||
|
# clear, but the slower printing speed.
|
||||||
|
|
||||||
|
heatTime = kwargs.get('heattime', self.defaultHeatTime)
|
||||||
|
self.writeBytes(
|
||||||
|
27, # Esc
|
||||||
|
55, # 7 (print settings)
|
||||||
|
11, # Heat dots
|
||||||
|
heatTime, # Lib default
|
||||||
|
40) # Heat interval
|
||||||
|
|
||||||
|
# Description of print density from p. 23 of manual:
|
||||||
|
# DC2 # n Set printing density
|
||||||
|
# Decimal: 18 35 n
|
||||||
|
# D4..D0 of n is used to set the printing density.
|
||||||
|
# Density is 50% + 5% * n(D4-D0) printing density.
|
||||||
|
# D7..D5 of n is used to set the printing break time.
|
||||||
|
# Break time is n(D7-D5)*250us.
|
||||||
|
# (Unsure of default values -- not documented)
|
||||||
|
|
||||||
|
printDensity = 10 # 100%
|
||||||
|
printBreakTime = 2 # 500 uS
|
||||||
|
|
||||||
|
self.writeBytes(
|
||||||
|
18, # DC2
|
||||||
|
35, # Print density
|
||||||
|
(printBreakTime << 5) | printDensity)
|
||||||
|
self.dotPrintTime = 0.03
|
||||||
|
self.dotFeedTime = 0.0021
|
||||||
|
else:
|
||||||
|
self.reset() # Inits some vars
|
||||||
|
|
||||||
|
# Because there's no flow control between the printer and computer,
|
||||||
|
# special care must be taken to avoid overrunning the printer's
|
||||||
|
# buffer. Serial output is throttled based on serial speed as well
|
||||||
|
# as an estimate of the device's print and feed rates (relatively
|
||||||
|
# slow, being bound to moving parts and physical reality). After
|
||||||
|
# an operation is issued to the printer (e.g. bitmap print), a
|
||||||
|
# timeout is set before which any other printer operations will be
|
||||||
|
# suspended. This is generally more efficient than using a delay
|
||||||
|
# in that it allows the calling code to continue with other duties
|
||||||
|
# (e.g. receiving or decoding an image) while the printer
|
||||||
|
# physically completes the task.
|
||||||
|
|
||||||
|
# Sets estimated completion time for a just-issued task.
|
||||||
|
def timeoutSet(self, x):
|
||||||
|
self.resumeTime = time.time() + x
|
||||||
|
|
||||||
|
# Waits (if necessary) for the prior task to complete.
|
||||||
|
def timeoutWait(self):
|
||||||
|
if self.writeToStdout is False:
|
||||||
|
while (time.time() - self.resumeTime) < 0: pass
|
||||||
|
|
||||||
|
# Printer performance may vary based on the power supply voltage,
|
||||||
|
# thickness of paper, phase of the moon and other seemingly random
|
||||||
|
# variables. This method sets the times (in microseconds) for the
|
||||||
|
# paper to advance one vertical 'dot' when printing and feeding.
|
||||||
|
# For example, in the default initialized state, normal-sized text
|
||||||
|
# is 24 dots tall and the line spacing is 32 dots, so the time for
|
||||||
|
# one line to be issued is approximately 24 * print time + 8 * feed
|
||||||
|
# time. The default print and feed times are based on a random
|
||||||
|
# test unit, but as stated above your reality may be influenced by
|
||||||
|
# many factors. This lets you tweak the timing to avoid excessive
|
||||||
|
# delays and/or overrunning the printer buffer.
|
||||||
|
def setTimes(self, p, f):
|
||||||
|
# Units are in microseconds for
|
||||||
|
# compatibility with Arduino library
|
||||||
|
self.dotPrintTime = p / 1000000.0
|
||||||
|
self.dotFeedTime = f / 1000000.0
|
||||||
|
|
||||||
|
# 'Raw' byte-writing method
|
||||||
|
def writeBytes(self, *args):
|
||||||
|
if self.writeToStdout:
|
||||||
|
for arg in args:
|
||||||
|
sys.stdout.write(bytes([arg]))
|
||||||
|
else:
|
||||||
|
for arg in args:
|
||||||
|
self.timeoutWait()
|
||||||
|
self.timeoutSet(len(args) * self.byteTime)
|
||||||
|
super(Adafruit_Thermal, self).write(bytes([arg]))
|
||||||
|
|
||||||
|
# Override write() method to keep track of paper feed.
|
||||||
|
def write(self, *data):
|
||||||
|
for i in range(len(data)):
|
||||||
|
c = data[i]
|
||||||
|
if self.writeToStdout:
|
||||||
|
sys.stdout.write(c)
|
||||||
|
continue
|
||||||
|
if c != 0x13:
|
||||||
|
self.timeoutWait()
|
||||||
|
super(Adafruit_Thermal, self).write(c)
|
||||||
|
d = self.byteTime
|
||||||
|
if ((c == '\n') or
|
||||||
|
(self.column == self.maxColumn)):
|
||||||
|
# Newline or wrap
|
||||||
|
if self.prevByte == '\n':
|
||||||
|
# Feed line (blank)
|
||||||
|
d += ((self.charHeight +
|
||||||
|
self.lineSpacing) *
|
||||||
|
self.dotFeedTime)
|
||||||
|
else:
|
||||||
|
# Text line
|
||||||
|
d += ((self.charHeight *
|
||||||
|
self.dotPrintTime) +
|
||||||
|
(self.lineSpacing *
|
||||||
|
self.dotFeedTime))
|
||||||
|
self.column = 0
|
||||||
|
# Treat wrap as newline
|
||||||
|
# on next pass
|
||||||
|
c = '\n'
|
||||||
|
else:
|
||||||
|
self.column += 1
|
||||||
|
self.timeoutSet(d)
|
||||||
|
self.prevByte = c
|
||||||
|
|
||||||
|
# The bulk of this method was moved into __init__,
|
||||||
|
# but this is left here for compatibility with older
|
||||||
|
# code that might get ported directly from Arduino.
|
||||||
|
def begin(self, heatTime=defaultHeatTime):
|
||||||
|
self.writeBytes(
|
||||||
|
27, # Esc
|
||||||
|
55, # 7 (print settings)
|
||||||
|
11, # Heat dots
|
||||||
|
heatTime,
|
||||||
|
40) # Heat interval
|
||||||
|
|
||||||
|
def reset(self):
|
||||||
|
self.writeBytes(27, 64) # Esc @ = init command
|
||||||
|
self.prevByte = '\n' # Treat as if prior line is blank
|
||||||
|
self.column = 0
|
||||||
|
self.maxColumn = 32
|
||||||
|
self.charHeight = 24
|
||||||
|
self.lineSpacing = 6
|
||||||
|
self.barcodeHeight = 50
|
||||||
|
if self.firmwareVersion >= 264:
|
||||||
|
# Configure tab stops on recent printers
|
||||||
|
self.writeBytes(27, 68) # Set tab stops
|
||||||
|
self.writeBytes( 4, 8, 12, 16) # every 4 columns,
|
||||||
|
self.writeBytes(20, 24, 28, 0) # 0 is end-of-list.
|
||||||
|
|
||||||
|
# Reset text formatting parameters.
|
||||||
|
def setDefault(self):
|
||||||
|
self.online()
|
||||||
|
self.justify('L')
|
||||||
|
self.inverseOff()
|
||||||
|
self.doubleHeightOff()
|
||||||
|
self.setLineHeight(30)
|
||||||
|
self.boldOff()
|
||||||
|
self.underlineOff()
|
||||||
|
self.setBarcodeHeight(50)
|
||||||
|
self.setSize('s')
|
||||||
|
self.setCharset()
|
||||||
|
self.setCodePage()
|
||||||
|
|
||||||
|
def test(self):
|
||||||
|
self.write("Hello world!".encode('cp437', 'ignore'))
|
||||||
|
self.feed(2)
|
||||||
|
|
||||||
|
def testPage(self):
|
||||||
|
self.writeBytes(18, 84)
|
||||||
|
self.timeoutSet(
|
||||||
|
self.dotPrintTime * 24 * 26 +
|
||||||
|
self.dotFeedTime * (6 * 26 + 30))
|
||||||
|
|
||||||
|
def setBarcodeHeight(self, val=50):
|
||||||
|
if val < 1: val = 1
|
||||||
|
self.barcodeHeight = val
|
||||||
|
self.writeBytes(29, 104, val)
|
||||||
|
|
||||||
|
UPC_A = 0
|
||||||
|
UPC_E = 1
|
||||||
|
EAN13 = 2
|
||||||
|
EAN8 = 3
|
||||||
|
CODE39 = 4
|
||||||
|
I25 = 5
|
||||||
|
CODEBAR = 6
|
||||||
|
CODE93 = 7
|
||||||
|
CODE128 = 8
|
||||||
|
CODE11 = 9
|
||||||
|
MSI = 10
|
||||||
|
ITF = 11
|
||||||
|
CODABAR = 12
|
||||||
|
|
||||||
|
def printBarcode(self, text, type):
|
||||||
|
|
||||||
|
newDict = { # UPC codes & values for firmwareVersion >= 264
|
||||||
|
self.UPC_A : 65,
|
||||||
|
self.UPC_E : 66,
|
||||||
|
self.EAN13 : 67,
|
||||||
|
self.EAN8 : 68,
|
||||||
|
self.CODE39 : 69,
|
||||||
|
self.ITF : 70,
|
||||||
|
self.CODABAR : 71,
|
||||||
|
self.CODE93 : 72,
|
||||||
|
self.CODE128 : 73,
|
||||||
|
self.I25 : -1, # NOT IN NEW FIRMWARE
|
||||||
|
self.CODEBAR : -1,
|
||||||
|
self.CODE11 : -1,
|
||||||
|
self.MSI : -1
|
||||||
|
}
|
||||||
|
oldDict = { # UPC codes & values for firmwareVersion < 264
|
||||||
|
self.UPC_A : 0,
|
||||||
|
self.UPC_E : 1,
|
||||||
|
self.EAN13 : 2,
|
||||||
|
self.EAN8 : 3,
|
||||||
|
self.CODE39 : 4,
|
||||||
|
self.I25 : 5,
|
||||||
|
self.CODEBAR : 6,
|
||||||
|
self.CODE93 : 7,
|
||||||
|
self.CODE128 : 8,
|
||||||
|
self.CODE11 : 9,
|
||||||
|
self.MSI : 10,
|
||||||
|
self.ITF : -1, # NOT IN OLD FIRMWARE
|
||||||
|
self.CODABAR : -1
|
||||||
|
}
|
||||||
|
|
||||||
|
if self.firmwareVersion >= 264:
|
||||||
|
n = newDict[type]
|
||||||
|
else:
|
||||||
|
n = oldDict[type]
|
||||||
|
if n == -1: return
|
||||||
|
self.feed(1) # Recent firmware requires this?
|
||||||
|
self.writeBytes(
|
||||||
|
29, 72, 2, # Print label below barcode
|
||||||
|
29, 119, 3, # Barcode width
|
||||||
|
29, 107, n) # Barcode type
|
||||||
|
self.timeoutWait()
|
||||||
|
self.timeoutSet((self.barcodeHeight + 40) * self.dotPrintTime)
|
||||||
|
# Print string
|
||||||
|
if self.firmwareVersion >= 264:
|
||||||
|
# Recent firmware: write length byte + string sans NUL
|
||||||
|
n = len(text)
|
||||||
|
if n > 255: n = 255
|
||||||
|
if self.writeToStdout:
|
||||||
|
sys.stdout.write((chr(n)).encode('cp437', 'ignore'))
|
||||||
|
for i in range(n):
|
||||||
|
sys.stdout.write(text[i].encode('utf-8', 'ignore'))
|
||||||
|
else:
|
||||||
|
super(Adafruit_Thermal, self).write((chr(n)).encode('utf-8', 'ignore'))
|
||||||
|
for i in range(n):
|
||||||
|
super(Adafruit_Thermal,
|
||||||
|
self).write(text[i].encode('utf-8', 'ignore'))
|
||||||
|
else:
|
||||||
|
# Older firmware: write string + NUL
|
||||||
|
if self.writeToStdout:
|
||||||
|
sys.stdout.write(text.encode('utf-8', 'ignore'))
|
||||||
|
else:
|
||||||
|
super(Adafruit_Thermal, self).write(text.encode('utf-8', 'ignore'))
|
||||||
|
self.prevByte = '\n'
|
||||||
|
|
||||||
|
# === Character commands ===
|
||||||
|
|
||||||
|
INVERSE_MASK = (1 << 1) # Not in 2.6.8 firmware (see inverseOn())
|
||||||
|
UPDOWN_MASK = (1 << 2)
|
||||||
|
BOLD_MASK = (1 << 3)
|
||||||
|
DOUBLE_HEIGHT_MASK = (1 << 4)
|
||||||
|
DOUBLE_WIDTH_MASK = (1 << 5)
|
||||||
|
STRIKE_MASK = (1 << 6)
|
||||||
|
|
||||||
|
def setPrintMode(self, mask):
|
||||||
|
self.printMode |= mask
|
||||||
|
self.writePrintMode()
|
||||||
|
if self.printMode & self.DOUBLE_HEIGHT_MASK:
|
||||||
|
self.charHeight = 48
|
||||||
|
else:
|
||||||
|
self.charHeight = 24
|
||||||
|
if self.printMode & self.DOUBLE_WIDTH_MASK:
|
||||||
|
self.maxColumn = 16
|
||||||
|
else:
|
||||||
|
self.maxColumn = 32
|
||||||
|
|
||||||
|
def unsetPrintMode(self, mask):
|
||||||
|
self.printMode &= ~mask
|
||||||
|
self.writePrintMode()
|
||||||
|
if self.printMode & self.DOUBLE_HEIGHT_MASK:
|
||||||
|
self.charHeight = 48
|
||||||
|
else:
|
||||||
|
self.charHeight = 24
|
||||||
|
if self.printMode & self.DOUBLE_WIDTH_MASK:
|
||||||
|
self.maxColumn = 16
|
||||||
|
else:
|
||||||
|
self.maxColumn = 32
|
||||||
|
|
||||||
|
def writePrintMode(self):
|
||||||
|
self.writeBytes(27, 33, self.printMode)
|
||||||
|
|
||||||
|
def normal(self):
|
||||||
|
self.printMode = 0
|
||||||
|
self.writePrintMode()
|
||||||
|
|
||||||
|
def inverseOn(self):
|
||||||
|
if self.firmwareVersion >= 268:
|
||||||
|
self.writeBytes(29, 66, 1)
|
||||||
|
else:
|
||||||
|
self.setPrintMode(self.INVERSE_MASK)
|
||||||
|
|
||||||
|
def inverseOff(self):
|
||||||
|
if self.firmwareVersion >= 268:
|
||||||
|
self.writeBytes(29, 66, 0)
|
||||||
|
else:
|
||||||
|
self.unsetPrintMode(self.INVERSE_MASK)
|
||||||
|
|
||||||
|
def upsideDownOn(self):
|
||||||
|
self.setPrintMode(self.UPDOWN_MASK)
|
||||||
|
|
||||||
|
def upsideDownOff(self):
|
||||||
|
self.unsetPrintMode(self.UPDOWN_MASK)
|
||||||
|
|
||||||
|
def doubleHeightOn(self):
|
||||||
|
self.setPrintMode(self.DOUBLE_HEIGHT_MASK)
|
||||||
|
|
||||||
|
def doubleHeightOff(self):
|
||||||
|
self.unsetPrintMode(self.DOUBLE_HEIGHT_MASK)
|
||||||
|
|
||||||
|
def doubleWidthOn(self):
|
||||||
|
self.setPrintMode(self.DOUBLE_WIDTH_MASK)
|
||||||
|
|
||||||
|
def doubleWidthOff(self):
|
||||||
|
self.unsetPrintMode(self.DOUBLE_WIDTH_MASK)
|
||||||
|
|
||||||
|
def strikeOn(self):
|
||||||
|
self.setPrintMode(self.STRIKE_MASK)
|
||||||
|
|
||||||
|
def strikeOff(self):
|
||||||
|
self.unsetPrintMode(self.STRIKE_MASK)
|
||||||
|
|
||||||
|
def boldOn(self):
|
||||||
|
self.setPrintMode(self.BOLD_MASK)
|
||||||
|
|
||||||
|
def boldOff(self):
|
||||||
|
self.unsetPrintMode(self.BOLD_MASK)
|
||||||
|
|
||||||
|
def justify(self, value):
|
||||||
|
c = value.upper()
|
||||||
|
if c == 'C':
|
||||||
|
pos = 1
|
||||||
|
elif c == 'R':
|
||||||
|
pos = 2
|
||||||
|
else:
|
||||||
|
pos = 0
|
||||||
|
self.writeBytes(0x1B, 0x61, pos)
|
||||||
|
|
||||||
|
# Feeds by the specified number of lines
|
||||||
|
def feed(self, x=1):
|
||||||
|
if self.firmwareVersion >= 264:
|
||||||
|
self.writeBytes(27, 100, x)
|
||||||
|
self.timeoutSet(self.dotFeedTime * self.charHeight)
|
||||||
|
self.prevByte = '\n'
|
||||||
|
self.column = 0
|
||||||
|
|
||||||
|
else:
|
||||||
|
# datasheet claims sending bytes 27, 100, <x> works,
|
||||||
|
# but it feeds much more than that. So, manually:
|
||||||
|
while x > 0:
|
||||||
|
self.write('\n'.encode('cp437', 'ignore'))
|
||||||
|
x -= 1
|
||||||
|
|
||||||
|
# Feeds by the specified number of individual pixel rows
|
||||||
|
def feedRows(self, rows):
|
||||||
|
self.writeBytes(27, 74, rows)
|
||||||
|
self.timeoutSet(rows * dotFeedTime)
|
||||||
|
self.prevByte = '\n'
|
||||||
|
self.column = 0
|
||||||
|
|
||||||
|
def flush(self):
|
||||||
|
self.writeBytes(12) # ASCII FF
|
||||||
|
|
||||||
|
def setSize(self, value):
|
||||||
|
c = value.upper()
|
||||||
|
if c == 'L': # Large: double width and height
|
||||||
|
size = 0x11
|
||||||
|
self.charHeight = 48
|
||||||
|
self.maxColumn = 16
|
||||||
|
elif c == 'M': # Medium: double height
|
||||||
|
size = 0x01
|
||||||
|
self.charHeight = 48
|
||||||
|
self.maxColumn = 32
|
||||||
|
else: # Small: standard width and height
|
||||||
|
size = 0x00
|
||||||
|
self.charHeight = 24
|
||||||
|
self.maxColumn = 32
|
||||||
|
|
||||||
|
self.writeBytes(29, 33, size)
|
||||||
|
prevByte = '\n' # Setting the size adds a linefeed
|
||||||
|
|
||||||
|
# Underlines of different weights can be produced:
|
||||||
|
# 0 - no underline
|
||||||
|
# 1 - normal underline
|
||||||
|
# 2 - thick underline
|
||||||
|
def underlineOn(self, weight=1):
|
||||||
|
if weight > 2: weight = 2
|
||||||
|
self.writeBytes(27, 45, weight)
|
||||||
|
|
||||||
|
def underlineOff(self):
|
||||||
|
self.writeBytes(27, 45, 0)
|
||||||
|
|
||||||
|
def printBitmap(self, w, h, bitmap, LaaT=False):
|
||||||
|
rowBytes = math.floor((w + 7) / 8) # Round up to next byte boundary
|
||||||
|
if rowBytes >= 48:
|
||||||
|
rowBytesClipped = 48 # 384 pixels max width
|
||||||
|
else:
|
||||||
|
rowBytesClipped = rowBytes
|
||||||
|
|
||||||
|
# if LaaT (line-at-a-time) is True, print bitmaps
|
||||||
|
# scanline-at-a-time (rather than in chunks).
|
||||||
|
# This tends to make for much cleaner printing
|
||||||
|
# (no feed gaps) on large images...but has the
|
||||||
|
# opposite effect on small images that would fit
|
||||||
|
# in a single 'chunk', so use carefully!
|
||||||
|
if LaaT: maxChunkHeight = 1
|
||||||
|
else: maxChunkHeight = 255
|
||||||
|
|
||||||
|
i = 0
|
||||||
|
for rowStart in range(0, h, maxChunkHeight):
|
||||||
|
chunkHeight = h - rowStart
|
||||||
|
if chunkHeight > maxChunkHeight:
|
||||||
|
chunkHeight = maxChunkHeight
|
||||||
|
|
||||||
|
# Timeout wait happens here
|
||||||
|
self.writeBytes(18, 42, chunkHeight, rowBytesClipped)
|
||||||
|
|
||||||
|
for y in range(chunkHeight):
|
||||||
|
for x in range(rowBytesClipped):
|
||||||
|
if self.writeToStdout:
|
||||||
|
sys.stdout.write(bytes([bitmap[i]]))
|
||||||
|
else:
|
||||||
|
super(Adafruit_Thermal,
|
||||||
|
self).write(bytes([bitmap[i]]))
|
||||||
|
i += 1
|
||||||
|
i += rowBytes - rowBytesClipped
|
||||||
|
self.timeoutSet(chunkHeight * self.dotPrintTime)
|
||||||
|
|
||||||
|
self.prevByte = '\n'
|
||||||
|
|
||||||
|
# Print Image. Requires Python Imaging Library. This is
|
||||||
|
# specific to the Python port and not present in the Arduino
|
||||||
|
# library. Image will be cropped to 384 pixels width if
|
||||||
|
# necessary, and converted to 1-bit w/diffusion dithering.
|
||||||
|
# For any other behavior (scale, B&W threshold, etc.), use
|
||||||
|
# the Imaging Library to perform such operations before
|
||||||
|
# passing the result to this function.
|
||||||
|
def printImage(self, image_file, LaaT=False):
|
||||||
|
from PIL import Image
|
||||||
|
image = Image.open(image_file)
|
||||||
|
if image.mode != '1':
|
||||||
|
image = image.convert('1')
|
||||||
|
|
||||||
|
width = image.size[0]
|
||||||
|
height = image.size[1]
|
||||||
|
if width > 384:
|
||||||
|
width = 384
|
||||||
|
rowBytes = math.floor((width + 7) / 8)
|
||||||
|
bitmap = bytearray(rowBytes * height)
|
||||||
|
pixels = image.load()
|
||||||
|
|
||||||
|
for y in range(height):
|
||||||
|
n = y * rowBytes
|
||||||
|
x = 0
|
||||||
|
for b in range(rowBytes):
|
||||||
|
sum = 0
|
||||||
|
bit = 128
|
||||||
|
while bit > 0:
|
||||||
|
if x >= width: break
|
||||||
|
if pixels[x, y] == 0:
|
||||||
|
sum |= bit
|
||||||
|
x += 1
|
||||||
|
bit >>= 1
|
||||||
|
bitmap[n + b] = sum
|
||||||
|
|
||||||
|
self.printBitmap(width, height, bitmap, LaaT)
|
||||||
|
|
||||||
|
# Take the printer offline. Print commands sent after this
|
||||||
|
# will be ignored until 'online' is called.
|
||||||
|
def offline(self):
|
||||||
|
self.writeBytes(27, 61, 0)
|
||||||
|
|
||||||
|
# Take the printer online. Subsequent print commands will be obeyed.
|
||||||
|
def online(self):
|
||||||
|
self.writeBytes(27, 61, 1)
|
||||||
|
|
||||||
|
# Put the printer into a low-energy state immediately.
|
||||||
|
def sleep(self):
|
||||||
|
self.sleepAfter(1) # Can't be 0, that means "don't sleep"
|
||||||
|
|
||||||
|
# Put the printer into a low-energy state after
|
||||||
|
# the given number of seconds.
|
||||||
|
def sleepAfter(self, seconds):
|
||||||
|
if self.firmwareVersion >= 264:
|
||||||
|
self.writeBytes(27, 56, seconds & 0xFF, seconds >> 8)
|
||||||
|
else:
|
||||||
|
self.writeBytes(27, 56, seconds)
|
||||||
|
|
||||||
|
def wake(self):
|
||||||
|
self.timeoutSet(0)
|
||||||
|
self.writeBytes(255)
|
||||||
|
if self.firmwareVersion >= 264:
|
||||||
|
time.sleep(0.05) # 50 ms
|
||||||
|
self.writeBytes(27, 118, 0) # Sleep off (important!)
|
||||||
|
else:
|
||||||
|
for i in range(10):
|
||||||
|
self.writeBytes(27)
|
||||||
|
self.timeoutSet(0.1)
|
||||||
|
|
||||||
|
# Empty method, included for compatibility
|
||||||
|
# with existing code ported from Arduino.
|
||||||
|
def listen(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
# Check the status of the paper using the printers self reporting
|
||||||
|
# ability. Doesn't match the datasheet...
|
||||||
|
# Returns True for paper, False for no paper.
|
||||||
|
def hasPaper(self):
|
||||||
|
if self.firmwareVersion >= 264:
|
||||||
|
self.writeBytes(27, 118, 0)
|
||||||
|
else:
|
||||||
|
self.writeBytes(29, 114, 0)
|
||||||
|
# Bit 2 of response seems to be paper status
|
||||||
|
stat = ord(self.read(1)) & 0b00000100
|
||||||
|
# If set, we have paper; if clear, no paper
|
||||||
|
return stat == 0
|
||||||
|
|
||||||
|
def setLineHeight(self, val=32):
|
||||||
|
if val < 24: val = 24
|
||||||
|
self.lineSpacing = val - 24
|
||||||
|
|
||||||
|
# The printer doesn't take into account the current text
|
||||||
|
# height when setting line height, making this more akin
|
||||||
|
# to inter-line spacing. Default line spacing is 32
|
||||||
|
# (char height of 24, line spacing of 8).
|
||||||
|
self.writeBytes(27, 51, val)
|
||||||
|
|
||||||
|
CHARSET_USA = 0
|
||||||
|
CHARSET_FRANCE = 1
|
||||||
|
CHARSET_GERMANY = 2
|
||||||
|
CHARSET_UK = 3
|
||||||
|
CHARSET_DENMARK1 = 4
|
||||||
|
CHARSET_SWEDEN = 5
|
||||||
|
CHARSET_ITALY = 6
|
||||||
|
CHARSET_SPAIN1 = 7
|
||||||
|
CHARSET_JAPAN = 8
|
||||||
|
CHARSET_NORWAY = 9
|
||||||
|
CHARSET_DENMARK2 = 10
|
||||||
|
CHARSET_SPAIN2 = 11
|
||||||
|
CHARSET_LATINAMERICA = 12
|
||||||
|
CHARSET_KOREA = 13
|
||||||
|
CHARSET_SLOVENIA = 14
|
||||||
|
CHARSET_CROATIA = 14
|
||||||
|
CHARSET_CHINA = 15
|
||||||
|
|
||||||
|
# Alters some chars in ASCII 0x23-0x7E range; see datasheet
|
||||||
|
def setCharset(self, val=0):
|
||||||
|
if val > 15: val = 15
|
||||||
|
self.writeBytes(27, 82, val)
|
||||||
|
|
||||||
|
CODEPAGE_CP437 = 0 # USA, Standard Europe
|
||||||
|
CODEPAGE_KATAKANA = 1
|
||||||
|
CODEPAGE_CP850 = 2 # Multilingual
|
||||||
|
CODEPAGE_CP860 = 3 # Portuguese
|
||||||
|
CODEPAGE_CP863 = 4 # Canadian-French
|
||||||
|
CODEPAGE_CP865 = 5 # Nordic
|
||||||
|
CODEPAGE_WCP1251 = 6 # Cyrillic
|
||||||
|
CODEPAGE_CP866 = 7 # Cyrillic #2
|
||||||
|
CODEPAGE_MIK = 8 # Cyrillic/Bulgarian
|
||||||
|
CODEPAGE_CP755 = 9 # East Europe, Latvian 2
|
||||||
|
CODEPAGE_IRAN = 10
|
||||||
|
CODEPAGE_CP862 = 15 # Hebrew
|
||||||
|
CODEPAGE_WCP1252 = 16 # Latin 1
|
||||||
|
CODEPAGE_WCP1253 = 17 # Greek
|
||||||
|
CODEPAGE_CP852 = 18 # Latin 2
|
||||||
|
CODEPAGE_CP858 = 19 # Multilingual Latin 1 + Euro
|
||||||
|
CODEPAGE_IRAN2 = 20
|
||||||
|
CODEPAGE_LATVIAN = 21
|
||||||
|
CODEPAGE_CP864 = 22 # Arabic
|
||||||
|
CODEPAGE_ISO_8859_1 = 23 # West Europe
|
||||||
|
CODEPAGE_CP737 = 24 # Greek
|
||||||
|
CODEPAGE_WCP1257 = 25 # Baltic
|
||||||
|
CODEPAGE_THAI = 26
|
||||||
|
CODEPAGE_CP720 = 27 # Arabic
|
||||||
|
CODEPAGE_CP855 = 28
|
||||||
|
CODEPAGE_CP857 = 29 # Turkish
|
||||||
|
CODEPAGE_WCP1250 = 30 # Central Europe
|
||||||
|
CODEPAGE_CP775 = 31
|
||||||
|
CODEPAGE_WCP1254 = 32 # Turkish
|
||||||
|
CODEPAGE_WCP1255 = 33 # Hebrew
|
||||||
|
CODEPAGE_WCP1256 = 34 # Arabic
|
||||||
|
CODEPAGE_WCP1258 = 35 # Vietnam
|
||||||
|
CODEPAGE_ISO_8859_2 = 36 # Latin 2
|
||||||
|
CODEPAGE_ISO_8859_3 = 37 # Latin 3
|
||||||
|
CODEPAGE_ISO_8859_4 = 38 # Baltic
|
||||||
|
CODEPAGE_ISO_8859_5 = 39 # Cyrillic
|
||||||
|
CODEPAGE_ISO_8859_6 = 40 # Arabic
|
||||||
|
CODEPAGE_ISO_8859_7 = 41 # Greek
|
||||||
|
CODEPAGE_ISO_8859_8 = 42 # Hebrew
|
||||||
|
CODEPAGE_ISO_8859_9 = 43 # Turkish
|
||||||
|
CODEPAGE_ISO_8859_15 = 44 # Latin 3
|
||||||
|
CODEPAGE_THAI2 = 45
|
||||||
|
CODEPAGE_CP856 = 46
|
||||||
|
CODEPAGE_CP874 = 47
|
||||||
|
|
||||||
|
# Selects alt symbols for 'upper' ASCII values 0x80-0xFF
|
||||||
|
def setCodePage(self, val=0):
|
||||||
|
if val > 47: val = 47
|
||||||
|
self.writeBytes(27, 116, val)
|
||||||
|
|
||||||
|
# Copied from Arduino lib for parity; may not work on all printers
|
||||||
|
def tab(self):
|
||||||
|
self.writeBytes(9)
|
||||||
|
self.column = (self.column + 4) & 0xFC
|
||||||
|
|
||||||
|
# Copied from Arduino lib for parity; may not work on all printers
|
||||||
|
def setCharSpacing(self, spacing):
|
||||||
|
self.writeBytes(27, 32, spacing)
|
||||||
|
|
||||||
|
# Overloading print() in Python pre-3.0 is dirty pool,
|
||||||
|
# but these are here to provide more direct compatibility
|
||||||
|
# with existing code written for the Arduino library.
|
||||||
|
def print(self, *args, **kwargs):
|
||||||
|
for arg in args:
|
||||||
|
self.write((str(arg)).encode('cp437', 'ignore'))
|
||||||
|
|
||||||
|
# For Arduino code compatibility again
|
||||||
|
def println(self, *args, **kwargs):
|
||||||
|
for arg in args:
|
||||||
|
self.write((str(arg)).encode('cp437', 'ignore'))
|
||||||
|
self.write('\n'.encode('cp437', 'ignore'))
|
||||||
|
|
75
QuantumDeathMachine.py
Executable file
75
QuantumDeathMachine.py
Executable file
@ -0,0 +1,75 @@
|
|||||||
|
|
||||||
|
from Adafruit_Thermal import *
|
||||||
|
from qiskit import QuantumCircuit, execute, Aer, IBMQ
|
||||||
|
import qiskit as q
|
||||||
|
from qiskit.tools.monitor import job_monitor, backend_overview
|
||||||
|
from qiskit.providers.ibmq import least_busy
|
||||||
|
import time
|
||||||
|
import warnings
|
||||||
|
|
||||||
|
warnings.filterwarnings("ignore")
|
||||||
|
|
||||||
|
|
||||||
|
DeathList = ["Bees","Sour milk","Natural Causes","Monsters from\nthe Deep","In space,\nAlone","In Sleep","Peacefully","Pooping","Furnace","Rollercoaster","Extreme cold","Bear","Heat death of\nthe universe","Goose attack","sneezing","Boat accident"]
|
||||||
|
|
||||||
|
provider = IBMQ.load_account() #load account from disk
|
||||||
|
|
||||||
|
qc = q.QuantumCircuit(4,4) #5 qubits 5 classical bits
|
||||||
|
qc.h(0)
|
||||||
|
qc.h(1)
|
||||||
|
qc.h(2)
|
||||||
|
qc.h(3)
|
||||||
|
#qc.h(4)
|
||||||
|
qc.measure([0, 1, 2, 3],[0, 1, 2, 3])
|
||||||
|
|
||||||
|
print("\nAll backends overview:\n")
|
||||||
|
backend_overview()
|
||||||
|
|
||||||
|
backend = least_busy(provider.backends(n_qubits=5, operational=True, simulator=False))
|
||||||
|
print("\nLeast busy 5-qubit backend:", backend.name())
|
||||||
|
#backend = provider.get_backend('ibmq_belem')
|
||||||
|
|
||||||
|
shots = 1
|
||||||
|
job = execute(qc, backend, shots=shots, memory=True)
|
||||||
|
job_monitor(job)
|
||||||
|
result = job.result()
|
||||||
|
dice=result.get_memory(qc)
|
||||||
|
|
||||||
|
print("Received qubits: " + dice[0])
|
||||||
|
print("Quantum dice roll result: " + str(int(dice[0],2)))
|
||||||
|
time.sleep(4)
|
||||||
|
printer = Adafruit_Thermal("/dev/serial0", 9600, timeout=5)
|
||||||
|
printer.wake()
|
||||||
|
|
||||||
|
print("Printing Result..")
|
||||||
|
printer.justify('C')
|
||||||
|
printer.feed(1)
|
||||||
|
printer.setSize('L') # Set type size, accepts 'S', 'M', 'L'
|
||||||
|
#printer.println("---------------")
|
||||||
|
printer.setSize('M')
|
||||||
|
printer.println("This is how")
|
||||||
|
printer.setSize('L')
|
||||||
|
printer.println("YOU DIE")
|
||||||
|
import gfx.arrow as arrow
|
||||||
|
printer.printBitmap(arrow.width, arrow.height, arrow.data)
|
||||||
|
#printer.println("---------------")
|
||||||
|
printer.setSize("L")
|
||||||
|
#printer.justify('L')
|
||||||
|
#printer.feed(1)
|
||||||
|
printer.println("---------------")
|
||||||
|
#printer.println(DeathList[0])
|
||||||
|
printer.println(DeathList[(int(dice[0],2))])
|
||||||
|
printer.println("---------------")
|
||||||
|
#printer.println("Old Age,\nSurrounded by\nLoved Ones")
|
||||||
|
#printer.println("\uD83D\uDC80")
|
||||||
|
printer.feed(1)
|
||||||
|
printer.setSize("S")
|
||||||
|
printer.print("Your Qubits: ")
|
||||||
|
printer.println(dice)
|
||||||
|
|
||||||
|
printer.feed(3)
|
||||||
|
|
||||||
|
|
||||||
|
printer.sleep() # Tell printer to sleep
|
||||||
|
#printer.wake() # Call wake() before printing again, even if reset
|
||||||
|
printer.setDefault() # Restore printer to defaults
|
BIN
__pycache__/Adafruit_Thermal.cpython-37.pyc
Normal file
BIN
__pycache__/Adafruit_Thermal.cpython-37.pyc
Normal file
Binary file not shown.
BIN
gfx/__pycache__/arrow.cpython-37.pyc
Normal file
BIN
gfx/__pycache__/arrow.cpython-37.pyc
Normal file
Binary file not shown.
113
gfx/arrow.py
Normal file
113
gfx/arrow.py
Normal file
@ -0,0 +1,113 @@
|
|||||||
|
width = 216
|
||||||
|
height = 64
|
||||||
|
data = [
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x07, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x07, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07,
|
||||||
|
0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x03, 0x00, 0x07, 0xFE, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80,
|
||||||
|
0x07, 0xFE, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xC0, 0x07, 0xFE, 0x00, 0x3C, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x07, 0xFE, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
|
||||||
|
0xF0, 0x07, 0xFE, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF8, 0x07, 0xFE, 0x01, 0xFC,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFC, 0x07, 0xFE, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x03, 0xFE, 0x07, 0xFE, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x07, 0xFE, 0x0F,
|
||||||
|
0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x87, 0xFE, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x03, 0xFF, 0xC7, 0xFE, 0x3F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xE7, 0xFE,
|
||||||
|
0x7F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xF7, 0xFE, 0xFF, 0xFC, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F,
|
||||||
|
0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x03, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xF8, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x7F, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xC0,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
||||||
|
]
|
||||||
|
|
Loading…
Reference in New Issue
Block a user