initial commit
This commit is contained in:
324
latex/appendix.tex
Normal file
324
latex/appendix.tex
Normal file
@@ -0,0 +1,324 @@
|
||||
\appendix
|
||||
|
||||
\chapter{Python code base display module}
|
||||
\label{app:base_py}
|
||||
|
||||
\textbf{\emph{All figures, \LaTeX\ and Python files are available on the dedicated \hreffn{https://github.com/LordBaryhobal/5D\_Heredero\_Louis\_TM2022}{GitHub repository}}}
|
||||
|
||||
\vspace{12pt}
|
||||
|
||||
This module is used by the other generator scripts to display codes.
|
||||
|
||||
\begin{tcolorbox}[breakable,colback=white,title=base.py]
|
||||
\begin{minted}{python}
|
||||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
This module provides a base class to display codes and enable saving
|
||||
|
||||
(C) 2022 Louis Heredero louis.heredero@edu.vs.ch
|
||||
"""
|
||||
|
||||
import pygame
|
||||
|
||||
class Base:
|
||||
def __init__(self, width, height, caption):
|
||||
pygame.init()
|
||||
|
||||
pygame.display.set_caption(caption)
|
||||
self.w = pygame.display.set_mode([width, height])
|
||||
|
||||
self.controls([
|
||||
"CTRL + S: save as",
|
||||
"ESC: quit"
|
||||
])
|
||||
|
||||
def controls(self, controls, margin=2):
|
||||
longest = max(list(map(len, controls))+[10])
|
||||
print("┌─" + "─"*(longest+margin) + "─┐")
|
||||
|
||||
_ = "\x1b[1;4mControls:\x1b[0m"
|
||||
_ += " "*(longest+margin-9)
|
||||
print(f"│ " + _ + " │")
|
||||
for c in controls:
|
||||
print("│ " + " "*margin + c.ljust(longest) + " │")
|
||||
print("└─" + "─"*(longest+margin) + "─┘")
|
||||
|
||||
def main(self):
|
||||
pygame.display.flip()
|
||||
|
||||
stop = False
|
||||
while not stop:
|
||||
event = pygame.event.wait()
|
||||
# ESC or close button -> quit
|
||||
if event.type == pygame.QUIT:
|
||||
stop = True
|
||||
|
||||
elif event.type == pygame.KEYDOWN:
|
||||
if event.key == pygame.K_ESCAPE:
|
||||
stop = True
|
||||
|
||||
# CTRL+S -> save image
|
||||
elif event.key == pygame.K_s and \
|
||||
event.mod & pygame.KMOD_CTRL:
|
||||
self.save()
|
||||
|
||||
def save(self):
|
||||
path = input("Save as: ")
|
||||
pygame.image.save(self.w, path)
|
||||
\end{minted}
|
||||
\end{tcolorbox}
|
||||
|
||||
\chapter{Code 39 python implementation}
|
||||
\label{app:code39_py}
|
||||
|
||||
\begin{tcolorbox}[breakable,colback=white,title=code39.py]
|
||||
\begin{minted}{python}
|
||||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
This module can generate Code-39 barcodes
|
||||
|
||||
(C) 2022 Louis Heredero louis.heredero@edu.vs.ch
|
||||
"""
|
||||
|
||||
import pygame
|
||||
|
||||
code39_dict = {
|
||||
"A": "100001001", "B": "001001001",
|
||||
"C": "101001000", "D": "000011001",
|
||||
"E": "100011000", "F": "001011000",
|
||||
"G": "000001101", "H": "100001100",
|
||||
"I": "001001100", "J": "000011100",
|
||||
"K": "100000011", "L": "001000011",
|
||||
"M": "101000010", "N": "000010011",
|
||||
"O": "100010010", "P": "001010010",
|
||||
"Q": "000000111", "R": "100000110",
|
||||
"S": "001000110", "T": "000010110",
|
||||
"U": "110000001", "V": "011000001",
|
||||
"W": "111000000", "X": "010010001",
|
||||
"Y": "110010000", "Z": "011010000",
|
||||
"0": "000110100", "1": "100100001",
|
||||
"2": "001100001", "3": "101100000",
|
||||
"4": "000110001", "5": "100110000",
|
||||
"6": "001110000", "7": "000100101",
|
||||
"8": "100100100", "9": "001100100",
|
||||
" ": "011000100", "-": "010000101",
|
||||
"$": "010101000", "%": "000101010",
|
||||
".": "110000100", "/": "010100010",
|
||||
"+": "010001010", "*": "010010100"
|
||||
}
|
||||
|
||||
def code39(text):
|
||||
text = text.upper()
|
||||
text = list(map(lambda c: code39_dict[c], text))
|
||||
return "0".join(text)
|
||||
|
||||
def draw_barcode(barcode, win):
|
||||
barcode = list(map(int, barcode))
|
||||
width = win.get_width()*0.8
|
||||
height = win.get_height()*0.5
|
||||
thicks = sum(barcode)
|
||||
thins = len(barcode)-thicks
|
||||
bar_w = width/(thicks*2+thins)
|
||||
|
||||
win.fill((255,255,255))
|
||||
x = win.get_width()*0.1
|
||||
y = win.get_height()*0.25
|
||||
|
||||
for i, c in enumerate(barcode):
|
||||
w = 2*bar_w if c else bar_w
|
||||
if i%2 == 0:
|
||||
pygame.draw.rect(win, (0,0,0), [x, y, w, height])
|
||||
|
||||
x += w
|
||||
|
||||
if __name__ == "__main__":
|
||||
import base
|
||||
|
||||
b = base.Base(800, 500, "Code-39 barcode generator")
|
||||
|
||||
barcode = code39("*CODE-39*")
|
||||
draw_barcode(barcode, b.w)
|
||||
|
||||
b.main()
|
||||
\end{minted}
|
||||
\end{tcolorbox}
|
||||
|
||||
\chapter{EAN python implementation}
|
||||
\label{app:ean_py}
|
||||
|
||||
\begin{tcolorbox}[breakable,colback=white,title=ean.py]
|
||||
\begin{minted}{python}
|
||||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
This module can generate EAN-8 and EAN-13 barcodes
|
||||
|
||||
(C) 2022 Louis Heredero louis.heredero@edu.vs.ch
|
||||
"""
|
||||
|
||||
import pygame
|
||||
|
||||
A = [
|
||||
0b0001101,
|
||||
0b0011001,
|
||||
0b0010011,
|
||||
0b0111101,
|
||||
0b0100011,
|
||||
0b0110001,
|
||||
0b0101111,
|
||||
0b0111011,
|
||||
0b0110111,
|
||||
0b0001011
|
||||
]
|
||||
|
||||
# XOR 0b1111111
|
||||
C = list(map(lambda a: a^127, A))
|
||||
|
||||
# Reverse bit order
|
||||
B = list(map(lambda c: int(f"{c:07b}"[::-1],2), C))
|
||||
|
||||
ean13_patterns = [
|
||||
"AAAAAA",
|
||||
"AABABB",
|
||||
"AABBAB",
|
||||
"AABBBA",
|
||||
"ABAABB",
|
||||
"ABBAAB",
|
||||
"ABBBAA",
|
||||
"ABABAB",
|
||||
"ABABBA",
|
||||
"ABBABA"
|
||||
]
|
||||
|
||||
def bin_list(n):
|
||||
return list(map(int,f"{n:07b}"))
|
||||
|
||||
def luhn(digits):
|
||||
checksum = sum([
|
||||
digits[-i-1]*(3-i%2*2)
|
||||
for i in range(len(digits))
|
||||
])
|
||||
ctrl_key = 10 - checksum%10
|
||||
if ctrl_key == 10:
|
||||
ctrl_key = 0
|
||||
|
||||
return ctrl_key
|
||||
|
||||
def ean8(digits):
|
||||
digits.append(luhn(digits))
|
||||
elmts = []
|
||||
|
||||
elmts += [1,0,1] #delimiter
|
||||
for digit in digits[:4]:
|
||||
elmts += bin_list(A[digit])
|
||||
|
||||
elmts += [0,1,0,1,0] #middle delimiter
|
||||
for digit in digits[4:]:
|
||||
elmts += bin_list(C[digit])
|
||||
|
||||
elmts += [1,0,1] #delimiter
|
||||
return elmts
|
||||
|
||||
def ean13(digits):
|
||||
pattern = ean13_patterns[digits[0]]
|
||||
digits.append(luhn(digits))
|
||||
elmts = []
|
||||
|
||||
elmts += [1,0,1] #delimiter
|
||||
for d in range(1,7):
|
||||
_ = A if pattern[d-1] == "A" else B
|
||||
digit = digits[d]
|
||||
elmts += bin_list(_[digit])
|
||||
|
||||
elmts += [0,1,0,1,0] #middle delimiter
|
||||
for digit in digits[7:]:
|
||||
elmts += bin_list(C[digit])
|
||||
|
||||
elmts += [1,0,1] #delimiter
|
||||
return elmts
|
||||
|
||||
def draw_barcode(barcode, win):
|
||||
width = win.get_width()*0.8
|
||||
height = win.get_height()*0.5
|
||||
bar_w = width/len(barcode)
|
||||
rnd_bar_w = round(bar_w)
|
||||
|
||||
win.fill((255,255,255))
|
||||
x = win.get_width()*0.1
|
||||
y = win.get_height()*0.25
|
||||
|
||||
for c in barcode:
|
||||
if c:
|
||||
pygame.draw.rect(win, (0,0,0), [x, y, rnd_bar_w, height])
|
||||
|
||||
x += bar_w
|
||||
|
||||
if __name__ == "__main__":
|
||||
import base
|
||||
|
||||
b = base.Base(800, 500, "EAN-8 / EAN-13 barcode generator")
|
||||
|
||||
#barcode = ean8([8,4,2,7,3,7,2])
|
||||
barcode = ean13([9,7,8,2,9,4,0,6,2,1,0,5])
|
||||
|
||||
draw_barcode(barcode, b.w)
|
||||
|
||||
b.main()
|
||||
\end{minted}
|
||||
\end{tcolorbox}
|
||||
|
||||
\chapter{QR-Code tables}
|
||||
\label{app:qr_tabs}
|
||||
|
||||
\def\arraystretch{1.2}
|
||||
\begin{table}[H]
|
||||
\centering
|
||||
\begin{tabu}{|[2pt]c|c|[2pt]c|c|[2pt]c|c|[2pt]}
|
||||
\tabucline[2pt]{-}
|
||||
Index & Char & Index & Char & Index & Char \\
|
||||
\hline
|
||||
0 & 0 & 15 & F & 30 & U \\
|
||||
\hline
|
||||
1 & 1 & 16 & G & 31 & V \\
|
||||
\hline
|
||||
2 & 2 & 17 & H & 32 & W \\
|
||||
\hline
|
||||
3 & 3 & 18 & I & 33 & X \\
|
||||
\hline
|
||||
4 & 4 & 19 & J & 34 & Y \\
|
||||
\hline
|
||||
5 & 5 & 20 & K & 35 & Z \\
|
||||
\hline
|
||||
6 & 6 & 21 & L & 36 & \emph{space} \\
|
||||
\hline
|
||||
7 & 7 & 22 & M & 37 & \$ \\
|
||||
\hline
|
||||
8 & 8 & 23 & N & 38 & \% \\
|
||||
\hline
|
||||
9 & 9 & 24 & O & 39 & * \\
|
||||
\hline
|
||||
10 & A & 25 & P & 40 & + \\
|
||||
\hline
|
||||
11 & B & 26 & Q & 41 & - \\
|
||||
\hline
|
||||
12 & C & 27 & R & 42 & . \\
|
||||
\hline
|
||||
13 & D & 28 & S & 43 & / \\
|
||||
\hline
|
||||
14 & E & 29 & T & 44 & : \\
|
||||
\tabucline[2pt]{-}
|
||||
\end{tabu}
|
||||
\caption{List of alphanumerical characters}
|
||||
\label{tab:qr_alphanum}
|
||||
\end{table}
|
||||
\def\arraystretch{1}
|
||||
|
||||
\input{appendices/qr_versions}
|
||||
|
||||
% Rotated headers
|
||||
% https://tex.stackexchange.com/a/98439
|
||||
\input{appendices/error_correction}
|
||||
|
||||
\input{appendices/alignment}
|
||||
Reference in New Issue
Block a user