From ea1fbe4e9494c58e48bdfaa559e5592870f65e38 Mon Sep 17 00:00:00 2001 From: Lord Baryhobal Date: Thu, 22 Sep 2022 13:13:15 +0200 Subject: [PATCH] initial commit --- .gitignore | 2 + latex/appendices/alignment.tex | 102 +++ latex/appendices/error_correction.tex | 222 +++++ latex/appendices/qr_versions.tex | 218 +++++ latex/appendix.tex | 324 ++++++++ latex/barcode_functioning.tex | 398 +++++++++ latex/barcode_origin.tex | 14 + latex/barcode_python.tex | 235 ++++++ latex/bibliography.tex | 10 + latex/conclusion.tex | 10 + latex/custom_code.tex | 500 ++++++++++++ latex/db.bib | 162 ++++ latex/error_correction.tex | 461 +++++++++++ latex/images/code_39_example.png | Bin 0 -> 910 bytes latex/images/ean13_example.png | Bin 0 -> 1215 bytes latex/images/ean8_example.png | Bin 0 -> 1233 bytes latex/images/ean8_example_2.png | Bin 0 -> 1745 bytes latex/images/lycacode_cross.png | Bin 0 -> 4552 bytes latex/images/lycacode_data_layout.png | Bin 0 -> 7604 bytes latex/images/lycacode_ex_final.png | Bin 0 -> 6644 bytes latex/images/lycacode_ex_final_mat.png | Bin 0 -> 7605 bytes latex/images/lycacode_frame.png | Bin 0 -> 6833 bytes latex/images/lycacode_layout.png | Bin 0 -> 7350 bytes latex/images/lycacode_mask_0.png | Bin 0 -> 129 bytes latex/images/lycacode_mask_1.png | Bin 0 -> 146 bytes latex/images/lycacode_mask_2.png | Bin 0 -> 154 bytes latex/images/lycacode_mask_3.png | Bin 0 -> 145 bytes latex/images/lycacode_mask_4.png | Bin 0 -> 132 bytes latex/images/lycacode_mask_5.png | Bin 0 -> 152 bytes latex/images/lycacode_mask_6.png | Bin 0 -> 202 bytes latex/images/lycacode_mask_7.png | Bin 0 -> 147 bytes latex/images/lycacode_squares.png | Bin 0 -> 6970 bytes latex/images/qr_end.jpg | Bin 0 -> 26340 bytes latex/images/qr_fmt_info.jpg | Bin 0 -> 26340 bytes latex/images/qr_fmt_layout.png | Bin 0 -> 3408 bytes latex/images/qr_mask_0.png | Bin 0 -> 79 bytes latex/images/qr_mask_1.png | Bin 0 -> 78 bytes latex/images/qr_mask_2.png | Bin 0 -> 80 bytes latex/images/qr_mask_3.png | Bin 0 -> 87 bytes latex/images/qr_mask_4.png | Bin 0 -> 90 bytes latex/images/qr_mask_5.png | Bin 0 -> 110 bytes latex/images/qr_mask_6.png | Bin 0 -> 98 bytes latex/images/qr_mask_7.png | Bin 0 -> 103 bytes latex/images/qr_mask_ex_eval_1.png | Bin 0 -> 20325 bytes latex/images/qr_mask_ex_eval_2.png | Bin 0 -> 15707 bytes latex/images/qr_mask_ex_eval_3.png | Bin 0 -> 10642 bytes latex/images/qr_mask_ex_eval_4.png | Bin 0 -> 13166 bytes latex/images/qr_plcmt.jpg | Bin 0 -> 26496 bytes latex/images/qr_plcmt_byte_down.png | Bin 0 -> 809 bytes latex/images/qr_plcmt_byte_up.png | Bin 0 -> 795 bytes latex/images/qr_plcmt_reserved.png | Bin 0 -> 949 bytes latex/images/qr_plcmt_turning.png | Bin 0 -> 763 bytes latex/images/qr_reserved.jpg | Bin 0 -> 19912 bytes latex/images/qr_reserved_example.jpg | Bin 0 -> 52570 bytes latex/images/qr_sep_finder.jpg | Bin 0 -> 17951 bytes latex/images/qr_timing.jpg | Bin 0 -> 19008 bytes latex/introduction.tex | 22 + latex/main.pdf | Bin 0 -> 683540 bytes latex/main.tex | 122 +++ latex/other_2d.tex | 4 + latex/qr_functioning.tex | 612 ++++++++++++++ latex/qr_origin.tex | 72 ++ latex/qr_python.tex | 163 ++++ latex/review.tex | 13 + latex/title_toc.tex | 33 + python/base.py | 55 ++ python/code39.py | 68 ++ python/ean.py | 116 +++ python/error_correction.txt | 199 +++++ python/hamming.py | 75 ++ python/img_gen/hamming.py | 66 ++ python/img_gen/lycacode_data_layout_gen.py | 276 +++++++ python/img_gen/lycacode_frame.py | 92 +++ python/img_gen/lycacode_layout_gen.py | 71 ++ python/img_gen/lycacode_mask_gen.py | 43 + python/img_gen/qr_mask_eval_gen.py | 256 ++++++ python/img_gen/qr_mask_gen.py | 33 + python/img_gen/qr_plcmt_path.py | 101 +++ python/latex_gen/alignment_gen.py | 95 +++ python/latex_gen/ec_converter.py | 104 +++ python/latex_gen/error_correction.txt | 199 +++++ python/latex_gen/hamming_gen.py | 99 +++ python/latex_gen/qr_versions.txt | 199 +++++ python/latex_gen/reed_solomon_gen.py | 282 +++++++ python/latex_gen/version_converter.py | 78 ++ python/lycacode_gen.py | 284 +++++++ python/lycacode_gen_mini.py | 164 ++++ python/lycacode_scanner.py | 296 +++++++ python/lycacode_scanner_mini.py | 207 +++++ python/qr_generator.py | 891 +++++++++++++++++++++ python/qr_scanner.py | 882 ++++++++++++++++++++ python/qr_versions.txt | 199 +++++ python/valid_format_str.txt | 32 + 93 files changed, 9161 insertions(+) create mode 100644 .gitignore create mode 100644 latex/appendices/alignment.tex create mode 100644 latex/appendices/error_correction.tex create mode 100644 latex/appendices/qr_versions.tex create mode 100644 latex/appendix.tex create mode 100644 latex/barcode_functioning.tex create mode 100644 latex/barcode_origin.tex create mode 100644 latex/barcode_python.tex create mode 100644 latex/bibliography.tex create mode 100644 latex/conclusion.tex create mode 100644 latex/custom_code.tex create mode 100644 latex/db.bib create mode 100644 latex/error_correction.tex create mode 100644 latex/images/code_39_example.png create mode 100644 latex/images/ean13_example.png create mode 100644 latex/images/ean8_example.png create mode 100644 latex/images/ean8_example_2.png create mode 100644 latex/images/lycacode_cross.png create mode 100644 latex/images/lycacode_data_layout.png create mode 100644 latex/images/lycacode_ex_final.png create mode 100644 latex/images/lycacode_ex_final_mat.png create mode 100644 latex/images/lycacode_frame.png create mode 100644 latex/images/lycacode_layout.png create mode 100644 latex/images/lycacode_mask_0.png create mode 100644 latex/images/lycacode_mask_1.png create mode 100644 latex/images/lycacode_mask_2.png create mode 100644 latex/images/lycacode_mask_3.png create mode 100644 latex/images/lycacode_mask_4.png create mode 100644 latex/images/lycacode_mask_5.png create mode 100644 latex/images/lycacode_mask_6.png create mode 100644 latex/images/lycacode_mask_7.png create mode 100644 latex/images/lycacode_squares.png create mode 100644 latex/images/qr_end.jpg create mode 100644 latex/images/qr_fmt_info.jpg create mode 100644 latex/images/qr_fmt_layout.png create mode 100644 latex/images/qr_mask_0.png create mode 100644 latex/images/qr_mask_1.png create mode 100644 latex/images/qr_mask_2.png create mode 100644 latex/images/qr_mask_3.png create mode 100644 latex/images/qr_mask_4.png create mode 100644 latex/images/qr_mask_5.png create mode 100644 latex/images/qr_mask_6.png create mode 100644 latex/images/qr_mask_7.png create mode 100644 latex/images/qr_mask_ex_eval_1.png create mode 100644 latex/images/qr_mask_ex_eval_2.png create mode 100644 latex/images/qr_mask_ex_eval_3.png create mode 100644 latex/images/qr_mask_ex_eval_4.png create mode 100644 latex/images/qr_plcmt.jpg create mode 100644 latex/images/qr_plcmt_byte_down.png create mode 100644 latex/images/qr_plcmt_byte_up.png create mode 100644 latex/images/qr_plcmt_reserved.png create mode 100644 latex/images/qr_plcmt_turning.png create mode 100644 latex/images/qr_reserved.jpg create mode 100644 latex/images/qr_reserved_example.jpg create mode 100644 latex/images/qr_sep_finder.jpg create mode 100644 latex/images/qr_timing.jpg create mode 100644 latex/introduction.tex create mode 100644 latex/main.pdf create mode 100644 latex/main.tex create mode 100644 latex/other_2d.tex create mode 100644 latex/qr_functioning.tex create mode 100644 latex/qr_origin.tex create mode 100644 latex/qr_python.tex create mode 100644 latex/review.tex create mode 100644 latex/title_toc.tex create mode 100644 python/base.py create mode 100644 python/code39.py create mode 100644 python/ean.py create mode 100644 python/error_correction.txt create mode 100644 python/hamming.py create mode 100644 python/img_gen/hamming.py create mode 100644 python/img_gen/lycacode_data_layout_gen.py create mode 100644 python/img_gen/lycacode_frame.py create mode 100644 python/img_gen/lycacode_layout_gen.py create mode 100644 python/img_gen/lycacode_mask_gen.py create mode 100644 python/img_gen/qr_mask_eval_gen.py create mode 100644 python/img_gen/qr_mask_gen.py create mode 100644 python/img_gen/qr_plcmt_path.py create mode 100644 python/latex_gen/alignment_gen.py create mode 100644 python/latex_gen/ec_converter.py create mode 100644 python/latex_gen/error_correction.txt create mode 100644 python/latex_gen/hamming_gen.py create mode 100644 python/latex_gen/qr_versions.txt create mode 100644 python/latex_gen/reed_solomon_gen.py create mode 100644 python/latex_gen/version_converter.py create mode 100644 python/lycacode_gen.py create mode 100644 python/lycacode_gen_mini.py create mode 100644 python/lycacode_scanner.py create mode 100644 python/lycacode_scanner_mini.py create mode 100644 python/qr_generator.py create mode 100644 python/qr_scanner.py create mode 100644 python/qr_versions.txt create mode 100644 python/valid_format_str.txt diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2a97c05 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +__pycache__ +ec_params.txt \ No newline at end of file diff --git a/latex/appendices/alignment.tex b/latex/appendices/alignment.tex new file mode 100644 index 0000000..ee6c590 --- /dev/null +++ b/latex/appendices/alignment.tex @@ -0,0 +1,102 @@ +\def\arraystretch{1.2} +\begin{center} + \begin{longtabu}{|[2pt]c|c|c|c|c|c|c|c|[2pt]} + \caption{Alignment pattern locations} + \label{tab:qr_alignment}\\ + \tabucline[2pt]{-} + Version & \multicolumn{7}{c|[2pt]}{Central x and y coordinates} \\ + \tabucline[2pt]{-} + \endfirsthead + \multicolumn{8}{r}{\emph{Continued from last page}}\\ + \hline + Version & \multicolumn{7}{c|[2pt]}{Central x and y coordinates} \\ + \endhead + Version & \multicolumn{7}{c|[2pt]}{Central x and y coordinates} \\ + \hline + \multicolumn{8}{r}{\emph{Continued on next page}}\\ + \endfoot + \tabucline[2pt]{-} + \endlastfoot + 1 & & & & & & & \\ + \hline + 2 & 6 & 18 & & & & & \\ + \hline + 3 & 6 & 22 & & & & & \\ + \hline + 4 & 6 & 26 & & & & & \\ + \hline + 5 & 6 & 30 & & & & & \\ + \hline + 6 & 6 & 34 & & & & & \\ + \hline + 7 & 6 & 22 & 38 & & & & \\ + \hline + 8 & 6 & 24 & 42 & & & & \\ + \hline + 9 & 6 & 26 & 46 & & & & \\ + \hline + 10 & 6 & 28 & 50 & & & & \\ + \hline + 11 & 6 & 30 & 54 & & & & \\ + \hline + 12 & 6 & 32 & 58 & & & & \\ + \hline + 13 & 6 & 34 & 62 & & & & \\ + \hline + 14 & 6 & 26 & 46 & 66 & & & \\ + \hline + 15 & 6 & 26 & 48 & 70 & & & \\ + \hline + 16 & 6 & 26 & 50 & 74 & & & \\ + \hline + 17 & 6 & 30 & 54 & 78 & & & \\ + \hline + 18 & 6 & 30 & 56 & 82 & & & \\ + \hline + 19 & 6 & 30 & 58 & 86 & & & \\ + \hline + 20 & 6 & 34 & 62 & 90 & & & \\ + \hline + 21 & 6 & 28 & 50 & 72 & 94 & & \\ + \hline + 22 & 6 & 26 & 50 & 74 & 98 & & \\ + \hline + 23 & 6 & 30 & 54 & 78 & 102 & & \\ + \hline + 24 & 6 & 28 & 54 & 80 & 106 & & \\ + \hline + 25 & 6 & 32 & 58 & 84 & 110 & & \\ + \hline + 26 & 6 & 30 & 58 & 86 & 114 & & \\ + \hline + 27 & 6 & 34 & 62 & 90 & 118 & & \\ + \hline + 28 & 6 & 26 & 50 & 74 & 98 & 122 & \\ + \hline + 29 & 6 & 30 & 54 & 78 & 102 & 126 & \\ + \hline + 30 & 6 & 26 & 52 & 78 & 104 & 130 & \\ + \hline + 31 & 6 & 30 & 56 & 82 & 108 & 134 & \\ + \hline + 32 & 6 & 34 & 60 & 86 & 112 & 138 & \\ + \hline + 33 & 6 & 30 & 58 & 86 & 114 & 142 & \\ + \hline + 34 & 6 & 34 & 62 & 90 & 118 & 146 & \\ + \hline + 35 & 6 & 30 & 54 & 78 & 102 & 126 & 150 \\ + \hline + 36 & 6 & 24 & 50 & 76 & 102 & 128 & 154 \\ + \hline + 37 & 6 & 28 & 54 & 80 & 106 & 132 & 158 \\ + \hline + 38 & 6 & 32 & 58 & 84 & 110 & 136 & 162 \\ + \hline + 39 & 6 & 26 & 54 & 82 & 110 & 138 & 166 \\ + \hline + 40 & 6 & 30 & 58 & 86 & 114 & 142 & 170 \\ + \hline + \end{longtabu} +\end{center} +\def\arraystretch{1} diff --git a/latex/appendices/error_correction.tex b/latex/appendices/error_correction.tex new file mode 100644 index 0000000..c34ac5a --- /dev/null +++ b/latex/appendices/error_correction.tex @@ -0,0 +1,222 @@ +\def\arraystretch{1.2} +\begin{center} + \begin{longtabu}{|[2pt]c|c|c|c|c|c|c|c|[2pt]} + \caption{Error correction characteristics} + \label{tab:qr_error_correction}\\ + \tabucline[2pt]{-} + \rot{Version} & \rot{Correction level} & \rot{Data codewords} & \rot{\shortstack[l]{Error correction \\ codewords per block}} & \rot{Blocks in group 1} & \rot{\shortstack[l]{Data codewords per \\ group 1 blocks}} & \rot{Blocks in group 2} & \rot{\shortstack[l]{Data codewords per \\ group 2 blocks}} \\ + \tabucline[2pt]{-} + \endfirsthead + \multicolumn{8}{r}{\emph{Continued from last page}}\\ + \hline + Ver & Level & Data CW & EC CW /B & Blocks G1 & CW G1 & Blocks G2 & CW G2 \\ + \endhead + Ver & Level & Data CW & EC CW /B & Blocks G1 & CW G1 & Blocks G2 & CW G2 \\ + \hline + \multicolumn{8}{r}{\emph{Continued on next page}}\\ + \endfoot + \tabucline[2pt]{-} + \endlastfoot + \multirow{4}{*}{ 1} & L & 19 & 7 & 1 & 19 & 0 & 0 \\* + & M & 16 & 10 & 1 & 16 & 0 & 0 \\* + & Q & 13 & 13 & 1 & 13 & 0 & 0 \\* + & H & 9 & 17 & 1 & 9 & 0 & 0 \\ + \hline + \multirow{4}{*}{ 2} & L & 34 & 10 & 1 & 34 & 0 & 0 \\* + & M & 28 & 16 & 1 & 28 & 0 & 0 \\* + & Q & 22 & 22 & 1 & 22 & 0 & 0 \\* + & H & 16 & 28 & 1 & 16 & 0 & 0 \\ + \hline + \multirow{4}{*}{ 3} & L & 55 & 15 & 1 & 55 & 0 & 0 \\* + & M & 44 & 26 & 1 & 44 & 0 & 0 \\* + & Q & 34 & 18 & 2 & 17 & 0 & 0 \\* + & H & 26 & 22 & 2 & 13 & 0 & 0 \\ + \hline + \multirow{4}{*}{ 4} & L & 80 & 20 & 1 & 80 & 0 & 0 \\* + & M & 64 & 18 & 2 & 32 & 0 & 0 \\* + & Q & 48 & 26 & 2 & 24 & 0 & 0 \\* + & H & 36 & 16 & 4 & 9 & 0 & 0 \\ + \hline + \multirow{4}{*}{ 5} & L & 108 & 26 & 1 & 108 & 0 & 0 \\* + & M & 86 & 24 & 2 & 43 & 0 & 0 \\* + & Q & 62 & 18 & 2 & 15 & 2 & 16 \\* + & H & 46 & 22 & 2 & 11 & 2 & 12 \\ + \hline + \multirow{4}{*}{ 6} & L & 136 & 18 & 2 & 68 & 0 & 0 \\* + & M & 108 & 16 & 4 & 27 & 0 & 0 \\* + & Q & 76 & 24 & 4 & 19 & 0 & 0 \\* + & H & 60 & 28 & 4 & 15 & 0 & 0 \\ + \hline + \multirow{4}{*}{ 7} & L & 156 & 20 & 2 & 78 & 0 & 0 \\* + & M & 124 & 18 & 4 & 31 & 0 & 0 \\* + & Q & 88 & 18 & 2 & 14 & 4 & 15 \\* + & H & 66 & 26 & 4 & 13 & 1 & 14 \\ + \hline + \multirow{4}{*}{ 8} & L & 194 & 24 & 2 & 97 & 0 & 0 \\* + & M & 154 & 22 & 2 & 38 & 2 & 39 \\* + & Q & 110 & 22 & 4 & 18 & 2 & 19 \\* + & H & 86 & 26 & 4 & 14 & 2 & 15 \\ + \hline + \multirow{4}{*}{ 9} & L & 232 & 30 & 2 & 116 & 0 & 0 \\* + & M & 182 & 22 & 3 & 36 & 2 & 37 \\* + & Q & 132 & 20 & 4 & 16 & 4 & 17 \\* + & H & 100 & 24 & 4 & 12 & 4 & 13 \\ + \hline + \multirow{4}{*}{10} & L & 274 & 18 & 2 & 68 & 2 & 69 \\* + & M & 216 & 26 & 4 & 43 & 1 & 44 \\* + & Q & 154 & 24 & 6 & 19 & 2 & 20 \\* + & H & 122 & 28 & 6 & 15 & 2 & 16 \\ + \hline + \multirow{4}{*}{11} & L & 324 & 20 & 4 & 81 & 0 & 0 \\* + & M & 254 & 30 & 1 & 50 & 4 & 51 \\* + & Q & 180 & 28 & 4 & 22 & 4 & 23 \\* + & H & 140 & 24 & 3 & 12 & 8 & 13 \\ + \hline + \multirow{4}{*}{12} & L & 370 & 24 & 2 & 92 & 2 & 93 \\* + & M & 290 & 22 & 6 & 36 & 2 & 37 \\* + & Q & 206 & 26 & 4 & 20 & 6 & 21 \\* + & H & 158 & 28 & 7 & 14 & 4 & 15 \\ + \hline + \multirow{4}{*}{13} & L & 428 & 26 & 4 & 107 & 0 & 0 \\* + & M & 334 & 22 & 8 & 37 & 1 & 38 \\* + & Q & 244 & 24 & 8 & 20 & 4 & 21 \\* + & H & 180 & 22 & 12 & 11 & 4 & 12 \\ + \hline + \multirow{4}{*}{14} & L & 461 & 30 & 3 & 115 & 1 & 116 \\* + & M & 365 & 24 & 4 & 40 & 5 & 41 \\* + & Q & 261 & 20 & 11 & 16 & 5 & 17 \\* + & H & 197 & 24 & 11 & 12 & 5 & 13 \\ + \hline + \multirow{4}{*}{15} & L & 523 & 22 & 5 & 87 & 1 & 88 \\* + & M & 415 & 24 & 5 & 41 & 5 & 42 \\* + & Q & 295 & 30 & 5 & 24 & 7 & 25 \\* + & H & 223 & 24 & 11 & 12 & 7 & 13 \\ + \hline + \multirow{4}{*}{16} & L & 589 & 24 & 5 & 98 & 1 & 99 \\* + & M & 453 & 28 & 7 & 45 & 3 & 46 \\* + & Q & 325 & 24 & 15 & 19 & 2 & 20 \\* + & H & 253 & 30 & 3 & 15 & 13 & 16 \\ + \hline + \multirow{4}{*}{17} & L & 647 & 28 & 1 & 107 & 5 & 108 \\* + & M & 507 & 28 & 10 & 46 & 1 & 47 \\* + & Q & 367 & 28 & 1 & 22 & 15 & 23 \\* + & H & 283 & 28 & 2 & 14 & 17 & 15 \\ + \hline + \multirow{4}{*}{18} & L & 721 & 30 & 5 & 120 & 1 & 121 \\* + & M & 563 & 26 & 9 & 43 & 4 & 44 \\* + & Q & 397 & 28 & 17 & 22 & 1 & 23 \\* + & H & 313 & 28 & 2 & 14 & 19 & 15 \\ + \hline + \multirow{4}{*}{19} & L & 795 & 28 & 3 & 113 & 4 & 114 \\* + & M & 627 & 26 & 3 & 44 & 11 & 45 \\* + & Q & 445 & 26 & 17 & 21 & 4 & 22 \\* + & H & 341 & 26 & 9 & 13 & 16 & 14 \\ + \hline + \multirow{4}{*}{20} & L & 861 & 28 & 3 & 107 & 5 & 108 \\* + & M & 669 & 26 & 3 & 41 & 13 & 42 \\* + & Q & 485 & 30 & 15 & 24 & 5 & 25 \\* + & H & 385 & 28 & 15 & 15 & 10 & 16 \\ + \hline + \multirow{4}{*}{21} & L & 932 & 28 & 4 & 116 & 4 & 117 \\* + & M & 714 & 26 & 17 & 42 & 0 & 0 \\* + & Q & 512 & 28 & 17 & 22 & 6 & 23 \\* + & H & 406 & 30 & 19 & 16 & 6 & 17 \\ + \hline + \multirow{4}{*}{22} & L & 1006 & 28 & 2 & 111 & 7 & 112 \\* + & M & 782 & 28 & 17 & 46 & 0 & 0 \\* + & Q & 568 & 30 & 7 & 24 & 16 & 25 \\* + & H & 442 & 24 & 34 & 13 & 0 & 0 \\ + \hline + \multirow{4}{*}{23} & L & 1094 & 30 & 4 & 121 & 5 & 122 \\* + & M & 860 & 28 & 4 & 47 & 14 & 48 \\* + & Q & 614 & 30 & 11 & 24 & 14 & 25 \\* + & H & 464 & 30 & 16 & 15 & 14 & 16 \\ + \hline + \multirow{4}{*}{24} & L & 1174 & 30 & 6 & 117 & 4 & 118 \\* + & M & 914 & 28 & 6 & 45 & 14 & 46 \\* + & Q & 664 & 30 & 11 & 24 & 16 & 25 \\* + & H & 514 & 30 & 30 & 16 & 2 & 17 \\ + \hline + \multirow{4}{*}{25} & L & 1276 & 26 & 8 & 106 & 4 & 107 \\* + & M & 1000 & 28 & 8 & 47 & 13 & 48 \\* + & Q & 718 & 30 & 7 & 24 & 22 & 25 \\* + & H & 538 & 30 & 22 & 15 & 13 & 16 \\ + \hline + \multirow{4}{*}{26} & L & 1370 & 28 & 10 & 114 & 2 & 115 \\* + & M & 1062 & 28 & 19 & 46 & 4 & 47 \\* + & Q & 754 & 28 & 28 & 22 & 6 & 23 \\* + & H & 596 & 30 & 33 & 16 & 4 & 17 \\ + \hline + \multirow{4}{*}{27} & L & 1468 & 30 & 8 & 122 & 4 & 123 \\* + & M & 1128 & 28 & 22 & 45 & 3 & 46 \\* + & Q & 808 & 30 & 8 & 23 & 26 & 24 \\* + & H & 628 & 30 & 12 & 15 & 28 & 16 \\ + \hline + \multirow{4}{*}{28} & L & 1531 & 30 & 3 & 117 & 10 & 118 \\* + & M & 1193 & 28 & 3 & 45 & 23 & 46 \\* + & Q & 871 & 30 & 4 & 24 & 31 & 25 \\* + & H & 661 & 30 & 11 & 15 & 31 & 16 \\ + \hline + \multirow{4}{*}{29} & L & 1631 & 30 & 7 & 116 & 7 & 117 \\* + & M & 1267 & 28 & 21 & 45 & 7 & 46 \\* + & Q & 911 & 30 & 1 & 23 & 37 & 24 \\* + & H & 701 & 30 & 19 & 15 & 26 & 16 \\ + \hline + \multirow{4}{*}{30} & L & 1735 & 30 & 5 & 115 & 10 & 116 \\* + & M & 1373 & 28 & 19 & 47 & 10 & 48 \\* + & Q & 985 & 30 & 15 & 24 & 25 & 25 \\* + & H & 745 & 30 & 23 & 15 & 25 & 16 \\ + \hline + \multirow{4}{*}{31} & L & 1843 & 30 & 13 & 115 & 3 & 116 \\* + & M & 1455 & 28 & 2 & 46 & 29 & 47 \\* + & Q & 1033 & 30 & 42 & 24 & 1 & 25 \\* + & H & 793 & 30 & 23 & 15 & 28 & 16 \\ + \hline + \multirow{4}{*}{32} & L & 1955 & 30 & 17 & 115 & 0 & 0 \\* + & M & 1541 & 28 & 10 & 46 & 23 & 47 \\* + & Q & 1115 & 30 & 10 & 24 & 35 & 25 \\* + & H & 845 & 30 & 19 & 15 & 35 & 16 \\ + \hline + \multirow{4}{*}{33} & L & 2071 & 30 & 17 & 115 & 1 & 116 \\* + & M & 1631 & 28 & 14 & 46 & 21 & 47 \\* + & Q & 1171 & 30 & 29 & 24 & 19 & 25 \\* + & H & 901 & 30 & 11 & 15 & 46 & 16 \\ + \hline + \multirow{4}{*}{34} & L & 2191 & 30 & 13 & 115 & 6 & 116 \\* + & M & 1725 & 28 & 14 & 46 & 23 & 47 \\* + & Q & 1231 & 30 & 44 & 24 & 7 & 25 \\* + & H & 961 & 30 & 59 & 16 & 1 & 17 \\ + \hline + \multirow{4}{*}{35} & L & 2306 & 30 & 12 & 121 & 7 & 122 \\* + & M & 1812 & 28 & 12 & 47 & 26 & 48 \\* + & Q & 1286 & 30 & 39 & 24 & 14 & 25 \\* + & H & 986 & 30 & 22 & 15 & 41 & 16 \\ + \hline + \multirow{4}{*}{36} & L & 2434 & 30 & 6 & 121 & 14 & 122 \\* + & M & 1914 & 28 & 6 & 47 & 34 & 48 \\* + & Q & 1354 & 30 & 46 & 24 & 10 & 25 \\* + & H & 1054 & 30 & 2 & 15 & 64 & 16 \\ + \hline + \multirow{4}{*}{37} & L & 2566 & 30 & 17 & 122 & 4 & 123 \\* + & M & 1992 & 28 & 29 & 46 & 14 & 47 \\* + & Q & 1426 & 30 & 49 & 24 & 10 & 25 \\* + & H & 1096 & 30 & 24 & 15 & 46 & 16 \\ + \hline + \multirow{4}{*}{38} & L & 2702 & 30 & 4 & 122 & 18 & 123 \\* + & M & 2102 & 28 & 13 & 46 & 32 & 47 \\* + & Q & 1502 & 30 & 48 & 24 & 14 & 25 \\* + & H & 1142 & 30 & 42 & 15 & 32 & 16 \\ + \hline + \multirow{4}{*}{39} & L & 2812 & 30 & 20 & 117 & 4 & 118 \\* + & M & 2216 & 28 & 40 & 47 & 7 & 48 \\* + & Q & 1582 & 30 & 43 & 24 & 22 & 25 \\* + & H & 1222 & 30 & 10 & 15 & 67 & 16 \\ + \hline + \multirow{4}{*}{40} & L & 2956 & 30 & 19 & 118 & 6 & 119 \\* + & M & 2334 & 28 & 18 & 47 & 31 & 48 \\* + & Q & 1666 & 30 & 34 & 24 & 34 & 25 \\* + & H & 1276 & 30 & 20 & 15 & 61 & 16 \\ + \hline + \end{longtabu} +\end{center} +\def\arraystretch{1} diff --git a/latex/appendices/qr_versions.tex b/latex/appendices/qr_versions.tex new file mode 100644 index 0000000..d737868 --- /dev/null +++ b/latex/appendices/qr_versions.tex @@ -0,0 +1,218 @@ +\def\arraystretch{1.2} +\begin{center} + \begin{longtabu}{|[2pt]c|c|c:c:c:c|[2pt]} + \caption{Version capacities} + \label{tab:qr_versions}\\ + \tabucline[2pt]{-} + Version & Correction level & Numerical & Alphanumerical & Byte & Kanji \\ + \tabucline[2pt]{-} + \endfirsthead + \multicolumn{6}{r}{\emph{Continued from last page}}\\ + \endhead + \multicolumn{6}{r}{\emph{Continued on next page}}\\ + \endfoot + \tabucline[2pt]{-} + \endlastfoot + \multirow{4}{*}{ 1} & L & 41 & 25 & 17 & 10 \\* + & M & 34 & 20 & 14 & 8 \\* + & Q & 27 & 16 & 11 & 7 \\* + & H & 17 & 10 & 7 & 4 \\ + \hline + \multirow{4}{*}{ 2} & L & 77 & 47 & 32 & 20 \\* + & M & 63 & 38 & 26 & 16 \\* + & Q & 48 & 29 & 20 & 12 \\* + & H & 34 & 20 & 14 & 8 \\ + \hline + \multirow{4}{*}{ 3} & L & 127 & 77 & 53 & 32 \\* + & M & 101 & 61 & 42 & 26 \\* + & Q & 77 & 47 & 32 & 20 \\* + & H & 58 & 35 & 24 & 15 \\ + \hline + \multirow{4}{*}{ 4} & L & 187 & 114 & 78 & 48 \\* + & M & 149 & 90 & 62 & 38 \\* + & Q & 111 & 67 & 46 & 28 \\* + & H & 82 & 50 & 34 & 21 \\ + \hline + \multirow{4}{*}{ 5} & L & 255 & 154 & 106 & 65 \\* + & M & 202 & 122 & 84 & 52 \\* + & Q & 144 & 87 & 60 & 37 \\* + & H & 106 & 64 & 44 & 27 \\ + \hline + \multirow{4}{*}{ 6} & L & 322 & 195 & 134 & 82 \\* + & M & 255 & 154 & 106 & 65 \\* + & Q & 178 & 108 & 74 & 45 \\* + & H & 139 & 84 & 58 & 36 \\ + \hline + \multirow{4}{*}{ 7} & L & 370 & 224 & 154 & 95 \\* + & M & 293 & 178 & 122 & 75 \\* + & Q & 207 & 125 & 86 & 53 \\* + & H & 154 & 93 & 64 & 39 \\ + \hline + \multirow{4}{*}{ 8} & L & 461 & 279 & 192 & 118 \\* + & M & 365 & 221 & 152 & 93 \\* + & Q & 259 & 157 & 108 & 66 \\* + & H & 202 & 122 & 84 & 52 \\ + \hline + \multirow{4}{*}{ 9} & L & 552 & 335 & 230 & 141 \\* + & M & 432 & 262 & 180 & 111 \\* + & Q & 312 & 189 & 130 & 80 \\* + & H & 235 & 143 & 98 & 60 \\ + \hline + \multirow{4}{*}{10} & L & 652 & 395 & 271 & 167 \\* + & M & 513 & 311 & 213 & 131 \\* + & Q & 364 & 221 & 151 & 93 \\* + & H & 288 & 174 & 119 & 74 \\ + \hline + \multirow{4}{*}{11} & L & 772 & 468 & 321 & 198 \\* + & M & 604 & 366 & 251 & 155 \\* + & Q & 427 & 259 & 177 & 109 \\* + & H & 331 & 200 & 137 & 85 \\ + \hline + \multirow{4}{*}{12} & L & 883 & 535 & 367 & 226 \\* + & M & 691 & 419 & 287 & 177 \\* + & Q & 489 & 296 & 203 & 125 \\* + & H & 374 & 227 & 155 & 96 \\ + \hline + \multirow{4}{*}{13} & L & 1022 & 619 & 425 & 262 \\* + & M & 796 & 483 & 331 & 204 \\* + & Q & 580 & 352 & 241 & 149 \\* + & H & 427 & 259 & 177 & 109 \\ + \hline + \multirow{4}{*}{14} & L & 1101 & 667 & 458 & 282 \\* + & M & 871 & 528 & 362 & 223 \\* + & Q & 621 & 376 & 258 & 159 \\* + & H & 468 & 283 & 194 & 120 \\ + \hline + \multirow{4}{*}{15} & L & 1250 & 758 & 520 & 320 \\* + & M & 991 & 600 & 412 & 254 \\* + & Q & 703 & 426 & 292 & 180 \\* + & H & 530 & 321 & 220 & 136 \\ + \hline + \multirow{4}{*}{16} & L & 1408 & 854 & 586 & 361 \\* + & M & 1082 & 656 & 450 & 277 \\* + & Q & 775 & 470 & 322 & 198 \\* + & H & 602 & 365 & 250 & 154 \\ + \hline + \multirow{4}{*}{17} & L & 1548 & 938 & 644 & 397 \\* + & M & 1212 & 734 & 504 & 310 \\* + & Q & 876 & 531 & 364 & 224 \\* + & H & 674 & 408 & 280 & 173 \\ + \hline + \multirow{4}{*}{18} & L & 1725 & 1046 & 718 & 442 \\* + & M & 1346 & 816 & 560 & 345 \\* + & Q & 948 & 574 & 394 & 243 \\* + & H & 746 & 452 & 310 & 191 \\ + \hline + \multirow{4}{*}{19} & L & 1903 & 1153 & 792 & 488 \\* + & M & 1500 & 909 & 624 & 384 \\* + & Q & 1063 & 644 & 442 & 272 \\* + & H & 813 & 493 & 338 & 208 \\ + \hline + \multirow{4}{*}{20} & L & 2061 & 1249 & 858 & 528 \\* + & M & 1600 & 970 & 666 & 410 \\* + & Q & 1159 & 702 & 482 & 297 \\* + & H & 919 & 557 & 382 & 235 \\ + \hline + \multirow{4}{*}{21} & L & 2232 & 1352 & 929 & 572 \\* + & M & 1708 & 1035 & 711 & 438 \\* + & Q & 1224 & 742 & 509 & 314 \\* + & H & 969 & 587 & 403 & 248 \\ + \hline + \multirow{4}{*}{22} & L & 2409 & 1460 & 1003 & 618 \\* + & M & 1872 & 1134 & 779 & 480 \\* + & Q & 1358 & 823 & 565 & 348 \\* + & H & 1056 & 640 & 439 & 270 \\ + \hline + \multirow{4}{*}{23} & L & 2620 & 1588 & 1091 & 672 \\* + & M & 2059 & 1248 & 857 & 528 \\* + & Q & 1468 & 890 & 611 & 376 \\* + & H & 1108 & 672 & 461 & 284 \\ + \hline + \multirow{4}{*}{24} & L & 2812 & 1704 & 1171 & 721 \\* + & M & 2188 & 1326 & 911 & 561 \\* + & Q & 1588 & 963 & 661 & 407 \\* + & H & 1228 & 744 & 511 & 315 \\ + \hline + \multirow{4}{*}{25} & L & 3057 & 1853 & 1273 & 784 \\* + & M & 2395 & 1451 & 997 & 614 \\* + & Q & 1718 & 1041 & 715 & 440 \\* + & H & 1286 & 779 & 535 & 330 \\ + \hline + \multirow{4}{*}{26} & L & 3283 & 1990 & 1367 & 842 \\* + & M & 2544 & 1542 & 1059 & 652 \\* + & Q & 1804 & 1094 & 751 & 462 \\* + & H & 1425 & 864 & 593 & 365 \\ + \hline + \multirow{4}{*}{27} & L & 3517 & 2132 & 1465 & 902 \\* + & M & 2701 & 1637 & 1125 & 692 \\* + & Q & 1933 & 1172 & 805 & 496 \\* + & H & 1501 & 910 & 625 & 385 \\ + \hline + \multirow{4}{*}{28} & L & 3669 & 2223 & 1528 & 940 \\* + & M & 2857 & 1732 & 1190 & 732 \\* + & Q & 2085 & 1263 & 868 & 534 \\* + & H & 1581 & 958 & 658 & 405 \\ + \hline + \multirow{4}{*}{29} & L & 3909 & 2369 & 1628 & 1002 \\* + & M & 3035 & 1839 & 1264 & 778 \\* + & Q & 2181 & 1322 & 908 & 559 \\* + & H & 1677 & 1016 & 698 & 430 \\ + \hline + \multirow{4}{*}{30} & L & 4158 & 2520 & 1732 & 1066 \\* + & M & 3289 & 1994 & 1370 & 843 \\* + & Q & 2358 & 1429 & 982 & 604 \\* + & H & 1782 & 1080 & 742 & 457 \\ + \hline + \multirow{4}{*}{31} & L & 4417 & 2677 & 1840 & 1132 \\* + & M & 3486 & 2113 & 1452 & 894 \\* + & Q & 2473 & 1499 & 1030 & 634 \\* + & H & 1897 & 1150 & 790 & 486 \\ + \hline + \multirow{4}{*}{32} & L & 4686 & 2840 & 1952 & 1201 \\* + & M & 3693 & 2238 & 1538 & 947 \\* + & Q & 2670 & 1618 & 1112 & 684 \\* + & H & 2022 & 1226 & 842 & 518 \\ + \hline + \multirow{4}{*}{33} & L & 4965 & 3009 & 2068 & 1273 \\* + & M & 3909 & 2369 & 1628 & 1002 \\* + & Q & 2805 & 1700 & 1168 & 719 \\* + & H & 2157 & 1307 & 898 & 553 \\ + \hline + \multirow{4}{*}{34} & L & 5253 & 3183 & 2188 & 1347 \\* + & M & 4134 & 2506 & 1722 & 1060 \\* + & Q & 2949 & 1787 & 1228 & 756 \\* + & H & 2301 & 1394 & 958 & 590 \\ + \hline + \multirow{4}{*}{35} & L & 5529 & 3351 & 2303 & 1417 \\* + & M & 4343 & 2632 & 1809 & 1113 \\* + & Q & 3081 & 1867 & 1283 & 790 \\* + & H & 2361 & 1431 & 983 & 605 \\ + \hline + \multirow{4}{*}{36} & L & 5836 & 3537 & 2431 & 1496 \\* + & M & 4588 & 2780 & 1911 & 1176 \\* + & Q & 3244 & 1966 & 1351 & 832 \\* + & H & 2524 & 1530 & 1051 & 647 \\ + \hline + \multirow{4}{*}{37} & L & 6153 & 3729 & 2563 & 1577 \\* + & M & 4775 & 2894 & 1989 & 1224 \\* + & Q & 3417 & 2071 & 1423 & 876 \\* + & H & 2625 & 1591 & 1093 & 673 \\ + \hline + \multirow{4}{*}{38} & L & 6479 & 3927 & 2699 & 1661 \\* + & M & 5039 & 3054 & 2099 & 1292 \\* + & Q & 3599 & 2181 & 1499 & 923 \\* + & H & 2735 & 1658 & 1139 & 701 \\ + \hline + \multirow{4}{*}{39} & L & 6743 & 4087 & 2809 & 1729 \\* + & M & 5313 & 3220 & 2213 & 1362 \\* + & Q & 3791 & 2298 & 1579 & 972 \\* + & H & 2927 & 1774 & 1219 & 750 \\ + \hline + \multirow{4}{*}{40} & L & 7089 & 4296 & 2953 & 1817 \\* + & M & 5596 & 3391 & 2331 & 1435 \\* + & Q & 3993 & 2420 & 1663 & 1024 \\* + & H & 3057 & 1852 & 1273 & 784 \\ + \hline + \end{longtabu} +\end{center} +\def\arraystretch{1} diff --git a/latex/appendix.tex b/latex/appendix.tex new file mode 100644 index 0000000..114c025 --- /dev/null +++ b/latex/appendix.tex @@ -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} diff --git a/latex/barcode_functioning.tex b/latex/barcode_functioning.tex new file mode 100644 index 0000000..38f2d89 --- /dev/null +++ b/latex/barcode_functioning.tex @@ -0,0 +1,398 @@ +\section{How it works} +\label{sec:barcode_functioning} + +In barcodes, black and white stripes encode data visually. For certain types of codes, they represent 1s and 0s, while for other types such as Code-39, it is the width of the stripes which determines the value. The following sections will explain more thoroughly some of the most used types of barcodes. + +\subsection{Code-39} +\label{ssec:code39} + +First of all, there is Code-39, one of the simplest type of barcode. It can encode 43 different alphanumerical characters plus the special '*' delimiter. Each character is assigned a particular group of 9 bits, 3 of which are 1s, hence the name. Table \ref{tab:code39} lists all encodable characters and their respective codes. + +\def\arraystretch{1.5} +\begin{table}[H] + \centering + \begin{tabu}{|[2pt]c|c|[2pt]c|c|[2pt]c|c|[2pt]} + \tabucline[2pt]{-} + Char & Code & Char & Code & Char & Code \\ + \tabucline[2pt]{-} + A & 100001001 & P & 001010010 & 4 & 000110001 \\ + \hline + B & 001001001 & Q & 000000111 & 5 & 100110000 \\ + \hline + C & 101001000 & R & 100000110 & 6 & 001110000 \\ + \hline + D & 000011001 & S & 001000110 & 7 & 000100101 \\ + \hline + E & 100011000 & T & 000010110 & 8 & 100100100 \\ + \hline + F & 001011000 & U & 110000001 & 9 & 001100100 \\ + \hline + G & 000001101 & V & 011000001 & \emph{space} & 011000100 \\ + \hline + H & 100001100 & W & 111000000 & - & 010000101 \\ + \hline + I & 001001100 & X & 010010001 & \$ & 010101000 \\ + \hline + J & 000011100 & Y & 110010000 & \% & 000101010 \\ + \hline + K & 100000011 & Z & 011010000 & . & 110000100 \\ + \hline + L & 001000011 & 0 & 000110100 & / & 010100010 \\ + \hline + M & 101000010 & 1 & 100100001 & + & 010001010 \\ + \hline + N & 000010011 & 2 & 001100001 & * & 010010100 \\ + \hline + O & 100010010 & 3 & 101100000 & & \\ + \tabucline[2pt]{-} + \end{tabu} + \caption{Code-39 characters} + \label{tab:code39} +\end{table} +\def\arraystretch{1} + +To create a Code-39 barcode, we just have to take the codes corresponding to each character and join them end to end, adding a 0 in between each group. Finally, we add the '*' character at both ends (also spaced by a 0). It is a delimiter and should always be present at the beginning and end of the code, to signal scanners that it is a Code-39 barcode, as well as providing a reference for the normal bar width. + +Ones represent wide bars and zeros thin bars\footnote{The ratio wide/thin must be comprised between 2:1 and 3:1 \cite{ISO16388}}. Black and white stripes alternate, starting with black. + +Let's encode the string "CODE-39" + +\def\arraystretch{1.5} +\begin{table}[H] + \centering + \begin{tabu}{|[2pt]c|c|[2pt]} + \tabucline[2pt]{-} + Char & Code \\ + \tabucline[2pt]{-} + * & 010010100 \\ + \hline + C & 101001000 \\ + \hline + O & 100010010 \\ + \hline + D & 000011001 \\ + \hline + E & 100011000 \\ + \hline + - & 010000101 \\ + \hline + 3 & 101100000 \\ + \hline + 9 & 001100100 \\ + \hline + * & 010010100 \\ + \tabucline[2pt]{-} + \end{tabu} + \caption{Code-39 for "*CODE-39*"} + \label{tab:code39_ex_codes} +\end{table} +\def\arraystretch{1} + +For example, the first delimiter is encoded as: +\begin{center} + %\begin{tabular}{p{10pt}p{10pt}p{10pt}p{10pt}p{10pt}p{10pt}p{10pt}p{10pt}p{10pt}p{10pt}p{10pt}p{10pt}} + %\bbar & & & \bbar & & \bbar & \bbar & & \bbar & \bbar & & \bbar \\ + %0 & \multicolumn{2}{c}{1} & 0 & 0 & \multicolumn{2}{c}{1} & 0 & \multicolumn{2}{c}{1} & 0 & 0 \\ + \begin{tabular}{C{10pt}C{20pt}C{10pt}C{10pt}C{20pt}C{10pt}C{20pt}C{10pt}C{10pt}} + \bbar & & \bbar & & \bbar & & \bbar & & \bbar \\ + 0 & 1 & 0 & 0 & 1 & 0 & 1 & 0 & 0 \\ + \end{tabular} +\end{center} + +The entire barcode would look like figure \ref{fig:code_39_ex} + +\begin{figure}[H] + \centering + \includegraphics[width=0.5\linewidth]{images/code_39_example} + \caption{Code-39 example ("\texttt{*CODE-39*}")} + \label{fig:code_39_ex} +\end{figure} + +Code-39 doesn't provide any error detection mechanism. If a character is read as another character, the reading device won't know that it made a mistake. Additionally, it is not the most compact type of encoding, but it can easily be used for small amounts of data, for example to encode the identification number on students' absence booklet or sheet. + +\subsection{EAN} +\label{ssec:ean} + +Another barcode type is the EAN\footnote{European Article Numbering} standard. It is used for product identification and can be found on anything bought from a store. It exists in two main formats: EAN-8 and EAN-13, encoding respectively 7 and 12 digits. EAN codes use what is called a check digit to detect erroneous readings. This digit is the result of the Luhn Formula. Say we want to encode the number \texttt{978294062105}. To find the checksum digit, we have to multiply each digit by the alternating factors 1 and 3, and add all the products. + +\def\arraystretch{1.5} +\begin{table}[H] + \centering + \begin{tabu}{c|c|c|c|c|c|c|c|c|c|c|c|c|c} + %\hline + & 9 & 7 & 8 & 2 & 9 & 4 & 0 & 6 & 2 & 1 & 0 & 5 & \\ + %\hline + x & 1 & 3 & 1 & 3 & 1 & 3 & 1 & 3 & 1 & 3 & 1 & 3 & \\ + \tabucline[2pt]{-} + + & 9 &21 & 8 & 6 & 9 &12 & 0 &18 & 2 & 3 & 0 &15 & = 103 \\ + %\hline + \end{tabu} + \caption{Luhn Formula} + \label{tab:luhn} +\end{table} +\def\arraystretch{1} + +We then take the modulo ten, which is the same as saying we keep the unit's digit, and subtract it from $10$. In our example, $103 \equiv 3\ (\textrm{mod}\ 10)$ so the checksum is $10 - 3 = 7$. If we get $10$ we change it to $0$ to keep a single digit. + +This is now the 13th digit of our code. For an EAN-8 code, the process is the same with the factors 1 and 3 inverted, meaning the first digit is multiplied by 3, the second by 1, etc. + +The barcode itself is built out of a series of "elements". +Each element encodes a character, as described by table \ref{tab:ean_elmts}. +Ones are black stripes and zeros are white. + +\def\arraystretch{1.5} +\begin{table}[h] + \centering + \begin{tabu}{|[2pt]c|c|c|c|[2pt]} + \tabucline[2pt]{-} + Char. & A & B & C \\ + \tabucline[2pt]{-} + 0 & 0001101 & 0100111 & 1110010 \\ + \hline + 1 & 0011001 & 0110011 & 1100110 \\ + \hline + 2 & 0010011 & 0110011 & 1101100 \\ + \hline + 3 & 0111101 & 0110011 & 1000010 \\ + \hline + 4 & 0100011 & 0110011 & 1011100 \\ + \hline + 5 & 0110001 & 0110011 & 1001110 \\ + \hline + 6 & 0101111 & 0110011 & 1010000 \\ + \hline + 7 & 0111011 & 0110011 & 1000100 \\ + \hline + 8 & 0110111 & 0110011 & 1001000 \\ + \hline + 9 & 0001011 & 0110011 & 1110100 \\ + \tabucline[2pt]{-} + \end{tabu} + \caption{EAN elements} + \label{tab:ean_elmts} +\end{table} +\def\arraystretch{1} + +There are 3 types of elements: A, B and C. Type C is obtained by swapping 1s and 0s from type A. Type B is obtained by flipping type C from left to right. +\begin{comment} +For example: +\def\arraystretch{1.5} +\begin{table}[h] +\centering +\begin{tabu}{|[2pt]c|c|c|c|[2pt]} +\tabucline[2pt]{-} +Char. & A & B & C \\ +\tabucline[2pt]{-} +0 & 0001101 & 0100111 & 1110010 \\ +\hline +1 & 0011001 & 0110011 & 1100110 \\ +\tabucline[2pt]{-} +\end{tabu} +\caption{Example of EAN elements} +\label{tab:ean_elmt_ex} +\end{table} +\def\arraystretch{1} +\end{comment} + +This structure makes it easy to find the type of a certain element. +Bs and Cs have an even number of 1s, while As have an odd number. Additionally, As an Bs start with 0 and end with 1, whereas Cs are the opposite. + +In this way, if the code is read in the wrong way, C elements will appear as Bs, and A elements will be invalid because no element starts with a 1 and has an odd number of 1s. Similarly, if the barcode is printed with inverted colors (white on black), A elements will be read as Cs, and B elements will be invalid, since no element starts with a 1 and has an odd number of 1s. + +EAN barcodes are thus very practical since they can be scanned in any orientation and support color inversion. + +\subsubsection{EAN-8} +\label{sss:ean8} +An EAN-8 barcode has the following structure: +\def\arraystretch{1.5} +\begin{table}[H] + \centering + \begin{tabu}{|[2pt]c|c|c|c|c|c|c|c|c|c|c|[2pt]} + \tabucline[2pt]{-} + left & A & A & A & A & mid & C & C & C & C & right\\ + \tabucline[2pt]{-} + \end{tabu} + \caption{EAN-8 structure} + \label{tab:ean8_struct} +\end{table} +\def\arraystretch{1} + +In table \ref{tab:ean8_struct}, "left" and "right" are the end delimiters "101". "mid" is the center delimiter "01010". +To illustrate, let's encode the value "8427372". + +\begin{enumerate} + \item Calculate the checksum digit: + \def\arraystretch{1.5} + \begin{table}[H] + \centering + \begin{tabu}{c|c|c|c|c|c|c|c|c} + %\hline + & 8 & 4 & 2 & 7 & 3 & 7 & 2 & \\ + %\hline + x & 3 & 1 & 3 & 1 & 3 & 1 & 3 & \\ + \tabucline[2pt]{-} + + &24 & 4 & 6 & 7 & 9 & 7 & 6 & = 63 \\ + %\hline + \end{tabu} + \caption{Luhn Formula (EAN-8 example)} + \label{tab:luhn_ean8_ex} + \end{table} + \def\arraystretch{1} + + Thus the last digit is $10 - (63 \textrm{ mod } 10) = 10 - 3 = 7$. + + %\item Take the corresponding element for each digit (As for the first 4, Cs for the last 4) + \item Take each digit's corresponding element: As for the first 4, Cs for the rest (table \ref{tab:ean8_elmt_ex}). + + \item Add the delimiters "101" at each end and "01010" between both halves of the code. + \item For each 1, draw a black bar and for each 0 a white one (figure \ref{fig:ean8_ex}). +\end{enumerate} + +\begin{minipage}[b]{\textwidth} + \centering + \begin{minipage}[c]{0.26\linewidth} + \centering + \def\arraystretch{1.5} + \begin{tabu}{|[2pt]c|c|[2pt]} + \tabucline[2pt]{-} + Char. & Element \\ + \tabucline[2pt]{-} + 8 & 0110111 \\ + \hline + 4 & 0100011 \\ + \hline + 2 & 0010011 \\ + \hline + 7 & 0111011 \\ + \tabucline[1pt]{-} + 3 & 1000010 \\ + \hline + 7 & 1000100 \\ + \hline + 2 & 1101100 \\ + \hline + 7 & 1000100 \\ + \tabucline[2pt]{-} + \end{tabu} + \def\arraystretch{1} + \captionof{table}{EAN-8 example elements} + \label{tab:ean8_elmt_ex} + \end{minipage} + \hfill + \begin{minipage}[c]{0.7\linewidth} + \centering + \includegraphics[width=\linewidth]{images/ean8_example_2} + \captionof{figure}{EAN-8 example ("\texttt{84273727}")} + \label{fig:ean8_ex} + \end{minipage} +\end{minipage} + +\subsubsection{EAN-13} +\label{sss:ean13} + +EAN-13 follows the same principles as EAN-8. The structure of such a code is the following: + +\def\arraystretch{1.5} +\begin{table}[H] + \centering + \begin{tabu}{|[2pt]c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|[2pt]} + \tabucline[2pt]{-} + \multirow{2}{*}{left} & A & A & A & A & A & A & \multirow{2}{*}{mid} & \multirow{2}{*}{C} & \multirow{2}{*}{C} & \multirow{2}{*}{C} & \multirow{2}{*}{C} & \multirow{2}{*}{C} & \multirow{2}{*}{C} & \multirow{2}{*}{right}\\ + \cline{2-7} + & B & B & B & B & B & B & & & & & & & & \\ + \tabucline[2pt]{-} + \end{tabu} + \caption{EAN-13 structure} + \label{tab:ean13_struct} +\end{table} +\def\arraystretch{1} + +This has only 12 places for elements, 6 A/B and 6 C. The 13th digit (in reality the first) is encoded in the pattern of A and B elements. Here is the list of patterns corresponding to each digit: + +\def\arraystretch{1.5} +\begin{table}[H] + \centering + \begin{tabu}{|[2pt]c|c|[2pt]c|c|[2pt]} + \tabucline[2pt]{-} + Digit & Pattern & Digit & Pattern\\ + \tabucline[2pt]{-} + 0 & AAAAAA & 5 & ABBAAB \\ + \hline + 1 & AABABB & 6 & ABBBAA \\ + \hline + 2 & AABBAB & 7 & ABABAB \\ + \hline + 3 & AABBBA & 8 & ABABBA \\ + \hline + 4 & ABAABB & 9 & ABBABA \\ + \tabucline[2pt]{-} + \end{tabu} + \caption{EAN-13 1st digit patterns} + \label{tab:ean13_patterns} +\end{table} +\def\arraystretch{1} + +It can be noticed that the first element is always an A so that reading direction can easily be determined. + +Let's illustrate EAN-13 by encoding the value "978294062105". + + +\begin{enumerate} + \item Calculate the checksum digit: + \def\arraystretch{1.5} + \begin{table}[H] + \centering + \begin{tabu}{c|c|c|c|c|c|c|c|c|c|c|c|c|c} + %\hline + & 9 & 7 & 8 & 2 & 9 & 4 & 0 & 6 & 2 & 1 & 0 & 5 & \\ + %\hline + x & 1 & 3 & 1 & 3 & 1 & 3 & 1 & 3 & 1 & 3 & 1 & 3 & \\ + \tabucline[2pt]{-} + + & 9 &21 & 8 & 6 & 9 &12 & 0 &18 & 2 & 3 & 0 &15 & = 103 \\ + %\hline + \end{tabu} + \caption{Luhn Formula (EAN-13 example)} + \label{tab:luhn_ean13_ex} + \end{table} + \def\arraystretch{1} + + Thus the last digit is $10 - (103 \textrm{ mod } 10) = 10 - 3 = 7$. + + \item Get the pattern corresponding to the first digit: 9 $\rightarrow$ ABBABA + + \item Take the corresponding element for each digit + \def\arraystretch{1.5} + \begin{table}[H] + \centering + \begin{tabu}{|[2pt]c|c|c|[2pt]|[2pt]c|c|c|[2pt]} + \tabucline[2pt]{-} + Char. & Type & Element & Char. & Type & Element \\ + \tabucline[2pt]{-} + 7 & A & 0111011 & 6 & C & 1010000\\ + \hline + 8 & B & 0001001 & 2 & C & 1101100\\ + \hline + 2 & B & 0011011 & 1 & C & 1100110\\ + \hline + 9 & A & 0001011 & 0 & C & 1110010\\ + \hline + 4 & B & 0011101 & 5 & C & 1001110\\ + \hline + 0 & A & 0001101 & 7 & C & 1000100\\ + \tabucline[2pt]{-} + \end{tabu} + \caption{EAN-13 example elements} + \label{tab:ean13_elmt_ex} + \end{table} + \def\arraystretch{1} + + \item Add the delimiters "101" at each end and "01010" between both halves of the code. + \item For each 1, draw a black bar and for each 0 a white one. + + \begin{figure}[H] + \centering + \includegraphics[width=0.5\linewidth]{images/ean13_example} + \caption{EAN-13 example ("\texttt{9782940621057}")} + \label{fig:ean13_ex} + \end{figure} +\end{enumerate} diff --git a/latex/barcode_origin.tex b/latex/barcode_origin.tex new file mode 100644 index 0000000..7c4ecb9 --- /dev/null +++ b/latex/barcode_origin.tex @@ -0,0 +1,14 @@ +\chapter{Barcodes} +\label{chap:barcode_origin} + +\section{Origin} +\label{sec:barcode_origin} + +The patent for the first barcode\cite{barcode_patent} was filed slightly more than 70 years ago, in 1949, by then Drexel University students Norman J. Woodland and Bernard Silver. Officially established in 1952, this patent described the first barcode, a reading device and a circular design. However, success did not strike immediately, mainly because of the impractical and limited resources of the time. +Its first use was on trains, as an identification system (KarTrak\cite{kartrak}). It was soon abandonned however because of readability and maintenance problems. + +A few years later, in the 1970s, IBM, which now counted Mr. Woodland as an associate, had developed the linear UPC barcode. The Universal Product Code is still in use today, with some modifications and standardizations. It was and is used in stores to identify groceries. This kind of tagging allowed for shorter waits at registers when checking out and greatly influenced the capitalist society we live in nowadays. As well as improving time efficiency, it also reduced the number of human errors which could happen when manually entering the prices of items bought by customers. + +Since then, many other types of barcodes have been created for more specialized purposes, like postal mail, warehouse inventories, libraries or medicines. The main advantage of barcodes is that they can be read very quickly with a single laser scan. The first barcodes didn't even need a computer and could be decoded with only relatively simple electronic circuits \cite[p.3]{barcode_patent}. + +In 1974, the GS1 was founded. This international group is responsible for managing encoding standards in the field of logistics and sale of goods. diff --git a/latex/barcode_python.tex b/latex/barcode_python.tex new file mode 100644 index 0000000..98c7127 --- /dev/null +++ b/latex/barcode_python.tex @@ -0,0 +1,235 @@ +\section{Application in Python} +\label{sec:barcode_python} + +In this section, we will implement barcode generation in Python. We will first program a "Code-39" encoder, then an EAN-8 and finally an EAN-13. + +\subsection{Code-39} +\label{ssec:code39_py} + +This type of code being just a matter of translating each character to a particular group of wide and narrow stripes, the implementation is quite simple. + +We first create a dictionary holding the codes for each character. + +\begin{minted}[frame=single]{python} +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" +} +\end{minted} + +To convert a string, we map each character to its corresponding binary representation and join the resulting codes with "0" in between. + +\begin{minted}[frame=single]{python} +def code39(text): + text = text.upper() + text = map(lambda c: code39_dict[c], text) + return "0".join(text) +\end{minted} + +We will also need a function to render the barcode. For this, we will use the Pygame module. + +\begin{minted}[frame=single]{python} +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 +\end{minted} + +The full python script can be found in appendix \ref{app:code39_py} or on \hreffn{https://github.com/LordBaryhobal/5D\_Heredero\_Louis\_TM2022/blob/main/python/code39.py}{GitHub}. + +\subsection{EAN-8} +\label{ssec:ean8_py} + +The first step to create an EAN-8 barcode is to compute the check digit with Luhn's formula. +To make this function also usable for EAN-13, we need to redefine the formula as such: + +\begin{enumerate} + \item Multiply each digit by the alternating factors 1 and 3 starting with 3 \textbf{from the end}. + + \item Add them together then take the modulo ten and subtract the result from 10. + + \item If the result is equal to 10, change it to 0. +\end{enumerate} + +%Since this function will also be used for EAN-13, with only the factors changing, we will make it general enough. + +In python, the function multiplies the i\textsuperscript{th} to last digit by: \[ + \text{factor} = 3 - (i\ mod\ 2) * 2 +\] +which basicly is step 1 above. + +\def\arraystretch{1.5} +\begin{table}[H] + \centering + \begin{tabu}{|[2pt]c|[2pt]c|c|c|c|c|c|[2pt]} + \tabucline[2pt]{-} + i & ... & 4 & 3 & 2 & 1 & 0 \\ + \hline + factor & ... & 3 & 1 & 3 & 1 & 3 \\ + \tabucline[2pt]{-} + \end{tabu} + \caption{Python Luhn formula example} + \label{tab:luhn_py_ex} +\end{table} +\def\arraystretch{1} + +%\begin{minipage}{\linewidth} +\begin{minted}[frame=single]{python} +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 +\end{minted} +%\end{minipage} + +Both code types also need the table of elements: + +\begin{minted}[frame=single]{python} +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)) +\end{minted} + +The following function converts a number to the list of its bits: +\begin{minted}[frame=single]{python} +def bin_list(n): + return list(map(int, f"{n:07b}")) +\end{minted} + +Finally, the encoding function: +\begin{minted}[frame=single]{python} +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 +\end{minted} + +We will use a similar function as in \autoref{ssec:code39_py} to render the barcode + +\begin{minted}[frame=single]{python} +def draw_barcode(barcode, win): + width = win.get_width()*0.8 + height = win.get_height()*0.5 + bar_w = width/len(barcode) + + 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, bar_w, height]) + + x += bar_w +\end{minted} + +The full python script can be found in appendix \ref{app:ean_py} or on \hreffn{https://github.com/LordBaryhobal/5D\_Heredero\_Louis\_TM2022/blob/main/python/ean.py}{GitHub} + +\subsection{EAN-13} +\label{ssec:ean13_py} + +The main difference with EAN-8 is the encoding of the first digit, using an A/B pattern. We will create a list of these patterns: + +\begin{minted}[frame=single]{python} +ean13_patterns = [ + "AAAAAA", + "AABABB", + "AABBAB", + "AABBBA", + "ABAABB", + "ABBAAB", + "ABBBAA", + "ABABAB", + "ABABBA", + "ABBABA" +] +\end{minted} + +And the appropriate encoding function: + +\begin{minted}[frame=single]{python} +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 +\end{minted} + +The full python script can be found in appendix \ref{app:ean_py} or on \hreffn{https://github.com/LordBaryhobal/5D\_Heredero\_Louis\_TM2022/blob/main/python/ean.py}{GitHub} diff --git a/latex/bibliography.tex b/latex/bibliography.tex new file mode 100644 index 0000000..915d873 --- /dev/null +++ b/latex/bibliography.tex @@ -0,0 +1,10 @@ +%https://tex.stackexchange.com/a/98995 +\cleardoublepage + +\phantomsection + +\addcontentsline{toc}{chapter}{Bibliography} + +%\bibliographystyle{abbrv} + +\printbibliography diff --git a/latex/conclusion.tex b/latex/conclusion.tex new file mode 100644 index 0000000..fde0bcb --- /dev/null +++ b/latex/conclusion.tex @@ -0,0 +1,10 @@ +\chapter{Conclusion} +\label{chap:conclusion} + +We have seen how engineers such as Woodland and Silver have built the basis for a barcode system that optimises many processes, and how these barcodes provide an easy, fast and reliable way of encoding data. These values, ease of use, speed and reliability, are most certainly what the development of new technologies is all about. +The sheer number of barcodes currently in use around the world is proof of their ingenuity. +Following the same success, QR-Codes conquered the world and became part of our daily lives as we encounter them everywhere. + +Because they have become standard elements in our society, they are often disregarded and wrapped in mystery, like magical tags instantly recognizable by our devices. This work is obviously not an exhaustive list of all codes that exist. Many other types can be commonly found, such as PDF-417 or Aztec codes, both of which also use the Reed-Solomon algorithm for error-correction, or Postnet, a specialized type of barcodes used by the United States Postal Service. + +The Lycacode described in \autoref{chap:custom_code} was primarily designed for education purposes, as a way to put in practice the formerly explained principles, but could well have a real application in the Collège. diff --git a/latex/custom_code.tex b/latex/custom_code.tex new file mode 100644 index 0000000..ec68d1f --- /dev/null +++ b/latex/custom_code.tex @@ -0,0 +1,500 @@ +\chapter{Custom code} +\label{chap:custom_code} + +%\emph{creation of a new type of 2D code, based on previously seen concepts} +In this chapter, we will create a new type of 2D code, based on concepts discussed in this work: the Lycacode. + +Some design choices have been made for ease of use and others for aesthetic purposes, each explained in their relevant section. + +The basic format is in the form of a trefoil cross, the blazon of Saint-Maurice and of the Collège de l'Abbaye. + +\begin{figure}[H] + \centering + \includegraphics[width=0.4\textwidth]{images/lycacode_cross} + \includegraphics[width=0.4\textwidth]{images/lycacode_squares} + \caption{Lycacode: trefoil cross and squares} + \label{fig:lycacode_cross} +\end{figure} + +%\begin{figure}[H] +% \centering +% \includegraphics[width=0.5\textwidth]{images/lycacode_cross} +% \caption{Custom code: trefoil cross} +% \label{fig:lycacode_cross} +%\end{figure} + +This cross is split into 25 squares which hold data. Each square is made of a 3x3 grid of dots and blanks, representing bits. The right of figure \ref{fig:lycacode_cross} shows how data (white dots) is put in the squares (highlighted in black)\footnote{the black squares are simply visual aids and are not part of the final code}. A dot represents a 1 while the absence of one is a 0. + +The decision of using a grid-like pattern is convient for data placement as well as for reading the code. + +The central square is reserved for the orientation pattern, as described in \autoref{ssec:lycacode_ex_layout}. +Additionally, the three top- and bottom-most dots are saved for the mask id (see \autoref{ssec:lycacode_ex_mask}). + +\section{Encoding} +\label{sec:lycacode_encoding} + +This code can work in one of four modes: +\begin{enumerate} + \setcounter{enumi}{-1} + \item Person + \item Location + \item Link + \item Text +\end{enumerate} + +\subsection{Person - mode 0} +\label{ssec:lycacode_mode0} + +In mode 0, the code represents a person from the school. It can either be a student (type 0), a teacher (type 1) or someone else (type 2), such as the cleaning staff or caretaker. Table \ref{tab:lycacode_person} lists the different values encoded by each type and their corresponding bit size. Column "bit size" is the number of bits the value is encoded on. These have been chosen to use as few bits as possible to leave room for possible future additional data. + +\def\arraystretch{1.5} +\begin{table}[H] + \centering + \begin{tabu}{|[2pt]l|l|c|[2pt]} + \tabucline[2pt]{-} + Type & Value & Bit size\\ + \tabucline[1pt]{-} + \multirow{5}{*}{Student} & type & 2 \\ + \cline{2-3} + & id & 20 \\ + \cline{2-3} + & year & 3 \\ + \cline{2-3} + & class & 4 \\ + \cline{2-3} + & initials & 10 \\ + \tabucline[1pt]{-} + \multirow{2}{*}{Teacher} & type & 2 \\ + \cline{2-3} + & id & 20 \\ + \tabucline[1pt]{-} + \multirow{2}{*}{Other} & type & 2 \\ + \cline{2-3} + & id & 20 \\ + \tabucline[2pt]{-} + \end{tabu} + \caption{Lycacode: person mode - values} + \label{tab:lycacode_person} +\end{table} +\def\arraystretch{1} + +\textbf{For students} + +\texttt{year} is the year number. DUBS is represented by the value 0.\\ +\texttt{class} is the index of the class letter in the alphabet, starting from 0. For example, D is 3.\\ +\texttt{initials} represent the initial of the firstname and that of the lastname, each as 5 bit numbers. The value of each letter is their index in the alphabet, starting from 0. + +\paragraph{Example} + +\begin{center} + \begin{tabular}{c|c|c|c|c} + type & id & year & class & initials \\ + \hline + Student & 16048 & 5 & D & LH\\ + \end{tabular} + + Bits: 00 / 00 / 00000011111010110000 / 101 / 0011 / 01011 / 00111 +\end{center} + +\subsection{Location - mode 1} +\label{ssec:lycacode_mode1} + +In mode 1, the code represents a location in the school. The section is encoded on 3 bits according to the following table: + +\def\arraystretch{1.5} +\begin{table}[H] + \centering + \begin{tabu}{|[2pt]c|c|[2pt]} + \tabucline[2pt]{-} + Section & Value \\ + \tabucline[1pt]{-} + A & 0 \\ + \hline + B & 1 \\ + \hline + C & 2 \\ + \hline + D & 3 \\ + \hline + Boarding school & 4 \\ + \hline + "Bateau" & 5 \\ + \hline + Sports alley & 6 \\ + \hline + Football fields & 7 \\ + \tabucline[2pt]{-} + \end{tabu} + \caption{Lycacode: location mode - sections} + \label{tab:lycacode_loc_sections} +\end{table} +\def\arraystretch{1} + +Additionally the room number (or other id) is encoded on 9 bits. + +\paragraph{Example} + +\begin{center} + \begin{tabular}{c|c} + section & room \\ + \hline + 4 & 209 \\ + \end{tabular} + + Bits: 01 / 100 / 011010001 +\end{center} + +\subsection{Link - mode 2} +\label{ssec:lycacode_mode2} + +In mode 2, the code represents a URL. The actual URLs are stored in a database and only the id is saved on the code as a 32 bit number. Scanners then fetch the URL info from the server's database. + +\subsection{Text - mode 3} +\label{ssec:lycacode_mode3} + +In mode 3, the code represents normal text. Text data is simply converted to UTF-8. The number of encoded characters is first encoded on 4 bits and added before text data. Due to its limited capacity, a Lycacode can only store up to 14 characters. + +\paragraph{Example} + +\begin{center} + \begin{tabular}{c|c} + length & text \\ + \hline + 4 & Lyca \\ + \end{tabular} + + Bits: 11 / 0100 / 01001100 / 01111001 / 01100011 / 01100001 +\end{center} + +\section{Error correction} +\label{sec:lycacode_err_corr} + +It goes without saying that this code uses some kind of error correction. To keep it simple enough, Hamming(7, 4) codes have been chosen to fulfil this role. Encoded data is first padded to the maximum number of data bits $M$: + +\[ + M = T * R +\] + +where $T$ is the total number of bits which can be encoded on the cross and $R$ is the ratio of data bits over blocksize (here, $R = \frac{4}{7}$). $T$ can be calculated as follows: + +\[ + T = \underbrace{3^2}_{\substack{\text{number of dots} \\ \text{in a square}}} * 24 - \underbrace{6}_{\text{mask id}} +\] + +\section{Example} +\label{sec:lycacode_example} + +Let's create a Lycacode to illustrate. We will make a student code using the values from the example in \autoref{ssec:lycacode_mode0}. + +\subsection{Data encoding} +\label{ssec:lycacode_ex_encoding} + +Table \ref{tab:lycacode_ex_values} lists all values to encode and their respective binary strings. + +\def\arraystretch{1.5} +\begin{table}[H] + \centering + \begin{tabu}{|[2pt]l|c|l|[2pt]} + \tabucline[2pt]{-} + Property & Value & Binary\\ + \tabucline[1pt]{-} + Mode & 0 & 00 \\ + \hline + Type & 0 (=student) & 00 \\ + \hline + Id & 16048 & 00000011111010110000 \\ + \hline + Year & 5 & 101 \\ + \hline + Class & 3 (=D) & 0011 \\ + \hline + Initials & LH & 01011 00111 \\ + \hline + \tabucline[2pt]{-} + \end{tabu} + \caption{Lycacode: example values} + \label{tab:lycacode_ex_values} +\end{table} +\def\arraystretch{1} + +The raw data bit string is thus: + +\[ + \underbrace{00}_{\text{mode}} \underbrace{00}_{\text{type}} \underbrace{00000011111010110000}_{\text{id}} \underbrace{101}_{\text{year}} \underbrace{0011}_{\text{class}} \underbrace{0101100111}_{\text{initials}} +\] + +We then need to pad it to fill the remaining free bits. First we pad with zeros to the nearest multiple of 4 (data bits per block). +Then we fill the rest with a pattern of consecutive binary numbers\footnote{the pattern is the series of natural numbers in binary starting from 0, e.g. 0, 1, 10, 11, 100, ...}, like this: + +\[ + 01101110010111011110001001101010111100110111101111... +\] +%We then pad it on the right with zeros to fill the remaining free bits M=124 (see section \ref{sec:lycacode_err_corr}) and construct the Hamming codes: +This pattern has the sole purpose of adding pseudo-random data so that there is data on the whole code. This is only an aesthetic choice. + +\pagebreak + +\subsection{Hamming codes} +\label{ssec:lycacode_ex_hamming} + +Finally we construct the Hamming codes: + +\def\arraystretch{1.5} +\begin{table}[H] + \centering + \resizebox{0.4\textwidth}{!}{ + \begin{tabu}{|[2pt]c|c|c|c|c|c|c|c|[2pt]} + \tabucline[2pt]{-} + & 1 & 2 & 3 & 4 & 5 & 6 & 7 \\ + \tabucline[1pt]{-} + Group 1 & \_ & \_ & 0 & \_ & 0 & 0 & 0 \\ + \hline + Group 2 & \_ & \_ & 0 & \_ & 0 & 0 & 0 \\ + \hline + Group 3 & \_ & \_ & 0 & \_ & 0 & 1 & 1 \\ + \hline + Group 4 & \_ & \_ & 1 & \_ & 1 & 1 & 0 \\ + \hline + Group 5 & \_ & \_ & 1 & \_ & 0 & 1 & 1 \\ + \hline + Group 6 & \_ & \_ & 0 & \_ & 0 & 0 & 0 \\ + \hline + Group 7 & \_ & \_ & 1 & \_ & 0 & 1 & 0 \\ + \hline + Group 8 & \_ & \_ & 0 & \_ & 1 & 1 & 0 \\ + \hline + Group 9 & \_ & \_ & 1 & \_ & 0 & 1 & 1 \\ + \hline + Group 10 & \_ & \_ & 0 & \_ & 0 & 1 & 1 \\ + \hline + Group 11 & \_ & \_ & 1 & \_ & 0 & 0 & 0 \\ + \hline + Group 12 & \_ & \_ & 0 & \_ & 1 & 1 & 0 \\ + \hline + Group 13 & \_ & \_ & 1 & \_ & 1 & 1 & 0 \\ + \hline + Group 14 & \_ & \_ & 0 & \_ & 1 & 0 & 1 \\ + \hline + Group 15 & \_ & \_ & 1 & \_ & 1 & 0 & 1 \\ + \hline + Group 16 & \_ & \_ & 1 & \_ & 1 & 1 & 0 \\ + \hline + Group 17 & \_ & \_ & 0 & \_ & 0 & 1 & 0 \\ + \hline + Group 18 & \_ & \_ & 0 & \_ & 1 & 1 & 0 \\ + \hline + Group 19 & \_ & \_ & 1 & \_ & 0 & 1 & 0 \\ + \hline + Group 20 & \_ & \_ & 1 & \_ & 1 & 1 & 1 \\ + \hline + Group 21 & \_ & \_ & 0 & \_ & 0 & 1 & 1 \\ + \hline + Group 22 & \_ & \_ & 0 & \_ & 1 & 1 & 1 \\ + \hline + Group 23 & \_ & \_ & 1 & \_ & 0 & 1 & 1 \\ + \hline + Group 24 & \_ & \_ & 1 & \_ & 1 & 1 & 0 \\ + \hline + Group 25 & \_ & \_ & 0 & \_ & 0 & 0 & 1 \\ + \hline + Group 26 & \_ & \_ & 0 & \_ & 0 & 0 & 1 \\ + \hline + Group 27 & \_ & \_ & 1 & \_ & 0 & 0 & 1 \\ + \hline + Group 28 & \_ & \_ & 0 & \_ & 1 & 0 & 0 \\ + \hline + Group 29 & \_ & \_ & 1 & \_ & 1 & 1 & 0 \\ + \hline + Group 30 & \_ & \_ & 1 & \_ & 0 & 0 & 1 \\ + \tabucline[2pt]{-} + \end{tabu}} + \resizebox{0.4\textwidth}{!}{ + \begin{tabu}{|[2pt]c|c|c|c|c|c|c|c|[2pt]} + \tabucline[2pt]{-} + & 1 & 2 & 3 & 4 & 5 & 6 & 7 \\ + \tabucline[1pt]{-} + Group 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ + \hline + Group 2 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ + \hline + Group 3 & 1 & 0 & 0 & 0 & 0 & 1 & 1 \\ + \hline + Group 4 & 0 & 0 & 1 & 0 & 1 & 1 & 0 \\ + \hline + Group 5 & 0 & 1 & 1 & 0 & 0 & 1 & 1 \\ + \hline + Group 6 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ + \hline + Group 7 & 1 & 0 & 1 & 1 & 0 & 1 & 0 \\ + \hline + Group 8 & 1 & 1 & 0 & 0 & 1 & 1 & 0 \\ + \hline + Group 9 & 0 & 1 & 1 & 0 & 0 & 1 & 1 \\ + \hline + Group 10 & 1 & 0 & 0 & 0 & 0 & 1 & 1 \\ + \hline + Group 11 & 1 & 1 & 1 & 0 & 0 & 0 & 0 \\ + \hline + Group 12 & 1 & 1 & 0 & 0 & 1 & 1 & 0 \\ + \hline + Group 13 & 0 & 0 & 1 & 0 & 1 & 1 & 0 \\ + \hline + Group 14 & 0 & 1 & 0 & 0 & 1 & 0 & 1 \\ + \hline + Group 15 & 1 & 0 & 1 & 0 & 1 & 0 & 1 \\ + \hline + Group 16 & 0 & 0 & 1 & 0 & 1 & 1 & 0 \\ + \hline + Group 17 & 0 & 1 & 0 & 1 & 0 & 1 & 0 \\ + \hline + Group 18 & 1 & 1 & 0 & 0 & 1 & 1 & 0 \\ + \hline + Group 19 & 1 & 0 & 1 & 1 & 0 & 1 & 0 \\ + \hline + Group 20 & 1 & 1 & 1 & 1 & 1 & 1 & 1 \\ + \hline + Group 21 & 1 & 0 & 0 & 0 & 0 & 1 & 1 \\ + \hline + Group 22 & 0 & 0 & 0 & 1 & 1 & 1 & 1 \\ + \hline + Group 23 & 0 & 1 & 1 & 0 & 0 & 1 & 1 \\ + \hline + Group 24 & 0 & 0 & 1 & 0 & 1 & 1 & 0 \\ + \hline + Group 25 & 1 & 1 & 0 & 1 & 0 & 0 & 1 \\ + \hline + Group 26 & 1 & 1 & 0 & 1 & 0 & 0 & 1 \\ + \hline + Group 27 & 0 & 0 & 1 & 1 & 0 & 0 & 1 \\ + \hline + Group 28 & 1 & 0 & 0 & 1 & 1 & 0 & 0 \\ + \hline + Group 29 & 0 & 0 & 1 & 0 & 1 & 1 & 0 \\ + \hline + Group 30 & 0 & 0 & 1 & 1 & 0 & 0 & 1 \\ + \tabucline[2pt]{-} + \end{tabu}} + \caption{Lycacode: example hamming codes} + \label{tab:lycacode_ex_hamming} +\end{table} +\def\arraystretch{1} + +\subsection{Laying out data} +\label{ssec:lycacode_ex_layout} + +The matrix layout is shown in figure \ref{fig:lycacode_layout}. Notice the center square; it is used for rotation and mirror image detection. +The middle pattern has to be asymmetrical both in reflection and rotation. Here, the top dot helps determine rotation, while the left one is used to check whether the code is mirrored or not. +The central dot indicates that this is a Lycacode. Indeed, another type of code, Mini Lycacodes, has been created. Those don't have this dot, signaling that they are Mini Lycacodes.\footnote{Mini Lycacodes are not described here but are implemented in Python in the files \texttt{lycacode\_gen\_mini.py} and \texttt{lycacode\_scanner\_mini.py}} + +The top and bottom gray areas are reserved for the mask id as explained later. +Also note that white means 1 and black 0. + +Starting from the top left going in reading direction, the bits are layed out in the free areas. As for QR-Codes, the first bit of each group is first layed, then the second, the third and so on. Figure \ref{fig:lycacode_ex_data_layout} shows the result of this step. The interleaving process allow a division of data in such a way that if a portion of the code is unreadable, the errors are distributed accross multiple data blocks, increasing the chance of recovery (since each block can only correct one bit). + +\begin{figure}[H] + \centering + \begin{subfigure}{0.4\textwidth} + \centering + \includegraphics[width=\textwidth]{images/lycacode_layout} + \caption{Empty} + \label{fig:lycacode_layout} + \end{subfigure} + \begin{subfigure}{0.4\textwidth} + \centering + \includegraphics[width=\textwidth]{images/lycacode_data_layout} + \caption{With data} + \label{fig:lycacode_ex_data_layout} + \end{subfigure} + \caption{Lycacode layout} +\end{figure} + +\subsection{Mask} +\label{ssec:lycacode_ex_mask} + +As a last step, a mask is applied. The 8 masks are described in figure \ref{fig:lycacode_masks}. The best fitting one is selected based upon similar criteria as for QR-Codes\footnote{the exact criteria are defined in the python script \texttt{lycacode\_gen.py}}. Once applied to the data bits, the mask's id is encoded on the 3 reserved bits at the top and bottom of the code. + +The purpose of masking in this context is purely aesthetical. It is a mean to avoid unpleasant visual patterns in the final code. + +\begin{figure}[H] + \centering + \begin{subfigure}{0.4\textwidth} + \centering + \includegraphics[width=0.4\textwidth]{images/lycacode_mask_0} + \caption{x mod 3 = 0} + \label{fig:lycacode_mask_0} + \end{subfigure} + \begin{subfigure}{0.4\textwidth} + \centering + \includegraphics[width=0.4\textwidth]{images/lycacode_mask_1} + \caption{y mod 3 = 0} + \label{fig:lycacode_mask_1} + \end{subfigure} + \begin{subfigure}{0.4\textwidth} + \centering + \includegraphics[width=0.4\textwidth]{images/lycacode_mask_2} + \caption{(x+y) mod 3 = 0} + \label{fig:lycacode_mask_2} + \end{subfigure} + \begin{subfigure}{0.4\textwidth} + \centering + \includegraphics[width=0.4\textwidth]{images/lycacode_mask_3} + \caption{(x mod 3)*(y mod 3) = 0} + \label{fig:lycacode_mask_3} + \end{subfigure} + \begin{subfigure}{0.4\textwidth} + \centering + \includegraphics[width=0.4\textwidth]{images/lycacode_mask_4} + \caption{(y//3+x//3) mod 2 = 0} + \label{fig:lycacode_mask_4} + \end{subfigure} + \begin{subfigure}{0.4\textwidth} + \centering + \includegraphics[width=0.4\textwidth]{images/lycacode_mask_5} + \caption{[(y mod 3)-1]*[(x mod 3)-(y mod 3)-2]*[(y mod 3)-(x mod 3)-2] = 0} + \label{fig:lycacode_mask_5} + \end{subfigure} + \begin{subfigure}{0.4\textwidth} + \centering + \includegraphics[width=0.4\textwidth]{images/lycacode_mask_6} + \caption{(|13-x|+|13-y|) mod 3 = 1} + \label{fig:lycacode_mask_6} + \end{subfigure} + \begin{subfigure}{0.4\textwidth} + \centering + \includegraphics[width=0.4\textwidth]{images/lycacode_mask_7} + \caption{[1-(x mod 2) + max(0, |13-y|-|13-x|)] * [1-(y mod 2) + max(0,|13-x|-|13-y|)] = 0} + \label{fig:lycacode_mask_7} + \end{subfigure} + \caption{Lycacode masks} + \label{fig:lycacode_masks} +\end{figure} + +Note: "//" is integer division + +For our example, the best mask is mask 3. The final binary matrix is shown in figure \ref{fig:lycacode_ex_final_mat}. + +\begin{figure}[H] + \centering + \includegraphics[width=0.5\textwidth]{images/lycacode_ex_final_mat} + \caption{Lycacode example: masked matrix} + \label{fig:lycacode_ex_final_mat} +\end{figure} + +Finally, the matrix is converted to white dots (for 1s) on the red trefoil cross shown in figure \ref{fig:lycacode_cross}, giving the final code in figure \ref{fig:lycacode_ex_final}. + +\begin{figure}[H] + \centering + \includegraphics[width=0.5\textwidth]{images/lycacode_ex_final} + \caption{Lycacode example: final code} + \label{fig:lycacode_ex_final} +\end{figure} + +The external square is used to detect the code and to correct perspective. +Its position and dimensions, which have been chosen quite arbitrarily, are visualized on figure \ref{fig:lycacode_frame}. In fact, only the position and size of the inner border is relevant in the decoding process. + +\begin{figure}[H] + \centering + \includegraphics[width=0.5\textwidth]{images/lycacode_frame} + \caption{Lycacode frame dimensions} + \label{fig:lycacode_frame} +\end{figure} diff --git a/latex/db.bib b/latex/db.bib new file mode 100644 index 0000000..a8292a2 --- /dev/null +++ b/latex/db.bib @@ -0,0 +1,162 @@ +@Patent{barcode_patent, + author = {Norman Woodland and Bernard Silver}, + number = {2612994}, + year = {1952}, + type = {patentus}, + month = oct, + url = {https://worldwide.espacenet.com/patent/search/family/022402610/publication/US2612994A?q=pn%3DUS2612994}, + day = {7}, + dayfiled = {20}, + language = {EN}, + monthfiled = {oct}, + nationality = {US}, + yearfiled = {1949}, +} + +@Online{wiki_code_39, + author = {{Wikipedia contributors}}, + date = {2022}, + title = {Code 39 --- {Wikipedia}{,} The Free Encyclopedia}, + url = {https://en.wikipedia.org/w/index.php?title=Code_39&oldid=1091770428}, + language = {en}, + urldate = {2022-08-03}, +} + +@Online{qrcode_history, + title = {History of QR Code}, + url = {https://www.qrcode.com/en/history/}, + language = {en}, + urldate = {2022-04-06}, +} + +@TechReport{ISO18004, + title = {Information technology — Automatic identification and data capture techniques — Bar code symbology — QR Code}, + institution = {International Organization for Standardization}, + year = {2015}, + type = {Standard}, + url = {https://www.iso.org/standard/62021.html}, + shorttitle = {{ISO}/{IEC} 18004:2015}, +} + +@Online{hamming_2, + author = {3Blue1Brown}, + date = {2020-09-04}, + title = {Hamming codes part 2, the elegance of it all}, + url = {https://www.youtube.com/watch?v=b3NxrZOu_CE}, + language = {en}, + urldate = {2022-04-07}, +} + +@Online{hamming_1, + author = {3Blue1Brown}, + date = {2020-09-04}, + language = {en}, + title = {How to send a self-correcting message (Hamming codes)}, + url = {https://www.youtube.com/watch?v=X8jsijhllIA}, + urldate = {2022-04-07}, +} + +@TechReport{ISO16388, + date = {2007}, + institution = {International Organization for Standardization}, + title = {Information technology — Automatic identification and data capture techniques — Code 39 bar code symbology specification}, + type = {Standard}, + url = {https://www.iso.org/standard/43897.html}, + shorttitle = {{ISO}/{IEC} 16388:2007}, +} + +@TechReport{nasa_rs, + author = {William A. Geisel}, + date = {1990-08-01}, + institution = {NASA Lyndon B. Johnson Space Center Houston, TX, United States}, + title = {Tutorial on Reed-Solomon Error Correction Coding}, + language = {en}, + type = {techreport}, + url = {https://ntrs.nasa.gov/api/citations/19900019023/downloads/19900019023.pdf}, + abstract = {This tutorial attempts to provide a frank, step-by-step approach to Reed-Solomon (RS) error correction coding. RS encoding and RS decoding both with and without erasing code symbols are emphasized. There is no need to present rigorous proofs and extreme mathematical detail. Rather, the simple concepts of groups and fields, specifically Galois fields, are presented with a minimum of complexity. Before RS codes are presented, other block codes are presented as a technical introduction into coding. A primitive (15, 9) RS coding example is then completely developed from start to finish, demonstrating the encoding and decoding calculations and a derivation of the famous error-locator polynomial. The objective is to present practical information about Reed-Solomon coding in a manner such that it can be easily understood.}, + organization = {NASA}, +} + +@Online{computerphile_rs, + author = {Computerphile}, + date = {2019-02-20}, + title = {Reed Solomon Encoding - Computerphile}, + url = {https://www.youtube.com/watch?v=fBRMaEAFLE0}, + language = {en}, +} + + + + + +@Article{reed_solomon, + author = {Reed, I. S. and Solomon, G.}, + date = {1960}, + journaltitle = {Journal of the Society for Industrial and Applied Mathematics}, + title = {Polynomial Codes Over Certain Finite Fields}, + doi = {10.1137/0108018}, + eprint = {https://doi.org/10.1137/0108018}, + number = {2}, + pages = {300-304}, + url = {https://doi.org/10.1137/0108018}, + volume = {8}, +} + +@Online{reed_solomon_wiki, + author = {{Wikipedia Contributors}}, + date = {2022}, + title = {Reed–Solomon error correction --- {Wikipedia}{,} The Free Encyclopedia}, + url = {https://en.wikipedia.org/w/index.php?title=Reed%E2%80%93Solomon_error_correction&oldid=1100051467}, + urldate = {2022-08-03}, +} + +@Online{kartrak, + author = {{Wikipedia contributors}}, + date = {2021}, + title = {KarTrak --- {Wikipedia}{,} The Free Encyclopedia}, + url = {https://en.wikipedia.org/w/index.php?title=KarTrak&oldid=1037680217}, + urldate = {2022-08-15}, +} + +@Online{hamming_wiki, + author = {{Wikipedia contributors}}, + date = {2022}, + title = {Hamming code --- {Wikipedia}{,} The Free Encyclopedia}, + url = {https://en.wikipedia.org/w/index.php?title=Hamming_code&oldid=1065900025}, + urldate = {2022-08-15}, +} + +@Online{nayuki_qr_js, + author = {Nayuki}, + date = {2022-08-30}, + title = {Nayuki-web-published-code/creating-qr-code-steps.js at dfb110475327271e3b7279a432e2d1a1298815ad · nayuki/Nayuki-web-published-code}, + url = {https://github.com/nayuki/Nayuki-web-published-code/blob/dfb110475327271e3b7279a432e2d1a1298815ad/creating-a-qr-code-step-by-step/creating-qr-code-steps.js}, +} + +@Online{wiki_chien_search, + author = {{Wikipedia contributors}}, + date = {2020}, + title = {Chien search --- {Wikipedia}{,} The Free Encyclopedia}, + url = {https://en.wikipedia.org/w/index.php?title=Chien_search&oldid=990999150}, + urldate = {2022-09-03}, +} + +@Online{information_theory, + author = {George Markowsky}, + editor = {{Encyclopedia Britannica}}, + title = {information theory}, + url = {https://www.britannica.com/science/information-theory}, + urldate = {2022-09-04}, + abstract = {information theory, a mathematical representation of the conditions and parameters affecting the transmission and processing of information. Most closely associated with the work of the American electrical engineer Claude Shannon in the mid-20th century, information theory is chiefly of interest to communication engineers, though some of the concepts have been adopted and used in such fields as psychology and linguistics. Information theory overlaps heavily with communication theory, but it is more oriented toward the fundamental limitations on the processing and communication of information and less oriented toward the detailed operation of particular devices. Interest in the concept of information grew}, + langid = {english}, +} + +@Online{rs_for_coders, + author = {Wikiversity}, + date = {2022}, + title = {Reed–Solomon codes for coders --- Wikiversity{,}}, + url = {https://en.wikiversity.org/w/index.php?title=Reed–Solomon_codes_for_coders&oldid=2387659}, + urldate = {2022-04-06}, +} + +@Comment{jabref-meta: databaseType:biblatex;} diff --git a/latex/error_correction.tex b/latex/error_correction.tex new file mode 100644 index 0000000..214f638 --- /dev/null +++ b/latex/error_correction.tex @@ -0,0 +1,461 @@ +\chapter{Error detection and correction} +\label{chap:err_corr} + +This chapter introduces two methods to create self-correcting messages: Hamming codes and Reed-Solomon codes. The former is based on parity bits while the latter takes advantage of advanced mathematical properties of modular arithmetic and polynomials. + +\section{Hamming Codes} +\label{sec:hamming} + +When working with binary data, one way of checking if a received message is corrupted or not is to add a parity bit. The parity of a binary number is even if it has an even number of 1s and odd otherwise. A parity check bit is added such that the total parity of the number is even, i.e. 0 if it is already even, 1 otherwise. + +\def\arraystretch{1.2} +\begin{center} + \begin{tabular}{|c|c|c|c|c||c|c} + \multicolumn{5}{c}{} & \multicolumn{1}{c}{parity bit} & \\ + \cline{1-6} + bit 1 & bit 2 & bit 3 & bit 4 & bit 5 & bit 6 & \multirow{2}{*}{parity: even} \\ + \cline{1-6} + 1 & 1 & 0 & 0 & 1 & 1 & \\ + \cline{1-6} + \end{tabular} +\end{center} +\def\arraystretch{1} + +With this, a single bit error (that is, one bit is wrong) is easy to detect because the parity of the message becomes odd. + +\def\arraystretch{1.2} +\begin{center} + \begin{tabular}{|c|c|c|c|c|c|c} + \cline{1-6} + bit 1 & bit 2 & bit 3 & bit 4 & bit 5 & bit 6 & \multirow{2}{*}{parity: odd} \\ + \cline{1-6} + 1 & 1 & \textbf{1} & 0 & 1 & 1 & \\ + \cline{1-6} + \end{tabular} +\end{center} +\def\arraystretch{1} + +However, a single parity bit doesn't provide enough information to allow locating the error or detecting multiple errors, because an even number of errors would keep an even parity overall. + +\def\arraystretch{1.2} +\begin{center} + \begin{tabular}{|c|c|c|c|c|c|c} + \cline{1-6} + bit 1 & bit 2 & bit 3 & bit 4 & bit 5 & bit 6 & \multirow{2}{*}{parity: even} \\ + \cline{1-6} + 1 & 1 & \textbf{1} & 0 & \textbf{0} & 1 & \\ + \cline{1-6} + \end{tabular} +\end{center} +\def\arraystretch{1} + +Hamming codes are a kind of parity check codes. +Instead of using only one parity bit however, they include several so that locating becomes possible, as well as detecting (not always) multiple errors. + +When creating a Hamming code from a message, data first has to be split into blocks of a given size. For each block a certain number of parity bits is assigned. These two variables (blocksize and number of parity bits) determine the type of Hamming code. +For example a Hamming code with 3 parity bits will form 7-bit blocks, meaning each block can hold 4 data bits. It can thus be called Hamming(7, 4). + +Smaller blocksizes allow more errors to be corrected, because each block can correct one error, but have a lower data density\footnote{data density is the ratio of data bits over blocksize}. On the other hand, larger blocksizes allow less errors to be corrected but have a higher data density. + +Hamming codes are created in such a way that when a bit is flipped, the parity bits indicate exactly where the error occured. For that, each position in the code which is a power of two is a parity bits. Then, each parity bit covers the parity of all bits at positions containing its power in their binary representation. For example, the parity bit at position 4 (0b\ul{1}00) covers bits 5 (0b\ul{1}01), 6 (0b\ul{1}10), 7 (0b\ul{1}11), 12 (0b1\ul{1}00), 13 (0b1\ul{1}01), 14 (0b1\ul{1}10), 15 (0b1\ul{1}11), ... + +Table \ref{tab:hamming_struct} taken from \citetitle{hamming_wiki}\cite{hamming_wiki} offers a good visual representation of this structure: + +\def\arraystretch{1.5} +\begin{table}[H] + \centering + \resizebox{\textwidth}{!}{ + \begin{tabular}{|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|} + \hline + \rowcolor{tabgrey} \multicolumn{2}{|c|}{Bit position} & 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 & 9 & 10 & 11 & 12 & 13 & 14 & 15 \\ + \hhline{-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|} + \rowcolor{tabgrey} \multicolumn{2}{|c|}{Encoded data bits} & \cellcolor{paritybg} p1 & \cellcolor{paritybg} p2 & d1 & \cellcolor{paritybg} p4 & d2 & d3 & d4 & \cellcolor{paritybg} p8 & d5 & d6 & d7 & d8 & d9 & d10 & d11 \\ + \hhline{-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|} + \multirow{4}{*}{\shortstack{Parity\\ bit\\ coverage}} & \cellcolor{paritybg} p1 & \tick & & \tick & & \tick & & \tick & & \tick & & \tick & & \tick & & \tick \\ + \hhline{~|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|} + & \cellcolor{paritybg} p2 & & \tick & \tick & & & \tick & \tick & & & \tick & \tick & & & \tick & \tick \\ + \hhline{~|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|} + & \cellcolor{paritybg} p4 & & & & \tick & \tick & \tick & \tick & & & & & \tick & \tick & \tick & \tick \\ + \hhline{~|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|} + & \cellcolor{paritybg} p8 & & & & & & & & \tick & \tick & \tick & \tick & \tick & \tick & \tick & \tick \\ + \hline + \end{tabular}} + \caption{Hamming code structure} + \label{tab:hamming_struct} +\end{table} +\def\arraystretch{1} + +Here we can see that each data bit (d1, d2, d3, ...) is covered by a unique set of parity bits. + +\pagebreak + +Let's create a Hamming(15, 11) code for the message \texttt{11101100010}. +The first step is to lay out the bits in table \ref{tab:hamming_struct} like so: + +\def\arraystretch{1.5} +\begin{table}[H] + \centering + \resizebox{\textwidth}{!}{ + \begin{tabular}{|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|} + \hline + \rowcolor{tabgrey} \multicolumn{2}{|c|}{Bit position} & 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 & 9 & 10 & 11 & 12 & 13 & 14 & 15 \\ + \hline + \multicolumn{2}{|c|}{\cellcolor{tabgrey} Encoded data bits} & p1 & p2 & 1 & p4 & 1 & 1 & 0 & p8 & 1 & 1 & 0 & 0 & 0 & 1 & 0 \\ + \hline + \multirow{4}{*}{\shortstack{Parity\\ bit\\ coverage}} & \cellcolor{paritybg} p1 & - & & \tick & & \tick & & \cross & & \tick & & \cross & & \cross & & \cross \\ + \hhline{~|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|} + & \cellcolor{paritybg} p2 & & - & \tick & & & \tick & \cross & & & \tick & \cross & & & \tick & \cross \\ + \hhline{~|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|} + & \cellcolor{paritybg} p4 & & & & - & \tick & \tick & \cross & & & & & \cross & \cross & \tick & \cross \\ + \hhline{~|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|} + & \cellcolor{paritybg} p8 & & & & & & & & - & \tick & \tick & \cross & \cross & \cross & \tick & \cross \\ + \hline + \end{tabular}} + + \medskip + + \begin{tabular}{|c|c|c|c|} + \hline + \rowcolor{tabgrey} Parity bit & Covered 1s & Parity of covered bits & Value \\ + \hline + p1 & 3 & odd & 1 \\ + \hline + p2 & 4 & even & 0 \\ + \hline + p4 & 3 & odd & 1 \\ + \hline + p8 & 3 & odd & 1 \\ + \hline + \end{tabular} + \caption{Hamming code example} + \label{tab:hamming_ex} +\end{table} +\def\arraystretch{1} + +Placing the parity bits in their relevant positions, we get the hamming code \texttt{101111011100010}. + +%\bigskip + +To illustrate the decoding process, let's alter bit 11 and change it to a 1. +Now, recalculating the parity bits and comparing the results with the received message, we can find the location of the error. + +\def\arraystretch{1.5} +\begin{table}[H] + \centering + \resizebox{\textwidth}{!}{ + \begin{tabular}{|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|} + \hline + \rowcolor{tabgrey} \multicolumn{2}{|c|}{Bit position} & 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 & 9 & 10 & 11 & 12 & 13 & 14 & 15 \\ + \hline + \multicolumn{2}{|c|}{\cellcolor{tabgrey} Received data bits} & 1 & 0 & 1 & 1 & 1 & 1 & 0 & 1 & 1 & 1 & \textbf{1} & 0 & 0 & 1 & 0 \\ + \hline + \multirow{4}{*}{\shortstack{Parity\\ bit\\ coverage}} & \cellcolor{paritybg} p1 & - & & \tick & & \tick & & \cross & & \tick & & \tick & & \cross & & \cross \\ + \hhline{~|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|} + & \cellcolor{paritybg} p2 & & - & \tick & & & \tick & \cross & & & \tick & \tick & & & \tick & \cross \\ + \hhline{~|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|} + & \cellcolor{paritybg} p4 & & & & - & \tick & \tick & \cross & & & & & \cross & \cross & \tick & \cross \\ + \hhline{~|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|} + & \cellcolor{paritybg} p8 & & & & & & & & - & \tick & \tick & \tick & \cross & \cross & \tick & \cross \\ + \hline + \end{tabular}} + + \medskip + + \begin{tabular}{|c|c|c|c|c|} + \hline + \rowcolor{tabgrey} Parity bit & Covered 1s & Parity of covered bits & Value & Received value \\ + \hline + p1 & 4 & even & 0 & 1 \\ + \hline + p2 & 5 & odd & 1 & 0 \\ + \hline + p4 & 3 & odd & 1 & 1 \\ + \hline + p8 & 4 & even & 0 & 1 \\ + \hline + \end{tabular} + \caption{Hamming code example decoding} + \label{tab:hamming_ex_decoding} +\end{table} +\def\arraystretch{1} + +The difference (XOR) between columns "Value" and "Received value" forms the binary number \texttt{0b1101} = 11, the location of the error. + +\section{Reed-Solomon algorithm} +\label{sec:reed_solomon} + +The Reed-Solomon algorithm is a mathematical process allowing the decoding of a partially corrupted message. It is used in many domains for its strength and reliability, such as for spatial communication, CD/DVD players, some television broadcasts and QR-Codes. + +Reed-Solomon codes were developed by Irving S. Reed and Gustave Solomon in 1960 \cite{reed_solomon} + +As they rely on abstract and complex mathematical concepts, this section will not go in specific details about the actual decoding process. For curious readers, see +\citetitle{computerphile_rs}\cite{computerphile_rs} (presentation, general concept), \citetitle{reed_solomon_wiki}\cite{reed_solomon_wiki} (in depth article) and \citetitle{nasa_rs}\cite{nasa_rs} (complete manual and explanations) + +\subsection{Error detection} +\label{ssec:rs_error_detection} + +Before considering error correction, it is necessary to talk about error detection. Several methods have been developed for this purpose. + +The most basic, as seen in \autoref{sec:hamming}, is a parity check. It consists of appending one or more "parity bits" to a binary message, such that the overall parity is known. For example, let table \ref{tab:err_det_raw} be our raw message + +\def\arraystretch{1.5} +\begin{table}[H] + \centering + \begin{tabu}{|cccccccc|} + \hline + 0 & 1 & 0 & 0 & 0 & 0 & 1 & 1 \\ + \hline + \end{tabu} + \caption{Error detection: raw message} + \label{tab:err_det_raw} +\end{table} +\def\arraystretch{1} + +The parity of this byte is odd -- because there are 3 1s -- so an additional 1 is added to the end. + +In this way, if the message is corrupted -- by 1 bit maximum -- it becomes even, and we know there is an error. +Now obviously it doesn't provide any information on the exact location of the error in the message and can't detect an even number of errors. + +However, this principle can be extended to include a parity bit for every byte. +If represented as a table in which each row is a byte, it can also include parity bits for each column. +Table \ref{tab:err_det_tab} is an example of such usage of parity bits. This implementation is even able to correct a single error as the row and column would be odd. + +\def\arraystretch{1.4} +\begin{table}[H] + \centering + \begin{tabu}{|[2pt]c|cccccccc|c|[2pt]} + \tabucline[2pt]{-} + & bit 0 & bit 1 & bit 2 & bit 3 & bit 4 & bit 5 & bit 6 & bit 7 & parity \\ + \hline + byte 0 & 0 & 1 & 0 & 0 & 0 & 0 & 1 & 1 & 1 \\ + byte 1 & 0 & 1 & 1 & 0 & 1 & 1 & 1 & 1 & 0 \\ + byte 2 & 0 & 1 & 1 & 0 & 0 & 1 & 0 & 0 & 1 \\ + byte 3 & 0 & 1 & 1 & 0 & 0 & 1 & 0 & 1 & 0 \\ + byte 4 & 0 & 1 & 1 & 1 & 0 & 0 & 1 & 1 & 1 \\ + \hline + parity & 0 & 1 & 0 & 1 & 1 & 1 & 1 & 0 & 1 \\ + \tabucline[2pt]{-} + \end{tabu} + \caption{Error detection: bytes table parity} + \label{tab:err_det_tab} +\end{table} +\def\arraystretch{1} + +Such codes however don't provide enough error correction capability - at most 1 bit. Other methods, like the previously explained Hamming codes, allow a more efficient use of parity bits, increasing to some degree the number of fixable errors. + +Reed-Solomon codes use properties of polynomials and modular arithmetic to produce more efficient and more robust correction data. + +\subsection{Binary to polynomials} +\label{ssec:rs_bin_to_poly} +Instead of working directly with binary data, Reed-Solomon codes treat messages as polynomials. +These are formed from binary data as follows: each byte is converted to a decimal integer, representing coefficients of the polynomial. + +For example: +\def\arraystretch{1.4} +\begin{tabu}{|[1pt]c|c|c|c|c|c|[1pt]} + \tabucline[1pt]{-} + raw binary & $01000011$ & $01101111$ & $01100100$ & $01100101$ & $01110011$ \\ + \hline + decimal & $67$ & $111$ & $100$ & $101$ & $115$ \\ + \hline + polynomial & \multicolumn{5}{c|[1pt]}{$67x^4 + 111x^3 + 100x^2 + 101x + 115$}\\ + \tabucline[1pt]{-} +\end{tabu} +\def\arraystretch{1} + +\subsection{Galois Fields} +\label{ssec:rs_galois} +Since the main applications of Reed-Solomon codes are related to digital devices, it is relevant to use bits and bytes. As such, all calculations are performed in a Galois field. A Galois field is basicly a finite set of numbers on which arithmetic operations results in numbers of the set. In the case of QR-Codes, G(256) -- a Galois field of the integers 0 to 255 incl. -- is used. This means every operation between numbers results in a value between 0 and 255 incl., which is an eight-bit positive integer. In this field, addition and subtraction are equivalent and defined as the binary XOR operation. For example: + +\begin{gather*} + 17 + 13 = 17 - 13 = 28 \\ + \Leftrightarrow 0\text{b}10001 \oplus 0\text{b}1101 = 0\text{b}1101 \oplus 0\text{b}10001 = 0\text{b}11100 +\end{gather*} + +Multiplication is more complex though. One property of this Galois field is that every number can be represented as a power of two, XOR 285. +For example: +\begin{equation*} + \begin{split} + 2^{17} =& (\underbrace{2^8}_{256} \oplus 285) * 2^9 = 29 * 2^9 \\ + =& [\underbrace{(29 * 2^4)}_{464} \oplus 285] * 2^5 = 205 * 2^5 \\ + =& [\underbrace{(205 * 2)}_{410} \oplus 285] * 2^4 = 135 * 2^4 \\ + =& [\underbrace{(135 * 2)}_{270} \oplus 285] * 2^3 = 19 * 2^3 \\ + =& 152 \\ + \Rightarrow& \exp_2(17) = 152 \\ + \Rightarrow& \log_2(152) = 17 + \end{split} +\end{equation*} + +To multiply two numbers $a$ and $b$ in the Galois field:\footnote{from now on, $\exp$ and $\log$ are assumed to be base 2} \[ + a * b = \exp(\log(a) + \log(b)) +\] +which also works in regular arithmetic (in $\mathbb{N}^*_+$). + +Division works similarly, but because there are no negative or fractional number in the field, the exponent is kept in the range 0-255 incl. like so: \[ + \frac{a}{b} = \exp([\log(a) - \log(b) + 255]\ mod \ 255) +\] + +And powers too: \[ + a^b = \exp([\log(a) * b]\ mod\ 255) +\] + +\subsection{Generating error correction} +\label{ssec:rs_gen} +To create Reed-Solomon error correction bytes, a generator polynomial $g(x)$ is needed. +This polynomial is created using equation \ref{equ:rs_gen_poly}: +\begin{equation} + g(x) = \prod_{i=0}^{d-1} (x + 2^i) + \label{equ:rs_gen_poly} +\end{equation} + +where $d$ is one more than the degree of the polynomial, equivalent to the number of error correction bytes. + +Let $m(x)$ be our message polynomial (see \autoref{ssec:rs_bin_to_poly}) and $g(x)$ the generator polynomial. The error correction polynomial $E_c(x)$ is then the remainder of the long polynomial division $m(x)/g(x)$. + +Let's illustrate this by creating error correction for the string "Codes". In UTF-8, the message bytes are 67, 111, 100, 101, 115, thus $m(x) = 67x^4+ 111x^3+ 100x^2+ 101x+ 115$. +% We will take the generator polynomial of degree 3, that is: \[ +% g(x) = (x + 1)*(x + 2)*(x + 4)\\ +% = x^3 + 7x^2 + 14x + 8 +% \] +We will take the generator polynomial of degree 4, that is: \[ + g(x) = (x + 1)*(x + 2)*(x + 4)*(x + 8)\\ + = x^4 + 15x^3 + 54x^2 + 120x + 64 +\] + +And thus (reminder that addition and subtraction in the galois field is the binary XOR operation): +\begin{comment} +\[ + \def\arraystretch{1.5} + \begin{array}{rrrrrrrrrrrrr} + 67 & 111 & 100 & 101 & 115 & 0 & 0 & 0 &\divline{}& 1 & 7 & 14 & 8 \\ + \cline{9-13} + -67 & -212 & -181 & -34 & & & & & 67 & 187 & 215 & 84 & 77 \\ + \cline{1-4} + & 187 & 209 & 71 & 115 & & & & & & & & \\ + & -187 & -6 & -12 & -177 & & & & & & & & \\ + \cline{2-5} + & & 215 & 75 & 194 & 0 & & & & & & & \\ + & & -215 & -31 & -52 & -246 & & & & & & & \\ + \cline{3-6} + & & & 84 & 252 & 246 & 0 & & & & & & \\ + & & & -84 & -177 & -127 & -154 & & & & & & \\ + \cline{4-7} + & & & & 77 & 137 & 154 & 0 & & & & & \\ + & & & & -77 & -254 & -225 & -82 & & & & & \\ + \cline{5-8} + & & & & & 119 & 123 & 82 & & & & & + \end{array} + \def\arraystretch{1} +\] +\[ + \Rightarrow E_c(x) = 119x^2 + 123x + 82 +\] +\end{comment} + +\[ + \def\arraystretch{1.5} + \begin{array}{rrrrrrrrrrrrrr} + 67 & 111 & 100 & 101 & 115 & 0 & 0 & 0 & 0 &\divline{1}& 15 & 54 & 120 & 64 \\ + \cline{10-14} + -67 & -246 & -91 & -227 & -13 & & & & & 67 & 153 & 107 & 43 & 8 \\ + \cline{1-5} + & 153 & 63 & 134 & 126 & & & & & & & & & \\ + & -153 & -84 & -222 & -154 & -137 & & & & & & & & \\ + \cline{2-6} + & & 107 & 88 & 228 & 137 & & & & & & & & \\ + & & -107 & -115 & -120 & -191 & -223 & & & & & & & \\ + \cline{3-7} + & & & 43 & 156 & 54 & 223 & & & & & & & \\ + & & & -43 & -148 & -121 & -212 & -18 & & & & & & \\ + \cline{4-8} + & & & & 8 & 79 & 11 & 18 & & & & & & \\ + & & & & -8 & -120 & -173 & -231 & -58 & & & & & \\ + \cline{5-9} + & & & & & 55 & 166 & 245 & 58 & & & & & + \end{array} + \def\arraystretch{1} +\] +\[ + \Rightarrow E_c(x) = 55x^3 + 166x^2 + 245x + 58 +\] + +Details of the first step: +\begin{align*} + 67 * 1 =& \exp(\log(67) + \log(1)) = \exp(98 + 0) = \exp(98) = 67\\ + 67 * 15 =& \exp(\log(67) + \log(15)) = \exp(98 + 75) = \exp(41) = 246\\ + 67 * 54 =& \exp(\log(67) + \log(54)) = \exp(98 + 249) = \exp(155) = 91\\ + 67 * 120 =& \exp(\log(67) + \log(120)) = \exp(98 + 78) = \exp(44) = 227\\ + 67 * 64 =& \exp(\log(67) + \log(64)) = \exp(98 + 6) = \exp(100) = 13 +\end{align*} + +%Then, to communicate our message, $E_c(x)$ is converted to binary and appended to our raw message data, in our case, the final message would be: 67, 111, 100, 101, 115, 119, 123, 82. +Then, to communicate our message, $E_c(x)$ is converted to binary and appended to our raw message data, in our case, the final message would be: 67, 111, 100, 101, 115, 55, 166, 245, 58. + +This is the actual data sent by a device, or in the case of QR-Codes, the actual data encoded on the symbol. Let it be a polynomial named $s(x)$ (for sent data). + +Unfortunately, this is not always what is received by the recipient (or read by the scanner). Some interference may happen during transmission and data may be altered. Let the received data be the polynomial $r(x) = s(x) + e(x)$ (where $e(x)$ is the error polynomial). + +In the next section, we will outline the main steps and basic mathematical principles required for error correction and detection through the Reed-Solomon algorithm. + +\subsection{Detecting and correcting errors} +\label{ssec:rs_error_correction} + +The first step to locating potential errors in a received Reed-Solomon code is to calculate its "syndrome polynomial" $S(x)$. The coefficient of the $i^{th}$ degree term of this polynomial is the value of $r(2^i)$ (the degree of $S(x)$ is equal to the number of error correction bytes minus 1, in our case 2). This means: + +\[ + S(x) = \sum_{i=0}^{d-1} r(2^i) * x^i +\] + +To illustrate the algorithm, we will take + +%\[ r(x) = 67x^7 + 111x^6 + \textbf{110}x^5 + 101x^4 + 115x^3 + 119x^2 + 123x + 82 \] +%\[ \Rightarrow e(x) = 10x^5 \] +\[ r(x) = 67x^8 + 111x^7 + \textbf{110}x^6 + 101x^5 + 115x^4 + \textbf{50}x^3 + 166x^2 + 245x + 58 \] +\[ \Rightarrow e(x) = 10x^6 + 5x^3 \] + +%Thus, \[ +% S(x) = 111x^2 + 93x + 10 +%\] +Thus, \[ + S(x) = 253x^3 + 252x^2 + 146x + 15 +\] + +Reed-Solomon codes provide a very useful mathematical property. In fact, if $s(x) = r(x) \Rightarrow e(x) = 0$, then $S(x) = 0$, enabling a fast return if there is no corruption. + +In the case where $S(x) \not= 0$, we need to compute two other polynomials, the locator and evaluator polynomials. The former helps determine positions of errors whilst the latter is used to find the magnitude of each error, that is, the difference with the real value. + +These can be found with the help of the euclidean algorithm. The exact methods used will not be described here as the mathematical implications behind them are much above the level of this work, but there functioning and alternatives are well documented in \citetitle{nasa_rs}\cite{nasa_rs} (from p.65, section 4.3.1). + +From our example, we would get the following polynomials: +%\[ E_{locator}(x) = 32x + 1 \] +%\[ E_{evalutor}(x) = 10 \] +\[ E_{locator}(x) = 58x^2 + 72x + 1 \] +\[ E_{evalutor}(x) = 13x + 15 \] + +\paragraph{Locator polynomial} + +Once the locator polynomial has been computed, it can be used to get the precise position of each error, as long as the number of errors is not greater than the correction capacity. + +The error location polynomial\footnote{not to be confused with the error locator polynomial} is first calculated from the locator polynomial using Chien search (not described here), a "fast algorithm for determining roots of polynomials defined over a finite field"\cite{wiki_chien_search}. + +In this polynomial, each coefficient's log (in the Galois field) is the byte index of an error in the received message (starting from the end) -- or degree of a wrong coefficient in $r(x)$. + +%Continuing the example, we obtain: \[ E_{location}(x) = 32 \] +Continuing the example, we obtain: \[ E_{location}(x) = 64x + 8 \] + +\paragraph{Evaluator polynomial} + +Using the error location and evaluator polynomial in Forney's algorithm, it is possible to find the magnitude of each error, that is the coefficients of $e(x)$. + +%Our result: \[ E_{mag}(x) = 10 \] +Our result: \[ E_{mag}(x) = 10x + 5 \] + +\paragraph{Correction} + +We now have all the information needed to correct the received message. For that, we need to add the magnitudes to their corresponding locations. Again, the locations are the logarithms of each coefficient in the error location polynomial and magnitudes are the coefficients of $E_{mag}$. + +Our example has two errors, since both $E_{location}$ and $E_{mag}$ are second degree polynomials. +For the first error, we add $10$ to $r_6$ ($6$ being $\log(64)$). +For the second error, we add $5$ to $r_3$ ($3$ being $\log(8)$). + +We can finally recover the original message: 67, 111, 100, 101, 115, 55, 166, 245, 58. diff --git a/latex/images/code_39_example.png b/latex/images/code_39_example.png new file mode 100644 index 0000000000000000000000000000000000000000..a5bc4259b176b1e3ae17ed5f6d0f44f2a2029191 GIT binary patch literal 910 zcmeAS@N?(olHy`uVBq!ia0y~yU_1cC5*$oG5f`nEX+Vmzz$3Dlfq`2Xgc%uT&5-~K zvX^-Jy0SlGVdmCUeBWm6%D}*^>*?YcQgQ3;O-HU~0|AFX_dWlo9&df%#JR$!=S1~t zrGvAU{MB$v^JBPU9?itS$SM#3Bz|mM`b0-?V{OLXNml$f`eke+E_|JHUH#L!sncU_ ze0~4-nccKAdtaaXCLOT*y>lI>>g-GJ?cec<98k7tXkg;dU|`}>SO6oyA~1rWFi-)9 z223@_3RMQMd%%Q)10#zFj6etjSp(Z$O<>&pI&RZ>(=H_7{WHUk5TkEe@cNX4zUHv;(%DTuf_ z8osMPeVsL9(UYfvUTJo|3wfQ2FHKb8XK0vR9mT}paD{=PLyCbRkeNXt3r@N4GBm7U zWPnlvK-Vo|V}Mdn9cUVXN(-i37d4knuK6=-E#*wTNyzvY*nlRbZ5e;?3c z?m#O+?m)5`=nf>Ckz5XR0LTLfC!=WuDn-&rnqNVoLxNT4ZuCY8VnPl@*G)mBKqD1r znBcQ&a0Vu6@rF0TDM?!dvjb|#BO(B#5#%beLmpKlG&nZQpQtj8kzt2*JSABe)y=@* cIS_g8On-{(9i<%$fkh32r>mdKI;Vst01R{sW&i*H literal 0 HcmV?d00001 diff --git a/latex/images/ean8_example.png b/latex/images/ean8_example.png new file mode 100644 index 0000000000000000000000000000000000000000..03b50c0854b52e74ddd61d78440fb2236e7d00cb GIT binary patch literal 1233 zcmeAS@N?(olHy`uVBq!ia0y~yVEhKe3><7g5l4lP9YBhu*vT`50|;t3QaXTq$r9Iy zlHmNblJdl®4t{M=OC;^d;#)V$)1{F3*~`|W^wl097Bs z)cNWG%8W(Z$|B4R7-u1C~h)p00i_>zopr E0OiKQ5C8xG literal 0 HcmV?d00001 diff --git a/latex/images/ean8_example_2.png b/latex/images/ean8_example_2.png new file mode 100644 index 0000000000000000000000000000000000000000..491c4d62cda12d206327758f3ec1f70bdff1f084 GIT binary patch literal 1745 zcmeAS@N?(olHy`uVBq!ia0y~yVEhKe0vv2W5vOlq%0P-O$=lrpNCUx7=iT){inG8Y zvY3H^TNs2H8D`Cq01C2~c>21sKVy{?5wz$$6Iub(80YEY7*cWT?cLjXk1Yfo4qjCF z|Nr!y>4gFk6H|p%uHIc!bt~36(o3m!$&X2kw_f|lz@Yl4l!L+H1|vfvJ41^sgFqPw z5zmKcL8wRJ|NAZV(Yf!jMeUlc-#(Vv-j131(K!9j|F~T9$A5a{j`!4_E;y%r_NK?} zwR28KUb}OubVF6#Iy<$%bBrrS_eLR{pxSs z*4U?}7k(Qn%TCsKzMx!Y^N&y)29ZrBZ}x`kEM8v{7H4_(*86+M!}^lHp6@9-r`)?g zeYeNw(yztGZkAnhc#|yjRAx<{cgKeB`}P_9D($>_|DqPBe`$`7h>qz+XE%Err+3d&i`Oe;Kzj^#{ z_8W!=z-$dn)CsFJ?~B?8J-eRPbKfpRa(`vQpJxH{YCo*2V9+?S{t+mXG<57MyLHog zA7jSVeFtrnfF&#e!KhQ;_;d?zD0HmV|qP%j>%r;`MmQ~&50diYfpa9`7HJO>ipz0 zA}4ypmDg^a{#@ZP&>53ARVDxpxLsKOLW%n`<8y}_50C8*IKw`NIq~>iD~3b=Uaflj z=DKl`Vmsjtp-gD@=*=qlYi6w^Vd=cF{lJ7s` z-0;fj^p5&_3!IPs40vd+mh+9(G=2WWFN0=+%9~J5Sx^ zO_|ScH}84h-ZxApnl=;9?0E3#v--m`^OMj2x~`~wHaWX!vGuq4^^9+?PVVyD_>S}M ztE5vq3#NB(?bxv2)Utl|5j8#Q`%mvwE}Uzt@~pX7;M)!pcNT_IpcsJ^LJcebG5W=C UJrVr*Ah>SwboFyt=akR{0M~DtegFUf literal 0 HcmV?d00001 diff --git a/latex/images/lycacode_cross.png b/latex/images/lycacode_cross.png new file mode 100644 index 0000000000000000000000000000000000000000..7508eb2b423dc5ebdbfe00ced0223120cb6a3383 GIT binary patch literal 4552 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 G3jPj^`F>3R literal 0 HcmV?d00001 diff --git a/latex/images/lycacode_ex_final.png b/latex/images/lycacode_ex_final.png new file mode 100644 index 0000000000000000000000000000000000000000..a29f436261b6214ecd86233071ddefa2b2d95707 GIT binary patch literal 6644 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 literal 0 HcmV?d00001 diff --git a/latex/images/lycacode_ex_final_mat.png b/latex/images/lycacode_ex_final_mat.png new file mode 100644 index 0000000000000000000000000000000000000000..f8f9bffaef1058af5ab38b75aa70838c049c31fb GIT binary patch literal 7605 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 literal 0 HcmV?d00001 diff --git a/latex/images/lycacode_layout.png b/latex/images/lycacode_layout.png new file mode 100644 index 0000000000000000000000000000000000000000..f3d88e4e8f6e526a46f7f5b7cbc960fd59329818 GIT binary patch literal 7350 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 literal 0 HcmV?d00001 diff --git a/latex/images/lycacode_mask_0.png b/latex/images/lycacode_mask_0.png new file mode 100644 index 0000000000000000000000000000000000000000..aa57671f295c8f4b329ade97a5a12a0aa90c8ecf GIT binary patch literal 129 zcmeAS@N?(olHy`uVBq!ia0vp^(jd$MBp6ogU)>3$JUm?-Ln`JZuSs`kI9AWo>k*^I zc86iUjPji`K(5b!i5U}mmfrDUTeWjC>t&4{95>&kG*n7HdhMp7r&`y(Te#P7#-ZXB aN30o^WvZ>1pwNE3$B0XIkLn`Jxop_MzfB}bd@XdPh zdYdl>TNWBD+_L?ti0EPG=;KqEqh?i1IC4EF@U#H`;Xm?r_DJ=6oKIWuC5nF6*2UngF`(G@t+g literal 0 HcmV?d00001 diff --git a/latex/images/lycacode_mask_2.png b/latex/images/lycacode_mask_2.png new file mode 100644 index 0000000000000000000000000000000000000000..44f7bc9e813bf729716d6b185144fd849d33a6e7 GIT binary patch literal 154 zcmeAS@N?(olHy`uVBq!ia0vp^(jd$MBp6ogU)>3$5puppO_@8c_ z%^QWQAvT=WYrjm0kWT7p3ypo@mMO7ni$K6RIq@Z3Z*B=&{91ByPTEm-yX9A8dWCmg zVT*VdF7P_m={yVHTTYIYnN>_7CZBgUX3w|(_g(zFclbJnOVh4`EcJBtb6Mw<&;$S? CP&q*W literal 0 HcmV?d00001 diff --git a/latex/images/lycacode_mask_3.png b/latex/images/lycacode_mask_3.png new file mode 100644 index 0000000000000000000000000000000000000000..4c32e93eab0c9089be5e745ad230657d7942d6c0 GIT binary patch literal 145 zcmeAS@N?(olHy`uVBq!ia0vp^(jd$MBp6ogU)>3$B0OCjLn`JZuSs`kaARXj(GzAi z`tiM=ak-3Ef}@$hBB4B;N&D*mFX)gkmdt$O*AnOxz~<7zc~m2WEv{Ut_?4n!Ljm`l q(*n#BceMQBD_56l&MEJEP{Gciw$$!AqtF~JkX@dxelF{r5}E*7L@cBL literal 0 HcmV?d00001 diff --git a/latex/images/lycacode_mask_4.png b/latex/images/lycacode_mask_4.png new file mode 100644 index 0000000000000000000000000000000000000000..284b4361047046efaedf31bf48558014eb099167 GIT binary patch literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^(jd$MBp6ogU)>3$yggkULn`Jxy||H!L4m{dV)U2$ zm-@Y(L)I^B%X*!wB_q;oILYz!39H?aK^GLcs`GF0#LfDf($2HDIE(GpNxhJ_GPBjH fZ!Na9|5wdeyI#a{*4LCfAmcq<{an^LB{Ts5th+CA literal 0 HcmV?d00001 diff --git a/latex/images/lycacode_mask_5.png b/latex/images/lycacode_mask_5.png new file mode 100644 index 0000000000000000000000000000000000000000..d3d93373dd273acf798fe347d11ca2977135646c GIT binary patch literal 152 zcmeAS@N?(olHy`uVBq!ia0vp^(jd$MBp6ogU)>3$;yqm)Ln`Jx4RqvdFyL9Vsh^K`%dhA57WRL7ejmt6Pgg&ebxsLQ0K4cs AOaK4? literal 0 HcmV?d00001 diff --git a/latex/images/lycacode_mask_6.png b/latex/images/lycacode_mask_6.png new file mode 100644 index 0000000000000000000000000000000000000000..b415f31d35781c7dbb1a2405af68239b776fd9b4 GIT binary patch literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^(jd$MBp6ogU)>3$CVIL!hE&YiI?<7jS&@gCef9so zZ;!+HMIPn8TpL^1F|o|VaPf=vPqY`Ecu;*NVNPLA+Q}0v+x}0U=$cS%WE7TgT;4|B ze9D}HqrL`f#V>d7nR&UaVy(^gbsb%m7q11Li9K(#c)^971qod7X_ea!O}jNO_ulQA zFFR)}x4WPGZDs!ZJ|3gx<;R_#{djjM_WazR*5}m&!oyeWne}EV$dR6|elF{r5}E)B CzFHvw literal 0 HcmV?d00001 diff --git a/latex/images/lycacode_mask_7.png b/latex/images/lycacode_mask_7.png new file mode 100644 index 0000000000000000000000000000000000000000..e3695dc6b1b0253c1574a1d1f85e386e070848b1 GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^(jd$MBp6ogU)>3$qC8z3Ln`Jxop_MzfB}c|;y3$` z%1@W=n&tR<<@TfA^Vb>%7;fPyaAIw)o2aNHvDD`DS}R-emA%WCna%rNWXE80<4^XK!me?Yc*y85}Sb4q9e03XjeLI3~& literal 0 HcmV?d00001 diff --git a/latex/images/lycacode_squares.png b/latex/images/lycacode_squares.png new file mode 100644 index 0000000000000000000000000000000000000000..3d952b9f2690d5a281047e7ad33b4d7369e38e3c GIT binary patch literal 6970 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 literal 0 HcmV?d00001 diff --git a/latex/images/qr_end.jpg b/latex/images/qr_end.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9d034ea1fb35d0600509b731d70e4cfb4332fefd GIT binary patch literal 26340 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 ^QU$rgYPFQv&;yL8p?w^Dtjw@@mb{s-y(W( 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 literal 0 HcmV?d00001 diff --git a/latex/images/qr_fmt_info.jpg b/latex/images/qr_fmt_info.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9d034ea1fb35d0600509b731d70e4cfb4332fefd GIT binary patch literal 26340 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 ^QU$rgYPFQv&;yL8p?w^Dtjw@@mb{s-y(W( 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 literal 0 HcmV?d00001 diff --git a/latex/images/qr_fmt_layout.png b/latex/images/qr_fmt_layout.png new file mode 100644 index 0000000000000000000000000000000000000000..d17bc434eda5691763ec148377f73de5ec96cf01 GIT binary patch literal 3408 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 bu!5E0)YaRnlWxu72dVUQ^>bP0l+XkK!5tO! literal 0 HcmV?d00001 diff --git a/latex/images/qr_mask_1.png b/latex/images/qr_mask_1.png new file mode 100644 index 0000000000000000000000000000000000000000..f94bc46d82a1b14e70f6f57702a3c0d55fcf752d GIT binary patch literal 78 zcmeAS@N?(olHy`uVBq!ia0vp^q9DuxBp7;XetCg7o-U3d6?2jk4zNl5PZpI6wLWo` Yi6JMRi}B%IK1Yy3Pgg&ebxsLQ0C8Uu;Q#;t literal 0 HcmV?d00001 diff --git a/latex/images/qr_mask_2.png b/latex/images/qr_mask_2.png new file mode 100644 index 0000000000000000000000000000000000000000..f1e79ad303b57b40205e0e01759375dac1b77317 GIT binary patch literal 80 zcmeAS@N?(olHy`uVBq!ia0vp^q9DuxBp7;Xet7{YaZeY=kcv6UDL>91=xCfFv7s^W c;z2zwhU!J^nwJvpC4rQBy85}Sb4q9e0Pyk_tpET3 literal 0 HcmV?d00001 diff --git a/latex/images/qr_mask_3.png b/latex/images/qr_mask_3.png new file mode 100644 index 0000000000000000000000000000000000000000..357067c31459a1c533c76589c7a098a99350b7fc GIT binary patch literal 87 zcmeAS@N?(olHy`uVBq!ia0vp^q9DuxBp7;Xet7{YIZqeIkcv6UDL>91=xCJq_y2g4 j#0JiP=`yB?7iKUpl<;K~r>#TPSGq@RgV$`G!o%4!8nmk?oT-G@yGywqC?inKh literal 0 HcmV?d00001 diff --git a/latex/images/qr_mask_5.png b/latex/images/qr_mask_5.png new file mode 100644 index 0000000000000000000000000000000000000000..06f1769655246c88ad20eb141a00ad39d7cad07d GIT binary patch literal 110 zcmeAS@N?(olHy`uVBq!ia0vp^q9DuxBp7;Xet7{YQ%@Jikcv5P&lz$tDDXI6yngTh zxzYfErQN&jKTLPvkX@+Yr=IlncF5!qqeR??W|HHqB83GP^zss0$l^bM`r>mdK II;Vst0046*yZ`_I literal 0 HcmV?d00001 diff --git a/latex/images/qr_mask_6.png b/latex/images/qr_mask_6.png new file mode 100644 index 0000000000000000000000000000000000000000..052f74a3daab7338ad245e75b624d374250acf68 GIT binary patch literal 98 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 CZ3;;M literal 0 HcmV?d00001 diff --git a/latex/images/qr_mask_ex_eval_2.png b/latex/images/qr_mask_ex_eval_2.png new file mode 100644 index 0000000000000000000000000000000000000000..bf0cc15d6706050cbd794fd320659fec144aa76a GIT binary patch literal 15707 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 literal 0 HcmV?d00001 diff --git a/latex/images/qr_mask_ex_eval_3.png b/latex/images/qr_mask_ex_eval_3.png new file mode 100644 index 0000000000000000000000000000000000000000..ae1fbd90acbc40e5aa767b358a890fe12f4541d4 GIT binary patch literal 10642 zcmeHt2{@Z++jhDPol?e>qPFQ6-7IOT#;%LfqD5<|BB+YCDjG`?ds|(tQ(e?jTB?c? zsucu5McPWJCAJ`K6ctNENP>{>iJ9rVowo1ye*gQu@BbeE@gD~cZqIW+_kCUGb)M&S zKe=Ih#A4mrjcY+5(7Hnh&5nXVt6;+KH7kJ;WvpZ#2=o)^kl9{)boxYp#IL8kL#E#2 zu6a94yS{y}a(kAPZGm*y<`rt2A6#jb+nIBkzdg3Ol79ck+0YdrkX7174zMD*;3O%~h0CW_gMQj1zXEjd95DJMo-;EO3ODJ8gJ&Pk zaVlXMY0!Y-QBHj*3~tj>G%~zLNmFAn>DiB^R`>@F-0i*4<1|v~SY?y-8VlhZ2hBmC zA3vXVSC!{aV;xZv@3eDg3oQjH9Zl(q)!P?+jvDH3JP!TiZ%TCxC-cz6htr)TyD#VX z%C!G~=#RYpKNkrh5H}ylZk6NwnBR7Gx0q^lWhvFgf!ueF?6ix0a1@D?AsgvBP;AmD zg%t*z#*>tZ_=jo!WouQVL;IghIy~2Pr;t>0y2jRpeZSuG9KLJ?NKX3o8ql77+ABf7 z{u&1Y{gS@45@h%ym6|;N%Cand^qj&>jK?o}Z$7)`7gZ4Gd*N;M^6jAF_M^E*+)Nb! zp_^l}g;RX`_n))=Q$sfnzl4IuC=$0tVEDq>k>N;*`_964( z{`TA-Bo}?p?-P$OMZq=zTRw3#7?X8h$$?xY0v%&C4~qWnKL4o|EpPt+cy}k;i)Cv+ zrly`~wUI7_1^Pj({rnwt150)By(zf<$vq~s=qGT0amJ>BgOtLaQn=Ss-V69bFTDIx zN{MH=^jWw_l_kJBJEOTrkQ zF5zyCaI9g&ou}judk0gZBNoCaA7)5%%mu;nzUOL~-<>XE9ylAX!;P1A&+^c7O$KPy zVHswhhrjzad}lvAm-_43T^j)e&#?Enkm>R_V{Llf5-02^q{Wf*k98y?Op_V3xgB)a za3{~fXa-Z~NOPj5GOcK&2uyHvY6UZHHfZ=Eb3}Km>%tXXU$6$MNAX+S`&+PL$IBl{ zbi8^{WUyLBzJqY`!nz&CIM>w%pTm6`BEEX-lgW5INbWF{`vsTV87+F(7`w@(q#+Uh za&}Y~a{a3^d8Z?=%e&GFXZxz!Q{+1=FLVUCuP&24@XeqDS^&D^d{0w62xef1-2CEJ zwr7LBa2r-!f|4HsuiWgpr}D;91kMVU$MwSxWO|>?k2Lk`MEKid zmy=M+Y5-?6ze8%W73R$(<_+uZ%S)kmu@U-S_7)x{uQ$P z(B++;Hfi`ihT{8`yhMzgkT^SBV^u%&duk5spf3T5Zz3k|QB2cW6dOwa`t&XGB(E9#jbG7?MVg41;K`|KKpSirEg$+Tu>QV z+*@tW+0YvFHYTTU##q4I`UkIltF%wggjN#-lXxvv4S&xv^qJb8D|N0L&+m@W0bh=l z*u23#xr90)fl%|+(H$D;zTfyxY8!N+Z|T(r+QV zavUfmvLnlNJZShmb3}U)wc6a(hiYxMD~(W^$lU1OIE5EUql&E>O?Ao_I0V`1v|vJo zS5nl4MUs}`4`$o_Lq$?sUXO$Q=&Zvh-;!y`EIPhgA76pB2C^Pyt~hWV)}-+%aT`x*sO}b|mhl5+q6m(4X(e^KqW04i3WquMuO8gB?=Lv* zTa%xXvM0mfU!Z-vJ^ERc-e55 zPM{AAZVXYWTwdj|V-AbY&yZu|S*dAcN6$y?DS00HzB_5yGMu#qqDo24H^XH(De>lekC9g+9mh8wXP@+{8n!d>3f;CG2Wuayt>eCnNj-82 zpCMQn(Aq~&Cc)P{(&Jd}%){4ZCPz|gAbuMcWnVXw_IaL~=@MV{;f}=L+U-v@{HFu| zcMUZ>_5^zzwLa|NFwzglW~CIk1O|`C$9tNV-j*@BM27jkfIOXac2dId6|#SGQ4b?q z#J`l`&yD`SclANIeowIHWqT~-@nZ(}n5`1mT!|YPY;-BM@Vq~X6x4~_KdC)qaeiGD zyyHGm@;@x{6ihSVfr^uN?8~PrP>dlA-WtGGgs;jK3sP+<&c|Esk~_!uB(KV@|5n@8d{5-U{q$+^oWJPV(%lkHB_PN;HisQ%*B=P> zErJg-IuK-FH{Ei<;hhxLiy{N%y}O}{HAg_8Zjb*vVEIdNrCqHCZEh9XxB>t`F|Z;y znUV*XY6yUwu?-6I0Eu+=!jE4uFv%>?nHg!^2uNWJ3|2B9A-fvn5q;=Cp*8)jJ;G9z zI6pcTCioU5RF`xMcLaDMQztAWUk5-v>~U$Cf}`ihFt2rtau}m15)%Xho!jww6ZA=Z zzhwmeG4&DJ1y79U&)qF?xAOAxBYVe%4Vr6zs`JySHO)XJ>bMk8TxkK04eXE-gQ6Z( zcl>)@>8}^0&SS{+MUoz(Y_nC~q}0=d5%$So*HUJ&!b{(+zjtHHi|yVu{+;#OC<{U( z+sRuYJ7J;1AegU!Gsqttcrpk)I1MdUk3sr^W>XRp_>oS&Fp;J0Tq5{8! zP)VV136R&zZnd6K1X29@II0Ny|bi~m#nWJ8mz;;f5`am77HgX z$2BHy+|>b^-2R{8p#KW}aRhh-uxWsmC0{>k&QZ+mtglaudA zf*IT)SG~8jKUJp^eTjQ;+&-q@wpCnYtXkxOQDx>`^s zMi}VTvIT>x$L}*T6ynXZvr?Q%rSe||f5YRT*dES|$WyOz2b4+I+m;x=1Eo8j@gDWh zo_5p=^nJ11bfx-lV6Fk#*L|xtg~>2u{cNa}w@O$0NrA+Q+UdWfOV~&i$IVs^4Hm}@ zD|kp)1&0Yqqf+-6YIdPl#9rm;n{&t3ZuupQq$2 z;QF(h{q>&9)&x?E#3_0Y5IQj+bRo#cdhC6^Kj}#J)5o-tfC`y3Ez`Fn(9Z&PCjS_5 z#9XLG1%m^pcWrzLtv7o@>)H(hDOi7II+r~&&^8f*!r-eqcXIL#Gkrh$n3QEX%Q=U) zO@=O`E;7h~{gxY;=NPyEa#{(pLj1kF+f}_vuwv|q7iZ+}2NfHA-Y=OgUA<`iRHo(t z)Q3pwh2KjZwcpL&mz$Nc#Y_p+6*_Paaon8kx1DGMM7Gl6ZP&Y#)liHu^93Sbpz?o7 zc>XbY`gGObwmoDBaH@FXXsJUF!2ZBl%%*&*+p-lNd(|G`)xmOhB4X+cCVe)rLs$O? zou}>C22^Envh5vCeGqU!h(cDn^^n*T!nQ5A&kc|o4FWqQe&j!<)BI;n5CvI|Py*kX>wHN6WNA+U&BAW!K<@#UCE zUFh5!UT@c3>hObT`h8}cY|Z%tpOy!_H<3FgCWhd>XW0mzyMoOdFp)B1VytrF0mCL1 z6g)gkR|7jwFQCkVaI8AXMk$Mi*)B}beeNU1Bo2d>jhbuXm71z^=$7_DUFJOrO28U6 zSIbFtxygb5NM@(g`t(qu9(-!ESlCe<>Se!*s<#y$zDRi9}a_M6Ki>^jUja?)} z3@Vr}=k&_>IqwiIRMyp2QUBcq-gNR{MN51HH(t}_By6)*<<_Mco7l97_hM>=@-pKu zzYn*4An}W8T(V8%vkxBBz)S_fJO(jdQWETYZb0#x^2XeZjj~X=cymM(uuXVXi5{;t z@osolX>$w&udh7wpu18xV~$il(*_hCefLPF3U;89o$2HzBbar^ojboU0c;p0h{7p# zxjCi3uNSj239cJ4!M2%(jzOLP>%hDYAcpsF6qVO>@;FrpAwviz2NPjZXLz z+9S2x_m7OX+OAKMYHS)xmbF0AjGOhcA4z0#o}=g6W238~Ec$iSfOA0iG>{ZEaF6$g zO_Dd(+i1X%z{5v#3zeJ3L#e<|e2nTu-jqH6U057=$l- z8$weAhdDnZ9~D7&F|uZ~(``a5U%$I3+W7F=2GIo@Yh|8EdadYpXZLCE`)+M=5|ka~ zTmEZ+VCN&%#JEK+n8xe&vJ&yHJd+%SG%&Prs30PUGLm}_G_W(Aw5i_76MR8GGWMlp zVsf>H@R{S!fOMhxgQy-fevxh}(5ace!<)J`cn1@goe&d7!-WrV(Ub!EHB;*{=Qki` zZ@xHdlr`p_EIz=D98#chYv#zJHImn6AAnMXubp<-VnPn{c|^qGEaK%l;m^fc);*#| z1uJslj`)U^S(NQP!`D?UMbgOKUWq&k1}X2#2uK7HU=wyCe69&4C~dtC1xHTbLQmfs zv~rJGC2>4}9P1Wjmmb)xr3zqyw#12nE8OXSVTXKo5yfN>06g$x?k&oijpKi40}{2` zQaKSbL z#V^Ie3lwZ31HxIcL;ARGfG`3Bad7|&Rpt&V2HOX`46{dcnfFCZu1^fHW@u7 zep)`n#k*I%8iL~pH!U_m6n@W9J@~Qbr3h9mFlbuI+j6zb^;p15LYJ-Uct)(oz+kRv zygUD7@=aVQ%gViSA#-7TJy2>@V{V2mwdL~+^qXV!5mTEDQEi6^cv9GyOS0jkUjKKf z!VPPqq~)Zd*bu^)hi3KAb-)!J7Je3h8;W?djSzj4sN~ef5>nCJG8NskH=VZ&=adra zOqT|e$n%=BS37d>G!4>J26sFuKllCyN%Wp`{gq8JM~kYoE0Wl`rb?MhGg_*6w&9%N zZ4G=e?&(MorM}Nq5!tP!+U2@FF)G|O$gVHIst;iiK3jn3LlFAIFkyr{W<#3k*=(BL;cp&Vn3X*|}}_$6jXR)u`7V@AHkL7Q2M{kr8HYW;A+e zr(qbE2P6WBzF7k_j8MO?YL0AG#J{Q#Gu8)SrJH!NeY>CyCX7JYxf^0&jitFdfW0&M zhtBnH44ag!{CaK)>1_6TOHZrg|l+bw>K-~O z6&Oe;MiUL`HxpeaH|OM+`>OAp$t6C#W?tYBU{=wwSCoL~TN#Zx52+~eOcXn#SDpf1 z58oQ;15S&R^rvcpTP=4_;)~vB=Nz4X*d~Sp0@}=ts32~-_MwZiz#|T3#UkZH>ethQ zF;;Mg{4AWK*aA~UW!@H`?bla~WO3Z;!I}2KkJ-t69>CU;RHWtn613|t&voR|FR#y{ z_Inq%UQdjw;)5IK!An>YcB&t#F7HZJfF{qsmmH*E2E0E&xiN{6&p%{EsP8m zp&vDRO@uc#3$R=UHLUl{kdue=jhmIe3Zsv1(O+QV4JVI}a@=|Q6hlt2$jVG@02n2b zYvYW7T*%R>VH#cw95gG|s-`I;JfLbw(`q1JK#KORxst5>&Ux6s)zRB?)6!ffN?w2d zBbuPzY4W~!viE$Zvd{fsuG$XSw3HjM;Dq0_PaP9?%SKDNy!!oBbfZp8wKAY7tsyll za7l4HkX zwZ4GGS9iOhLI4{`(z(T82v!l@mjYg|GR^6tK^dBHPDNd@$u-Z>S`(wW#QiFjMQ1GD z7x@*JwrCC91V}kC{LzP3ee6t?E$Oz3eI?nvt>VA=McqyEo_&iHcY+J;gd*TMjhWl< zdVzJu{%@Wg7l5}W%hRF+{8A03g=tKambyeU`3}FRY-UY+U`Az3jkXY|V^|*42 ztV-|p8pKB7!UyXYb_x?N(-NriNl)sJhf%4PmFL?Z^FCS(&SKnK#YL6uwaYsc&hg)g z5^gT^gC_$sWg@b?r3WhDw&udMW1_0{0ve>O;C<%+o;`9&{?FNXq0BI=CEmG2WBMgA z%gB-P+xsOo<@wDhOA%(3PK{uZ{w`aky3OV}tC3f9XMPrArFA=k83wLcysN3^RI-h) zg$5wrrY!wLQizy&YM5EW+(?zj)58}f1-1cfuLS4*TFkfn&2 zjxa&J(JN)4SSJ|=;b(urympc#m%$}zgC3SbH5$E=Dt*pUn? z=%#S#IF_5s8!r_X#kscRH<(r>DW6O?ZQkWAv_`LOj3DMN2N^i7C?NS*YLR)@EpAtJHUHso;-Lp}f7agFD@HI?PW`eq zQAjquI6uG@GGG^V92#)QXf_WQ*B2S47=FI*{7c60nO#}!+XU^;8GWI?uY-}zhL~UO zOdid~?fwDJJD?bP8t?`LRt8qAUDFY9zNz?7et%i@ax?^Z?1Pcw@ZY*wgZNmjK(ZhD}M0 z@uSk!-JRiSQo9;ae%k=&6lB15oZ;n!W9D!4*5QLB}aR4G%+$L zd@_*L&uj$RKpCe72PZ;2q!A$e&cYH}q_EL@w1rTbsl=^jZXZ?zYWTV6cjotW9y^15 ztXI``vt!SEaa8)1gT8FM5qNBj;ph(A25fB9-(jn-epwb3GKtK>8gpQFG2q8F((m_$0l&DBA zkzN91lqOO_3!w)RdPxi|kdWj%@x61u_pWul z_|JTNd;+&_UcbY~chHUZbNC0~igcY&5g*@azFXI?S;4c`r$W*l0yCEAbvj2q4txFh zLT%>owF5`wPdmQ4aqkB7$Ls&P_SXSdeprar)p^xpy8g$1ayGP3QZ);EZhFZ1*|mTD zc>T%MtItixG)^8l^6T^G+Ki+v(_kAkwGP`@TvE*13}Ge}4=q};i_Pw4`}q`T$G$tv z$0uqFt>Wk7yIS%xo{#U`xwCwHN4gI4UHwh<2fpXezpG0z9dZ;f>$;Iq7wOL|TgI>19my+MOS2r`1&OF=FaQ=!%*38;MxX3(KN~2XEi0o3i%)@G)YOR%=fm zG$zDNJ~9{}+|^qwE)nrxcoo00w}^%2Tq%N+W1cxYiWmp1;+&OPzBdcYaA{eqpiTgqc&g<&UU%a^O)*V=lQNy|Sb5G&PpwZgHv>{n zYjIY7%$TCj3UyMFgfv@GY@4+Tqb5!${#AP%WhN3b`zbow(kuqYzO*x~bA~*hM(H;& zHk(CriVzD1LJ8YMnVrK2>^}Z3J%`uRC~t79K6FJ=&0FdW`IRMEhorzI9#w9O(sy9r zzEf2z7$?#$6&xTl?Ho03UVt0qnO3FXX}{chzc?ZJ&8&s?*5Vms?s?M-(umU8T=CCZ zi^o`9AFb^LmLF$_hvLr=9fmfyRtYw7@8qfVxzN61=t;b;<;6OO;}#}44!U~}DVQH3 zW(z5i`yq=bv$K(IzS%ZnUZdLkvqJ6fZ*`rKVY{PmysinXpHI!%%+}FBqyAKEezxvr zIsAclQpn^70Zy(C&QIlIaT~Y87C^AA0gIye1$dNmy?s>lE;SfJC+FmH zH_@WMF*s??h?2BvG%8iZI@(&gCtGx&2ZW9@jIad_QTeO2FRr1Xe0!Lyn z;cAJxm5VrYy_0x7B61gxqJlpR-X`#ea)X!e=rs!H%71y}w*@iD$Gp+I14eU0PYuV(xEt?H@$ic)h`)IRQ6YZ7bj7gR$x) zU8jdBcU=myU8;Irdeta;v?7kxM_=r=7W0cDA&wC~ET0V@_o#5UxZbAEfs|I6fu$ov zu6&N%Z&>VjVYFj%Z(LH%E4!@qpwQOXD6P&3KP#XS&%ogpmrONME`nd%N43WxLaC85 zk^{H4)%$PD%m!8AM(!=EDc4wa%U$z22T4(|eC^+oq&vudF&J&@nzEb3jb^lHSlcOB z-&d=hP-k;W!b1JC;%8;8twIbfyTBKuo!XpM<(AQ* zpH0WKGmY_k`>H=hoYGXrZSYQDqcf~IP;3|82Ck#|u0 z5N{k(cYFA`*?Lg{nMI;$HPTx2qJqcrSag@JWX;u5;8ps-SeBE$4}m=p)hQiktP~TS zuG(%Kf0ZRhj@)R;~gC$90&zbgl#p3|E7Q$@zQ%mnPC420G* zT0Z?uklSU`827$1aI`(5yq}bavQoa;I{0G=MtbE=!f0i|M6ZRl{V&6{R+;Cnc{Qmt zn?RvqT$U-~*G9(6NFXbXl@n|nW1u-Pn|RtLY|V*%!58cEVJJgKBWNrSZ?lBg1&ugV z;dNy=kM?)!DoEiK9pWl5m!@?edIrAjesCaadj4&c%SdT-bb0yiMw(IBM?O0Pf0;Qi z>(-IC45N|rW~Jbd#R|=&zoh2NTGz(tD<#K|XJ=QicLFs(a-LNVMpaHpy4J{E^D(Y5 z{^g49?I@1J!x}T!q36$E^lfT@xJAdSLTD+80 z`&?JMX9>>=pqjz@wA#CsleVt#Gc(mn1W!H84h%JWly?8iV#rF7OKt))YkOzn)KQUR zwD@o?i%QZ5qJ-Rj3Mewu@Z8aGR&saXB_G5n@(Tifytk%p?u~I=x{#cS1 zrhaEUT{{rIs0uZ6fZe#>2ISN!+^8OGEa{A7sC#Lh<64uycinx)t2ia`>E(mJJLTC& z;aFJkrWN~odli01($T;7*Y)xIhd(s+<@^}^LeO`MyAWxbA`k^mr{RBrgO0? z#k;$m5bU~3q=3tM4Wui1MU3+`DyMa*fU!s1#CMwMY=<1)9WEfpDteB|?G+UmT3o*_ zi40&wJzd1p#&E<+y~!4e)D(YlIP#YWX0gxeWr!gNN$=WIqt7g$Sl< zt5w-2Hey_y-p_fdAC@+UF7W4Ip3E#Yqtz|L*2?p zvAH&n>D6`4J+IKO(GRIuJE@wn_!1pYNup_m?u-FN9ofg8dx;eSnqHs>$8VjqS=(#+ zRB3)$cjG4Gi7U?Z$koW<4}sCqm+IC+^ecvME4ByYGSP_0TEXt=l+wf%HuvwMt6JDQ^&Dn&bc%JX zuz4wmRw-n#|22v}_Y&4BK+hxvm}|{FXCC8=cmh1wcBKbIF?PCu>JCg$BjdO_T*2#< zTESlCX-IQzW`gy^ZOmT&pndoGYX(lO7h`KfA)y(o<%&BbTspWpT{SOVyJi$lA#b9U z!x`9>F-N#_p>kP)@&{VAB}2C$>&^!0$<9Q`TE%wLFrS*Jke`V%sIAN(MTd4#P_G)e zg{^Oc%X~`QrMinPd%Z5y$zQV}z^kX+rl-~g;KK-a4a9HxsbRLXeKm|szj-^=lW=ZH zJ{9Si?A9=!N==f+G(Fa(U*F3SbVTX(X~}UY`s4v4$frL?y{j}gKJRW77=^s&iK zf)zfsX?*x2-|5+^?`l;1enwaqmn#0tjsXDyR}hEeby9BUT`QOz8!LonCP?^G>eWNN zCTk8HRET{yW*~ZMvhD!i&6|dNe7__g=ZpB0=ht7w{*g;2-aCAvMYrysjROOTb&Vac63A()-1oBJIIoW2yUJQ#+wvBE5Js;T`cBp@yjbO{MgzzG#*(_` zJ-j*Ek*)d{d`9KOKO2qzecWwrZbA_wcZ;lE>-|`m*)f%)qa(3BiG>xcO;2Td9ennw zd3QW^{`E#6AV_^B#G68m z1dvH*!?_rG@lgP8_8SJeTX0fl&P%pR8>Vkmwd`Ch9%t0bI7e@34Y!~000)&swFIAFD2JMwu&+oglw2~u1)vN+Kz-CEy2Ffj1OvizIVzxm&NGF?n6 z0qfJBiTJYQ-Z@ca#F-Yadzx3bgGKZ4UHk=U!rUp;!9ThZ>4r9+0;k9+Tn$ zJcEIzA~9onoHp=XCFg_p7kGL3S9Cy7=z?KGP!o`y$BTF!P-27Bm|cxd9l$sJ;~nMS zFwSRZ11*4_(EDcdH!P_qY%hdLOO*?V{>%{mo-BRC=9R=Tw{Q7Zm)mh4zg{TiCoysw z5@QegPH3{2m|khVtBBP#Z`|Vaw;Wp=7tOZxo!p)Ta*aApYZ2i4Oa8l{_Lk&1mkpV9ilt{WJ1IUB}eQtDdE=g$KT)-uSPZfk7+b zhV~TSz<aH3OEktHPMF8PvQOa=(DS_VnG@50{B)cc)Jw5sXL&7-VM zG$kFvV~2p<5sFQ$U$2Ez8*D$E1{SEm-^-!nv9!da%JHp2NdWhg6n@1QTQ+u9TG&im zL0h|+>xgRhpfr5_1U}n9N&M)RqoJ(Sa1LNV-Fl+$+9Z^hk3NXpo#CgTxmwZ)?`lKc zhpe@s#dl>@eGfpS5GXoBxdjeitbxPO?dVX?a|dOnKO5H&Ul+&0;4j1=Kf9aib3-at zif^=C=4k80DWe)}t6vdj&H4C*6?j^J!Z8Csf2ZBwx&pC}oc#}Nu2r>vQDhtgUXwqo z>W+d^W1%f_`=hV4k<{IuY@OI#nPC~Otx0-6^iMBL_QlHeT0Ib^(Gwt@T6H>Ogb^aB zz4_Ptj@_RTURX7?$CR&UKq4V2FH*N&qTBTM4Vv~hzNQvik$XT89Q)lJkDd>rft}J4 zn5IGht$NBAsA8-pIa+h>`EIwE?evMr3}QMXL^>{D%_N_8U{DdW^*elH+N>stF8 z-2i#nY7Z=#utFxUPn49ZHn}27oaef$DX+!f^4>l7+}X0lX#_wbd*NFYG4aY_Z_5w9 zyXD)WrG#r*Tzc)*(ZWi_hfKnN4d=1tD>C7l04cf9SJwK~kPNIu8&{t-4})246VoI9 zTflB}Av3CCSKKQ=#ul;ejNVqQNeIiRwYNO0A*iehdG+x9b{N&a!hImxY!*vOKv0W@ z+})GkMGKp+f#v~jd+>d-76z--rxz?*u-|V0+ozuupEwM#lL>gw^QN(pLR8Rvn{clD z7ijoCJzWa~P@D_Bt2vcx!cnW`6QGIpy3T9-JR0=R_q>S?mX$kl=1OKdWpL&)uuUWv zm&DfLnjhwvqe26e%`JM+PLlAM2PBd>IqfF+>l3iCPsNQr?@ZruXl;49OGiAl)!yfB zDK31wfrRjb7)={`6+3p!-f%N{8DE{Apiv&am8Au`Hy0xpt6+IsI!L+Up_QS@K|lqu zJ+8~$-_T-=6+9$3!JW||IboH+ZZtFpxGiVjqF#Qgyt(%Mpr>)iCLZJXwQ;q0agR-V zxw*n+B=}tknp>~TUvZaoeAsct&t%9Y2mUVfOMd40IKY&(=HRZaD4Fu^XuF$v081^+ zS`%I^mjHI=D+AFK zAdqP5-%EY#TX6$81VDaaV7K42$&}2#{5I^QvZEx?$w?0uDL{U1z%;q%*Sxz1ErHtC zU-oT+-Ha5Axh-3cRSFtc*cr|BCGJlnI{!R^%(uFK|F{aoaMIu00q!j6Z?g8mplSY+ zY(W({wxU-Zw)B=hMe8W5v&KEOBfY5Oye`J_@@n(-RB68rfir!E$E96Jc~}H&ujj`0 zukjN!pUt-Dg8E71_Ezxf-lnk`bQye{)=&UvVEJ`1kwQw2h%(l7fQ>ZMs{wY$8(O^M z)<=F&IR?YU8%bK|;fXCHYz&u$iX&J{JSyaV6>10JkEur#pvzmt)~YS{vVtcq9y2?o zG={a3^us?m54UFr3sMe&wwfgX+7$hhoQZr6GU&se6S4+QVlgjPGFRFuNlDY6Gi&l+ z!<~HD5^~30+K73mlwch7<~c0Ns*^c5fV*sNWMRb>U@WTGjS*}*gC^Ruv<~(?qPJHp z=2XC8J!ly$Rh+c%)s+WptmaDLZV!~~hmv@d17OU0T@o}$?9nr0 z<+AB@5*3?<4P_aIB35w;> z8YIc>12qv&9MzpE4G|?1H|%mgz_~*3dQn@cBXu~vcg?E;bAJkx_cu4kq)|OJTrihTYB5K87U~oO%rS+ClV0fxXRoRy6;7tubOg76hBN${RD2tY z9x|)&)-+d-@#+Kmc;+reRv1AG_)y2eMeY-E9s7G-nyX$zraXCprP*>-ZkD)r#SK8G zg;oeAN#XUK^d<%!9fDp0%%mo3O_LH2U$w^;=x+TEI2}zQdh~yu_!~k40SK+)a#TV# zBDm~sC-NUhT^Li4@#@{rMq~s@5#=BaN%bATHj?9<;`ybciH>ploQlPocXx#4IxLLZ z*^EvvOnanI2Zxo`140DtFPm>mE=CFk$=Lce*MI#4-x;&5zf8p{gW1a)d&a@?@F7zI zD?glu;MeUOWZX?-Uvx|vM1L-s%^n*E=+6Baei&Ylp2HZP9oE)%DJf%`D8weGC2;4R zfDj5zTEJGP{WFPR zZGhIT9ly}0>mScm_p-6sC!d0i+@tpe8`{`-*E>5rx(0C9dp+6Nur68HbV$W={s7@* zruQ%Ud$-o=AzfK_SzpTIF4aaOs4+lks2Kt96VStuJM|OssFsI)uC&yhpa~y>O=33Sc6%Wa$(G8_>M}*0(GKpx;6@XU;v&PajD|`zkaqsO5AXgTZ0R=XSgcTnN$T29(~tHkd?@rjr)*^&Di zf|_skHw{_|+{`OAY(j;QnRe0pJq}%_8wy@}vpXlpGFe`d=Pti0$SLle3C&QIEpJx0 zwl521aycYfnFvMX(|Q!6CtYP`Y#X&$&Lti`#3feB40%1z08yB$K%a65vEHN(@cVjs zThNz@x~gvYM4_H@%wy_nh(0WFs9~+ErN5qA_ftj# z(iB-?{!r8MfQ3e!q)z|ukO-k&8-X`mB1~JS+drg;Gci*vrJc_$rbO`@-dh%amdaKi z)pW4@`}8NGz$fZR(m-Rfs4wGHt`+|iYU5@7#ussXb#5*gwf%GDlh;K7ad()WF2}w) z7ZuaaCrw^mlsrf}Lp zyGJjv8IKv`UI$xJEgM@`Jcc$bYDyI>iwml~RTEp))c&hT=#@1GNruB65I(xxu&j`U z2%XRC%`%i7wbE0E`9mb?2DEjIn09Vl<$b}N?mSu~KHDDbzq~a_3$BZEZr&bq_>V*N zAIfh}YdKK`O+!h{yp1wMUZsqFCb6j8%CQ;Tu?7wkI8>%CX~^8hJVV{*L-3%z6IbZ3 zgt_1n2~WxLB3{$5dhYC{TzPT^l-wafapJ0(>8gM?UH}TkIVe3f1FQ!m?L%g_GBG&* ziZvJWxrw>*V3R@04!o|*bnj|wk2Bt}=adHvAl=IfQRYIN0sMLKC@;@%ct@Hoa0QB% zY*MnZJ{$BZ>7zik)2jF|8_{;mf-59?EGItC>CeXXT0s9%BG;E;xgii)jP~%=Ve2=H zR{FWBdzq@yTXg&Uvf^(zy1sYqNw?S#@2bLg%%=%?(2b-OGU_|T&q|%lE#e|V0Oiik zUK67kGZ!}sG;=Apx7!Bwlu|g}W&6kAiW+=5x_!6)%>A6!!GYh!{ zRb*&aU$ec@6wzu`BI;CzimB@0ZJ@mXfb$^}$!K@WY=`Pg5FI7(dZ+xFjsq=GoN`Bk zM#n9=_INSaYMHF@dJXYw_~mET{oJz-sC~+VP1K5|ECLilN#OM+fCOhg1%hcN&qkF% zmzJW1%|yqpW|ncEUSRvsNB+(ekK`BDgM^dN?7JKcFow%;F7Hf&MjUnWO=9L#-&k{$ChW^Wa z`MmbTIjWtCCC&x_(m?fzQo({&`BiQa7fZb@qP6q}sGrVRJU|76!G2bk0GDih6jFys zw*GA!FnNvmkGY;@*UkVMz%DtW$CdbU?l!I%WydJTZpf%%d+=v05XK~$`Tl)I+BtM znQd~#46EP?9|NXuXQ#e2mL^Sf5Kg-RFcG@Bir%H7^YqtI6e9at;E30+;C~_Voydu{%+e!kn(z$tv=+yJ0N1hZgavRr?(8x=Nh!%m;XG>;&+c;`^=xf1cZm_Zc3L_QSlMrI0P+2B>Aw#w# zdyI&&WZz~iW0>uKjqdIzcOEP~58~CT3t2uertl^OqWyB4xW>PZRr>E=P$NZFm~{iYu2vg0&mFM0Igz!!B&Ci2MYl2 z_5$CB*!ej4w*($4|1mH) zG(0j&oSvDTBh8Z+7Mbf}gJ3_G1-|}V7|Xi&z`9m}V`1lHu8VDz8+gI^*g3W+t>!;y z!g=V0;h)qU;KkOk@B6kcc4L@T`drB>3xP`h~uMcopNAN!I^@qaI{HYc1vjCU4ALeg7_+vhmKf z?u*3E2zqd}P2xe}DK}Wr3)7b09*y~!2GL*m_CMSaalKunN1#)txwxQL0T*agiH47q z$l!QhDCFfw?mWyhke7Fz->GID|IK1qdGD*85$zD~sifjFi}MuDe)I#X=JPS{9m-vG zPA*{+X=zbe?}I+cr?H{u?PQ(qb9wt{P5Mi=YI6vh{Co)w!1ILgLAMytgWL7Vy%RUC zwY5e0nGF@lD@sr+)`h<-4e{9a)ao5%DUCZxJkwcDAYYiN@RllWn@FEE*UNl1QrOxR zV8!+B9?9dRhq|`Kw=xY&navU|LLaGIO=|JNyEQ3=L~c@jo*cm7HwZ#wSqFT zHNG_Dt92AdM6E{!7QKOFlLEmj@oQ3HoZ)-F&m(rbUIs*ob|~&X@?%5hsqi9BPEpZH z$VkV-^ug4ethZ``zbbNr&F#tXOE2FO*GFfkzvdXZHNEOBB%NMz=^AdG@b!*;DZ>Tc z3PGet^ah+umckRd$os;3hI#V&Z#jw|@IBNhF4C)gr1b6q~3>*37Bb<89w-22V@|mg&`3SOxRn z-dx2A%SvxpJLX!ljgT49r!F!W+HyL}kHr3zZR^Wd5{IE<+$R!*-1Rdm7wRART)7g!_15?p$J~1J}m%FJIhnKkwEF>IxaLlwbyy*JoeyM$9XND7bwa6!X&;su86K|W~ z6_OIg%?ho-ecY?B?V3!!sDENc?YqyXh8ZPU=T9R2;!f@-QI-2N97$AeRqsGv_ zk8&H%4mIc5mU~yHjF#*mj{(aS++8=&VctPsIP7r-d2vSA{`M|X3j_a^84 z%k<+9&GgLQ%bYtCK9$lq-t87Kl_PR0%E9?7CH6Z}dXc(OmcFS)weINnXILfbmFCM! zyPe9KMfGk>h`ZkPHFPh7S~68k8PH>VFN(5p4o%z9JWOvUr!t^J4)+j*wD$~Xz{|a% zngIpTcajbI!`71HD!SJ+*?TvojJob2ExJ9liclZOa&@)NHF!7u1cF&R4!BZF;U}7q zq710qnE|!#VnCl65Cd{+ZcB6v@QWCO?*HWxd9~FDNILi@)Of4KOJf*Xp_JZPI9XD{~HP+#g>yW); zMDUy{+q{Ah5l!8Tp#3pL#W0|GO*r8@1DeyvPGcF+_gOZQ)xZ7zjCC2Z1BoQ(^u?ih z+?{*tV{F~*F3)Gq)1__&Clz1Q-f?Zn^~#0zQVrZ&)OF934CwjZGBo)#_?+nyA8sUF zAN7E_kT%q8s(xmDF{<)_e?>f^T1+t@(^IBbg=Dv9vC^)es8H@OGmz^v5c04JpVKe0 zAOF=d2HShZokG8lT+e`dO%M!db0cSl2~yG1nD%B4hH^jykc}b_I{iSkkldv^cbjD9gw-}sp4?yl}E`bw*=XEE95TI zhm%~F%cr(ft?h>&AHn99>|j8RaXk&xos*~qq_#x7(DdFQ#Eni2w|nXt!oYmF?3JQs zOiFfqFOf|tr(!_l^`6qm&(E&FLOe&?WTo6W>hF=q2!@YrRG20#IS94zN-zt zZgSq56kUl}6z~Lw`M?4gqTE;v`2|s`8qY&r`-)s`PEho-msbV?)QXn^D@OU`) z^Yl|*L!vdCtVgsZb96kdSxi`$b-VuUJI-GXXF%Jqm2i^6Fn;mm8`CfN-;HZ7#F}E| zg{~G$4Z!xEx2Jf=SzD4&6U81V>!^|W$?5%Fq-T~e@dM8Y{|PJoZ>@Z`q1s_#tE2`4 z%5pGaK+V_Xaxi|yZcHaK>G8U=KOjaMQARXb+?CM zIZ5x;xfoD@qL+Piw*cYE#*m!>1O62S{GS5QF_GMXeixMwMHw53O4z0+u1`brySsK? z@YjBin|{5zJdha{1 zu~E*27Q?@)eUScs zUSn&wrNr09j4ua+)(oEgcIFCuM80-;M77%2ChfIi(vInlZ<1u$P9KF}iL0UlWg$#3 z1L{dZ&lq7Rw=tmnJdzdj_&Iw0KveXT)N4a^NXM<9#5!5av_Eh{Rry%d?s;H zaiZlRe!Lz*lh}h8kZ!{Tacy`CB5N--4t^gsG0%YXtua?IqO<_)k9MjQ19HGFnrq%s zgS-u>F3i-|-#`&ngVT0Ae)oBtet-ehIDn8792-V|Qghx468c76$9z{0f+DIqMcWZt zQu}wi(uTgzfUY3@y2Xfw03u2_R6e#CF>UNFjj%9(`mOKgsK^>Nxk%A6PKip$i~E8K z?zE;GgjM2617IKC8gmZ12%2K(HF&OB-XH{@19g9&dYxfg zbLX+gbCMsA=y9btCbAdq>kJUjcj8oK`|*E=*{n2e@@k)Tw5OP=+q9=kb!bzirRQxk*?+=xeJPkn~|- z@L7*hwC(wcyeZd`O2lZd=$f8q3CLo zOnPoMk@x*I%$F&$4I&gf3qt3>c3>^ROyr|W#L@lH)R*5-#8`-?l!R5m_P%18TjLA^ zdJ?BdSJ9=a!K;yrlBnqjD+W|`4K`a9NS!4cQFJ}6aaudb`bSzdtVluJhs|^H3WF%h zO`e}##tY%(Hc0I}_G$B?>97Ul-Y}8FfVNlnO;Mac$ZnULIe%FuJ}scIgk*`lyJGpq1W`gmAieD6w<(GymgJQlx3@^$vq97{>Z(Qrt~sA|gS0nUS0fh` z=**N9!Awapa=~eZldn;kw$Y2-uMr)Jb6hdIGLzfW2KA*jx_YYq9jnm9sm>@M1!dMf-V-;kD>7*7WA?i zP`@hMqNR?vHLBc%8JnIDF`ylLkkqSTECvNOHbiJ4p2e(aTx6p+$T2jR#S9r{30-Z|D83hVRGd9 z5#$}I)Rrkq0BRxw^0Wr|V=0tBv_+7VjTq3&wpIc+Gx;p-Q$xS=-m{Ow{5F7J{rlLkpxGdIa zOR|JiYCWa}zAUDi4!S^pce?mi0`E$PFy<5{?xkO1KqQdsu4F0~Ap)>7ydceEDcc;M zuubz$yaqtd=mZ0LD~(*#x=rYy858in8p3_%!X-rbeGNoh6Qz-z!_~gD{kvj9A~o-TN3kUkaYk- z)*J-c<94rLQ=`o2Y|R>-5x+&}=3k^J)=Y~7;C})f;D0xIgf21yoHIdgS&avcj}eow zR^ZF>G_rzOEiNGWlH*>JdCQ}NdhHJ2PT~@?ypEnK>>}OKKebP}HrLl}@29{u@=nh8 zZRU0o(ILonYIfG;lIkA_)eq+uTpak$?JS9o<8!!asU2Qfa?G>WGjx*nhQtDE9P37ZQjJW1@}JKrOHk!s&OlLKvIO8rzf7T# zv+Bt&=4*vBP~$LdMt70ZM>IG=X72{+;bl`Jr!_J}h@yxL5rj;~E4@{4V~W(BC{QLC zXovzUlXIYN^-(_{7x9*CMdMen~`=7vtXglyG*dDZodV#B&bex3oL(a1i; z2CWTasLKVCB1DIPOm19|omyP22O=lG!n-+4ezd_}BG@MJP0sF*J0~vg!Q~%G58tX9 zBDK@UA}dNO6trL%St$j4yQdf;RkI5mo9O|JwWKbz7~LQmvT>~o-& zGoT4jbey+x{k;a0h5dkco}?d7h+#k%k6~v$=X&!dk;}o~H7F@i7B-9Tsjk5LwZS=y zg)O~^oF82aT)W|K{oJ>=*)<=Fw`)|+j{f|1voG)Fz%f+s4Q9QW6b;xS$xal}Wnr%l zUPhfY1=7~*YUvF0#U%( zK+f}(L({j0t+X8PY!i^zQLOfZU^N^75x@>HGdipNfPJq_ZuKvl0{PtB08ov+lr`4A z*FNhBWE8GGbMn`gUrStt6_X=f0Fe*Ed<&#ngD=Z^3BP#iU%xMhd0sJ0y0**!F^EQe z*9QgqHCX?FMSzfYlIsYaz4(uHMn{NY0f-#Mp|*j-P{p_34GOpWa&SNGzce52r;?x* zIn5ym04@`@f;`TwhPr`2#3Dc;#DV%*2jS@|phPhSg#)ODN-;~-&>dzq1d8q#WFZE0 zxPktM1BzVdZ4EXp1p(mnD(p`EHe}Nh@D#04P0Fq$*M)@LFV>}d zNTp_Ys_6*+^EygWpK_Qy|IvF59XQzi7pLhB6o(G226~u$5y|6DNngIwhui%b9($>Z z7{DUTs)4#uYm5PfwC$w|Hqfun(<-o}wi4Au-ehlicX%aSf~w=tH}&8Ek}7>*TYS<; z&Uadpx<$0?l+^Z`Zz8?hgMX~|Y_C69y#;VT??K&p-+`KDh9ZtGTC!HSn3QXZ56Wi1y4|Wh_?0uOOMccVeU1gIu>WppLoTp%^0=C@Rh^E4A}r8MN4nCtEduidYIY za1Ml~Fu-xG!v1*Z&P%WSpbpCK7n$`w2rq(A9vy3y(UljPc6$mX_0mdc+}Out)8v<+P7%)7MZ z*2_8)fY$_hEpUnLM}a^s>da&%nG7Pxbbvtwg^ltMAP~o1z%Qh_9HmG zrH7F@a6fxbj{Z&q{Xf1=O_`epTJWnzv8{jj=z*nNRp-3+51*G8F`C*Fh~7MJKpDdT z#Nf08Oqb9MdL;;6tgXUxc%GyjaZi})7xu->+99-ws~fV-M`!efI=tdHew$A>`E*Z_ zi_agiL$vIZ2$Pv!esGJHBmi+DED2$>5&)-e%#D9#YoP9F+EuJZ7%RW9spPTfuGx&O zZJ*ulM~G_}zft-_dz(|LDAfNp(-!~+Vp0)sylHbPC%|ai0b)&7!ioNUCI@-uA>m9K zQJ`nCsAqz|?=#39#uP;4w*Ksj5{n9__{!5^U5A5V^;&tupz{v+EY@db(&zx8HU4F> zbMte8Y@qmOu`(u)zRX^|Xy6B~(PhX-lyKmC;6 zZtgiG9dbl3hRdc~s-%r7vn?gkQf+*MyR|I*vGlI8gFdU;PX<3y`EEKK=?Iu85QJwy z5Y`1j_+@7EPpyXB_OXg?@m$=c#$CmSUzVjc+~d9<9iCAUGm@|D1}{C6_b+wMQXna) zIIGs#AWXd=xv^Qb%V~$IzP_gMsA9Iho>u)tcGt}#<)2+5EJdnFlxi9H5u8k)k-ru% zk>|DZ>(SUNgM*XX{0N=+@8$~MZPuKQ-|AxK!ydfPe&2|;u(x=_C1=7+xtrMOy2{r3 zv8U6_jczK*XFZL!-A5;i$l%qSD@^9>bc|(AL3u`iF%~VQOuX_s3Z2^l#a+cs0XNxUSER+uV{EXoy*7eWgz-_{daj9 z^iFJS(So*0^;Hp&rU;4{q8AXvuaNW;D3V&0iM9lqDubNk0`43}uL>g@Vn>C6@4;yyj!%p^ zt^fOvb?XbOLXr<@fL7-VI$y&CZ@j&9cpjF?^L zk4!DPb3&IK_y@l|J;80d_6yhPk1iUG1uJ%rBgpPy}IdJ2M-vD?-yvagROEfPBP={jMayCZ*RI z5P8lEL6NaFMQ-$#K$62M9Lqt~l~!{l;NrTYCYK(RZK;j_7GBg3IU?g*SMm_rlAz1C z#t^s|LKr&_8Y)CJKq&JO(<%`>bS2voo+f!!+aPYlIQ>-gqtDF+F%Fwj9nA#2hW3?i zvK&J?;RfB9jUJi(e>Qq#WmgSRRROTZ4)gV*sjC6o8fF5@EJXj*BD*_?3~Z^O8fxv$ zHRgPeVqFNF&_V}HW1_AfiXeufYhDo7f$l{A!yng-<<{C_i`NS!o%sB=9lh_XyThHdb=ReD?EcM0gh@QAZ*D6S#&-eQ+sTvSyQmI}HNIMLG zzaFp+)Y~NhpZbOZ_P7Za36;CUNw@$5L$oWRM!)xLTekG=$LK6^TFqxPEhsiI{Pwxe(Q zwLqHrO=+VI2kZu`ncU_apJEy)pO(_K3p{P(s}5w9Pj zpERt;klR7ASb+z{A|EIg@wBZ8K8Qou-nGrxp}u)K1xepte2xl3nK; zXfc|;AzqH|t%#b+19X$^Aa6%?pEs5X@csQY_FJb|oI5|l*Ik6Kn%e9ddu6lWEpbON zQoY__NfpKi#e6vPSqI9-9%kDk78*pXv_&ip0NcJkPl?82OOUW$;78%tW-N0SE+cpK zo%L(%4C^}hETY~!a*4rPrdvql0ZI7xr(?nend1xy9fYS$pvbW!!-+hW%iduN$}JWn z$26a#0#ms{b7EfAVhLtX>a0U$eoo3rb0A~-1-~@kY3m`#otIlVLPPoSwg}C z+Jcu(>q58Y($4`Fs}Tzrlbo=!5a(X&`*|NumSL}9zpCo1r@cnyPU5~q9pj6Co9&}q z@eJZj_P)K6+aHF3Na1&$Njx0dOFxZ4k>|XvO~*fYt1jt;R^xmH)+Goyz8}g;854X#Jk<)`i17H(j6R8 zv5UzcQlCWK+4cBrlG)zQHQ#%;Ke3a>)IGbh3jAogs54*%*5DV;d|(Fb8N}Z;CQA_o zK$W-3QwjERwdB&B{y8z!$;3f(p}IB&hO z+p_8%Ad5g7!-LtzcmdiN&8F7pnZ5ttw16+3bk>Hen68jSENL_@I{=Nw8W51C=ur*Yl69aZ zu@P}?DtHlIiP$(CiwrJlxRg5P7L}icx_WMJw4ifg(m;}QuePW(`W%f5Q-cK?W=;hg zX1N_~ShDg`J+SOhD2gn`1;S1CEZYpaGVEJ*PnAC*r?Rj+x(AxIef z=zZdQkkgmjJ8p?C2g&qE3m~etGCK-#GwOdMAlPKh+80}*>H%7bbqDUleg;p~alK{C zS&Piij7auWBb%kzVtI0F6<3e8j5(e&@JcMr7v|S)G@KC7TXRO%j4v?4*Thhn!}Bhv zl`H{IAczIK(L)*nV(KLWTAtQ`5Nc1cL0^L)`NcTU-$l4bo3+vFiol;cgqy#6m}eE) zlhmE_oI~G9Mh5-Fv}}vQl+9F40?&Jjx;yez8=-jI&UTPQG%Jtd&Oz4QGOd)Ge< z1tI0zkX#!Iv=ii+eJDV>@tLEDLRHKZeZ%`_idIPY5bJ~3?Je(lh)B9iG^#Az_@F;b z;QBek_>AszXWPHo*3Oc^vIC7fpG>{oU>rKJVurBTeu#x30Rb$Ta4~}RS zvY~#3lQU%yw;RUqy&O3=G$GLIrD)zFpQpZ-jvMUg*3Qw{-l_N0{wVvV-RxIfAY6ng zE5y*EuMk$4tdLY>)(1lU%+AWPt;p#`uO*v*WI)XP3c5Ob0!Z=LYxIV!KzvP*E!P}^#KP+Q!?15@kFm_w zD}C|K*pz>_Kw;7Q$P{MJ&+V}(5JFv!xhnlw??;4%ogiBkvvIiGl5@Ze1}l2ANdB*g zo!@3-mWFb6W@c#)WJWtXrnXBQn%q}=_{O%g#kldJ&Ib*zN6rhEWjI%QZ)qvE=6pEE zb@KIf`quX?6Wtwb1Lj-HxOTqUEWED1TA|jhS{saPnMRO>D-S%uir9N@u?FHG1JzDD zWxYIoKfmvLVq9}}N^k2qf_&mAvlN$W7L zsz0~|wjatD3O&#RKhB&^0PFpIIsqJU7C^y)NI)^)v134$Z3?#U( zfsP#aC^$-beMw;d=Pu`ziLR{B?-MtyGkKGt+g40rlehKqUIzAr?Mw@)gnXxe!kH96 zJo-Ax9bVB9&y;jdXQt1-9tQlwO!EUAbU>;} zx&_ElH_pLn+aF`MkIkj^YbLjX7&;|(w!PE9#m%{wLcZuLQd=XJSM=btNv)DJ#3>z1 z{j~COew#8m3?6p2(Z{fY$<_6_woIrV3R#fx6weJy+`!s1B8`kZ=Zgtg)k zY6^^aBw@H)$K8Ro$?CK3^UleFm!pM}ulGb}j6@e&QN=ww%|D5WT7G}-_v7N4&ySAk z9^(EZk#~h)0tb-B-yo7e5Hyzet8cC7R0D-OkQwKrfXvteFl)#~a}IC<`C34^qYru? zymnY};j}{srBB$$rQus=rPzgl{;>6kIa7;(2zKpUPA zxl(rs_Gg8Z8Uh5hP*9)4Mt5cm1LgkxxQaq%48vQ~8%vlmETq%zZC6O`vs<6$61m^V z0Rv@mBLLyJEP?n;5DQu=q)w2d5_#%@MippB_cttQN5c;S84+u9evIiht+^S0dX0_i zxnE8*WR?_R_j0Fe;bR_=4L5K5%ED^W<|07e4d(^Hvb_N4_EbU3ADNC`-U(!W>{5>! zv=vwz;J`<8+KYUHv$CcW~^;n#+o z^fEB~-)%Q`=$G6}J&by#vQuZ%%!0{wL$0EW@o)BTIVd9{aSe7na3<_tAvQq6f^e?o zk5;u_o;*i|A5Jz(=c@L2xH(m=t2$bCUwiezx&8a=koPVqe85pn`$BegR&w?8@?KA~ zB^lh*UDKtW7IP85D*X?;ReQd_QNjWx_o(WhRn}6aRY4Z`xQO$6K};{PM=R9lV9t+5 z!R|ac?SA=)nYZ!5F40ftiH$fr9mu23|9-K_8&9KV4ck8H##=crJI;4XA2^k5ux;p> zp!cHgF}hCYqd224&Ixi&uYg*vUkwe^62gF?b^sx^Ieu5sfoX>zx+Vc#jt%tYYol7e zVL(^U8YS6~ezi?gcb`9+?menhuTZ2L^AABYR*^wC6TTo%(WG7J8ElqF1`hLrN88p6k!$g4Dsr)M; zy4@}!^&X43L}N~-!u(&dEpl@SkycX7(boW~gO8xHTvHNBdrnd;puM1NmCbjcXyHq0 zpN-qcj35o4?tc(`pqJlHEmIwhL2tx2;B4cz2$7sgfLsT z*q5&dKV!j>j%vjh=6W(dUT&qDwCNUx)tsy{fFY07wS&RYh*y&0JZYi z&ssShOP&LfheeS&4yLM%lJUbRph8ZvdE}MAfQ*{tC+w5DGe9-5CiDFt2g_F}ua%5! zG3M;o5dwu-EkK6DM}Z(Z4^*m>Z_Z7P_Y={F8>i-&)x7oFmWh|3ZloAC6~BA&M}51Q z-acbPNT%6GBbF%?{Tr2O+Mvx!MNc9xHjSxSM*q?*12Kz=_jf#3u^Um2z5x)rhjJAs zkmFMYUKrXg5l^hjI0eyGIHWF~;uv}dH0o4Mb5P~Gm?`=>IMtnPNb2pd<)Q|rX!$}N zi{t{)8_guw8bJvdX{$)r1UlsvArBx*mUkh|+y(k^A5k!})Iox2prmv!%a5I8^UvYoK7=1#lqlm%7wjZ^ zuWq)_OS27%Iq8|rb(O!XMwY|Zp3|~l-BA3iOITR~A1;v`{>FU_c|bFyax!jXg1l;q zTgb;_4MX};Z$zaR^1~ioa#D7_aQC-K{@>%;zh{uZ^b1vp*=Z+Qf5d4?5e8FxDdzgN zL)o{m30EE!zO+BKRv_eE_?@B6L~Y4~I!s~rziZEe>e~c);vcqW8#%vxWoFuc+e8K> zw3-me)BmoC40+b++=;G)e*=W`pA(0zR29cdsS6iwxVowQIdAyfWd518v?Drssl)YW zEck5{;Xfr-r|9;Zj?eWQ1!?Wb2Mnwlg14i?{A_YWGId7!LF*4E?PJgEDuVF)IRktD zM(M#eTfJhg;|HFdYC|X(pXv=Vx>ut1w#|hbRZgMf9A6$5%nu{^+dgS;t`UDG{h7zu zv$S7|eH zaB-nG)FZ_1_`g&GGoG&%C8D-X_jwrhy{VpjUd1*9KL-ukuF(9gPy*ZrE!%jCrh7~8 z-U@S|$0vuKB+y!u>%+G_-gbXR<8H^b^Zb(1;*R2O^~d^rw9r5l351bEpyfj5D*Dm| z+*3Ns6Qo)+4gx5DIru_k>z~LgLf*Th@uff`70p-mq-k3yj7276z9wBUx z@0Z~3CUut^&v?F?;yZJCdcZxjC;it1E;N!h?Z8@oFV-L2xNxW9(H z!^rjyi^=!}BmHhO{pvaWv|-LV+?A*=(DKM&mUO&nh$uDfnVl(q^k!MYv$h2h?l(Sf?79{NPev|J|3rvQ<(I z7|>G`Esp_xlMBvl_+5hwF-i0VHjq(}3cyP;Zp}?MR5)}TrVG*wc>Pel>*<{ogKWIl z3kt{yZYtaBN=^<*o^ei~?Hh^#d3x}-HhvdwK>tY2rKSCdV990e( z(4iZG0vs&UGNxvYay_)HW7daz(K3P^8V*0R>;_LP%WO*YzQ_JGPrhPDa{j?vimZE8|0n9TZSyPXdl!1Y5UX@xJ1Bx584-%yq zb`=@!vDWB;Jg)*{g)s+%gIzCKE}OkJ?tIQI7i0{J*A;cHs1rB2I6^~w^Ce&|J$P2pGQ zxE6bP?;#o!eKGh!xq{ROH-7jTL#g@Hwwg#dVQa64AFMLG|uIQX7Kj zOyqrdhTSlsusN{18!pL$R0zk1x9bvbLNI6@G<*via6#~^hW@4APo3xUTGfOi zGqzv}G}_ZAM~j~M#R{Hh3!eFU_p8sHbu;h>7u}=#;2|0wH(?JQ;>rupcuY@Z7)=E- zAe{caEi&&yH06qj(qdGSY{I6mvvmi?k8{{TN3Ia30A%j-y{W!BG7X^F=+?rnBoSZWaSnW>N ziFpBshT34eD&F%1wrQ)snWZx=Rr?!h0sO=Yb%5M#6-y}(VCbJbJ*PDQ@cJkpkl3z( zYco;~(5`@P0;?u(Y}^0vZ0W3S1u6&UOP9yXEQv0C+a^1dt^{1t*deO3t!zu5bCL31 z&x<^ADy%JbZ7|$^;VzIk${i=W5rZrUt^tmB0P3QlKR+h6COas1?*|~@#nk>Ps2_fA zW)YIb6qJa2f5LJX>oXOMOc9-#M0eWDbKUiiy38N84m_~%y~no2sajOJ|9$4Ym7jM4 z$AV1AEp%~H&;Wp#6E{9?2x_>gs$vIFd-CVi^7@~f4DXGzlc_XS8jfx;GdGOpE4%ek zRBVq&%;5)4r?TI2in2Ru!xc;b`|`gsp}%s}`XAmRPz)oLlI40G0F6xu0+B-nmEOgG zY-u1rbO;=wcw%JiyTVgc2J@X0?xo)3g)mqwbN26u8k!<1!|c%8kXL^|0gV_}ztR2f zjqeFV{;CbUUFXi@HOD?s1vKt{lRCtvXKYtt+qqu`j6&~Y9sV>01QvH1AX0rK*8{PQ zI+}hAv!48--@>#{CUg!iGUiG;Gr#B`Iaqx)I7=~_|HvM{s|c6XPDc9|jX70xgh=z{ z4&Q`(3j(|)+-)n|I`BbKMXk4j%)d2@r#XrhzfF5ImAHb+vPxhDkrZy>1{~UQ0T8t_bg*^YLVd{2S{)IQMxSsT6N3)4gAW9)4PX z+DD^jHlqu5w0Uj@?s2z^ZwhXQOFx6O@Q%9UB!5!^J(w+MeEvlc(7}@7yEJXF)7JewvpW5YrS*jMlIuFV4Ze$244sJddm5q$Nm8+ zYjJ+5*y&rHz?p28vQ<^CiS*w{4?Fb z|65Tq(G%dzN1O0-)A+@8I3pytcN12$M4GBj{E!gPGsTYr{9Q`&*KjYtZoB5(?AJGH z#Nma3O3xhUFaYfW#tqa<%z2s{SaKZ%2eV_(hJMbD9ZSTBVz4D^J$Dggs>1vZ=vH6@ zZVQv90_VcinKx?K#&*_EUwsVv)o!qtwh#M4yibdEMm*NjL{pWAz(@oib~@t@kW;;a zEsbWqFF+(^7d8@+B=5VuwB!By%@c^639D%ZyMb#- zVV>bR`CoO!pGNJgk)Aor+PzQY70qm5?csu4xa`B9p5OEY z+HfRpIbBFme%BCyWMP~7QG{|f#e}@ zX~JZgUa57vj8 z$5l0X%8xYnP&EC}b`lxs=HCDnXZ-5@WxbC+%6eM4Y_5Qb<55|G6or=;=o8FRSawyi zUv$d#MF*0VU%d5o%Nd}DI=t#7a=$zSk`-A9QqpkJlgU6BW@oqD*xWKZrhi9W-M!+b zd6`J)zDMghPK!Wn?WdQD>ZPB?{E2_PSaH|i-p4bxqUn^^o^s>*A8LqT0(adRT*+q^P){|yk6P|Yxu$opwjZZ2ZQ=)NwiyZ{V`4ugSR z<~-mskpXj%^!H(JFkjCy7v-I8y6qC7wm0v=tZ*BGw^#;fPj}X_6NcMHqz%EmR+)18 z8g{-kF z|A8Cz_oMRlVENlW%s-@V>7`wr+<$`EMC7gr^jRgS@_LKY7snRq#kSNHd$X^hJr3N5 z^ASO!069wzF2{5TF`>(pN5K0r4~rFgF#Ka$qK)z;wIl<@VT?(Ai)AyfYU$y23pSFbEic4BRk!cPW1oKeI%&VL@3lLO`+t%an znTzf3$M}0H^drGyw>K(!w~{_6nwCUOH+w~8e~Rmij1jj@di!ag6}uA$ez025M(s$)<{~ z^3h68!fpq3$_?ghS5h>XVwU_41j|e9&(z=Vm0-@>22$ggtwjLd0+FBqC){xcE&8S2 z;&K5DXuKW=_ju4ZR)fN5hd0PZWfNfS!pP^SY@UoaW9XcM2Xh7vCqI0h8loWMTs+hb z_+`(6n^Xju z*UNaTg3%wAzpfm|2CDZJH)Z^(9&rQ;+<)Dakv267_0hq$|8?Jvsr9n!NPIM5z138o zK?Z~YTARi*g|`Q_HlaT8I4mwW&^T;UK@M1crHW}VZu|pNWB_u&<1OGetBtc$wC$lq z2dHt(?b?O~w5hTUV(}#Nb`y%?3b~!!wEc=vtwv7K3w0C$R876RE*+1W4ZIDma$)I! zLwD3XK@MBe#%%%GxEfA+#CcrlPkAMqj?mv#un>+_Cj;&cno(cYz+w&(|F-Miwcue` z^36Xq1h&H!Txlf{s<#F6Z;o>3U5=U%?F-&0{`AeGvk$%>`f}+@9rFRG4SxwuIi>GdLRQst)NS*Lg?z2^JvK^U}k+%2n ztUX(x;`yci>|@93#MRax@%--PXUGx#c2bpx+B!6~@CLChMg<*xjfN2$&qPC?sxM!m zH6C22R5Pie*CzohKeNNDPt*BCQ-<`DLlO9{sDc%6Fe^Tq4Xn9o*e`qy89_yWD` z@(qA_YyxRd!T7D{Fc?>th0PR@IEg%WdojTW^5!4T)u|lKjVPb_bCpZdlpm|w&+HrX z@sgXEVwC{6J~8GD^E^V1BXo?7Bd&rA1@@B`;)*|9?aGROS1Oj^8RAABKJQWFsE#P0kOKcSG=LNO8saZMo8x@ijcpV_+<4 zg|q^9T?gE0$D#vaRg<`MfcWtkEjl^jK;KPnUaT4vPt!+lK!U9PNpinQ=B6|`9?@f) zefMp~ZToY#T(GNmP2AAhP2RP*I4Ewe@37&lfyT@+{(a&08*)@6g|yipyF;d97C?E& zoVEUI%rB9B(%748@+UW{o1Be!!2XQK zCw6fUxU0fC340X;v#Q&2q|3~|VhXSqQQ~C9awKP-Eu4>xEnigop0GLg3TP((;n#ii zu!B8}!<9YrwBPM3@Z*c4@9Lxg=@bZhH%-{t)Kh==NJFU;UTN2vO2EF5lSjUeGnIff z0~TiWOeNs4Qxh)IKgC$4BQ!xaa)XZd7qElDbIfa$Sd=W8&4Cbc3Zx?eZ*e45l9&v% zAMmwZ7T?L<^j}v=6x@9C1}KJ0@vR2bDm~&#<5Ph+`s=813erD#R z)!B=_5?8x^M7H;uoYFE2*bMELZmSO1g4?CA`QD)qxmn>uCXSA(M~{YX;;&L0J|CZG z-?Pe)XHWd`el4Zp5;-F8J@KQ2$kycC`MpXCGe#cU(lk??&DsXR>Gvuhc+xKwwU+i5`|#rBvdBJHqzpR%RyosfM=8;3>j+iPn) z3JLWCV_|=Rc_y&WH2QC@wK)3MwHC`S(&sTcom+?s*4k8}e?7Jt&O6#zyD#`@Q+L0i z?1RG9m&70ON=sQj&&>X&c?9@i=)y#bxn42iWx3#> zvXq;C$dSU;!)8Yw9^2$ImXO4mVKY;M=LUCan)8~u}o z7jQLhH!Y*O8i+@Q2(R2N0<}djscCncO9b8T7`Dn^4P`*4(fTb8c$1b~v#W=#t~(6` zgbQwV_MJR!_U%;uDIQr^33G$~e8IlZ_qn%KAF-4AsMvRhX%2UP@Q=E=Id%rAA1j@C zdDMwBwlh+oDbDSPT0BLnYdG6eEWc&e;%M8X9Ji6l!}PsduZ9?mPe}HyMJNkhG%`Lo zv>#)Uj)1veF8?SgX~26TcF@-9{k!+vH$OKNdURWh8n1>OD|KvKKa>I4|H5o0I_#@< zA3X?$2sOkgyNbEf^phKGz1;e0{y<4guGYLNAYHcQla~Fr>{n?!(=DOrh+W=k81?27 zzTtByl11#;0b13AmlrZ7=MRW5bMT*_GD#`6s`keOZ^X`2;rb)|m?Jz5zrUMnd zn_jQ0bYdHK>@E)LA;q~QdtN6;*m|W|*x*oCniB351;eCr-J~Z>rjtVNn)*PaPDYqB zk`cXkxK*merUDfP3vIjX<<3r;d^>SXp|y1nq`a1Y(~pGqO2|X&L&`{kD0!%-_ocfT zRmOVTIMKrP>A{WJ)7qU1Mp0kBRMIcD+%J1LQ6r@_a{dI0=SFgyYM1UgqVU7K-sJOK zXj8d##l8-M~>TwSzsi4zN)zS)%`gT!#(1N$2!6i`_^{=OuouKN|OS zVpo}PXsTr7`~E4e5xOeD`^EpahqXc3D{{7Sv=r^#taW06LH?8t%9hM4Oy*gA*f#&M zEN4k9Q2wpm_56}YY@tRHsga@5MRQiB#PscW;mVL$!~MaG<`qIDCZru;qU3SIP zF_-J8{H>=9Cj`a0R_x$dz`(TVdMR`pXNc6)je9Sz%enUK(UtSUZtB|;HXYp|xRaBG zP4a|=P1n3t*=EYY7vGm$+qq+_c-be1bdZ9*UhkY78QY3D*(X>m;Me@XVs^b=B6Y_H z&7J;SnN}s&q_$q%G0DSJ`agpqSF4WyOclrYnmcp$UGlexmG;?t`9DKepxWX!cV0~w zj}zQAy`)RXBKYlvmOhK)Tnh^)pG=gVSc^%}#vmFL3vzREeC6RPGru zZoUIMBs10qIl13E_h<6SbADyy~|IWLquBv~hE<;W1y|)prGe z?qOgEU|`T-U=U$o0J@cxq2X7}-Tr?Ew&h-AuJ}^iC3&HiZBD7G%*WQ7wL4*>&~y8+dE>IuTX`?8=DvFT{9yiU$%3aU68pEUbN|IN&-=lC)p$B zFqXg_^x%BIthdq|UABMK4B{>~qGP|lw|RV;U1ra#ex5q!mc2(0%>P)XE&t(|QuViO zO*IFOhSxH;%=+12&(~9PVCwm=-SfI@4m>GdIhFs%^Mn)Zb6P*_F?iLdS0H^smRGS@ zTj|ZTD~qkG9^SmL+`1~TMegp!`vS=fA0AEPN)QZVU|6wvb#8Ul)a2QWFO3s)epO_! ip{FS(1_#E775f;j%`r{jN%7eVO0k}}~ zFfdKpOgyV=W#~WqD8|I`_bf5sr^3|U;RGcA?}~$uWvJsazD)2`0JhGoqvBmoP4|NporYs?TzK$8EpIS zH{VcSzEJT`9n(M6B*P!Itbcf~X$wgmey{(aPKxdR+cTmcv<@(SNau_Y_&1A*?O?qB z0fQgeoDv-MvW(6T^P`XdZ<)W-a97pxEt4AZ_b;pKuiF1>OAhxgj{1yed*{_{KJ`6c z{x`F*eKr$Ye9m)jpeZtp-G}BYCM5p&%c{e-e|rN1(9)Iz?==-T>g*X4KU8yawA^=h z(D)0$mUL2ZADh8yYw-@H5y4H{jA1FZ#D3>EkcP zqt6$~2h`~OV*JH;Q@r*s1JkDb@~_MsC+aR-=2uV<|F;Xp&W2ep*#B(g_{yBLP2q2Y zd%zcFCN+@tK0xgc(z&o%8Ty5}>*#BCk@?+q4j*@>d}EGjX=Pw)0V56pCJ>s?)KhD_ t_w+_zhhHpn8tav3!Q>&TpkzbhPu5q9MxFow literal 0 HcmV?d00001 diff --git a/latex/images/qr_plcmt_reserved.png b/latex/images/qr_plcmt_reserved.png new file mode 100644 index 0000000000000000000000000000000000000000..2fbb78744d85b19468d27e9c71f8bc8bca8fc205 GIT binary patch literal 949 zcmeAS@N?(olHy`uVBq!ia0vp^2|)aSgAGXj(MWy(q}YQL70(Y)*K0-AbW|YuPggAHa<~3ULM{f%YZ^WnIRD+&iT2ysd*(pE(61!b(>}~ zFfeO*x;TbZ+gqLG-KB0G9WGV<`JrEJ%cnVZ>^$Df`R-AP%<+w$ zk!7L`3Q3a zjb_w4#K6M9z{udhz#zcDz;b{+_)q4$b$_B-?#_(gEmZdOy3(6d>s@aopWeT>v-t04 zcELT|pUk!#ycxfP3obb|zI%h&fu%>>x39JN{X4EHF5uqm?=qFruW~gQ7$?lWyg5GH zxU%}!SK<0EkvHbq+1$K+d41UXz5R*RySg{P9E;>`Oy;bkH3yzn+WeAu#+-J%=0J1$ zrk@PriEvlLJ@9{W`o3V115!`ZnM}0o`4>d~jAY31d$o&Ed{89!|qnoi%}_Ubp|cKM9EKN+uoeDMBn-GU=`FV5YUzT!i~ zD+a5*cSPh)Uw@)r_tWR!yWfn@m}9;eGoE4Buopg1)9?u!)8VYySNn2L{@+%AH)o|q}YQL70(Y)*K0-AbW|YuPggAHa<~3S;1Xb4grODGD9Ltobz*YQ}arITn2_c>ox&R zWGe7IOY^>xY#y6PnTzvg*es|CCIf*aDm_r2#&5DeyU za1ansP~hMY5MW{9;9z26VPRxsYHDC$baZ&Yw{5k(!7+iO$6{>#w3wC3+4j8l+%c&( zT=vzwn!mfl>?8%^oE#h)8h(^-c6HF1wthnk%b5v3xu)j{PpI*}d8X{a-?-*wqDBfo zIXw2w`xM#q_WLaEijSWU)m?sH^Y&Nz!E^QBA6eu{|9ASB9`^H6`fiWM@fG^7S>D{3 z_QB#Am~;D6WBd)~rS^QKa{s#xD}MiK{5IG4%H`{Yk#*bjb^cv4KJ4oh&UxPOhl>o; zzQXepW-iE{ds2OK;)V0J#&1|AeAs8f^6#33v%f<+XZ_=X&>0WpccuT(xv=xi<{dSK ztSX5wQ_b5ORCM&?YZyHvqV~x!P1>-grjkV^(eq~!r^lh9PfvwEh&=dPXd!%kg8gIv zibEMOf6Lbj48ok7euXaY29t>60iP;so-eB*nmZPuR(q}y=pR&R6;x8WgKkJ0D&W9=d zh*ZtFvMzZVf1MfU?5|xjb(`k99%}3DN}K(_efoyX>1%Fk{RmXexw9yD8+V-v=T~+f zp+Dv=JC@qtlX$HbSMTtbar)ive+}KNZ|=$a*B@Z;F8K7XVYRy5-yib7m>2DBP*G9f zbaW6Bn$V)4z{x4$b*R?dn}ufrP^_UrLBYXcib8I+nMXu88@(_Cku!| dNUDi>#{MZ&^i1jj-^ZXd=;`X`vd$@?2>=A8JFNf! literal 0 HcmV?d00001 diff --git a/latex/images/qr_reserved.jpg b/latex/images/qr_reserved.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0ccd814f791ea26279b8e725725f9475cc439b73 GIT binary patch literal 19912 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்`t+kAfIY5?X3)}E8^>OjAX&#F*G2OR$5|D}0RMwb{S=7e zYr}bkqC=++4KMqr$70#F^WdFh2A!Y zW>H65_>%#dcfetQvROlUJbDWOV78nQ$ZD(vkkx2*!#{;AP|$>NmJ~V=5;OZf$yz|n zT2Zn~n&~uOn>GL-wE8&Nd zMF;m-fYd44f(3g4w54*?N~uHww91tGyOITpWGxKzbAFJHzsxVrb0Gk^`L~X8k5?r& zy(LJ4(?bgbV97j^waeuED2K7gIX#6hg7Ln^+xre=vuAq@1WS!BgOvUpX@~V)2E`$S za2WZ1TJak^F`c!9y%yTw@@&AaBU1o*eR%IAN*PRk4^ZpxQox!NfwVxV^6X#3z`XZ{ zw7tGX*xqv-%jlY{G&$d$urqdRl;yMtd%-Dfg#0zNbWX>>i@~1zbtt?>zL?=sV=9D^ zgYjQy)`3$RZ}Mw(?sufagz{9v=fgQ4v)?yr)C}slPJB#@bl9qM-Qd#VqyCNfkT^FW z>F-)u<{AosyKo#x!%ow4`t?icLyw0v9X5@*emb*4b>RnSWb1HQMr zH=Tc5p}BWL3SKu99HRtH5wiCfQ2XII2O?RP3JIhp_0pHfa#&+{3Ir2tJl|v(=1m4p zaTssrHm-Zff1sMyJ;lzIlcM8EPbo13+M<#b&A8+&6>1kPHc2bf^U0g`$v7S$b(?$$ z=#!Db-#C_B*uT1P8zP-p_OR|S0BFZ4J zCH;+x5uNstNBOjL(B?}g_a?fo^N3n)z98J2(SXOB7gc^apyeS_Hp z%{)9yI9-|slQPEz?Q9Oq_}0o!7-7=*2jgE6;Ek%W>=#=c)KPd>SJNX6PG8>C$w<#1 zN-V6D5hJQ)eRC@2WZl)Q8)z=jF}?MLC+B&zpT<@KvP?CuI^msl`19vE5dx(Su;aCC z$HeW1xBQx}LL7T~bNb^TGlIi@-xg7c$xlLK3MaM~Zr zxoo&kaa{zo4uUSn#jq$4kAwWQsSqTrl2nj~p3GO;0FBx|0{{$-t+{xW2N|X(2(V#r z*R9FRrYTD~4FNo|c08SS=gpmOxSOLdrtKgU1J0^ff?U|x1Q>!>w5FgeNgOo~igslP zr6PoI5;MjNL=ItckmF;0dP~scZ6O~7ITKW(53v-^v}IqA(>{a3ciw^v(FVo=_C+5< z0(D~o)SY|dlvnT)08*_j{92GRjEjaF!CBggByK_W0>Lv8ML7X4C{>)&6h!~?kEO-> zBl+Q82Heirz7T>AGDD+$5RN71f5jG_4ViYc3v{SCR9~P%5qSPb_cRN(kzLw;K?I03 zD6*t~p+F34t=?TsrV2?qgsXD|#@(et7E3&`F2k^`TSr!bb+$uT4soga_N_G3nqe1X zKcGlY_UloK!ax=$NR5v{?RbrRa^?a&hZ3#qqCzq%mU|b3o&;!d{R?sv`ra^6*8kS? zl;@=9BUd_JShBDv7(a0VEBmPH0oemA=qpBOS$6dT>#SO!oUcG`SUpZ4E3ev^RC#}B z0w|q-tgs@yYF}&vUwf+|SM99us%`0)h+(PuFZ)<=LQOw1(?bX!m%U(LqgJ|zpPHQw z?8vEBZZTWmrkl|V5S}@%4glE2<27Wq`8g-(hBJsojtk3OvIXM35;9v1IKQ#_+3yJD zL@G!Ma5EKM@s*BwDX-dM4EACM6X=V_C6oo^NZZ*L2zATP&dXfMQc^p`^gh6c>0H@e z@xa&noGv0tlfu#LA2fOog3N3B8to8 zmCp)(zZbSIwc^)+1~=WVa5ksjYrCuRP@9O0ow(sav5kTJw`N;IjxBCk0wQJnN;{|+ zwZPnjnX~hSZVKa~#xS$fK;!oSV3S*iv@r5kI8o){Hv9P&SM&w*H?8LX(5&N2Jq;>-O~Aeq>{12z3qBpHV# z8MxO>0y-h0g(lw%r$SoCFCa7pRn{!nDR2lFW_PcZl@m!6}gTJX>E9%!L<#mngUP7rLEWJ(?C|JQVsdOB_nmM7mCRBt9)S@ej%H zcj<8TV;T_rY#f#ZNq{w9>;gwuyVa<6#c?qSR#X&o7c(J{1dntuLbH;;D|@RRb`#(PpyVgAxG?OEFBf0dE`*O>(ACv@?nLqk2`N$y5%n2u$ z2#Qi{Y}&I#nvt3Z!u*9|q{A&c>(tHr^d{99WTM9Q7M41&v>7}(baihdx#dz|KRV83 zzDGDcgcQ7pUSNjF0^GOB|8R2t?&$oBM|0O{%Hg2fl;UjR*uz8wif9MHJeRp(z3 z@Bo1>uJ)RV$bigCeqyP)YBZDq5;86Dqr0hIP$?|qH{POY z0%!(f&?e^8Rqi+uW_P;xRW@_HS@KuEO|I;`Lqe8Qt-L5%vH3JDy!gXgtjy=)79Y-6 zDQIVeonq93og?t+kB(?oYs&bV2j|e&dn=CrY45m4F}N%Z9=Pr}pqs3A7((8RY*719 zKtD#<^)%~7n`PL4M@Id;POh%dpzIcI>uU!i*?HPG(QlkDj$vW+2XOA5UO943#uiDS z0nmw4ha}d*3N_1 zHw@r5k)(#x{wyj&*C^G<8MSV>RSBTeYX;NvgD8k1Kswamamhs^wnvt$?Qr|;nA<@j zu8rBx_$!R*_tJ;hEC5=%ezJ%FEg_(6`J(_X!iB?S;gf2GHRM;6kfF(n$$WgiK;+)h z(D8FvT!gDB<-VB!kP2Rd`6kj_^-qZ(Q}v3Y(Mv#?beE;P|5T79a=&Qr*YIkF{_f;| zm_61X>~%lWsjQFjwEG?|prC1g0=cpygv`}6k0!~4fP;E^MR4%xaG>n=R#TMy&Pv8zicy+doNYc)D8@Fl@eI zzWz~7p$}TFHGiRvLARB-`~N~3Q$$QO8U_BPGFD5Ue(Hk4Unq8(LRJ69L7_=|301g` zzMZ+sem&D1ur;>$TFYsz1%ZdoWy$YM<+Wp{RRb;6$+oo;G;6wV9@Z#V3iiSVyd@A& zdVzd>4|R-EOXTgK)KNmYOjXEe2dqW4v&xCNvM8K&LZC&4QHx(*eBUA-Fx{~?LDJpm#k zSHthUd~Xef*Z%Y1C72ZjPMTmcT;{d4k%Y9hw)0px89DnsjQ4C%B|^k8n?u%PKuCh- zi$oe|Yx}R5TK^#n&aF7+z#6ZX8EJ-Wq(;%ehqp$)6#kRO2rWhVgPtp2(i-_vXT8Me zt#S4BO2Zbo@DkQ&m!N>G(?VldpCzW_8#oZGFqg&*98+-53wXwK9!=x{WwHLb4RN^;_!ZW-ho{G&zBL9rBg=J) zBI}y2wQc;`ruMJN*y^10+jF^swfS~Y>0d;*;LP{Lqkng3WG+~&?@h(929E!!=~{?L z!(dic;;<5$$S)37!qx^_zUnVEZt!YD0>>=& z!0(RPF~f!59J3$at#Qo$x9zyDcFq3cIU;B+SxM?e1IqX%G!1T5?gyMv$+PO$7OIOQ z-Ez30%=oe8;GjgolN~y_5zYAI$$@7PR!@xUxX)(1p}WAQe6*;tFHQ>c3 zQKh)XtGi-ZzI|fdXmLcHxMen^ZK1up8uidQ;*pkv18d+^tiQw~N$tDct+e`kA%r(A zbW0Ugmd0o!wBtQ)z%JEfEXx0D^CK+5i}L-Ls9E(PUB=x|h1;0snC5<8w~&(e>c{b{ z6))9u5M?S=yxBPpU-Q%*3%Rx+mG(KNW?@{sWw!z#l z+(xi0(-4g;jq-@fFiBQMU%PEP$um=VPpyQWOgh3KeSOc3>yEYkFUU`ynG;0g)ZQDI zemW9%5)yXEiCwsTD2V`{CipqO!Mf%xA8))Wtmu5CLhVT5-5t#Hp&{I*zopLE* zbb%SnQ#mVs?55-OOMd!QyC8mHnxV_w2h3||>XYjD5mLr9LyaHAjRF%9)mY zc;#{#m?-It{lpfFobu<&Bew1d(bJp%x(LnmVdd|Ap zIRc4XR@@`0H5*nlb0_3!I_GDxF!zSJaVZ()5@zJdjO_IE>_8pb0``afeo)cMO%8&- z=l*xtyMM8<=c}`Ei$$tKZyBiz5>yY!+jy9m)?vJDfl(U zc*W}^y~>x!1(zhO+}v=u0W^9=vH+O`4jX%a@|6`s4!C2&F9CFqwd{WP42aajjF&%hG5xf0lr9t~0Wi@osj0*bsT=~?RYJ{8h^VEIS`ia~8u zZq(n_hyK&L&~G^XuW|XGkr;svSbZX2W43@Mc$>Qv9@rMv|0uV9Ie`}U3s0}nf2~FN z7kFoNGxI--eYn&$^YTX(bY2~|WQpl8++|<)Qlj`$uK!!whh}BFwU0oLSZw`qDt=D6 zl9~=8q{e2SZiQf7$ve=}CzKlvoPcvEHAseM1Pc?z;`dldbFIGvdDuI2~o6~CD8-uba*XW`4f z8`{H>-!lVls(k-G=qJ9_9lGivgBK4}a`4kou2(-RV;9>nIoFn=Nc2pV**Gd^VSSw` z(0Qj`*G9J3tuOn_UT&{dSGpY8E!v`3wWa>(;a&U5?WPsg2e#AfgR;1TReOYwmEvlA z=b07y9t5hNQg2SNNa+~GcZewPvvs_AM=XY*6Fz+6g^qxrI-=JpcS|Z1M!~)sMnWuw z&4Hlpas2f-d==1Sodu^kBO$}-bi1w(!JU)WEK^zIJind4nzrHxE&+WXnQ`RunYdc| zfhJ((2eul8I#fEBK7IfGfBeW@;jw9r$J-mZGcm2rUxEhz(x3bknAX(bi!dATp%O}y zP_7~88x(Disv{MDo1neS7yUnU$U@*K^ZfvFj6VwGnA;%7l($%GL9UBsdVUz@)WXsQ zhld)RXoqL{-+kCH)=d!1 zs>)I%LkP#!Wq>ztHxMlD)PZi#qLL$85Hs-5b(T{8NeA4>^CpHh9JzK>D;=WMZ&Ek} zEObC@TRSKn(vFurK;Vef1`_KChVYIUB;ZbPQTj`1iasuo>Qm|Hgc2@Mu4hienGihC%(%n{U!l9wQGUL(>)b zS|Lb1?6whLiE9OG4K=uu4L=MVRUwq{qh`^d4=c>+C4j=3wziTE;+`~heNSRyJCxi} z5SG7HQu4t!IWdS{EUFbRraD;uhRw<-D?(m)i6b0>7PxT4|h zdCQ9ZyyafoapqRt9C;a8FNcP96k1PVu8 z?;6opqLdjZtzY)Os6=Tmt+%DavqJNiorq7knQw;m8E5Nd3zTA9y(+#c`d46&HonQz z^w~%6S)k_lS+}iHTyTt}ge!d2o0P`$4OU9_F~)N($6><0A1lKjzJuC!DP7$EOs%hvoZdIK?V z@7gV;=5@^^@L84_c^Ja}{^J4y)<9zRK*C@{`Q3InXJ1czx9_T$H#87#w)V3iBk?#B zGw}*xcI^I)Z`LXg=AK@DQE}LQ)G;wqvum?N=q8#+f;StD*3Ih%%s;t1jl$|$Us2I+ zo0N}c#g=YltGIB~ETvOYGWe&Qz0$#7UEKck{M!So$$?P)e8~t#)ekgr9+kZ#qUnTF zxc)xh+^#+{s!UlXacmn}b!qn$(~XW?ibP2vH|ypPM`*a`=C7+7m4vWbx5ow6VaH}h z-R+2Ds?Gt@U#_L>KL0^pqyWWS1pp>B@hg3 z>UYgfPEDyfT3Yi7-FjH9Ics|3wY!4-$o+K8mD`_q^n484y#f;3yUH)U9h2j}KX9V% z?WgG2&I95@2a`9AF{lqKjb}dSabP;;Q zs)!f!G0b28;6^dt+6-S55im-t{!lhd%fQOW+zdX#VJW|pX&+KhmvPYoGIQ$>{{>SK9BHfry%(B5a@#;;Ak zm2vJjC)IDaAzXXaE`IKX=#%Z|QZ@GntF?rZgc|HK(t?m2b`F`gDJIhsQ3^FKj^0yPad5gE3NmCy%g_SYKGS;Xwki$Qf@2wRc%)gZC+k{5#0fiLodQR z_+nVaTQa&7N|9ShTNOh#BkxTNe0nLBa+5)%`N9zai?=gv&z@qwZ@KE?;$&GvT5cG3Zr78`td<@womg;EyE`IqPrVpkr?ndwv{s`K0Rc z%WY0{;h!(?G?2_+?G6CH7ffiMoO+@8HU1D&l4Pv?nJ3Z#p)G<8F-)>|ycix7!7LMV zn2#N%W4!k5_Y-Aaor@)&kKx}S(rdtr;DVsDCQ~a6c4hBBkG+nteI4ZBO-qZ8PAm?m-Rc ze*1JkQ??MT%C25r@sm-dhIuL+N9khWq3!x{ezRf^rKX>UN46gw-W+QknFmiE6KiyO z9(}rRyhP>nROmq+M$bI9(9e9mXLrlHN#8g+LT`ivB~qRs-=N!YP2IXr;FIV{pD#YT zxp#{%wer%)aKAfpgxH1+bK6&0{f&Uqa}d_*Kcv*MaL>ea)K+M4#v}fTg-oEO^8n4h X3Wd+^Q0HH8&ei<$|Ayx@)VBWxuB&p( literal 0 HcmV?d00001 diff --git a/latex/images/qr_reserved_example.jpg b/latex/images/qr_reserved_example.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ebd0234f3f4d348fde99c1d175050a53524a562b GIT binary patch literal 52570 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 ZMtcmx)hm^&u0o%F;P(Gdp5e@{{{z3LcD?`r literal 0 HcmV?d00001 diff --git a/latex/introduction.tex b/latex/introduction.tex new file mode 100644 index 0000000..136a4a3 --- /dev/null +++ b/latex/introduction.tex @@ -0,0 +1,22 @@ +\chapter{Introduction} +\label{chap:intro} +%Telecommunication has certainly been one of the most important development in the last century. From pigeons to Earth-Mars transmissions, a lot has happened. Nowadays, our society is all about information. Whether it is one's credit card number, the price of a dress or taxes, everything revolves around numbers and digital data. +%While the first computers and calculators used analog systems and could store any arbitrary type of data, our current devices are digital and only contain binary information. Inventors and developers were hence confronted to the challenge of encoding certain types of data in binary. + +%We developed character encodings such as ASCII, UTF-8 or CP-1252, formats to store pictures, formats to store sounds, formats to store videos, etc. Many of these encodings have been standardized to facilitate communication between devices and are free to be used by anyone. + +Computers and microprocessors are certainly the defining innovations of the end of the XX\textsuperscript{th} and beginning of the XXI\textsuperscript{st} centuries. +Invented to perform tasks faster and more reliably than humans, they truly have surpassed our mental capacities in many areas. +Although they overcome a great number of our shortcomings, especially in terms of speed, they are not infallible. +While many computer related bugs can be tracked down to a human error, some are inherent to the physical infrastructure of our technologies. +One major material limitation is the network connecting computers to each other. +For example, WiFi and mobile data use radio transmissions which are not perfectly reliable. Similarly, space communication implies a lot of interferences due to the atmosphere, space debris and all sorts of radiations. +Invalid data may also come from external sensors, would that be because they are malfunctioning or simply not able to correctly interpret there inputs. + +As such, engineers and programmers have to devise methods to check that the data received is unaltered and provide a way of recovering the original information, or at least guess it. +These methods are most useful in fields where data is, or was, manually input. +As the saying goes, to err is human, and machines help us correct these errors. +Of course, these concerns are not new. Indeed, Claude Shannon had already started taking an interest in information theory in 1948\cite{information_theory}. +This scientific field which studies the characteristics and behaviors of information led to many technological improvements and fundamental theories, especially in computer science. + +Barcodes and QR-Codes are two instances of the consequences and use of information theory. Their main benefit is to allow reliable identification of objects by computers. Prior to these inventions, it was the task of humans to manually tell machines what an object was, for example in supermarkets or factories. Now, a simple camera can quickly recognize items, without the use of artificial intelligence, which requires substantially higher computing capacity. Additionally, their simple designs make them very easy and efficient to implement, even on limited hardware. diff --git a/latex/main.pdf b/latex/main.pdf new file mode 100644 index 0000000000000000000000000000000000000000..238bd062375155d88d0649de1ccf2d54009eadbd GIT binary patch literal 683540 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ð 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þMu4pS-H#T>}PwOorhEf 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[!F|Ey1CpRUh_0=YsKJ(C%7X_ zn0qP5%(;4WCm2U|>R)}sN)3qr5ZIXh54FPo4s47ZENuUyy3UGLM=UWr!psZm5AYCa zl{*kHAlA)zzgZ}`w)JsHjysU}Umx_lB6!@IemE9dm!y%yDs^51c-JCpauVyXVB5;>B?Vcd50P??4n5!TE?n zIQl4DpCP{4h1}b7yg+Yn{=H`&nWvC7`P0R5e@Nd~5MqTsGRXTP(*Vu;T=kM}$IcMc zgWd=}#>U!)zQzvjhOFiL`v;%D&JMod`F@Jc_sC|mmzMYqkIzU#{tIs9C)wL$R= zKkrxa(MMTPo^o|A%6#H_}B=@Q(htLuA15#mcvH)Z!Qe~ZGOqRhe zwc8qJp2N{a^cD+~OK{|NmNaU|%7x`) zwYxAYhs}k9L!U)z)|^u(NC}2WqaUg%1E3SmNQnB7MAjms!fM4R@CR~LyXEl z6xit8J(pCfF;vOaXDx_tc1ykV6WJT2CxT=X>|4W5*7IOhM3>ZaN8iqYMO~IYjXP

rvW`m|*D6{VVT2F!>BQ~l{kTjG?YA%z5`l$ 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

2LHW!uiq%*?fuYdasGfPeri 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 s04UOWE}96)1c#~9O438DyZ6A^X8--Af5gs zQ=y^_2Py_F$fIMf_%%Nmj{1N6L%xKY%=JuH#qKNtOkGfgYplJwJ z?aa_~40qqtzLI;&%u7Uo0w5~+Z-9tvEdh+rW+wCn#S#GB(fBhs;bF=0RG@}B2VKH! z?-*!AK?LC5qMK|in%j)7%4D%SR?&PfMgpc2FvKtjv3NQT5`q!176mR{=e{AZBo;x8 z1B6@i*GK`$6P(;VSXFl;%UgvSS@C`H%YIUOO^0ut9RJ31T8fgLd}R=qJSqkOf5ZUz zqd}rjOmU>Ayk0ZsUx9Y@D>%^=L zci3~1{`6W`94H_#P#Tyac@5CozoKR0AEK{o5Y!~lic}&t2MnA%`j%IgH}KXeolRjK zL>_zYL?sx6*l4e9is^(cD~$ZV_9<5fAfkFi!@EdmgQ%W=9UghjA0n!CcAUTP91zv8 z-8a=m6q@W1@z*LhSb{@PQ~Y-e;+uZY}q@;$zh86!}6yG0cXnPH#q-EmceDjc7|(4BkQ(?F&3HYp5WLW z?~c#q6a7BQGTRjc7qZ&Ioq5W?LcJ=HAa$VU(>?falK_->yc@5Bm#G09EU9b3tx1IC z8$L$Wm>ttT&Wc5WMoDI)zj*yqYhYrcm_g6?5B?Ujk>&Qtza{#vsu!BnJ;*;^u#7eJ z5Yw3{hTX!=0ix(JqLgjLx1o(Yf`!OxJ)nj~v|W6fqb^85UUM&;<-q5%49_(SDK zTq27sG~Wc}3>s%+`&;|nv^;NdCN<^V z|CrQJICy#?>-EZHwY)jR%akg^$MPlyu|lPw2a^F zS)OSJy(Ss;AecoiBfWs>kdrH;;8g$sA3+07OvG|{snTa7Vksa(P4oZE&h0hjrL)!QsH*QN#>-1~tni zLu8!gbc*=az>7fM9+weqHa@+Aswp5B1z-=v-J(X(ef%T_B*34b!aT8qg7e}?^(

vXDuxxXfkR56`@4uU9YwRTjBqdgu*XA;`G~Mr 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

Lsh%^efip0X8KyldqE* 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

~(w|)Xs`K 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 literal 0 HcmV?d00001 diff --git a/latex/main.tex b/latex/main.tex new file mode 100644 index 0000000..65a5199 --- /dev/null +++ b/latex/main.tex @@ -0,0 +1,122 @@ +\documentclass[10pt,a4paper]{report} +\usepackage{geometry} +%\usepackage[utf8]{inputenc} % Apprently not useful with LuaLaTeX +\usepackage[T1]{fontenc} +\usepackage[british]{babel} +\usepackage{amsmath} % mathematical symbols +\usepackage{amsfonts} % mathematical symbols +\usepackage{amssymb} % mathematical symbols +\usepackage{graphicx} % figures +\usepackage{array} % for new column type +\usepackage{tabu} % for custom line width in tables +\usepackage{longtable} % multi-page tables +\usepackage[table,xcdraw]{xcolor} +\usepackage{fancyhdr} % headers and footers +\usepackage{lastpage} % total page count +\usepackage{float} +\usepackage{multirow} +\usepackage[bottom]{footmisc} % footnotes at the bottom of the page +\usepackage{subcaption} % subfigures +\usepackage{verbatim} % comment environment +\usepackage[backend=bibtex]{biblatex} +%\usepackage{bbding} % checkmark +\usepackage{pifont} % checkmark and cross +%\usepackage{nicematrix} % to fix colorcell overalpping borders +\usepackage{hhline} % partial hline for long division +\usepackage{minted} % python code highlight +\usepackage[minted,breakable]{tcolorbox} % minted title +\usepackage{csquotes} % localized quotes +\usepackage{caption} % caption for side by side fig and tab + +\bibliography{db.bib} + +%THIS NEEDS TO BE LOADED AFTER `longtable` TO PREVENT CONFLICTS +\usepackage{arydshln} % dashed lines in tables + +\usepackage{fontspec} % custom font +\setmainfont{Ubuntu-R}[ + BoldFont = Ubuntu-B, + ItalicFont = Ubuntu-RI, + BoldItalicFont = Ubuntu-BI +] +\setmonofont{UbuntuMono-R}[ + BoldFont = UbuntuMono-B, + ItalicFont = UbuntuMono-RI, + BoldItalicFont = UbuntuMono-BI +] + +\usepackage{hyperref} % links +\hypersetup{ + pdftitle={Barcodes and QR-Codes}, + pdfauthor={Louis Heredero}, + colorlinks=true, + linkcolor=black, + citecolor=black, + filecolor=black, + urlcolor=blue +} + +\pagestyle{fancy} +\setlength{\headheight}{15pt} + +\renewcommand{\headrulewidth}{1pt} +\fancyhead[L]{\leftmark} +\fancyhead[C]{} +\fancyhead[R]{\rightmark} + +\renewcommand{\footrulewidth}{1pt} +\fancyfoot[L]{Louis Heredero 5D} +\fancyfoot[C]{\thepage/\pageref{LastPage}} +\fancyfoot[R]{September 2022} + +% Black cell for representing barcodes in tables +\newcommand*{\bbar}{\cellcolor{black}} +\newcolumntype{C}[1]{>{\centering\arraybackslash}p{#1}} + +% Rotate table header +\newcommand{\rot}[1]{\hspace{5pt}\rotatebox{90}{#1\hspace{10pt}}\hspace{5pt}} + +% Long division vertical bar +\newcommand{\divline}[1]{\multicolumn{1}{|r}{#1}} + +% Hamming structure tick +\definecolor{tickbg}{HTML}{DDFFDD} +\definecolor{tickfg}{HTML}{005E00} +\definecolor{paritybg}{HTML}{90FF90} +\definecolor{tabgrey}{HTML}{EAECF0} +\definecolor{crossbg}{HTML}{FFDDDD} +\definecolor{crossfg}{HTML}{5E0000} +\newcommand{\cmark}{\ding{51}} +\newcommand{\xmark}{\ding{55}} +\newcommand{\tick}{\cellcolor{tickbg}\textcolor{tickfg}{\cmark}} +\newcommand{\cross}{\cellcolor{crossbg}\textcolor{crossfg}{\xmark}} + +\newcommand{\ul}[1]{\underline{#1}} + +\newcommand*{\hreffn}[2]{\href{#1}{#2}\footnote{#1}} + +\begin{document} + \parindent=0cm + \parskip=0.5em + \include{title_toc} + \parskip=1em + \include{introduction} + + \include{barcode_origin} + \include{barcode_functioning} + \include{barcode_python} + + \include{qr_origin} + \include{qr_functioning} + \include{qr_python} + + \include{error_correction} + + \include{custom_code} + + \include{conclusion} + \include{review} + + \include{bibliography} + \include{appendix} +\end{document} diff --git a/latex/other_2d.tex b/latex/other_2d.tex new file mode 100644 index 0000000..9815c73 --- /dev/null +++ b/latex/other_2d.tex @@ -0,0 +1,4 @@ +\chapter{Other 2D codes} +\label{chap:other_2d} + +\emph{short chapter about other 2D codes such as Aztec Code, Data Matrix, PDF417} diff --git a/latex/qr_functioning.tex b/latex/qr_functioning.tex new file mode 100644 index 0000000..6d4447f --- /dev/null +++ b/latex/qr_functioning.tex @@ -0,0 +1,612 @@ +\section{How it works} +\label{sec:qr_functioning} + +Graphically, QR-Codes are composed of black and white squares called "modules". Each module represents a binary bit, black meaning 1, white meaning 0. + +Similarly to \autoref{sec:barcode_functioning}, we will only describe the encoding phase. + +To make the following explanations easier to follow, we will use a concrete value. + +Let's encode the string "Hello, World!" with level "M" of error correction. + +\subsection{Data type} +\label{ssec:qr_data_type} + +The first step is to choose the appropriate data type for encoding. In our case, we can't use the numerical format since there are letters, nor can we use the alphanumerical, because of the exclamation mark and lowercase letters. Thus, the most suitable encoding is the byte format. + +Note that these different formats exist to optimize encoding to take the least possible space, so it is recommended to choose the minimum required format to avoid unecessarily big QR-Codes. + +The first 4 bits of data in our code will be the format used. Numerical is 1, alphanumerical is 2, byte is 4 and kanji is 8. In our case, the format indicator will be "0100". + +\subsection{Version} +\label{ssec:qr_version} + +QR-Codes come in a number of sizes, called "versions". Version 1 (the smallest) is a 21x21 grid, version 2 a 25x25, version 3 29x29, and so on, up to version 40 (the largest) which is a 157x157 matrix. + +To know which size our code will be, we have to refer to table \ref{tab:qr_versions} indicating which version is needed for a certain amount of data. + +Our string contains 13 characters, that is 13 bytes (in ISO-8859-1) and will be encoded using the byte format with level "M" of error correction. Thus the final code will be of version 1. + +\subsection{Character count indicator} +\label{ssec:qr_char_count_ind} + +Before encoding our data, we need to create a header stating the total character count. For that, the length is converted to its binary representation of $n$ bits, where $n$ depends on the version and encoding mode, as shown in table \ref{tab:qr_char_count_len}. + +\def\arraystretch{1.5} +\begin{table}[H] + \centering + \begin{tabu}{|[1pt]c|c:c:c:c|[1pt]} + \tabucline[1pt]{-} + Version & Num. & Alpha. & Byte & Kanji\\ + \tabucline[1pt]{-} + 1 to 9 & 10 & 9 & 8 & 8 \\ + \hline + 10 to 26 & 12 & 11 & 16 & 10 \\ + \hline + 27 to 40 & 14 & 13 & 16 & 12 \\ + \tabucline[1pt]{-} + \end{tabu} + \caption{Bit length of character count indicator} + \label{tab:qr_char_count_len} +\end{table} +\def\arraystretch{1} + +In our example, the number of characters is 13, which means the character count indicator is "00001101". + +\subsection{Data encoding} +\label{ssec:qr_encoding} + +The following step is to convert the data to binary. The method used differs for each format. + +\subsubsection{Numerical} +\label{sssec:qr_encoding_num} + +\begin{enumerate} + \item Split the number into 3-digit groups + \item For each group, convert the number to binary, padded to: + \begin{itemize} + \item 10 bits if there are 3 digits (most groups) + \item 7 bits if there are 2 digits (only sometimes for the last group) + \item 4 bits if there is only one digit (only sometimes for the last group) + \end{itemize} + \item Join the resulting bits end to end +\end{enumerate} + +\subsubsection{Alphanumerical} +\label{sssec:qr_encoding_alpha} + +\begin{enumerate} + \item Split the string into 2-character groups + \item For each group: + \begin{enumerate} + \item Take the first character's index in list \ref{tab:qr_alphanum} and multiply it by 45 + \item Take the second character's index in list \ref{tab:qr_alphanum} + \item Add them together and convert the result to an 11-bit number + \end{enumerate} + \item If the string has an odd number of characters, take the index of the last character and convert it to a 6-bit number +\end{enumerate} + +\subsubsection{Byte} +\label{sssec:qr_encoding_byte} + +\begin{enumerate} + \item Encode the data in ISO-8859-1 (latin-1) + \item Join the 8-bit binary representation of each character end to end +\end{enumerate} + +\subsubsection{Kanji} +\label{sssec:qr_encoding_kanji} + +\begin{enumerate} + \item Encode the data in JIS X 0208 (each character is encoded on 2 bytes) + \item For each character (= pair of bytes): + \begin{enumerate} + \item If the value is between 0x8140 and 0x9FFC, subtract 0x8140 \\ + Otherwise, if the value is between 0xE040 and 0xEBBF, subtract 0xC140 + \item Multiply the most significant byte by 0xC0 + \item Add the most significant byte to the least significant + \item Join the 13-bit binary representation of each sum end to end + \end{enumerate} +\end{enumerate} + +\subsubsection{Example} +\label{sssec:qr_encoding_ex} + +For our example, following the byte encoding format, we get: + +\def\arraystretch{1.2} +\begin{center} + \begin{tabu}{|c|c|c|c|c|} + \hline + \textbf{01000000} & \textbf{1101}0100 & 10000110 & 01010110 & 11000110 \\ + \hline + 11000110 & 11110010 & 11000010 & 00000101 & 01110110 \\ + \hline + 11110111 & 00100110 & 11000110 & 01000010 & 0001 \\ + \hline + \end{tabu} +\end{center} +\def\arraystretch{1} + +Note that the format and character count indicator have been added at the begginning (bolded bits). + +The resulting binary string needs to be padded before continuing to the next step. This is done in a fourfold process: +\begin{enumerate} + \item Get the total number of bits in the final code by multiplying column "Data codewords" of table \ref{tab:qr_error_correction} by eight\footnote{A codeword is equivalent to an 8-bit byte}. Let that be $B$ and let $b$ be the number of data bits we already have + \item Add $B-b$ 0s, but at most 4 + \item Add 0s so that $b$ is a multiple of 8, if not already + \item If $b < B$, fill the remaining bits with the alternating bytes "\texttt{11101100}" and "\texttt{00010001}" +\end{enumerate} + +In our example, we already have 116 data bits on 128 as per table \ref{tab:qr_error_correction} (version 1, level M). Thus we add four 0s, increasing $b$ to 120. We don't need to add other 0s since it is already a multiple of 8. Finally we fill the remaining 8 bits with the alternating padding bytes. The result is: + +\def\arraystretch{1.2} +\begin{center} + \begin{tabu}{|c|c|c|c|c|} + \hline + 01000000 & 11010100 & 10000110 & 01010110 & 11000110 \\ + \hline + 11000110 & 11110010 & 11000010 & 00000101 & 01110110 \\ + \hline + 11110111 & 00100110 & 11000110 & 01000010 & 00010000 \\ + \hline + 11101100 & & & & \\ + \hline + \end{tabu} +\end{center} +\def\arraystretch{1} + +\subsection{Error correction} +\label{ssec:qr_error_corection} + +Now that we have encoded our data, we need to create additional error correction codewords. QR-Codes use what is called the Reed-Solomon algorithm to detect and correct potential errors in a scanned code. This algorithm is explained in more details in \autoref{sec:reed_solomon}. + +According to table \ref{tab:qr_error_correction}, we need a certain number of error correction codewords (column "Error correction codewords per block"). Let this number be n. + +For that, we create a generator polynomial: \[ + \prod_{i = 0}^{n-1} (x + 2^i) +\] +Note that the calculation are done in a Galois field, as explained in \autoref{sec:reed_solomon}. + +Encoded data now needs to be split in B1 blocks (see table \ref{tab:qr_error_correction}, column "Blocks in group 1"). Each block contains C1 data codewords (see table \ref{tab:qr_error_correction}, column "Data codewords per group 1 blocks"). + +For each block: +\begin{enumerate} + \item Convert each codeword to its decimal value (in the Galois field) and let that be the coefficients of a "message" polynomial. + \item Divide this polynomial by the generator polynomial created earlier. + \item Convert the coefficients of the remainder to their 8-bit binary representation and let these be the error correction codewords for this block. +\end{enumerate} + +If group 2 has a non-null amount of data codewords, do the same steps for column "Blocks in group 2" (B2) and "Data codewords per group 2 blocks" (C2). + +For our example, n = 10, B1 = 1, C1 = 16, B2 = 0, C2 = 0. +The generator polynomial has the coefficients: \[ + 1, 216, 194, 159, 111, 199, 94, 95, 113, 157, 193 +\] + +We only have one block with 16 codewords, so our "message" polynomial will have the coefficients: \[ + 64, 212, 134, 86, 198, 198, 242, 194, 5, 118, 247, 38, 198, 66, 16, 236 +\] + +Dividing it by the generator polynomial, we get a remainder with the coefficients: \[ + 215, 92, 247, 55, 155, 152, 59, 246, 87, 124 +\] + +that we convert to binary bytes, giving us: +\def\arraystretch{1.2} +\begin{center} + \begin{tabu}{|c|c|c|c|c|} + \hline + 11010111 & 01011100 & 11110111 & 00110111 & 10011011 \\ + \hline + 10011000 & 00111011 & 11110110 & 01010111 & 01111100 \\ + \hline + \end{tabu} +\end{center} +\def\arraystretch{1} + +\subsection{Interleaving} +\label{ssec:qr_interleaving} + +Now that we have computed the error correction codewords, we need to arrange them in a certain manner with the data codewords. The codewords go in the following order: + +%TODO: improve this table +\def\arraystretch{1.2} +\begin{center} + \begin{tabu}{|[2pt]c|c|c|c|c||c|c|c|c|[2pt]} + \tabucline[2pt]{-} + Data & \rot{Codeword 1} & \rot{Codeword 2} & \rot{Codeword 3} & \rot{Codeword 4} & \shortstack[c]{Error \\ correction} & \rot{Codeword 1} & \rot{Codeword 2} & \rot{Codeword 3}\\ + \hline + Block 1 & 1 & 5 & 9 & x & Block 1 & 15 & 19 & 23 \\ + \hline + Block 2 & 2 & 6 & 10 & x & Block 2 & 16 & 20 & 24 \\ + \hline + Block 3 & 3 & 7 & 11 & 13 & Block 3 & 17 & 21 & 25 \\ + \hline + Block 4 & 4 & 8 & 12 & 14 & Block 4 & 18 & 22 & 26 \\ + %\hline + %... & ... & ... & ... & ... & ... & ... & ... & ... \\ + \tabucline[2pt]{-} + \end{tabu} +\end{center} +\def\arraystretch{1} + +In this example, B1 = 2, C1 = 3, B2 = 2, C2 = 4. + +In our case, since we only have 1 data block, the error correction codewords are simply appended after the data codewords. + +Similarly to step \ref{ssec:qr_encoding} (\nameref{ssec:qr_encoding}), we need to pad the end result with a certain number of 0s before continuing. This number is given by the following table: + +\def\arraystretch{1.2} +\begin{center} + \begin{tabu}{|[2pt]c|c|[2pt]} + \tabucline[2pt]{-} + Version & Number of 0s to add\\ + \hline + 2 to 6 & 7 \\ + \hline + 14 to 20 & 3 \\ + \hline + 21 to 27 & 4 \\ + \hline + 28 to 34 & 3 \\ + \tabucline[2pt]{-} + \end{tabu} +\end{center} +\def\arraystretch{1} + +Our example code is a version 1 so we don't need to add any 0. + +\subsection{Separators and finder patterns} +\label{ssec:qr_sep_finder} + +Data has been encoded and now starts the placement phase, that is the creation of the black and white matrix. + +First of all, the matrix' size (in number of modules) is given by the following formula: \[ + (V-1)*4 + 21 +\] +where $V$ is the version. + +The ISO standard\cite{ISO18004} also states that a 4-module wide margin (silence zone) must be respected all around the code. This allows scanners to easily identify and locate a QR-Code in an image. + +The distinctive elements of QR-Codes are of course their three large corner squares. These are called "finder patterns" and are used by the reading device to find the code and correct the perspective. They also provide information on the rotation of the image and the width of individual modules. Finder patterns are 7x7 black squares, containing a 5x5 white square, encircling itself a 3x3 black square. They are put in the top-left, top-right and bottom-left corners of the matrix. + +Additionally, they are separated from the rest of the code by a 1-module thick white line called a separator. + +For our version 1 QR-Code, this steps yields the following 21x21 matrix: + +\begin{figure}[H] + \centering + \includegraphics[width=0.4\textwidth]{images/qr_sep_finder} + \caption{QR-Code example: separators and finder patterns} + \label{fig:qr_sep_finder} +\end{figure} + +\subsection{Alignment patterns} +\label{ssec:qr_alignment} + +The next element to add are the alignment patterns. These are similar to finder patterns but are only 5x5. They are spread across the whole code and provide reference points for the scannnig device to improve reliability. The larger the code, the more alignment patterns are needed. Their positions depend on the version and are referenced in table \ref{tab:qr_alignment}. This table lists all possible x and y coordinates for the patterns. This means that for version 2, the alignment patterns are located at (6,6), (6,18), (18,6) and (18,18). A pattern will only be present if the area it covers is still empty (i.e. it doesn't overlap with the separators and finder patterns). + +Since our example is a version 1 QR-Code, no alignment pattern is needed (see figure \ref{fig:qr_reserved} for version 10 code with alignment patterns). + +\subsection{Timing pattern} +\label{ssec:qr_timing} + +An additional element helping the scanner and improving readability is the timing pattern. It consists of a alternating black and white stripe joining the bottom-left and top-left finder pattern, and the top-left and top-right. + +The pattern is aligned to the right and bottom borders of the top-left finder patterns, starting with white on the separators. + +\begin{figure}[H] + \centering + \includegraphics[width=0.4\textwidth]{images/qr_timing} + \caption{QR-Code example: timing patterns} + \label{fig:qr_timing} +\end{figure} + +\subsection{Reserved area} +\label{ssec:qr_reserved} + +Some areas of the matrix are also reserved for format information which will be added later. This corresponds to the modules around the top-left finder pattern, the modules on the right of the bottom-left pattern and those just below the top-right one. + +Additionally, for versions greater than 6, a 3x6 zone on the left of the top-right finder pattern plus a 6x3 above the bottom-left one are reserved for version information. + +Figure \ref{fig:qr_reserved} shows an example of these reserved areas (in light gray) for a version 10 QR-Code (left) and for our example (right). + +\begin{figure}[H] + \centering + \raisebox{-0.5\height}{\includegraphics[width=0.5\textwidth]{images/qr_reserved_example}} + \raisebox{-0.5\height}{\includegraphics[width=0.4\textwidth]{images/qr_reserved}} + \caption{QR-Code example: reserved areas} + \label{fig:qr_reserved} +\end{figure} + +A black module is also set next to the bottom-left finder pattern, on the right of its top-right corner. Its coordinates are the following: +\begin{math} + \begin{cases} + x = 8 \\ + y = 4V + 9 + \end{cases} +\end{math} +where $V$ is the version. + +\subsection{Data placement} +\label{ssec:qr_placement} + +The matrix is now ready to receive the data bit string. The placement is done in zigzags, starting from the bottom-right, going up. Each byte is placed in a 2 modules wide region in a staggered manner. When a pattern, separator or reserved area is encountered, the position is skipped and the process continues further. + +Figures \ref{fig:qr_plcmt_byte_up} and \ref{fig:qr_plcmt_byte_down} represent the way a byte is layed out when going up or down. + +Figures \ref{fig:qr_plcmt_reserved} and \ref{fig:qr_plcmt_turning} show how skipping and turning are processed. + +When encountering the vertical timing pattern, that column is entirely skipped and the placement continues on the next one. For each byte, the bits are layed from Most Significant bit (MSB) to Least Significant Bit (LSB). + +\begin{figure}[H] + \centering + \begin{subfigure}{0.3\textwidth} + \centering + \includegraphics[width=0.5\textwidth]{images/qr_plcmt_byte_up} + \caption{Going up} + \label{fig:qr_plcmt_byte_up} + \end{subfigure} + \begin{subfigure}{0.3\textwidth} + \centering + \includegraphics[width=0.5\textwidth]{images/qr_plcmt_byte_down} + \caption{Going down} + \label{fig:qr_plcmt_byte_down} + \end{subfigure} + \begin{subfigure}{0.3\textwidth} + \centering + \includegraphics[width=0.5\textwidth]{images/qr_plcmt_reserved} + \caption{Skipping reserved areas} + \label{fig:qr_plcmt_reserved} + \end{subfigure} + \begin{subfigure}{0.3\textwidth} + \centering + \includegraphics[width=0.7\textwidth]{images/qr_plcmt_turning} + \caption{Turning at border} + \label{fig:qr_plcmt_turning} + \end{subfigure} + \caption{QR-Code byte placement} + \label{fig:qr_plcmt_byte} +\end{figure} + +\begin{comment} +\begin{figure}[H] + \centering + \begin{subfigure}{0.3\textwidth} + \centering + \includegraphics[width=0.3\textwidth]{images/qr_plcmt_reserved} + \caption{Skipping reserved areas} + \label{fig:qr_plcmt_reserved} + \end{subfigure} + \begin{subfigure}{0.6\textwidth} + \centering + \includegraphics[width=0.5\textwidth]{images/qr_plcmt_turning} + \caption{Turning at border} + \label{fig:qr_plcmt_turning} + \end{subfigure} + \caption{QR-Code byte placement} + \label{fig:qr_plcmt_byte_special} +\end{figure} +\end{comment} + +If the available space if not fully filled after placing the data, the rest is filled with 0s\footnote{it shall be recalled that 0 means white and 1 means black}. + +Our example QR-Code, once filled with data, looks like this: + +\begin{figure}[H] + \centering + \includegraphics[width=0.4\textwidth]{images/qr_plcmt} + \caption{QR-Code example: data placement} + \label{fig:qr_plcmt} +\end{figure} + +\subsection{Masking} +\label{ssec:qr_masking} + +For optimal readability, it is important that certain patterns of modules don't appear inside the code. For example, there shouldn't be any shape resembling the finder or alignment patterns (i.e. modules with the ratio 1:1:3:1:1). Furthermore, a balanced amount of black compared to white is preferred for better decoding. + +For this purpose, we need to apply a mask on the code, switching white for black modules and vice versa where it applies. QR-Codes have 8 different masks which can be used. Obviously, these are only applicable on the data area and should not modify the timing, finder and alignment patterns. + +To choose one, we will apply them one after the other on our current QR-Code, and evaluate the resulting code, giving it a penalty score for each undesired feature. Then, the mask with the lowest score will be chosen. + +Figure \ref{fig:qr_masks} lists the different possible masks. +A black mask module means that the corresponding data module needs to be inverted. +The operator "//" is integer division. + +\begin{figure}[H] + \centering + \begin{subfigure}{0.4\textwidth} + \centering + \includegraphics[width=0.4\textwidth]{images/qr_mask_0} + \caption{(x+y) mod 2 = 0} + \label{fig:qr_mask_0} + \end{subfigure} + \begin{subfigure}{0.4\textwidth} + \centering + \includegraphics[width=0.4\textwidth]{images/qr_mask_1} + \caption{y mod 2 = 0} + \label{fig:qr_mask_1} + \end{subfigure} + \begin{subfigure}{0.4\textwidth} + \centering + \includegraphics[width=0.4\textwidth]{images/qr_mask_2} + \caption{(x) mod 3 = 0} + \label{fig:qr_mask_2} + \end{subfigure} + \begin{subfigure}{0.4\textwidth} + \centering + \includegraphics[width=0.4\textwidth]{images/qr_mask_3} + \caption{(x+y) mod 3 = 0} + \label{fig:qr_mask_3} + \end{subfigure} + \begin{subfigure}{0.4\textwidth} + \centering + \includegraphics[width=0.4\textwidth]{images/qr_mask_4} + \caption{(y//2+x//3) mod 2 = 0} + \label{fig:qr_mask_4} + \end{subfigure} + \begin{subfigure}{0.4\textwidth} + \centering + \includegraphics[width=0.4\textwidth]{images/qr_mask_5} + \caption{((x*y) mod 2 + (x*y) mod 3) = 0} + \label{fig:qr_mask_5} + \end{subfigure} + \begin{subfigure}{0.4\textwidth} + \centering + \includegraphics[width=0.4\textwidth]{images/qr_mask_6} + \caption{((x*y) mod 2 + (x*y) mod 3) mod 2 = 0} + \label{fig:qr_mask_6} + \end{subfigure} + \begin{subfigure}{0.4\textwidth} + \centering + \includegraphics[width=0.4\textwidth]{images/qr_mask_7} + \caption{((x+y) mod 2 + (x*y) mod 3) mod 2 = 0} + \label{fig:qr_mask_7} + \end{subfigure} + \caption{QR-Code masks} + \label{fig:qr_masks} +\end{figure} + + +\subsubsection{Evaluation} +\label{sssec:qr_mask_eval} + +Evaluation of a mask is done thanks to 4 criteria. + +They evaluate whether the code is easy to read or not. For example, criterion 3 gives a high penalty for every pattern with the same proportions as finder patterns to avoid confusion for the reading device. + +Before applying a mask for evaluation, format and version information have do be added on the code, as described in sections \ref{ssec:qr_fmt_info} and \ref{ssec:qr_ver_info}. + +\begin{enumerate} + \item 5+ consecutive modules of the same color: + + If a line or column of 5 or more modules of the same color is found in the code, a penalty score is added. For a strip of $5 + i$ same colored modules, the penalty is worth $3 + i$ points. + + \item 2x2 blocks: + + Each 2x2 block of similar modules adds 3 points to the penalty score. Overlapping blocks are taken into account. + + \item 1:1:3:1:1:4 patterns: + + For each pattern with the ratios 1:1:3:1:1:4 or 4:1:1:3:1:1, a penalty of 40 points is given. This criterion takes into account the 4-module wide margins all around the code\footnote{see \autoref{ssec:qr_sep_finder}}. This means there are at least 18 correspondances in every code. + + \item Proportion of black and white modules: + + A penalty is attributed according to the deviation from a 50/50 distribution in black and white modules across the whole QR-Code. The calculation method is the following: + \[ P = \lfloor 100 * B / (W*H) \rfloor \] + \[ P_1 = P - P \textrm{ mod } 5 \] + \[ P_2 = P_1 + 5 \] + \[ S = \textrm{min}\left(\frac{|P_1 - 50|}{5}, \frac{|P_2 - 50|}{5}\right) * 10 \] +\end{enumerate} + +where $B$ is the total number of black modules, $W$ and $H$ are the width and height of the QR-Code, and $S$ is the penalty score given for this criterion. + +Applying this to our QR-Code, we can determine that the best mask is mask \ref{fig:qr_mask_5} with a score of 442. Figures \ref{fig:qr_mask_ex_eval_1} to \ref{fig:qr_mask_ex_eval_4} detail the penalties for each criterion. + +\begin{figure}[H] + \centering + \begin{subfigure}{0.45\textwidth} + \centering + \includegraphics[width=\textwidth]{images/qr_mask_ex_eval_1} + \caption{QR-Code example: mask evaluation (1)} + \label{fig:qr_mask_ex_eval_1} + \end{subfigure} + \begin{subfigure}{0.45\textwidth} + \centering + \includegraphics[width=\textwidth]{images/qr_mask_ex_eval_2} + \caption{QR-Code example: mask evaluation (2)} + \label{fig:qr_mask_ex_eval_2} + \end{subfigure} + \begin{subfigure}{0.45\textwidth} + \centering + \includegraphics[width=\textwidth]{images/qr_mask_ex_eval_3} + \caption{QR-Code example: mask evaluation (3)} + \label{fig:qr_mask_ex_eval_3} + \end{subfigure} + \begin{subfigure}{0.45\textwidth} + \centering + \includegraphics[width=\textwidth]{images/qr_mask_ex_eval_4} + \caption{QR-Code example: mask evaluation (4)} + \label{fig:qr_mask_ex_eval_4} + \end{subfigure} + \caption{QR-Code example: mask evaluation} + \label{fig:qr_mask_ex_eval} +\end{figure} + +\subsection{Format information} +\label{ssec:qr_fmt_info} + +The last step to complete a fully functional QR-Code is to add the format information, and version information for versions bigger than 6. + +First we need to create a format string containing the level of error correction and the mask used. The correction level is encoded on 2 bits as follows: + +\begin{table}[H] + \centering + \begin{tabu}{|c|c|} + \hline + Level & Value (bin) \\ + \hline + L & 01 \\ + \hline + M & 00 \\ + \hline + Q & 11 \\ + \hline + H & 10 \\ + \hline + \end{tabu} + \caption{QR-Code error correction level indicator} + \label{tab:qr_ec_ind} +\end{table} + +Then the mask id is converted to a 3-bit binary number and appended to the error correction level indicator. + +The string is padded by an additional 10 0s to make it 15 bits long. + +Similarly to what has been done with data previously, the format string is complemented with error correction bits, this time using Bose-Chaudhuri-Hocquenghem (BCH) codes. +The principle is similar to the Reed-Solomon algorithm in that a message polynomial is divided by a generator polynomial. To create the message polynomial, each bit of the format string represents the coefficient of a term. The same applies for the generator polynomial, which is always derived from the binary number \texttt{10100110111}. +The generator polynomial is thus \[ + x^{10} + x^8 + x^5 + x^4 + x^2 + x + 1 +\] + +The division's remainder is then padded on the left with 0s to make it 10 bits long. + +The final bit string is constructed by concatenating the format string with the error correction bits, and XORing\footnote{With the binary XOR operator} the result with the mask string \texttt{101010000010010}. This mask ensures the final format string is not made of only 0s. + +Once calculated, the bit string is layed out in the reserved strips around the finder patterns, as shown in figure \ref{fig:qr_fmt_layout} (0 being the LSB and 14 the MSB) + +\begin{figure}[H] + \centering + \includegraphics[width=0.4\textwidth]{images/qr_fmt_layout} + \caption{QR-Code format information string layout} + \label{fig:qr_fmt_layout} +\end{figure} + +It is to be noted that format information appears twice, since its decoding is essential for reading the whole code. + +In our case, the error correction indicator for level M is 00 and we used the mask with id 2, so our format string is \texttt{000100000000000}. Dividing it by the generator polynomial yields the remainder \texttt{1001101110}. + +Adding it to the format string and XORing it with the mask string, we get \texttt{101111001111100}. + +These bits are then put in the reserved areas of the matrix, making figure \ref{fig:qr_fmt_info} + +\begin{figure}[H] + \centering + \includegraphics[width=0.4\textwidth]{images/qr_fmt_info} + \caption{QR-Code example: format information} + \label{fig:qr_fmt_info} +\end{figure} + +Our QR-Code is now fully finished and can be scanned. + +\subsection{Version information} +\label{ssec:qr_ver_info} + +For QR-Codes of version 7 and bigger, additional data is added to state the code's version. + +To generate the version string, first convert the version to its 6 bit binary representation. Then append the remainder of the division by the generator polynomial \[ + x^{12} + x^{11} + x^{10} + x^9 + x^8 + x^5 + x^2 + 1 +\] padded on the left to 12 bits, following the same methods as for format information. + +This string is then put in the two reserved 6x3 and 3x6 rectangles. The LSB is placed in the top-left corner of the rectangles. For the top-right area, the string goes down, then to the right. For the bottom-left rectangle, the string goes to the right, then down. diff --git a/latex/qr_origin.tex b/latex/qr_origin.tex new file mode 100644 index 0000000..ced3843 --- /dev/null +++ b/latex/qr_origin.tex @@ -0,0 +1,72 @@ +\chapter{QR-Codes} +\label{chap:qr_origin} + +\section{Origin} +\label{sec:qr_origin} + +Eventhough barcodes have conquered the world, they still have some major issues. +First of all, their capacity is rather limited, allowing only a maximum of about twenty characters to be encoded in a practical format. +Secondly, they can only store a small group of characters, some even only numbers. +And finally, they require the reading device to be in a roughly parallel orientation with respect to the code in order to read it. + +For these reasons, the Japanese company named DENSO WAVE started developing a new type of 2D code. +Indeed, a barcode is one-dimensional - that is, the information is encoded on a single axis. +What DENSO WAVE tried was a two-dimensional matrix of data. + +The result of their research and development became the well-known "QR-Code", which stands for Quick-Response code. They were first used in Toyota factories to track car parts\cite{qrcode_history}. +With the desire to offer this technology to the largest number of people, the company decided not to keep it private but rather make it open-source. +It later became a norm in many countries and is now specified by the ISO/IEC~18004 standard \cite{ISO18004}. + +QR-Codes address all the above-mentioned problems related to barcodes. + +\subsection*{Data type} + +They allow the encoding of either numbers, text, raw binary data and even Kanji characters\footnote{Kanji are the characters used to write Japanese}. Therefore they can be used in a great variety of contexts, for example to identify objects, to conviniently share a URL or even a small image. + +\subsection*{Information density} + +They allow dense information storage. + +\def\arraystretch{1.5} +\begin{table}[H] + \centering + \begin{tabu}{|[2pt]c|c|[2pt]} + \tabucline[2pt]{-} + Type & Number of "characters" \\ + \tabucline[2pt]{-} + Numerical & 7'089 \\ + \hline + Alphanumerical & 4'296 \\ + \hline + Bytes & 2'953 \\ + \hline + Kanji & 1'817 \\ + \tabucline[2pt]{-} + \end{tabu} + \caption{Maximum amount of data in a QR-Code \cite{ISO18004}} + \label{tab:qr_max_data} +\end{table} +\def\arraystretch{1} + +The alphanumerical type can only encode the following characters: +\begin{center} + \texttt{0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ \$\%*+-./:} +\end{center} + +\subsection*{Reading freedom} + +Thanks to finder patterns, they can be read in any orientation, even with perspective. Taking into account the great progress which happened during the last 30 years in the field of cameras and mobile phones, QR-Codes can now be scanned in a matter of milliseconds, no matter the angle of the camera. + +\subsection*{Error detection and correction} + +The other main advantage of QR-Codes is the embedded error detection and correction system. + +They come in four different levels of error correction: +\begin{itemize} + \item L (low): 7\% + \item M (medium): 15\% + \item Q (quartile): 25\% + \item H (high): 30\% +\end{itemize} + +A higher level indicates a greater amount of redundancy and an ability to recover a greater part of a damaged code. This principle is often used to add a custom icon at the center of the QR-Code, since the reader will still be able to scan it and reconstruct the hidden part. diff --git a/latex/qr_python.tex b/latex/qr_python.tex new file mode 100644 index 0000000..1b19afa --- /dev/null +++ b/latex/qr_python.tex @@ -0,0 +1,163 @@ +\section{Application in Python} +\label{sec:qr_python} + +In this section, we will look at my Python QR-Code generator implementation. +For the sake of brevity, only some specific parts of the program will be commented. + +\subsection{Python features} +\label{ssec:qr_py_features} + +The script takes advantage of several Python-specific features. + +\subsubsection{Dunder methods} +\label{sssec:qr_py_dunder} + +The most important is the "dunder methods", short for "double underscore methods". +These are special overridable methods used for builtin behaviors.\\ +For example, the \texttt{\_\_add\_\_}, \texttt{\_\_sub\_\_}, \texttt{\_\_mul\_\_}, \texttt{\_\_truediv\_\_} and \texttt{\_\_pow\_\_} methods respectively +define the behavior of the "+", "-", "*", "/" and "**" operators. + +This is particulary useful to create the Galois field's arithmetic used for QR-Codes. +For example, multiplication is defined by this method: + +\begin{minted}[frame=single]{python} +def __mul__(self, n): + if self.val == 0 or n.val == 0: + return GF(0) + + return GF.EXP[GF.LOG[self.val].val + GF.LOG[n.val].val].copy() +\end{minted} + +where \texttt{val} is the element's value and \texttt{GF.LOG} and \texttt{GF.EXP} are arrays containing the values of exponents and logarithms for the field (see \autoref{ssec:qr_py_precomp}). + +\subsubsection{Anonymous functions} +\label{sssec:qr_py_lambda} + +Anonymous, or lambda, functions are short unnamed functions. They are often used for very basic operations. In our case, they are utilized for masks. + +For example, the first mask is defined as \mintinline{python}{lambda x,y: (x+y)%2 == 0}, a function taking two arguments x and y and returning whether the coordinates should be masked or not. + +\subsection{Precomputed data} +\label{ssec:qr_py_precomp} + +Some values related to the creation of QR-Codes are precomputed, such as the capacities for each data type or the number of error correction codewords, as determining them is done through reverse engineering and no simple direct formula can be established. +These values are stored in text files (\texttt{error\_correction.txt} and \texttt{qr\_versions.txt}) and loaded into tables at the beginning of the scripts. + +Regarding Galois fields, all powers and logs are also calculated beforehand, for the sake of ease of use, using the following loops: + +\begin{minted}[frame=single]{python} +class GF: + def __init__(self, val): + self.val = val + ... + +GF.EXP = [GF(0)]*512 +GF.LOG = [GF(0)]*256 +value = 1 +for exponent in range(255): + GF.LOG[value] = GF(exponent) + GF.EXP[exponent] = GF(value) + value = ((value << 1) ^ 285) if value > 127 else value << 1 + +for i in range(255, 512): + GF.EXP[i] = GF.EXP[i-255].copy() +\end{minted} + +Credits for this method goes to \citetitle{rs_for_coders}\cite[Multiplication with logarithms]{rs_for_coders} + +\subsection{Data placement} +\label{ssec:qr_py_plcmt} + +One of the challenges to overcome was the data placement phase. To avoid lengthening this particular part, mathematical tricks are used. + +For visual aid, see figure \ref{fig:qr_plcmt_byte} in \autoref{ssec:qr_placement}. + +Before starting, the data bit string which will be placed is stored in a string variable named "\texttt{self.final\_data\_bits}". The position is set to the lower-right corner of the matrix. +The matrix (\texttt{self.matrix}) is a 2D array in which -1 indicates a free module. + +A variable named \texttt{dir\_} is also set to -1 and is responsible to keep track wether we are going up or down. A variable \texttt{i} initialized to 0 will hold the index of the current bit to be placed. The variable \texttt{zigzag} manages the zigzag pattern. + +\begin{minted}[linenos=true,frame=single]{python} +dir_ = -1 #-1 = up | 1 = down +x, y = size-1, size-1 +i = 0 +zigzag = 0 + +while x >= 0: + if self.matrix[y,x] == -1: + self.matrix[y,x] = self.final_data_bits[i] + i += 1 + + if ((dir_+1)/2 + zigzag)%2 == 0: + x -= 1 + + else: + y += dir_ + x += 1 + + if y == -1 or y == size: + dir_ = -dir_ + y += dir_ + x -= 2 + + else: + zigzag = 1-zigzag + + if x == 6: + x -= 1 +\end{minted} + +The algorithm runs until it reaches the left side (line 6). + +For each loop, if the module is free, the current bit is placed and \texttt{i} is incremented. + +If we are going up and \texttt{zigzag} equals 0, or if we are going down and zigzag equals 1, then we move to the left (line 11-12).\\ +Otherwise, we move forward in the current direction and one module to the right. + +If we reach the top or bottom side (current position is outside of the matrix), the direction is flipped, we come back one step and move to the left. + +Lines 26-27 make the placement entirely skip column 6, which is where the vertical timing pattern is located. + +Table \ref{tab:qr_py_plcmt} shows the evolution of the different variables during placement. + +\def\arraystretch{1.2} +\begin{table}[H] + \centering + \begin{tabu}{|[2pt]c|c|c|c|[2pt]} + \tabucline[2pt]{c} + x & y & dir\_ & zigzag \\ + \tabucline[2pt]{c} + 20 & 20 & -1 & 0 \\ + \hline + 19 & 20 & -1 & 1 \\ + \hline + 20 & 19 & -1 & 0 \\ + \hline + 19 & 19 & -1 & 1 \\ + \hline + 20 & 18 & -1 & 0 \\ + \hline + ... & ... & ... & ... \\ + \hline + 20 & 0 & -1 & 0 \\ + \hline + 19 & 0 & -1 & 1 \\ + \hline + 18 & 0 & 1 & 1 \\ + \hline + 17 & 0 & 1 & 0 \\ + \hline + 18 & 1 & 1 & 1 \\ + \tabucline[2pt]{c} + \end{tabu} + \caption{QR-Code data placement algorithm} + \label{tab:qr_py_plcmt} +\end{table} +\def\arraystretch{1} + +\subsection{Mask evaluation} +\label{ssec:qr_py_mask} + +Mask evaluation is quite straight-forward especially for criteria 1, 2 and 4 (see \autoref{sssec:qr_mask_eval}) + +Criterion n° 3 is a bit more complex. To keep track of the patterns encountered in each row (or column), a \texttt{History} object is used. This object holds a list of widths of the different color zones. diff --git a/latex/review.tex b/latex/review.tex new file mode 100644 index 0000000..77f82b9 --- /dev/null +++ b/latex/review.tex @@ -0,0 +1,13 @@ +\chapter{Personal review} +\label{chap:review} + +My interest for computers and programming has led me to choose this topic for my work and it is not a choice I regret. + +QR-Codes were a subject I personally wanted to understand for some time but never got round to it. Having the possibility to use my knowledge in Python to apply what I had researched was also very satisfying and self-rewarding. I hope I succeeded in trying to explain the inner workings and principles making these great inventions possible. I appreciated the great freedom both on the subject's choice and the realization. Apart from learning about barcodes and QR-Codes, I have also had the opportunity to put to use my English language skills. +Using \LaTeX\ helped practising problem solving as many things can be done in multiple ways and I needed to find the best or easiest method, especially regarding tables. + +The Python scripts also represent a great part of this work. While not perfect implementations, they offer a better understanding of the sometimes abstract concepts discussed and allow the generation steps to be visualized personally, using any value. + +Overall, I am pleased with the fruit of my research and understanding. My only regret would be that I have not yet been able to fully understand the intricacies of Reed-Solomon codes, but I hope that one day I will. + +Finally, I would like to thank Mr. Erspamer for his availability, his support and his insightful feedbacks. I must also credit my brother, who allowed me to obtain some documents such as the ISO standards\cite{ISO16388}\cite{ISO18004} and who helped with the printing of my work. diff --git a/latex/title_toc.tex b/latex/title_toc.tex new file mode 100644 index 0000000..2a09315 --- /dev/null +++ b/latex/title_toc.tex @@ -0,0 +1,33 @@ +\begin{titlepage} + \begin{center} + \Huge \textbf{Barcodes and QR-Codes} + + \large \textbf{Examples of error detection and correction} + + \vspace{1cm} + + \LARGE Louis Heredero + + \large 4D-5D + + \includegraphics[width=0.7\linewidth]{images/lycacode_ex_final} + + \Large Accompanying teacher: Daniel Erspamer + + \vspace{2cm} + + \LARGE Maturity work 2022-2023 + \vspace{1cm} + + \Large Lycée-Collège de l'Abbaye \\ 1890 St-Maurice + + \end{center} +\end{titlepage} + +\begin{abstract} + This work focuses on the creation of barcodes and QR-Codes. It describes and explains the different data encodings and algorithms which make such technologies possible. Following the introduction, the second part is about Code-39 and EAN barcodes, and the third about QR-Codes. Then, the fourth chapter presents in more details some methods for error detection and correction. The final section introduces a new custom type of code named Lycacode which relies upon some aspects seen in the previous three chapters. Additionally, many parts are implemented in Python like the generation of QR-Codes and barcodes for example. These can either be found in the appendices or in the associated \hreffn{https://github.com/LordBaryhobal/5D\_Heredero\_Louis\_TM2022/tree/main/python}{GitHub repository}. +\end{abstract} + +\tableofcontents +\listoffigures +\listoftables diff --git a/python/base.py b/python/base.py new file mode 100644 index 0000000..76517c7 --- /dev/null +++ b/python/base.py @@ -0,0 +1,55 @@ +#!/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) \ No newline at end of file diff --git a/python/code39.py b/python/code39.py new file mode 100644 index 0000000..3c1e481 --- /dev/null +++ b/python/code39.py @@ -0,0 +1,68 @@ +#!/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 = 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() \ No newline at end of file diff --git a/python/ean.py b/python/ean.py new file mode 100644 index 0000000..466d15b --- /dev/null +++ b/python/ean.py @@ -0,0 +1,116 @@ +#!/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() \ No newline at end of file diff --git a/python/error_correction.txt b/python/error_correction.txt new file mode 100644 index 0000000..9ae09c7 --- /dev/null +++ b/python/error_correction.txt @@ -0,0 +1,199 @@ +19 7 1 19 +16 10 1 16 +13 13 1 13 +9 17 1 9 + +34 10 1 34 +28 16 1 28 +22 22 1 22 +16 28 1 16 + +55 15 1 55 +44 26 1 44 +34 18 2 17 +26 22 2 13 + +80 20 1 80 +64 18 2 32 +48 26 2 24 +36 16 4 9 + +108 26 1 108 +86 24 2 43 +62 18 2 15 2 16 +46 22 2 11 2 12 + +136 18 2 68 +108 16 4 27 +76 24 4 19 +60 28 4 15 + +156 20 2 78 +124 18 4 31 +88 18 2 14 4 15 +66 26 4 13 1 14 + +194 24 2 97 +154 22 2 38 2 39 +110 22 4 18 2 19 +86 26 4 14 2 15 + +232 30 2 116 +182 22 3 36 2 37 +132 20 4 16 4 17 +100 24 4 12 4 13 + +274 18 2 68 2 69 +216 26 4 43 1 44 +154 24 6 19 2 20 +122 28 6 15 2 16 + +324 20 4 81 +254 30 1 50 4 51 +180 28 4 22 4 23 +140 24 3 12 8 13 + +370 24 2 92 2 93 +290 22 6 36 2 37 +206 26 4 20 6 21 +158 28 7 14 4 15 + +428 26 4 107 +334 22 8 37 1 38 +244 24 8 20 4 21 +180 22 12 11 4 12 + +461 30 3 115 1 116 +365 24 4 40 5 41 +261 20 11 16 5 17 +197 24 11 12 5 13 + +523 22 5 87 1 88 +415 24 5 41 5 42 +295 30 5 24 7 25 +223 24 11 12 7 13 + +589 24 5 98 1 99 +453 28 7 45 3 46 +325 24 15 19 2 20 +253 30 3 15 13 16 + +647 28 1 107 5 108 +507 28 10 46 1 47 +367 28 1 22 15 23 +283 28 2 14 17 15 + +721 30 5 120 1 121 +563 26 9 43 4 44 +397 28 17 22 1 23 +313 28 2 14 19 15 + +795 28 3 113 4 114 +627 26 3 44 11 45 +445 26 17 21 4 22 +341 26 9 13 16 14 + +861 28 3 107 5 108 +669 26 3 41 13 42 +485 30 15 24 5 25 +385 28 15 15 10 16 + +932 28 4 116 4 117 +714 26 17 42 +512 28 17 22 6 23 +406 30 19 16 6 17 + +1006 28 2 111 7 112 +782 28 17 46 +568 30 7 24 16 25 +442 24 34 13 + +1094 30 4 121 5 122 +860 28 4 47 14 48 +614 30 11 24 14 25 +464 30 16 15 14 16 + +1174 30 6 117 4 118 +914 28 6 45 14 46 +664 30 11 24 16 25 +514 30 30 16 2 17 + +1276 26 8 106 4 107 +1000 28 8 47 13 48 +718 30 7 24 22 25 +538 30 22 15 13 16 + +1370 28 10 114 2 115 +1062 28 19 46 4 47 +754 28 28 22 6 23 +596 30 33 16 4 17 + +1468 30 8 122 4 123 +1128 28 22 45 3 46 +808 30 8 23 26 24 +628 30 12 15 28 16 + +1531 30 3 117 10 118 +1193 28 3 45 23 46 +871 30 4 24 31 25 +661 30 11 15 31 16 + +1631 30 7 116 7 117 +1267 28 21 45 7 46 +911 30 1 23 37 24 +701 30 19 15 26 16 + +1735 30 5 115 10 116 +1373 28 19 47 10 48 +985 30 15 24 25 25 +745 30 23 15 25 16 + +1843 30 13 115 3 116 +1455 28 2 46 29 47 +1033 30 42 24 1 25 +793 30 23 15 28 16 + +1955 30 17 115 +1541 28 10 46 23 47 +1115 30 10 24 35 25 +845 30 19 15 35 16 + +2071 30 17 115 1 116 +1631 28 14 46 21 47 +1171 30 29 24 19 25 +901 30 11 15 46 16 + +2191 30 13 115 6 116 +1725 28 14 46 23 47 +1231 30 44 24 7 25 +961 30 59 16 1 17 + +2306 30 12 121 7 122 +1812 28 12 47 26 48 +1286 30 39 24 14 25 +986 30 22 15 41 16 + +2434 30 6 121 14 122 +1914 28 6 47 34 48 +1354 30 46 24 10 25 +1054 30 2 15 64 16 + +2566 30 17 122 4 123 +1992 28 29 46 14 47 +1426 30 49 24 10 25 +1096 30 24 15 46 16 + +2702 30 4 122 18 123 +2102 28 13 46 32 47 +1502 30 48 24 14 25 +1142 30 42 15 32 16 + +2812 30 20 117 4 118 +2216 28 40 47 7 48 +1582 30 43 24 22 25 +1222 30 10 15 67 16 + +2956 30 19 118 6 119 +2334 28 18 47 31 48 +1666 30 34 24 34 25 +1276 30 20 15 61 16 \ No newline at end of file diff --git a/python/hamming.py b/python/hamming.py new file mode 100644 index 0000000..5de7106 --- /dev/null +++ b/python/hamming.py @@ -0,0 +1,75 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +This module provides encoding and decoding functions for Hamming codes + +(C) 2022 Louis Heredero louis.heredero@edu.vs.ch +""" + +class HammingError(Exception): + pass + +def encode(data, blocksize=7): + result = [] + datasize = blocksize-blocksize.bit_length() + data = list(map(int, data)) + if len(data) % datasize: + raise HammingError(f"Length of data is not a multiple of {datasize}") + + nblocks = int(len(data)/datasize) + + for b in range(nblocks): + for i in range(blocksize): + # Power of 2 + if (i+1)&i == 0 or i == 0: + result.append(0) + + else: + result.append(data.pop(0)) + + for i in range(blocksize.bit_length()): + p = 1 << i + c = sum([result[b*blocksize+j] for j in range(blocksize) if (j+1)&p]) + if c%2: + result[b*blocksize+p-1] = 1 + + return "".join(list(map(str, result))) + +def decode(data, blocksize=7): + result = [] + datasize = blocksize-blocksize.bit_length() + data = list(map(int, data)) + if len(data) % blocksize: + raise HammingError(f"Length of data is not a multiple of {blocksize}") + + nblocks = int(len(data)/blocksize) + errors = 0 + + for b in range(nblocks): + pos = 0 + for i in range(blocksize.bit_length()): + p = 1 << i + c = sum([data[b*blocksize+j] for j in range(blocksize) if (j+1)&p]) + if c%2: + pos |= p + + if pos != 0: + if pos > blocksize: + raise HammingError("Too many errors") + return + + errors += 1 + data[b*blocksize+pos-1] = 1-data[b*blocksize+pos-1] + + for i in range(1, blocksize): + if (i+1)&i != 0: + result.append(data[b*blocksize+i]) + + return "".join(list(map(str, result))), errors + +if __name__ == "__main__": + #print("10011010") + print(encode("10011010")) + #print(decode("011100101010")) + print(decode("00110011011010101101001010101011010101010111001100110011")) + print(decode("01000011011010101100001010101011110101000111001100111011")) diff --git a/python/img_gen/hamming.py b/python/img_gen/hamming.py new file mode 100644 index 0000000..2b35df1 --- /dev/null +++ b/python/img_gen/hamming.py @@ -0,0 +1,66 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +This module provides encoding and decoding functions for Hamming codes + +(C) 2022 Louis Heredero louis.heredero@edu.vs.ch +""" + +class HammingError(Exception): + pass + +def encode(data, blocksize=7): + result = [] + datasize = blocksize-blocksize.bit_length() + data = list(map(int, data)) + if len(data) % datasize: + raise HammingError(f"Length of data is not a multiple of {datasize}") + + nblocks = int(len(data)/datasize) + + for b in range(nblocks): + for i in range(blocksize): + # Power of 2 + if (i+1)&i == 0 or i == 0: + result.append(0) + + else: + result.append(data.pop(0)) + + for i in range(blocksize.bit_length()): + p = 1 << i + c = sum([result[b*blocksize+j] for j in range(blocksize) if (j+1)&p]) + if c%2: + result[b*blocksize+p-1] = 1 + + return "".join(list(map(str, result))) + +def decode(data, blocksize=7): + result = [] + datasize = blocksize-blocksize.bit_length() + data = list(map(int, data)) + if len(data) % blocksize: + raise HammingError(f"Length of data is not a multiple of {blocksize}") + + nblocks = int(len(data)/blocksize) + + for b in range(nblocks): + pos = 0 + for i in range(blocksize.bit_length()): + p = 1 << i + c = sum([data[b*blocksize+j] for j in range(blocksize) if (j+1)&p]) + if c%2: + pos |= p + + if pos != 0: + if pos > blocksize: + raise HammingError("Too many errors") + return + + data[b*blocksize+pos-1] = 1-data[b*blocksize+pos-1] + + for i in range(1, blocksize): + if (i+1)&i != 0: + result.append(data[b*blocksize+i]) + + return "".join(list(map(str, result))) \ No newline at end of file diff --git a/python/img_gen/lycacode_data_layout_gen.py b/python/img_gen/lycacode_data_layout_gen.py new file mode 100644 index 0000000..34b314b --- /dev/null +++ b/python/img_gen/lycacode_data_layout_gen.py @@ -0,0 +1,276 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +Generates Lycacode data layout matrix figure + +(C) 2022 Louis Heredero louis.heredero@edu.vs.ch +""" + +import pygame +import numpy as np +import hamming + +S = 600 + +class LycacodeError(Exception): + pass + +class Lycacode: + RES = 3 + BLOCKSIZE = 7 + + MODE_PERSON = 0 + MODE_LOC = 1 + MODE_LINK = 2 + MODE_TEXT = 3 + + PERSON_STUDENT = 0 + PERSON_TEACHER = 1 + PERSON_OTHER = 2 + + BLACK = (158,17,26) + #BLACK = (0,0,0) + WHITE = (255,255,255) + + OFFSETS = [(0,-1), (1,0), (0,1), (-1,0)] + + MASKS = [ + lambda x, y: x%3 == 0, + lambda x, y: y%3 == 0, + lambda x, y: (x+y)%3 == 0, + lambda x, y: (x%3)*(y%3)==0, + lambda x, y: (y//3+x//3)%2==0, + lambda x, y: (y%3-1)*(x%3-y%3-2)*(y%3-x%3-2)==0, + lambda x, y: (abs(13-x)+abs(13-y))%3==1, + lambda x, y: (1-x%2 + max(0, abs(13-y)-abs(13-x))) * (1-y%2 + max(0,abs(13-x)-abs(13-y))) == 0 + ] + + MASK = True + + def __init__(self, data, mode): + self.data = data + self.mode = mode + self.encode() + self.create_matrix() + + def encode(self): + self.bits = f"{self.mode:02b}" + + if self.mode == self.MODE_PERSON: + type_ = self.data["type"] + id_ = self.data["id"] + self.bits += f"{type_:02b}" + self.bits += f"{id_:020b}" + + if type_ == self.PERSON_STUDENT: + year = self.data["year"] + class_ = self.data["class"] + self.bits += f"{year:03b}" + self.bits += f"{class_:04b}" + in1, in2 = self.data["initials"] + in1, in2 = ord(in1)-ord("A"), ord(in2)-ord("A") + self.bits += f"{in1:05b}" + self.bits += f"{in2:05b}" + # 83 left + + elif type_ == self.PERSON_TEACHER: + # 100 left + pass + + elif type_ == self.PERSON_OTHER: + # 100 left + pass + + + elif self.mode == self.MODE_LOC: + section = self.data["section"] + room = self.data["room"] + self.bits += f"{section:03b}" + self.bits += f"{room:08b}" + # 107 left + + elif self.mode == self.MODE_LINK: + self.bits += f"{self.data:032b}" + # 86 left + + elif self.mode == self.MODE_TEXT: # max 13 chars + data = self.data.encode("utf-8") + self.bits += f"{len(data):07b}" + self.bits += "".join(list(map(lambda b: f"{b:08b}", data))) + # 7 left + + else: + raise LycacodeError(f"Invalid mode {self.mode}") + + ds = self.BLOCKSIZE-self.BLOCKSIZE.bit_length() + total_bits = (self.RES**2 * 24 - 6) + data_bits = total_bits * ds // self.BLOCKSIZE + self.bits += "0"*(ds-len(self.bits)%ds) + s = "" + i = 0 + left = data_bits-len(self.bits) + while len(s) < left: + s += f"{i:0b}" + i += 1 + s = s[:left] + self.bits += s + self.bits = hamming.encode(self.bits, self.BLOCKSIZE) + + def create_matrix(self): + R = self.RES + self.matrix = np.zeros([R*9, R*9])-3 + self.matrix[R*4:R*5, :] = -1 + self.matrix[:, R*4:R*5] = -1 + self.matrix[R:R*2, R*3:R*6] = -1 + self.matrix[R*3:R*6, R:R*2] = -1 + self.matrix[-R*2:-R, -R*6:-R*3] = -1 + self.matrix[-R*6:-R*3, -R*2:-R] = -1 + + self.matrix[R*4:R*5,R*4:R*5] = 0 + self.matrix[0, R*4:R*5] = -2 # mask + self.matrix[-1, R*4:R*5] = -2 # mask + mask_area = np.where(self.matrix == -1, 1, 0) + self.matrix[R*4, R*4+1:R*5-1] = 1 + self.matrix[R*5-1, R*4] = 1 + self.matrix[R*4+1:R*5-1, R*4+1:R*5-1] = 1 + + bits = list(map(int, self.bits)) + bits = np.reshape(bits, [-1,self.BLOCKSIZE]).T + bits = np.reshape(bits, [-1]).tolist() + + for y in range(R*9): + for x in range(R*9): + if self.matrix[y,x] == -1: + self.matrix[y,x] = bits.pop(0) + + if len(bits) == 0: + break + + if len(bits) == 0: + break + + if self.MASK: + best = [None, None, None] + for i, mask in enumerate(self.MASKS): + score, matrix = self.evaluate(mask, mask_area) + if best[0] is None or score < best[0]: + best = (score, matrix, i) + + self.matrix = best[1] + id_ = list(map(int, f"{best[2]:03b}")) + self.matrix[0, R*4:R*5] = id_ # mask + self.matrix[-1, R*4:R*5] = id_ # mask + + def evaluate(self, mask, mask_area): + matrix = self.matrix.copy() + for y in range(self.matrix.shape[0]): + for x in range(self.matrix.shape[1]): + if mask_area[y][x] and mask(x,y): + matrix[y][x] = 1-matrix[y][x] + + score = 0 + + # 3 or more of the same color (horizontal) + for y in range(self.matrix.shape[0]): + c = 0 + col = -1 + for x in range(self.matrix.shape[1]): + if matrix[y][x] == -1: continue + if col != matrix[y][x]: + c = 0 + col = matrix[y][x] + c += 1 + if c == 3: + score += 4 + elif c > 3: + score += 2 + + # 3 or more of the same color (vertical) + for x in range(self.matrix.shape[1]): + c = 0 + col = -1 + for y in range(self.matrix.shape[0]): + if matrix[y][x] == -1: continue + if col != matrix[y][x]: + c = 0 + col = matrix[y][x] + c += 1 + if c == 3: + score += 4 + elif c > 3: + score += 2 + + # 2x2 blocks of the same color + for y in range(matrix.shape[0]-1): + for x in range(matrix.shape[1]-1): + if matrix[y][x] == -1: continue + zone = matrix[y:y+2, x:x+2] + if np.all(zone == zone[0,0]): + score += 2 + + # more dots/1s => higher score + total = matrix.shape[0]*matrix.shape[1] + dots = np.sum(matrix == 1) + percent = 100*dots//total + score += percent//5 * 2 + + return score, matrix + + def display(self, surf): + R = self.RES + S = min(surf.get_size()) + s = int(S/12/R)*R + O = (S-s*9)/2 + + surf.fill((255,255,255)) + + for y in range(R*9): + for x in range(R*9): + col = self.matrix[y,x] + if col == -3: + X, Y = O+x*s/R, O+y*s/R + size = s/R + pygame.draw.line(surf, (0,0,0), [X+size/2, Y], [X, Y+size/2]) + pygame.draw.line(surf, (0,0,0), [X+size, Y+size/2], [X+size/2, Y+size]) + else: + if col == -2: + col = (190,190,190) + elif col == -1: + col = (127,127,127) + elif col == 0: + col = (0,0,0) + elif col == 1: + col = (255,255,255) + pygame.draw.rect(surf, col, [O+x*s/R, O+y*s/R, s/R, s/R]) + + pts = [ + (4, 4), (4, 2), (3, 2), (3, 1), (4, 1), (4, 0), (5, 0), (5, 1), (6, 1), (6, 2), (5, 2), + (5, 4), (7, 4), (7, 3), (8, 3), (8, 4), (9, 4), (9, 5), (8, 5), (8, 6), (7, 6), (7, 5), + (5, 5), (5, 7), (6, 7), (6, 8), (5, 8), (5, 9), (4, 9), (4, 8), (3, 8), (3, 7), (4, 7), + (4, 5), (2, 5), (2, 6), (1, 6), (1, 5), (0, 5), (0, 4), (1, 4), (1, 3), (2, 3), (2, 4) + ] + pygame.draw.polygon(surf, (0,0,0), [(O+s*p[0], O+s*p[1]) for p in pts], 1) + + +if __name__ == "__main__": + pygame.init() + + surf = pygame.Surface([S, S]) + + code = Lycacode({ + "type": Lycacode.PERSON_STUDENT, + "id": 16048, + "year": 5, + "class": 3, + "initials": "LH" + }, Lycacode.MODE_PERSON) + + #code = Lycacode("Embarquement", Lycacode.MODE_TEXT) + """code = Lycacode({ + "section": 4, + "room": 209 + }, Lycacode.MODE_LOC)""" + #code = Lycacode(1, Lycacode.MODE_LINK) + code.display(surf) + + pygame.image.save(surf, "lycacode_data_layout.png") \ No newline at end of file diff --git a/python/img_gen/lycacode_frame.py b/python/img_gen/lycacode_frame.py new file mode 100644 index 0000000..6e7eb90 --- /dev/null +++ b/python/img_gen/lycacode_frame.py @@ -0,0 +1,92 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +Generates lycacode frame dimensions figure + +(C) 2022 Louis Heredero louis.heredero@edu.vs.ch +""" + +import pygame +import numpy as np + +S = 600 + +class Lycacode: + RES = 3 + + BLACK = (158,17,26) + #BLACK = (0,0,0) + WHITE = (255,255,255) + + OFFSETS = [(0,-1), (1,0), (0,1), (-1,0)] + + def __init__(self): + R = self.RES + self.matrix = np.zeros([R*9, R*9])-1 + self.matrix[R*4:R*5, :] = 0 + self.matrix[:, R*4:R*5] = 0 + self.matrix[R:R*2, R*3:R*6] = 0 + self.matrix[R*3:R*6, R:R*2] = 0 + self.matrix[-R*2:-R, -R*6:-R*3] = 0 + self.matrix[-R*6:-R*3, -R*2:-R] = 0 + + self.font = pygame.font.SysFont("arial", 30, bold=True) + + def display(self, surf): + R = self.RES + S = min(surf.get_size())*2 + s = int(S/12/R)*R + O = (S-s*9)/2 + + surf.fill(self.WHITE) + + # Frame + pygame.draw.rect(surf, self.BLACK, [O-s, O-s, s*11, s*11]) + pygame.draw.rect(surf, self.WHITE, [O-s*0.5, O-s*0.5, s*10, s*10]) + + # Cross + for i in range(4): + dx, dy = self.OFFSETS[i] + X, Y = S/2 + dx*s*3, S/2 + dy*s*3 + for j in range(3): + dx2, dy2 = self.OFFSETS[(i+j-1)%4] + pygame.draw.circle(surf, self.BLACK, [X+dx2*s, Y+dy2*s], 0.75*s) + + pygame.draw.rect(surf, self.BLACK, [X-(1.5-abs(dx))*s, Y-(1.5-abs(dy))*s, s*(3-abs(dx)*2), s*(3-abs(dy)*2)]) + + pygame.draw.rect(surf, self.BLACK, [O, S/2-s/2, 9*s, s]) + pygame.draw.rect(surf, self.BLACK, [S/2-s/2, O, s, 9*s]) + + for y in range(9): + for x in range(9): + if self.matrix[y*R, x*R] != -1: + pygame.draw.rect(surf, (0,0,0), [O+x*s, O+y*s, s+1, s+1], 2) + + col = (17,158,147) + col = (0,0,0) + pygame.draw.line(surf, col, [O-s, O+s*3], [O, O+s*3], 3) + pygame.draw.line(surf, col, [O-s, O+s*3-s/6], [O-s, O+s*3+s/6], 3) + pygame.draw.line(surf, col, [O, O+s*3-s/6], [O, O+s*3+s/6], 3) + txt = self.font.render("S", True, col) + surf.blit(txt, [O-s/2-txt.get_width()/2, O+s*3-s/6-txt.get_height()]) + + pygame.draw.line(surf, col, [O+s, O+s*3-s/6], [O+s*2, O+s*3-s/6], 3) + pygame.draw.line(surf, col, [O+s, O+s*3-s/3], [O+s, O+s*3], 3) + pygame.draw.line(surf, col, [O+s*2, O+s*3-s/3], [O+s*2, O+s*3], 3) + txt = self.font.render("S", True, col) + surf.blit(txt, [O+3*s/2-txt.get_width()/2, O+s*3-s/3-txt.get_height()]) + + pygame.draw.line(surf, col, [O+s, O-s], [O+s, O-s/2], 3) + pygame.draw.line(surf, col, [O+s-s/6, O-s], [O+s+s/6, O-s], 3) + pygame.draw.line(surf, col, [O+s-s/6, O-s/2], [O+s+s/6, O-s/2], 3) + txt = self.font.render("S/2", True, col) + surf.blit(txt, [O+s-s/6-txt.get_width(), O-s*0.75-txt.get_height()/2]) + +if __name__ == "__main__": + pygame.init() + + surf = pygame.Surface([S, S]) + + code = Lycacode() + code.display(surf) + pygame.image.save(surf, "lycacode_frame.png") diff --git a/python/img_gen/lycacode_layout_gen.py b/python/img_gen/lycacode_layout_gen.py new file mode 100644 index 0000000..f109663 --- /dev/null +++ b/python/img_gen/lycacode_layout_gen.py @@ -0,0 +1,71 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +Generates Lycacode layout figure + +(C) 2022 Louis Heredero louis.heredero@edu.vs.ch +""" + +import pygame +import numpy as np + +S = 600 + +class Lycacode: + RES = 3 + + def __init__(self, *args): + self.create_matrix() + + def create_matrix(self): + R = self.RES + self.matrix = np.zeros([R*9, R*9])-3 + self.matrix[R*4:R*5, :] = -1 + self.matrix[:, R*4:R*5] = -1 + self.matrix[R:R*2, R*3:R*6] = -1 + self.matrix[R*3:R*6, R:R*2] = -1 + self.matrix[-R*2:-R, -R*6:-R*3] = -1 + self.matrix[-R*6:-R*3, -R*2:-R] = -1 + + self.matrix[R*4:R*5,R*4:R*5] = 0 + self.matrix[0, R*4:R*5] = -2 # mask + self.matrix[-1, R*4:R*5] = -2 # mask + self.matrix[R*4, R*4+1:R*5-1] = 1 + self.matrix[R*5-1, R*4] = 1 + self.matrix[R*4+1:R*5-1,R*4+1:R*5-1] = 1 + + def display(self, surf): + R = self.RES + S = min(surf.get_size()) + s = int(S/12/R)*R + O = (S-s*9)/2 + + surf.fill((255,255,255)) + + for y in range(R*9): + for x in range(R*9): + col = self.matrix[y,x] + if col == -3: + X, Y = O+x*s/R, O+y*s/R + size = s/R + pygame.draw.line(surf, (0,0,0), [X+size/2, Y], [X, Y+size/2]) + pygame.draw.line(surf, (0,0,0), [X+size, Y+size/2], [X+size/2, Y+size]) + else: + if col == -2: + col = (190,190,190) + elif col == -1: + col = (127,127,127) + elif col == 0: + col = (0,0,0) + elif col == 1: + col = (255,255,255) + pygame.draw.rect(surf, col, [O+x*s/R, O+y*s/R, s/R, s/R]) + +if __name__ == "__main__": + pygame.init() + + surf = pygame.Surface([S, S]) + + code = Lycacode() + code.display(surf) + pygame.image.save(surf, "lycacode_layout.png") \ No newline at end of file diff --git a/python/img_gen/lycacode_mask_gen.py b/python/img_gen/lycacode_mask_gen.py new file mode 100644 index 0000000..3edafff --- /dev/null +++ b/python/img_gen/lycacode_mask_gen.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +Generates Lycacode mask figures + +(C) 2022 Louis Heredero louis.heredero@edu.vs.ch +""" + +import numpy as np +from PIL import Image + +MASKS = [ + lambda x, y: x%3 == 0, + lambda x, y: y%3 == 0, + lambda x, y: (x+y)%3 == 0, + lambda x, y: (x%3)*(y%3)==0, + lambda x, y: (y//3+x//3)%2==0, + lambda x, y: (y%3-1)*(x%3-y%3-2)*(y%3-x%3-2)==0, + lambda x, y: (abs(13-x)+abs(13-y))%3==1, + lambda x, y: (1-x%2 + max(0, abs(13-y)-abs(13-x))) * (1-y%2 + max(0,abs(13-x)-abs(13-y))) == 0 +] + +if __name__ == '__main__': + R = 3 + for i, mask in enumerate(MASKS): + a = np.ones([27, 27], dtype="uint8") + a[R*4:R*5, :] = 2 + a[:, R*4:R*5] = 2 + a[R:R*2, R*3:R*6] = 2 + a[R*3:R*6, R:R*2] = 2 + a[-R*2:-R, -R*6:-R*3] = 2 + a[-R*6:-R*3, -R*2:-R] = 2 + + a[R*4:R*5, R*4:R*5] = 1 + + for y in range(a.shape[0]): + for x in range(a.shape[1]): + if mask(x, y) and a[y,x] == 2: + a[y, x] = 0 + + a *= 0x7f + img = Image.fromarray(a) + img.save(f"lycacode_mask_{i}.png") diff --git a/python/img_gen/qr_mask_eval_gen.py b/python/img_gen/qr_mask_eval_gen.py new file mode 100644 index 0000000..431295a --- /dev/null +++ b/python/img_gen/qr_mask_eval_gen.py @@ -0,0 +1,256 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +Generates QR Code mask evaluation figures + +(C) 2022 Louis Heredero louis.heredero@edu.vs.ch +""" + +import pygame +import numpy as np + +matrix = np.array([[1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0], [1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0], [1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0], [1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0], [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0], [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0], [0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0], [1.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 1.0], [1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0], [1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0], [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0], [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 0.0], [1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0], [1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 0.0], [1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0], [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 1.0], [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0]]) +matrix = np.where(matrix == -0.5, 0, matrix) + +class History: + def __init__(self): + self.widths = [0]*7 + self.widths[-1] = 4 + self.color = 0 + + def add(self, col): + a, b, w = False, False, self.widths.copy() + if col != self.color: + self.color = col + a,b,w = self.check() + self.widths.pop(0) + self.widths.append(0) + + self.widths[-1] += 1 + return (a, b, w) + + def check(self): + n = self.widths[1] + + # if 1:1:3:1:1 + if n > 0 and self.widths[2] == n and self.widths[3] == n*3 and self.widths[4] == n and self.widths[5] == n: + # add 40 if 4:1:1:3:1:1 + add 40 if 1:1:3:1:1:4 + return (self.widths[0] >= 4, self.widths[6] >= 4, self.widths.copy()) + + return (False, False, self.widths.copy()) + + def final(self): + for i in range(4): + self.add(0) + + return self.check() + +def generate_imgs(): + m = ((matrix.copy()+2)%3)*127 + mat = np.ones((m.shape[0]+8, m.shape[1]+8))*255 + mat[4:-4, 4:-4] = m + + size = 30 + surf = pygame.Surface([mat.shape[0]*size, mat.shape[0]*size]) + + surf.fill((255,255,255)) + + for y in range(mat.shape[0]): + for x in range(mat.shape[1]): + col = mat[y, x] + col = (col, col, col) + pygame.draw.rect(surf, col, [x*size, y*size, size, size]) + + img1, img2, img3, img4 = [surf.copy() for i in range(4)] + f = pygame.font.SysFont("sans", 20) + f2 = pygame.font.SysFont("sans", 48, bold=True) + f3 = pygame.font.SysFont("sans", 32, bold=True) + + #Condition 1 (horizontal) + counts = [] + scores = [] + for y in range(matrix.shape[0]): + col = -1 + row = [] + s = 0 + for x in range(matrix.shape[1]): + if matrix[y,x] != col: + if len(row) > 0 and row[-1] < 5: + n = row[-1] + row = row[:-n]+[0]*n + + row.append(1) + col = matrix[y,x] + + else: + row.append(row[-1]+1) + if row[-1] == 5: + s += 3 + elif row[-1] > 5: + s += 1 + + counts.append(row) + scores.append(s) + + for i, c in enumerate(counts[0]): + if c: + txt = f.render(str(c), True, (255,255,255)) + img1.blit(txt, [(i+4.5)*size-txt.get_width()/2, 4.5*size-txt.get_height()/2]) + + for i, s in enumerate(scores): + txt = f.render(str(s), True, (255,0,0)) + img1.blit(txt, [size*(5+matrix.shape[1])-txt.get_width()/2, (i+4.5)*size-txt.get_height()/2]) + + #Condition 1 (vertical) + scores2 = [] + for x in range(matrix.shape[1]): + col, count = -1, 0 + s = 0 + for y in range(matrix.shape[0]): + if matrix[y,x] != col: + count = 0 + col = matrix[y,x] + count += 1 + + if count == 5: + s += 3 + elif count > 5: + s += 1 + + scores2.append(s) + + for i, s in enumerate(scores2): + txt = f.render(str(s), True, (255,0,0)) + img1.blit(txt, [(i+4.5)*size-txt.get_width()/2, size*(5+matrix.shape[0])-txt.get_height()/2]) + + txt = f2.render(f"= {sum(scores)+sum(scores2)}", True, (255,0,0)) + img1.blit(txt, [size*(5+matrix.shape[1])-txt.get_width()/2, size*(6+matrix.shape[1])-txt.get_height()/2]) + + pygame.image.save(img1, "qr_mask_ex_eval_1.png") + + #Condition 2 + score = 0 + txtR = f.render("3", True, (255,0,0)) + txtW = f.render("3", True, (255,255,255)) + for y in range(matrix.shape[0]-1): + for x in range(matrix.shape[1]-1): + zone = matrix[y:y+2, x:x+2] + if np.all(zone == zone[0,0]): + score += 3 + txt = [txtR, txtW][int(zone[0,0])] + img2.blit(txt, [(x+5)*size-txt.get_width()/2, (y+5)*size-txt.get_height()/2]) + + txt = f2.render(f"= {score}", True, (255,0,0)) + img2.blit(txt, [size*(5+matrix.shape[1])-txt.get_width()/2, size*(6+matrix.shape[1])-txt.get_height()/2]) + + pygame.image.save(img2, "qr_mask_ex_eval_2.png") + + i = 0 + cols = [(255,0,0),(44,219,99),(26,135,240),(229,205,44)] + cols = [] + for j in range(36): + c = pygame.Color(0) + hsla = [j*40%360, 60, 50, 100] + c.hsla = hsla + cols.append(c) + + for y in range(matrix.shape[0]): + hist = History() + for x in range(matrix.shape[1]): + a,b,w = hist.add(matrix[y,x]) + + if a: + col = cols[min(len(cols)-1,i)] + X = x-sum(w[1:]) #+4-4 + draw_line(img3, col, size, X, y) + i += 1 + + if b: + col = cols[min(len(cols)-1,i)] + X = x-sum(w[1:])+4 + draw_line(img3, col, size, X, y) + i += 1 + + a,b,w = hist.final() + if a: + col = cols[min(len(cols)-1,i)] + X = matrix.shape[1]-sum(w[1:]) + draw_line(img3, col, size, X, y) + i += 1 + + if b: + col = cols[min(len(cols)-1,i)] + X = matrix.shape[1]+4-sum(w[1:-1]) + draw_line(img3, col, size, X, y) + i += 1 + + for x in range(matrix.shape[1]): + hist = History() + for y in range(matrix.shape[0]): + a,b,w = hist.add(matrix[y,x]) + + if a: + col = cols[min(len(cols)-1,i)] + Y = y-sum(w[1:]) + draw_line(img3, col, size, x, Y, True) + i += 1 + + if b: + col = cols[min(len(cols)-1,i)] + Y = y-sum(w[1:])+4 + draw_line(img3, col, size, x, Y, True) + i += 1 + + a,b,w = hist.final() + if a: + col = cols[min(len(cols)-1,i)] + Y = matrix.shape[0]-sum(w[1:]) + draw_line(img3, col, size, x, Y, True) + i += 1 + + if b: + col = cols[min(len(cols)-1,i)] + Y = matrix.shape[0]+4-sum(w[1:-1]) + draw_line(img3, col, size, x, Y, True) + i += 1 + + txt = f2.render(f"= {i}*40 = {i*40}", True, (255,0,0)) + img3.blit(txt, [size*(4+matrix.shape[1]/2)-txt.get_width()/2, size*(6+matrix.shape[1])-txt.get_height()/2]) + + pygame.image.save(img3, "qr_mask_ex_eval_3.png") + + #Condition 4 + total = matrix.shape[0]*matrix.shape[1] + dark = np.sum(matrix == 1) + percent = 100*dark//total + p1 = percent-(percent%5) + p2 = p1+5 + p1, p2 = abs(p1-50)/5, abs(p2-50)/5 + score = min(p1,p2)*10 + + txt = f3.render(f"P = {percent}%", True, (255,0,0)) + img4.blit(txt, [size, size]) + + txt = f3.render(f"P1 = {percent-(percent%5)}% / P2 = {percent-(percent%5)+5}%", True, (255,0,0)) + img4.blit(txt, [surf.get_width() - size - txt.get_width(), size]) + + txt = f2.render(f"S = min({int(p1)}, {int(p2)})*10 = {int(score)}", True, (255,0,0)) + img4.blit(txt, [size*(4+matrix.shape[1]/2)-txt.get_width()/2, size*(6+matrix.shape[1])-txt.get_height()/2]) + + pygame.image.save(img4, "qr_mask_ex_eval_4.png") + +def draw_line(surf, col, size, x, y, vert=False): + a, b = [(x+0.25)*size, (4.5+y)*size], [(x+10.75)*size, (4.5+y)*size] + if vert: + a, b = [(4.5+x)*size, (y+0.25)*size], [(4.5+x)*size, (y+10.75)*size] + + dx, dy = [size/3, 0] if vert else [0, size/3] + + pygame.draw.line(surf, col, a, b, 6) + pygame.draw.line(surf, col, [a[0]-dx, a[1]-dy], [a[0]+dx, a[1]+dy], 6) + pygame.draw.line(surf, col, [b[0]-dx, b[1]-dy], [b[0]+dx, b[1]+dy], 6) + +if __name__ == "__main__": + pygame.init() + + generate_imgs() \ No newline at end of file diff --git a/python/img_gen/qr_mask_gen.py b/python/img_gen/qr_mask_gen.py new file mode 100644 index 0000000..3b6f96a --- /dev/null +++ b/python/img_gen/qr_mask_gen.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +Generates QR Code mask figures + +(C) 2022 Louis Heredero louis.heredero@edu.vs.ch +""" + +import numpy as np +from PIL import Image + +MASKS = [ + lambda x, y: (x+y) % 2 == 0, + lambda x, y: y % 2 == 0, + lambda x, y: (x) % 3 == 0, + lambda x, y: (x+y) % 3 == 0, + lambda x, y: (y//2+x//3) % 2 == 0, + lambda x, y: ((x*y) % 2 + (x*y) % 3) == 0, + lambda x, y: ((x*y) % 2 + (x*y) % 3) % 2 == 0, + lambda x, y: ((x+y) % 2 + (x*y) % 3) % 2 == 0 +] + +if __name__ == '__main__': + for i, mask in enumerate(MASKS): + a = np.ones([21, 21], dtype="uint8") + for y in range(a.shape[0]): + for x in range(a.shape[1]): + if mask(x, y): + a[y, x] = 0 + + a *= 0xffffff + img = Image.fromarray(a) + img.save(f"qr_mask_{i}.png") diff --git a/python/img_gen/qr_plcmt_path.py b/python/img_gen/qr_plcmt_path.py new file mode 100644 index 0000000..18b17bf --- /dev/null +++ b/python/img_gen/qr_plcmt_path.py @@ -0,0 +1,101 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +Generates QR Code placement path figure + +(C) 2022 Louis Heredero louis.heredero@edu.vs.ch +""" + +import pygame +import numpy as np + +WIDTH, HEIGHT = 580, 580 + +matrix = np.array([ + [ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, -0.5, -1.0, -1.0, -1.0, -1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], + [ 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, -0.5, -1.0, -1.0, -1.0, -1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0], + [ 1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0, 0.0, -0.5, -1.0, -1.0, -1.0, -1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0], + [ 1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0, 0.0, -0.5, -1.0, -1.0, -1.0, -1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0], + [ 1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0, 0.0, -0.5, -1.0, -1.0, -1.0, -1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0], + [ 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, -0.5, -1.0, -1.0, -1.0, -1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0], + [ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], + [ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.5, -1.0, -1.0, -1.0, -1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], + [-0.5, -0.5, -0.5, -0.5, -0.5, -0.5, 1.0, -0.5, -0.5, -1.0, -1.0, -1.0, -1.0, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5], + [-1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 0.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], + [-1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], + [-1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 0.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], + [-1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], + [ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], + [ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, -0.5, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], + [ 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, -0.5, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], + [ 1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0, 0.0, -0.5, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], + [ 1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0, 0.0, -0.5, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], + [ 1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0, 0.0, -0.5, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], + [ 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, -0.5, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], + [ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, -0.5, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0] +]) + +if __name__ == "__main__": + pygame.init() + + surf = pygame.Surface([WIDTH, HEIGHT]) + W, H = WIDTH/(matrix.shape[1]+8), HEIGHT/(matrix.shape[0]+8) + hW, hH = W/2, H/2 + + surf.fill((255,255,255)) + + m = ((matrix.copy()+2)%3)*127 + mat = np.ones((m.shape[0]+8, m.shape[1]+8))*255 + mat[4:-4, 4:-4] = m + + for y in range(mat.shape[0]): + for x in range(mat.shape[1]): + col = mat[y, x] + col = (col, col, col) + pygame.draw.rect(surf, col, [x*W, y*H, W, H]) + + points = [] + all_points = [] + + #Place data + dir_ = -1 #-1 = up | 1 = down + x, y = matrix.shape[1]-1, matrix.shape[0]-1 + zigzag = 0 + + while x >= 0: + all_points.append([(x+4)*W+hW, (y+4)*H+hH]) + if matrix[y,x] == -1: + points.append([(x+4)*W+hW, (y+4)*H+hH]) + + if ((dir_+1)/2 + zigzag)%2 == 0: + x -= 1 + + else: + y += dir_ + x += 1 + + if y == -1 or y == matrix.shape[0]: + all_points.append([(x+4)*W+hW, (y+4)*H+hH]) + dir_ = -dir_ + y += dir_ + x -= 2 + + else: + zigzag = 1-zigzag + + #Vertical timing pattern + if x == 6: + x -= 1 + all_points.append([(x+4)*W+hW, (y+4)*H+hH]) + + for p in all_points: + pygame.draw.circle(surf, (255,0,0), p, 3) + + pygame.draw.lines(surf, (255,0,0), False, all_points) + + + for p in points: + pygame.draw.circle(surf, (255,255,255), p, 3) + + pygame.draw.lines(surf, (255,255,255), False, points) + pygame.image.save(surf, "qr_plcmt_path.png") \ No newline at end of file diff --git a/python/latex_gen/alignment_gen.py b/python/latex_gen/alignment_gen.py new file mode 100644 index 0000000..334d924 --- /dev/null +++ b/python/latex_gen/alignment_gen.py @@ -0,0 +1,95 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +Generates latex table for alignment pattern locations + +(C) 2022 Louis Heredero louis.heredero@edu.vs.ch +""" + +LOCATIONS = [ + [], + [6, 18], + [6, 22], + [6, 26], + [6, 30], + [6, 34], + [6, 22, 38], + [6, 24, 42], + [6, 26, 46], + [6, 28, 50], + [6, 30, 54], + [6, 32, 58], + [6, 34, 62], + [6, 26, 46, 66], + [6, 26, 48, 70], + [6, 26, 50, 74], + [6, 30, 54, 78], + [6, 30, 56, 82], + [6, 30, 58, 86], + [6, 34, 62, 90], + [6, 28, 50, 72, 94], + [6, 26, 50, 74, 98], + [6, 30, 54, 78, 102], + [6, 28, 54, 80, 106], + [6, 32, 58, 84, 110], + [6, 30, 58, 86, 114], + [6, 34, 62, 90, 118], + [6, 26, 50, 74, 98, 122], + [6, 30, 54, 78, 102, 126], + [6, 26, 52, 78, 104, 130], + [6, 30, 56, 82, 108, 134], + [6, 34, 60, 86, 112, 138], + [6, 30, 58, 86, 114, 142], + [6, 34, 62, 90, 118, 146], + [6, 30, 54, 78, 102, 126, 150], + [6, 24, 50, 76, 102, 128, 154], + [6, 28, 54, 80, 106, 132, 158], + [6, 32, 58, 84, 110, 136, 162], + [6, 26, 54, 82, 110, 138, 166], + [6, 30, 58, 86, 114, 142, 170] +] + +start = r"""\def\arraystretch{1.2} +\begin{center} + \begin{longtabu}{|[2pt]c|c|c|c|c|c|c|c|[2pt]} + \caption{Alignment pattern locations} + \label{tab:qr_alignment}\\ + \tabucline[2pt]{-} + Version & \multicolumn{7}{c|[2pt]}{Central x and y coordinates} \\ + \tabucline[2pt]{-} + \endfirsthead + \multicolumn{8}{r}{\emph{Continued from last page}}\\ + \hline + Version & \multicolumn{7}{c|[2pt]}{Central x and y coordinates} \\ + \endhead + Version & \multicolumn{7}{c|[2pt]}{Central x and y coordinates} \\ + \hline + \multicolumn{8}{r}{\emph{Continued on next page}}\\ + \endfoot + \tabucline[2pt]{-} + \endlastfoot +""" + +end = r""" \hline + \end{longtabu} +\end{center} +\def\arraystretch{1} +""" + +if __name__ == "__main__": + with open("alignment.tex", "w") as f_tex: + f_tex.write(start) + + for i, row in enumerate(LOCATIONS): + if i > 0: + f_tex.write(" \\hline\n") + + f_tex.write(f" {i+1:2}") + + for j in range(7): + val = row[j] if j < len(row) else "" + f_tex.write(f" & {val:3}") + + f_tex.write(" \\\\\n") + + f_tex.write(end) \ No newline at end of file diff --git a/python/latex_gen/ec_converter.py b/python/latex_gen/ec_converter.py new file mode 100644 index 0000000..864e0a7 --- /dev/null +++ b/python/latex_gen/ec_converter.py @@ -0,0 +1,104 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +Generates latex table for error correction information + +(C) 2022 Louis Heredero louis.heredero@edu.vs.ch +""" + +levels = "LMQH" + +start = r"""\def\arraystretch{1.5} +\begin{table}[H] + \centering + \begin{longtabu}{|[2pt]c|c|c|c|c|c|c|c|[2pt]} + \tabucline[2pt]{-} + Version & Correction level & Data codewords & Error correction codewords per block & Blocks in group 1 & Data codewords per group 1 blocks & Blocks in group 2 & Data codewords per group 2 blocks \\ + \tabucline[2pt]{-} +""" + +end = r""" \tabucline[2pt]{-} + \end{longtabu} + \caption{Error correction characteristics} + \label{tab:qr_error_correction} +\end{table} +\def\arraystretch{1} +""" + + +start = r"""\def\arraystretch{1.2} +\begin{center} + \begin{longtabu}{|[2pt]c|c|c|c|c|c|c|c|[2pt]} + \caption{Error correction characteristics} + \label{tab:qr_error_correction}\\ + \tabucline[2pt]{-} + \rot{Version} & \rot{Correction level} & \rot{Data codewords} & \rot{\shortstack[l]{Error correction \\ codewords per block}} & \rot{Blocks in group 1} & \rot{\shortstack[l]{Data codewords per \\ group 1 blocks}} & \rot{Blocks in group 2} & \rot{\shortstack[l]{Data codewords per \\ group 2 blocks}} \\ + \tabucline[2pt]{-} + \endfirsthead + \multicolumn{8}{r}{\emph{Continued from last page}}\\ + \hline + Ver & Level & Data CW & EC CW /B & Blocks G1 & CW G1 & Blocks G2 & CW G2 \\ + \endhead + Ver & Level & Data CW & EC CW /B & Blocks G1 & CW G1 & Blocks G2 & CW G2 \\ + \hline + \multicolumn{8}{r}{\emph{Continued on next page}}\\ + \endfoot + \tabucline[2pt]{-} + \endlastfoot +""" + +end = r""" \hline + \end{longtabu} +\end{center} +\def\arraystretch{1} +""" + +if __name__ == "__main__": + with open("error_correction.txt", "r") as f_txt, open("error_correction.tex", "w") as f_tex: + ecs = f_txt.read().split("\n\n") + + f_tex.write(start) + + """for i, version in enumerate(versions): + lvls = version.split("\n") + + if i > 0: + f_tex.write(" \\hline\n") + + f_tex.write(f" \\multirow{{4}}{{*}}{{{i+1:2}}}") + # f_tex.write(f" {i+1:2}") + + for j, lvl in enumerate(lvls): + values = " & ".join( + map(lambda s: f"{s:>4}", lvl.split("\t")) + ) + + if j > 0: + f_tex.write(" ") + # f_tex.write(" ") + + f_tex.write( + f" & {levels[j]} & {values} \\\\{'*' if j < 3 else ''}\n")""" + + for i, ec in enumerate(ecs): + lvls = [list(map(int, lvl.split("\t"))) for lvl in ec.split("\n")] + lvls = [lvl + [0]*(6-len(lvl)) for lvl in lvls] + + if i > 0: + f_tex.write(" \\hline\n") + + f_tex.write(f" \\multirow{{4}}{{*}}{{{i+1:2}}}") + + for j, lvl in enumerate(lvls): + values = " & ".join( + map(lambda s: f"{s:>4}", lvl) + ) + + if j > 0: + f_tex.write(" ") + # f_tex.write(" ") + + f_tex.write( + f" & {levels[j]} & {values} \\\\{'*' if j < 3 else ''}\n") + + f_tex.write(end) diff --git a/python/latex_gen/error_correction.txt b/python/latex_gen/error_correction.txt new file mode 100644 index 0000000..9ae09c7 --- /dev/null +++ b/python/latex_gen/error_correction.txt @@ -0,0 +1,199 @@ +19 7 1 19 +16 10 1 16 +13 13 1 13 +9 17 1 9 + +34 10 1 34 +28 16 1 28 +22 22 1 22 +16 28 1 16 + +55 15 1 55 +44 26 1 44 +34 18 2 17 +26 22 2 13 + +80 20 1 80 +64 18 2 32 +48 26 2 24 +36 16 4 9 + +108 26 1 108 +86 24 2 43 +62 18 2 15 2 16 +46 22 2 11 2 12 + +136 18 2 68 +108 16 4 27 +76 24 4 19 +60 28 4 15 + +156 20 2 78 +124 18 4 31 +88 18 2 14 4 15 +66 26 4 13 1 14 + +194 24 2 97 +154 22 2 38 2 39 +110 22 4 18 2 19 +86 26 4 14 2 15 + +232 30 2 116 +182 22 3 36 2 37 +132 20 4 16 4 17 +100 24 4 12 4 13 + +274 18 2 68 2 69 +216 26 4 43 1 44 +154 24 6 19 2 20 +122 28 6 15 2 16 + +324 20 4 81 +254 30 1 50 4 51 +180 28 4 22 4 23 +140 24 3 12 8 13 + +370 24 2 92 2 93 +290 22 6 36 2 37 +206 26 4 20 6 21 +158 28 7 14 4 15 + +428 26 4 107 +334 22 8 37 1 38 +244 24 8 20 4 21 +180 22 12 11 4 12 + +461 30 3 115 1 116 +365 24 4 40 5 41 +261 20 11 16 5 17 +197 24 11 12 5 13 + +523 22 5 87 1 88 +415 24 5 41 5 42 +295 30 5 24 7 25 +223 24 11 12 7 13 + +589 24 5 98 1 99 +453 28 7 45 3 46 +325 24 15 19 2 20 +253 30 3 15 13 16 + +647 28 1 107 5 108 +507 28 10 46 1 47 +367 28 1 22 15 23 +283 28 2 14 17 15 + +721 30 5 120 1 121 +563 26 9 43 4 44 +397 28 17 22 1 23 +313 28 2 14 19 15 + +795 28 3 113 4 114 +627 26 3 44 11 45 +445 26 17 21 4 22 +341 26 9 13 16 14 + +861 28 3 107 5 108 +669 26 3 41 13 42 +485 30 15 24 5 25 +385 28 15 15 10 16 + +932 28 4 116 4 117 +714 26 17 42 +512 28 17 22 6 23 +406 30 19 16 6 17 + +1006 28 2 111 7 112 +782 28 17 46 +568 30 7 24 16 25 +442 24 34 13 + +1094 30 4 121 5 122 +860 28 4 47 14 48 +614 30 11 24 14 25 +464 30 16 15 14 16 + +1174 30 6 117 4 118 +914 28 6 45 14 46 +664 30 11 24 16 25 +514 30 30 16 2 17 + +1276 26 8 106 4 107 +1000 28 8 47 13 48 +718 30 7 24 22 25 +538 30 22 15 13 16 + +1370 28 10 114 2 115 +1062 28 19 46 4 47 +754 28 28 22 6 23 +596 30 33 16 4 17 + +1468 30 8 122 4 123 +1128 28 22 45 3 46 +808 30 8 23 26 24 +628 30 12 15 28 16 + +1531 30 3 117 10 118 +1193 28 3 45 23 46 +871 30 4 24 31 25 +661 30 11 15 31 16 + +1631 30 7 116 7 117 +1267 28 21 45 7 46 +911 30 1 23 37 24 +701 30 19 15 26 16 + +1735 30 5 115 10 116 +1373 28 19 47 10 48 +985 30 15 24 25 25 +745 30 23 15 25 16 + +1843 30 13 115 3 116 +1455 28 2 46 29 47 +1033 30 42 24 1 25 +793 30 23 15 28 16 + +1955 30 17 115 +1541 28 10 46 23 47 +1115 30 10 24 35 25 +845 30 19 15 35 16 + +2071 30 17 115 1 116 +1631 28 14 46 21 47 +1171 30 29 24 19 25 +901 30 11 15 46 16 + +2191 30 13 115 6 116 +1725 28 14 46 23 47 +1231 30 44 24 7 25 +961 30 59 16 1 17 + +2306 30 12 121 7 122 +1812 28 12 47 26 48 +1286 30 39 24 14 25 +986 30 22 15 41 16 + +2434 30 6 121 14 122 +1914 28 6 47 34 48 +1354 30 46 24 10 25 +1054 30 2 15 64 16 + +2566 30 17 122 4 123 +1992 28 29 46 14 47 +1426 30 49 24 10 25 +1096 30 24 15 46 16 + +2702 30 4 122 18 123 +2102 28 13 46 32 47 +1502 30 48 24 14 25 +1142 30 42 15 32 16 + +2812 30 20 117 4 118 +2216 28 40 47 7 48 +1582 30 43 24 22 25 +1222 30 10 15 67 16 + +2956 30 19 118 6 119 +2334 28 18 47 31 48 +1666 30 34 24 34 25 +1276 30 20 15 61 16 \ No newline at end of file diff --git a/python/latex_gen/hamming_gen.py b/python/latex_gen/hamming_gen.py new file mode 100644 index 0000000..309ebe8 --- /dev/null +++ b/python/latex_gen/hamming_gen.py @@ -0,0 +1,99 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +Generates latex tables for hamming codes + +(C) 2022 Louis Heredero louis.heredero@edu.vs.ch +""" + +start = r""" \begin{tabu}{|[2pt]c|c|c|c|c|c|c|c|[2pt]} + \tabucline[2pt]{-} + & 1 & 2 & 3 & 4 & 5 & 6 & 7 \\ + \tabucline[1pt]{-} +""" + +end = r""" \tabucline[2pt]{-} + \end{tabu} +""" + +class HammingError(Exception): + pass + +def encode(data, blocksize=7): + A = start + B = start + + result = [] + datasize = blocksize-blocksize.bit_length() + data = list(map(int, data)) + if len(data) % datasize: + raise HammingError(f"Length of data is not a multiple of {datasize}") + + nblocks = int(len(data)/datasize) + + last = 0 + for b in range(nblocks): + if b > 0: + A += " \\hline\n" + B += " \\hline\n" + A += f" Group {b+1}" + B += f" Group {b+1}" + count = 0 + for i in range(blocksize): + A += " & " + count += data[0] + # Power of 2 + if (i+1)&i == 0 or i == 0: + A += "\_" + result.append(0) + + else: + A += str(data[0]) + result.append(data.pop(0)) + A += " \\\\\n" + + for i in range(blocksize.bit_length()): + p = 1 << i + c = sum([result[b*blocksize+j] for j in range(blocksize) if (j+1)&p]) + if c%2: + result[b*blocksize+p-1] = 1 + + for i in range(blocksize): + B += " & " + B += str(result[b*blocksize+i]) + B += " \\\\\n" + + if count == 0: + if last >= 2: + A = A.rsplit("\n",2)[0] + A += "\n ... & ... & ... & ... & ... & ... & ... & ... \\\\\n" + B = B.rsplit("\n",2)[0] + B += "\n ... & ... & ... & ... & ... & ... & ... & ... \\\\\n" + break + last += 1 + else: + last = 0 + + #return "".join(list(map(str, result))) + A += end + B += end + + return A, B + +if __name__ == "__main__": + data = "00000000001111101011000010100110101100111" + ds = 4 + total_bits = (3**2 * 24 - 6) + data_bits = total_bits * ds // 7 + data += "0"*(ds-len(data)%ds) + s = "" + i = 0 + left = data_bits-len(data) + while len(s) < left: + s += f"{i:0b}" + i += 1 + s = s[:left] + data += s + a, b = encode(data) + print(a) + print(b) diff --git a/python/latex_gen/qr_versions.txt b/python/latex_gen/qr_versions.txt new file mode 100644 index 0000000..329689f --- /dev/null +++ b/python/latex_gen/qr_versions.txt @@ -0,0 +1,199 @@ +41 25 17 10 +34 20 14 8 +27 16 11 7 +17 10 7 4 + +77 47 32 20 +63 38 26 16 +48 29 20 12 +34 20 14 8 + +127 77 53 32 +101 61 42 26 +77 47 32 20 +58 35 24 15 + +187 114 78 48 +149 90 62 38 +111 67 46 28 +82 50 34 21 + +255 154 106 65 +202 122 84 52 +144 87 60 37 +106 64 44 27 + +322 195 134 82 +255 154 106 65 +178 108 74 45 +139 84 58 36 + +370 224 154 95 +293 178 122 75 +207 125 86 53 +154 93 64 39 + +461 279 192 118 +365 221 152 93 +259 157 108 66 +202 122 84 52 + +552 335 230 141 +432 262 180 111 +312 189 130 80 +235 143 98 60 + +652 395 271 167 +513 311 213 131 +364 221 151 93 +288 174 119 74 + +772 468 321 198 +604 366 251 155 +427 259 177 109 +331 200 137 85 + +883 535 367 226 +691 419 287 177 +489 296 203 125 +374 227 155 96 + +1022 619 425 262 +796 483 331 204 +580 352 241 149 +427 259 177 109 + +1101 667 458 282 +871 528 362 223 +621 376 258 159 +468 283 194 120 + +1250 758 520 320 +991 600 412 254 +703 426 292 180 +530 321 220 136 + +1408 854 586 361 +1082 656 450 277 +775 470 322 198 +602 365 250 154 + +1548 938 644 397 +1212 734 504 310 +876 531 364 224 +674 408 280 173 + +1725 1046 718 442 +1346 816 560 345 +948 574 394 243 +746 452 310 191 + +1903 1153 792 488 +1500 909 624 384 +1063 644 442 272 +813 493 338 208 + +2061 1249 858 528 +1600 970 666 410 +1159 702 482 297 +919 557 382 235 + +2232 1352 929 572 +1708 1035 711 438 +1224 742 509 314 +969 587 403 248 + +2409 1460 1003 618 +1872 1134 779 480 +1358 823 565 348 +1056 640 439 270 + +2620 1588 1091 672 +2059 1248 857 528 +1468 890 611 376 +1108 672 461 284 + +2812 1704 1171 721 +2188 1326 911 561 +1588 963 661 407 +1228 744 511 315 + +3057 1853 1273 784 +2395 1451 997 614 +1718 1041 715 440 +1286 779 535 330 + +3283 1990 1367 842 +2544 1542 1059 652 +1804 1094 751 462 +1425 864 593 365 + +3517 2132 1465 902 +2701 1637 1125 692 +1933 1172 805 496 +1501 910 625 385 + +3669 2223 1528 940 +2857 1732 1190 732 +2085 1263 868 534 +1581 958 658 405 + +3909 2369 1628 1002 +3035 1839 1264 778 +2181 1322 908 559 +1677 1016 698 430 + +4158 2520 1732 1066 +3289 1994 1370 843 +2358 1429 982 604 +1782 1080 742 457 + +4417 2677 1840 1132 +3486 2113 1452 894 +2473 1499 1030 634 +1897 1150 790 486 + +4686 2840 1952 1201 +3693 2238 1538 947 +2670 1618 1112 684 +2022 1226 842 518 + +4965 3009 2068 1273 +3909 2369 1628 1002 +2805 1700 1168 719 +2157 1307 898 553 + +5253 3183 2188 1347 +4134 2506 1722 1060 +2949 1787 1228 756 +2301 1394 958 590 + +5529 3351 2303 1417 +4343 2632 1809 1113 +3081 1867 1283 790 +2361 1431 983 605 + +5836 3537 2431 1496 +4588 2780 1911 1176 +3244 1966 1351 832 +2524 1530 1051 647 + +6153 3729 2563 1577 +4775 2894 1989 1224 +3417 2071 1423 876 +2625 1591 1093 673 + +6479 3927 2699 1661 +5039 3054 2099 1292 +3599 2181 1499 923 +2735 1658 1139 701 + +6743 4087 2809 1729 +5313 3220 2213 1362 +3791 2298 1579 972 +2927 1774 1219 750 + +7089 4296 2953 1817 +5596 3391 2331 1435 +3993 2420 1663 1024 +3057 1852 1273 784 \ No newline at end of file diff --git a/python/latex_gen/reed_solomon_gen.py b/python/latex_gen/reed_solomon_gen.py new file mode 100644 index 0000000..ed74832 --- /dev/null +++ b/python/latex_gen/reed_solomon_gen.py @@ -0,0 +1,282 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +Prints steps of Reed-Solomon decoding + +(C) 2022 Louis Heredero louis.heredero@edu.vs.ch +""" + +class GF: + def __init__(self, val): + self.val = val + + def copy(self): + return GF(self.val) + + def __add__(self, n): + return GF(self.val ^ n.val) + + def __sub__(self, n): + return GF(self.val ^ n.val) + + def __mul__(self, n): + if self.val == 0 or n.val == 0: + return GF(0) + + return GF.EXP[GF.LOG[self.val].val + GF.LOG[n.val].val].copy() + + def __truediv__(self, n): + if n.val == 0: + raise ZeroDivisionError + if self.val == 0: + return GF(0) + + return GF.EXP[(GF.LOG[self.val].val + 255 - GF.LOG[n.val].val)%255].copy() + + def __pow__(self, n): + return GF.EXP[(GF.LOG[self.val].val * n.val)%255].copy() + + def __repr__(self): + return self.val.__repr__() + #return f"GF({self.val})" + + def log(self): + return GF.LOG[self.val] + +GF.EXP = [GF(0)]*512 +GF.LOG = [GF(0)]*256 +value = 1 +for exponent in range(255): + GF.LOG[value] = GF(exponent) + GF.EXP[exponent] = GF(value) + value = ((value << 1) ^ 285) if value > 127 else value << 1 + +for i in range(255, 512): + GF.EXP[i] = GF.EXP[i-255].copy() + + +class Poly: + def __init__(self, coefs): + self.coefs = coefs.copy() + + @property + def deg(self): + return len(self.coefs) + + def copy(self): + return Poly(self.coefs) + + def __add__(self, p): + d1, d2 = self.deg, p.deg + deg = max(d1,d2) + result = [GF(0) for i in range(deg)] + + for i in range(d1): + result[i + deg - d1] = self.coefs[i] + + for i in range(d2): + result[i + deg - d2] += p.coefs[i] + + return Poly(result) + + def __mul__(self, p): + result = [GF(0) for i in range(self.deg+p.deg-1)] + + for i in range(p.deg): + for j in range(self.deg): + result[i+j] += self.coefs[j] * p.coefs[i] + + return Poly(result) + + def __truediv__(self, p): + dividend = self.coefs.copy() + dividend += [GF(0) for i in range(p.deg-1)] + quotient = [] + + for i in range(self.deg): + coef = dividend[i] / p.coefs[0] + quotient.append(coef) + print("sub:", p*Poly([coef])) + + for j in range(p.deg): + dividend[i+j] -= p.coefs[j] * coef + + print("rem:", dividend) + print() + + while dividend[0].val == 0: + dividend.pop(0) + + return [Poly(quotient), Poly(dividend)] + + def __repr__(self): + return f"" + + def eval(self, x): + y = GF(0) + + for i in range(self.deg): + y += self.coefs[i] * x**GF(self.deg-i-1) + + return y + + def del_lead_zeros(self): + while len(self.coefs) > 1 and self.coefs[0].val == 0: + self.coefs.pop(0) + + if len(self.coefs) == 0: + self.coefs = [GF(0)] + + return self + +def get_generator_poly(n): + poly = Poly([GF(1)]) + + for i in range(n): + poly *= Poly([GF(1), GF(2)**GF(i)]) + + return poly + +class ReedSolomonException(Exception): + pass + +def correct(data, ec): + n = len(ec) + + data = Poly([GF(int(cw, 2)) for cw in data+ec]) + ##print("data", list(map(lambda c:c.val, data.coefs))) + print("r(x)", data) + + syndrome = [0]*n + corrupted = False + for i in range(n): + syndrome[i] = data.eval(GF.EXP[i]) + if syndrome[i].val != 0: + corrupted = True + + if not corrupted: + print("No errors") + return data + + syndrome = Poly(syndrome[::-1]) + print("syndrome", syndrome) + + #Find locator poly + sigma, omega = euclidean_algorithm(Poly([GF(1)]+[GF(0) for i in range(n)]), syndrome, n) + print("locator", sigma) + print("evaluator", omega) + error_loc = find_error_loc(sigma) + print("location", error_loc) + + error_mag = find_error_mag(omega, error_loc) + print("mag", error_mag) + + for i in range(len(error_loc)): + pos = GF(error_loc[i]).log() + pos = data.deg - pos.val - 1 + if pos < 0: + raise ReedSolomonException("Bad error location") + + data.coefs[pos] += GF(error_mag[i]) + + return data + +def euclidean_algorithm(a, b, R): + if a.deg < b.deg: + a, b = b, a + + r_last = a + r = b + t_last = Poly([GF(0)]) + t = Poly([GF(1)]) + + while r.deg-1 >= int(R/2): + r_last_last = r_last + t_last_last = t_last + r_last = r + t_last = t + if r_last.coefs[0] == 0: + raise ReedSolomonException("r_{i-1} was zero") + + r = r_last_last + q = Poly([GF(0)]) + denom_lead_term = r_last.coefs[0] + dlt_inv = denom_lead_term ** GF(-1) + I = 0 + while r.deg >= r_last.deg and r.coefs[0] != 0: + I += 1 + deg_diff = r.deg - r_last.deg + scale = r.coefs[0] * dlt_inv + q += Poly([scale]+[GF(0) for i in range(deg_diff)]) + r += r_last * Poly([scale]+[GF(0) for i in range(deg_diff)]) + q.del_lead_zeros() + r.del_lead_zeros() + + if I > 100: + raise ReedSolomonException("Too long") + + t = (q * t_last).del_lead_zeros() + t_last_last + t.del_lead_zeros() + if r.deg >= r_last.deg: + raise ReedSolomonException("Division algorithm failed to reduce polynomial") + + sigma_tilde_at_zero = t.coefs[-1] + if sigma_tilde_at_zero.val == 0: + raise ReedSolomonException("sigma_tilde(0) was zero") + + inv = Poly([sigma_tilde_at_zero ** GF(-1)]) + sigma = t * inv + omega = r * inv + + return [sigma, omega] + +def find_error_loc(error_loc): + num_errors = error_loc.deg-1 + if num_errors == 1: + return [error_loc.coefs[-2].val] + + result = [0]*num_errors + e = 0 + i = 1 + while i < 256 and e < num_errors: + if error_loc.eval(GF(i)).val == 0: + result[e] = (GF(i) ** GF(-1)).val + e += 1 + + i += 1 + + if e != num_errors: + raise ReedSolomonException("Error locator degree does not match number of roots") + + return result + +def find_error_mag(error_eval, error_loc): + s = len(error_loc) + result = [0]*s + for i in range(s): + xi_inv = GF(error_loc[i]) ** GF(-1) + denom = GF(1) + for j in range(s): + if i != j: + denom *= GF(1) + GF(error_loc[j]) * xi_inv + + result[i] = ( error_eval.eval(xi_inv) * (denom ** GF(-1)) ).val + + return result + +if __name__ == "__main__": + m = Poly([GF(67),GF(111),GF(100),GF(101),GF(115)]) + g = get_generator_poly(4) + print() + print(g) + print(m/g) + print() + + data = [67,111,110,101,115] + #ec = [119,123,82] + ec = [50,166,245,58] + + data = [f"{n:08b}" for n in data] + ec = [f"{n:08b}" for n in ec] + + print(correct(data, ec)) \ No newline at end of file diff --git a/python/latex_gen/version_converter.py b/python/latex_gen/version_converter.py new file mode 100644 index 0000000..79e9724 --- /dev/null +++ b/python/latex_gen/version_converter.py @@ -0,0 +1,78 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +Generates latex table for version capacity information + +(C) 2022 Louis Heredero louis.heredero@edu.vs.ch +""" + +levels = "LMQH" + +start = r"""\def\arraystretch{1.5} +\begin{table}[H] + \centering + \begin{longtabu}{|[2pt]c|c|c:c:c:c|[2pt]} + \tabucline[2pt]{-} + Version & Correction level & Numerical & Alphanumerical & Byte & Kanji \\ + \tabucline[2pt]{-} +""" + +end = r""" \tabucline[2pt]{-} + \end{longtabu} + \caption{Version capacities} + \label{tab:qr_versions} +\end{table} +\def\arraystretch{1} +""" + + +start = r"""\def\arraystretch{1.2} +\begin{center} + \begin{longtabu}{|[2pt]c|c|c:c:c:c|[2pt]} + \caption{Version capacities} + \label{tab:qr_versions}\\ + \tabucline[2pt]{-} + Version & Correction level & Numerical & Alphanumerical & Byte & Kanji \\ + \tabucline[2pt]{-} + \endfirsthead + \multicolumn{6}{r}{\emph{Continued from last page}}\\ + \endhead + \multicolumn{6}{r}{\emph{Continued on next page}}\\ + \endfoot + \tabucline[2pt]{-} + \endlastfoot +""" + +end = r""" \hline + \end{longtabu} +\end{center} +\def\arraystretch{1} +""" + +if __name__ == "__main__": + with open("qr_versions.txt", "r") as f_txt, open("qr_versions.tex", "w") as f_tex: + versions = f_txt.read().split("\n\n") + + f_tex.write(start) + + for i, version in enumerate(versions): + lvls = version.split("\n") + + if i > 0: + f_tex.write(" \\hline\n") + + f_tex.write(f" \\multirow{{4}}{{*}}{{{i+1:2}}}") + #f_tex.write(f" {i+1:2}") + + for j, lvl in enumerate(lvls): + values = " & ".join( + map(lambda s: f"{s:>4}", lvl.split("\t")) + ) + + if j > 0: + f_tex.write(" ") + #f_tex.write(" ") + + f_tex.write(f" & {levels[j]} & {values} \\\\{'*' if j < 3 else ''}\n") + + f_tex.write(end) \ No newline at end of file diff --git a/python/lycacode_gen.py b/python/lycacode_gen.py new file mode 100644 index 0000000..b91070b --- /dev/null +++ b/python/lycacode_gen.py @@ -0,0 +1,284 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +This module can be used to create and display Lycacodes + +(C) 2022 Louis Heredero louis.heredero@edu.vs.ch +""" + +import pygame +import numpy as np +import hamming + +S = 600 + +class LycacodeError(Exception): + pass + +class Lycacode: + RES = 3 + BLOCKSIZE = 7 + + MODE_PERSON = 0 + MODE_LOC = 1 + MODE_LINK = 2 + MODE_TEXT = 3 + + PERSON_STUDENT = 0 + PERSON_TEACHER = 1 + PERSON_OTHER = 2 + + BLACK = (158,17,26) + #BLACK = (0,0,0) + WHITE = (255,255,255) + + OFFSETS = [(0,-1), (1,0), (0,1), (-1,0)] + + MASKS = [ + lambda x, y: x%3 == 0, + lambda x, y: y%3 == 0, + lambda x, y: (x+y)%3 == 0, + lambda x, y: (x%3)*(y%3)==0, + lambda x, y: (y//3+x//3)%2==0, + lambda x, y: (y%3-1)*(x%3-y%3-2)*(y%3-x%3-2)==0, + lambda x, y: (abs(13-x)+abs(13-y))%3==1, + lambda x, y: (1-x%2 + max(0, abs(13-y)-abs(13-x))) * (1-y%2 + max(0,abs(13-x)-abs(13-y))) == 0 + ] + + FRAME = True + CIRCLES = True + DOTS = True + DB_SQUARES = False + + def __init__(self, data, mode): + self.data = data + self.mode = mode + self.encode() + self.create_matrix() + + def encode(self): + self.bits = f"{self.mode:02b}" + + if self.mode == self.MODE_PERSON: + type_ = self.data["type"] + id_ = self.data["id"] + self.bits += f"{type_:02b}" + self.bits += f"{id_:020b}" + + if type_ == self.PERSON_STUDENT: + year = self.data["year"] + class_ = self.data["class"] + self.bits += f"{year:03b}" + self.bits += f"{class_:04b}" + in1, in2 = self.data["initials"] + in1, in2 = ord(in1)-ord("A"), ord(in2)-ord("A") + self.bits += f"{in1:05b}" + self.bits += f"{in2:05b}" + # 83 left + + elif type_ == self.PERSON_TEACHER: + # 100 left + pass + + elif type_ == self.PERSON_OTHER: + # 100 left + pass + + + elif self.mode == self.MODE_LOC: + section = self.data["section"] + room = self.data["room"] + self.bits += f"{section:03b}" + self.bits += f"{room:09b}" + # 106 left + + elif self.mode == self.MODE_LINK: + self.bits += f"{self.data:032b}" + # 86 left + + elif self.mode == self.MODE_TEXT: # max 14 chars + data = self.data.encode("utf-8") + self.bits += f"{len(data):04b}" + self.bits += "".join(list(map(lambda b: f"{b:08b}", data))) + # 2 left + + else: + raise LycacodeError(f"Invalid mode {self.mode}") + + ds = self.BLOCKSIZE-self.BLOCKSIZE.bit_length() + total_bits = (self.RES**2 * 24 - 6) + data_bits = total_bits * ds // self.BLOCKSIZE + self.bits += "0"*(ds-len(self.bits)%ds) + s = "" + i = 0 + left = data_bits-len(self.bits) + while len(s) < left: + s += f"{i:0b}" + i += 1 + s = s[:left] + self.bits += s + self.bits = hamming.encode(self.bits, self.BLOCKSIZE) + + def create_matrix(self): + R = self.RES + self.matrix = np.zeros([R*9, R*9])-1 + self.matrix[R*4:R*5, :] = 0 + self.matrix[:, R*4:R*5] = 0 + self.matrix[R:R*2, R*3:R*6] = 0 + self.matrix[R*3:R*6, R:R*2] = 0 + self.matrix[-R*2:-R, -R*6:-R*3] = 0 + self.matrix[-R*6:-R*3, -R*2:-R] = 0 + + self.matrix[R*4:R*5,R*4:R*5] = -2 + self.matrix[0, R*4:R*5] = -2 # mask + self.matrix[-1, R*4:R*5] = -2 # mask + mask_area = np.where(self.matrix == 0, 1, 0) + self.matrix[R*4, R*4+1:R*5-1] = 1 + self.matrix[R*5-1, R*4] = 1 + self.matrix[R*4+1:R*5-1, R*4+1:R*5-1] = 1 + + bits = list(map(int, self.bits)) + bits = np.reshape(bits, [-1,self.BLOCKSIZE]).T + bits = np.reshape(bits, [-1]).tolist() + + for y in range(R*9): + for x in range(R*9): + if self.matrix[y,x] == 0: + self.matrix[y,x] = bits.pop(0) + + if len(bits) == 0: + break + + if len(bits) == 0: + break + + self.matrix = np.where(self.matrix==-2, 0, self.matrix) + + best = [None, None, None] + for i, mask in enumerate(self.MASKS): + score, matrix = self.evaluate(mask, mask_area) + if best[0] is None or score < best[0]: + best = (score, matrix, i) + + self.matrix = best[1] + id_ = list(map(int, f"{best[2]:03b}")) + self.matrix[0, R*4:R*5] = id_ # mask + self.matrix[-1, R*4:R*5] = id_ # mask + + def evaluate(self, mask, mask_area): + matrix = self.matrix.copy() + for y in range(self.matrix.shape[0]): + for x in range(self.matrix.shape[1]): + if mask_area[y][x] and mask(x,y): + matrix[y][x] = 1-matrix[y][x] + + score = 0 + + # 3 or more of the same color (horizontal) + for y in range(self.matrix.shape[0]): + c = 0 + col = -1 + for x in range(self.matrix.shape[1]): + if matrix[y][x] == -1: continue + if col != matrix[y][x]: + c = 0 + col = matrix[y][x] + c += 1 + if c == 3: + score += 4 + elif c > 3: + score += 2 + + # 3 or more of the same color (vertical) + for x in range(self.matrix.shape[1]): + c = 0 + col = -1 + for y in range(self.matrix.shape[0]): + if matrix[y][x] == -1: continue + if col != matrix[y][x]: + c = 0 + col = matrix[y][x] + c += 1 + if c == 3: + score += 4 + elif c > 3: + score += 2 + + # 2x2 blocks of the same color + for y in range(matrix.shape[0]-1): + for x in range(matrix.shape[1]-1): + if matrix[y][x] == -1: continue + zone = matrix[y:y+2, x:x+2] + if np.all(zone == zone[0,0]): + score += 2 + + # more dots/1s => higher score + total = matrix.shape[0]*matrix.shape[1] + dots = np.sum(matrix == 1) + percent = 100*dots//total + score += percent//5 * 2 + + return score, matrix + + def display(self, surf): + R = self.RES + S = min(surf.get_size()) + s = int(S/12/R)*R + O = (S-s*9)/2 + + surf.fill(self.WHITE) + + # Frame + if self.FRAME: + pygame.draw.rect(surf, self.BLACK, [O-s, O-s, s*11, s*11]) + pygame.draw.rect(surf, self.WHITE, [O-s*0.5, O-s*0.5, s*10, s*10]) + + # Cross + for i in range(4): + dx, dy = self.OFFSETS[i] + X, Y = S/2 + dx*s*3, S/2 + dy*s*3 + if self.CIRCLES: + for j in range(3): + dx2, dy2 = self.OFFSETS[(i+j-1)%4] + pygame.draw.circle(surf, self.BLACK, [X+dx2*s, Y+dy2*s], 0.75*s) + + pygame.draw.rect(surf, self.BLACK, [X-(1.5-abs(dx))*s, Y-(1.5-abs(dy))*s, s*(3-abs(dx)*2), s*(3-abs(dy)*2)]) + + pygame.draw.rect(surf, self.BLACK, [O, S/2-s/2, 9*s, s]) + pygame.draw.rect(surf, self.BLACK, [S/2-s/2, O, s, 9*s]) + + # Dots + if self.DOTS: + for y in range(R*9): + for x in range(R*9): + if self.matrix[y, x] == 1: + pygame.draw.circle(surf, self.WHITE, [O+(x+0.5)*s/R, O+(y+0.5)*s/R], s/R/3) + + if self.DB_SQUARES: + for y in range(9): + for x in range(9): + if self.matrix[y*R, x*R] != -1: + pygame.draw.rect(surf, (0,0,0), [O+x*s, O+y*s, s+1, s+1], 2) + +if __name__ == "__main__": + import base + + b = base.Base(S, S, "Lycacode generator") + + code = Lycacode({ + "type": Lycacode.PERSON_STUDENT, + "id": 16048, + "year": 5, + "class": 3, + "initials": "LH" + }, Lycacode.MODE_PERSON) + + #code = Lycacode("Embarquement12", Lycacode.MODE_TEXT) + """code = Lycacode({ + "section": 4, + "room": 209 + }, Lycacode.MODE_LOC)""" + #code = Lycacode(1, Lycacode.MODE_LINK) + code.display(b.w) + + b.main() diff --git a/python/lycacode_gen_mini.py b/python/lycacode_gen_mini.py new file mode 100644 index 0000000..6483a11 --- /dev/null +++ b/python/lycacode_gen_mini.py @@ -0,0 +1,164 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +This module can be used to create and display Mini-Lycacodes + +(C) 2022 Louis Heredero louis.heredero@edu.vs.ch +""" + +import pygame +import numpy as np +import hamming + +S = 600 + +class LycacodeError(Exception): + pass + +class LycacodeMini: + BLACK = (158,17,26) + #BLACK = (0,0,0) + WHITE = (255,255,255) + + OFFSETS = [(0,-1), (1,0), (0,1), (-1,0)] + + FRAME = True + CIRCLES = True + DOTS = True + DB_SQUARES = False + + def __init__(self, id_): + self.id = id_ + self.encode() + self.create_matrix() + + def encode(self): + self.bits = f"{self.id:020b}" + + self.bits = list(map(int, self.bits)) + parity = [sum(self.bits[i*5:i*5+5])%2 for i in range(4)] + for i in range(4): + self.bits.insert((4-i)*5, parity[3-i]) + + + def create_matrix(self): + self.matrix = np.zeros([9, 9])-1 + self.matrix[4:5, :] = 0 + self.matrix[:, 4:5] = 0 + self.matrix[1:2, 3:6] = 0 + self.matrix[3:6, 1:2] = 0 + self.matrix[-2:-1, -6:-3] = 0 + self.matrix[-6:-3, -2:-1] = 0 + self.matrix[4,4] = -1 + + for y in range(9): + for x in range(9): + if self.matrix[y,x] == 0: + self.matrix[y,x] = self.bits.pop(0) + + if len(self.bits) == 0: + break + + if len(self.bits) == 0: + break + + def display(self, surf): + S = min(surf.get_size()) + s = int(S/12/3)*3 + O = (S-s*9)/2 + + surf.fill(self.WHITE) + + # Frame + if self.FRAME: + pygame.draw.rect(surf, self.BLACK, [O-s, O-s, s*11, s*11]) + pygame.draw.rect(surf, self.WHITE, [O-s*0.5, O-s*0.5, s*10, s*10]) + + # Cross + for i in range(4): + dx, dy = self.OFFSETS[i] + X, Y = S/2 + dx*s*3, S/2 + dy*s*3 + if self.CIRCLES: + for j in range(3): + dx2, dy2 = self.OFFSETS[(i+j-1)%4] + pygame.draw.circle(surf, self.BLACK, [X+dx2*s, Y+dy2*s], 0.75*s) + + pygame.draw.rect(surf, self.BLACK, [X-(1.5-abs(dx))*s, Y-(1.5-abs(dy))*s, s*(3-abs(dx)*2), s*(3-abs(dy)*2)]) + + pygame.draw.rect(surf, self.BLACK, [O, S/2-s/2, 9*s, s]) + pygame.draw.rect(surf, self.BLACK, [S/2-s/2, O, s, 9*s]) + + # Dots + if self.DOTS: + for y in range(9): + for x in range(9): + if self.matrix[y, x] == 1: + pygame.draw.circle(surf, self.WHITE, [O+(x+0.5)*s, O+(y+0.5)*s], s/3) + + # Center + pygame.draw.circle(surf, self.WHITE, [O+4.5*s, O+4.25*s], s/6) + pygame.draw.circle(surf, self.WHITE, [O+4.25*s, O+4.75*s], s/6) + + def save(self, path): + S = 600 + s = int(S/12) + O = (S-s*9)/2 + + BLACK = "#9E111A" + WHITE = "#FFFFFF" + + with open(path, "w") as f: + f.write(f"\n") + # Background + f.write(f"\n") + + # Frame + f.write(f"\n") + + # Cross + for i in range(4): + dx, dy = self.OFFSETS[i] + X, Y = S/2 + dx*s*3, S/2 + dy*s*3 + if self.CIRCLES: + for j in range(3): + dx2, dy2 = self.OFFSETS[(i+j-1)%4] + f.write(f"\n") + + f.write(f"\n") + + # Cross + f.write(f"\n") + f.write(f"\n") + + # Dots + if self.DOTS: + for y in range(9): + for x in range(9): + if self.matrix[y, x] == 1: + f.write(f"\n") + + # Center + f.write(f"\n") + f.write(f"\n") + + f.write("") + +def save(self): + path = input("Save as (.png or .svg): ") + + if path.endswith(".svg"): + code.save(path) + + else: + pygame.image.save(w, path) + +if __name__ == "__main__": + import base + + b = base.Base(S, S, "Mini-Lycacode generator") + + code = LycacodeMini(16048) + code.display(b.w) + + b.save = save + b.main() \ No newline at end of file diff --git a/python/lycacode_scanner.py b/python/lycacode_scanner.py new file mode 100644 index 0000000..3f176c3 --- /dev/null +++ b/python/lycacode_scanner.py @@ -0,0 +1,296 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +This module can be used to scan Lycacodes + +(C) 2022 Louis Heredero louis.heredero@edu.vs.ch +""" + +import cv2 +import numpy as np +from math import sqrt +import hamming + +DB_WIN = True +TOL_CNT_DIST = 20 +R = 3 + +MASKS = [ + lambda x, y: x%3 == 0, + lambda x, y: y%3 == 0, + lambda x, y: (x+y)%3 == 0, + lambda x, y: (x%3)*(y%3)==0, + lambda x, y: (y//3+x//3)%2==0, + lambda x, y: (y%3-1)*(x%3-y%3-2)*(y%3-x%3-2)==0, + lambda x, y: (abs(13-x)+abs(13-y))%3==1, + lambda x, y: (1-x%2 + max(0, abs(13-y)-abs(13-x))) * (1-y%2 + max(0,abs(13-x)-abs(13-y))) == 0 +] + +def center(c): + M = cv2.moments(c) + + if M["m00"] != 0: + cX = int(M["m10"] / M["m00"]) + cY = int(M["m01"] / M["m00"]) + return (cX, cY) + + return (None, None) + +def dist(p1, p2): + return sqrt((p2[0]-p1[0])**2 + (p2[1]-p1[1])**2) + +def is_symbol(i, cnts, hrcy): + c1 = cnts[i] + h1 = hrcy[0][i] + cX1, cY1 = center(c1) + if len(c1) != 4: + return False + + if cX1 is None: + return False + + if h1[2] == -1: + return False + + i2 = h1[2] + c2 = cnts[i2] + h2 = hrcy[0][i2] + cX2, cY2 = center(c2) + if cX2 is None: + return False + + if len(c2) != 8: + return False + + if abs(dist((cX1, cY1), (cX2, cY2))) > TOL_CNT_DIST: + return False + + return True + +def decode(img): + grey = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) + grey = cv2.GaussianBlur(grey, (5,5), 0) + #if DB_WIN: cv2.imshow("grey", grey) + + #bw = cv2.threshold(grey, np.mean(grey), 255, cv2.THRESH_BINARY)[1] + #bw = cv2.adaptiveThreshold(grey, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 5, 0) + bw = cv2.threshold(grey, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)[1] + if DB_WIN: cv2.imshow("bw", bw) + + #laplacian = cv2.Laplacian(bw, cv2.CV_8U, 15) + #cv2.imshow("laplacian", laplacian) + + contours, hierarchy = cv2.findContours(bw, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE) + if DB_WIN: + img2 = img.copy() + cv2.drawContours(img2, contours, -1, (0,255,0), 1) + + candidates = [] + + contours = list(contours) + for i, cnt in enumerate(contours): + peri = cv2.arcLength(cnt, True) + contours[i] = cv2.approxPolyDP(cnt, 0.04 * peri, True) + + for i in range(len(contours)): + if is_symbol(i, contours, hierarchy): + candidates.append(i) + + if DB_WIN: + for i in candidates: + cv2.drawContours(img2, contours, i, (0,0,255), 1) + cv2.drawContours(img2, contours, hierarchy[0][i][2], (0,0,255), 1) + + cv2.imshow("contours", img2) + + if DB_WIN: + img3 = img.copy() + cv2.drawContours(img3, contours, -1, (0,0,255), 1) + cv2.imshow("contours-all", img3) + + if len(candidates) == 0: + return + + for i in candidates: + i = candidates[0] + j = hierarchy[0][i][2] + cnt1, cnt2 = contours[i][::-1], contours[j] + + from_ = [ cnt1[0], cnt1[1], cnt1[2], cnt1[3] ] + to = [ (0,0), (320,0), (320,320), (0,320) ] + + M = cv2.getPerspectiveTransform(np.array(from_, dtype="float32"), np.array(to, dtype="float32")) + #_ = cv2.dilate(bw, (11,11)) + #warped = cv2.warpPerspective(_, M, (320,320)) + warped = cv2.warpPerspective(bw, M, (320,320)) + + + if DB_WIN: + cv2.imshow("warped", warped) + + s = 320/10/R + matrix = np.zeros([R*9, R*9])-1 + matrix[R*4:R*5, 0:] = 0 + matrix[0:, R*4:R*5] = 0 + matrix[R:R*2, R*3:R*6] = 0 + matrix[R*3:R*6, R:R*2] = 0 + matrix[-R*2:-R, -R*6:-R*3] = 0 + matrix[-R*6:-R*3, -R*2:-R] = 0 + + dots = warped.copy() + dots = cv2.cvtColor(dots, cv2.COLOR_GRAY2BGR) + for y in range(R*9): + cv2.line(dots, (0, int(s*R/2+(y+1)*s)), (320, int(s*R/2+(y+1)*s)), (0,255,0), 1) + cv2.line(dots, (int(s*R/2+(y+1)*s), 0), (int(s*R/2+(y+1)*s), 320), (0,255,0), 1) + for x in range(R*9): + if matrix[y, x] == 0: + X, Y = (x+R/2)*s, (y+R/2)*s + val = np.mean(warped[int(Y+s/2)-1:int(Y+s/2)+2, int(X+s/2)-1:int(X+s/2)+2]) + matrix[y, x] = int(round(val/255)) + cv2.circle(dots, (int(Y+s/2), int(X+s/2)), 2, (0,0,255), 1) + + if DB_WIN: + cv2.imshow("dots", dots) + + v = _decode(matrix) + if not v is None: + return v + + return None + #return _decode(matrix) + +def _decode(matrix): + OFFSETS = [[(1,0), (R-1,1)], [(R-1,1), (R,R-1)], [(1,R-1), (R-1,R)], [(0,1), (1,R-1)]] + I = None + for i in range(4): + s, e = OFFSETS[i] + dx1, dy1 = s + dx2, dy2 = e + # Find top + if (matrix[R*4+dy1:R*4+dy2, R*4+dx1:R*4+dx2] == 1).all(): + I = i + + + if I is None: + return + + # Put top on top + matrix = np.rot90(matrix, I) + + # If left on right, flip + if matrix[R*5-1, R*5-1] == 1: + matrix = np.fliplr(matrix) + + # If not left on left -> problem + elif matrix[R*5-1, R*4] != 1: + return + + matrix[R*4:R*5, R*4:R*5] = -1 + + mask_i = "".join([str(int(b)) for b in matrix[0, R*4:R*5]]) + mask_i = int(mask_i, 2) + matrix[0, R*4:R*5] = -1 + matrix[-1, R*4:R*5] = -1 + + for y in range(R*9): + for x in range(R*9): + if MASKS[mask_i](x,y) and matrix[y][x] != -1: + matrix[y][x] = 1-matrix[y][x] + + if DB_WIN: + img = ((matrix+2)%3)/2*255 + cv2.namedWindow("matrix", cv2.WINDOW_NORMAL) + cv2.imshow("matrix", np.array(img, dtype="uint8")) + + bits = [] + for y in range(R*9): + for x in range(R*9): + if matrix[y, x] != -1: + bits.append(int(matrix[y,x])) + + bits = np.reshape(bits, [-1, int(len(bits)/7)]).T + bits = np.reshape(np.array(bits), [-1]) + bits = "".join(list(map(str, bits))) + + data, errors = hamming.decode(bits, 7) + if errors > 6: + return + + mode, data = int(data[:2],2), data[2:] + + if mode == 0: + person = {} + type_, data = int(data[:2],2), data[2:] + id_, data = int(data[:20],2), data[20:] + + person["type"] = type_ + person["id"] = id_ + + # Student + if type_ == 0: + year, data = int(data[:3],2), data[3:] + class_, data = int(data[:4],2), data[4:] + person["year"] = year + person["class"] = class_ + + in1, in2, data = int(data[:5],2), int(data[5:10],2), data[10:] + in1, in2 = chr(in1+ord("A")), chr(in2+ord("A")) + + person["initials"] = in1+in2 + + # Teacher + elif type_ == 1: + pass + + # Other + elif type_ == 2: + pass + + else: + print(f"Invalid person type {type_}") + + data = person + + elif mode == 1: + loc = {} + section, data = int(data[:3],2), data[3:] + room, data = int(data[:9],2), data[9:] + + loc["section"] = section + loc["room"] = room + data = loc + + elif mode == 2: + data = int(data[:32],2) + + elif mode == 3: + length, data = int(data[:4],2), data[4:] + if length*8 > len(data): return + + data = bytes([int(data[i*8:i*8+8],2) for i in range(length)]) + try: + data = data.decode("utf-8") + + except UnicodeDecodeError: + return + + else: + #raise LycacodeError(f"Invalid mode {self.mode}") + print(f"Invalid mode {self.mode}") + return + + return data + +if __name__ == "__main__": + np.set_printoptions(linewidth=200) + cam = cv2.VideoCapture(0) + while True: + ret, img = cam.read() + + data = decode(img) + + if not data is None: + print(data) + + cv2.imshow("src", img) + cv2.waitKey(1) diff --git a/python/lycacode_scanner_mini.py b/python/lycacode_scanner_mini.py new file mode 100644 index 0000000..70c23e0 --- /dev/null +++ b/python/lycacode_scanner_mini.py @@ -0,0 +1,207 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +This module can be used to scan Mini-Lycacodes + +(C) 2022 Louis Heredero louis.heredero@edu.vs.ch +""" + +import cv2 +import numpy as np +from math import sqrt +import hamming + +DB_WIN = False +TOL_CNT_DIST = 20 + +def center(c): + M = cv2.moments(c) + + if M["m00"] != 0: + cX = int(M["m10"] / M["m00"]) + cY = int(M["m01"] / M["m00"]) + return (cX, cY) + + return (None, None) + +def dist(p1, p2): + return sqrt((p2[0]-p1[0])**2 + (p2[1]-p1[1])**2) + +def is_symbol(i, cnts, hrcy): + c1 = cnts[i] + h1 = hrcy[0][i] + cX1, cY1 = center(c1) + if len(c1) != 4: + return False + + if cX1 is None: + return False + + if h1[2] == -1: + return False + + i2 = h1[2] + c2 = cnts[i2] + h2 = hrcy[0][i2] + cX2, cY2 = center(c2) + if cX2 is None: + return False + + if len(c2) != 8: + return False + + if abs(dist((cX1, cY1), (cX2, cY2))) > TOL_CNT_DIST: + return False + + return True + +def decode(img): + #grey = img[:,:,2] + grey = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) + #grey = cv2.GaussianBlur(grey, (5,5), 0) + #if DB_WIN: cv2.imshow("grey", grey) + + #bw = cv2.threshold(grey, np.mean(grey), 255, cv2.THRESH_BINARY)[1] + bw = cv2.threshold(grey, 127, 255, cv2.THRESH_BINARY)[1] + #bw = cv2.adaptiveThreshold(grey, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 5, 0) + #bw = cv2.threshold(grey, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)[1] + if DB_WIN: cv2.imshow("bw", bw) + + #laplacian = cv2.Laplacian(bw, cv2.CV_8U, 15) + #cv2.imshow("laplacian", laplacian) + + contours, hierarchy = cv2.findContours(bw, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE) + if DB_WIN: + img2 = img.copy() + cv2.drawContours(img2, contours, -1, (0,255,0), 1) + + candidates = [] + + contours = list(contours) + for i, cnt in enumerate(contours): + peri = cv2.arcLength(cnt, True) + contours[i] = cv2.approxPolyDP(cnt, 0.04 * peri, True) + + for i in range(len(contours)): + if is_symbol(i, contours, hierarchy): + candidates.append(i) + + if DB_WIN: + for i in candidates: + cv2.drawContours(img2, contours, i, (0,0,255), 1) + cv2.drawContours(img2, contours, hierarchy[0][i][2], (0,0,255), 1) + + cv2.imshow("contours", img2) + + if DB_WIN: + img3 = img.copy() + cv2.drawContours(img3, contours, -1, (0,0,255), 1) + cv2.imshow("contours-all", img3) + + if len(candidates) == 0: + return + + for i in candidates: + i = candidates[0] + j = hierarchy[0][i][2] + cnt1, cnt2 = contours[i][::-1], contours[j] + + from_ = [ cnt1[0], cnt1[1], cnt1[2], cnt1[3] ] + to = [ (0,0), (320,0), (320,320), (0,320) ] + + M = cv2.getPerspectiveTransform(np.array(from_, dtype="float32"), np.array(to, dtype="float32")) + #_ = cv2.dilate(bw, (11,11)) + #warped = cv2.warpPerspective(_, M, (320,320)) + warped = cv2.warpPerspective(bw, M, (320,320)) + + + if DB_WIN: + cv2.imshow("warped", warped) + + s = 320/10 + matrix = np.zeros([9, 9])-1 + matrix[4:5, 0:] = 0 + matrix[0:, 4:5] = 0 + matrix[1:2, 3:6] = 0 + matrix[3:6, 1:2] = 0 + matrix[-2:-1, -6:-3] = 0 + matrix[-6:-3, -2:-1] = 0 + + dots = warped.copy() + dots = cv2.cvtColor(dots, cv2.COLOR_GRAY2BGR) + for y in range(9): + cv2.line(dots, (0, int(s/2+(y+1)*s)), (320, int(s/2+(y+1)*s)), (0,255,0), 1) + cv2.line(dots, (int(s/2+(y+1)*s), 0), (int(s/2+(y+1)*s), 320), (0,255,0), 1) + for x in range(9): + if matrix[y, x] == 0: + X, Y = (x+0.5)*s, (y+0.5)*s + val = np.mean(warped[int(Y+s/2)-1:int(Y+s/2)+2, int(X+s/2)-1:int(X+s/2)+2]) + matrix[y, x] = int(round(val/255)) + cv2.circle(dots, (int(Y+s/2), int(X+s/2)), 2, (0,0,255), 1) + + OFFSETS = [(0,-1),(1,0),(0,1),(-1,0)] + I = None + for i in range(4): + dx, dy = OFFSETS[i] + X, Y = 320/2+dx*s/3, 320/2+dy*s/3 + cv2.circle(dots, (int(Y), int(X)), 2, (0,255,255), 1) + if np.mean(warped[int(Y)-1:int(Y)+2, int(X)-1:int(X)+2]) > 127: + I = i + + if I is None: + continue + matrix = np.rot90(matrix, I) + + dx, dy = [(1,1), (-1, 1), (-1,-1), (1,-1)][I] + X, Y = 320/2+dx*s/3, 320/2+dy*s/3 + + if np.mean(warped[int(Y)-1:int(Y)+2, int(X)-1:int(X)+2]) > 127: + matrix = np.fliplr(matrix) + + if DB_WIN: + cv2.imshow("dots", dots) + + v = _decode(matrix) + if not v is None: + return v + + return None + #return _decode(matrix) + +def _decode(matrix): + matrix[4:5, 4:5] = -1 + + if DB_WIN: + img = ((matrix+2)%3)/2*255 + cv2.namedWindow("matrix", cv2.WINDOW_NORMAL) + cv2.imshow("matrix", np.array(img, dtype="uint8")) + + bits = [] + for y in range(9): + for x in range(9): + if matrix[y, x] != -1: + bits.append(int(matrix[y,x])) + + for i in range(4): + if sum(bits[i*6:i*6+6])%2: + return + + data = "".join(list(map(str, bits))) + + id_ = int(data[0:5]+data[6:11]+data[12:17]+data[18:23],2) + + return id_ + +if __name__ == "__main__": + np.set_printoptions(linewidth=200) + cam = cv2.VideoCapture(0) + while True: + ret, img = cam.read() + + data = decode(img) + + if not data is None: + print(data) + + cv2.imshow("src", img) + cv2.waitKey(10) diff --git a/python/qr_generator.py b/python/qr_generator.py new file mode 100644 index 0000000..f64692a --- /dev/null +++ b/python/qr_generator.py @@ -0,0 +1,891 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +import numpy as np +import pygame +import time +import sys + +S_EMPTY = 1 +S_SEP = 2 +S_FINDER = 4 +S_ALIGN = 8 +S_TIMING = 16 +S_RESERVED = 32 +S_DATA = 64 +S_BYTES = 128 +S_MASK = 256 + +STEPS = S_MASK|S_DATA|S_BYTES|S_RESERVED|S_ALIGN|S_TIMING|S_FINDER|S_SEP|S_EMPTY +#STEPS = S_MASK|S_RESERVED|S_ALIGN|S_TIMING|S_FINDER|S_EMPTY +#STEPS = 0 +#STEPS = S_MASK|S_DATA + +pygame.init() +font = pygame.font.SysFont("ubuntu", 16) +win = None +coords = True # turn on coordinates + +def log(msg): + print(f"<[---]> {msg} <[---]>") + +class GF: + """Galois field element""" + + def __init__(self, val): + self.val = val + + def copy(self): + return GF(self.val) + + # Addition + def __add__(self, n): + return GF(self.val ^ n.val) + + # Subtraction + def __sub__(self, n): + return GF(self.val ^ n.val) + + # Multiplication + def __mul__(self, n): + if self.val == 0 or n.val == 0: + return GF(0) + + return GF.EXP[GF.LOG[self.val].val + GF.LOG[n.val].val].copy() + + # Division + def __truediv__(self, n): + if n.val == 0: + raise ZeroDivisionError + if self.val == 0: + return GF(0) + + return GF.EXP[(GF.LOG[self.val].val + 255 - GF.LOG[n.val].val)%255].copy() + + # Power + def __pow__(self, n): + return GF.EXP[(GF.LOG[self.val].val * n.val)%255].copy() + + # Representation -> string + def __repr__(self): + return self.val.__repr__() + +# Compute exponents and logs for all element of the Galois field +GF.EXP = [GF(0)]*512 +GF.LOG = [GF(0)]*256 +value = 1 +for exponent in range(255): + GF.LOG[value] = GF(exponent) + GF.EXP[exponent] = GF(value) + value = ((value << 1) ^ 285) if value > 127 else value << 1 + +for i in range(255, 512): + GF.EXP[i] = GF.EXP[i-255].copy() + + +class Poly: + """ + Polynomial + + Coefficients are in the order of largest to lowest degree: + ax^2 + bx + c -> coefs = [a, b, c] + """ + + def __init__(self, coefs): + self.coefs = coefs.copy() + + @property + def deg(self): + return len(self.coefs) + + def copy(self): + return Poly(self.coefs) + + # Addition + def __add__(self, p): + d1, d2 = self.deg, p.deg + deg = max(d1,d2) + result = [GF(0) for i in range(deg)] + + for i in range(d1): + result[i + deg - d1] = self.coefs[i] + + for i in range(d2): + result[i + deg - d2] += p.coefs[i] + + return Poly(result) + + # Multiplication + def __mul__(self, p): + result = [GF(0) for i in range(self.deg+p.deg-1)] + + for i in range(p.deg): + for j in range(self.deg): + result[i+j] += self.coefs[j] * p.coefs[i] + + return Poly(result) + + # Division + def __truediv__(self, p): + dividend = self.coefs.copy() + dividend += [GF(0) for i in range(p.deg-1)] + quotient = [] + + for i in range(self.deg): + coef = dividend[i] / p.coefs[0] + quotient.append(coef) + + for j in range(p.deg): + dividend[i+j] -= p.coefs[j] * coef + + while dividend[0].val == 0: + dividend.pop(0) + + return [Poly(quotient), Poly(dividend)] + + # Representation -> string + def __repr__(self): + return f"" + +# Inspired by nayuki's Creating a QR Code step by step +# bibtex key: nayuki_qr_js +# https://github.com/nayuki/Nayuki-web-published-code/blob/dfb110475327271e3b7279a432e2d1a1298815ad/creating-a-qr-code-step-by-step/creating-qr-code-steps.js +class History: + """Widths history for mask evaluation, crit. 3""" + + def __init__(self): + self.widths = [0]*7 + self.widths[-1] = 4 + self.colors = [0]*4 + self.color = 0 + + # Add module to history, returns number of patterns found + def add(self, col): + s = 0 + self.colors.append(col) + if col != self.color: + self.color = col + s = self.check() + self.widths.pop(0) + self.colors = self.colors[-sum(self.widths)-1:] + self.widths.append(0) + + self.widths[-1] += 1 + return s + + # Check for patterns in the history + def check(self): + n = self.widths[1] + + # Only black on white + if self.colors[self.widths[0]] != 1: return 0 + + # if 1:1:3:1:1 + if n > 0 and self.widths[2] == n and self.widths[3] == n*3 and self.widths[4] == n and self.widths[5] == n: + # check if 4:1:1:3:1:1 + check if 1:1:3:1:1:4 + return int(self.widths[0] >= 4) + int(self.widths[6] >= 4) + + return 0 + + # Final check + def final(self): + for i in range(4): + self.add(0) + + return self.check() + +class QR: + TYPES = ["numeric", "alphanumeric", "byte", "kanji", "?"] + LEVELS = ["L","M","Q","H", "?"] + MODES = ["0001", "0010", "0100", "1000"] + ALPHANUM = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:" + VERSIONS = [] + ERROR_CORRECTION = [] + FINDER = ["1111111","1000001","1011101","1011101","1011101","1000001","1111111"] + FINDER = np.array([list(map(int, _)) for _ in FINDER]) + + ALIGNMENT_PATTERN_LOCATIONS = [ + [], + [6, 18], + [6, 22], + [6, 26], + [6, 30], + [6, 34], + [6, 22, 38], + [6, 24, 42], + [6, 26, 46], + [6, 28, 50], + [6, 30, 54], + [6, 32, 58], + [6, 34, 62], + [6, 26, 46, 66], + [6, 26, 48, 70], + [6, 26, 50, 74], + [6, 30, 54, 78], + [6, 30, 56, 82], + [6, 30, 58, 86], + [6, 34, 62, 90], + [6, 28, 50, 72, 94], + [6, 26, 50, 74, 98], + [6, 30, 54, 78, 102], + [6, 28, 54, 80, 106], + [6, 32, 58, 84, 110], + [6, 30, 58, 86, 114], + [6, 34, 62, 90, 118], + [6, 26, 50, 74, 98, 122], + [6, 30, 54, 78, 102, 126], + [6, 26, 52, 78, 104, 130], + [6, 30, 56, 82, 108, 134], + [6, 34, 60, 86, 112, 138], + [6, 30, 58, 86, 114, 142], + [6, 34, 62, 90, 118, 146], + [6, 30, 54, 78, 102, 126, 150], + [6, 24, 50, 76, 102, 128, 154], + [6, 28, 54, 80, 106, 132, 158], + [6, 32, 58, 84, 110, 136, 162], + [6, 26, 54, 82, 110, 138, 166], + [6, 30, 58, 86, 114, 142, 170] + ] + + MASKS = [ + lambda x,y: (x+y)%2 == 0, + lambda x,y: y%2 == 0, + lambda x,y: (x)%3 == 0, + lambda x,y: (x+y)%3 == 0, + lambda x,y: (y//2+x//3)%2 == 0, + lambda x,y: ((x*y)%2 + (x*y)%3) == 0, + lambda x,y: ((x*y)%2 + (x*y)%3)%2 == 0, + lambda x,y: ((x+y)%2 + (x*y)%3)%2 == 0 + ] + + def __init__(self, data, level=0): + pygame.display.set_caption("QR Gen - Init") + log(f"Content: {data}") + log(f"EC Level: {self.LEVELS[level]}") + self.bits = "" + self.data = data + self.level = level + self.type = -1 + self.version = -1 + self.analyse_type() + self.compute_version() + self.build_char_count_indicator() + self.encode() + self.separate_codewords() + self.create_matrix() + + def load_versions(): + with open("qr_versions.txt", "r") as f: + versions = f.read().split("\n\n") + for v in versions: + lvls = [list(map(int, lvl.split("\t"))) for lvl in v.split("\n")] + QR.VERSIONS.append(lvls) + + QR.VERSIONS = np.array(QR.VERSIONS) + + def load_ec(): + with open("error_correction.txt", "r") as f: + ecs = f.read().split("\n\n") + for ec in ecs: + lvls = [list(map(int, lvl.split("\t"))) for lvl in ec.split("\n")] + lvls = [lvl + [0]*(6-len(lvl)) for lvl in lvls] + + QR.ERROR_CORRECTION.append(lvls) + + QR.ERROR_CORRECTION = np.array(QR.ERROR_CORRECTION) + + def __repr__(self): + return "".format( + QR.LEVELS[self.level], + QR.TYPES[self.type].title(), + "?" if self.version == -1 else self.version+1 + ) + + def analyse_type(self): + pygame.display.set_caption("QR Gen - Type analysis") + if self.data.isnumeric(): + self.type = 0 + + elif set(self.data).issubset(set(QR.ALPHANUM)): + self.type = 1 + + else: + try: + self.data.encode("ISO-8859-1") + self.type = 2 + + except: + self.type = 3 + + self.bits += self.MODES[self.type] + log(f"Type: {self.TYPES[self.type]}") + + def compute_version(self): + pygame.display.set_caption("QR Gen - Version computation") + self.version = min(np.where(QR.VERSIONS[:, self.level, self.type] >= len(self.data))[0]) + log(f"Version: {self.version+1}") + + def get_char_count_len(self): + if 0 <= self.version < 9: + return [10,9,8,8][self.type] + elif 9 <= self.version < 26: + return [12,11,16,10][self.type] + elif 26 <= self.version < 40: + return [14,13,16,12][self.type] + + def build_char_count_indicator(self): + pygame.display.set_caption("QR Gen - Char count ind") + length = self.get_char_count_len() + indicator = f"{{:0{length}b}}".format(len(self.data)) + self.bits += indicator + log(f"Char count indicator: {indicator}") + + def encode(self): + pygame.display.set_caption("QR Gen - Encoding") + if self.type == 0: + groups = [self.data[i:i+3] for i in range(0,len(self.data),3)] + + for group in groups: + group = int(group) + sgroup = str(group) + + if len(sgroup) == 3: + s = "{:010b}" + elif len(sgroup) == 2: + s = "{:07b}" + else: + s = "{:04b}" + + self.bits += s.format(group) + + elif self.type == 1: + data = self.data + last = None + if len(data)%2 == 1: + last = data[-1] + data = data[:-1] + + for i in range(0, len(data), 2): + val1 = self.ALPHANUM.index(data[i]) + val2 = self.ALPHANUM.index(data[i+1]) + val = val1*45 + val2 + self.bits += f"{val:011b}" + + if not last is None: + self.bits += "{:06b}".format(self.ALPHANUM.index(last)) + + elif self.type == 2: + data = self.data.encode("ISO-8859-1") + self.bits += "".join(list(map("{:08b}".format, data))) + + elif self.type == 3: + data = list(self.data.encode("shift_jis")) + + #Combine double bytes + data = [data[i*2]<<8 | data[i*2+1] for i in range(len(data)//2)] + + for dbyte in data: + if 0x8140 <= dbyte <= 0x9ffc: + dbyte = dbyte - 0x8140 + + elif 0xe040 <= dbyte <= 0xebbf: + dbyte = dbyte - 0xc140 + + msb = dbyte >> 8 + lsb = dbyte & 0xff + + val = msb * 0xc0 + lsb + self.bits += f"{val:013b}" + + log(f"Encoded: {[self.bits[i:i+8] for i in range(0,len(self.bits),8)]}") + + ec = self.ERROR_CORRECTION[self.version, self.level] + req_bits = ec[0]*8 + + #Terminator + self.bits += "0"*(min(4, req_bits-len(self.bits))) + + #Pad to multiple of 8 + if len(self.bits) % 8 != 0: + self.bits += "0"*(8-len(self.bits)%8) + + #Pad to required bits + if len(self.bits) < req_bits: + for i in range((req_bits-len(self.bits))//8): + self.bits += ["11101100","00010001"][i%2] + + log(f"Padded: {[self.bits[i:i+8] for i in range(0,len(self.bits),8)]}") + + def separate_codewords(self): + pygame.display.set_caption("QR Gen - Separating codewords") + ec = self.ERROR_CORRECTION[self.version, self.level] + blocks = [] + ec_codewords = [] + + codeword = 0 + gen_poly = self.get_generator_poly(ec[1]) + log(f"Gen poly: {gen_poly}") + + #print(self.bits) + for i in range(ec[2]): + block = [] + for j in range(ec[3]): + block.append(self.bits[codeword*8:codeword*8+8]) + codeword += 1 + + blocks.append(block) + msg_poly = Poly(list(map(lambda b: GF(int(b,2)), block))) + log(f"Msg poly (1-{i}): {msg_poly}") + + quotient, remainder = msg_poly / gen_poly + log(f"EC poly (1-{i}): {remainder}") + ec_cwds = [f"{c.val:08b}" for c in remainder.coefs] + ec_codewords.append(ec_cwds) + + #If group 2 + if ec[4] != 0: + for i in range(ec[4]): + block = [] + for j in range(ec[5]): + block.append(self.bits[codeword*8:codeword*8+8]) + codeword += 1 + + blocks.append(block) + msg_poly = Poly(list(map(lambda b: GF(int(b,2)), block))) + log(f"Msg poly (2-{i}): {msg_poly}") + + quotient, remainder = msg_poly / gen_poly + log(f"EC poly (2-{i}): {remainder}") + ec_cwds = [f"{c.val:08b}" for c in remainder.coefs] + ec_codewords.append(ec_cwds) + + self.final_data_bits = "" + + if len(blocks) == 1: + dbits = "".join(["".join(block) for block in blocks]) + ec_bits = "".join(["".join(cwd) for cwd in ec_codewords]) + log(f"EC bits: {[ec_bits[i:i+8] for i in range(0,len(ec_bits),8)]}") + self.final_data_bits = dbits + ec_bits + + else: + #Interleave data codewords + for i in range(max(ec[3], ec[5])): + for block in blocks: + if i < len(block): + self.final_data_bits += block[i] + + #Interleave error correction codewords + for i in range(ec[1]): + for block in ec_codewords: + self.final_data_bits += block[i] + + #Add remainder bits + if 1 <= self.version < 6: + self.final_data_bits += "0"*7 + log(f"Add 7 remainder bits") + + elif 13 <= self.version < 20 or 27 <= self.version < 34: + self.final_data_bits += "0"*3 + log(f"Add 3 remainder bits") + + elif 20 <= self.version < 27: + self.final_data_bits += "0"*4 + log(f"Add 4 remainder bits") + + print_bytes(self.final_data_bits) + + def get_generator_poly(self, n): + poly = Poly([GF(1)]) + + for i in range(n): + poly *= Poly([GF(1), GF(2)**GF(i)]) + + return poly + + def get_alignment_pattern_locations(self): + return QR.ALIGNMENT_PATTERN_LOCATIONS[self.version] + + def create_matrix(self): + size = self.version*4+21 + log(f"Size: {size}") + self.matrix = np.zeros([size, size])-1 #-1: empty | -0.5: reserved | 0: white | 1: black + + pygame.display.set_caption("QR Gen - Matrix") + if STEPS & S_EMPTY: self.show(step=True) + + #Add separator + self.matrix[0:8, 0:8] = 0 + self.matrix[-8:, 0:8] = 0 + self.matrix[0:8, -8:] = 0 + + pygame.display.set_caption("QR Gen - Separator") + if STEPS & S_SEP: self.show(step=True) + + #Place finders + self.matrix[0:7, 0:7] = QR.FINDER + self.matrix[-7:, 0:7] = QR.FINDER + self.matrix[0:7, -7:] = QR.FINDER + + pygame.display.set_caption("QR Gen - Finder patterns") + if STEPS & S_FINDER: self.show(step=True) + + #Add alignment patterns + locations = self.get_alignment_pattern_locations() + log(f"Alignment patterns: {locations}") + + if self.version > 0: + for y in locations: + for x in locations: + #Check if not overlapping with finders + if np.all(self.matrix[y-2:y+3, x-2:x+3] == -1): + self.matrix[y-2:y+3, x-2:x+3] = 1 + self.matrix[y-1:y+2, x-1:x+2] = 0 + self.matrix[y, x] = 1 + + pygame.display.set_caption("QR Gen - Alignment patterns") + if STEPS & S_ALIGN: self.show(step=True) + + #Add timing patterns + timing_length = size-2*8 + self.matrix[6, 8:-8] = np.resize([1,0],timing_length) + self.matrix[8:-8, 6] = np.resize([1,0],timing_length) + + pygame.display.set_caption("QR Gen - Timing patterns") + if STEPS & S_TIMING: self.show(step=True) + + #Add reserved areas + self.matrix[self.version*4+13,8] = 1 #Black module + self.matrix[:9, :9] = np.maximum(self.matrix[:9, :9], -0.5) #Top-left + self.matrix[-8:, 8] = np.maximum(self.matrix[-8:, 8], -0.5) #Bottom-left + self.matrix[8, -8:] = np.maximum(self.matrix[8, -8:], -0.5) #Top-right + + if self.version >= 6: + self.matrix[-11:-8, :6] = -0.5 + self.matrix[:6, -11:-8] = -0.5 + + pygame.display.set_caption("QR Gen - Reserved areas") + if STEPS & S_RESERVED: self.show(step=True) + + #Place data + dir_ = -1 #-1 = up | 1 = down + x, y = size-1, size-1 + i = 0 + zigzag = 0 + + mask_area = self.matrix == -1 + pygame.display.set_caption("QR Gen - Data layout") + print(self.matrix.tolist()) + + while x >= 0: + if self.matrix[y,x] == -1: + self.matrix[y,x] = self.final_data_bits[i] + + i += 1 + + if STEPS & S_DATA: + if not (STEPS & S_BYTES) or i%8==0: + self.show() + time.sleep(0.01) + + if ((dir_+1)/2 + zigzag)%2 == 0: + x -= 1 + + else: + y += dir_ + x += 1 + + if y == -1 or y == size: + dir_ = -dir_ + y += dir_ + x -= 2 + + else: + zigzag = 1-zigzag + + #Vertical timing pattern + if x == 6: + x -= 1 + + if STEPS & S_DATA: self.show(step=True) + + score, mask, matrix = self.try_masks(mask_area) + + self.matrix = np.where(mask_area, matrix, self.matrix) + + pygame.display.set_caption("QR Gen - Mask") + if STEPS & S_MASK: self.show(step=True) + + #Format string + format_str = f"{(5-self.level)%4:02b}{mask:03b}" + format_str += "0"*10 + format_str.lstrip("0") + log(f"Format str: {format_str}") + + gen_poly = 0b10100110111 + format_poly = int(format_str,2) + + while format_poly.bit_length() > 10: + g = gen_poly << (format_poly.bit_length()-gen_poly.bit_length()) + format_poly ^= g + + log(f"Remainder: {format_poly:b}") + format_data = int(format_str,2) + format_poly + format_data ^= 0b101010000010010 + format_data = f"{format_data:015b}" + log(f"XORed: {format_data}") + + for i in range(15): + y1, x1 = min(8,15-i), min(7,i) + if i >= 6: + x1 += 1 + if i >= 9: + y1 -= 1 + y2, x2 = self.matrix.shape[0]-i-1 if i < 7 else 8, 8 if i < 7 else self.matrix.shape[1]+i-15 + + self.matrix[y1, x1] = format_data[i] + self.matrix[y2, x2] = format_data[i] + + #Version information + if self.version >= 6: + gen_poly = 0b1111100100101 + version_info_poly = int(self.version+1)<<12 + + while version_info_poly.bit_length() > 12: + g = gen_poly << (version_info_poly.bit_length()-gen_poly.bit_length()) + version_info_poly ^= g + + version_info_data = ((self.version+1)<<12) + version_info_poly + version_info_data = f"{version_info_data:018b}" + + ox1, oy1 = 5, self.matrix.shape[0]-9 + ox2, oy2 = self.matrix.shape[1]-9, 5 + for i in range(18): + self.matrix[oy1 - i%3, ox1 - i//3] = version_info_data[i] + self.matrix[oy2 - i//3, ox2 - i%3] = version_info_data[i] + + def try_masks(self, mask_area): + best = [None,None,None] #score, i, matrix + + for i in range(8): + mask = QR.MASKS[i] + mat = self.matrix.copy() + + for y in range(self.matrix.shape[0]): + for x in range(self.matrix.shape[1]): + if mask_area[y,x] and mask(x,y): + mat[y,x] = 1-mat[y,x] + + + #Format string + format_str = f"{(5-self.level)%4:02b}{i:03b}" + format_str += "0"*10 + format_str.lstrip("0") + + gen_poly = 0b10100110111 + format_poly = int(format_str,2) + + while format_poly.bit_length() > 10: + g = gen_poly << (format_poly.bit_length()-gen_poly.bit_length()) + format_poly ^= g + + format_data = int(format_str,2) + format_poly + format_data ^= 0b101010000010010 + format_data = f"{format_data:015b}" + + for j in range(15): + y1, x1 = min(8,15-j), min(7,j) + if j >= 6: + x1 += 1 + if j >= 9: + y1 -= 1 + y2, x2 = mat.shape[0]-j-1 if j < 7 else 8, 8 if j < 7 else mat.shape[1]+j-15 + + mat[y1, x1] = format_data[j] + mat[y2, x2] = format_data[j] + + score = self.evaluate(mat.copy(), i) + + if best[0] is None or score < best[0]: + best = [score, i, mat] + + return best + + def evaluate(self, matrix, i): + score = 0 + + matrix = np.where(matrix < 0, 0, matrix) + + s1, s2, s3, s4 = 0, 0, 0, 0 + + #Condition 1 (horizontal) + for y in range(matrix.shape[0]): + col, count = -1, 0 + for x in range(matrix.shape[1]): + if matrix[y,x] != col: + count = 0 + col = matrix[y,x] + count += 1 + + if count == 5: + score += 3 + s1 += 3 + elif count > 5: + score += 1 + s1 += 1 + + #Condition 1 (vertical) + for x in range(matrix.shape[1]): + col, count = -1, 0 + for y in range(matrix.shape[0]): + if matrix[y,x] != col: + count = 0 + col = matrix[y,x] + count += 1 + + if count == 5: + score += 3 + s1 += 3 + elif count > 5: + score += 1 + s1 += 1 + + #Condition 2 + for y in range(matrix.shape[0]-1): + for x in range(matrix.shape[1]-1): + zone = matrix[y:y+2, x:x+2] + if np.all(zone == zone[0,0]): + score += 3 + s2 += 3 + + #Condition 3 (horizontal) + for y in range(matrix.shape[0]): + hist = History() + for x in range(matrix.shape[1]): + s = hist.add(matrix[y,x]) + score += s*40 + s3 += s*40 + + s = hist.final() + score += s*40 + s3 += s*40 + + #Condition 3 (vertical) + for x in range(matrix.shape[1]): + hist = History() + for y in range(matrix.shape[0]): + s = hist.add(matrix[y,x]) + score += s*40 + s3 += s*40 + + s = hist.final() + score += s*40 + s3 += s*40 + + #Condition 4 + total = matrix.shape[0]*matrix.shape[1] + dark = np.sum(matrix == 1) + percent = 100*dark//total + p1 = percent-(percent%5) + p2 = p1+5 + p1, p2 = abs(p1-50)/5, abs(p2-50)/5 + score += min(p1,p2)*10 + s4 += min(p1,p2)*10 + + log(f"mask {i}: {s1} + {s2} + {s3} + {s4} = {score}") + + return score + + def show(self, pos=None, step=False): + global win + + events = pygame.event.get() + + for event in events: + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_s: + pygame.image.save(win, "/tmp/qr.jpg") + + m = ((self.matrix.copy()+2)%3)*127 + mat = np.ones((m.shape[0]+8, m.shape[1]+8))*255 + mat[4:-4, 4:-4] = m + + if not pos is None: + mat[pos[1]+4, pos[0]+4] = 50 + + size = 15 + if win is None: + win = pygame.display.set_mode([mat.shape[0]*size, mat.shape[0]*size]) + + win.fill((255,255,255)) + + for y in range(mat.shape[0]): + for x in range(mat.shape[1]): + col = mat[y, x] + col = (col, col, col) + pygame.draw.rect(win, col, [x*size, y*size, size, size]) + + if coords: + N = 6 + space = (mat.shape[0]-8)/(N-1) + margin = 4*size + SIZE = (mat.shape[0]-8)*size + pygame.draw.lines(win, (0,0,0), True, [ + (margin, margin),(margin+SIZE, margin), + (margin+SIZE, margin+SIZE),(margin, margin+SIZE) + ]) + for i in range(N): + n = int(round(space*i)) + d = size * n + pygame.draw.line(win, (0,0,0), [margin+d, margin], [margin+d, margin-15]) + pygame.draw.line(win, (0,0,0), [margin, margin+d], [margin-15, margin+d]) + pygame.draw.line(win, (0,0,0), [margin+d, margin+SIZE], [margin+d, margin+SIZE+15]) + pygame.draw.line(win, (0,0,0), [margin+SIZE, margin+d], [margin+SIZE+15, margin+d]) + text = font.render(str(n), True, (0,0,0)) + win.blit(text, [margin+d-text.get_width()/2, margin-30-text.get_height()/2]) + win.blit(text, [margin-30-text.get_width()/2, margin+d-text.get_height()/2]) + win.blit(text, [margin+d-text.get_width()/2, margin+SIZE+30-text.get_height()/2]) + win.blit(text, [margin+SIZE+30-text.get_width()/2, margin+d-text.get_height()/2]) + + pygame.display.flip() + + if step: + input("Press Enter to continue") + +def print_bytes(bytes_, int_=False): + result = "" + for i in range(len(bytes_)//8): + if int_: + result += str(int(bytes_[i*8:i*8+8],2)) + " " + else: + result += bytes_[i*8:i*8+8] + " " + + result += bytes_[-(len(bytes_)%8):] + + print(result.strip()) + +QR.load_versions() +QR.load_ec() + +if __name__ == "__main__": + np.set_printoptions(linewidth=200) + pygame.display.set_caption("QR Gen") + #qr = QR("8675309", 0) + #qr = QR("HELLO WORLD", 2) + qr = QR("Hello, World!", 1) + #qr = QR("茗荷", 2) + #qr = QR("Hello, world! How are you doing ? I'm doing great, thank you ! Today is quite a sunny day, isn't it ?", 3) + #qr = QR("https://aufildeverre.ch/", 3) + #qr = QR("QR Code Symbol", 1) + #qr = QR("Attention !", 3) + #qr = QR("Lycacode", 0) + + print(qr) + + pygame.display.set_caption("QR Gen - Final") + qr.show(step=False) + input("Press Enter to quit") + events = pygame.event.get() + + for event in events: + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_s: + pygame.image.save(win, "/tmp/qr.jpg") \ No newline at end of file diff --git a/python/qr_scanner.py b/python/qr_scanner.py new file mode 100644 index 0000000..efce1c9 --- /dev/null +++ b/python/qr_scanner.py @@ -0,0 +1,882 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +This module can be used to scan QR-Codes + +(C) 2022 Louis Heredero louis.heredero@edu.vs.ch +""" + +import cv2 +import numpy as np +from math import sqrt, degrees, atan2, radians, cos, sin +import imutils +import matplotlib.pyplot as plt +from PIL import Image + +DB_WIN = False + +TOL_CNT_DIST = 10 # Tolerance distance between finders' centers +MASKS = [ + lambda x,y: (x+y)%2 == 0, + lambda x,y: y%2 == 0, + lambda x,y: (x)%3 == 0, + lambda x,y: (x+y)%3 == 0, + lambda x,y: (y//2+x//3)%2 == 0, + lambda x,y: ((x*y)%2 + (x*y)%3) == 0, + lambda x,y: ((x*y)%2 + (x*y)%3)%2 == 0, + lambda x,y: ((x+y)%2 + (x*y)%3)%2 == 0 +] + +ALIGNMENT_PATTERN_LOCATIONS = [ + [], + [6, 18], + [6, 22], + [6, 26], + [6, 30], + [6, 34], + [6, 22, 38], + [6, 24, 42], + [6, 26, 46], + [6, 28, 50], + [6, 30, 54], + [6, 32, 58], + [6, 34, 62], + [6, 26, 46, 66], + [6, 26, 48, 70], + [6, 26, 50, 74], + [6, 30, 54, 78], + [6, 30, 56, 82], + [6, 30, 58, 86], + [6, 34, 62, 90], + [6, 28, 50, 72, 94], + [6, 26, 50, 74, 98], + [6, 30, 54, 78, 102], + [6, 28, 54, 80, 106], + [6, 32, 58, 84, 110], + [6, 30, 58, 86, 114], + [6, 34, 62, 90, 118], + [6, 26, 50, 74, 98, 122], + [6, 30, 54, 78, 102, 126], + [6, 26, 52, 78, 104, 130], + [6, 30, 56, 82, 108, 134], + [6, 34, 60, 86, 112, 138], + [6, 30, 58, 86, 114, 142], + [6, 34, 62, 90, 118, 146], + [6, 30, 54, 78, 102, 126, 150], + [6, 24, 50, 76, 102, 128, 154], + [6, 28, 54, 80, 106, 132, 158], + [6, 32, 58, 84, 110, 136, 162], + [6, 26, 54, 82, 110, 138, 166], + [6, 30, 58, 86, 114, 142, 170] +] + +VERSIONS = [] +with open("qr_versions.txt", "r") as f: + versions = f.read().split("\n\n") + for v in versions: + lvls = [list(map(int, lvl.split("\t"))) for lvl in v.split("\n")] + VERSIONS.append(lvls) +VERSIONS = np.array(VERSIONS) + +ERROR_CORRECTION = [] +with open("error_correction.txt", "r") as f: + ecs = f.read().split("\n\n") + for ec in ecs: + lvls = [list(map(int, lvl.split("\t"))) for lvl in ec.split("\n")] + lvls = [lvl + [0]*(6-len(lvl)) for lvl in lvls] + + ERROR_CORRECTION.append(lvls) +ERROR_CORRECTION = np.array(ERROR_CORRECTION) + +EC_PARAMS = [] +with open("ec_params.txt", "r") as f: + ecs = f.read().split("\n\n") + for ec in ecs: + lvls = [list(map(int, lvl.split("\t"))) for lvl in ec.split("\n") if lvl] + EC_PARAMS.append(lvls) +EC_PARAMS = np.array(EC_PARAMS) + +ALPHANUM = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:" + +class GF: + def __init__(self, val): + self.val = val + + def copy(self): + return GF(self.val) + + def __add__(self, n): + return GF(self.val ^ n.val) + + def __sub__(self, n): + return GF(self.val ^ n.val) + + def __mul__(self, n): + if self.val == 0 or n.val == 0: + return GF(0) + + return GF.EXP[GF.LOG[self.val].val + GF.LOG[n.val].val].copy() + + def __truediv__(self, n): + if n.val == 0: + raise ZeroDivisionError + if self.val == 0: + return GF(0) + + return GF.EXP[(GF.LOG[self.val].val + 255 - GF.LOG[n.val].val)%255].copy() + + def __pow__(self, n): + return GF.EXP[(GF.LOG[self.val].val * n.val)%255].copy() + + def __repr__(self): + return self.val.__repr__() + + def log(self): + return GF.LOG[self.val] + +GF.EXP = [GF(0)]*512 +GF.LOG = [GF(0)]*256 +value = 1 +for exponent in range(255): + GF.LOG[value] = GF(exponent) + GF.EXP[exponent] = GF(value) + value = ((value << 1) ^ 285) if value > 127 else value << 1 + +for i in range(255, 512): + GF.EXP[i] = GF.EXP[i-255].copy() + + +class Poly: + def __init__(self, coefs): + self.coefs = coefs.copy() + + @property + def deg(self): + return len(self.coefs) + + def copy(self): + return Poly(self.coefs) + + def __add__(self, p): + d1, d2 = self.deg, p.deg + deg = max(d1,d2) + result = [GF(0) for i in range(deg)] + + for i in range(d1): + result[i + deg - d1] = self.coefs[i] + + for i in range(d2): + result[i + deg - d2] += p.coefs[i] + + return Poly(result) + + def __mul__(self, p): + result = [GF(0) for i in range(self.deg+p.deg-1)] + + for i in range(p.deg): + for j in range(self.deg): + result[i+j] += self.coefs[j] * p.coefs[i] + + return Poly(result) + + def __truediv__(self, p): + dividend = self.coefs.copy() + dividend += [GF(0) for i in range(p.deg-1)] + quotient = [] + + for i in range(self.deg): + coef = dividend[i] / p.coefs[0] + quotient.append(coef) + + for j in range(p.deg): + dividend[i+j] -= p.coefs[j] * coef + + while dividend[0].val == 0: + dividend.pop(0) + + return [Poly(quotient), Poly(dividend)] + + def __repr__(self): + return f"" + + def eval(self, x): + y = GF(0) + + for i in range(self.deg): + y += self.coefs[i] * x**GF(self.deg-i-1) + + return y + + def del_lead_zeros(self): + while len(self.coefs) > 1 and self.coefs[0].val == 0: + self.coefs.pop(0) + + if len(self.coefs) == 0: + self.coefs = [GF(0)] + + return self + +def center(c): + M = cv2.moments(c) + + if M["m00"] != 0: + cX = int(M["m10"] / M["m00"]) + cY = int(M["m01"] / M["m00"]) + return (cX, cY) + + return (None, None) + +def dist(p1, p2): + return sqrt((p2[0]-p1[0])**2 + (p2[1]-p1[1])**2) + +def rotate(o, p, a): + ox, oy = o + px, py = p + a = radians(a) + c, s = cos(a), sin(a) + + return [ + int(ox + c*(px-ox) - s * (py-oy)), + int(oy + s*(px-ox) + c * (py-oy)) + ] + +def rotate_cnt(cnt, o, a): + c = cnt + pts = c[:, 0, :] + pts = np.array([rotate(o, p, a) for p in pts]) + c[:, 0, :] = pts + + return c.astype(np.int32) + +def is_finder(i, cnts, hrcy): + c1 = cnts[i] + h1 = hrcy[0][i] + cX1, cY1 = center(c1) + if len(c1) != 4: + return False + + if cX1 is None: + return False + + if h1[2] == -1: + return False + + i2 = h1[2] + c2 = cnts[i2] + h2 = hrcy[0][i2] + cX2, cY2 = center(c2) + if cX2 is None: + return False + + if len(c2) != 4: + return False + + if abs(dist((cX1, cY1), (cX2, cY2))) > TOL_CNT_DIST: + return False + + if h2[2] == -1: + return False + + i3 = h2[2] + c3 = cnts[i3] + h3 = hrcy[0][i3] + cX3, cY3 = center(c3) + + if len(c3) != 4: + return False + + if cX3 is None: + return False + + if abs(dist((cX1, cY1), (cX3, cY3))) > TOL_CNT_DIST: + return False + + return True + +def decode(img): + grey = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) + grey = cv2.GaussianBlur(grey, (5,5), 0) + #if DB_WIN: cv2.imshow("grey", grey) + + bw = cv2.threshold(grey, np.mean(grey), 255, cv2.THRESH_BINARY)[1] + if DB_WIN: cv2.imshow("bw", bw) + + #laplacian = cv2.Laplacian(bw, cv2.CV_8U, 15) + #cv2.imshow("laplacian", laplacian) + + contours, hierarchy = cv2.findContours(bw, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE) + if DB_WIN: + img2 = img.copy() + cv2.drawContours(img2, contours, -1, (0,255,0), 1) + + candidates = [] + + contours = list(contours) + for i, cnt in enumerate(contours): + peri = cv2.arcLength(cnt, True) + contours[i] = cv2.approxPolyDP(cnt, 0.04 * peri, True) + + for i in range(len(contours)): + if is_finder(i, contours, hierarchy): + candidates.append(i) + + if DB_WIN: + for i in candidates: + cv2.drawContours(img2, contours, i, (0,0,255), 1) + + cv2.imshow("contours", img2) + + if DB_WIN: img3 = img.copy() + corners = [] + corners_cnts = [] + for i1 in candidates: + i2 = hierarchy[0][i1][2] + i3 = hierarchy[0][i2][2] + c1 = contours[i1] + c2 = contours[i2] + c3 = contours[i3] + + x1, y1 = center(c1) + x2, y2 = center(c2) + x3, y3 = center(c3) + x, y = (x1+x2+x3)/3, (y1+y2+y3)/3 + x, y = int(x), int(y) + corners.append((x,y)) + corners_cnts.append([c1,c2,c3]) + + if DB_WIN: + cv2.line(img3, [x, y-10], [x, y+10], (0,255,0), 1) + cv2.line(img3, [x-10, y], [x+10, y], (0,255,0), 1) + #cv2.drawContours(img3, [c1], 0, (255,0,0), 1) + #cv2.drawContours(img3, [c2], 0, (0,255,0), 1) + #cv2.drawContours(img3, [c3], 0, (0,0,255), 1) + + if DB_WIN: cv2.imshow("lines", img3) + + if len(corners) != 3: + return + + d01 = dist(corners[0], corners[1]) + d02 = dist(corners[0], corners[2]) + d12 = dist(corners[1], corners[2]) + diffs = [abs(d01-d02), abs(d01-d12), abs(d02-d12)] + mdiff = min(diffs) + i = diffs.index(mdiff) + + a = corners.pop(i) + b, c = corners + + V = [img.shape[1], img.shape[0]] + d = [(b[0]+c[0])/2, (b[1]+c[1])/2] + v = [d[0]-a[0], d[1]-a[1]] + + C = [img.shape[1]/2, img.shape[0]/2] + + angle = degrees(atan2(v[1], v[0])) + angle_diff = angle-45 + + if DB_WIN: + img4 = img.copy() + cv2.line(img4, a, [int(d[0]), int(d[1])], (0,255,0), 1) + cv2.imshow("vecs", img4) + + cA = corners_cnts[i][0] + cA = rotate_cnt(cA, C, -angle_diff) + rA = cv2.boundingRect(cA) + + cA2 = corners_cnts[i][1] + cA2 = rotate_cnt(cA2, C, -angle_diff) + rA2 = cv2.boundingRect(cA2) + + cB = corners_cnts[i-1][0] + cB = rotate_cnt(cB, C, -angle_diff) + rB = cv2.boundingRect(cB) + + cC = corners_cnts[i-2][0] + cC = rotate_cnt(cC, C, -angle_diff) + rC = cv2.boundingRect(cC) + + a, b, c = rotate(C, a, -angle_diff), rotate(C, b, -angle_diff), rotate(C, c, -angle_diff) + + if DB_WIN: + img5 = img.copy() + img5 = imutils.rotate(img5, angle_diff) + cv2.rectangle(img5, rA, (255,0,0), 1) + cv2.rectangle(img5, rB, (0,255,0), 1) + cv2.rectangle(img5, rC, (0,0,255), 1) + cv2.line(img5, a, b, (255,255,255), 1) + cv2.line(img5, a, c, (255,255,255), 1) + cv2.imshow("rot", img5) + + wul = rA[2] + if rB[1] < rC[1]: + wur = rB[2] + else: + wur = rC[2] + + if rB[1] < rC[1]: + D = dist(a, b) + else: + D = dist(a, c) + + X = (wul + wur)/14 + V = (D/X - 10)/4 + V = round(V) + + size = V*4+17 + grid = np.zeros([size, size]) + bw_rot = imutils.rotate(bw, angle_diff) + if DB_WIN: + img6 = img.copy() + img6 = imutils.rotate(img6, angle_diff) + + OX, OY = (rA[0]+rA2[0])/2, (rA[1]+rA2[1])/2 + + #Not fully visible + if (OX + size*X+1 >= bw_rot.shape[1]) or (OY + size*X+1 >= bw_rot.shape[0]): + return None + + for y in range(size): + for x in range(size): + zone = bw_rot[ + int(OY + y*X-1): int(OY + y*X+2), + int(OX + x*X-1): int(OX + x*X+2) + ] + grid[y, x] = 1-round(np.mean(zone)/255) + #cv2.circle(img6, [int(OX+x*X), int(OY+y*X)], 3, (0,0,255), 1) + + #print(size) + #cv2.rectangle(img6, [int(OX-X/2), int(OY-X/2), int(X), int(X)], (0,255,0), 1) + #cv2.imshow("grid", img6) + if DB_WIN: + cv2.namedWindow("bw_rot", cv2.WINDOW_NORMAL) + cv2.imshow("bw_rot", bw_rot) + #cv2.imshow("code", cv2.resize(grid, [size*10,size*10])) + + value = _decode(grid, V) + + if value is None: + value = _decode(1-grid, V) + + return value + +def _decode(grid, V, flipped=None, f2=False): + if not flipped is None: + grid = flipped + + lvl, mask_i = get_fmt(grid, f2) + + mask = MASKS[mask_i] + unmasked = grid.copy() + mask_area = np.ones(grid.shape) + + mask_area[:9, :9] = 0 + mask_area[:9, -8:] = 0 + mask_area[-8:, :9] = 0 + + #Add alignment patterns + locations = ALIGNMENT_PATTERN_LOCATIONS[V-1] + + if V > 1: + for y in locations: + for x in locations: + #Check if not overlapping with finders + if np.all(mask_area[y-2:y+3, x-2:x+3] == 1): + mask_area[y-2:y+3, x-2:x+3] = 0 + mask_area[y-1:y+2, x-1:x+2] = 0 + mask_area[y, x] = 0 + + #Add timing patterns + timing_length = grid.shape[0]-2*8 + mask_area[6, 8:-8] = np.zeros([timing_length]) + mask_area[8:-8, 6] = np.zeros([timing_length]) + + if V >= 7: + mask_area[-11:-8, :6] = 0 + mask_area[:6, -11:-8] = 0 + + for y in range(grid.shape[0]): + for x in range(grid.shape[1]): + if mask_area[y,x] == 1 and mask(x,y): + unmasked[y,x] = 1-unmasked[y,x] + + if DB_WIN: + cv2.namedWindow("grid", cv2.WINDOW_NORMAL) + cv2.namedWindow("unmasked", cv2.WINDOW_NORMAL) + #cv2.namedWindow("mask_area", cv2.WINDOW_NORMAL) + cv2.imshow("grid", 1-grid) + cv2.imshow("unmasked", 1-unmasked) + #cv2.imshow("mask_area", mask_area) + + #Un-place data + dir_ = -1 #-1 = up | 1 = down + x, y = grid.shape[1]-1, grid.shape[0]-1 + i = 0 + zigzag = 0 + + final_data_bits = "" + + while x >= 0: + if mask_area[y,x] == 1: + final_data_bits += str(int(unmasked[y, x])) + + if ((dir_+1)/2 + zigzag)%2 == 0: + x -= 1 + + else: + y += dir_ + x += 1 + + if y == -1 or y == grid.shape[0]: + dir_ = -dir_ + y += dir_ + x -= 2 + + else: + zigzag = 1-zigzag + + #Vertical timing pattern + if x == 6: + x -= 1 + + #Remove remainder bits + if 2 <= V < 7: + final_data_bits = final_data_bits[:-7] + + elif 14 <= V < 21 or 28 <= V < 35: + final_data_bits = final_data_bits[:-3] + + elif 21 <= V < 28: + final_data_bits = final_data_bits[:-4] + + ec = ERROR_CORRECTION[V-1, lvl] + #print(ec) + + + codewords = [final_data_bits[i:i+8] for i in range(0,len(final_data_bits),8)] + + #Only one block + if ec[2]+ec[4] == 1: + data_codewords = codewords[:ec[3]] + ec_codewords = codewords[ec[3]:] + + else: + group1, group2 = [], [] + group_ec = [] + + for b in range(ec[2]): + block = [] + for i in range(ec[3]): + block.append(codewords[b+i*(ec[2]+ec[4])]) + + group1.append(block) + + if ec[4] > 0: + for b in range(ec[2], ec[2]+ec[4]): + block = [] + for i in range(ec[5]): + off = 0 + if i >= ec[3]: + off = (i-ec[3]+1)*ec[2] + block.append(codewords[b+i*(ec[2]+ec[4])-off]) + + group2.append(block) + + codewords = codewords[ec[2]*ec[3]+ec[4]*ec[5]:] + + for b in range(ec[2]+ec[4]): + block = [] + for i in range(ec[1]): + block.append(codewords[b+i*(ec[2]+ec[4])]) + + group_ec.append(block) + + data_codewords = sum(group1, []) + sum(group2, []) + ec_codewords = sum(group_ec, []) + + #print(data_codewords) + #print(ec_codewords) + + try: + decoded = correct(data_codewords, ec_codewords) + + except ReedSolomonException as e: + #print(e) + + if not f2: + return _decode(grid, V, flipped, True) + + elif flipped is None: + f = grid.copy() + f = np.rot90(np.fliplr(f)) + return _decode(grid, V, f, False) + + else: + #raise ReedSolomonException("Cannot decode") + return None + + decoded = "".join(list(map(lambda c: f"{c.val:08b}", decoded.coefs))) + + mode, decoded = decoded[:4], decoded[4:] + MODES = ["0001", "0010", "0100", "1000"] + mode = MODES.index(mode) + + if 1 <= V < 10: + char_count_len = [10,9,8,8][mode] + elif 10 <= V < 27: + char_count_len = [12,11,16,10][mode] + elif 27 <= V < 41: + char_count_len = [14,13,16,12][mode] + + length, decoded = decoded[:char_count_len], decoded[char_count_len:] + length = int(length, 2) + + value = None + + if mode == 0: + value = "" + + _ = length//3 + l = _ * 10 + if 10 - _ == 2: + l += 7 + else: + l += 4 + + data = decoded[:l] + groups = [data[i:i+10] for i in range(0, l, 10)] + + for group in groups: + value += str(int(group,2)) + + value = int(value) + + elif mode == 1: + value = "" + + data = decoded[:length//2 * 11 + (length%2)*6] + + for i in range(0, len(data), 11): + s = data[i:i+11] + val = int(s, 2) + + if len(s) == 6: + value += ALPHANUM[val] + + else: + value += ALPHANUM[val//45] + value += ALPHANUM[val%45] + + elif mode == 2: + data = decoded[:length*8] + data = [data[i:i+8] for i in range(0, length*8, 8)] + data = list(map(lambda b: int(b, 2), data)) + value = bytes(data).decode("ISO-8859-1") + + elif mode == 3: + value = [] + data = decoded[:length*13] + + for i in range(0, len(data), 13): + val = int(data[i:i+13], 2) + msb = val // 0xc0 + lsb = val % 0xc0 + + dbyte = (msb << 8) + lsb + + if 0 <= dbyte <= 0x9ffc - 0x8140: + dbyte += 0x8140 + + elif 0xe040 - 0xc140 <= dbyte <= 0xebbf - 0xc140: + dbyte += 0xc140 + + value.append(dbyte >> 8) + value.append(dbyte & 0xff) + + value = bytes(value).decode("shift_jis") + + #print("value:", value) + + return value + + # If unreadable + # -> _decode(f2=True) + # -> mirror image + +class ReedSolomonException(Exception): + pass + +def correct(data, ec): + n = len(ec) + + data = Poly([GF(int(cw, 2)) for cw in data+ec]) + ##print("data", list(map(lambda c:c.val, data.coefs))) + + syndrome = [0]*n + corrupted = False + for i in range(n): + syndrome[i] = data.eval(GF.EXP[i]) + if syndrome[i].val != 0: + corrupted = True + + if not corrupted: + print("No errors") + return data + + syndrome = Poly(syndrome[::-1]) + #print("syndrome", syndrome) + + #Find locator poly + sigma, omega = euclidean_algorithm(Poly([GF(1)]+[GF(0) for i in range(n)]), syndrome, n) + #print("sigma", sigma) + #print("omega", omega) + error_loc = find_error_loc(sigma) + + error_mag = find_error_mag(omega, error_loc) + + for i in range(len(error_loc)): + pos = GF(error_loc[i]).log() + pos = data.deg - pos.val - 1 + if pos < 0: + raise ReedSolomonException("Bad error location") + + data.coefs[pos] += GF(error_mag[i]) + + return data + +def euclidean_algorithm(a, b, R): + if a.deg < b.deg: + a, b = b, a + + r_last = a + r = b + t_last = Poly([GF(0)]) + t = Poly([GF(1)]) + + while r.deg-1 >= int(R/2): + r_last_last = r_last + t_last_last = t_last + r_last = r + t_last = t + if r_last.coefs[0] == 0: + raise ReedSolomonException("r_{i-1} was zero") + + r = r_last_last + q = Poly([GF(0)]) + denom_lead_term = r_last.coefs[0] + dlt_inv = denom_lead_term ** GF(-1) + I = 0 + while r.deg >= r_last.deg and r.coefs[0] != 0: + I += 1 + deg_diff = r.deg - r_last.deg + scale = r.coefs[0] * dlt_inv + q += Poly([scale]+[GF(0) for i in range(deg_diff)]) + r += r_last * Poly([scale]+[GF(0) for i in range(deg_diff)]) + q.del_lead_zeros() + r.del_lead_zeros() + + if I > 100: + raise ReedSolomonException("Too long") + + t = (q * t_last).del_lead_zeros() + t_last_last + t.del_lead_zeros() + if r.deg >= r_last.deg: + raise ReedSolomonException("Division algorithm failed to reduce polynomial") + + sigma_tilde_at_zero = t.coefs[-1] + if sigma_tilde_at_zero.val == 0: + raise ReedSolomonException("sigma_tilde(0) was zero") + + inv = Poly([sigma_tilde_at_zero ** GF(-1)]) + sigma = t * inv + omega = r * inv + + return [sigma, omega] + +def find_error_loc(error_loc): + num_errors = error_loc.deg-1 + if num_errors == 1: + return [error_loc.coefs[-2].val] + + result = [0]*num_errors + e = 0 + i = 1 + while i < 256 and e < num_errors: + if error_loc.eval(GF(i)).val == 0: + result[e] = (GF(i) ** GF(-1)).val + e += 1 + + i += 1 + + if e != num_errors: + raise ReedSolomonException("Error locator degree does not match number of roots") + + return result + +def find_error_mag(error_eval, error_loc): + s = len(error_loc) + result = [0]*s + for i in range(s): + xi_inv = GF(error_loc[i]) ** GF(-1) + denom = GF(1) + for j in range(s): + if i != j: + denom *= GF(1) + GF(error_loc[j]) * xi_inv + + result[i] = ( error_eval.eval(xi_inv) * (denom ** GF(-1)) ).val + + return result + +def get_fmt(grid ,f2=False): + fmt1 = list(grid[0:6, 8]) + [grid[7,8], grid[8,8], grid[8,7]] + list(grid[8, 0:6][::-1]) + fmt2 = list(grid[8, -8:][::-1]) + list(grid[-7:, 8]) + + fmt1 = "".join([str(int(b)) for b in fmt1])[::-1] + fmt2 = "".join([str(int(b)) for b in fmt2])[::-1] + + if f2: + return decode_fmt(fmt2) + + return decode_fmt(fmt1) + +def decode_fmt(fmt): + format_data = int(fmt, 2) + format_data ^= 0b101010000010010 + format_data = f"{format_data:015b}" + + closest = None + + with open("./valid_format_str.txt", "r") as f: + for i, format_str in enumerate(f): + diff = sum(1 for a, b in zip(format_data, format_str) if a != b) + if closest is None or diff < closest[1]: + closest = (i, diff) + + lvl = closest[0] >> 3 + lvl = (5-lvl)%4 + mask = closest[0]&0b111 + return [lvl, mask] + +if __name__ == "__main__": + cam = cv2.VideoCapture(0) + + while True: + ret_val, img = cam.read() + if not ret_val: + continue + + cv2.imshow("src", img) + + try: + value = decode(img) + if not value is None: + print(value) + + except Exception as e: + #pass + #raise + print(e) + + cv2.waitKey(1) + + cv2.destroyAllWindows() \ No newline at end of file diff --git a/python/qr_versions.txt b/python/qr_versions.txt new file mode 100644 index 0000000..329689f --- /dev/null +++ b/python/qr_versions.txt @@ -0,0 +1,199 @@ +41 25 17 10 +34 20 14 8 +27 16 11 7 +17 10 7 4 + +77 47 32 20 +63 38 26 16 +48 29 20 12 +34 20 14 8 + +127 77 53 32 +101 61 42 26 +77 47 32 20 +58 35 24 15 + +187 114 78 48 +149 90 62 38 +111 67 46 28 +82 50 34 21 + +255 154 106 65 +202 122 84 52 +144 87 60 37 +106 64 44 27 + +322 195 134 82 +255 154 106 65 +178 108 74 45 +139 84 58 36 + +370 224 154 95 +293 178 122 75 +207 125 86 53 +154 93 64 39 + +461 279 192 118 +365 221 152 93 +259 157 108 66 +202 122 84 52 + +552 335 230 141 +432 262 180 111 +312 189 130 80 +235 143 98 60 + +652 395 271 167 +513 311 213 131 +364 221 151 93 +288 174 119 74 + +772 468 321 198 +604 366 251 155 +427 259 177 109 +331 200 137 85 + +883 535 367 226 +691 419 287 177 +489 296 203 125 +374 227 155 96 + +1022 619 425 262 +796 483 331 204 +580 352 241 149 +427 259 177 109 + +1101 667 458 282 +871 528 362 223 +621 376 258 159 +468 283 194 120 + +1250 758 520 320 +991 600 412 254 +703 426 292 180 +530 321 220 136 + +1408 854 586 361 +1082 656 450 277 +775 470 322 198 +602 365 250 154 + +1548 938 644 397 +1212 734 504 310 +876 531 364 224 +674 408 280 173 + +1725 1046 718 442 +1346 816 560 345 +948 574 394 243 +746 452 310 191 + +1903 1153 792 488 +1500 909 624 384 +1063 644 442 272 +813 493 338 208 + +2061 1249 858 528 +1600 970 666 410 +1159 702 482 297 +919 557 382 235 + +2232 1352 929 572 +1708 1035 711 438 +1224 742 509 314 +969 587 403 248 + +2409 1460 1003 618 +1872 1134 779 480 +1358 823 565 348 +1056 640 439 270 + +2620 1588 1091 672 +2059 1248 857 528 +1468 890 611 376 +1108 672 461 284 + +2812 1704 1171 721 +2188 1326 911 561 +1588 963 661 407 +1228 744 511 315 + +3057 1853 1273 784 +2395 1451 997 614 +1718 1041 715 440 +1286 779 535 330 + +3283 1990 1367 842 +2544 1542 1059 652 +1804 1094 751 462 +1425 864 593 365 + +3517 2132 1465 902 +2701 1637 1125 692 +1933 1172 805 496 +1501 910 625 385 + +3669 2223 1528 940 +2857 1732 1190 732 +2085 1263 868 534 +1581 958 658 405 + +3909 2369 1628 1002 +3035 1839 1264 778 +2181 1322 908 559 +1677 1016 698 430 + +4158 2520 1732 1066 +3289 1994 1370 843 +2358 1429 982 604 +1782 1080 742 457 + +4417 2677 1840 1132 +3486 2113 1452 894 +2473 1499 1030 634 +1897 1150 790 486 + +4686 2840 1952 1201 +3693 2238 1538 947 +2670 1618 1112 684 +2022 1226 842 518 + +4965 3009 2068 1273 +3909 2369 1628 1002 +2805 1700 1168 719 +2157 1307 898 553 + +5253 3183 2188 1347 +4134 2506 1722 1060 +2949 1787 1228 756 +2301 1394 958 590 + +5529 3351 2303 1417 +4343 2632 1809 1113 +3081 1867 1283 790 +2361 1431 983 605 + +5836 3537 2431 1496 +4588 2780 1911 1176 +3244 1966 1351 832 +2524 1530 1051 647 + +6153 3729 2563 1577 +4775 2894 1989 1224 +3417 2071 1423 876 +2625 1591 1093 673 + +6479 3927 2699 1661 +5039 3054 2099 1292 +3599 2181 1499 923 +2735 1658 1139 701 + +6743 4087 2809 1729 +5313 3220 2213 1362 +3791 2298 1579 972 +2927 1774 1219 750 + +7089 4296 2953 1817 +5596 3391 2331 1435 +3993 2420 1663 1024 +3057 1852 1273 784 \ No newline at end of file diff --git a/python/valid_format_str.txt b/python/valid_format_str.txt new file mode 100644 index 0000000..0c33e37 --- /dev/null +++ b/python/valid_format_str.txt @@ -0,0 +1,32 @@ +000000000000000 +000010100110111 +000101001101110 +000111101011001 +001000111101011 +001010011011100 +001101110000101 +001111010110010 +010001111010110 +010011011100001 +010100110111000 +010110010001111 +011001000111101 +011011100001010 +011100001010011 +011110101100100 +100001010011011 +100011110101100 +100100011110101 +100110111000010 +101001101110000 +101011001000111 +101100100011110 +101110000101001 +110000101001101 +110010001111010 +110101100100011 +110111000010100 +111000010100110 +111010110010001 +111101011001000 +111111111111111