Différences
Ci-dessous, les différences entre deux révisions de la page.
Prochaine révision | Révision précédente | ||
jules_verne [2016/02/18 22:38] guiaum créée |
jules_verne [2016/03/04 08:08] (Version actuelle) |
||
---|---|---|---|
Ligne 9: | Ligne 9: | ||
/usr/bin/python /home/pi/git/py-thermal-printer/codex.py | /usr/bin/python /home/pi/git/py-thermal-printer/codex.py | ||
- | -> le script python: | + | **-> le script python:** |
- | -> dans le clavier en kapla, un arduino Leonardo: | + | #!/usr/bin/env python |
+ | #coding=utf-8 | ||
+ | |||
+ | import serial, struct, time | ||
+ | |||
+ | # to read key on unix | ||
+ | import os | ||
+ | import sys | ||
+ | import termios | ||
+ | import tty | ||
+ | |||
+ | # to print, ... ha ha ha | ||
+ | import Image, ImageDraw | ||
+ | |||
+ | import os.path | ||
+ | |||
+ | #===========================================================# | ||
+ | # RASPBERRY PI (tested with Raspbian Jan 2012): | ||
+ | # - Ensure that ttyAMA0 is not used for serial console access: | ||
+ | # edit /boot/cmdline.txt (remove all name-value pairs containing | ||
+ | # ttyAMA0) and comment out last line in /etc/inittab. | ||
+ | # - Fix user permissions with "sudo usermod -a -G dialout pi" | ||
+ | # - Reboot | ||
+ | # - Ensure that the SERIALPORT setting is correct below | ||
+ | # | ||
+ | # BEAGLE BONE: | ||
+ | # Mux settings (Ängström 2012.05, also work on ubuntu 12.04): | ||
+ | # echo 1 > /sys/kernel/debug/omap_mux/spi0_sclk | ||
+ | # echo 1 > /sys/kernel/debug/omap_mux/spi0_d0 | ||
+ | #===========================================================# | ||
+ | |||
+ | print "Première ligne du script" | ||
+ | |||
+ | class ThermalPrinter(object): | ||
+ | """ | ||
+ | |||
+ | Thermal printing library that controls the "micro panel thermal printer" sold in | ||
+ | shops like Adafruit and Sparkfun (e.g. http://www.adafruit.com/products/597). | ||
+ | Mostly ported from Ladyada's Arduino library | ||
+ | (https://github.com/adafruit/Adafruit-Thermal-Printer-Library) to run on | ||
+ | BeagleBone and Raspberry Pi. | ||
+ | |||
+ | Currently handles printing image data and text, but the rest of the | ||
+ | built-in functionality like underlining and barcodes are trivial | ||
+ | to port to Python when needed. | ||
+ | |||
+ | If on BeagleBone or similar device, remember to set the mux settings | ||
+ | or change the UART you are using. See the beginning of this file for | ||
+ | default setup. | ||
+ | |||
+ | Thanks to Matt Richardson for the initial pointers on controlling the | ||
+ | device via Python. | ||
+ | |||
+ | @author: Lauri Kainulainen | ||
+ | |||
+ | """ | ||
+ | |||
+ | # default serial port for the Beagle Bone | ||
+ | #SERIALPORT = '/dev/ttyO2' | ||
+ | # this might work better on a Raspberry Pi | ||
+ | SERIALPORT = '/dev/ttyAMA0' | ||
+ | |||
+ | BAUDRATE = 19200 | ||
+ | TIMEOUT = 10 | ||
+ | |||
+ | # pixels with more color value (average for multiple channels) are counted as white | ||
+ | # tweak this if your images appear too black or too white | ||
+ | black_threshold = 64 | ||
+ | # pixels with less alpha than this are counted as white | ||
+ | alpha_threshold = 127 | ||
+ | |||
+ | printer = None | ||
+ | |||
+ | _ESC = chr(27) | ||
+ | |||
+ | # These values (including printDensity and printBreaktime) are taken from | ||
+ | # lazyatom's Adafruit-Thermal-Library branch and seem to work nicely with bitmap | ||
+ | # images. Changes here can cause symptoms like images printing out as random text. | ||
+ | # Play freely, but remember the working values. | ||
+ | # https://github.com/adafruit/Adafruit-Thermal-Printer-Library/blob/0cc508a9566240e5e5bac0fa28714722875cae69/Thermal.cpp | ||
+ | |||
+ | # Set "max heating dots", "heating time", "heating interval" | ||
+ | # n1 = 0-255 Max printing 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. | ||
+ | |||
+ | def __init__(self, heatTime=80, heatInterval=2, heatingDots=7, serialport=SERIALPORT): | ||
+ | print "Init Started" | ||
+ | self.printer = serial.Serial(serialport, self.BAUDRATE, timeout=self.TIMEOUT) | ||
+ | self.printer.write(self._ESC) # ESC - command | ||
+ | self.printer.write(chr(64)) # @ - initialize | ||
+ | self.printer.write(self._ESC) # ESC - command | ||
+ | self.printer.write(chr(55)) # 7 - print settings | ||
+ | self.printer.write(chr(heatingDots)) # Heating dots (20=balance of darkness vs no jams) default = 20 | ||
+ | self.printer.write(chr(heatTime)) # heatTime Library default = 255 (max) | ||
+ | self.printer.write(chr(heatInterval)) # Heat interval (500 uS = slower, but darker) default = 250 | ||
+ | |||
+ | # Description of print density from page 23 of the 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. | ||
+ | printDensity = 15 # 120% (? can go higher, text is darker but fuzzy) | ||
+ | printBreakTime = 15 # 500 uS | ||
+ | self.printer.write(chr(18)) | ||
+ | self.printer.write(chr(35)) | ||
+ | self.printer.write(chr((printDensity << 4) | printBreakTime)) | ||
+ | |||
+ | def offline(self): | ||
+ | # Take the printer offline. Print commands sent after this will be | ||
+ | # ignored until 'online' is called. | ||
+ | self.printer.write(self._ESC) | ||
+ | self.printer.write(chr(61)) | ||
+ | self.printer.write(chr(0)) | ||
+ | |||
+ | def online(self): | ||
+ | # Take the printer back online. Subsequent print commands will be obeyed. | ||
+ | self.printer.write(self._ESC) | ||
+ | self.printer.write(chr(61)) | ||
+ | self.printer.write(chr(1)) | ||
+ | |||
+ | def sleep(self): | ||
+ | # Put the printer into a low-energy state immediately. | ||
+ | self.sleep_after(1) # Can't be 0, that means 'don't sleep' | ||
+ | |||
+ | def sleep_after(self, seconds): | ||
+ | # Put the printer into a low-energy state after the given number | ||
+ | # of seconds. | ||
+ | if seconds: | ||
+ | time.sleep(seconds) | ||
+ | self.printer.write(self._ESC) | ||
+ | self.printer.write(chr(56)) | ||
+ | self.printer.write(chr(seconds)) | ||
+ | self.printer.write(chr(seconds >> 8)) | ||
+ | |||
+ | def wake(self): | ||
+ | # Wake the printer from a low-energy state. | ||
+ | self.printer.write(chr(255)) | ||
+ | time.sleep(0.05) | ||
+ | self.printer.write(self._ESC) | ||
+ | self.printer.write(chr(56)) | ||
+ | self.printer.write(chr(0)) | ||
+ | self.printer.write(chr(0)) | ||
+ | |||
+ | def has_paper(self): | ||
+ | # Check the status of the paper using the printer's self reporting | ||
+ | # ability. SerialTX _must_ be connected! | ||
+ | self.printer.write(self._ESC) | ||
+ | self.printer.write(chr(118)) | ||
+ | self.printer.write(chr(0)) | ||
+ | status = -1 | ||
+ | if self.printer.inWaiting() > 0: | ||
+ | ret = self.printer.read() | ||
+ | if ret: | ||
+ | status = struct.unpack('b', ret)[0] | ||
+ | return bool(status & 0b00000100) | ||
+ | |||
+ | def reset(self): | ||
+ | self.printer.write(self._ESC) | ||
+ | self.printer.write(chr(64)) | ||
+ | |||
+ | def linefeed(self): | ||
+ | self.printer.write(chr(10)) | ||
+ | |||
+ | def justify(self, align="L"): | ||
+ | pos = 0 | ||
+ | if align == "L": | ||
+ | pos = 0 | ||
+ | elif align == "C": | ||
+ | pos = 1 | ||
+ | elif align == "R": | ||
+ | pos = 2 | ||
+ | self.printer.write(self._ESC) | ||
+ | self.printer.write(chr(97)) | ||
+ | self.printer.write(chr(pos)) | ||
+ | |||
+ | def bold_off(self): | ||
+ | self.printer.write(self._ESC) | ||
+ | self.printer.write(chr(69)) | ||
+ | self.printer.write(chr(0)) | ||
+ | |||
+ | def bold_on(self): | ||
+ | self.printer.write(self._ESC) | ||
+ | self.printer.write(chr(69)) | ||
+ | self.printer.write(chr(1)) | ||
+ | |||
+ | def font_b_off(self): | ||
+ | self.printer.write(self._ESC) | ||
+ | self.printer.write(chr(33)) | ||
+ | self.printer.write(chr(0)) | ||
+ | |||
+ | def font_b_on(self): | ||
+ | self.printer.write(self._ESC) | ||
+ | self.printer.write(chr(33)) | ||
+ | self.printer.write(chr(1)) | ||
+ | |||
+ | def underline_off(self): | ||
+ | self.printer.write(self._ESC) | ||
+ | self.printer.write(chr(45)) | ||
+ | self.printer.write(chr(0)) | ||
+ | |||
+ | def underline_on(self): | ||
+ | self.printer.write(self._ESC) | ||
+ | self.printer.write(chr(45)) | ||
+ | self.printer.write(chr(1)) | ||
+ | |||
+ | def inverse_off(self): | ||
+ | self.printer.write(chr(29)) | ||
+ | self.printer.write(chr(66)) | ||
+ | self.printer.write(chr(0)) | ||
+ | |||
+ | def inverse_on(self): | ||
+ | self.printer.write(chr(29)) | ||
+ | self.printer.write(chr(66)) | ||
+ | self.printer.write(chr(1)) | ||
+ | |||
+ | def upsidedown_off(self): | ||
+ | self.printer.write(self._ESC) | ||
+ | self.printer.write(chr(123)) | ||
+ | self.printer.write(chr(0)) | ||
+ | |||
+ | def upsidedown_on(self): | ||
+ | self.printer.write(self._ESC) | ||
+ | self.printer.write(chr(123)) | ||
+ | self.printer.write(chr(1)) | ||
+ | |||
+ | def barcode_chr(self, msg): | ||
+ | self.printer.write(chr(29)) # Leave | ||
+ | self.printer.write(chr(72)) # Leave | ||
+ | self.printer.write(msg) # Print barcode # 1:Abovebarcode 2:Below 3:Both 0:Not printed | ||
+ | |||
+ | def barcode_height(self, msg): | ||
+ | self.printer.write(chr(29)) # Leave | ||
+ | self.printer.write(chr(104)) # Leave | ||
+ | self.printer.write(msg) # Value 1-255 Default 50 | ||
+ | |||
+ | def barcode_height(self): | ||
+ | self.printer.write(chr(29)) # Leave | ||
+ | self.printer.write(chr(119)) # Leave | ||
+ | self.printer.write(chr(2)) # Value 2,3 Default 2 | ||
+ | |||
+ | def barcode(self, msg): | ||
+ | """ Please read http://www.adafruit.com/datasheets/A2-user%20manual.pdf | ||
+ | for information on how to use barcodes. """ | ||
+ | # CODE SYSTEM, NUMBER OF CHARACTERS | ||
+ | # 65=UPC-A 11,12 #71=CODEBAR >1 | ||
+ | # 66=UPC-E 11,12 #72=CODE93 >1 | ||
+ | # 67=EAN13 12,13 #73=CODE128 >1 | ||
+ | # 68=EAN8 7,8 #74=CODE11 >1 | ||
+ | # 69=CODE39 >1 #75=MSI >1 | ||
+ | # 70=I25 >1 EVEN NUMBER | ||
+ | self.printer.write(chr(29)) # LEAVE | ||
+ | self.printer.write(chr(107)) # LEAVE | ||
+ | self.printer.write(chr(65)) # USE ABOVE CHART | ||
+ | self.printer.write(chr(12)) # USE CHART NUMBER OF CHAR | ||
+ | self.printer.write(msg) | ||
+ | |||
+ | def print_text(self, msg, chars_per_line=None): | ||
+ | """ Print some text defined by msg. If chars_per_line is defined, | ||
+ | inserts newlines after the given amount. Use normal '\n' line breaks for | ||
+ | empty lines. """ | ||
+ | if chars_per_line == None: | ||
+ | self.printer.write(msg) | ||
+ | else: | ||
+ | l = list(msg) | ||
+ | le = len(msg) | ||
+ | for i in xrange(chars_per_line + 1, le, chars_per_line + 1): | ||
+ | l.insert(i, '\n') | ||
+ | self.printer.write("".join(l)) | ||
+ | print "".join(l) | ||
+ | |||
+ | def print_markup(self, markup): | ||
+ | """ Print text with markup for styling. | ||
+ | |||
+ | Keyword arguments: | ||
+ | markup -- text with a left column of markup as follows: | ||
+ | first character denotes style (n=normal, b=bold, u=underline, i=inverse, f=font B) | ||
+ | second character denotes justification (l=left, c=centre, r=right) | ||
+ | third character must be a space, followed by the text of the line. | ||
+ | """ | ||
+ | lines = markup.splitlines(True) | ||
+ | for l in lines: | ||
+ | style = l[0] | ||
+ | justification = l[1].upper() | ||
+ | text = l[3:] | ||
+ | |||
+ | if style == 'b': | ||
+ | self.bold_on() | ||
+ | elif style == 'u': | ||
+ | self.underline_on() | ||
+ | elif style == 'i': | ||
+ | self.inverse_on() | ||
+ | elif style == 'f': | ||
+ | self.font_b_on() | ||
+ | |||
+ | self.justify(justification) | ||
+ | self.print_text(text) | ||
+ | if justification != 'L': | ||
+ | self.justify() | ||
+ | |||
+ | if style == 'b': | ||
+ | self.bold_off() | ||
+ | elif style == 'u': | ||
+ | self.underline_off() | ||
+ | elif style == 'i': | ||
+ | self.inverse_off() | ||
+ | elif style == 'f': | ||
+ | self.font_b_off() | ||
+ | |||
+ | def convert_pixel_array_to_binary(self, pixels, w, h): | ||
+ | """ Convert the pixel array into a black and white plain list of 1's and 0's | ||
+ | width is enforced to 384 and padded with white if needed. """ | ||
+ | black_and_white_pixels = [1] * 384 * h | ||
+ | if w > 384: | ||
+ | print "Bitmap width too large: %s. Needs to be under 384" % w | ||
+ | return False | ||
+ | elif w < 384: | ||
+ | print "Bitmap under 384 (%s), padding the rest with white" % w | ||
+ | |||
+ | print "Bitmap size", w | ||
+ | |||
+ | if type(pixels[0]) == int: # single channel | ||
+ | print " => single channel" | ||
+ | for i, p in enumerate(pixels): | ||
+ | if p < self.black_threshold: | ||
+ | black_and_white_pixels[i % w + i / w * 384] = 0 | ||
+ | else: | ||
+ | black_and_white_pixels[i % w + i / w * 384] = 1 | ||
+ | elif type(pixels[0]) in (list, tuple) and len(pixels[0]) == 3: # RGB | ||
+ | print " => RGB channel" | ||
+ | for i, p in enumerate(pixels): | ||
+ | if sum(p[0:2]) / 3.0 < self.black_threshold: | ||
+ | black_and_white_pixels[i % w + i / w * 384] = 0 | ||
+ | else: | ||
+ | black_and_white_pixels[i % w + i / w * 384] = 1 | ||
+ | elif type(pixels[0]) in (list, tuple) and len(pixels[0]) == 4: # RGBA | ||
+ | print " => RGBA channel" | ||
+ | for i, p in enumerate(pixels): | ||
+ | if sum(p[0:2]) / 3.0 < self.black_threshold and p[3] > self.alpha_threshold: | ||
+ | black_and_white_pixels[i % w + i / w * 384] = 0 | ||
+ | else: | ||
+ | black_and_white_pixels[i % w + i / w * 384] = 1 | ||
+ | else: | ||
+ | print "Unsupported pixels array type. Please send plain list (single channel, RGB or RGBA)" | ||
+ | print "Type pixels[0]", type(pixels[0]), "haz", pixels[0] | ||
+ | return False | ||
+ | |||
+ | return black_and_white_pixels | ||
+ | |||
+ | |||
+ | def print_bitmap(self, pixels, w, h, output_png=False): | ||
+ | """ Best to use images that have a pixel width of 384 as this corresponds | ||
+ | to the printer row width. | ||
+ | |||
+ | pixels = a pixel array. RGBA, RGB, or one channel plain list of values (ranging from 0-255). | ||
+ | w = width of image | ||
+ | h = height of image | ||
+ | if "output_png" is set, prints an "print_bitmap_output.png" in the same folder using the same | ||
+ | thresholds as the actual printing commands. Useful for seeing if there are problems with the | ||
+ | original image (this requires PIL). | ||
+ | |||
+ | Example code with PIL: | ||
+ | import Image, ImageDraw | ||
+ | i = Image.open("lammas_grayscale-bw.png") | ||
+ | data = list(i.getdata()) | ||
+ | w, h = i.size | ||
+ | p.print_bitmap(data, w, h) | ||
+ | """ | ||
+ | counter = 0 | ||
+ | if output_png: | ||
+ | import Image, ImageDraw | ||
+ | test_img = Image.new('RGB', (384, h)) | ||
+ | draw = ImageDraw.Draw(test_img) | ||
+ | |||
+ | self.linefeed() | ||
+ | |||
+ | black_and_white_pixels = self.convert_pixel_array_to_binary(pixels, w, h) | ||
+ | print_bytes = [] | ||
+ | |||
+ | # read the bytes into an array | ||
+ | for rowStart in xrange(0, h, 256): | ||
+ | chunkHeight = 255 if (h - rowStart) > 255 else h - rowStart | ||
+ | print_bytes += (18, 42, chunkHeight, 48) | ||
+ | |||
+ | for i in xrange(0, 48 * chunkHeight, 1): | ||
+ | # read one byte in | ||
+ | byt = 0 | ||
+ | for xx in xrange(8): | ||
+ | pixel_value = black_and_white_pixels[counter] | ||
+ | counter += 1 | ||
+ | # check if this is black | ||
+ | if pixel_value == 0: | ||
+ | byt += 1 << (7 - xx) | ||
+ | if output_png: draw.point((counter % 384, round(counter / 384)), fill=(0, 0, 0)) | ||
+ | # it's white | ||
+ | else: | ||
+ | if output_png: draw.point((counter % 384, round(counter / 384)), fill=(255, 255, 255)) | ||
+ | |||
+ | print_bytes.append(byt) | ||
+ | |||
+ | # output the array all at once to the printer | ||
+ | # might be better to send while printing when dealing with | ||
+ | # very large arrays... | ||
+ | for b in print_bytes: | ||
+ | self.printer.write(chr(b)) | ||
+ | |||
+ | if output_png: | ||
+ | test_print = open('print-output.png', 'wb') | ||
+ | test_img.save(test_print, 'PNG') | ||
+ | print "output saved to %s" % test_print.name | ||
+ | test_print.close() | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | def getKey(): | ||
+ | fd = sys.stdin.fileno() | ||
+ | old = termios.tcgetattr(fd) | ||
+ | new = termios.tcgetattr(fd) | ||
+ | new[3] = new[3] & ~termios.ICANON & ~termios.ECHO | ||
+ | new[6][termios.VMIN] = 1 | ||
+ | new[6][termios.VTIME] = 0 | ||
+ | termios.tcsetattr(fd, termios.TCSANOW, new) | ||
+ | key = None | ||
+ | try: | ||
+ | key = os.read(fd, 3) | ||
+ | finally: | ||
+ | termios.tcsetattr(fd, termios.TCSAFLUSH, old) | ||
+ | return key | ||
+ | |||
+ | def PrintImage( ImageName) : | ||
+ | i = Image.open( ImageName) | ||
+ | data = list(i.getdata()) | ||
+ | w, h = i.size | ||
+ | p.print_bitmap(data, w, h, False) | ||
+ | p.linefeed() | ||
+ | p.linefeed() | ||
+ | p.linefeed() | ||
+ | |||
+ | if __name__ == '__main__': | ||
+ | import sys, os | ||
+ | |||
+ | |||
+ | |||
+ | if len(sys.argv) == 2: | ||
+ | serialport = sys.argv[1] | ||
+ | print "point d'arrêt n°1" | ||
+ | else: | ||
+ | serialport = ThermalPrinter.SERIALPORT | ||
+ | print "point d'arrêt n°2" | ||
+ | if not os.path.exists(serialport): | ||
+ | sys.exit("ERROR: Serial port not found at: %s" % serialport) | ||
+ | |||
+ | print "Testing printer on port %s" % serialport | ||
+ | |||
+ | p = ThermalPrinter(serialport=serialport) | ||
+ | |||
+ | p.print_text("\nLes Voyages typo-graphiques\n") | ||
+ | p.print_text("\nde Jules Verne\n") | ||
+ | |||
+ | # runtime dependency on Python Imaging Library | ||
+ | |||
+ | ImgArrays = { 'A':'/home/pi/git/py-thermal-printer/pics/VT_Codex_Thermique_A.png' | ||
+ | , 'B':'/home/pi/git/py-thermal-printer/pics/VT_Codex_Thermique_B.png' | ||
+ | , 'C':'/home/pi/git/py-thermal-printer/pics/VT_Codex_Thermique_C.png' | ||
+ | , 'D':'/home/pi/git/py-thermal-printer/pics/VT_Codex_Thermique_D.png' | ||
+ | , 'E':'/home/pi/git/py-thermal-printer/pics/VT_Codex_Thermique_E.png' | ||
+ | , 'F':'/home/pi/git/py-thermal-printer/pics/VT_Codex_Thermique_F.png' | ||
+ | , 'G':'/home/pi/git/py-thermal-printer/pics/VT_Codex_Thermique_G.png' | ||
+ | , 'H':'/home/pi/git/py-thermal-printer/pics/VT_Codex_Thermique_H.png' | ||
+ | , 'I':'/home/pi/git/py-thermal-printer/pics/VT_Codex_Thermique_I.png' | ||
+ | , 'J':'/home/pi/git/py-thermal-printer/pics/VT_Codex_Thermique_J.png' | ||
+ | , 'K':'/home/pi/git/py-thermal-printer/pics/VT_Codex_Thermique_K.png' | ||
+ | , 'L':'/home/pi/git/py-thermal-printer/pics/VT_Codex_Thermique_L.png' | ||
+ | , 'M':'/home/pi/git/py-thermal-printer/pics/VT_Codex_Thermique_M.png' | ||
+ | , 'N':'/home/pi/git/py-thermal-printer/pics/VT_Codex_Thermique_N.png' | ||
+ | , 'O':'/home/pi/git/py-thermal-printer/pics/VT_Codex_Thermique_O.png' | ||
+ | , 'P':'/home/pi/git/py-thermal-printer/pics/VT_Codex_Thermique_P.png' | ||
+ | , 'Q':'/home/pi/git/py-thermal-printer/pics/VT_Codex_Thermique_Q.png' | ||
+ | , 'R':'/home/pi/git/py-thermal-printer/pics/VT_Codex_Thermique_R.png' | ||
+ | , 'S':'/home/pi/git/py-thermal-printer/pics/VT_Codex_Thermique_S.png' | ||
+ | , 'T':'/home/pi/git/py-thermal-printer/pics/VT_Codex_Thermique_T.png' | ||
+ | , 'U':'/home/pi/git/py-thermal-printer/pics/VT_Codex_Thermique_U.png' | ||
+ | , 'V':'/home/pi/git/py-thermal-printer/pics/VT_Codex_Thermique_V.png' | ||
+ | , 'W':'/home/pi/git/py-thermal-printer/pics/VT_Codex_Thermique_W.png' | ||
+ | , 'X':'/home/pi/git/py-thermal-printer/pics/VT_Codex_Thermique_X.png' | ||
+ | , 'Y':'/home/pi/git/py-thermal-printer/pics/VT_Codex_Thermique_Y.png' | ||
+ | , 'Z':'/home/pi/git/py-thermal-printer/pics/VT_Codex_Thermique_Z.png' | ||
+ | , '0':'/home/pi/git/py-thermal-printer/pics/VT_Codex_Thermique_0.png' | ||
+ | , '1':'/home/pi/git/py-thermal-printer/pics/VT_Codex_Thermique_1.png' | ||
+ | , '2':'/home/pi/git/py-thermal-printer/pics/VT_Codex_Thermique_2.png' | ||
+ | , '3':'/home/pi/git/py-thermal-printer/pics/VT_Codex_Thermique_3.png' | ||
+ | , '4':'/home/pi/git/py-thermal-printer/pics/VT_Codex_Thermique_4.png' | ||
+ | , '5':'/home/pi/git/py-thermal-printer/pics/VT_Codex_Thermique_5.png' | ||
+ | , '6':'/home/pi/git/py-thermal-printer/pics/VT_Codex_Thermique_6.png' | ||
+ | , '7':'/home/pi/git/py-thermal-printer/pics/VT_Codex_Thermique_7.png' | ||
+ | , '8':'/home/pi/git/py-thermal-printer/pics/VT_Codex_Thermique_8.png' | ||
+ | , '9':'/home/pi/git/py-thermal-printer/pics/VT_Codex_Thermique_9.png' | ||
+ | , ' ':'/home/pi/git/py-thermal-printer/pics/VT_Codex_Thermique_00_Espace.png' | ||
+ | } | ||
+ | |||
+ | ch='' | ||
+ | Cnt=0; | ||
+ | while ch != '&': | ||
+ | |||
+ | ch = getKey() | ||
+ | if(('\n' == ch) or ('\r' == ch)): | ||
+ | Cnt = 0 | ||
+ | # return char won't print | ||
+ | elif(0 == Cnt): | ||
+ | Cnt = 1 | ||
+ | # will print, next will not | ||
+ | else: | ||
+ | Cnt = 0 | ||
+ | ch = '\n' | ||
+ | # won't print next will print | ||
+ | if ch in ImgArrays : | ||
+ | ImageName = ImgArrays[ch] | ||
+ | if os.path.isfile(ImageName): | ||
+ | # print('for %s printing %s' % (ch, ImageName)) | ||
+ | PrintImage( ImageName); | ||
+ | # else : | ||
+ | # print('for %s do not find %s' % (ch, ImageName)) | ||
+ | # else : | ||
+ | # print(' no pics defined for %s ... sniff'% ch) | ||
+ | |||
+ | |||
+ | |||
+ | ** | ||
+ | |||
+ | -> dans le clavier en kapla, un arduino Leonardo:** | ||