94 lines
2.4 KiB
Python
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
|