firmware/misc/gpu/make_barcode.py
Peter D. Gray b50afff4a1
tidy
2023-12-14 11:16:08 -05:00

94 lines
2.4 KiB
Python

#!/usr/bin/env python3
#
# Render a little barcode we need for selftest process.
#
# - packed bytes
#
import barcode
from io import BytesIO
from barcode import Code128
from barcode.writer import ImageWriter
class Packer(barcode.writer.BaseWriter):
# api in <../../ENV/lib/python3.10/site-packages/barcode/writer.py>
def __init__(self):
super().__init__(initialize=self.do_init,
paint_module=self.paint, paint_text=self.do_text, finish=self.do_fin)
def do_init(self, code):
# the answer I want is given to init function: binary for black/white sections
assert len(code) == 1, 'not a list?'
code = code[0]
if len(code) % 2:
code += '0'
while (len(code) % 8) != 0:
code = f'0{code}0'
#code = code.replace('0', '00').replace('1', '11') # double it up
code = code.replace('0', '000').replace('1', '111') # 3X
#code = code.replace('0', '0000').replace('1', '1111') # 4X
# pad to 320 pixels (div 8) (centered)
while len(code) < 320:
code = f'0000{code}0000'
# convert to bytes
self.result = int(code, 2).to_bytes(len(code)//8, 'big')
def do_text(self, *unused):
pass
def paint(self, xpos, ypos, width, color):
#print(f'paint: pos={xpos},{ypos} w={width} c={color}')
pass
def do_fin(self):
return self.result
def doit(ofile='barcode.h'):
# contents of barcode
if 0:
# works, but overkill and reads better if simpler
version = None
with open('version.h') as fd:
for ln in fd:
if 'RELEASE_VERSION' in ln:
version = eval(ln.split()[-1])
break
assert version
msg = f'GPU={version}'
msg = f'GPU'
bc = Code128(msg, writer=Packer())
rv = bc.render()
#bc2 = Code128(msg, writer=ImageWriter())
#bc2.write('check.png')
#print(f'Result: {rv.hex()} len={len(rv)}')
assert len(rv) * 8 <= 320, 'too wide to fit on screen'
assert len(rv) == 40, 'expected 320 pixels'
enc = rv.hex(' ', 1).replace(' ', ', 0x')
with open(ofile, 'wt') as fd:
fd.write(f'''// autogen file, see make_barcode.py
// in python: {repr(rv)}
static const uint8_t test_barcode[{len(rv)}] = {{
0x{enc}
}};
// EOF''')
print(f"Updated: {ofile}")
if __name__ == '__main__':
doit()
# EOF