From 629e90938c2be1764c3ceec621431bf4698915d5 Mon Sep 17 00:00:00 2001 From: chrys87 Date: Fri, 14 Jul 2017 13:14:04 +0200 Subject: [PATCH] Update charmapTTY.py --- play zone/charmapTTY.py | 149 ++++++++++++++++++++-------------------- 1 file changed, 76 insertions(+), 73 deletions(-) diff --git a/play zone/charmapTTY.py b/play zone/charmapTTY.py index 3761274d..c3dca7bc 100755 --- a/play zone/charmapTTY.py +++ b/play zone/charmapTTY.py @@ -1,81 +1,84 @@ -#!/bin/python3 -#attrib: -#http://rampex.ihep.su/Linux/linux_howto/html/tutorials/mini/Colour-ls-6.html -#0 = black, 1 = blue, 2 = green, 3 = cyan, 4 = red, 5 = purple, 6 = brown/yellow, 7 = white. -#https://github.com/jwilk/vcsapeek/blob/master/linuxvt.py -#blink = 5 if attr & 1 else 0 -#bold = 1 if attr & 16 else 0 -import fcntl +import time +from fcntl import ioctl from array import array import struct import errno import sys -import time - - - -ttyno = 4 -tty = open('/dev/tty%d' % ttyno, 'rb') -vcs = open('/dev/vcsa%d' % ttyno, 'rb') - -head = vcs.read(4) -rows = int(head[0]) -cols = int(head[1]) - -s = time.time() -GIO_UNIMAP = 0x4B66 -VT_GETHIFONTMASK = 0x560D -himask = array("H", (0,)) -fcntl.ioctl(tty, VT_GETHIFONTMASK, himask) -hichar, = struct.unpack_from("@H", himask) - -sz = 512 -line = '' -while True: - try: - unipairs = array("H", [0]*(2*sz)) - unimapdesc = array("B", struct.pack("@HP", sz, unipairs.buffer_info()[0])) - fcntl.ioctl(tty.fileno(), GIO_UNIMAP, unimapdesc) - break - except IOError as e: - if e.errno != errno.ENOMEM: - raise - sz *= 2 - -tty.close() - -ncodes, = struct.unpack_from("@H", unimapdesc) -utable = struct.unpack_from("@%dH" % (2*ncodes), unipairs) - charmap = {} -for u, b in zip(utable[::2], utable[1::2]): - if charmap.get(b) is None: - charmap[b] = u +def updateCharMap(screen): + ttyno = '4' + tty = open('/dev/tty' + screen, 'rb') + GIO_UNIMAP = 0x4B66 + VT_GETHIFONTMASK = 0x560D + himask = array("H", (0,)) + ioctl(tty, VT_GETHIFONTMASK, himask) + hichar, = struct.unpack_from("@H", himask) + sz = 512 + line = '' + while True: + try: + unipairs = array("H", [0]*(2*sz)) + unimapdesc = array("B", struct.pack("@HP", sz, unipairs.buffer_info()[0])) + ioctl(tty.fileno(), GIO_UNIMAP, unimapdesc) + break + except IOError as e: + if e.errno != errno.ENOMEM: + raise + sz *= 2 + tty.close() + ncodes, = struct.unpack_from("@H", unimapdesc) + utable = struct.unpack_from("@%dH" % (2*ncodes), unipairs) + for u, b in zip(utable[::2], utable[1::2]): + if charmap.get(b) is None: + charmap[b] = chr(u) -allText = [] -allAttrib = [] -for y in range(rows): - lineText = '' - lineAttrib = [] - for x in range(cols): - data = vcs.read(2) - (sh,) = struct.unpack("=H", data) - attr = (sh >> 8) & 0xFF - ch = sh & 0xFF - if hichar == 0x100: - attr >>= 1 - lineAttrib.append(attr) - ink = attr & 0x0F - paper = (attr>>4) & 0x0F - #if (ink != 7) or (paper != 0): - # print(ink,paper) - if sh & hichar: - ch |= 0x100 - lineText += chr(charmap.get(ch, u'?')) - allText.append(lineText) - allAttrib.append(lineAttrib) +def autoDecodeVCSA(allData): + allText = [] + allAttrib = [] + print(time.time() -s ) + for y in range(rows): + lineText = '' + lineAttrib = [] + i = 0 + for x in range(cols): + data = allData[i: i + 2] + if data == b' \x07': + attr = 7 + ink = 7 + paper = 0 + lineAttrib.append(7) + lineText += ' ' + continue + (sh,) = struct.unpack("=H", data) + attr = (sh >> 8) & 0xFF + ch = sh & 0xFF + if hichar == 0x100: + attr >>= 1 + lineAttrib.append(attr) + ink = attr & 0x0F + paper = (attr>>4) & 0x0F + #if (ink != 7) or (paper != 0): + # print(ink,paper) + if sh & hichar: + ch |= 0x100 + try: + lineText += charmap[ch] + except: + lineText += chr('?') + i += 2 + allText.append(lineText) + allAttrib.append(lineAttrib) + return allText, allAttrib -#print(allText) -#print(allAttrib) -print(time.time() -s) +def m(): + s = time.time() + updateCharMap('4') + print(time.time() -s ) + vcsa = open('/dev/vcsa' + '4', 'rb') + head = vcsa.read(4) + rows = int(head[0]) + cols = int(head[1]) + text, attrib = autoDecodeVCSA(vcsa.read()) + print(time.time() -s ) +