{"id":1141,"date":"2022-09-04T17:04:30","date_gmt":"2022-09-04T09:04:30","guid":{"rendered":"http:\/\/www.max-shu.com\/blog\/?p=1141"},"modified":"2022-09-04T17:04:30","modified_gmt":"2022-09-04T09:04:30","slug":"%e7%94%a8lvgl%e5%9b%be%e5%bd%a2%e5%ba%93%e7%bb%98%e5%88%b6%e4%ba%8c%e7%bb%b4%e7%a0%81","status":"publish","type":"post","link":"http:\/\/www.max-shu.com\/blog\/?p=1141","title":{"rendered":"\u7528LVGL\u56fe\u5f62\u5e93\u7ed8\u5236\u4e8c\u7ef4\u7801"},"content":{"rendered":"<div><\/div>\n<div>\u4e8c\u7ef4\u7801\u6709\u4e24\u79cd\u6a21\u5f0f\uff0c\u8fd9\u91cc\u53ea\u652f\u6301Model1\uff0c\u4e0d\u652f\u6301Model2\u3002<\/div>\n<div>Model1\u4e8c\u7ef4\u7801\u670914\u4e2dversion\uff0cverson1\u7684\u5927\u5c0f\u4e3a21&#215;21\u4e2a\u6a21\u5757\uff0cversionX\u7684\u5927\u5c0f\u4e3a(21+X*4)x(21+X*4)\u4e2a\u6a21\u5757\uff08\u8fd9\u91cc\u6a21\u5757\u8868\u793a\u6bcf\u4e2a\u56fe\u6848\u7684\u5207\u6362\uff0c\u6bd4\u5982\u5b9a\u4f4d\u7b26\u91cc\u9762\u7684\u9ed1\u8272\u3002<\/div>\n<div>\u501f\u9274\u8fd9\u4e2a\u4ee3\u7801\uff0c\u518d\u6dfb\u52a0\u7ed8\u5236\u90e8\u5206\uff1a<\/div>\n<div><a href=\"https:\/\/github.com\/ricmoo\/QRCode\">https:\/\/github.com\/ricmoo\/QRCode<\/a><\/div>\n<div><\/div>\n<div>\n<div><strong>\u4f7f\u7528\u4f8b\u5b50\uff1a<\/strong><\/div>\n<div>\u6ce8\u610f\uff1aQrCode_Produce\u7684width\u548cheight\u53c2\u6570\u5fc5\u987b\u662f33\u7684\u500d\u6570\uff0c\u56e0\u4e3a\u4f7f\u7528\u7684\u662fversion4\uff0c\u537333&#215;33\u7684\u5757\u5927\u5c0f\uff0c\u5426\u5219\u5728canvas\u8981\u4e48\u663e\u793a\u4e0d\u5168\u8981\u4e48\u53f3\u4e0b\u663e\u793a\u7a7a\u767d\u591a\u3002<\/div>\n<div><\/div>\n<div>void my_test_init_3()<\/div>\n<div>{<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0printf(&#8220;my_test_init_3: \\n&#8221;);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0lv_obj_t *scr1 = lv_obj_create(NULL, NULL);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0lv_obj_set_style_local_bg_color(scr1, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0lv_scr_load(scr1);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/Produce QRCode<\/div>\n<div>#define QRCODE_BOARD\u00a0\u00a02<\/div>\n<div>#define QRCODE_WIDTH\u00a0\u00a0103\u00a0\u00a0\/\/ = 99+QRCODE_BOARD*2<\/div>\n<div>#define QRCODE_HEIGHT 103<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0static lv_color_t cbuf[LV_CANVAS_BUF_SIZE_TRUE_COLOR(QRCODE_WIDTH, QRCODE_HEIGHT)];<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0lv_obj_t * canvas = lv_canvas_create(scr1, NULL);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0lv_canvas_set_buffer(canvas, cbuf, QRCODE_WIDTH, QRCODE_HEIGHT, LV_IMG_CF_TRUE_COLOR);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0lv_obj_set_hidden(canvas, false);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0lv_obj_set_pos(canvas, 50, 10);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0lv_canvas_fill_bg(canvas, LV_COLOR_SILVER, LV_OPA_COVER);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0QrCode_Produce(canvas, QRCODE_BOARD, QRCODE_BOARD,<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0(QRCODE_WIDTH-QRCODE_BOARD*2)\/33, (QRCODE_HEIGHT-QRCODE_BOARD*2)\/33,<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&#8220;0123456789\/:,.'(){}[]\\&#8221;abcdefABCDEF_-!@#$%^&amp;*~0123456789&#8221;);<\/div>\n<div>\n<div>}<\/div>\n<\/div>\n<div><\/div>\n<div><\/div>\n<div><strong>\u6e90\u6587\u4ef6\uff1a<\/strong><\/div>\n<div><\/div>\n<div>#include &lt;stdlib.h&gt;<\/div>\n<div>#include &lt;string.h&gt;<\/div>\n<div>#include &lt;stdio.h&gt;<\/div>\n<div>#include &#8220;lvgl\/lvgl.h&#8221;<\/div>\n<div><\/div>\n<div>#include &#8220;qrcode.h&#8221;<\/div>\n<div><\/div>\n<div>#pragma mark &#8211; Error Correction Lookup tables<\/div>\n<div><\/div>\n<div>#if LOCK_VERSION == 0<\/div>\n<div><\/div>\n<div>static const uint16_t NUM_ERROR_CORRECTION_CODEWORDS[4][40] = {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/ 1,\u00a0\u00a02,\u00a0\u00a03,\u00a0\u00a04,\u00a0\u00a05,\u00a0\u00a0\u00a06,\u00a0\u00a0\u00a07,\u00a0\u00a0\u00a08,\u00a0\u00a0\u00a09,\u00a0\u00a010,\u00a0\u00a011,\u00a0\u00a012,\u00a0\u00a013,\u00a0\u00a014,\u00a0\u00a015,\u00a0\u00a016,\u00a0\u00a017,\u00a0\u00a018,\u00a0\u00a019,\u00a0\u00a020,\u00a0\u00a021,\u00a0\u00a022,\u00a0\u00a023,\u00a0\u00a024,\u00a0\u00a0\u00a025,\u00a0\u00a0\u00a026,\u00a0\u00a0\u00a027,\u00a0\u00a0\u00a028,\u00a0\u00a0\u00a029,\u00a0\u00a0\u00a030,\u00a0\u00a0\u00a031,\u00a0\u00a0\u00a032,\u00a0\u00a0\u00a033,\u00a0\u00a0\u00a034,\u00a0\u00a0\u00a035,\u00a0\u00a0\u00a036,\u00a0\u00a0\u00a037,\u00a0\u00a0\u00a038,\u00a0\u00a0\u00a039,\u00a0\u00a0\u00a040\u00a0\u00a0\u00a0\u00a0Error correction level<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0{ 10, 16, 26, 36, 48,\u00a0\u00a064,\u00a0\u00a072,\u00a0\u00a088, 110, 130, 150, 176, 198, 216, 240, 280, 308, 338, 364, 416, 442, 476, 504, 560,\u00a0\u00a0588,\u00a0\u00a0644,\u00a0\u00a0700,\u00a0\u00a0728,\u00a0\u00a0784,\u00a0\u00a0812,\u00a0\u00a0868,\u00a0\u00a0924,\u00a0\u00a0980, 1036, 1064, 1120, 1204, 1260, 1316, 1372},\u00a0\u00a0\/\/ Medium<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0{\u00a0\u00a07, 10, 15, 20, 26,\u00a0\u00a036,\u00a0\u00a040,\u00a0\u00a048,\u00a0\u00a060,\u00a0\u00a072,\u00a0\u00a080,\u00a0\u00a096, 104, 120, 132, 144, 168, 180, 196, 224, 224, 252, 270, 300,\u00a0\u00a0312,\u00a0\u00a0336,\u00a0\u00a0360,\u00a0\u00a0390,\u00a0\u00a0420,\u00a0\u00a0450,\u00a0\u00a0480,\u00a0\u00a0510,\u00a0\u00a0540,\u00a0\u00a0570,\u00a0\u00a0570,\u00a0\u00a0600,\u00a0\u00a0630,\u00a0\u00a0660,\u00a0\u00a0720,\u00a0\u00a0750},\u00a0\u00a0\/\/ Low<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0{ 17, 28, 44, 64, 88, 112, 130, 156, 192, 224, 264, 308, 352, 384, 432, 480, 532, 588, 650, 700, 750, 816, 900, 960, 1050, 1110, 1200, 1260, 1350, 1440, 1530, 1620, 1710, 1800, 1890, 1980, 2100, 2220, 2310, 2430},\u00a0\u00a0\/\/ High<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0{ 13, 22, 36, 52, 72,\u00a0\u00a096, 108, 132, 160, 192, 224, 260, 288, 320, 360, 408, 448, 504, 546, 600, 644, 690, 750, 810,\u00a0\u00a0870,\u00a0\u00a0952, 1020, 1050, 1140, 1200, 1290, 1350, 1440, 1530, 1590, 1680, 1770, 1860, 1950, 2040},\u00a0\u00a0\/\/ Quartile<\/div>\n<div>};<\/div>\n<div><\/div>\n<div>static const uint8_t NUM_ERROR_CORRECTION_BLOCKS[4][40] = {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/ Version: (note that index 0 is for padding, and is set to an illegal value)<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/ 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40\u00a0\u00a0\u00a0\u00a0Error correction level<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0{\u00a0\u00a01, 1, 1, 2, 2, 4, 4, 4, 5, 5,\u00a0\u00a05,\u00a0\u00a08,\u00a0\u00a09,\u00a0\u00a09, 10, 10, 11, 13, 14, 16, 17, 17, 18, 20, 21, 23, 25, 26, 28, 29, 31, 33, 35, 37, 38, 40, 43, 45, 47, 49},\u00a0\u00a0\/\/ Medium<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0{\u00a0\u00a01, 1, 1, 1, 1, 2, 2, 2, 2, 4,\u00a0\u00a04,\u00a0\u00a04,\u00a0\u00a04,\u00a0\u00a04,\u00a0\u00a06,\u00a0\u00a06,\u00a0\u00a06,\u00a0\u00a06,\u00a0\u00a07,\u00a0\u00a08,\u00a0\u00a08,\u00a0\u00a09,\u00a0\u00a09, 10, 12, 12, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 24, 25},\u00a0\u00a0\/\/ Low<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0{\u00a0\u00a01, 1, 2, 4, 4, 4, 5, 6, 8, 8, 11, 11, 16, 16, 18, 16, 19, 21, 25, 25, 25, 34, 30, 32, 35, 37, 40, 42, 45, 48, 51, 54, 57, 60, 63, 66, 70, 74, 77, 81},\u00a0\u00a0\/\/ High<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0{\u00a0\u00a01, 1, 2, 2, 4, 4, 6, 6, 8, 8,\u00a0\u00a08, 10, 12, 16, 12, 17, 16, 18, 21, 20, 23, 23, 25, 27, 29, 34, 34, 35, 38, 40, 43, 45, 48, 51, 53, 56, 59, 62, 65, 68},\u00a0\u00a0\/\/ Quartile<\/div>\n<div>};<\/div>\n<div><\/div>\n<div>static const uint16_t NUM_RAW_DATA_MODULES[40] = {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/\u00a0\u00a01,\u00a0\u00a0\u00a02,\u00a0\u00a0\u00a03,\u00a0\u00a0\u00a04,\u00a0\u00a0\u00a0\u00a05,\u00a0\u00a0\u00a0\u00a06,\u00a0\u00a0\u00a0\u00a07,\u00a0\u00a0\u00a0\u00a08,\u00a0\u00a0\u00a0\u00a09,\u00a0\u00a0\u00a010,\u00a0\u00a0\u00a011,\u00a0\u00a0\u00a012,\u00a0\u00a0\u00a013,\u00a0\u00a0\u00a014,\u00a0\u00a0\u00a015,\u00a0\u00a0\u00a016,\u00a0\u00a0\u00a017,<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0208, 359, 567, 807, 1079, 1383, 1568, 1936, 2336, 2768, 3232, 3728, 4256, 4651, 5243, 5867, 6523,<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/\u00a0\u00a0\u00a018,\u00a0\u00a0\u00a019,\u00a0\u00a0\u00a020,\u00a0\u00a0\u00a021,\u00a0\u00a0\u00a0\u00a022,\u00a0\u00a0\u00a0\u00a023,\u00a0\u00a0\u00a0\u00a024,\u00a0\u00a0\u00a0\u00a025,\u00a0\u00a0\u00a026,\u00a0\u00a0\u00a0\u00a027,\u00a0\u00a0\u00a0\u00a0\u00a028,\u00a0\u00a0\u00a0\u00a029,\u00a0\u00a0\u00a0\u00a030,\u00a0\u00a0\u00a0\u00a031,<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a07211, 7931, 8683, 9252, 10068, 10916, 11796, 12708, 13652, 14628, 15371, 16411, 17483, 18587,<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/\u00a0\u00a0\u00a0\u00a032,\u00a0\u00a0\u00a0\u00a033,\u00a0\u00a0\u00a0\u00a034,\u00a0\u00a0\u00a0\u00a035,\u00a0\u00a0\u00a0\u00a036,\u00a0\u00a0\u00a0\u00a037,\u00a0\u00a0\u00a0\u00a038,\u00a0\u00a0\u00a0\u00a039,\u00a0\u00a0\u00a0\u00a040<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a019723, 20891, 22091, 23008, 24272, 25568, 26896, 28256, 29648<\/div>\n<div>};<\/div>\n<div><\/div>\n<div>\/\/ @TODO: Put other LOCK_VERSIONS here<\/div>\n<div>#elif LOCK_VERSION == 3<\/div>\n<div><\/div>\n<div>static const int16_t NUM_ERROR_CORRECTION_CODEWORDS[4] = {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a026, 15, 44, 36<\/div>\n<div>};<\/div>\n<div><\/div>\n<div>static const int8_t NUM_ERROR_CORRECTION_BLOCKS[4] = {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a01, 1, 2, 2<\/div>\n<div>};<\/div>\n<div><\/div>\n<div>static const uint16_t NUM_RAW_DATA_MODULES = 567;<\/div>\n<div><\/div>\n<div>#else<\/div>\n<div><\/div>\n<div>#error Unsupported LOCK_VERSION (add it&#8230;)<\/div>\n<div><\/div>\n<div>#endif<\/div>\n<div><\/div>\n<div><\/div>\n<div>static int max(int a, int b) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0if (a &gt; b) { return a; }<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0return b;<\/div>\n<div>}<\/div>\n<div><\/div>\n<div>\/*<\/div>\n<div>static int abs(int value) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0if (value &lt; 0) { return -value; }<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0return value;<\/div>\n<div>}<\/div>\n<div>*\/<\/div>\n<div><\/div>\n<div><\/div>\n<div>#pragma mark &#8211; Mode testing and conversion<\/div>\n<div><\/div>\n<div>static int8_t getAlphanumeric(char c) {<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0if (c &gt;= &#8216;0&#8217; &amp;&amp; c &lt;= &#8216;9&#8217;) { return (c &#8211; &#8216;0&#8217;); }<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0if (c &gt;= &#8216;A&#8217; &amp;&amp; c &lt;= &#8216;Z&#8217;) { return (c &#8211; &#8216;A&#8217; + 10); }<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0switch (c) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0case &#8216; &#8216;: return 36;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0case &#8216;$&#8217;: return 37;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0case &#8216;%&#8217;: return 38;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0case &#8216;*&#8217;: return 39;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0case &#8216;+&#8217;: return 40;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0case &#8216;-&#8216;: return 41;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0case &#8216;.&#8217;: return 42;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0case &#8216;\/&#8217;: return 43;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0case &#8216;:&#8217;: return 44;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0return -1;<\/div>\n<div>}<\/div>\n<div><\/div>\n<div>static bool isAlphanumeric(const char *text, uint16_t length) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0while (length != 0) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (getAlphanumeric(text[&#8211;length]) == -1) { return false; }<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0return true;<\/div>\n<div>}<\/div>\n<div><\/div>\n<div><\/div>\n<div>static bool isNumeric(const char *text, uint16_t length) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0while (length != 0) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0char c = text[&#8211;length];<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (c &lt; &#8216;0&#8217; || c &gt; &#8216;9&#8217;) { return false; }<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0return true;<\/div>\n<div>}<\/div>\n<div><\/div>\n<div><\/div>\n<div>#pragma mark &#8211; Counting<\/div>\n<div><\/div>\n<div>\/\/ We store the following tightly packed (less 8) in modeInfo<\/div>\n<div>\/\/\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;=9\u00a0\u00a0&lt;=26\u00a0\u00a0&lt;= 40<\/div>\n<div>\/\/ NUMERIC\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0( 10,\u00a0\u00a0\u00a012,\u00a0\u00a0\u00a0\u00a014);<\/div>\n<div>\/\/ ALPHANUMERIC (\u00a0\u00a09,\u00a0\u00a0\u00a011,\u00a0\u00a0\u00a0\u00a013);<\/div>\n<div>\/\/ BYTE\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0(\u00a0\u00a08,\u00a0\u00a0\u00a016,\u00a0\u00a0\u00a0\u00a016);<\/div>\n<div>static char getModeBits(uint8_t version, uint8_t mode) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/ Note: We use 15 instead of 16; since 15 doesn&#8217;t exist and we cannot store 16 (8 + 8) in 3 bits<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/ hex(int(&#8220;&#8221;.join(reversed([(&#8217;00&#8217; + bin(x &#8211; 8)[2:])[-3:] for x in [10, 9, 8, 12, 11, 15, 14, 13, 15]])), 2))<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0unsigned int modeInfo = 0x7bbb80a;<\/div>\n<div><\/div>\n<div>#if LOCK_VERSION == 0 || LOCK_VERSION &gt; 9<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0if (version &gt; 9) { modeInfo &gt;&gt;= 9; }<\/div>\n<div>#endif<\/div>\n<div><\/div>\n<div>#if LOCK_VERSION == 0 || LOCK_VERSION &gt; 26<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0if (version &gt; 26) { modeInfo &gt;&gt;= 9; }<\/div>\n<div>#endif<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0char result = 8 + ((modeInfo &gt;&gt; (3 * mode)) &amp; 0x07);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0if (result == 15) { result = 16; }<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0return result;<\/div>\n<div>}<\/div>\n<div><\/div>\n<div><\/div>\n<div>#pragma mark &#8211; BitBucket<\/div>\n<div><\/div>\n<div>typedef struct BitBucket {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0uint32_t bitOffsetOrWidth;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0uint16_t capacityBytes;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0uint8_t *data;<\/div>\n<div>} BitBucket;<\/div>\n<div><\/div>\n<div>\/*<\/div>\n<div>void bb_dump(BitBucket *bitBuffer) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0printf(&#8220;Buffer: &#8220;);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0for (uint32_t i = 0; i &lt; bitBuffer-&gt;capacityBytes; i++) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0printf(&#8220;%02x&#8221;, bitBuffer-&gt;data[i]);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if ((i % 4) == 3) { printf(&#8221; &#8220;); }<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0printf(&#8220;\\n&#8221;);<\/div>\n<div>}<\/div>\n<div>*\/<\/div>\n<div><\/div>\n<div>static uint16_t bb_getGridSizeBytes(uint8_t size) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0return (((size * size) + 7) \/ 8);<\/div>\n<div>}<\/div>\n<div><\/div>\n<div>static uint16_t bb_getBufferSizeBytes(uint32_t bits) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0return ((bits + 7) \/ 8);<\/div>\n<div>}<\/div>\n<div><\/div>\n<div>static void bb_initBuffer(BitBucket *bitBuffer, uint8_t *data, int32_t capacityBytes) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0bitBuffer-&gt;bitOffsetOrWidth = 0;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0bitBuffer-&gt;capacityBytes = capacityBytes;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0bitBuffer-&gt;data = data;<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0memset(data, 0, bitBuffer-&gt;capacityBytes);<\/div>\n<div>}<\/div>\n<div><\/div>\n<div>static void bb_initGrid(BitBucket *bitGrid, uint8_t *data, uint8_t size) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0bitGrid-&gt;bitOffsetOrWidth = size;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0bitGrid-&gt;capacityBytes = bb_getGridSizeBytes(size);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0bitGrid-&gt;data = data;<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0memset(data, 0, bitGrid-&gt;capacityBytes);<\/div>\n<div>}<\/div>\n<div><\/div>\n<div>static void bb_appendBits(BitBucket *bitBuffer, uint32_t val, uint8_t length) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0uint32_t offset = bitBuffer-&gt;bitOffsetOrWidth;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0for (int8_t i = length &#8211; 1; i &gt;= 0; i&#8211;, offset++) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0bitBuffer-&gt;data[offset &gt;&gt; 3] |= ((val &gt;&gt; i) &amp; 1) &lt;&lt; (7 &#8211; (offset &amp; 7));<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0bitBuffer-&gt;bitOffsetOrWidth = offset;<\/div>\n<div>}<\/div>\n<div>\/*<\/div>\n<div>void bb_setBits(BitBucket *bitBuffer, uint32_t val, int offset, uint8_t length) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0for (int8_t i = length &#8211; 1; i &gt;= 0; i&#8211;, offset++) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0bitBuffer-&gt;data[offset &gt;&gt; 3] |= ((val &gt;&gt; i) &amp; 1) &lt;&lt; (7 &#8211; (offset &amp; 7));<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>}<\/div>\n<div>*\/<\/div>\n<div>static void bb_setBit(BitBucket *bitGrid, uint8_t x, uint8_t y, bool on) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0uint32_t offset = y * bitGrid-&gt;bitOffsetOrWidth + x;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0uint8_t mask = 1 &lt;&lt; (7 &#8211; (offset &amp; 0x07));<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0if (on) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0bitGrid-&gt;data[offset &gt;&gt; 3] |= mask;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0} else {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0bitGrid-&gt;data[offset &gt;&gt; 3] &amp;= ~mask;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>}<\/div>\n<div><\/div>\n<div>static void bb_invertBit(BitBucket *bitGrid, uint8_t x, uint8_t y, bool invert) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0uint32_t offset = y * bitGrid-&gt;bitOffsetOrWidth + x;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0uint8_t mask = 1 &lt;&lt; (7 &#8211; (offset &amp; 0x07));<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0bool on = ((bitGrid-&gt;data[offset &gt;&gt; 3] &amp; (1 &lt;&lt; (7 &#8211; (offset &amp; 0x07)))) != 0);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0if (on ^ invert) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0bitGrid-&gt;data[offset &gt;&gt; 3] |= mask;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0} else {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0bitGrid-&gt;data[offset &gt;&gt; 3] &amp;= ~mask;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>}<\/div>\n<div><\/div>\n<div>static bool bb_getBit(BitBucket *bitGrid, uint8_t x, uint8_t y) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0uint32_t offset = y * bitGrid-&gt;bitOffsetOrWidth + x;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0return (bitGrid-&gt;data[offset &gt;&gt; 3] &amp; (1 &lt;&lt; (7 &#8211; (offset &amp; 0x07)))) != 0;<\/div>\n<div>}<\/div>\n<div><\/div>\n<div><\/div>\n<div>#pragma mark &#8211; Drawing Patterns<\/div>\n<div><\/div>\n<div>\/\/ XORs the data modules in this QR Code with the given mask pattern. Due to XOR&#8217;s mathematical<\/div>\n<div>\/\/ properties, calling applyMask(m) twice with the same value is equivalent to no change at all.<\/div>\n<div>\/\/ This means it is possible to apply a mask, undo it, and try another mask. Note that a final<\/div>\n<div>\/\/ well-formed QR Code symbol needs exactly one mask applied (not zero, not two, etc.).<\/div>\n<div>static void applyMask(BitBucket *modules, BitBucket *isFunction, uint8_t mask) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0uint8_t size = modules-&gt;bitOffsetOrWidth;<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0for (uint8_t y = 0; y &lt; size; y++) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0for (uint8_t x = 0; x &lt; size; x++) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (bb_getBit(isFunction, x, y)) { continue; }<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0bool invert = 0;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0switch (mask) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0case 0:\u00a0\u00a0invert = (x + y) % 2 == 0;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0break;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0case 1:\u00a0\u00a0invert = y % 2 == 0;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0break;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0case 2:\u00a0\u00a0invert = x % 3 == 0;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0break;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0case 3:\u00a0\u00a0invert = (x + y) % 3 == 0;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0break;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0case 4:\u00a0\u00a0invert = (x \/ 3 + y \/ 2) % 2 == 0;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0break;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0case 5:\u00a0\u00a0invert = x * y % 2 + x * y % 3 == 0;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0break;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0case 6:\u00a0\u00a0invert = (x * y % 2 + x * y % 3) % 2 == 0;\u00a0\u00a0\u00a0\u00a0break;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0case 7:\u00a0\u00a0invert = ((x + y) % 2 + x * y % 3) % 2 == 0;\u00a0\u00a0break;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0bb_invertBit(modules, x, y, invert);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>}<\/div>\n<div><\/div>\n<div>static void setFunctionModule(BitBucket *modules, BitBucket *isFunction, uint8_t x, uint8_t y, bool on) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0bb_setBit(modules, x, y, on);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0bb_setBit(isFunction, x, y, true);<\/div>\n<div>}<\/div>\n<div><\/div>\n<div>\/\/ Draws a 9*9 finder pattern including the border separator, with the center module at (x, y).<\/div>\n<div>static void drawFinderPattern(BitBucket *modules, BitBucket *isFunction, uint8_t x, uint8_t y) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0uint8_t size = modules-&gt;bitOffsetOrWidth;<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0for (int8_t i = -4; i &lt;= 4; i++) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0for (int8_t j = -4; j &lt;= 4; j++) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0uint8_t dist = max(abs(i), abs(j));\u00a0\u00a0\/\/ Chebyshev\/infinity norm<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0int16_t xx = x + j, yy = y + i;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (0 &lt;= xx &amp;&amp; xx &lt; size &amp;&amp; 0 &lt;= yy &amp;&amp; yy &lt; size) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0setFunctionModule(modules, isFunction, xx, yy, dist != 2 &amp;&amp; dist != 4);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>}<\/div>\n<div><\/div>\n<div>\/\/ Draws a 5*5 alignment pattern, with the center module at (x, y).<\/div>\n<div>static void drawAlignmentPattern(BitBucket *modules, BitBucket *isFunction, uint8_t x, uint8_t y) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0for (int8_t i = -2; i &lt;= 2; i++) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0for (int8_t j = -2; j &lt;= 2; j++) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0setFunctionModule(modules, isFunction, x + j, y + i, max(abs(i), abs(j)) != 1);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>}<\/div>\n<div><\/div>\n<div>\/\/ Draws two copies of the format bits (with its own error correction code)<\/div>\n<div>\/\/ based on the given mask and this object&#8217;s error correction level field.<\/div>\n<div>static void drawFormatBits(BitBucket *modules, BitBucket *isFunction, uint8_t ecc, uint8_t mask) {<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0uint8_t size = modules-&gt;bitOffsetOrWidth;<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/ Calculate error correction code and pack bits<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0uint32_t data = ecc &lt;&lt; 3 | mask;\u00a0\u00a0\/\/ errCorrLvl is uint2, mask is uint3<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0uint32_t rem = data;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0for (int i = 0; i &lt; 10; i++) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0rem = (rem &lt;&lt; 1) ^ ((rem &gt;&gt; 9) * 0x537);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0data = data &lt;&lt; 10 | rem;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0data ^= 0x5412;\u00a0\u00a0\/\/ uint15<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/ Draw first copy<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0for (uint8_t i = 0; i &lt;= 5; i++) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0setFunctionModule(modules, isFunction, 8, i, ((data &gt;&gt; i) &amp; 1) != 0);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0setFunctionModule(modules, isFunction, 8, 7, ((data &gt;&gt; 6) &amp; 1) != 0);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0setFunctionModule(modules, isFunction, 8, 8, ((data &gt;&gt; 7) &amp; 1) != 0);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0setFunctionModule(modules, isFunction, 7, 8, ((data &gt;&gt; 8) &amp; 1) != 0);<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0for (int8_t i = 9; i &lt; 15; i++) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0setFunctionModule(modules, isFunction, 14 &#8211; i, 8, ((data &gt;&gt; i) &amp; 1) != 0);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/ Draw second copy<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0for (int8_t i = 0; i &lt;= 7; i++) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0setFunctionModule(modules, isFunction, size &#8211; 1 &#8211; i, 8, ((data &gt;&gt; i) &amp; 1) != 0);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0for (int8_t i = 8; i &lt; 15; i++) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0setFunctionModule(modules, isFunction, 8, size &#8211; 15 + i, ((data &gt;&gt; i) &amp; 1) != 0);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0setFunctionModule(modules, isFunction, 8, size &#8211; 8, true);<\/div>\n<div>}<\/div>\n<div><\/div>\n<div><\/div>\n<div>\/\/ Draws two copies of the version bits (with its own error correction code),<\/div>\n<div>\/\/ based on this object&#8217;s version field (which only has an effect for 7 &lt;= version &lt;= 40).<\/div>\n<div>static void drawVersion(BitBucket *modules, BitBucket *isFunction, uint8_t version) {<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0int8_t size = modules-&gt;bitOffsetOrWidth;<\/div>\n<div><\/div>\n<div>#if LOCK_VERSION != 0 &amp;&amp; LOCK_VERSION &lt; 7<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0return;<\/div>\n<div><\/div>\n<div>#else<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0if (version &lt; 7) { return; }<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/ Calculate error correction code and pack bits<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0uint32_t rem = version;\u00a0\u00a0\/\/ version is uint6, in the range [7, 40]<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0for (uint8_t i = 0; i &lt; 12; i++) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0rem = (rem &lt;&lt; 1) ^ ((rem &gt;&gt; 11) * 0x1F25);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0uint32_t data = version &lt;&lt; 12 | rem;\u00a0\u00a0\/\/ uint18<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/ Draw two copies<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0for (uint8_t i = 0; i &lt; 18; i++) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0bool bit = ((data &gt;&gt; i) &amp; 1) != 0;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0uint8_t a = size &#8211; 11 + i % 3, b = i \/ 3;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0setFunctionModule(modules, isFunction, a, b, bit);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0setFunctionModule(modules, isFunction, b, a, bit);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div><\/div>\n<div>#endif<\/div>\n<div>}<\/div>\n<div><\/div>\n<div>static void drawFunctionPatterns(BitBucket *modules, BitBucket *isFunction, uint8_t version, uint8_t ecc) {<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0uint8_t size = modules-&gt;bitOffsetOrWidth;<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/ Draw the horizontal and vertical timing patterns<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0for (uint8_t i = 0; i &lt; size; i++) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0setFunctionModule(modules, isFunction, 6, i, i % 2 == 0);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0setFunctionModule(modules, isFunction, i, 6, i % 2 == 0);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/ Draw 3 finder patterns (all corners except bottom right; overwrites some timing modules)<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0drawFinderPattern(modules, isFunction, 3, 3);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0drawFinderPattern(modules, isFunction, size &#8211; 4, 3);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0drawFinderPattern(modules, isFunction, 3, size &#8211; 4);<\/div>\n<div><\/div>\n<div>#if LOCK_VERSION == 0 || LOCK_VERSION &gt; 1<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0if (version &gt; 1) {<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ Draw the numerous alignment patterns<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0uint8_t alignCount = version \/ 7 + 2;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0uint8_t step;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (version != 32) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0step = (version * 4 + alignCount * 2 + 1) \/ (2 * alignCount &#8211; 2) * 2;\u00a0\u00a0\/\/ ceil((size &#8211; 13) \/ (2*numAlign &#8211; 2)) * 2<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} else { \/\/ C-C-C-Combo breaker!<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0step = 26;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0uint8_t alignPositionIndex = alignCount &#8211; 1;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/uint8_t alignPosition[alignCount];<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0uint8_t alignPosition[2]; \/\/alignCount<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0alignPosition[0] = 6;<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0uint8_t size = version * 4 + 17;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0for (uint8_t i = 0, pos = size &#8211; 7; i &lt; alignCount &#8211; 1; i++, pos -= step) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0alignPosition[alignPositionIndex&#8211;] = pos;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0for (uint8_t i = 0; i &lt; alignCount; i++) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0for (uint8_t j = 0; j &lt; alignCount; j++) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if ((i == 0 &amp;&amp; j == 0) || (i == 0 &amp;&amp; j == alignCount &#8211; 1) || (i == alignCount &#8211; 1 &amp;&amp; j == 0)) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0continue;\u00a0\u00a0\/\/ Skip the three finder corners<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} else {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0drawAlignmentPattern(modules, isFunction, alignPosition[i], alignPosition[j]);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div><\/div>\n<div>#endif<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/ Draw configuration data<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0drawFormatBits(modules, isFunction, ecc, 0);\u00a0\u00a0\/\/ Dummy mask value; overwritten later in the constructor<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0drawVersion(modules, isFunction, version);<\/div>\n<div>}<\/div>\n<div><\/div>\n<div><\/div>\n<div>\/\/ Draws the given sequence of 8-bit codewords (data and error correction) onto the entire<\/div>\n<div>\/\/ data area of this QR Code symbol. Function modules need to be marked off before this is called.<\/div>\n<div>static void drawCodewords(BitBucket *modules, BitBucket *isFunction, BitBucket *codewords) {<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0uint32_t bitLength = codewords-&gt;bitOffsetOrWidth;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0uint8_t *data = codewords-&gt;data;<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0uint8_t size = modules-&gt;bitOffsetOrWidth;<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/ Bit index into the data<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0uint32_t i = 0;<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/ Do the funny zigzag scan<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0for (int16_t right = size &#8211; 1; right &gt;= 1; right -= 2) {\u00a0\u00a0\/\/ Index of right column in each column pair<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (right == 6) { right = 5; }<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0for (uint8_t vert = 0; vert &lt; size; vert++) {\u00a0\u00a0\/\/ Vertical counter<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0for (int j = 0; j &lt; 2; j++) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0uint8_t x = right &#8211; j;\u00a0\u00a0\/\/ Actual x coordinate<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0bool upwards = ((right &amp; 2) == 0) ^ (x &lt; 6);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0uint8_t y = upwards ? size &#8211; 1 &#8211; vert : vert;\u00a0\u00a0\/\/ Actual y coordinate<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (!bb_getBit(isFunction, x, y) &amp;&amp; i &lt; bitLength) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0bb_setBit(modules, x, y, ((data[i &gt;&gt; 3] &gt;&gt; (7 &#8211; (i &amp; 7))) &amp; 1) != 0);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0i++;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ If there are any remainder bits (0 to 7), they are already<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ set to 0\/false\/white when the grid of modules was initialized<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>}<\/div>\n<div><\/div>\n<div><\/div>\n<div><\/div>\n<div>#pragma mark &#8211; Penalty Calculation<\/div>\n<div><\/div>\n<div>#define PENALTY_N1\u00a0\u00a0\u00a0\u00a0\u00a0\u00a03<\/div>\n<div>#define PENALTY_N2\u00a0\u00a0\u00a0\u00a0\u00a0\u00a03<\/div>\n<div>#define PENALTY_N3\u00a0\u00a0\u00a0\u00a0\u00a040<\/div>\n<div>#define PENALTY_N4\u00a0\u00a0\u00a0\u00a0\u00a010<\/div>\n<div><\/div>\n<div>\/\/ Calculates and returns the penalty score based on state of this QR Code&#8217;s current modules.<\/div>\n<div>\/\/ This is used by the automatic mask choice algorithm to find the mask pattern that yields the lowest score.<\/div>\n<div>\/\/ @TODO: This can be optimized by working with the bytes instead of bits.<\/div>\n<div>static uint32_t getPenaltyScore(BitBucket *modules) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0uint32_t result = 0;<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0uint8_t size = modules-&gt;bitOffsetOrWidth;<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/ Adjacent modules in row having same color<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0for (uint8_t y = 0; y &lt; size; y++) {<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0bool colorX = bb_getBit(modules, 0, y);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0for (uint8_t x = 1, runX = 1; x &lt; size; x++) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0bool cx = bb_getBit(modules, x, y);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (cx != colorX) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0colorX = cx;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0runX = 1;<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} else {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0runX++;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (runX == 5) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0result += PENALTY_N1;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} else if (runX &gt; 5) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0result++;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/ Adjacent modules in column having same color<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0for (uint8_t x = 0; x &lt; size; x++) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0bool colorY = bb_getBit(modules, x, 0);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0for (uint8_t y = 1, runY = 1; y &lt; size; y++) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0bool cy = bb_getBit(modules, x, y);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (cy != colorY) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0colorY = cy;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0runY = 1;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} else {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0runY++;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (runY == 5) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0result += PENALTY_N1;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} else if (runY &gt; 5) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0result++;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0uint16_t black = 0;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0for (uint8_t y = 0; y &lt; size; y++) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0uint16_t bitsRow = 0, bitsCol = 0;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0for (uint8_t x = 0; x &lt; size; x++) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0bool color = bb_getBit(modules, x, y);<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ 2*2 blocks of modules having same color<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (x &gt; 0 &amp;&amp; y &gt; 0) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0bool colorUL = bb_getBit(modules, x &#8211; 1, y &#8211; 1);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0bool colorUR = bb_getBit(modules, x, y &#8211; 1);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0bool colorL = bb_getBit(modules, x &#8211; 1, y);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (color == colorUL &amp;&amp; color == colorUR &amp;&amp; color == colorL) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0result += PENALTY_N2;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ Finder-like pattern in rows and columns<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0bitsRow = ((bitsRow &lt;&lt; 1) &amp; 0x7FF) | color;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0bitsCol = ((bitsCol &lt;&lt; 1) &amp; 0x7FF) | bb_getBit(modules, y, x);<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ Needs 11 bits accumulated<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (x &gt;= 10) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (bitsRow == 0x05D || bitsRow == 0x5D0) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0result += PENALTY_N3;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (bitsCol == 0x05D || bitsCol == 0x5D0) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0result += PENALTY_N3;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ Balance of black and white modules<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (color) { black++; }<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/ Find smallest k such that (45-5k)% &lt;= dark\/total &lt;= (55+5k)%<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0uint16_t total = size * size;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0for (uint16_t k = 0; black * 20 &lt; (9 &#8211; k) * total || black * 20 &gt; (11 + k) * total; k++) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0result += PENALTY_N4;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0return result;<\/div>\n<div>}<\/div>\n<div><\/div>\n<div><\/div>\n<div>#pragma mark &#8211; Reed-Solomon Generator<\/div>\n<div><\/div>\n<div>static uint8_t rs_multiply(uint8_t x, uint8_t y) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/ Russian peasant multiplication<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/ See: <a href=\"https:\/\/en.wikipedia.org\/wiki\/Ancient_Egyptian_multiplication\">https:\/\/en.wikipedia.org\/wiki\/Ancient_Egyptian_multiplication<\/a><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0uint16_t z = 0;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0for (int8_t i = 7; i &gt;= 0; i&#8211;) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0z = (z &lt;&lt; 1) ^ ((z &gt;&gt; 7) * 0x11D);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0z ^= ((y &gt;&gt; i) &amp; 1) * x;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0return z;<\/div>\n<div>}<\/div>\n<div><\/div>\n<div>static void rs_init(uint8_t degree, uint8_t *coeff) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0memset(coeff, 0, degree);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0coeff[degree &#8211; 1] = 1;<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/ Compute the product polynomial (x &#8211; r^0) * (x &#8211; r^1) * (x &#8211; r^2) * &#8230; * (x &#8211; r^{degree-1}),<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/ drop the highest term, and store the rest of the coefficients in order of descending powers.<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/ Note that r = 0x02, which is a generator element of this field GF(2^8\/0x11D).<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0uint16_t root = 1;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0for (uint8_t i = 0; i &lt; degree; i++) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ Multiply the current product by (x &#8211; r^i)<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0for (uint8_t j = 0; j &lt; degree; j++) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0coeff[j] = rs_multiply(coeff[j], root);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (j + 1 &lt; degree) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0coeff[j] ^= coeff[j + 1];<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0root = (root &lt;&lt; 1) ^ ((root &gt;&gt; 7) * 0x11D);\u00a0\u00a0\/\/ Multiply by 0x02 mod GF(2^8\/0x11D)<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>}<\/div>\n<div><\/div>\n<div>static void rs_getRemainder(uint8_t degree, uint8_t *coeff, uint8_t *data, uint8_t length, uint8_t *result, uint8_t stride) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/ Compute the remainder by performing polynomial division<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/for (uint8_t i = 0; i &lt; degree; i++) { result[] = 0; }<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/memset(result, 0, degree);<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0for (uint8_t i = 0; i &lt; length; i++) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0uint8_t factor = data[i] ^ result[0];<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0for (uint8_t j = 1; j &lt; degree; j++) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0result[(j &#8211; 1) * stride] = result[j * stride];<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0result[(degree &#8211; 1) * stride] = 0;<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0for (uint8_t j = 0; j &lt; degree; j++) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0result[j * stride] ^= rs_multiply(coeff[j], factor);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>}<\/div>\n<div><\/div>\n<div><\/div>\n<div><\/div>\n<div>#pragma mark &#8211; QrCode<\/div>\n<div><\/div>\n<div>static int8_t encodeDataCodewords(BitBucket *dataCodewords, const uint8_t *text, uint16_t length, uint8_t version) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0int8_t mode = MODE_BYTE;<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0if (isNumeric((char*)text, length)) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0mode = MODE_NUMERIC;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0bb_appendBits(dataCodewords, 1 &lt;&lt; MODE_NUMERIC, 4);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0bb_appendBits(dataCodewords, length, getModeBits(version, MODE_NUMERIC));<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0uint16_t accumData = 0;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0uint8_t accumCount = 0;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0for (uint16_t i = 0; i &lt; length; i++) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0accumData = accumData * 10 + ((char)(text[i]) &#8211; &#8216;0&#8217;);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0accumCount++;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (accumCount == 3) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0bb_appendBits(dataCodewords, accumData, 10);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0accumData = 0;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0accumCount = 0;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ 1 or 2 digits remaining<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (accumCount &gt; 0) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0bb_appendBits(dataCodewords, accumData, accumCount * 3 + 1);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0} else if (isAlphanumeric((char*)text, length)) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0mode = MODE_ALPHANUMERIC;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0bb_appendBits(dataCodewords, 1 &lt;&lt; MODE_ALPHANUMERIC, 4);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0bb_appendBits(dataCodewords, length, getModeBits(version, MODE_ALPHANUMERIC));<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0uint16_t accumData = 0;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0uint8_t accumCount = 0;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0for (uint16_t i = 0; i\u00a0\u00a0&lt; length; i++) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0accumData = accumData * 45 + getAlphanumeric((char)(text[i]));<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0accumCount++;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (accumCount == 2) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0bb_appendBits(dataCodewords, accumData, 11);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0accumData = 0;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0accumCount = 0;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ 1 character remaining<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (accumCount &gt; 0) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0bb_appendBits(dataCodewords, accumData, 6);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0} else {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0bb_appendBits(dataCodewords, 1 &lt;&lt; MODE_BYTE, 4);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0bb_appendBits(dataCodewords, length, getModeBits(version, MODE_BYTE));<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0for (uint16_t i = 0; i &lt; length; i++) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0bb_appendBits(dataCodewords, (char)(text[i]), 8);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/bb_setBits(dataCodewords, length, 4, getModeBits(version, mode));<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0return mode;<\/div>\n<div>}<\/div>\n<div><\/div>\n<div>static void performErrorCorrection(uint8_t version, uint8_t ecc, BitBucket *data) {<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/ See: <a href=\"http:\/\/www.thonky.com\/qr-code-tutorial\/structure-final-message\">http:\/\/www.thonky.com\/qr-code-tutorial\/structure-final-message<\/a><\/div>\n<div><\/div>\n<div>#if LOCK_VERSION == 0<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0uint8_t numBlocks = NUM_ERROR_CORRECTION_BLOCKS[ecc][version &#8211; 1];<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0uint16_t totalEcc = NUM_ERROR_CORRECTION_CODEWORDS[ecc][version &#8211; 1];<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0uint16_t moduleCount = NUM_RAW_DATA_MODULES[version &#8211; 1];<\/div>\n<div>#else<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0uint8_t numBlocks = NUM_ERROR_CORRECTION_BLOCKS[ecc];<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0uint16_t totalEcc = NUM_ERROR_CORRECTION_CODEWORDS[ecc];<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0uint16_t moduleCount = NUM_RAW_DATA_MODULES;<\/div>\n<div>#endif<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0uint8_t blockEccLen = totalEcc \/ numBlocks;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0uint8_t numShortBlocks = numBlocks &#8211; moduleCount \/ 8 % numBlocks;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0uint8_t shortBlockLen = moduleCount \/ 8 \/ numBlocks;<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0uint8_t shortDataBlockLen = shortBlockLen &#8211; blockEccLen;<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/uint8_t result[data-&gt;capacityBytes];<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0uint8_t result[203]; \/\/data-&gt;capacityBytes<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0memset(result, 0, sizeof(result));<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/uint8_t coeff[blockEccLen];<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0uint8_t coeff[20]; \/\/blockEccLen<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0rs_init(blockEccLen, coeff);<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0uint16_t offset = 0;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0uint8_t *dataBytes = data-&gt;data;<\/div>\n<div><\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/ Interleave all short blocks<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0for (uint8_t i = 0; i &lt; shortDataBlockLen; i++) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0uint16_t index = i;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0uint8_t stride = shortDataBlockLen;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0for (uint8_t blockNum = 0; blockNum &lt; numBlocks; blockNum++) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0result[offset++] = dataBytes[index];<\/div>\n<div><\/div>\n<div>#if LOCK_VERSION == 0 || LOCK_VERSION &gt;= 5<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (blockNum == numShortBlocks) { stride++; }<\/div>\n<div>#endif<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0index += stride;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/ Version less than 5 only have short blocks<\/div>\n<div>#if LOCK_VERSION == 0 || LOCK_VERSION &gt;= 5<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0{<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ Interleave long blocks<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0uint16_t index = shortDataBlockLen * (numShortBlocks + 1);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0uint8_t stride = shortDataBlockLen;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0for (uint8_t blockNum = 0; blockNum &lt; numBlocks &#8211; numShortBlocks; blockNum++) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0result[offset++] = dataBytes[index];<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (blockNum == 0) { stride++; }<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0index += stride;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>#endif<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/ Add all ecc blocks, interleaved<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0uint8_t blockSize = shortDataBlockLen;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0for (uint8_t blockNum = 0; blockNum &lt; numBlocks; blockNum++) {<\/div>\n<div><\/div>\n<div>#if LOCK_VERSION == 0 || LOCK_VERSION &gt;= 5<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (blockNum == numShortBlocks) { blockSize++; }<\/div>\n<div>#endif<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0rs_getRemainder(blockEccLen, coeff, dataBytes, blockSize, &amp;result[offset + blockNum], numBlocks);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0dataBytes += blockSize;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0memcpy(data-&gt;data, result, data-&gt;capacityBytes);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0data-&gt;bitOffsetOrWidth = moduleCount;<\/div>\n<div>}<\/div>\n<div><\/div>\n<div>\/\/ We store the Format bits tightly packed into a single byte (each of the 4 modes is 2 bits)<\/div>\n<div>\/\/ The format bits can be determined by ECC_FORMAT_BITS &gt;&gt; (2 * ecc)<\/div>\n<div>static const uint8_t ECC_FORMAT_BITS = (0x02 &lt;&lt; 6) | (0x03 &lt;&lt; 4) | (0x00 &lt;&lt; 2) | (0x01 &lt;&lt; 0);<\/div>\n<div><\/div>\n<div><\/div>\n<div>#pragma mark &#8211; Public QRCode functions<\/div>\n<div><\/div>\n<div>uint16_t qrcode_getBufferSize(uint8_t version) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0return bb_getGridSizeBytes(4 * version + 17);<\/div>\n<div>}<\/div>\n<div><\/div>\n<div>\/\/ @TODO: Return error if data is too big.<\/div>\n<div>int8_t qrcode_initBytes(QRCode *qrcode, uint8_t *modules, uint8_t version, uint8_t ecc, uint8_t *data, uint16_t length) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0uint8_t size = version * 4 + 17;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0qrcode-&gt;version = version;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0qrcode-&gt;size = size;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0qrcode-&gt;ecc = ecc;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0qrcode-&gt;modules = modules;<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0uint8_t eccFormatBits = (ECC_FORMAT_BITS &gt;&gt; (2 * ecc)) &amp; 0x03;<\/div>\n<div><\/div>\n<div>#if LOCK_VERSION == 0<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0uint16_t moduleCount = NUM_RAW_DATA_MODULES[version &#8211; 1];<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0uint16_t dataCapacity = moduleCount \/ 8 &#8211; NUM_ERROR_CORRECTION_CODEWORDS[eccFormatBits][version &#8211; 1];<\/div>\n<div>#else<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0version = LOCK_VERSION;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0uint16_t moduleCount = NUM_RAW_DATA_MODULES;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0uint16_t dataCapacity = moduleCount \/ 8 &#8211; NUM_ERROR_CORRECTION_CODEWORDS[eccFormatBits];<\/div>\n<div>#endif<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0struct BitBucket codewords;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/uint8_t codewordBytes[bb_getBufferSizeBytes(moduleCount)];<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0uint8_t codewordBytes[203]; \/\/bb_getBufferSizeBytes(moduleCount)<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0bb_initBuffer(&amp;codewords, codewordBytes, (int32_t)sizeof(codewordBytes));<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/ Place the data code words into the buffer<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0int8_t mode = encodeDataCodewords(&amp;codewords, data, length, version);<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0if (mode &lt; 0) { return -1; }<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0qrcode-&gt;mode = mode;<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/ Add terminator and pad up to a byte if applicable<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0uint32_t padding = (dataCapacity * 8) &#8211; codewords.bitOffsetOrWidth;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0if (padding &gt; 4) { padding = 4; }<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0bb_appendBits(&amp;codewords, 0, padding);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0bb_appendBits(&amp;codewords, 0, (8 &#8211; codewords.bitOffsetOrWidth % 8) % 8);<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/ Pad with alternate bytes until data capacity is reached<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0for (uint8_t padByte = 0xEC; codewords.bitOffsetOrWidth &lt; (dataCapacity * 8); padByte ^= 0xEC ^ 0x11) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0bb_appendBits(&amp;codewords, padByte, 8);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0BitBucket modulesGrid;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0bb_initGrid(&amp;modulesGrid, modules, size);<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0BitBucket isFunctionGrid;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/uint8_t isFunctionGridBytes[bb_getGridSizeBytes(size)];<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0uint8_t isFunctionGridBytes[137]; \/\/bb_getGridSizeBytes(size)<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0bb_initGrid(&amp;isFunctionGrid, isFunctionGridBytes, size);<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/ Draw function patterns, draw all codewords, do masking<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0drawFunctionPatterns(&amp;modulesGrid, &amp;isFunctionGrid, version, eccFormatBits);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0performErrorCorrection(version, eccFormatBits, &amp;codewords);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0drawCodewords(&amp;modulesGrid, &amp;isFunctionGrid, &amp;codewords);<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/ Find the best (lowest penalty) mask<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0uint8_t mask = 0;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0int32_t minPenalty = INT32_MAX;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0for (uint8_t i = 0; i &lt; 8; i++) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0drawFormatBits(&amp;modulesGrid, &amp;isFunctionGrid, eccFormatBits, i);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0applyMask(&amp;modulesGrid, &amp;isFunctionGrid, i);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0int penalty = getPenaltyScore(&amp;modulesGrid);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (penalty &lt; minPenalty) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0mask = i;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0minPenalty = penalty;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0applyMask(&amp;modulesGrid, &amp;isFunctionGrid, i);\u00a0\u00a0\/\/ Undoes the mask due to XOR<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0qrcode-&gt;mask = mask;<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/ Overwrite old format bits<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0drawFormatBits(&amp;modulesGrid, &amp;isFunctionGrid, eccFormatBits, mask);<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/ Apply the final choice of mask<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0applyMask(&amp;modulesGrid, &amp;isFunctionGrid, mask);<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0return 0;<\/div>\n<div>}<\/div>\n<div><\/div>\n<div>int8_t qrcode_initText(QRCode *qrcode, uint8_t *modules, uint8_t version, uint8_t ecc, const char *data) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0return qrcode_initBytes(qrcode, modules, version, ecc, (uint8_t*)data, strlen(data));<\/div>\n<div>}<\/div>\n<div><\/div>\n<div>bool qrcode_getModule(QRCode *qrcode, uint8_t x, uint8_t y) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0if (x &lt; 0 || x &gt;= qrcode-&gt;size || y &lt; 0 || y &gt;= qrcode-&gt;size) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return false;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0uint32_t offset = y * qrcode-&gt;size + x;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0return (qrcode-&gt;modules[offset &gt;&gt; 3] &amp; (1 &lt;&lt; (7 &#8211; (offset &amp; 0x07)))) != 0;<\/div>\n<div>}<\/div>\n<div><\/div>\n<div>\/*<\/div>\n<div>uint8_t qrcode_getHexLength(QRCode *qrcode) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0return ((qrcode-&gt;size * qrcode-&gt;size) + 7) \/ 4;<\/div>\n<div>}<\/div>\n<div>void qrcode_getHex(QRCode *qrcode, char *result) {<\/div>\n<div><\/div>\n<div>}<\/div>\n<div>*\/<\/div>\n<div><\/div>\n<div><\/div>\n<div>\/\/Produce QRCode, only support Model1, no Model2.<\/div>\n<div>\/\/posX, posY: related to canvas.<\/div>\n<div>\/\/width, height: width*33 = real qrcode width, height*33 = real qrcode height.<\/div>\n<div>void QrCode_Produce(lv_obj_t *canvas, int posX, int posY, int width, int height, char *str)<\/div>\n<div>{<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0lv_draw_rect_dsc_t rect_dsc;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0lv_draw_rect_dsc_init(&amp;rect_dsc);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0rect_dsc.radius = 0;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0rect_dsc.bg_opa = LV_OPA_COVER;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0rect_dsc.bg_grad_dir = LV_GRAD_DIR_HOR;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0rect_dsc.bg_color = LV_COLOR_BLACK;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0rect_dsc.bg_grad_color = LV_COLOR_BLACK;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0rect_dsc.border_width = 0;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0rect_dsc.border_opa = LV_OPA_90;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0rect_dsc.border_color = LV_COLOR_WHITE;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0rect_dsc.shadow_width = 0;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0rect_dsc.shadow_ofs_x = 0;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0rect_dsc.shadow_ofs_y = 0;<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0lv_draw_rect_dsc_t rect_dsc1;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0lv_draw_rect_dsc_init(&amp;rect_dsc1);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0rect_dsc1.radius = 0;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0rect_dsc1.bg_opa = LV_OPA_COVER;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0rect_dsc1.bg_grad_dir = LV_GRAD_DIR_HOR;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0rect_dsc1.bg_color = LV_COLOR_WHITE;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0rect_dsc1.bg_grad_color = LV_COLOR_WHITE;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0rect_dsc1.border_width = 0;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0rect_dsc1.border_opa = LV_OPA_90;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0rect_dsc1.border_color = LV_COLOR_WHITE;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0rect_dsc1.shadow_width = 0;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0rect_dsc1.shadow_ofs_x = 0;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0rect_dsc1.shadow_ofs_y = 0;<\/div>\n<div><\/div>\n<div>\/*<\/div>\n<div># define WIDTH 200<\/div>\n<div># define HEIGHT 150<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0static lv_color_t cbuf[LV_CANVAS_BUF_SIZE_TRUE_COLOR(WIDTH, HEIGHT)];<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0lv_obj_t * canvas = lv_canvas_create(lv_scr_act(), NULL);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0lv_canvas_set_buffer(canvas, cbuf, WIDTH, HEIGHT, LV_IMG_CF_TRUE_COLOR);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0lv_obj_align(canvas, NULL, LV_ALIGN_IN_TOP_LEFT, 0, 0);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0lv_canvas_fill_bg(canvas, LV_COLOR_SILVER, LV_OPA_COVER);<\/div>\n<div>*\/<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0uint8_t box_x = posX;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0uint8_t box_y = posY;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0uint8_t box_s = width;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0uint8_t init_x = box_x;<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/ Create the QR code, only support version 4, ecc 0<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0QRCode qrcode;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/version: 1: 21&#215;21, x: 21+4*(x-1),(x from 1 to 14)<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/uint8_t qrcodeData[qrcode_getBufferSize(4)];<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0uint8_t qrcodeData[137]; \/\/qrcode_getBufferSize(4)<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0qrcode_initText(&amp;qrcode, qrcodeData, 4, 0, str);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0printf(&#8220;QrCode_Produce: box_s:%d, qrcode.size:%d\\n&#8221;, box_s, qrcode.size);<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0for (uint8_t y = 0; y &lt; qrcode.size; y++){<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ Each horizontal module<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0for (uint8_t x = 0; x &lt; qrcode.size; x++)<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ Print each module (UTF-8 \\u2588 is a solid block)<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/Serial.print(qrcode_getModule(&amp;qrcode, x, y) ? &#8220;\\u2588\\u2588&#8243;: &#8221;\u00a0\u00a0&#8220;);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (qrcode_getModule(&amp;qrcode, x, y))<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/Serial.println(py+ps);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/display.fillRect(box_x, box_y, box_s, box_s, GxEPD_BLACK);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0lv_canvas_draw_rect(canvas, box_x, box_y, box_s, box_s, &amp;rect_dsc);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0else<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/Serial.println(py+ps);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ display.fillRect(box_x, box_y, box_s, box_s, GxEPD_WHITE);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0lv_canvas_draw_rect(canvas, box_x, box_y, box_s, box_s, &amp;rect_dsc1);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0box_x = box_x + box_s;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0box_y = box_y + box_s;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0box_x = init_x;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>}<\/div>\n<div><\/div>\n<div><\/div>\n<div><strong>\u5934\u6587\u4ef6qrcode.h\uff1a<\/strong><\/div>\n<div><\/div>\n<div>#ifndef __QRCODE_H_<\/div>\n<div>#define __QRCODE_H_<\/div>\n<div><\/div>\n<div>#ifndef __cplusplus<\/div>\n<div>\/\/typedef unsigned char bool;<\/div>\n<div>\/\/static const bool false = 0;<\/div>\n<div>\/\/static const bool true = 1;<\/div>\n<div>#define false 0<\/div>\n<div>#define true 1<\/div>\n<div>#endif<\/div>\n<div><\/div>\n<div>#include &lt;stdint.h&gt;<\/div>\n<div><\/div>\n<div><\/div>\n<div>\/\/ QR Code Format Encoding<\/div>\n<div>#define MODE_NUMERIC\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a00<\/div>\n<div>#define MODE_ALPHANUMERIC\u00a0\u00a0\u00a01<\/div>\n<div>#define MODE_BYTE\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a02<\/div>\n<div><\/div>\n<div><\/div>\n<div>\/\/ Error Correction Code Levels<\/div>\n<div>#define ECC_LOW\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a00<\/div>\n<div>#define ECC_MEDIUM\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a01<\/div>\n<div>#define ECC_QUARTILE\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a02<\/div>\n<div>#define ECC_HIGH\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a03<\/div>\n<div><\/div>\n<div><\/div>\n<div>\/\/ If set to non-zero, this library can ONLY produce QR codes at that version<\/div>\n<div>\/\/ This saves a lot of dynamic memory, as the codeword tables are skipped<\/div>\n<div>#ifndef LOCK_VERSION<\/div>\n<div>#define LOCK_VERSION\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a00<\/div>\n<div>#endif<\/div>\n<div><\/div>\n<div><\/div>\n<div>typedef struct QRCode {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0uint8_t version;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0uint8_t size;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0uint8_t ecc;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0uint8_t mode;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0uint8_t mask;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0uint8_t *modules;<\/div>\n<div>} QRCode;<\/div>\n<div><\/div>\n<div><\/div>\n<div>#ifdef __cplusplus<\/div>\n<div>extern &#8220;C&#8221;{<\/div>\n<div>#endif\u00a0\u00a0\/* __cplusplus *\/<\/div>\n<div><\/div>\n<div><\/div>\n<div><\/div>\n<div>uint16_t qrcode_getBufferSize(uint8_t version);<\/div>\n<div><\/div>\n<div>int8_t qrcode_initText(QRCode *qrcode, uint8_t *modules, uint8_t version, uint8_t ecc, const char *data);<\/div>\n<div>int8_t qrcode_initBytes(QRCode *qrcode, uint8_t *modules, uint8_t version, uint8_t ecc, uint8_t *data, uint16_t length);<\/div>\n<div><\/div>\n<div>bool qrcode_getModule(QRCode *qrcode, uint8_t x, uint8_t y);<\/div>\n<div><\/div>\n<div>void QrCode_Produce(lv_obj_t *canvas, int posX, int posY, int width, int height, char *str);<\/div>\n<div><\/div>\n<div>#ifdef __cplusplus<\/div>\n<div>}<\/div>\n<div>#endif\u00a0\u00a0\/* __cplusplus *\/<\/div>\n<div><\/div>\n<div><\/div>\n<div>#endif\u00a0\u00a0\/* __QRCODE_H_ *\/<\/div>\n<div><\/div>\n<div>\n<div><\/div>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u4e8c\u7ef4\u7801\u6709\u4e24\u79cd\u6a21\u5f0f\uff0c\u8fd9\u91cc\u53ea\u652f\u6301Model1\uff0c\u4e0d\u652f\u6301Model2\u3002 Model1\u4e8c\u7ef4\u7801\u670914\u4e2dversion\uff0cve &hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6,13],"tags":[851,868,869],"class_list":["post-1141","post","type-post","status-publish","format-standard","hentry","category-6","category-13","tag-lvgl","tag-qrcode","tag-869"],"views":1759,"_links":{"self":[{"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/1141","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1141"}],"version-history":[{"count":1,"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/1141\/revisions"}],"predecessor-version":[{"id":1142,"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/1141\/revisions\/1142"}],"wp:attachment":[{"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1141"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1141"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1141"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}