diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..ac623d9 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,6 @@ +[submodule "Hardware/FabReader1.5/kicad-libraries"] + path = Hardware/FabReader1.5/kicad-libraries + url = https://github.com/espressif/kicad-libraries.git +[submodule "Hardware/FabReader1.5/Library/espressif"] + path = Hardware/FabReader1.5/Library/espressif + url = https://github.com/espressif/kicad-libraries.git diff --git a/Hardware/FabReader1.5/FabReader1.5.kicad_pcb b/Hardware/FabReader1.5/FabReader1.5.kicad_pcb new file mode 100644 index 0000000..8cf3630 --- /dev/null +++ b/Hardware/FabReader1.5/FabReader1.5.kicad_pcb @@ -0,0 +1,825 @@ +(kicad_pcb (version 20221018) (generator pcbnew) + + (general + (thickness 1.6) + ) + + (paper "A4") + (layers + (0 "F.Cu" signal) + (31 "B.Cu" signal) + (32 "B.Adhes" user "B.Adhesive") + (33 "F.Adhes" user "F.Adhesive") + (34 "B.Paste" user) + (35 "F.Paste" user) + (36 "B.SilkS" user "B.Silkscreen") + (37 "F.SilkS" user "F.Silkscreen") + (38 "B.Mask" user) + (39 "F.Mask" user) + (40 "Dwgs.User" user "User.Drawings") + (41 "Cmts.User" user "User.Comments") + (42 "Eco1.User" user "User.Eco1") + (43 "Eco2.User" user "User.Eco2") + (44 "Edge.Cuts" user) + (45 "Margin" user) + (46 "B.CrtYd" user "B.Courtyard") + (47 "F.CrtYd" user "F.Courtyard") + (48 "B.Fab" user) + (49 "F.Fab" user) + (50 "User.1" user) + (51 "User.2" user) + (52 "User.3" user) + (53 "User.4" user) + (54 "User.5" user) + (55 "User.6" user) + (56 "User.7" user) + (57 "User.8" user) + (58 "User.9" user) + ) + + (setup + (pad_to_mask_clearance 0) + (pcbplotparams + (layerselection 0x00010fc_ffffffff) + (plot_on_all_layers_selection 0x0000000_00000000) + (disableapertmacros false) + (usegerberextensions false) + (usegerberattributes true) + (usegerberadvancedattributes true) + (creategerberjobfile true) + (dashed_line_dash_ratio 12.000000) + (dashed_line_gap_ratio 3.000000) + (svgprecision 4) + (plotframeref false) + (viasonmask false) + (mode 1) + (useauxorigin false) + (hpglpennumber 1) + (hpglpenspeed 20) + (hpglpendiameter 15.000000) + (dxfpolygonmode true) + (dxfimperialunits true) + (dxfusepcbnewfont true) + (psnegative false) + (psa4output false) + (plotreference true) + (plotvalue true) + (plotinvisibletext false) + (sketchpadsonfab false) + (subtractmaskfromsilk false) + (outputformat 1) + (mirror false) + (drillshape 1) + (scaleselection 1) + (outputdirectory "") + ) + ) + + (net 0 "") + (net 1 "unconnected-(A101-NC-Pad1)") + (net 2 "unconnected-(A101-IOREF-Pad2)") + (net 3 "unconnected-(A101-~{RESET}-Pad3)") + (net 4 "+3V3") + (net 5 "GND") + (net 6 "unconnected-(A101-VIN-Pad8)") + (net 7 "NFC_IRQ") + (net 8 "unconnected-(A101-A1-Pad10)") + (net 9 "unconnected-(A101-A2-Pad11)") + (net 10 "unconnected-(A101-A3-Pad12)") + (net 11 "unconnected-(A101-SDA{slash}A4-Pad13)") + (net 12 "unconnected-(A101-SCL{slash}A5-Pad14)") + (net 13 "unconnected-(A101-D0{slash}RX-Pad15)") + (net 14 "unconnected-(A101-D1{slash}TX-Pad16)") + (net 15 "unconnected-(A101-D2-Pad17)") + (net 16 "unconnected-(A101-D3-Pad18)") + (net 17 "unconnected-(A101-D4-Pad19)") + (net 18 "unconnected-(A101-D5-Pad20)") + (net 19 "unconnected-(A101-D6-Pad21)") + (net 20 "unconnected-(A101-D7-Pad22)") + (net 21 "unconnected-(A101-D8-Pad23)") + (net 22 "unconnected-(A101-D9-Pad24)") + (net 23 "NFC_SS_N") + (net 24 "MOSI") + (net 25 "MISO") + (net 26 "SLCK") + (net 27 "unconnected-(A101-GND-Pad29)") + (net 28 "unconnected-(A101-AREF-Pad30)") + (net 29 "unconnected-(A101-SDA{slash}A4-Pad31)") + (net 30 "unconnected-(A101-SCL{slash}A5-Pad32)") + (net 31 "unconnected-(U101-3V3-Pad2)") + (net 32 "unconnected-(U101-CHIP_PU-Pad3)") + (net 33 "SCLK") + (net 34 "unconnected-(U101-GPIO16{slash}ADC2_CH5{slash}32K_N-Pad9)") + (net 35 "unconnected-(U101-GPIO17{slash}ADC2_CH6-Pad10)") + (net 36 "unconnected-(U101-GPIO18{slash}ADC2_CH7-Pad11)") + (net 37 "unconnected-(U101-GPIO8{slash}ADC1_CH7-Pad12)") + (net 38 "unconnected-(U101-GPIO3{slash}ADC1_CH2-Pad13)") + (net 39 "unconnected-(U101-GPIO46-Pad14)") + (net 40 "unconnected-(U101-GPIO9{slash}ADC1_CH8-Pad15)") + (net 41 "unconnected-(U101-GPIO10{slash}ADC1_CH9-Pad16)") + (net 42 "unconnected-(U101-GPIO11{slash}ADC2_CH0-Pad17)") + (net 43 "unconnected-(U101-GPIO12{slash}ADC2_CH1-Pad18)") + (net 44 "unconnected-(U101-GPIO13{slash}ADC2_CH2-Pad19)") + (net 45 "unconnected-(U101-GPIO14{slash}ADC2_CH3-Pad20)") + (net 46 "unconnected-(U101-5V-Pad21)") + (net 47 "unconnected-(U101-GND-Pad22)") + (net 48 "unconnected-(U101-GND-Pad23)") + (net 49 "unconnected-(U101-GND-Pad24)") + (net 50 "unconnected-(U101-GPIO19{slash}USB_D--Pad25)") + (net 51 "unconnected-(U101-GPIO20{slash}USB_D+-Pad26)") + (net 52 "unconnected-(U101-GPIO21-Pad27)") + (net 53 "unconnected-(U101-GPIO47-Pad28)") + (net 54 "unconnected-(U101-GPIO48-Pad29)") + (net 55 "unconnected-(U101-GPIO45-Pad30)") + (net 56 "unconnected-(U101-GPIO0-Pad31)") + (net 57 "unconnected-(U101-GPIO35-Pad32)") + (net 58 "unconnected-(U101-GPIO36-Pad33)") + (net 59 "unconnected-(U101-GPIO37-Pad34)") + (net 60 "DISP_SS_N") + (net 61 "DISP_DC") + (net 62 "DISP_RST") + (net 63 "DISP_BUSY_N") + (net 64 "unconnected-(U101-GPIO42{slash}MTMS-Pad39)") + (net 65 "unconnected-(U101-GPIO2{slash}ADC1_CH1-Pad40)") + (net 66 "unconnected-(U101-GPIO1{slash}ADC1_CH0-Pad41)") + (net 67 "unconnected-(U101-GPIO44{slash}U0RXD-Pad42)") + (net 68 "unconnected-(U101-GPIO43{slash}U0TXD-Pad43)") + (net 69 "DISP_CS_N") + + (footprint "Connector_PinHeader_2.54mm:PinHeader_1x08_P2.54mm_Vertical" (layer "F.Cu") + (tstamp c24ce1e4-29a8-4dca-b1a4-eed4a27bb3ef) + (at 124.45 81.75 -90) + (descr "Through hole straight pin header, 1x08, 2.54mm pitch, single row") + (tags "Through hole pin header THT 1x08 2.54mm single row") + (property "Sheetfile" "FabReader1.5.kicad_sch") + (property "Sheetname" "") + (property "ki_description" "Generic connector, single row, 01x08, script generated") + (property "ki_keywords" "connector") + (path "/1b08339d-3a72-4809-8c9c-8377740dc375") + (attr through_hole) + (fp_text reference "J101" (at 0 -2.33 90) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp e96d8545-626d-47a4-8e80-f78d8179c719) + ) + (fp_text value "Conn_01x08_Pin" (at 0 20.11 90) (layer "F.Fab") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 19251175-3c4a-4f24-bd4a-cf77324ca7f4) + ) + (fp_text user "${REFERENCE}" (at 0 8.89) (layer "F.Fab") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 705cd682-6af6-4d8b-acf4-d024fba1bfc3) + ) + (fp_line (start -1.33 -1.33) (end 0 -1.33) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 6332fd91-a852-4ddf-9816-0cd2cef99152)) + (fp_line (start -1.33 0) (end -1.33 -1.33) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 7fda776c-24c3-465d-a2f2-1ae4e6d0876f)) + (fp_line (start -1.33 1.27) (end -1.33 19.11) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 32d98a69-adcc-4806-94ec-d457f4d8638f)) + (fp_line (start -1.33 1.27) (end 1.33 1.27) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 5f6681b8-d391-46ef-b803-93ac491919da)) + (fp_line (start -1.33 19.11) (end 1.33 19.11) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp ffddf2d8-6f62-4e3b-b960-33acb8daf0fa)) + (fp_line (start 1.33 1.27) (end 1.33 19.11) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp e5080e41-a2c7-4b6b-b2b4-9e906070f551)) + (fp_line (start -1.8 -1.8) (end -1.8 19.55) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 6c5c73fe-95d2-490b-9153-f0f3b61806a8)) + (fp_line (start -1.8 19.55) (end 1.8 19.55) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 70bc937e-0b13-40c4-a99e-e63065141220)) + (fp_line (start 1.8 -1.8) (end -1.8 -1.8) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 315b739b-48e2-4987-a929-4d1800f33885)) + (fp_line (start 1.8 19.55) (end 1.8 -1.8) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 1f197270-7a62-4a4b-9f80-336bbe9e0a48)) + (fp_line (start -1.27 -0.635) (end -0.635 -1.27) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp b18221b9-d243-404a-a5a5-87ac93582b1c)) + (fp_line (start -1.27 19.05) (end -1.27 -0.635) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 6c2c28bc-f012-4ec5-b2e6-e7f386539b5c)) + (fp_line (start -0.635 -1.27) (end 1.27 -1.27) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 60fa9191-f06c-469f-a6c0-2f6451e780d6)) + (fp_line (start 1.27 -1.27) (end 1.27 19.05) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 262288c6-171e-45fb-a442-aec8b6590245)) + (fp_line (start 1.27 19.05) (end -1.27 19.05) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp ffcdd726-f38a-491e-a840-32d0cbbd0709)) + (pad "1" thru_hole rect (at 0 0 270) (size 1.7 1.7) (drill 1) (layers "*.Cu" "*.Mask") + (net 63 "DISP_BUSY_N") (pinfunction "Pin_1") (pintype "passive") (tstamp 2b8cd8b4-86eb-46b9-b616-194420b6a0bb)) + (pad "2" thru_hole oval (at 0 2.54 270) (size 1.7 1.7) (drill 1) (layers "*.Cu" "*.Mask") + (net 62 "DISP_RST") (pinfunction "Pin_2") (pintype "passive") (tstamp 45594ade-8b44-42f8-ae68-0a612936cc6b)) + (pad "3" thru_hole oval (at 0 5.08 270) (size 1.7 1.7) (drill 1) (layers "*.Cu" "*.Mask") + (net 61 "DISP_DC") (pinfunction "Pin_3") (pintype "passive") (tstamp 7f6f6e59-9434-4407-b52d-52a357c0eda3)) + (pad "4" thru_hole oval (at 0 7.62 270) (size 1.7 1.7) (drill 1) (layers "*.Cu" "*.Mask") + (net 69 "DISP_CS_N") (pinfunction "Pin_4") (pintype "passive") (tstamp f2bf72d2-e579-4366-9971-fae12dc5aecb)) + (pad "5" thru_hole oval (at 0 10.16 270) (size 1.7 1.7) (drill 1) (layers "*.Cu" "*.Mask") + (net 33 "SCLK") (pinfunction "Pin_5") (pintype "passive") (tstamp 9f3f4794-fa0b-4f7e-8772-86411c6293ef)) + (pad "6" thru_hole oval (at 0 12.7 270) (size 1.7 1.7) (drill 1) (layers "*.Cu" "*.Mask") + (net 24 "MOSI") (pinfunction "Pin_6") (pintype "passive") (tstamp 2a01fb4c-2e99-40e8-a866-94167e37171c)) + (pad "7" thru_hole oval (at 0 15.24 270) (size 1.7 1.7) (drill 1) (layers "*.Cu" "*.Mask") + (net 5 "GND") (pinfunction "Pin_7") (pintype "passive") (tstamp a8c130f1-f98b-4172-8727-bd6508f50154)) + (pad "8" thru_hole oval (at 0 17.78 270) (size 1.7 1.7) (drill 1) (layers "*.Cu" "*.Mask") + (net 4 "+3V3") (pinfunction "Pin_8") (pintype "passive") (tstamp 62020073-f8d1-4a02-a721-5e7b21a9592d)) + (model "${KICAD6_3DMODEL_DIR}/Connector_PinHeader_2.54mm.3dshapes/PinHeader_1x08_P2.54mm_Vertical.wrl" + (offset (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (footprint "Espressif:ESP32-S3-DevKitC" (layer "F.Cu") + (tstamp f1f5d3b0-af4b-4454-8a44-1eb639926ce7) + (at 99.3579 72.43 90) + (descr "ESP32-S3 general-purpose development board, based on ESP32-S3-WROOM-1 or ESP32-S3-WROOM-1U,It has all the ESP32-S3 pins exposed and is easy to connect and use.") + (tags "ESP32-S3") + (property "Sheetfile" "FabReader1.5.kicad_sch") + (property "Sheetname" "") + (property "ki_description" "ESP32-S3-DevKitC") + (path "/909ab781-801f-471f-885c-d4cd8f32f686") + (attr through_hole) + (fp_text reference "U101" (at 12.7 -2.1 90) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp de004ae2-bf19-49f8-b756-783fe991910f) + ) + (fp_text value "ESP32-S3-DevKitC" (at 11.42632 29.46128) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp d320f3df-50b8-4547-b0e4-ff77b652ede6) + ) + (fp_text user "GPIO13" (at 1.27 45.72 90 unlocked) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15)) (justify left)) + (tstamp 04394d8b-72bb-41f3-b632-dc6d3bb42b67) + ) + (fp_text user "GPIO48" (at 21.59 38.1 90 unlocked) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15)) (justify right)) + (tstamp 0c18521e-8f87-4ca7-b8d4-1750c2a6f565) + ) + (fp_text user "GPIO16" (at 1.27 20.32 90 unlocked) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15)) (justify left)) + (tstamp 146abe8a-758c-4ccc-91b5-a4038bdc30e0) + ) + (fp_text user "GPIO2" (at 21.59 10.16 90 unlocked) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15)) (justify right)) + (tstamp 1902b6b9-6aee-411c-87f8-e18c15c2a3f9) + ) + (fp_text user "GPIO4" (at 1.27 7.62 90 unlocked) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15)) (justify left)) + (tstamp 201b1d7e-7cb2-4bcc-b7ae-cf80451e80eb) + ) + (fp_text user "3V3" (at 1.27 2.54 90 unlocked) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15)) (justify left)) + (tstamp 21065de7-759a-4310-87ba-407903875241) + ) + (fp_text user "EN/RESET" (at 8.88632 5.07728 90 unlocked) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15)) (justify right)) + (tstamp 2a349457-7c37-49d6-9dad-7ecb47f13bbd) + ) + (fp_text user "GPIO12" (at 1.27 43.18 90 unlocked) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15)) (justify left)) + (tstamp 2ab39729-9a3f-4df6-a8a9-d59a85bc7e92) + ) + (fp_text user "GPIO20" (at 21.59 45.72 90 unlocked) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15)) (justify right)) + (tstamp 3fffd393-93ce-49bc-b93d-246c0c9d438c) + ) + (fp_text user "GPIO40/MTDO" (at 21.59 17.78 90 unlocked) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15)) (justify right)) + (tstamp 40e69db2-1a64-4679-b8ae-08f51ecce364) + ) + (fp_text user "GPIO37" (at 21.59 25.4 90 unlocked) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15)) (justify right)) + (tstamp 4657fae3-0daa-4544-95c0-48c3dba1f02d) + ) + (fp_text user "GPIO6" (at 1.27 12.7 90 unlocked) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15)) (justify left)) + (tstamp 4f1b6fca-f5f5-4680-92ea-9e7c278eb700) + ) + (fp_text user "GPIO46" (at 1.27 33.02 90 unlocked) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15)) (justify left)) + (tstamp 534e53af-a9bf-46e5-bfa2-23f5cb72d332) + ) + (fp_text user "GPIO39/MTCK" (at 21.59 20.32 90 unlocked) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15)) (justify right)) + (tstamp 58ef421a-9316-4cea-9913-367102c2e066) + ) + (fp_text user "GPIO18" (at 1.27 25.4 90 unlocked) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15)) (justify left)) + (tstamp 5ccf322b-ee2f-4c3a-9350-0a6a598890d1) + ) + (fp_text user "GPIO8" (at 1.27 27.94 90 unlocked) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15)) (justify left)) + (tstamp 65ce5cd7-f875-43ce-bef5-0cda869a3604) + ) + (fp_text user "GPIO10" (at 1.27 38.1 90 unlocked) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15)) (justify left)) + (tstamp 662fa032-7e81-482a-b401-6b2ce483e0b5) + ) + (fp_text user "GND" (at 21.59 0 90 unlocked) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15)) (justify right)) + (tstamp 6dbe4dc3-cfbd-4804-95a8-cf2a44591aaf) + ) + (fp_text user "GPIO17" (at 1.27 22.86 90 unlocked) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15)) (justify left)) + (tstamp 6dfb32a6-b3ab-4980-a63e-b3f1e7d56151) + ) + (fp_text user "GND" (at 1.52032 53.33728 90 unlocked) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15)) (justify left)) + (tstamp 739c3b30-3b6e-4bc1-a481-68a4c82989de) + ) + (fp_text user "GPIO35" (at 21.59 30.48 90 unlocked) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15)) (justify right)) + (tstamp 7be9a432-292d-47ce-b527-85681a79ad7c) + ) + (fp_text user "GPIO14" (at 1.27 48.26 90 unlocked) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15)) (justify left)) + (tstamp 872335e7-4dcd-4b13-a817-c5ecea040ca7) + ) + (fp_text user "GPIO9" (at 1.27 35.56 90 unlocked) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15)) (justify left)) + (tstamp 88d5a85d-db33-4214-84a6-3d4a5f13bb79) + ) + (fp_text user "GPIO5" (at 1.27 10.16 90 unlocked) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15)) (justify left)) + (tstamp 8d3bc27d-190e-479e-8979-f536d467544c) + ) + (fp_text user "GPIO15" (at 1.27 17.78 90 unlocked) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15)) (justify left)) + (tstamp 99661758-7e4f-4174-b914-d3978097e23c) + ) + (fp_text user "GPIO43/U0TXD" (at 21.59 2.54 90 unlocked) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15)) (justify right)) + (tstamp 9b938fea-4c4d-487d-af0e-df511d277525) + ) + (fp_text user "3V3" (at 1.27 0 90 unlocked) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15)) (justify left)) + (tstamp 9c84bd45-343a-42db-807d-25d4ebf1d312) + ) + (fp_text user "GPIO36" (at 21.59 27.94 90 unlocked) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15)) (justify right)) + (tstamp a8298d17-4b21-49fa-a166-3cc6a9e9ebd0) + ) + (fp_text user "GPIO7" (at 1.27 15.24 90 unlocked) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15)) (justify left)) + (tstamp acae28bc-f892-497a-83e7-830891cb6c5e) + ) + (fp_text user "GPIO42/MTMS" (at 21.59 12.7 90 unlocked) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15)) (justify right)) + (tstamp b8275eac-579b-49fb-8fba-3f76ce4510b9) + ) + (fp_text user "GND" (at 21.59 50.8 90 unlocked) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15)) (justify right)) + (tstamp bc6430a0-f3e9-4384-bd50-fff570617bc6) + ) + (fp_text user "GND" (at 21.59 53.34 90 unlocked) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15)) (justify right)) + (tstamp bc9f2e8e-f74d-4239-95f3-2e940cb9cbc6) + ) + (fp_text user "GPIO0" (at 21.59 33.02 90 unlocked) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15)) (justify right)) + (tstamp c36b75c4-1473-43f7-9134-03d54eecab27) + ) + (fp_text user "5V" (at 1.52032 50.79728 90 unlocked) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15)) (justify left)) + (tstamp d1ba406c-8019-4e2e-a601-655ca68b3a3b) + ) + (fp_text user "GPIO47" (at 21.59 40.64 90 unlocked) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15)) (justify right)) + (tstamp db87c118-3ef3-4502-9627-a44dd93c1e92) + ) + (fp_text user "GPIO21" (at 21.59 43.18 90 unlocked) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15)) (justify right)) + (tstamp dfe8e411-51ba-44e0-9c26-ced59eac9c49) + ) + (fp_text user "GPIO1" (at 21.59 7.62 90 unlocked) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15)) (justify right)) + (tstamp e120c1bc-d0f4-4d93-b67c-22ad7a834475) + ) + (fp_text user "GPIO38" (at 21.59 22.86 90 unlocked) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15)) (justify right)) + (tstamp eacff7bb-4bd2-4264-b45b-045a4d35eb9e) + ) + (fp_text user "GPIO44/U0RXD" (at 21.59 5.08 90 unlocked) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15)) (justify right)) + (tstamp ec81e333-6c76-460d-8a75-980eecea85de) + ) + (fp_text user "GPIO45" (at 21.59 35.56 90 unlocked) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15)) (justify right)) + (tstamp efa4e20c-1091-4483-8954-9040e7030d27) + ) + (fp_text user "GPIO3" (at 1.27 30.48 90 unlocked) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15)) (justify left)) + (tstamp f05bdc54-770f-45ef-9ffe-2e17538d01c0) + ) + (fp_text user "GPIO19" (at 21.59 48.26 90 unlocked) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15)) (justify right)) + (tstamp f1f6ae14-beff-456a-879f-203be434c375) + ) + (fp_text user "GPIO11" (at 1.27 40.64 90 unlocked) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15)) (justify left)) + (tstamp faa5cda0-dfa7-48d6-bf58-5dfc145b6746) + ) + (fp_text user "GPIO41/MTDI" (at 21.59 15.24 90 unlocked) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15)) (justify right)) + (tstamp fd4a362d-a543-4f08-9964-989b3e983511) + ) + (fp_text user "REF**" (at -0.00368 -0.00272 90) (layer "F.Fab") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 040a0e99-214f-4713-a87e-0149e2808cdf) + ) + (fp_line (start -1.5 62.79728) (end 24.359999 62.79728) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 293bf5d6-d921-4569-90cb-5b7c38d0537b)) + (fp_line (start -1.499999 -1.1) (end -1.5 62.79728) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp ab73bdf2-d2ec-4b7b-a88e-f93b7e1a2ce1)) + (fp_line (start 2.46012 -7.01312) (end 20.44332 -7.01312) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp d25ed1c4-672d-4bb4-ae7d-e5dfb1bd8c08)) + (fp_line (start 2.46012 -1.12032) (end 2.46012 -7.01312) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 5a67d15f-4b5b-42ac-b2a1-fd37dd272cc4)) + (fp_line (start 20.44332 -7.01312) (end 20.44332 -1.12032) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 0e3fb334-b0c8-4b84-b130-574f8617a19e)) + (fp_line (start 24.359999 62.79728) (end 24.36 -1.1) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 068414f1-a937-470d-a54e-57543ddc1cc1)) + (fp_line (start 24.36 -1.1) (end -1.499999 -1.1) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 06569907-9f75-45b0-9351-0d1181b5a887)) + (fp_line (start -1.25 -0.85) (end 24.11 -0.85) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 14804da3-505b-4a1d-8b74-2ee18f0201dd)) + (fp_line (start -1.25 62.54728) (end -1.25 -0.85) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp d232ee07-86b0-4dbd-846b-134e0e1a8a2e)) + (fp_line (start 24.11 -0.85) (end 24.11 62.54728) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 7caeb416-59b0-4009-9017-c56b136aee8f)) + (fp_line (start 24.11 62.54728) (end -1.25 62.54728) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 27243339-6cab-47a1-84c1-4d41bd5490b7)) + (pad "1" thru_hole rect (at 0 0) (size 1.2 2) (drill 0.8) (layers "*.Cu" "*.Mask") + (net 4 "+3V3") (pinfunction "3V3") (pintype "power_in") (tstamp 3983f0ec-d49f-427b-8a73-4a322c192fc0)) + (pad "2" thru_hole oval (at 0 2.54) (size 1.2 2) (drill 0.8) (layers "*.Cu" "*.Mask") + (net 31 "unconnected-(U101-3V3-Pad2)") (pinfunction "3V3") (pintype "power_in") (tstamp 6ab4f172-b197-4250-934b-de82d96436aa)) + (pad "3" thru_hole oval (at 0 5.08) (size 1.2 2) (drill 0.8) (layers "*.Cu" "*.Mask") + (net 32 "unconnected-(U101-CHIP_PU-Pad3)") (pinfunction "CHIP_PU") (pintype "input") (tstamp 9b681110-b0d4-4bfd-8dc1-a326a987770f)) + (pad "4" thru_hole oval (at 0 7.62) (size 1.2 2) (drill 0.8) (layers "*.Cu" "*.Mask") + (net 23 "NFC_SS_N") (pinfunction "GPIO4/ADC1_CH3") (pintype "bidirectional") (tstamp 48bd2580-c09a-45a6-a268-6ab00ff2132a)) + (pad "5" thru_hole oval (at 0 10.16) (size 1.2 2) (drill 0.8) (layers "*.Cu" "*.Mask") + (net 33 "SCLK") (pinfunction "GPIO5/ADC1_CH4") (pintype "bidirectional") (tstamp 8d3906e6-a085-4e0a-9b86-83a322070c22)) + (pad "6" thru_hole oval (at 0 12.7) (size 1.2 2) (drill 0.8) (layers "*.Cu" "*.Mask") + (net 24 "MOSI") (pinfunction "GPIO6/ADC1_CH5") (pintype "bidirectional") (tstamp fca6b445-85f2-4cae-8e18-015ba5ed40e7)) + (pad "7" thru_hole oval (at 0 15.24) (size 1.2 2) (drill 0.8) (layers "*.Cu" "*.Mask") + (net 25 "MISO") (pinfunction "GPIO7/ADC1_CH6") (pintype "bidirectional") (tstamp a4c0f518-4056-4a84-b6f0-f5f22f31fd09)) + (pad "8" thru_hole oval (at 0 17.78) (size 1.2 2) (drill 0.8) (layers "*.Cu" "*.Mask") + (net 7 "NFC_IRQ") (pinfunction "GPIO15/ADC2_CH4/32K_P") (pintype "bidirectional") (tstamp c22d3b1a-af78-458a-b72f-4f9b11b572fa)) + (pad "9" thru_hole oval (at 0 20.32) (size 1.2 2) (drill 0.8) (layers "*.Cu" "*.Mask") + (net 34 "unconnected-(U101-GPIO16{slash}ADC2_CH5{slash}32K_N-Pad9)") (pinfunction "GPIO16/ADC2_CH5/32K_N") (pintype "bidirectional") (tstamp a03ffd42-a2ad-46dc-a825-3ec10885aa55)) + (pad "10" thru_hole oval (at 0 22.86) (size 1.2 2) (drill 0.8) (layers "*.Cu" "*.Mask") + (net 35 "unconnected-(U101-GPIO17{slash}ADC2_CH6-Pad10)") (pinfunction "GPIO17/ADC2_CH6") (pintype "bidirectional") (tstamp 6bb1c7d1-3d68-4f76-a9e7-8eb3d2a074b6)) + (pad "11" thru_hole oval (at 0 25.4) (size 1.2 2) (drill 0.8) (layers "*.Cu" "*.Mask") + (net 36 "unconnected-(U101-GPIO18{slash}ADC2_CH7-Pad11)") (pinfunction "GPIO18/ADC2_CH7") (pintype "bidirectional") (tstamp 34e3b6cb-a736-4a5b-a666-2558e3d90ab8)) + (pad "12" thru_hole oval (at 0 27.94) (size 1.2 2) (drill 0.8) (layers "*.Cu" "*.Mask") + (net 37 "unconnected-(U101-GPIO8{slash}ADC1_CH7-Pad12)") (pinfunction "GPIO8/ADC1_CH7") (pintype "bidirectional") (tstamp 53fe93b8-2e87-42ed-bd52-aa3272436e83)) + (pad "13" thru_hole oval (at 0 30.48) (size 1.2 2) (drill 0.8) (layers "*.Cu" "*.Mask") + (net 38 "unconnected-(U101-GPIO3{slash}ADC1_CH2-Pad13)") (pinfunction "GPIO3/ADC1_CH2") (pintype "bidirectional") (tstamp 548c01f7-0a08-43f7-9f7c-6a2202eb0010)) + (pad "14" thru_hole oval (at 0 33.02) (size 1.2 2) (drill 0.8) (layers "*.Cu" "*.Mask") + (net 39 "unconnected-(U101-GPIO46-Pad14)") (pinfunction "GPIO46") (pintype "bidirectional") (tstamp 80af1227-06c3-4afb-8174-01a0885d663c)) + (pad "15" thru_hole oval (at 0 35.56) (size 1.2 2) (drill 0.8) (layers "*.Cu" "*.Mask") + (net 40 "unconnected-(U101-GPIO9{slash}ADC1_CH8-Pad15)") (pinfunction "GPIO9/ADC1_CH8") (pintype "bidirectional") (tstamp 69739b71-6548-4eef-a27d-a94bf13181d0)) + (pad "16" thru_hole oval (at 0 38.1) (size 1.2 2) (drill 0.8) (layers "*.Cu" "*.Mask") + (net 41 "unconnected-(U101-GPIO10{slash}ADC1_CH9-Pad16)") (pinfunction "GPIO10/ADC1_CH9") (pintype "bidirectional") (tstamp 938afc70-cca4-41cc-b8f1-bd01ba40abed)) + (pad "17" thru_hole oval (at 0 40.64) (size 1.2 2) (drill 0.8) (layers "*.Cu" "*.Mask") + (net 42 "unconnected-(U101-GPIO11{slash}ADC2_CH0-Pad17)") (pinfunction "GPIO11/ADC2_CH0") (pintype "bidirectional") (tstamp 66a11d4f-8519-43c1-b317-fff013e69ee8)) + (pad "18" thru_hole oval (at 0 43.18) (size 1.2 2) (drill 0.8) (layers "*.Cu" "*.Mask") + (net 43 "unconnected-(U101-GPIO12{slash}ADC2_CH1-Pad18)") (pinfunction "GPIO12/ADC2_CH1") (pintype "bidirectional") (tstamp bce910e3-f0fd-415d-ba27-7d37b7706667)) + (pad "19" thru_hole oval (at 0 45.72) (size 1.2 2) (drill 0.8) (layers "*.Cu" "*.Mask") + (net 44 "unconnected-(U101-GPIO13{slash}ADC2_CH2-Pad19)") (pinfunction "GPIO13/ADC2_CH2") (pintype "bidirectional") (tstamp d5b062e8-c0df-4dc0-8e12-ee46bdb5a468)) + (pad "20" thru_hole oval (at -0.00368 48.25728) (size 1.2 2) (drill 0.8) (layers "*.Cu" "*.Mask") + (net 45 "unconnected-(U101-GPIO14{slash}ADC2_CH3-Pad20)") (pinfunction "GPIO14/ADC2_CH3") (pintype "bidirectional") (tstamp a3ce15bf-d058-471d-b820-d395a36295af)) + (pad "21" thru_hole oval (at -0.00368 50.79728) (size 1.2 2) (drill 0.8) (layers "*.Cu" "*.Mask") + (net 46 "unconnected-(U101-5V-Pad21)") (pinfunction "5V") (pintype "power_in") (tstamp e7734c99-601e-4684-9d5f-5e75a406cbde)) + (pad "22" thru_hole oval (at -0.00368 53.33728) (size 1.2 2) (drill 0.8) (layers "*.Cu" "*.Mask") + (net 47 "unconnected-(U101-GND-Pad22)") (pinfunction "GND") (pintype "power_in") (tstamp 3e7c69bf-4c2b-4e97-b6db-cb2d23f4b825)) + (pad "23" thru_hole oval (at 22.86 53.34) (size 1.2 2) (drill 0.8) (layers "*.Cu" "*.Mask") + (net 48 "unconnected-(U101-GND-Pad23)") (pinfunction "GND") (pintype "power_in") (tstamp 5780e459-2907-45c6-be93-97bb365f24a7)) + (pad "24" thru_hole oval (at 22.86 50.8) (size 1.2 2) (drill 0.8) (layers "*.Cu" "*.Mask") + (net 49 "unconnected-(U101-GND-Pad24)") (pinfunction "GND") (pintype "power_in") (tstamp d4810fed-4369-404a-ae44-c68185cad385)) + (pad "25" thru_hole oval (at 22.86 48.26) (size 1.2 2) (drill 0.8) (layers "*.Cu" "*.Mask") + (net 50 "unconnected-(U101-GPIO19{slash}USB_D--Pad25)") (pinfunction "GPIO19/USB_D-") (pintype "bidirectional") (tstamp 80a848ec-f83c-4eee-99a4-710d6a4d9e43)) + (pad "26" thru_hole oval (at 22.86 45.72) (size 1.2 2) (drill 0.8) (layers "*.Cu" "*.Mask") + (net 51 "unconnected-(U101-GPIO20{slash}USB_D+-Pad26)") (pinfunction "GPIO20/USB_D+") (pintype "bidirectional") (tstamp c6f0fe9f-ae3e-4ec4-81c1-f9fd89835ed1)) + (pad "27" thru_hole oval (at 22.86 43.18) (size 1.2 2) (drill 0.8) (layers "*.Cu" "*.Mask") + (net 52 "unconnected-(U101-GPIO21-Pad27)") (pinfunction "GPIO21") (pintype "bidirectional") (tstamp 620c74c6-9fb9-4b7f-aa2b-b2aab27f47a3)) + (pad "28" thru_hole oval (at 22.86 40.64) (size 1.2 2) (drill 0.8) (layers "*.Cu" "*.Mask") + (net 53 "unconnected-(U101-GPIO47-Pad28)") (pinfunction "GPIO47") (pintype "bidirectional") (tstamp 2c29c72f-5558-4d4e-909b-ac9cd9fc5f59)) + (pad "29" thru_hole oval (at 22.86 38.1) (size 1.2 2) (drill 0.8) (layers "*.Cu" "*.Mask") + (net 54 "unconnected-(U101-GPIO48-Pad29)") (pinfunction "GPIO48") (pintype "bidirectional") (tstamp faf254bf-4566-45e2-865d-fd08d5796b24)) + (pad "30" thru_hole oval (at 22.86 35.56) (size 1.2 2) (drill 0.8) (layers "*.Cu" "*.Mask") + (net 55 "unconnected-(U101-GPIO45-Pad30)") (pinfunction "GPIO45") (pintype "bidirectional") (tstamp a0c35926-d843-482d-bcd0-9d49dbfef033)) + (pad "31" thru_hole oval (at 22.86 33.02) (size 1.2 2) (drill 0.8) (layers "*.Cu" "*.Mask") + (net 56 "unconnected-(U101-GPIO0-Pad31)") (pinfunction "GPIO0") (pintype "bidirectional") (tstamp 9bc67f25-0a4c-43f6-a78d-1c427c520862)) + (pad "32" thru_hole oval (at 22.86 30.48) (size 1.2 2) (drill 0.8) (layers "*.Cu" "*.Mask") + (net 57 "unconnected-(U101-GPIO35-Pad32)") (pinfunction "GPIO35") (pintype "bidirectional") (tstamp 7a3335a3-21f5-4018-9705-d017ed87b282)) + (pad "33" thru_hole oval (at 22.86 27.94) (size 1.2 2) (drill 0.8) (layers "*.Cu" "*.Mask") + (net 58 "unconnected-(U101-GPIO36-Pad33)") (pinfunction "GPIO36") (pintype "bidirectional") (tstamp e7f86be6-4b53-4dfc-babb-71fd29957820)) + (pad "34" thru_hole oval (at 22.86 25.4) (size 1.2 2) (drill 0.8) (layers "*.Cu" "*.Mask") + (net 59 "unconnected-(U101-GPIO37-Pad34)") (pinfunction "GPIO37") (pintype "bidirectional") (tstamp 8fdf7b74-29db-44af-84ce-e23c3065968f)) + (pad "35" thru_hole oval (at 22.86 22.86) (size 1.2 2) (drill 0.8) (layers "*.Cu" "*.Mask") + (net 60 "DISP_SS_N") (pinfunction "GPIO38") (pintype "bidirectional") (tstamp 42f83590-67e9-4878-a9f6-6c054140e273)) + (pad "36" thru_hole oval (at 22.86 20.32) (size 1.2 2) (drill 0.8) (layers "*.Cu" "*.Mask") + (net 61 "DISP_DC") (pinfunction "GPIO39/MTCK") (pintype "bidirectional") (tstamp 5c615c0e-ffa2-44e4-8da9-8f017a101550)) + (pad "37" thru_hole oval (at 22.86 17.78) (size 1.2 2) (drill 0.8) (layers "*.Cu" "*.Mask") + (net 62 "DISP_RST") (pinfunction "GPIO40/MTDO") (pintype "bidirectional") (tstamp bec8ae96-d042-4841-8a07-b5dd60e57ecc)) + (pad "38" thru_hole oval (at 22.86 15.24) (size 1.2 2) (drill 0.8) (layers "*.Cu" "*.Mask") + (net 63 "DISP_BUSY_N") (pinfunction "GPIO41/MTDI") (pintype "bidirectional") (tstamp 8af1c0ba-d8d6-4d21-ade3-1663e68a1f7c)) + (pad "39" thru_hole oval (at 22.86 12.7) (size 1.2 2) (drill 0.8) (layers "*.Cu" "*.Mask") + (net 64 "unconnected-(U101-GPIO42{slash}MTMS-Pad39)") (pinfunction "GPIO42/MTMS") (pintype "bidirectional") (tstamp 35611290-5667-444b-94da-5d148d7ff67e)) + (pad "40" thru_hole oval (at 22.86 10.16) (size 1.2 2) (drill 0.8) (layers "*.Cu" "*.Mask") + (net 65 "unconnected-(U101-GPIO2{slash}ADC1_CH1-Pad40)") (pinfunction "GPIO2/ADC1_CH1") (pintype "bidirectional") (tstamp c8e679fd-ca71-4af1-a790-107370a232fd)) + (pad "41" thru_hole oval (at 22.86 7.62) (size 1.2 2) (drill 0.8) (layers "*.Cu" "*.Mask") + (net 66 "unconnected-(U101-GPIO1{slash}ADC1_CH0-Pad41)") (pinfunction "GPIO1/ADC1_CH0") (pintype "bidirectional") (tstamp 28b731ef-6650-4455-9651-68d3afa8c3b6)) + (pad "42" thru_hole oval (at 22.86 5.08) (size 1.2 2) (drill 0.8) (layers "*.Cu" "*.Mask") + (net 67 "unconnected-(U101-GPIO44{slash}U0RXD-Pad42)") (pinfunction "GPIO44/U0RXD") (pintype "bidirectional") (tstamp f5c1cd6f-eda8-40ab-86bd-efc5e6175736)) + (pad "43" thru_hole oval (at 22.86 2.54) (size 1.2 2) (drill 0.8) (layers "*.Cu" "*.Mask") + (net 68 "unconnected-(U101-GPIO43{slash}U0TXD-Pad43)") (pinfunction "GPIO43/U0TXD") (pintype "bidirectional") (tstamp f739f380-2c97-4e79-a83a-07d15fc6482b)) + (pad "44" thru_hole oval (at 22.86 0) (size 1.2 2) (drill 0.8) (layers "*.Cu" "*.Mask") + (net 5 "GND") (pinfunction "GND") (pintype "power_in") (tstamp 96d254b3-f6df-4b1e-ab2e-90a5cd4120ac)) + ) + + (footprint "Module:Arduino_UNO_R3" (layer "B.Cu") + (tstamp 58ebb7f6-50a4-47fe-9e35-0d127ac126d5) + (at 101.12 102.075 -90) + (descr "Arduino UNO R3, http://www.mouser.com/pdfdocs/Gravitech_Arduino_Nano3_0.pdf") + (tags "Arduino UNO R3") + (property "Sheetfile" "FabReader1.5.kicad_sch") + (property "Sheetname" "") + (property "ki_description" "Arduino UNO Microcontroller Module, release 3") + (property "ki_keywords" "Arduino UNO R3 Microcontroller Module Atmel AVR USB") + (path "/e0d1991e-11e0-4525-84ea-6941cfa604df") + (attr through_hole) + (fp_text reference "A101" (at 1.27 3.81 90) (layer "B.SilkS") + (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) + (tstamp ed404032-097f-4817-baf6-072d0c15416d) + ) + (fp_text value "Arduino_UNO_R3" (at 0 -22.13 90) (layer "B.Fab") + (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) + (tstamp baa90914-f4b5-4946-8371-38d1dde2ead6) + ) + (fp_text user "${REFERENCE}" (at 0 -20.32 90) (layer "B.Fab") + (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) + (tstamp 64ee84c3-873f-47ff-912f-5550502cfc08) + ) + (fp_line (start -34.42 -41.4) (end -28.07 -41.4) + (stroke (width 0.12) (type solid)) (layer "B.SilkS") (tstamp b26e026c-6dea-4ffb-a526-a4ee2c39632f)) + (fp_line (start -34.42 -29.72) (end -34.42 -41.4) + (stroke (width 0.12) (type solid)) (layer "B.SilkS") (tstamp d26ab123-9008-4e12-a0b9-6e38bddf95fd)) + (fp_line (start -29.97 -9.65) (end -28.07 -9.65) + (stroke (width 0.12) (type solid)) (layer "B.SilkS") (tstamp 7a75d219-04b2-4bf2-82a7-0fef7a75d183)) + (fp_line (start -29.97 -0.51) (end -29.97 -9.65) + (stroke (width 0.12) (type solid)) (layer "B.SilkS") (tstamp 2f792b82-a665-4631-a86b-8dce7ae8d66e)) + (fp_line (start -28.07 -50.93) (end 36.58 -50.93) + (stroke (width 0.12) (type solid)) (layer "B.SilkS") (tstamp de42df93-a05c-44ae-b6d0-a0d5f228898f)) + (fp_line (start -28.07 -41.4) (end -28.07 -50.93) + (stroke (width 0.12) (type solid)) (layer "B.SilkS") (tstamp 73574a20-e08e-4ca5-b392-1463e295fda9)) + (fp_line (start -28.07 -29.72) (end -34.42 -29.72) + (stroke (width 0.12) (type solid)) (layer "B.SilkS") (tstamp d10ff3fa-9954-4885-97eb-cc698dc12b03)) + (fp_line (start -28.07 -9.65) (end -28.07 -29.72) + (stroke (width 0.12) (type solid)) (layer "B.SilkS") (tstamp 92d154c8-079a-465d-b942-cee9d27e11ee)) + (fp_line (start -28.07 -0.51) (end -29.97 -0.51) + (stroke (width 0.12) (type solid)) (layer "B.SilkS") (tstamp a8651104-1b8b-4a34-b55a-178562bb5f51)) + (fp_line (start -28.07 2.67) (end -28.07 -0.51) + (stroke (width 0.12) (type solid)) (layer "B.SilkS") (tstamp 8d637ccb-6c0a-4408-8f1d-6c900e50f6fb)) + (fp_line (start 36.58 -50.93) (end 38.23 -49.28) + (stroke (width 0.12) (type solid)) (layer "B.SilkS") (tstamp b23f4057-b49b-4694-955a-954e2fd150e0)) + (fp_line (start 38.23 -49.28) (end 38.23 -37.85) + (stroke (width 0.12) (type solid)) (layer "B.SilkS") (tstamp e21b58b0-650e-4ec8-a013-0cf06df7d5a7)) + (fp_line (start 38.23 -37.85) (end 40.77 -35.31) + (stroke (width 0.12) (type solid)) (layer "B.SilkS") (tstamp 06f51e56-0f99-412e-84d6-409b956d1d1c)) + (fp_line (start 38.23 0) (end 38.23 2.67) + (stroke (width 0.12) (type solid)) (layer "B.SilkS") (tstamp 6307eea6-d96e-436a-bb3c-c98649cce7d7)) + (fp_line (start 38.23 2.67) (end -28.07 2.67) + (stroke (width 0.12) (type solid)) (layer "B.SilkS") (tstamp f8508139-3f50-4eb1-97e4-dc4d13c72123)) + (fp_line (start 40.77 -35.31) (end 40.77 -2.54) + (stroke (width 0.12) (type solid)) (layer "B.SilkS") (tstamp 7864072b-ed5b-4038-a2be-c16255cc20e0)) + (fp_line (start 40.77 -2.54) (end 38.23 0) + (stroke (width 0.12) (type solid)) (layer "B.SilkS") (tstamp ad213429-6c02-41fc-8de8-4c535362ad4c)) + (fp_line (start -34.54 -41.53) (end -34.54 -29.59) + (stroke (width 0.05) (type solid)) (layer "B.CrtYd") (tstamp e0c9ed37-430d-426d-a3d4-0961f67c679a)) + (fp_line (start -34.54 -29.59) (end -28.19 -29.59) + (stroke (width 0.05) (type solid)) (layer "B.CrtYd") (tstamp e200aa54-9997-47b1-9e86-59fa358227f8)) + (fp_line (start -30.1 -9.78) (end -30.1 -0.38) + (stroke (width 0.05) (type solid)) (layer "B.CrtYd") (tstamp 9864bf76-3124-472b-badc-4c47530a187b)) + (fp_line (start -30.1 -0.38) (end -28.19 -0.38) + (stroke (width 0.05) (type solid)) (layer "B.CrtYd") (tstamp 72fb73b2-0786-4597-afe6-78aabc7ad03e)) + (fp_line (start -28.19 -51.05) (end -28.19 -41.53) + (stroke (width 0.05) (type solid)) (layer "B.CrtYd") (tstamp c69af99e-ebff-4bff-944c-ac7f7f99d58f)) + (fp_line (start -28.19 -41.53) (end -34.54 -41.53) + (stroke (width 0.05) (type solid)) (layer "B.CrtYd") (tstamp b8bb6621-3d01-4a1c-a004-f0bd7f6730e9)) + (fp_line (start -28.19 -29.59) (end -28.19 -9.78) + (stroke (width 0.05) (type solid)) (layer "B.CrtYd") (tstamp b75e3193-c61f-4ff8-b9a0-c6e038969fa6)) + (fp_line (start -28.19 -9.78) (end -30.1 -9.78) + (stroke (width 0.05) (type solid)) (layer "B.CrtYd") (tstamp b417070e-4f40-4310-a7d4-4d38f1ec0046)) + (fp_line (start -28.19 -0.38) (end -28.19 2.79) + (stroke (width 0.05) (type solid)) (layer "B.CrtYd") (tstamp f10da927-3a27-4222-8dbb-2fe128ba18e5)) + (fp_line (start -28.19 2.79) (end 38.35 2.79) + (stroke (width 0.05) (type solid)) (layer "B.CrtYd") (tstamp 180f3ed7-8bdf-4352-88cc-3487debe6d0a)) + (fp_line (start 36.58 -51.05) (end -28.19 -51.05) + (stroke (width 0.05) (type solid)) (layer "B.CrtYd") (tstamp b61584d1-c77f-487f-b53b-a0fd8f598cb7)) + (fp_line (start 38.35 -49.28) (end 36.58 -51.05) + (stroke (width 0.05) (type solid)) (layer "B.CrtYd") (tstamp cade55e0-6752-4e96-8f21-207e8ffb042d)) + (fp_line (start 38.35 -37.85) (end 38.35 -49.28) + (stroke (width 0.05) (type solid)) (layer "B.CrtYd") (tstamp 185f9fcc-3057-4686-9d2c-6a2a80073ba8)) + (fp_line (start 38.35 0) (end 40.89 -2.54) + (stroke (width 0.05) (type solid)) (layer "B.CrtYd") (tstamp 8c1d190e-b323-4723-a249-4e1974c469fb)) + (fp_line (start 38.35 2.79) (end 38.35 0) + (stroke (width 0.05) (type solid)) (layer "B.CrtYd") (tstamp a330532b-9fd3-466e-b97f-db60e5bc2f72)) + (fp_line (start 40.89 -35.31) (end 38.35 -37.85) + (stroke (width 0.05) (type solid)) (layer "B.CrtYd") (tstamp 43a23aff-92e4-456a-85dd-02eb13a24280)) + (fp_line (start 40.89 -2.54) (end 40.89 -35.31) + (stroke (width 0.05) (type solid)) (layer "B.CrtYd") (tstamp 5aa4f625-9819-4e74-8b9d-b6dabf742ae6)) + (fp_line (start -34.29 -41.27) (end -34.29 -29.84) + (stroke (width 0.1) (type solid)) (layer "B.Fab") (tstamp 167bc0f3-144a-4436-b8db-1a2c7919e490)) + (fp_line (start -34.29 -29.84) (end -18.41 -29.84) + (stroke (width 0.1) (type solid)) (layer "B.Fab") (tstamp e6381050-f80a-443e-b7dd-54588b16e4bd)) + (fp_line (start -29.84 -9.53) (end -29.84 -0.64) + (stroke (width 0.1) (type solid)) (layer "B.Fab") (tstamp a10245bf-e8d7-408a-ad56-e77f5a02806b)) + (fp_line (start -29.84 -0.64) (end -16.51 -0.64) + (stroke (width 0.1) (type solid)) (layer "B.Fab") (tstamp 8408749c-b44a-4174-b2ac-a2bb956354c1)) + (fp_line (start -27.94 -50.8) (end -27.94 2.54) + (stroke (width 0.1) (type solid)) (layer "B.Fab") (tstamp 708ef474-4e55-4685-8a23-14a6f3c91f87)) + (fp_line (start -27.94 2.54) (end 38.1 2.54) + (stroke (width 0.1) (type solid)) (layer "B.Fab") (tstamp 41761804-e84e-4374-b6cb-0bfefbe96cab)) + (fp_line (start -18.41 -41.27) (end -34.29 -41.27) + (stroke (width 0.1) (type solid)) (layer "B.Fab") (tstamp 6055765d-dc4d-4b8f-aa14-1cc00f84b5ad)) + (fp_line (start -18.41 -29.84) (end -18.41 -41.27) + (stroke (width 0.1) (type solid)) (layer "B.Fab") (tstamp ae481494-20cb-4b48-a719-51bdb9ab0a98)) + (fp_line (start -16.51 -9.53) (end -29.84 -9.53) + (stroke (width 0.1) (type solid)) (layer "B.Fab") (tstamp 6b1c889d-e2e1-4459-aff8-a99db5b6333e)) + (fp_line (start -16.51 -0.64) (end -16.51 -9.53) + (stroke (width 0.1) (type solid)) (layer "B.Fab") (tstamp b03f57f4-9cf1-4e85-80d7-e0ff4d083d23)) + (fp_line (start 36.58 -50.8) (end -27.94 -50.8) + (stroke (width 0.1) (type solid)) (layer "B.Fab") (tstamp d3a99e71-da3a-4e2a-8e3a-e0f7753c862c)) + (fp_line (start 38.1 -49.28) (end 36.58 -50.8) + (stroke (width 0.1) (type solid)) (layer "B.Fab") (tstamp e49797b4-fcd7-478c-b5d0-bc59dc7533c4)) + (fp_line (start 38.1 -37.85) (end 38.1 -49.28) + (stroke (width 0.1) (type solid)) (layer "B.Fab") (tstamp cd573a44-6115-4073-b0cc-fc0d67bc69f9)) + (fp_line (start 38.1 0) (end 40.64 -2.54) + (stroke (width 0.1) (type solid)) (layer "B.Fab") (tstamp e457cc5f-77f7-43ac-916d-fbaed61e95b1)) + (fp_line (start 38.1 2.54) (end 38.1 0) + (stroke (width 0.1) (type solid)) (layer "B.Fab") (tstamp ae948fd2-fde1-4ae9-9d26-94b54c873cea)) + (fp_line (start 40.64 -35.31) (end 38.1 -37.85) + (stroke (width 0.1) (type solid)) (layer "B.Fab") (tstamp a3d33813-fda8-4ed9-bc8f-5ec4ae78faf3)) + (fp_line (start 40.64 -2.54) (end 40.64 -35.31) + (stroke (width 0.1) (type solid)) (layer "B.Fab") (tstamp 49e48392-fb84-4d84-a664-93314d8fd7b9)) + (pad "1" thru_hole rect (at 0 0 180) (size 1.6 1.6) (drill 1) (layers "*.Cu" "*.Mask") + (net 1 "unconnected-(A101-NC-Pad1)") (pinfunction "NC") (pintype "no_connect") (tstamp f7515c24-5205-417e-a753-8358959a8f9a)) + (pad "2" thru_hole oval (at 2.54 0 180) (size 1.6 1.6) (drill 1) (layers "*.Cu" "*.Mask") + (net 2 "unconnected-(A101-IOREF-Pad2)") (pinfunction "IOREF") (pintype "output") (tstamp 02958a5e-2866-4500-9fff-c69a46b00b0e)) + (pad "3" thru_hole oval (at 5.08 0 180) (size 1.6 1.6) (drill 1) (layers "*.Cu" "*.Mask") + (net 3 "unconnected-(A101-~{RESET}-Pad3)") (pinfunction "~{RESET}") (pintype "input") (tstamp 7ce639d9-ccab-4247-8186-2063f3d134eb)) + (pad "4" thru_hole oval (at 7.62 0 180) (size 1.6 1.6) (drill 1) (layers "*.Cu" "*.Mask") + (net 4 "+3V3") (pinfunction "3V3") (pintype "power_out") (tstamp e8516082-aaa3-4868-ad46-e289f389753b)) + (pad "5" thru_hole oval (at 10.16 0 180) (size 1.6 1.6) (drill 1) (layers "*.Cu" "*.Mask") + (net 4 "+3V3") (pinfunction "+5V") (pintype "power_out") (tstamp 46537b62-8a6e-4f22-9ffa-51016803e8eb)) + (pad "6" thru_hole oval (at 12.7 0 180) (size 1.6 1.6) (drill 1) (layers "*.Cu" "*.Mask") + (net 5 "GND") (pinfunction "GND") (pintype "power_in") (tstamp 1dd19657-4f80-4a8f-b2fd-f590f5b21508)) + (pad "7" thru_hole oval (at 15.24 0 180) (size 1.6 1.6) (drill 1) (layers "*.Cu" "*.Mask") + (net 5 "GND") (pinfunction "GND") (pintype "power_in") (tstamp b903a468-6690-4bf7-8f7e-cbc84eada7f9)) + (pad "8" thru_hole oval (at 17.78 0 180) (size 1.6 1.6) (drill 1) (layers "*.Cu" "*.Mask") + (net 6 "unconnected-(A101-VIN-Pad8)") (pinfunction "VIN") (pintype "power_in") (tstamp 3ca81f87-2b1f-403a-a66d-652496fb42ad)) + (pad "9" thru_hole oval (at 22.86 0 180) (size 1.6 1.6) (drill 1) (layers "*.Cu" "*.Mask") + (net 7 "NFC_IRQ") (pinfunction "A0") (pintype "bidirectional") (tstamp c20b3c00-c949-4a0c-9ee1-92669b2964a3)) + (pad "10" thru_hole oval (at 25.4 0 180) (size 1.6 1.6) (drill 1) (layers "*.Cu" "*.Mask") + (net 8 "unconnected-(A101-A1-Pad10)") (pinfunction "A1") (pintype "bidirectional") (tstamp 97dfb801-c455-4933-b5df-de3d472470cd)) + (pad "11" thru_hole oval (at 27.94 0 180) (size 1.6 1.6) (drill 1) (layers "*.Cu" "*.Mask") + (net 9 "unconnected-(A101-A2-Pad11)") (pinfunction "A2") (pintype "bidirectional") (tstamp 9f778251-a8bd-4ebd-9a27-42abf8ddf83f)) + (pad "12" thru_hole oval (at 30.48 0 180) (size 1.6 1.6) (drill 1) (layers "*.Cu" "*.Mask") + (net 10 "unconnected-(A101-A3-Pad12)") (pinfunction "A3") (pintype "bidirectional") (tstamp 2c20b29f-50f6-4f92-a764-d5737ce5ac84)) + (pad "13" thru_hole oval (at 33.02 0 180) (size 1.6 1.6) (drill 1) (layers "*.Cu" "*.Mask") + (net 11 "unconnected-(A101-SDA{slash}A4-Pad13)") (pinfunction "SDA/A4") (pintype "bidirectional") (tstamp ef18ff6e-73d0-4360-bb5a-b0e248708d69)) + (pad "14" thru_hole oval (at 35.56 0 180) (size 1.6 1.6) (drill 1) (layers "*.Cu" "*.Mask") + (net 12 "unconnected-(A101-SCL{slash}A5-Pad14)") (pinfunction "SCL/A5") (pintype "bidirectional") (tstamp 6a9ba62c-38a8-4329-896a-50a2d63d2ace)) + (pad "15" thru_hole oval (at 35.56 -48.26 180) (size 1.6 1.6) (drill 1) (layers "*.Cu" "*.Mask") + (net 13 "unconnected-(A101-D0{slash}RX-Pad15)") (pinfunction "D0/RX") (pintype "bidirectional") (tstamp af50edd6-4f73-4249-b734-68faca22444b)) + (pad "16" thru_hole oval (at 33.02 -48.26 180) (size 1.6 1.6) (drill 1) (layers "*.Cu" "*.Mask") + (net 14 "unconnected-(A101-D1{slash}TX-Pad16)") (pinfunction "D1/TX") (pintype "bidirectional") (tstamp fa1c538a-3c05-498c-b1f4-613b326b5cbd)) + (pad "17" thru_hole oval (at 30.48 -48.26 180) (size 1.6 1.6) (drill 1) (layers "*.Cu" "*.Mask") + (net 15 "unconnected-(A101-D2-Pad17)") (pinfunction "D2") (pintype "bidirectional") (tstamp 549e7a60-492c-4e55-8bce-e588dfff13a7)) + (pad "18" thru_hole oval (at 27.94 -48.26 180) (size 1.6 1.6) (drill 1) (layers "*.Cu" "*.Mask") + (net 16 "unconnected-(A101-D3-Pad18)") (pinfunction "D3") (pintype "bidirectional") (tstamp f9960bd5-e318-4c3d-9a26-ece8d8c8b7b3)) + (pad "19" thru_hole oval (at 25.4 -48.26 180) (size 1.6 1.6) (drill 1) (layers "*.Cu" "*.Mask") + (net 17 "unconnected-(A101-D4-Pad19)") (pinfunction "D4") (pintype "bidirectional") (tstamp ef33024a-17d4-4625-b55c-927870a054b9)) + (pad "20" thru_hole oval (at 22.86 -48.26 180) (size 1.6 1.6) (drill 1) (layers "*.Cu" "*.Mask") + (net 18 "unconnected-(A101-D5-Pad20)") (pinfunction "D5") (pintype "bidirectional") (tstamp 6152aa72-bcf5-47e8-96a3-e9bbcb5d6ca2)) + (pad "21" thru_hole oval (at 20.32 -48.26 180) (size 1.6 1.6) (drill 1) (layers "*.Cu" "*.Mask") + (net 19 "unconnected-(A101-D6-Pad21)") (pinfunction "D6") (pintype "bidirectional") (tstamp e1e51b6f-9dc8-493b-aa4a-cba2f77dcbe6)) + (pad "22" thru_hole oval (at 17.78 -48.26 180) (size 1.6 1.6) (drill 1) (layers "*.Cu" "*.Mask") + (net 20 "unconnected-(A101-D7-Pad22)") (pinfunction "D7") (pintype "bidirectional") (tstamp dba8039c-1d79-425c-817e-b7135b245c4d)) + (pad "23" thru_hole oval (at 13.72 -48.26 180) (size 1.6 1.6) (drill 1) (layers "*.Cu" "*.Mask") + (net 21 "unconnected-(A101-D8-Pad23)") (pinfunction "D8") (pintype "bidirectional") (tstamp 320f1ada-cf1e-40de-b46f-521df4f6fe3f)) + (pad "24" thru_hole oval (at 11.18 -48.26 180) (size 1.6 1.6) (drill 1) (layers "*.Cu" "*.Mask") + (net 22 "unconnected-(A101-D9-Pad24)") (pinfunction "D9") (pintype "bidirectional") (tstamp e16a80d2-c045-4c3f-a4f4-5c474a2d057c)) + (pad "25" thru_hole oval (at 8.64 -48.26 180) (size 1.6 1.6) (drill 1) (layers "*.Cu" "*.Mask") + (net 23 "NFC_SS_N") (pinfunction "D10") (pintype "bidirectional") (tstamp 42e0ed44-6d38-4b77-b082-21809496d82a)) + (pad "26" thru_hole oval (at 6.1 -48.26 180) (size 1.6 1.6) (drill 1) (layers "*.Cu" "*.Mask") + (net 24 "MOSI") (pinfunction "D11") (pintype "bidirectional") (tstamp 29db1bc0-d438-4573-b91e-e9cacba8ff07)) + (pad "27" thru_hole oval (at 3.56 -48.26 180) (size 1.6 1.6) (drill 1) (layers "*.Cu" "*.Mask") + (net 25 "MISO") (pinfunction "D12") (pintype "bidirectional") (tstamp 37afb7d3-0abe-4bee-8f61-e2f496da6dbd)) + (pad "28" thru_hole oval (at 1.02 -48.26 180) (size 1.6 1.6) (drill 1) (layers "*.Cu" "*.Mask") + (net 26 "SLCK") (pinfunction "D13") (pintype "bidirectional") (tstamp ae5675b8-97ad-4dda-814b-12ec388ba04f)) + (pad "29" thru_hole oval (at -1.52 -48.26 180) (size 1.6 1.6) (drill 1) (layers "*.Cu" "*.Mask") + (net 27 "unconnected-(A101-GND-Pad29)") (pinfunction "GND") (pintype "power_in") (tstamp 818e6f9b-c699-4612-a539-df191d2280ca)) + (pad "30" thru_hole oval (at -4.06 -48.26 180) (size 1.6 1.6) (drill 1) (layers "*.Cu" "*.Mask") + (net 28 "unconnected-(A101-AREF-Pad30)") (pinfunction "AREF") (pintype "input") (tstamp 8f4b0cc9-4a63-4732-9296-e767d0cfd3d6)) + (pad "31" thru_hole oval (at -6.6 -48.26 180) (size 1.6 1.6) (drill 1) (layers "*.Cu" "*.Mask") + (net 29 "unconnected-(A101-SDA{slash}A4-Pad31)") (pinfunction "SDA/A4") (pintype "bidirectional") (tstamp 427a3679-e179-4350-85f0-5e97788f4d33)) + (pad "32" thru_hole oval (at -9.14 -48.26 180) (size 1.6 1.6) (drill 1) (layers "*.Cu" "*.Mask") + (net 30 "unconnected-(A101-SCL{slash}A5-Pad32)") (pinfunction "SCL/A5") (pintype "bidirectional") (tstamp 2eb9e03a-00f9-438a-a479-01cafc21d1f9)) + (model "${KICAD6_3DMODEL_DIR}/Module.3dshapes/Arduino_UNO_R3.wrl" + (offset (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (gr_rect (start 97.5 47.5) (end 155 142.5) + (stroke (width 0.1) (type default)) (fill none) (layer "Edge.Cuts") (tstamp 9c2832e1-46bf-4e26-9969-d6f5ebf74e8a)) + + (segment (start 101.12 112.235) (end 101.12 109.695) (width 0.25) (layer "F.Cu") (net 4) (tstamp ca6a8ee1-e648-4d54-ad98-9ef48f7d1441)) + (segment (start 101.12 109.695) (end 101.12 108.5699) (width 0.25) (layer "B.Cu") (net 4) (tstamp 017a10bc-f4be-4f97-959f-74295adf3c50)) + (segment (start 106.1777 80.5749) (end 106.67 80.5749) (width 0.25) (layer "B.Cu") (net 4) (tstamp 19f96c7b-41b1-4dc5-8112-055e7b2b4594)) + (segment (start 106.67 81.75) (end 106.67 80.5749) (width 0.25) (layer "B.Cu") (net 4) (tstamp 274f4ef7-434e-46c6-90b4-fb570165386b)) + (segment (start 99.3579 72.43) (end 99.3579 73.7551) (width 0.25) (layer "B.Cu") (net 4) (tstamp 2c918506-920b-4966-89a9-0b35d06ef97b)) + (segment (start 106.67 103.3012) (end 106.67 81.75) (width 0.25) (layer "B.Cu") (net 4) (tstamp 44e3c3dd-03d0-4818-9e87-9f69337bd05d)) + (segment (start 101.4013 108.5699) (end 106.67 103.3012) (width 0.25) (layer "B.Cu") (net 4) (tstamp 74e9843c-dce0-4439-b61e-739e08eb6968)) + (segment (start 101.12 108.5699) (end 101.4013 108.5699) (width 0.25) (layer "B.Cu") (net 4) (tstamp 8feb133f-88f6-4545-8f04-723c328957db)) + (segment (start 99.3579 73.7551) (end 106.1777 80.5749) (width 0.25) (layer "B.Cu") (net 4) (tstamp bcc924bc-561b-463b-a38e-3e2767f45119)) + (segment (start 108.293 59.8302) (end 108.293 79.6579) (width 0.25) (layer "F.Cu") (net 5) (tstamp 011a37b5-8aa9-4311-b247-f7349c224a6c)) + (segment (start 108.293 79.6579) (end 109.21 80.5749) (width 0.25) (layer "F.Cu") (net 5) (tstamp 2912662c-c99f-4708-882a-0166bf2fe8b4)) + (segment (start 101.12 117.315) (end 101.12 115.339) (width 0.25) (layer "F.Cu") (net 5) (tstamp 4a685c5c-6953-477d-879f-9877685ce9ca)) + (segment (start 99.3579 50.8951) (end 108.293 59.8302) (width 0.25) (layer "F.Cu") (net 5) (tstamp 4e6a2a00-86d0-4eea-91fa-313c99c1a384)) + (segment (start 109.21 81.75) (end 109.21 107.249) (width 0.25) (layer "F.Cu") (net 5) (tstamp 853d193e-3d35-476e-905a-9550c35005d7)) + (segment (start 109.21 107.249) (end 101.12 115.339) (width 0.25) (layer "F.Cu") (net 5) (tstamp 8f2dd1b3-f15f-423a-bfe5-7916f19f3671)) + (segment (start 109.21 81.75) (end 109.21 80.5749) (width 0.25) (layer "F.Cu") (net 5) (tstamp a8914edf-76dd-4e9a-80a9-b3c4197022c2)) + (segment (start 99.3579 49.57) (end 99.3579 50.8951) (width 0.25) (layer "F.Cu") (net 5) (tstamp be14ac45-c23f-43bc-b813-580a25aa06c3)) + (segment (start 101.12 115.339) (end 101.12 114.775) (width 0.25) (layer "F.Cu") (net 5) (tstamp cb767cc1-3e8e-41db-8d66-4da16f74ed91)) + (segment (start 117.138 72.9268) (end 117.138 73.0925) (width 0.25) (layer "F.Cu") (net 7) (tstamp 0e93b4ce-3a4e-4392-becd-03feb49c9020)) + (segment (start 101.12 124.935) (end 101.12 123.8099) (width 0.25) (layer "F.Cu") (net 7) (tstamp 14d6c065-0415-44cc-bb3f-30a30b9c5f55)) + (segment (start 117.138 72.6784) (end 117.138 72.9268) (width 0.25) (layer "F.Cu") (net 7) (tstamp 20a2ac93-9f4d-4211-be4f-c58d92cb093f)) + (segment (start 113.02 111.9099) (end 101.12 123.8099) (width 0.25) (layer "F.Cu") (net 7) (tstamp 5ab0954e-f631-4f32-bb04-ab1135dc6fcc)) + (segment (start 113.02 77.0448) (end 113.02 111.9099) (width 0.25) (layer "F.Cu") (net 7) (tstamp 636d2c56-06e0-4e0c-8baf-f6e5a488f8ad)) + (segment (start 117.138 72.43) (end 117.138 72.6784) (width 0.25) (layer "F.Cu") (net 7) (tstamp 7dd65012-7675-4588-ae26-016fe79e3402)) + (segment (start 117.138 72.6784) (end 117.1379 72.6783) (width 0.25) (layer "F.Cu") (net 7) (tstamp ccbc45f4-a414-482d-84c6-a08d76131d1d)) + (segment (start 117.1379 72.6783) (end 117.1379 72.43) (width 0.25) (layer "F.Cu") (net 7) (tstamp dd4be416-901b-4bd5-b04e-00f559ff216d)) + (segment (start 117.138 72.9268) (end 113.02 77.0448) (width 0.25) (layer "F.Cu") (net 7) (tstamp ed0a0912-7665-4a30-b4ed-b56b21d4d52e)) + (segment (start 110.48 82.1735) (end 139.0215 110.715) (width 0.25) (layer "B.Cu") (net 23) (tstamp 0e53285a-48ee-482d-96b5-27b99bdef2aa)) + (segment (start 106.9779 72.43) (end 106.9779 73.7551) (width 0.25) (layer "B.Cu") (net 23) (tstamp 0f6dc039-4e1f-4917-9cd0-0be4c4f5e338)) + (segment (start 106.9779 73.7551) (end 110.48 77.2572) (width 0.25) (layer "B.Cu") (net 23) (tstamp 11846f8e-fb67-4a78-a351-6d99cbd79d17)) + (segment (start 110.48 77.2572) (end 110.48 82.1735) (width 0.25) (layer "B.Cu") (net 23) (tstamp 3e7f3a01-4c2a-474b-a2d3-2915fd115aef)) + (segment (start 139.0215 110.715) (end 149.38 110.715) (width 0.25) (layer "B.Cu") (net 23) (tstamp 8f45d093-1ea8-4921-9b67-4b89a00a0f96)) + (segment (start 112.058 72.9268) (end 111.75 73.2348) (width 0.25) (layer "F.Cu") (net 24) (tstamp 32351642-0e65-40e7-abea-ba505c2531d8)) + (segment (start 112.058 72.6784) (end 112.0579 72.6783) (width 0.25) (layer "F.Cu") (net 24) (tstamp 5a675906-a63d-48c9-904f-232850e1f1c0)) + (segment (start 112.058 72.43) (end 112.058 72.6784) (width 0.25) (layer "F.Cu") (net 24) (tstamp 7a4d2cd8-3cc2-48d4-9c9c-e1d6364fa4ea)) + (segment (start 111.75 73.2348) (end 111.75 81.75) (width 0.25) (layer "F.Cu") (net 24) (tstamp 9c433596-0a0a-437f-a326-4260e4d07805)) + (segment (start 112.0579 72.6783) (end 112.0579 72.43) (width 0.25) (layer "F.Cu") (net 24) (tstamp eb285bb3-c05d-4d71-9300-c74162eeb9cc)) + (segment (start 112.058 72.9268) (end 112.058 73.0925) (width 0.25) (layer "F.Cu") (net 24) (tstamp edce02e9-c9ab-47c8-9171-8362fd0135f1)) + (segment (start 112.058 72.6784) (end 112.058 72.9268) (width 0.25) (layer "F.Cu") (net 24) (tstamp efbb5f75-cc27-4d58-9cfd-4d49aac88341)) + (segment (start 138.9829 108.175) (end 112.9251 82.1172) (width 0.25) (layer "B.Cu") (net 24) (tstamp ad7fee84-2aca-44ae-81a6-6d36bd06853d)) + (segment (start 112.9251 82.1172) (end 112.9251 81.75) (width 0.25) (layer "B.Cu") (net 24) (tstamp b6dc97a7-24a3-4619-b9b8-98dcbf3a1f25)) + (segment (start 149.38 108.175) (end 138.9829 108.175) (width 0.25) (layer "B.Cu") (net 24) (tstamp b9a51de7-05ea-4850-9238-3afb465a4a51)) + (segment (start 111.75 81.75) (end 112.9251 81.75) (width 0.25) (layer "B.Cu") (net 24) (tstamp df5bf64e-f0ec-4bc1-a64a-815c4f402444)) + (segment (start 147.9652 103.3283) (end 149.1468 104.5099) (width 0.25) (layer "B.Cu") (net 25) (tstamp 280f4207-2e67-475f-89fa-444d6b005518)) + (segment (start 147.9652 103.0495) (end 147.9652 103.3283) (width 0.25) (layer "B.Cu") (net 25) (tstamp 2f991188-b66e-4f75-b2ec-7283122c53f4)) + (segment (start 149.1468 104.5099) (end 149.38 104.5099) (width 0.25) (layer "B.Cu") (net 25) (tstamp 49a73e9e-b104-457d-9ef5-b9abbfc7c55b)) + (segment (start 121.7703 76.8546) (end 147.9652 103.0495) (width 0.25) (layer "B.Cu") (net 25) (tstamp 71a801e6-d398-4d22-9a1d-3c8e19e61451)) + (segment (start 114.598 72.7612) (end 114.5979 72.7611) (width 0.25) (layer "B.Cu") (net 25) (tstamp 88543663-2418-4652-a3ae-c62cf843f3d5)) + (segment (start 114.598 72.9268) (end 118.5258 76.8546) (width 0.25) (layer "B.Cu") (net 25) (tstamp a71c21d9-bed6-431d-af94-acb44f15b87f)) + (segment (start 149.38 105.635) (end 149.38 104.5099) (width 0.25) (layer "B.Cu") (net 25) (tstamp abc3791b-b035-4ca9-83f7-e8975f405ee7)) + (segment (start 114.598 72.43) (end 114.598 72.7612) (width 0.25) (layer "B.Cu") (net 25) (tstamp cf07f871-cc07-46cc-a0bb-6cf52b9aa7d3)) + (segment (start 118.5258 76.8546) (end 121.7703 76.8546) (width 0.25) (layer "B.Cu") (net 25) (tstamp dc236160-aae5-43c1-9e39-c7ee23c59b3a)) + (segment (start 114.598 72.7612) (end 114.598 72.9268) (width 0.25) (layer "B.Cu") (net 25) (tstamp dff7e56d-c900-420e-945d-1c84cc15dc21)) + (segment (start 114.5979 72.7611) (end 114.5979 72.43) (width 0.25) (layer "B.Cu") (net 25) (tstamp e39bd297-9c25-466e-a327-b75a406df031)) + (segment (start 114.598 72.9268) (end 114.598 73.0925) (width 0.25) (layer "B.Cu") (net 25) (tstamp fc683484-f5d3-4197-9d5c-857dc018aa4f)) + (segment (start 109.5179 72.7611) (end 109.5179 72.43) (width 0.25) (layer "F.Cu") (net 33) (tstamp 0aad2763-71f8-41c4-846a-72f99c4b2d53)) + (segment (start 109.518 72.43) (end 109.518 72.7612) (width 0.25) (layer "F.Cu") (net 33) (tstamp 1d1300ea-923d-45fc-8e3c-0b1bcc3fdaff)) + (segment (start 109.518 72.7612) (end 109.518 73.0925) (width 0.25) (layer "F.Cu") (net 33) (tstamp 599f701b-48e2-46fe-a533-5c21ac928f16)) + (segment (start 109.518 72.7612) (end 109.5179 72.7611) (width 0.25) (layer "F.Cu") (net 33) (tstamp 9cd0a9b1-66b8-4449-af29-d2d3ef9d4ca2)) + (segment (start 109.5179 72.43) (end 109.5179 73.7551) (width 0.25) (layer "B.Cu") (net 33) (tstamp 09d65eb0-00ca-45ff-b0f2-6826bbf35d3b)) + (segment (start 114.29 78.5272) (end 114.29 81.75) (width 0.25) (layer "B.Cu") (net 33) (tstamp eff24abd-691d-460d-a846-71d453a68f49)) + (segment (start 109.5179 73.7551) (end 114.29 78.5272) (width 0.25) (layer "B.Cu") (net 33) (tstamp fc9a7b57-e419-4912-87cb-c0b201d1d5f0)) + (segment (start 119.678 50.2325) (end 118.734 51.1765) (width 0.25) (layer "F.Cu") (net 61) (tstamp 0f83361d-84a4-485f-ad2b-53374f9de415)) + (segment (start 118.734 51.1765) (end 118.734 79.9389) (width 0.25) (layer "F.Cu") (net 61) (tstamp 45168cd7-f582-4188-9919-1ab6fe0c713a)) + (segment (start 118.734 79.9389) (end 119.37 80.5749) (width 0.25) (layer "F.Cu") (net 61) (tstamp 559c3311-c8a9-4a93-a706-30e2d8f9535d)) + (segment (start 119.37 81.75) (end 119.37 80.5749) (width 0.25) (layer "F.Cu") (net 61) (tstamp 60652391-c8ab-4eab-977b-cfbbb0faae15)) + (segment (start 119.6779 49.9011) (end 119.6779 49.57) (width 0.25) (layer "F.Cu") (net 61) (tstamp 69dc0562-05e1-4438-8606-93d6ea7afeb5)) + (segment (start 119.678 49.9012) (end 119.6779 49.9011) (width 0.25) (layer "F.Cu") (net 61) (tstamp d0d6a5dc-68de-4f6e-aa16-901e98e739fc)) + (segment (start 119.678 49.9012) (end 119.678 50.2325) (width 0.25) (layer "F.Cu") (net 61) (tstamp dfe40f43-9305-4506-a6bd-5c231a6a939a)) + (segment (start 119.678 49.57) (end 119.678 49.9012) (width 0.25) (layer "F.Cu") (net 61) (tstamp f2d6ca74-2b1e-45df-9f4d-ffc392801b59)) + (segment (start 117.138 49.9012) (end 117.1379 49.9011) (width 0.25) (layer "F.Cu") (net 62) (tstamp 081f30a8-f3cd-49bb-97ab-15c9ea7fe1ec)) + (segment (start 117.1379 49.9011) (end 117.1379 49.57) (width 0.25) (layer "F.Cu") (net 62) (tstamp 6024b5a1-c2e3-46d2-beef-58a1ef820795)) + (segment (start 117.138 49.57) (end 117.138 49.9012) (width 0.25) (layer "F.Cu") (net 62) (tstamp db80e180-2d0d-4c2f-8d98-7310af8cdbac)) + (segment (start 117.138 49.9012) (end 117.138 50.2325) (width 0.25) (layer "F.Cu") (net 62) (tstamp ec51607d-9b89-47fc-bd79-0d576c3a50c1)) + (segment (start 113.629 54.404) (end 113.629 73.211) (width 0.25) (layer "B.Cu") (net 62) (tstamp 264cfc34-f657-4ee3-a9da-e59de5e438ed)) + (segment (start 117.1379 50.8951) (end 113.629 54.404) (width 0.25) (layer "B.Cu") (net 62) (tstamp 26bc4d37-c145-45a2-b7a3-49e1cd6ad69d)) + (segment (start 117.1379 49.57) (end 117.1379 50.8951) (width 0.25) (layer "B.Cu") (net 62) (tstamp 6d50df22-57e0-48ad-8622-f05a4e9d0543)) + (segment (start 120.9929 80.5749) (end 121.91 80.5749) (width 0.25) (layer "B.Cu") (net 62) (tstamp 7ef4682b-70ed-4884-9045-bd01faeffef5)) + (segment (start 121.91 81.75) (end 121.91 80.5749) (width 0.25) (layer "B.Cu") (net 62) (tstamp aa447414-897e-4428-8f6c-97b3135c9cbc)) + (segment (start 113.629 73.211) (end 120.9929 80.5749) (width 0.25) (layer "B.Cu") (net 62) (tstamp df74588a-719c-4e0d-ae9e-9ef06f56650e)) + (segment (start 114.5979 49.57) (end 114.5979 48.2449) (width 0.25) (layer "F.Cu") (net 63) (tstamp 1579fc24-37dc-4162-8e93-6a1942ff927a)) + (segment (start 120.0712 48.2449) (end 120.6031 48.7768) (width 0.25) (layer "F.Cu") (net 63) (tstamp 1bb95300-40a9-482e-a30b-9b18554c881d)) + (segment (start 120.6031 76.728) (end 124.45 80.5749) (width 0.25) (layer "F.Cu") (net 63) (tstamp 30dcf49b-f43a-4420-9a8d-a10da24e1af4)) + (segment (start 124.45 81.75) (end 124.45 80.5749) (width 0.25) (layer "F.Cu") (net 63) (tstamp 6f6236cc-42da-4302-ba4f-b586e8bddc4c)) + (segment (start 114.5979 48.2449) (end 120.0712 48.2449) (width 0.25) (layer "F.Cu") (net 63) (tstamp a3d15880-fbee-4cb5-b5bb-193a809a74d4)) + (segment (start 120.6031 48.7768) (end 120.6031 76.728) (width 0.25) (layer "F.Cu") (net 63) (tstamp cc519b60-ae27-4b32-b4d5-f01ab9c142bc)) + (segment (start 114.598 49.9012) (end 114.5979 49.9011) (width 0.25) (layer "B.Cu") (net 63) (tstamp 05955416-3701-47cb-84fc-a78b3d2949d7)) + (segment (start 114.5979 49.9011) (end 114.5979 49.57) (width 0.25) (layer "B.Cu") (net 63) (tstamp 574145ec-5168-4ae6-a466-cce54a4ef355)) + (segment (start 114.598 49.9012) (end 114.598 50.2325) (width 0.25) (layer "B.Cu") (net 63) (tstamp 8eb60459-8258-47e6-99a0-b8b4cb767188)) + (segment (start 114.598 49.57) (end 114.598 49.9012) (width 0.25) (layer "B.Cu") (net 63) (tstamp ef611d4b-def1-4724-98be-3f3b78d0e645)) + +) diff --git a/Hardware/FabReader1.5/FabReader1.5.kicad_pro b/Hardware/FabReader1.5/FabReader1.5.kicad_pro new file mode 100644 index 0000000..b72317e --- /dev/null +++ b/Hardware/FabReader1.5/FabReader1.5.kicad_pro @@ -0,0 +1,487 @@ +{ + "board": { + "3dviewports": [], + "design_settings": { + "defaults": { + "board_outline_line_width": 0.09999999999999999, + "copper_line_width": 0.19999999999999998, + "copper_text_italic": false, + "copper_text_size_h": 1.5, + "copper_text_size_v": 1.5, + "copper_text_thickness": 0.3, + "copper_text_upright": false, + "courtyard_line_width": 0.049999999999999996, + "dimension_precision": 4, + "dimension_units": 3, + "dimensions": { + "arrow_length": 1270000, + "extension_offset": 500000, + "keep_text_aligned": true, + "suppress_zeroes": false, + "text_position": 0, + "units_format": 1 + }, + "fab_line_width": 0.09999999999999999, + "fab_text_italic": false, + "fab_text_size_h": 1.0, + "fab_text_size_v": 1.0, + "fab_text_thickness": 0.15, + "fab_text_upright": false, + "other_line_width": 0.15, + "other_text_italic": false, + "other_text_size_h": 1.0, + "other_text_size_v": 1.0, + "other_text_thickness": 0.15, + "other_text_upright": false, + "pads": { + "drill": 0.762, + "height": 1.524, + "width": 1.524 + }, + "silk_line_width": 0.15, + "silk_text_italic": false, + "silk_text_size_h": 1.0, + "silk_text_size_v": 1.0, + "silk_text_thickness": 0.15, + "silk_text_upright": false, + "zones": { + "min_clearance": 0.5 + } + }, + "diff_pair_dimensions": [], + "drc_exclusions": [], + "meta": { + "version": 2 + }, + "rule_severities": { + "annular_width": "error", + "clearance": "error", + "connection_width": "warning", + "copper_edge_clearance": "error", + "copper_sliver": "warning", + "courtyards_overlap": "error", + "diff_pair_gap_out_of_range": "error", + "diff_pair_uncoupled_length_too_long": "error", + "drill_out_of_range": "error", + "duplicate_footprints": "warning", + "extra_footprint": "warning", + "footprint": "error", + "footprint_type_mismatch": "ignore", + "hole_clearance": "error", + "hole_near_hole": "error", + "invalid_outline": "error", + "isolated_copper": "warning", + "item_on_disabled_layer": "error", + "items_not_allowed": "error", + "length_out_of_range": "error", + "lib_footprint_issues": "warning", + "lib_footprint_mismatch": "warning", + "malformed_courtyard": "error", + "microvia_drill_out_of_range": "error", + "missing_courtyard": "ignore", + "missing_footprint": "warning", + "net_conflict": "warning", + "npth_inside_courtyard": "ignore", + "padstack": "warning", + "pth_inside_courtyard": "ignore", + "shorting_items": "error", + "silk_edge_clearance": "warning", + "silk_over_copper": "warning", + "silk_overlap": "warning", + "skew_out_of_range": "error", + "solder_mask_bridge": "error", + "starved_thermal": "error", + "text_height": "warning", + "text_thickness": "warning", + "through_hole_pad_without_hole": "error", + "too_many_vias": "error", + "track_dangling": "warning", + "track_width": "error", + "tracks_crossing": "error", + "unconnected_items": "error", + "unresolved_variable": "error", + "via_dangling": "warning", + "zones_intersect": "error" + }, + "rules": { + "max_error": 0.005, + "min_clearance": 0.0, + "min_connection": 0.0, + "min_copper_edge_clearance": 0.0, + "min_hole_clearance": 0.25, + "min_hole_to_hole": 0.25, + "min_microvia_diameter": 0.19999999999999998, + "min_microvia_drill": 0.09999999999999999, + "min_resolved_spokes": 2, + "min_silk_clearance": 0.0, + "min_text_height": 0.7999999999999999, + "min_text_thickness": 0.08, + "min_through_hole_diameter": 0.3, + "min_track_width": 0.0, + "min_via_annular_width": 0.09999999999999999, + "min_via_diameter": 0.5, + "solder_mask_clearance": 0.0, + "solder_mask_min_width": 0.0, + "solder_mask_to_copper_clearance": 0.0, + "use_height_for_length_calcs": true + }, + "teardrop_options": [ + { + "td_allow_use_two_tracks": true, + "td_curve_segcount": 5, + "td_on_pad_in_zone": false, + "td_onpadsmd": true, + "td_onroundshapesonly": false, + "td_ontrackend": false, + "td_onviapad": true + } + ], + "teardrop_parameters": [ + { + "td_curve_segcount": 0, + "td_height_ratio": 1.0, + "td_length_ratio": 0.5, + "td_maxheight": 2.0, + "td_maxlen": 1.0, + "td_target_name": "td_round_shape", + "td_width_to_size_filter_ratio": 0.9 + }, + { + "td_curve_segcount": 0, + "td_height_ratio": 1.0, + "td_length_ratio": 0.5, + "td_maxheight": 2.0, + "td_maxlen": 1.0, + "td_target_name": "td_rect_shape", + "td_width_to_size_filter_ratio": 0.9 + }, + { + "td_curve_segcount": 0, + "td_height_ratio": 1.0, + "td_length_ratio": 0.5, + "td_maxheight": 2.0, + "td_maxlen": 1.0, + "td_target_name": "td_track_end", + "td_width_to_size_filter_ratio": 0.9 + } + ], + "track_widths": [], + "via_dimensions": [], + "zones_allow_external_fillets": false + }, + "layer_presets": [], + "viewports": [] + }, + "boards": [], + "cvpcb": { + "equivalence_files": [] + }, + "erc": { + "erc_exclusions": [], + "meta": { + "version": 0 + }, + "pin_map": [ + [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 2 + ], + [ + 0, + 2, + 0, + 1, + 0, + 0, + 1, + 0, + 2, + 2, + 2, + 2 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 2 + ], + [ + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 2, + 1, + 1, + 2 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 2 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 2 + ], + [ + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 2 + ], + [ + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 2 + ], + [ + 0, + 2, + 1, + 2, + 0, + 0, + 1, + 0, + 2, + 2, + 2, + 2 + ], + [ + 0, + 2, + 0, + 1, + 0, + 0, + 1, + 0, + 2, + 0, + 0, + 2 + ], + [ + 0, + 2, + 1, + 1, + 0, + 0, + 1, + 0, + 2, + 0, + 0, + 2 + ], + [ + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2 + ] + ], + "rule_severities": { + "bus_definition_conflict": "error", + "bus_entry_needed": "error", + "bus_to_bus_conflict": "error", + "bus_to_net_conflict": "error", + "conflicting_netclasses": "error", + "different_unit_footprint": "error", + "different_unit_net": "error", + "duplicate_reference": "error", + "duplicate_sheet_names": "error", + "endpoint_off_grid": "warning", + "extra_units": "error", + "global_label_dangling": "warning", + "hier_label_mismatch": "error", + "label_dangling": "error", + "lib_symbol_issues": "warning", + "missing_bidi_pin": "warning", + "missing_input_pin": "warning", + "missing_power_pin": "error", + "missing_unit": "warning", + "multiple_net_names": "warning", + "net_not_bus_member": "warning", + "no_connect_connected": "warning", + "no_connect_dangling": "warning", + "pin_not_connected": "error", + "pin_not_driven": "error", + "pin_to_pin": "warning", + "power_pin_not_driven": "error", + "similar_labels": "warning", + "simulation_model_issue": "error", + "unannotated": "error", + "unit_value_mismatch": "error", + "unresolved_variable": "error", + "wire_dangling": "error" + } + }, + "libraries": { + "pinned_footprint_libs": [], + "pinned_symbol_libs": [] + }, + "meta": { + "filename": "FabReader1.5.kicad_pro", + "version": 1 + }, + "net_settings": { + "classes": [ + { + "bus_width": 12, + "clearance": 0.2, + "diff_pair_gap": 0.25, + "diff_pair_via_gap": 0.25, + "diff_pair_width": 0.2, + "line_style": 0, + "microvia_diameter": 0.3, + "microvia_drill": 0.1, + "name": "Default", + "pcb_color": "rgba(0, 0, 0, 0.000)", + "schematic_color": "rgba(0, 0, 0, 0.000)", + "track_width": 0.25, + "via_diameter": 0.8, + "via_drill": 0.4, + "wire_width": 6 + } + ], + "meta": { + "version": 3 + }, + "net_colors": null, + "netclass_assignments": null, + "netclass_patterns": [] + }, + "pcbnew": { + "last_paths": { + "gencad": "", + "idf": "", + "netlist": "", + "specctra_dsn": "", + "step": "", + "vrml": "" + }, + "page_layout_descr_file": "" + }, + "schematic": { + "annotate_start_num": 0, + "drawing": { + "dashed_lines_dash_length_ratio": 12.0, + "dashed_lines_gap_length_ratio": 3.0, + "default_line_thickness": 6.0, + "default_text_size": 50.0, + "field_names": [], + "intersheets_ref_own_page": false, + "intersheets_ref_prefix": "", + "intersheets_ref_short": false, + "intersheets_ref_show": false, + "intersheets_ref_suffix": "", + "junction_size_choice": 3, + "label_size_ratio": 0.375, + "pin_symbol_size": 25.0, + "text_offset_ratio": 0.15 + }, + "legacy_lib_dir": "", + "legacy_lib_list": [], + "meta": { + "version": 1 + }, + "net_format_name": "", + "ngspice": { + "fix_include_paths": true, + "fix_passive_vals": false, + "meta": { + "version": 0 + }, + "model_mode": 0, + "workbook_filename": "" + }, + "page_layout_descr_file": "", + "plot_directory": "", + "spice_adjust_passive_values": false, + "spice_current_sheet_as_root": false, + "spice_external_command": "spice \"%I\"", + "spice_model_current_sheet_as_root": true, + "spice_save_all_currents": false, + "spice_save_all_voltages": false, + "subpart_first_id": 65, + "subpart_id_separator": 0 + }, + "sheets": [ + [ + "b8993a80-a27f-4add-baf4-93b99ccacbe5", + "" + ] + ], + "text_variables": {} +} diff --git a/Hardware/FabReader1.5/FabReader1.5.kicad_sch b/Hardware/FabReader1.5/FabReader1.5.kicad_sch new file mode 100644 index 0000000..6da6f23 --- /dev/null +++ b/Hardware/FabReader1.5/FabReader1.5.kicad_sch @@ -0,0 +1,1146 @@ +(kicad_sch (version 20230121) (generator eeschema) + + (uuid b8993a80-a27f-4add-baf4-93b99ccacbe5) + + (paper "A4") + + (title_block + (title "FabReader2 Prototype") + (date "2023-02-21") + (rev "0.1") + (company "RLKM UG (haftungsbeschränkt)") + (comment 1 "Autoren: Kai Kriegel") + ) + + (lib_symbols + (symbol "Connector:Conn_01x08_Pin" (pin_names (offset 1.016) hide) (in_bom yes) (on_board yes) + (property "Reference" "J" (at 0 10.16 0) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "Conn_01x08_Pin" (at 0 -12.7 0) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_locked" "" (at 0 0 0) + (effects (font (size 1.27 1.27))) + ) + (property "ki_keywords" "connector" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_description" "Generic connector, single row, 01x08, script generated" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_fp_filters" "Connector*:*_1x??_*" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (symbol "Conn_01x08_Pin_1_1" + (polyline + (pts + (xy 1.27 -10.16) + (xy 0.8636 -10.16) + ) + (stroke (width 0.1524) (type default)) + (fill (type none)) + ) + (polyline + (pts + (xy 1.27 -7.62) + (xy 0.8636 -7.62) + ) + (stroke (width 0.1524) (type default)) + (fill (type none)) + ) + (polyline + (pts + (xy 1.27 -5.08) + (xy 0.8636 -5.08) + ) + (stroke (width 0.1524) (type default)) + (fill (type none)) + ) + (polyline + (pts + (xy 1.27 -2.54) + (xy 0.8636 -2.54) + ) + (stroke (width 0.1524) (type default)) + (fill (type none)) + ) + (polyline + (pts + (xy 1.27 0) + (xy 0.8636 0) + ) + (stroke (width 0.1524) (type default)) + (fill (type none)) + ) + (polyline + (pts + (xy 1.27 2.54) + (xy 0.8636 2.54) + ) + (stroke (width 0.1524) (type default)) + (fill (type none)) + ) + (polyline + (pts + (xy 1.27 5.08) + (xy 0.8636 5.08) + ) + (stroke (width 0.1524) (type default)) + (fill (type none)) + ) + (polyline + (pts + (xy 1.27 7.62) + (xy 0.8636 7.62) + ) + (stroke (width 0.1524) (type default)) + (fill (type none)) + ) + (rectangle (start 0.8636 -10.033) (end 0 -10.287) + (stroke (width 0.1524) (type default)) + (fill (type outline)) + ) + (rectangle (start 0.8636 -7.493) (end 0 -7.747) + (stroke (width 0.1524) (type default)) + (fill (type outline)) + ) + (rectangle (start 0.8636 -4.953) (end 0 -5.207) + (stroke (width 0.1524) (type default)) + (fill (type outline)) + ) + (rectangle (start 0.8636 -2.413) (end 0 -2.667) + (stroke (width 0.1524) (type default)) + (fill (type outline)) + ) + (rectangle (start 0.8636 0.127) (end 0 -0.127) + (stroke (width 0.1524) (type default)) + (fill (type outline)) + ) + (rectangle (start 0.8636 2.667) (end 0 2.413) + (stroke (width 0.1524) (type default)) + (fill (type outline)) + ) + (rectangle (start 0.8636 5.207) (end 0 4.953) + (stroke (width 0.1524) (type default)) + (fill (type outline)) + ) + (rectangle (start 0.8636 7.747) (end 0 7.493) + (stroke (width 0.1524) (type default)) + (fill (type outline)) + ) + (pin passive line (at 5.08 7.62 180) (length 3.81) + (name "Pin_1" (effects (font (size 1.27 1.27)))) + (number "1" (effects (font (size 1.27 1.27)))) + ) + (pin passive line (at 5.08 5.08 180) (length 3.81) + (name "Pin_2" (effects (font (size 1.27 1.27)))) + (number "2" (effects (font (size 1.27 1.27)))) + ) + (pin passive line (at 5.08 2.54 180) (length 3.81) + (name "Pin_3" (effects (font (size 1.27 1.27)))) + (number "3" (effects (font (size 1.27 1.27)))) + ) + (pin passive line (at 5.08 0 180) (length 3.81) + (name "Pin_4" (effects (font (size 1.27 1.27)))) + (number "4" (effects (font (size 1.27 1.27)))) + ) + (pin passive line (at 5.08 -2.54 180) (length 3.81) + (name "Pin_5" (effects (font (size 1.27 1.27)))) + (number "5" (effects (font (size 1.27 1.27)))) + ) + (pin passive line (at 5.08 -5.08 180) (length 3.81) + (name "Pin_6" (effects (font (size 1.27 1.27)))) + (number "6" (effects (font (size 1.27 1.27)))) + ) + (pin passive line (at 5.08 -7.62 180) (length 3.81) + (name "Pin_7" (effects (font (size 1.27 1.27)))) + (number "7" (effects (font (size 1.27 1.27)))) + ) + (pin passive line (at 5.08 -10.16 180) (length 3.81) + (name "Pin_8" (effects (font (size 1.27 1.27)))) + (number "8" (effects (font (size 1.27 1.27)))) + ) + ) + ) + (symbol "Espressif:ESP32-S3-DevKitC" (pin_names (offset 1.016)) (in_bom yes) (on_board yes) + (property "Reference" "U" (at -22.86 33.02 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "ESP32-S3-DevKitC" (at -22.86 30.48 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "Espressif:ESP32-S3-DevKitC" (at 0 -33.02 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at -59.69 -2.54 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_description" "ESP32-S3-DevKitC" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (symbol "ESP32-S3-DevKitC_0_0" + (pin bidirectional line (at -25.4 -7.62 0) (length 2.54) + (name "GPIO46" (effects (font (size 1.27 1.27)))) + (number "14" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at -25.4 -20.32 0) (length 2.54) + (name "GPIO13/ADC2_CH2" (effects (font (size 1.27 1.27)))) + (number "19" (effects (font (size 1.27 1.27)))) + ) + (pin power_in line (at -25.4 22.86 0) (length 2.54) + (name "3V3" (effects (font (size 1.27 1.27)))) + (number "2" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at 25.4 12.7 180) (length 2.54) + (name "GPIO42/MTMS" (effects (font (size 1.27 1.27)))) + (number "39" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at 25.4 15.24 180) (length 2.54) + (name "GPIO2/ADC1_CH1" (effects (font (size 1.27 1.27)))) + (number "40" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at 25.4 17.78 180) (length 2.54) + (name "GPIO1/ADC1_CH0" (effects (font (size 1.27 1.27)))) + (number "41" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at 25.4 20.32 180) (length 2.54) + (name "GPIO44/U0RXD" (effects (font (size 1.27 1.27)))) + (number "42" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at 25.4 22.86 180) (length 2.54) + (name "GPIO43/U0TXD" (effects (font (size 1.27 1.27)))) + (number "43" (effects (font (size 1.27 1.27)))) + ) + (pin power_in line (at 25.4 25.4 180) (length 2.54) + (name "GND" (effects (font (size 1.27 1.27)))) + (number "44" (effects (font (size 1.27 1.27)))) + ) + ) + (symbol "ESP32-S3-DevKitC_0_1" + (rectangle (start -22.86 27.94) (end 22.86 -30.48) + (stroke (width 0.254) (type default)) + (fill (type background)) + ) + ) + (symbol "ESP32-S3-DevKitC_1_1" + (pin power_in line (at -25.4 25.4 0) (length 2.54) + (name "3V3" (effects (font (size 1.27 1.27)))) + (number "1" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at -25.4 2.54 0) (length 2.54) + (name "GPIO17/ADC2_CH6" (effects (font (size 1.27 1.27)))) + (number "10" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at -25.4 0 0) (length 2.54) + (name "GPIO18/ADC2_CH7" (effects (font (size 1.27 1.27)))) + (number "11" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at -25.4 -2.54 0) (length 2.54) + (name "GPIO8/ADC1_CH7" (effects (font (size 1.27 1.27)))) + (number "12" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at -25.4 -5.08 0) (length 2.54) + (name "GPIO3/ADC1_CH2" (effects (font (size 1.27 1.27)))) + (number "13" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at -25.4 -10.16 0) (length 2.54) + (name "GPIO9/ADC1_CH8" (effects (font (size 1.27 1.27)))) + (number "15" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at -25.4 -12.7 0) (length 2.54) + (name "GPIO10/ADC1_CH9" (effects (font (size 1.27 1.27)))) + (number "16" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at -25.4 -15.24 0) (length 2.54) + (name "GPIO11/ADC2_CH0" (effects (font (size 1.27 1.27)))) + (number "17" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at -25.4 -17.78 0) (length 2.54) + (name "GPIO12/ADC2_CH1" (effects (font (size 1.27 1.27)))) + (number "18" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at -25.4 -22.86 0) (length 2.54) + (name "GPIO14/ADC2_CH3" (effects (font (size 1.27 1.27)))) + (number "20" (effects (font (size 1.27 1.27)))) + ) + (pin power_in line (at -25.4 -25.4 0) (length 2.54) + (name "5V" (effects (font (size 1.27 1.27)))) + (number "21" (effects (font (size 1.27 1.27)))) + ) + (pin power_in line (at -25.4 -27.94 0) (length 2.54) + (name "GND" (effects (font (size 1.27 1.27)))) + (number "22" (effects (font (size 1.27 1.27)))) + ) + (pin power_in line (at 25.4 -27.94 180) (length 2.54) + (name "GND" (effects (font (size 1.27 1.27)))) + (number "23" (effects (font (size 1.27 1.27)))) + ) + (pin power_in line (at 25.4 -25.4 180) (length 2.54) + (name "GND" (effects (font (size 1.27 1.27)))) + (number "24" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at 25.4 -22.86 180) (length 2.54) + (name "GPIO19/USB_D-" (effects (font (size 1.27 1.27)))) + (number "25" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at 25.4 -20.32 180) (length 2.54) + (name "GPIO20/USB_D+" (effects (font (size 1.27 1.27)))) + (number "26" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at 25.4 -17.78 180) (length 2.54) + (name "GPIO21" (effects (font (size 1.27 1.27)))) + (number "27" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at 25.4 -15.24 180) (length 2.54) + (name "GPIO47" (effects (font (size 1.27 1.27)))) + (number "28" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at 25.4 -12.7 180) (length 2.54) + (name "GPIO48" (effects (font (size 1.27 1.27)))) + (number "29" (effects (font (size 1.27 1.27)))) + ) + (pin input line (at -25.4 20.32 0) (length 2.54) + (name "CHIP_PU" (effects (font (size 1.27 1.27)))) + (number "3" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at 25.4 -10.16 180) (length 2.54) + (name "GPIO45" (effects (font (size 1.27 1.27)))) + (number "30" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at 25.4 -7.62 180) (length 2.54) + (name "GPIO0" (effects (font (size 1.27 1.27)))) + (number "31" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at 25.4 -5.08 180) (length 2.54) + (name "GPIO35" (effects (font (size 1.27 1.27)))) + (number "32" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at 25.4 -2.54 180) (length 2.54) + (name "GPIO36" (effects (font (size 1.27 1.27)))) + (number "33" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at 25.4 0 180) (length 2.54) + (name "GPIO37" (effects (font (size 1.27 1.27)))) + (number "34" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at 25.4 2.54 180) (length 2.54) + (name "GPIO38" (effects (font (size 1.27 1.27)))) + (number "35" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at 25.4 5.08 180) (length 2.54) + (name "GPIO39/MTCK" (effects (font (size 1.27 1.27)))) + (number "36" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at 25.4 7.62 180) (length 2.54) + (name "GPIO40/MTDO" (effects (font (size 1.27 1.27)))) + (number "37" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at 25.4 10.16 180) (length 2.54) + (name "GPIO41/MTDI" (effects (font (size 1.27 1.27)))) + (number "38" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at -25.4 17.78 0) (length 2.54) + (name "GPIO4/ADC1_CH3" (effects (font (size 1.27 1.27)))) + (number "4" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at -25.4 15.24 0) (length 2.54) + (name "GPIO5/ADC1_CH4" (effects (font (size 1.27 1.27)))) + (number "5" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at -25.4 12.7 0) (length 2.54) + (name "GPIO6/ADC1_CH5" (effects (font (size 1.27 1.27)))) + (number "6" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at -25.4 10.16 0) (length 2.54) + (name "GPIO7/ADC1_CH6" (effects (font (size 1.27 1.27)))) + (number "7" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at -25.4 7.62 0) (length 2.54) + (name "GPIO15/ADC2_CH4/32K_P" (effects (font (size 1.27 1.27)))) + (number "8" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at -25.4 5.08 0) (length 2.54) + (name "GPIO16/ADC2_CH5/32K_N" (effects (font (size 1.27 1.27)))) + (number "9" (effects (font (size 1.27 1.27)))) + ) + ) + ) + (symbol "MCU_Module:Arduino_UNO_R3" (in_bom yes) (on_board yes) + (property "Reference" "A" (at -10.16 23.495 0) + (effects (font (size 1.27 1.27)) (justify left bottom)) + ) + (property "Value" "Arduino_UNO_R3" (at 5.08 -26.67 0) + (effects (font (size 1.27 1.27)) (justify left top)) + ) + (property "Footprint" "Module:Arduino_UNO_R3" (at 0 0 0) + (effects (font (size 1.27 1.27) italic) hide) + ) + (property "Datasheet" "https://www.arduino.cc/en/Main/arduinoBoardUno" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_keywords" "Arduino UNO R3 Microcontroller Module Atmel AVR USB" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_description" "Arduino UNO Microcontroller Module, release 3" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_fp_filters" "Arduino*UNO*R3*" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (symbol "Arduino_UNO_R3_0_1" + (rectangle (start -10.16 22.86) (end 10.16 -25.4) + (stroke (width 0.254) (type default)) + (fill (type background)) + ) + ) + (symbol "Arduino_UNO_R3_1_1" + (pin no_connect line (at -10.16 -20.32 0) (length 2.54) hide + (name "NC" (effects (font (size 1.27 1.27)))) + (number "1" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at 12.7 -2.54 180) (length 2.54) + (name "A1" (effects (font (size 1.27 1.27)))) + (number "10" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at 12.7 -5.08 180) (length 2.54) + (name "A2" (effects (font (size 1.27 1.27)))) + (number "11" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at 12.7 -7.62 180) (length 2.54) + (name "A3" (effects (font (size 1.27 1.27)))) + (number "12" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at 12.7 -10.16 180) (length 2.54) + (name "SDA/A4" (effects (font (size 1.27 1.27)))) + (number "13" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at 12.7 -12.7 180) (length 2.54) + (name "SCL/A5" (effects (font (size 1.27 1.27)))) + (number "14" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at -12.7 15.24 0) (length 2.54) + (name "D0/RX" (effects (font (size 1.27 1.27)))) + (number "15" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at -12.7 12.7 0) (length 2.54) + (name "D1/TX" (effects (font (size 1.27 1.27)))) + (number "16" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at -12.7 10.16 0) (length 2.54) + (name "D2" (effects (font (size 1.27 1.27)))) + (number "17" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at -12.7 7.62 0) (length 2.54) + (name "D3" (effects (font (size 1.27 1.27)))) + (number "18" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at -12.7 5.08 0) (length 2.54) + (name "D4" (effects (font (size 1.27 1.27)))) + (number "19" (effects (font (size 1.27 1.27)))) + ) + (pin output line (at 12.7 10.16 180) (length 2.54) + (name "IOREF" (effects (font (size 1.27 1.27)))) + (number "2" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at -12.7 2.54 0) (length 2.54) + (name "D5" (effects (font (size 1.27 1.27)))) + (number "20" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at -12.7 0 0) (length 2.54) + (name "D6" (effects (font (size 1.27 1.27)))) + (number "21" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at -12.7 -2.54 0) (length 2.54) + (name "D7" (effects (font (size 1.27 1.27)))) + (number "22" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at -12.7 -5.08 0) (length 2.54) + (name "D8" (effects (font (size 1.27 1.27)))) + (number "23" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at -12.7 -7.62 0) (length 2.54) + (name "D9" (effects (font (size 1.27 1.27)))) + (number "24" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at -12.7 -10.16 0) (length 2.54) + (name "D10" (effects (font (size 1.27 1.27)))) + (number "25" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at -12.7 -12.7 0) (length 2.54) + (name "D11" (effects (font (size 1.27 1.27)))) + (number "26" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at -12.7 -15.24 0) (length 2.54) + (name "D12" (effects (font (size 1.27 1.27)))) + (number "27" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at -12.7 -17.78 0) (length 2.54) + (name "D13" (effects (font (size 1.27 1.27)))) + (number "28" (effects (font (size 1.27 1.27)))) + ) + (pin power_in line (at -2.54 -27.94 90) (length 2.54) + (name "GND" (effects (font (size 1.27 1.27)))) + (number "29" (effects (font (size 1.27 1.27)))) + ) + (pin input line (at 12.7 15.24 180) (length 2.54) + (name "~{RESET}" (effects (font (size 1.27 1.27)))) + (number "3" (effects (font (size 1.27 1.27)))) + ) + (pin input line (at 12.7 5.08 180) (length 2.54) + (name "AREF" (effects (font (size 1.27 1.27)))) + (number "30" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at 12.7 -17.78 180) (length 2.54) + (name "SDA/A4" (effects (font (size 1.27 1.27)))) + (number "31" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at 12.7 -20.32 180) (length 2.54) + (name "SCL/A5" (effects (font (size 1.27 1.27)))) + (number "32" (effects (font (size 1.27 1.27)))) + ) + (pin power_out line (at 2.54 25.4 270) (length 2.54) + (name "3V3" (effects (font (size 1.27 1.27)))) + (number "4" (effects (font (size 1.27 1.27)))) + ) + (pin power_out line (at 5.08 25.4 270) (length 2.54) + (name "+5V" (effects (font (size 1.27 1.27)))) + (number "5" (effects (font (size 1.27 1.27)))) + ) + (pin power_in line (at 0 -27.94 90) (length 2.54) + (name "GND" (effects (font (size 1.27 1.27)))) + (number "6" (effects (font (size 1.27 1.27)))) + ) + (pin power_in line (at 2.54 -27.94 90) (length 2.54) + (name "GND" (effects (font (size 1.27 1.27)))) + (number "7" (effects (font (size 1.27 1.27)))) + ) + (pin power_in line (at -2.54 25.4 270) (length 2.54) + (name "VIN" (effects (font (size 1.27 1.27)))) + (number "8" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at 12.7 0 180) (length 2.54) + (name "A0" (effects (font (size 1.27 1.27)))) + (number "9" (effects (font (size 1.27 1.27)))) + ) + ) + ) + (symbol "power:+3V3" (power) (pin_names (offset 0)) (in_bom yes) (on_board yes) + (property "Reference" "#PWR" (at 0 -3.81 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "+3V3" (at 0 3.556 0) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_keywords" "global power" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_description" "Power symbol creates a global label with name \"+3V3\"" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (symbol "+3V3_0_1" + (polyline + (pts + (xy -0.762 1.27) + (xy 0 2.54) + ) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (polyline + (pts + (xy 0 0) + (xy 0 2.54) + ) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (polyline + (pts + (xy 0 2.54) + (xy 0.762 1.27) + ) + (stroke (width 0) (type default)) + (fill (type none)) + ) + ) + (symbol "+3V3_1_1" + (pin power_in line (at 0 0 90) (length 0) hide + (name "+3V3" (effects (font (size 1.27 1.27)))) + (number "1" (effects (font (size 1.27 1.27)))) + ) + ) + ) + (symbol "power:GND" (power) (pin_names (offset 0)) (in_bom yes) (on_board yes) + (property "Reference" "#PWR" (at 0 -6.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 0 -3.81 0) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_keywords" "global power" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_description" "Power symbol creates a global label with name \"GND\" , ground" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (symbol "GND_0_1" + (polyline + (pts + (xy 0 0) + (xy 0 -1.27) + (xy 1.27 -1.27) + (xy 0 -2.54) + (xy -1.27 -1.27) + (xy 0 -1.27) + ) + (stroke (width 0) (type default)) + (fill (type none)) + ) + ) + (symbol "GND_1_1" + (pin power_in line (at 0 0 270) (length 0) hide + (name "GND" (effects (font (size 1.27 1.27)))) + (number "1" (effects (font (size 1.27 1.27)))) + ) + ) + ) + ) + + (junction (at 179.07 34.29) (diameter 0) (color 0 0 0 0) + (uuid 228e5a9f-92d8-4cff-9ea7-59f8c339d8f3) + ) + (junction (at 179.07 90.17) (diameter 0) (color 0 0 0 0) + (uuid a5f41110-a536-4be6-ae0e-c4a2f155a9db) + ) + + (wire (pts (xy 224.79 88.9) (xy 207.01 88.9)) + (stroke (width 0) (type default)) + (uuid 04e5b9c5-a3dc-43a5-b9b4-b15a390303cb) + ) + (wire (pts (xy 181.61 35.56) (xy 181.61 34.29)) + (stroke (width 0) (type default)) + (uuid 062f5156-3e59-4f85-8a36-43006458b538) + ) + (wire (pts (xy 179.07 34.29) (xy 179.07 35.56)) + (stroke (width 0) (type default)) + (uuid 16852c0b-b29d-4c76-bfea-98c8abb64b0b) + ) + (wire (pts (xy 176.53 90.17) (xy 179.07 90.17)) + (stroke (width 0) (type default)) + (uuid 238341b4-8146-4591-bf0a-6aedd755ae8c) + ) + (wire (pts (xy 179.07 30.48) (xy 179.07 34.29)) + (stroke (width 0) (type default)) + (uuid 47994093-10f8-4fce-b04a-c747c0d56f49) + ) + (wire (pts (xy 73.66 35.56) (xy 76.2 35.56)) + (stroke (width 0) (type default)) + (uuid 4e8bc869-68c0-45cb-a3d8-8fb6bbd2d91e) + ) + (wire (pts (xy 181.61 34.29) (xy 179.07 34.29)) + (stroke (width 0) (type default)) + (uuid 55731ce4-e2de-4aeb-925b-1f268ee244ea) + ) + (wire (pts (xy 207.01 88.9) (xy 207.01 83.82)) + (stroke (width 0) (type default)) + (uuid 581180c2-b3fe-45ef-8bbb-5c4b2327f5dc) + ) + (wire (pts (xy 132.08 35.56) (xy 127 35.56)) + (stroke (width 0) (type default)) + (uuid 67ea3fbb-73f4-4a9a-af62-543ee14e3779) + ) + (wire (pts (xy 132.08 38.1) (xy 132.08 35.56)) + (stroke (width 0) (type default)) + (uuid 8126dde2-5e1c-400b-9def-7ecbf51b762e) + ) + (wire (pts (xy 224.79 91.44) (xy 207.01 91.44)) + (stroke (width 0) (type default)) + (uuid cc9f1e47-d427-4f3e-8b70-d3c4fa34f7d1) + ) + (wire (pts (xy 207.01 91.44) (xy 207.01 107.95)) + (stroke (width 0) (type default)) + (uuid cd7b9ab2-323f-4a1f-a7d8-afa162ce66c6) + ) + (wire (pts (xy 73.66 33.02) (xy 73.66 35.56)) + (stroke (width 0) (type default)) + (uuid e7a3bd67-1625-4605-9798-e35582f18a1d) + ) + (wire (pts (xy 176.53 88.9) (xy 176.53 90.17)) + (stroke (width 0) (type default)) + (uuid f7eadb3d-cfec-4688-9e89-5f64b07276e4) + ) + (wire (pts (xy 179.07 90.17) (xy 179.07 88.9)) + (stroke (width 0) (type default)) + (uuid f9ce06c8-6931-43d5-b45c-c529f524eca5) + ) + + (global_label "DISP_SS_N" (shape output) (at 127 58.42 0) (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify left)) + (uuid 00e3b0ac-e69d-4417-93f7-e16648c11b9f) + (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 139.9448 58.42 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + ) + (global_label "MOSI" (shape output) (at 163.83 73.66 180) (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify right)) + (uuid 11cf1799-6374-4a4e-98aa-609ee9514e9d) + (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 156.328 73.66 0) + (effects (font (size 1.27 1.27)) (justify right) hide) + ) + ) + (global_label "DISP_DC" (shape input) (at 224.79 101.6 180) (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify right)) + (uuid 1780be9b-bf0a-4879-8460-f17514a55d1f) + (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 214.0223 101.6 0) + (effects (font (size 1.27 1.27)) (justify right) hide) + ) + ) + (global_label "NFC_IRQ" (shape output) (at 189.23 60.96 0) (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify left)) + (uuid 286d8e2d-27f5-4c97-a7f2-91c19bc77b8a) + (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 199.9978 60.96 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + ) + (global_label "DISP_CS_N" (shape input) (at 224.79 99.06 180) (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify right)) + (uuid 301aadb8-fd5b-4f50-9c62-82e31794c971) + (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 211.7847 99.06 0) + (effects (font (size 1.27 1.27)) (justify right) hide) + ) + ) + (global_label "SCLK" (shape input) (at 224.79 96.52 180) (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify right)) + (uuid 36f1cdab-e16c-4179-8a38-159322649241) + (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 217.1066 96.52 0) + (effects (font (size 1.27 1.27)) (justify right) hide) + ) + ) + (global_label "MISO" (shape input) (at 163.83 76.2 180) (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify right)) + (uuid 4aa0e272-22f9-46a7-86ba-c15215db3bed) + (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 156.328 76.2 0) + (effects (font (size 1.27 1.27)) (justify right) hide) + ) + ) + (global_label "NFC_IRQ" (shape input) (at 76.2 53.34 180) (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify right)) + (uuid 4b154701-9a37-41c8-868d-af97488416cf) + (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 65.4322 53.34 0) + (effects (font (size 1.27 1.27)) (justify right) hide) + ) + ) + (global_label "NFC_SS_N" (shape input) (at 163.83 71.12 180) (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify right)) + (uuid 54e6af70-5827-4c78-b9eb-2bf870f53d70) + (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 151.5504 71.12 0) + (effects (font (size 1.27 1.27)) (justify right) hide) + ) + ) + (global_label "DISP_BUSY_N" (shape input) (at 127 50.8 0) (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify left)) + (uuid 5b9b9065-cd09-44f9-84c4-4d74ac0b1db2) + (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 142.4244 50.8 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + ) + (global_label "MISO" (shape input) (at 76.2 50.8 180) (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify right)) + (uuid 5e11085e-f959-489e-ad07-4410103e8fff) + (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 68.698 50.8 0) + (effects (font (size 1.27 1.27)) (justify right) hide) + ) + ) + (global_label "NFC_SS_N" (shape output) (at 76.2 43.18 180) (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify right)) + (uuid 61cdb52f-7f78-4dd9-ba82-b9ca7ba23802) + (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 63.9204 43.18 0) + (effects (font (size 1.27 1.27)) (justify right) hide) + ) + ) + (global_label "DISP_RST" (shape input) (at 224.79 104.14 180) (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify right)) + (uuid 62337c76-52a4-4fb3-b457-69d1bf0e5587) + (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 213.1152 104.14 0) + (effects (font (size 1.27 1.27)) (justify right) hide) + ) + ) + (global_label "DISP_BUSY_N" (shape output) (at 224.79 106.68 180) (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify right)) + (uuid 67ed00f4-e42d-4b14-a270-0da183782296) + (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 209.3656 106.68 0) + (effects (font (size 1.27 1.27)) (justify right) hide) + ) + ) + (global_label "DISP_RST" (shape output) (at 127 53.34 0) (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify left)) + (uuid 6b84c861-b502-464a-a764-c7e48d1daac3) + (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 138.6748 53.34 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + ) + (global_label "SLCK" (shape input) (at 163.83 78.74 180) (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify right)) + (uuid 845646b9-db56-4f46-95de-39548acd85b1) + (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 156.1466 78.74 0) + (effects (font (size 1.27 1.27)) (justify right) hide) + ) + ) + (global_label "DISP_DC" (shape output) (at 127 55.88 0) (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify left)) + (uuid 86dabfff-41df-407b-b14b-c9e3323b4499) + (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 137.7677 55.88 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + ) + (global_label "MOSI" (shape input) (at 224.79 93.98 180) (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify right)) + (uuid 9d70b25f-8fed-42c1-aca0-11ddaa9177c0) + (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 217.288 93.98 0) + (effects (font (size 1.27 1.27)) (justify right) hide) + ) + ) + (global_label "SCLK" (shape output) (at 76.2 45.72 180) (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify right)) + (uuid b98fcb1d-2d3b-49f6-8566-af5d5bedf89c) + (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 68.5166 45.72 0) + (effects (font (size 1.27 1.27)) (justify right) hide) + ) + ) + (global_label "MOSI" (shape output) (at 76.2 48.26 180) (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify right)) + (uuid df79837d-c7d6-453a-8015-dd98203b0900) + (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 68.698 48.26 0) + (effects (font (size 1.27 1.27)) (justify right) hide) + ) + ) + + (symbol (lib_id "power:+3V3") (at 179.07 30.48 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced) + (uuid 182ec4ea-91f0-432f-a943-977fa56abc6e) + (property "Reference" "#PWR0105" (at 179.07 34.29 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "+3V3" (at 179.07 26.67 0) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 179.07 30.48 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 179.07 30.48 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid ed6a50dd-814d-4bfa-8dd2-34739d977ed4)) + (instances + (project "FabReader1.5" + (path "/b8993a80-a27f-4add-baf4-93b99ccacbe5" + (reference "#PWR0105") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Connector:Conn_01x08_Pin") (at 229.87 99.06 180) (unit 1) + (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced) + (uuid 1b08339d-3a72-4809-8c9c-8377740dc375) + (property "Reference" "J101" (at 231.14 97.155 0) + (effects (font (size 1.27 1.27)) (justify right)) + ) + (property "Value" "Conn_01x08_Pin" (at 231.14 99.695 0) + (effects (font (size 1.27 1.27)) (justify right)) + ) + (property "Footprint" "Connector_PinHeader_2.54mm:PinHeader_1x08_P2.54mm_Vertical" (at 229.87 99.06 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 229.87 99.06 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 2457d953-f7f5-41f7-b864-a15cca2b6741)) + (pin "2" (uuid c6abbe20-87fa-428c-8966-9dc5f88f8657)) + (pin "3" (uuid 8c1079c8-c8d4-4443-8595-fde2beffd450)) + (pin "4" (uuid a289a986-5e5b-41dd-b164-7f92b2db9b46)) + (pin "5" (uuid 40a860fe-285d-4692-a0a8-54909961001e)) + (pin "6" (uuid 2939ea20-c3c1-4ca9-872e-8a2fca158a46)) + (pin "7" (uuid d3782d10-96fd-4e0d-84ed-dea8171b17fd)) + (pin "8" (uuid b2beefef-82a5-4087-8ece-9efa8d8d398f)) + (instances + (project "FabReader1.5" + (path "/b8993a80-a27f-4add-baf4-93b99ccacbe5" + (reference "J101") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 132.08 38.1 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced) + (uuid 3fdb7502-da4d-4fd7-b959-e1f28bb54b8e) + (property "Reference" "#PWR0102" (at 132.08 44.45 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 132.08 43.18 0) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 132.08 38.1 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 132.08 38.1 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid c78ff666-c35c-4551-b63e-0e398bdb2f48)) + (instances + (project "FabReader1.5" + (path "/b8993a80-a27f-4add-baf4-93b99ccacbe5" + (reference "#PWR0102") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 207.01 107.95 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced) + (uuid 6babad96-e44b-4dd1-9c7d-6c20e3e0147e) + (property "Reference" "#PWR0103" (at 207.01 114.3 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 207.01 113.03 0) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 207.01 107.95 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 207.01 107.95 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 5b006080-5724-42a5-9c09-fb6282c2415d)) + (instances + (project "FabReader1.5" + (path "/b8993a80-a27f-4add-baf4-93b99ccacbe5" + (reference "#PWR0103") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 179.07 90.17 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced) + (uuid 713f6ec2-ef63-4d87-9058-b278f01a5cb1) + (property "Reference" "#PWR0106" (at 179.07 96.52 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 179.07 95.25 0) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 179.07 90.17 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 179.07 90.17 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid ee31179c-b15d-43f9-8feb-1ba680316a36)) + (instances + (project "FabReader1.5" + (path "/b8993a80-a27f-4add-baf4-93b99ccacbe5" + (reference "#PWR0106") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:+3V3") (at 207.01 83.82 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced) + (uuid 8f268eb6-ca75-4ee9-9437-1441fe955986) + (property "Reference" "#PWR0104" (at 207.01 87.63 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "+3V3" (at 207.01 80.01 0) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 207.01 83.82 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 207.01 83.82 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid a86272d1-14b1-49dc-808a-5455540644b6)) + (instances + (project "FabReader1.5" + (path "/b8993a80-a27f-4add-baf4-93b99ccacbe5" + (reference "#PWR0104") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Espressif:ESP32-S3-DevKitC") (at 101.6 60.96 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced) + (uuid 909ab781-801f-471f-885c-d4cd8f32f686) + (property "Reference" "U101" (at 101.6 29.21 0) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "ESP32-S3-DevKitC" (at 101.6 31.75 0) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Espressif:ESP32-S3-DevKitC" (at 101.6 93.98 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 41.91 63.5 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "14" (uuid 2d514765-b60c-43c7-ac09-0fa41c38821c)) + (pin "19" (uuid 0f68e3d8-9f3f-44e6-9137-e995bb08c7bf)) + (pin "2" (uuid 034476d4-e3b1-45ab-8f74-3e6c58741a15)) + (pin "39" (uuid 712ccec1-6da4-4365-9106-28e00056ba05)) + (pin "40" (uuid 4cff1aee-237a-4fd3-83d8-04225f247d6a)) + (pin "41" (uuid 6b78b339-23ab-4b87-9e35-0767395cd795)) + (pin "42" (uuid 5ac3ac9a-ff57-44f2-81ca-a9dad9449926)) + (pin "43" (uuid ba3eb098-32cb-4cbc-ae83-93635f09d12a)) + (pin "44" (uuid 94e74445-8b5d-49e3-a590-1e1458dec726)) + (pin "1" (uuid 896fafa7-bd13-4266-9542-129f7ea4cdf6)) + (pin "10" (uuid 80df311c-4fe5-4f6a-863e-79912b70f51c)) + (pin "11" (uuid 6b9010e9-58ef-40d1-920b-de533339e3df)) + (pin "12" (uuid d5791969-761f-493d-b56f-2740190bdfdf)) + (pin "13" (uuid dbff5c08-87d7-47a0-b070-6df9e637edc0)) + (pin "15" (uuid 92e1c8da-15c3-4c3c-88ed-7c52aa5faaf2)) + (pin "16" (uuid 8aa35a04-067c-4a03-89ed-502d499d8d1f)) + (pin "17" (uuid 569adf87-9d3a-4f4b-987e-dcfd64e6351c)) + (pin "18" (uuid 60f0204d-6a1c-4f26-b600-8d7747593d52)) + (pin "20" (uuid c6d0dc83-fb27-4e9c-b131-3ab46fc2c877)) + (pin "21" (uuid 7779e897-868f-45b1-9fff-8a066539189a)) + (pin "22" (uuid da0cc7e5-b422-4a83-b48b-bcac4f239e4f)) + (pin "23" (uuid 45aa408d-8788-4534-94cd-fa49fed8eeea)) + (pin "24" (uuid 5aec4699-0931-46d1-ba63-bf9d2090f5c9)) + (pin "25" (uuid 5e722e9b-876d-4fc8-b27c-fe7bed500d61)) + (pin "26" (uuid 284fdf8c-f7c2-461d-aa87-948e4a1690e6)) + (pin "27" (uuid 72248d40-bcd2-4f55-9df2-a25d374af090)) + (pin "28" (uuid f71b0ad8-7aec-4112-b7eb-2892a4739944)) + (pin "29" (uuid 469f072f-ad9e-4583-a195-bbbca22c5775)) + (pin "3" (uuid d35a3f92-149f-4412-9870-ed82a728df58)) + (pin "30" (uuid 0611c7f8-fe57-491e-904a-63b1cde2d8de)) + (pin "31" (uuid e966769b-3834-4408-8798-ae07db9fdd3b)) + (pin "32" (uuid b11c8c53-eb01-4016-b60f-16519b31ca3b)) + (pin "33" (uuid bb88b776-b17b-41d1-bb96-11d1548d0d72)) + (pin "34" (uuid 03d81aaa-7296-4967-8e98-54bfa96354ef)) + (pin "35" (uuid af2fa779-c3da-40b6-b615-253cc4c4bdee)) + (pin "36" (uuid 47fcc848-914e-4b34-ac6b-0237748b4902)) + (pin "37" (uuid 6cae599f-28b9-4da4-afa7-a8c9ef13150b)) + (pin "38" (uuid d60ffe42-57bd-44bf-a5dc-f3a0d55c1f60)) + (pin "4" (uuid a033c022-4d84-4de6-aeea-cb8da0b38342)) + (pin "5" (uuid e3ccba2f-cfef-4982-8e81-161ea544a5d5)) + (pin "6" (uuid 0dee7d3c-eaab-4d41-9261-ad4161174935)) + (pin "7" (uuid c67510ca-4c2c-46ee-9702-8f17654999e5)) + (pin "8" (uuid 839bdf0c-8a88-4c78-aed9-8f3d40880879)) + (pin "9" (uuid 127704f0-7a9c-487d-bb0b-e8f904fc0e86)) + (instances + (project "FabReader1.5" + (path "/b8993a80-a27f-4add-baf4-93b99ccacbe5" + (reference "U101") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:+3V3") (at 73.66 33.02 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced) + (uuid bd13cc16-2a19-4b7f-af6c-30e6dc4c3339) + (property "Reference" "#PWR0101" (at 73.66 36.83 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "+3V3" (at 73.66 29.21 0) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 73.66 33.02 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 73.66 33.02 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 63ac832e-03b4-4f91-9d8d-40b418dd6a00)) + (instances + (project "FabReader1.5" + (path "/b8993a80-a27f-4add-baf4-93b99ccacbe5" + (reference "#PWR0101") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "MCU_Module:Arduino_UNO_R3") (at 176.53 60.96 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced) + (uuid e0d1991e-11e0-4525-84ea-6941cfa604df) + (property "Reference" "A101" (at 183.5659 34.29 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "Arduino_UNO_R3" (at 183.5659 36.83 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "Module:Arduino_UNO_R3" (at 176.53 60.96 0) + (effects (font (size 1.27 1.27) italic) hide) + ) + (property "Datasheet" "https://www.arduino.cc/en/Main/arduinoBoardUno" (at 176.53 60.96 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 36048129-a41a-41ce-89c6-d55d3fd06b63)) + (pin "10" (uuid 89a34149-fd97-41da-8558-b613d35825a0)) + (pin "11" (uuid 1a7ae53d-7c7d-4809-9ee3-7550f8216aba)) + (pin "12" (uuid 5dc0f8ca-dbf8-4ad9-9d51-f4c93633c0c2)) + (pin "13" (uuid 476d85cc-4696-4b08-9007-96c9765ea9ad)) + (pin "14" (uuid ed348268-71d2-44ff-ba8b-3febd7b239d6)) + (pin "15" (uuid 420886d1-69b5-46d6-920c-ff217033b823)) + (pin "16" (uuid 51f77e20-efce-4597-9883-94eda63e683f)) + (pin "17" (uuid a43fd775-9045-452a-84ad-4040653ee8f1)) + (pin "18" (uuid 10a02a9b-e7c6-4a0c-90b6-0ceb1f1aa5dc)) + (pin "19" (uuid 39c2197b-1c91-4795-875d-1e2b8510adde)) + (pin "2" (uuid 2513ec9c-f6d2-44d0-ba4e-6e5c71d0562c)) + (pin "20" (uuid 016680dc-bfd9-4b7f-a0a0-7789d223d3b6)) + (pin "21" (uuid b9bc24b8-3478-4289-9250-fb6f84c88ab3)) + (pin "22" (uuid 4c0ead2d-b61c-4e8c-813a-d295d4b53457)) + (pin "23" (uuid f00776a6-253b-463f-9918-c3bbdb51f004)) + (pin "24" (uuid 179c0505-7fb1-4438-b218-55fad3854a06)) + (pin "25" (uuid aeefc2fb-9e0b-4f0a-a071-f84ba26c6280)) + (pin "26" (uuid 5df5fa54-c50b-4b10-96b0-452aa9b55942)) + (pin "27" (uuid f2f9e19c-3204-44fb-94e2-6657a489dcca)) + (pin "28" (uuid d05d9ccc-a79f-477b-ae27-89eaeff02e6f)) + (pin "29" (uuid 89153ab2-d1dd-40ab-98f8-9379186a0efc)) + (pin "3" (uuid 0e62b375-ed26-4088-8810-c024bc1059ab)) + (pin "30" (uuid 36ce6f0e-bff0-4b30-b66a-0ce1d23fb0d3)) + (pin "31" (uuid 0e95d013-5034-4d18-adfc-b7218cd67a5d)) + (pin "32" (uuid 258aace1-4aed-400f-9430-faaac8d2bfb9)) + (pin "4" (uuid fea58618-f8c6-4858-864c-760fa42285ce)) + (pin "5" (uuid 6401adc3-725f-4d58-a216-01d29a94ddc0)) + (pin "6" (uuid c19f8363-2334-494b-8d02-ce07227c6f98)) + (pin "7" (uuid a4d7aaf9-a57d-4f63-97bb-7a17ed224eef)) + (pin "8" (uuid 54682331-9613-4128-83ab-b2b6b54e02b4)) + (pin "9" (uuid c8f28fb1-828c-41d3-97c0-82cf199b3ef0)) + (instances + (project "FabReader1.5" + (path "/b8993a80-a27f-4add-baf4-93b99ccacbe5" + (reference "A101") (unit 1) + ) + ) + ) + ) + + (sheet_instances + (path "/" (page "1")) + ) +) diff --git a/Hardware/FabReader1.5/Library/espressif b/Hardware/FabReader1.5/Library/espressif new file mode 160000 index 0000000..a8a536c --- /dev/null +++ b/Hardware/FabReader1.5/Library/espressif @@ -0,0 +1 @@ +Subproject commit a8a536c45a1680eb1021adc9496e52a1cd2595b4 diff --git a/Hardware/FabReader1.5/fp-lib-table b/Hardware/FabReader1.5/fp-lib-table new file mode 100644 index 0000000..d9851a9 --- /dev/null +++ b/Hardware/FabReader1.5/fp-lib-table @@ -0,0 +1,4 @@ +(fp_lib_table + (version 7) + (lib (name "Espressif")(type "KiCad")(uri "${KIPRJMOD}/Library/espressif/footprints/Espressif.pretty")(options "")(descr "")) +) diff --git a/Hardware/FabReader1.5/kicad-libraries b/Hardware/FabReader1.5/kicad-libraries new file mode 160000 index 0000000..a8a536c --- /dev/null +++ b/Hardware/FabReader1.5/kicad-libraries @@ -0,0 +1 @@ +Subproject commit a8a536c45a1680eb1021adc9496e52a1cd2595b4 diff --git a/Hardware/FabReader1.5/sym-lib-table b/Hardware/FabReader1.5/sym-lib-table new file mode 100644 index 0000000..b654de9 --- /dev/null +++ b/Hardware/FabReader1.5/sym-lib-table @@ -0,0 +1,4 @@ +(sym_lib_table + (version 7) + (lib (name "Espressif")(type "KiCad")(uri "${KIPRJMOD}/Library/espressif/libraries/Espressif.kicad_sym")(options "")(descr "")) +) diff --git a/Hardware/FabReader2/FabReader2.kicad_prl b/Hardware/FabReader2/FabReader2.kicad_prl index e9c83e3..72d437e 100644 --- a/Hardware/FabReader2/FabReader2.kicad_prl +++ b/Hardware/FabReader2/FabReader2.kicad_prl @@ -3,10 +3,12 @@ "active_layer": 36, "active_layer_preset": "", "auto_track_width": true, + "hidden_netclasses": [], "hidden_nets": [], "high_contrast_mode": 0, "net_color_mode": 1, "opacity": { + "images": 0.6, "pads": 1.0, "tracks": 1.0, "vias": 1.0, diff --git a/Hardware/FabReader2/FabReader2.kicad_pro b/Hardware/FabReader2/FabReader2.kicad_pro index 5abc975..3b923eb 100644 --- a/Hardware/FabReader2/FabReader2.kicad_pro +++ b/Hardware/FabReader2/FabReader2.kicad_pro @@ -1,5 +1,6 @@ { "board": { + "3dviewports": [], "design_settings": { "defaults": { "board_outline_line_width": 0.09999999999999999, @@ -206,7 +207,8 @@ "zones_allow_external_fillets": false, "zones_use_no_outline": true }, - "layer_presets": [] + "layer_presets": [], + "viewports": [] }, "boards": [], "cvpcb": { @@ -390,18 +392,23 @@ "rule_severities": { "bus_definition_conflict": "error", "bus_entry_needed": "error", - "bus_label_syntax": "error", "bus_to_bus_conflict": "error", "bus_to_net_conflict": "error", + "conflicting_netclasses": "error", "different_unit_footprint": "error", "different_unit_net": "error", "duplicate_reference": "error", "duplicate_sheet_names": "error", + "endpoint_off_grid": "warning", "extra_units": "error", "global_label_dangling": "warning", "hier_label_mismatch": "error", "label_dangling": "error", "lib_symbol_issues": "warning", + "missing_bidi_pin": "warning", + "missing_input_pin": "warning", + "missing_power_pin": "error", + "missing_unit": "warning", "multiple_net_names": "warning", "net_not_bus_member": "warning", "no_connect_connected": "warning", @@ -411,6 +418,7 @@ "pin_to_pin": "warning", "power_pin_not_driven": "error", "similar_labels": "warning", + "simulation_model_issue": "error", "unannotated": "error", "unit_value_mismatch": "error", "unresolved_variable": "error", @@ -428,7 +436,7 @@ "net_settings": { "classes": [ { - "bus_width": 12.0, + "bus_width": 12, "clearance": 0.2, "diff_pair_gap": 0.25, "diff_pair_via_gap": 0.25, @@ -442,10 +450,10 @@ "track_width": 0.25, "via_diameter": 0.4, "via_drill": 0.2, - "wire_width": 6.0 + "wire_width": 6 }, { - "bus_width": 12.0, + "bus_width": 12, "clearance": 0.2, "diff_pair_gap": 0.25, "diff_pair_via_gap": 0.25, @@ -454,19 +462,20 @@ "microvia_diameter": 0.3, "microvia_drill": 0.1, "name": "Matching Network", - "nets": [], "pcb_color": "rgba(0, 0, 0, 0.000)", "schematic_color": "rgba(0, 0, 0, 0.000)", "track_width": 0.6, "via_diameter": 0.4, "via_drill": 0.2, - "wire_width": 6.0 + "wire_width": 6 } ], "meta": { - "version": 2 + "version": 3 }, - "net_colors": null + "net_colors": null, + "netclass_assignments": null, + "netclass_patterns": [] }, "pcbnew": { "last_paths": { @@ -482,6 +491,8 @@ "schematic": { "annotate_start_num": 0, "drawing": { + "dashed_lines_dash_length_ratio": 12.0, + "dashed_lines_gap_length_ratio": 3.0, "default_line_thickness": 6.0, "default_text_size": 50.0, "field_names": [], @@ -513,7 +524,11 @@ "page_layout_descr_file": "", "plot_directory": "", "spice_adjust_passive_values": false, + "spice_current_sheet_as_root": false, "spice_external_command": "spice \"%I\"", + "spice_model_current_sheet_as_root": true, + "spice_save_all_currents": false, + "spice_save_all_voltages": false, "subpart_first_id": 65, "subpart_id_separator": 0 }, diff --git a/Software/fab-reader2-c/.gitignore b/Software/fab-reader2-c/.gitignore deleted file mode 100644 index ae9a17b..0000000 --- a/Software/fab-reader2-c/.gitignore +++ /dev/null @@ -1,102 +0,0 @@ -.config -*.o -*.pyc - -# gtags -GTAGS -GRTAGS -GPATH - -# emacs -.dir-locals.el - -# emacs temp file suffixes -*~ -.#* -\#*# - -# eclipse setting -.settings - -# MacOS directory files -.DS_Store - -# cache dir -.cache/ - -# Components Unit Test Apps files -components/**/build/ -components/**/build_*_*/ -components/**/sdkconfig -components/**/sdkconfig.old - -# Example project files -examples/**/build/ -examples/**/build_esp*_*/ -examples/**/sdkconfig -examples/**/sdkconfig.old - -# Doc build artifacts -docs/_build/ -docs/doxygen_sqlite3.db - -# Downloaded font files -docs/_static/DejaVuSans.ttf -docs/_static/NotoSansSC-Regular.otf - -# Unit test app files -tools/unit-test-app/sdkconfig -tools/unit-test-app/sdkconfig.old -tools/unit-test-app/build -tools/unit-test-app/build_*_*/ -tools/unit-test-app/output -tools/unit-test-app/test_configs - -# Unit Test CMake compile log folder -log_ut_cmake - -# test application build files -tools/test_apps/**/build/ -tools/test_apps/**/build_*_*/ -tools/test_apps/**/sdkconfig -tools/test_apps/**/sdkconfig.old - -# IDF monitor test -tools/test_idf_monitor/outputs - -TEST_LOGS - -# gcov coverage reports -*.gcda -*.gcno -coverage.info -coverage_report/ - -test_multi_heap_host - -# VS Code Settings -.vscode/ - -# VIM files -*.swp -*.swo - -# Clion IDE CMake build & config -.idea/ -cmake-build-*/ - -# Results for the checking of the Python coding style and static analysis -.mypy_cache -flake8_output.txt - -# ESP-IDF default build directory name -build - -# lock files for examples and components -dependencies.lock - -# managed_components for examples -managed_components - -# pytest log -pytest_embedded_log/ diff --git a/Software/fab-reader2-c/main/CMakeLists.txt b/Software/fab-reader2-c/main/CMakeLists.txt deleted file mode 100644 index 7e585fa..0000000 --- a/Software/fab-reader2-c/main/CMakeLists.txt +++ /dev/null @@ -1,3 +0,0 @@ -idf_component_register(SRCS "fab-reader2.c" "pollingtagdetect.c" - INCLUDE_DIRS "." - REQUIRES "rfal") diff --git a/Software/fab-reader2-c/main/fab-reader2.c b/Software/fab-reader2-c/main/fab-reader2.c deleted file mode 100644 index 2d0c591..0000000 --- a/Software/fab-reader2-c/main/fab-reader2.c +++ /dev/null @@ -1,102 +0,0 @@ -#include -#include -#include - -#include "platform.h" -#include "st25R3911_interrupt.h" - -#include "pollingtagdetect.h" - -#define SPI_CLK 5 -#define SPI_MOSI 6 -#define SPI_MISO 7 - -#define ESP_INTR_FLAG_DEFAULT 0 - -portMUX_TYPE CommProtectLock = portMUX_INITIALIZER_UNLOCKED; - -static void gpio_isr_handler(void *arg) { - st25r3911Isr(); -} - -esp_err_t init_gpio(void) { - gpio_config_t io_conf = {}; - //disable interrupt - io_conf.intr_type = GPIO_INTR_DISABLE; - //set as output mode - io_conf.mode = GPIO_MODE_INPUT_OUTPUT; - //bit mask of the pins that you want to set,e.g.GPIO18/19 - io_conf.pin_bit_mask = (1ULL << ST25R391X_SS_PIN); - //disable pull-down mode - io_conf.pull_down_en = 0; - //disable pull-up mode - io_conf.pull_up_en = 0; - //configure GPIO with the given settings - esp_err_t ret = gpio_config(&io_conf); - ESP_ERROR_CHECK(ret); - - - //interrupt of rising edge - io_conf.intr_type = GPIO_INTR_POSEDGE; - //bit mask of the pins, use GPIO4/5 here - io_conf.pin_bit_mask = (1ULL << ST25R391X_INT_PIN); - //set as input mode - io_conf.mode = GPIO_MODE_INPUT; - //enable pull-up mode -// io_conf.pull_up_en = 1; - ret = gpio_config(&io_conf); - ESP_ERROR_CHECK(ret); - - - ret = gpio_install_isr_service(ESP_INTR_FLAG_DEFAULT); - ESP_ERROR_CHECK(ret); - //hook isr handler for specific gpio pin - ret = gpio_isr_handler_add(ST25R391X_INT_PIN, gpio_isr_handler, NULL); - ESP_ERROR_CHECK(ret); - - return ret; -} - -esp_err_t init_spi(void) { - spi_bus_config_t buscfg = { - .miso_io_num=SPI_MISO, - .mosi_io_num=SPI_MOSI, - .sclk_io_num=SPI_CLK, - .quadwp_io_num=-1, - .quadhd_io_num=-1, - }; - esp_err_t ret = spi_bus_initialize(SPI2_HOST, &buscfg, SPI_DMA_CH_AUTO); - ESP_ERROR_CHECK(ret); - - spi_device_interface_config_t devcfg = { - .clock_speed_hz=SPI_MASTER_FREQ_8M, //Clock out at 4 MHz - .mode=1, //SPI mode 1 - .spics_io_num=-1, //CS pin - .queue_size=1, //We want to be able to queue 7 transactions at a time - }; - - spi_device_handle_t spi; - ret = spi_bus_add_device(SPI2_HOST, &devcfg, &spi); - ESP_ERROR_CHECK(ret); - st25r3911_spi_init(spi); - - return ret; -} - -_Noreturn static void cycle_task(void *arg) { - while (1) { - TagDetectCycle(); -// ESP_LOGI("cycle_task", "running tag detect cycle_task"); - } -} - -void app_main(void) { - ESP_ERROR_CHECK(init_gpio()); - ESP_LOGI("main", "init_gpio done"); - ESP_ERROR_CHECK(init_spi()); - ESP_LOGI("main", "init_spi done"); - ESP_ERROR_CHECK(TagDetectInit()); - ESP_LOGI("main", "TagDetectInit done"); - xTaskCreate(cycle_task, "cycle_task", 4096, NULL, tskIDLE_PRIORITY, NULL); - ESP_LOGI("main", "cycle_task sheduled"); -} diff --git a/Software/fab-reader2-c/main/pollingtagdetect.h b/Software/fab-reader2-c/main/pollingtagdetect.h deleted file mode 100644 index 84cbe35..0000000 --- a/Software/fab-reader2-c/main/pollingtagdetect.h +++ /dev/null @@ -1,21 +0,0 @@ -// -// Created by Kai Jan Kriegel on 17.10.22. -// - -#ifndef FAB_READER2_C_POLLINGTAGDETECT_H -#define FAB_READER2_C_POLLINGTAGDETECT_H - -#include "esp_err.h" - -#ifdef __cplusplus -extern "C" { -#endif - -esp_err_t TagDetectInit(void); -void TagDetectCycle(void); - -#ifdef __cplusplus -} -#endif - -#endif //FAB_READER2_C_POLLINGTAGDETECT_H diff --git a/Software/fab-reader2/.cargo/config.toml b/Software/fab-reader2/.cargo/config.toml deleted file mode 100644 index a7859d5..0000000 --- a/Software/fab-reader2/.cargo/config.toml +++ /dev/null @@ -1,34 +0,0 @@ -[build] -# Uncomment the relevant target for your chip here (ESP32, ESP32-S2, ESP32-S3 or ESP32-C3) -#target = "xtensa-esp32-espidf" -target = "xtensa-esp32s2-espidf" -#target = "xtensa-esp32s3-espidf" -#target = "riscv32imc-esp-espidf" - -[target.xtensa-esp32-espidf] -linker = "ldproxy" - -[target.xtensa-esp32s2-espidf] -linker = "ldproxy" - -[target.xtensa-esp32s3-espidf] -linker = "ldproxy" - -[target.riscv32imc-esp-espidf] -linker = "ldproxy" - -# Future - necessary for the experimental "native build" of esp-idf-sys with ESP32C3 -# See also https://github.com/ivmarkov/embuild/issues/16 -rustflags = ["-C", "default-linker-libraries"] - -[unstable] - -build-std = ["std", "panic_abort"] -#build-std-features = ["panic_immediate_abort"] # Required for older ESP-IDF versions without a realpath implementation - -[env] -# Note: these variables are not used when using pio builder -# Enables the esp-idf-sys "native" build feature (`cargo build --features native`) to build against ESP-IDF stable (v4.4) -ESP_IDF_VERSION = { value = "branch:release/v4.4" } -# Enables the esp-idf-sys "native" build feature (`cargo build --features native`) to build against ESP-IDF master (mainline) -#ESP_IDF_VERSION = { value = "master" } diff --git a/Software/fab-reader2/.gitignore b/Software/fab-reader2/.gitignore index 2312b39..ae9a17b 100644 --- a/Software/fab-reader2/.gitignore +++ b/Software/fab-reader2/.gitignore @@ -1,136 +1,102 @@ -# Created by https://www.toptal.com/developers/gitignore/api/rust, -# Edit at https://www.toptal.com/developers/gitignore?templates=rust, +.config +*.o +*.pyc -.embuild +# gtags +GTAGS +GRTAGS +GPATH -### Rust ### -# Generated by Cargo -# will have compiled files and executables -debug/ -target/ +# emacs +.dir-locals.el -# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries -# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html -Cargo.lock +# emacs temp file suffixes +*~ +.#* +\#*# -# These are backup files generated by rustfmt -**/*.rs.bk +# eclipse setting +.settings -# MSVC Windows builds of rustc generate these, which store debugging information -*.pdb +# MacOS directory files +.DS_Store -### CLion ### -# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider -# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 +# cache dir +.cache/ -# User-specific stuff -.idea/**/workspace.xml -.idea/**/tasks.xml -.idea/**/usage.statistics.xml -.idea/**/dictionaries -.idea/**/shelf +# Components Unit Test Apps files +components/**/build/ +components/**/build_*_*/ +components/**/sdkconfig +components/**/sdkconfig.old -# AWS User-specific -.idea/**/aws.xml +# Example project files +examples/**/build/ +examples/**/build_esp*_*/ +examples/**/sdkconfig +examples/**/sdkconfig.old -# Generated files -.idea/**/contentModel.xml +# Doc build artifacts +docs/_build/ +docs/doxygen_sqlite3.db -# Sensitive or high-churn files -.idea/**/dataSources/ -.idea/**/dataSources.ids -.idea/**/dataSources.local.xml -.idea/**/sqlDataSources.xml -.idea/**/dynamic.xml -.idea/**/uiDesigner.xml -.idea/**/dbnavigator.xml +# Downloaded font files +docs/_static/DejaVuSans.ttf +docs/_static/NotoSansSC-Regular.otf -# Gradle -.idea/**/gradle.xml -.idea/**/libraries +# Unit test app files +tools/unit-test-app/sdkconfig +tools/unit-test-app/sdkconfig.old +tools/unit-test-app/build +tools/unit-test-app/build_*_*/ +tools/unit-test-app/output +tools/unit-test-app/test_configs -# Gradle and Maven with auto-import -# When using Gradle or Maven with auto-import, you should exclude module files, -# since they will be recreated, and may cause churn. Uncomment if using -# auto-import. -# .idea/artifacts -# .idea/compiler.xml -# .idea/jarRepositories.xml -# .idea/modules.xml -# .idea/*.iml -# .idea/modules -# *.iml -# *.ipr +# Unit Test CMake compile log folder +log_ut_cmake -# CMake +# test application build files +tools/test_apps/**/build/ +tools/test_apps/**/build_*_*/ +tools/test_apps/**/sdkconfig +tools/test_apps/**/sdkconfig.old + +# IDF monitor test +tools/test_idf_monitor/outputs + +TEST_LOGS + +# gcov coverage reports +*.gcda +*.gcno +coverage.info +coverage_report/ + +test_multi_heap_host + +# VS Code Settings +.vscode/ + +# VIM files +*.swp +*.swo + +# Clion IDE CMake build & config +.idea/ cmake-build-*/ -# Mongo Explorer plugin -.idea/**/mongoSettings.xml +# Results for the checking of the Python coding style and static analysis +.mypy_cache +flake8_output.txt -# File-based project format -*.iws +# ESP-IDF default build directory name +build -# IntelliJ -out/ +# lock files for examples and components +dependencies.lock -# mpeltonen/sbt-idea plugin -.idea_modules/ - -# JIRA plugin -atlassian-ide-plugin.xml - -# Cursive Clojure plugin -.idea/replstate.xml - -# SonarLint plugin -.idea/sonarlint/ - -# Crashlytics plugin (for Android Studio and IntelliJ) -com_crashlytics_export_strings.xml -crashlytics.properties -crashlytics-build.properties -fabric.properties - -# Editor-based Rest Client -.idea/httpRequests - -# Android studio 3.1+ serialized cache file -.idea/caches/build_file_checksums.ser - -### CLion Patch ### -# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721 - -# *.iml -# modules.xml -# .idea/misc.xml -# *.ipr - -# Sonarlint plugin -# https://plugins.jetbrains.com/plugin/7973-sonarlint -.idea/**/sonarlint/ - -# SonarQube Plugin -# https://plugins.jetbrains.com/plugin/7238-sonarqube-community-plugin -.idea/**/sonarIssues.xml - -# Markdown Navigator plugin -# https://plugins.jetbrains.com/plugin/7896-markdown-navigator-enhanced -.idea/**/markdown-navigator.xml -.idea/**/markdown-navigator-enh.xml -.idea/**/markdown-navigator/ - -# Cache file creation bug -# See https://youtrack.jetbrains.com/issue/JBR-2257 -.idea/$CACHE_FILE$ - -# CodeStream plugin -# https://plugins.jetbrains.com/plugin/12206-codestream -.idea/codestream.xml - -# Azure Toolkit for IntelliJ plugin -# https://plugins.jetbrains.com/plugin/8053-azure-toolkit-for-intellij -.idea/**/azureSettings.xml - -# End of https://www.toptal.com/developers/gitignore/api/clion +# managed_components for examples +managed_components +# pytest log +pytest_embedded_log/ diff --git a/Software/fab-reader2/.idea/fab-reader2.iml b/Software/fab-reader2/.idea/fab-reader2.iml deleted file mode 100644 index 2ffb146..0000000 --- a/Software/fab-reader2/.idea/fab-reader2.iml +++ /dev/null @@ -1,68 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Software/fab-reader2-c/CMakeLists.txt b/Software/fab-reader2/CMakeLists.txt similarity index 88% rename from Software/fab-reader2-c/CMakeLists.txt rename to Software/fab-reader2/CMakeLists.txt index a38c955..5ff181a 100644 --- a/Software/fab-reader2-c/CMakeLists.txt +++ b/Software/fab-reader2/CMakeLists.txt @@ -7,5 +7,3 @@ cmake_minimum_required(VERSION 3.5) include($ENV{IDF_PATH}/tools/cmake/project.cmake) project(fab-reader2-c) -set(COMPONENTS main) -#list(SET COMPONENTS "mqtt") diff --git a/Software/fab-reader2/Cargo.toml b/Software/fab-reader2/Cargo.toml deleted file mode 100644 index 91a1a29..0000000 --- a/Software/fab-reader2/Cargo.toml +++ /dev/null @@ -1,31 +0,0 @@ -[package] -name = "fab-reader2" -version = "0.1.0" -authors = ["Kai Jan Kriegel "] -edition = "2021" -resolver = "2" - -[profile.release] -opt-level = "s" - -[profile.dev] -debug = true # Symbols are nice and they don't increase the size on Flash -opt-level = "z" - -[features] -pio = ["esp-idf-sys/pio"] - -[dependencies] -esp-idf-sys = { version = "0.31.6", features = ["binstart"] } -esp-idf-hal = "0.38.1" -anyhow = "1.0.58" -embedded-hal = { version ="0.2.7", features = ["unproven"] } -embedded-svc = "0.22.1" -pervasive_epd = { path = "pervasive_epd" } -embedded-graphics = "0.7.1" -st25r3911b = { path = "st25r3911b" } - - -[build-dependencies] -embuild = "0.29" -anyhow = "1" diff --git a/Software/fab-reader2/build.rs b/Software/fab-reader2/build.rs deleted file mode 100644 index 4dd5e1f..0000000 --- a/Software/fab-reader2/build.rs +++ /dev/null @@ -1,5 +0,0 @@ -// Necessary because of this issue: https://github.com/rust-lang/cargo/issues/9641 -fn main() -> anyhow::Result<()> { - embuild::build::CfgArgs::output_propagated("ESP_IDF")?; - embuild::build::LinkArgs::output_propagated("ESP_IDF") -} diff --git a/Software/fab-reader2/components/epd_266/CMakeLists.txt b/Software/fab-reader2/components/epd_266/CMakeLists.txt new file mode 100644 index 0000000..db99211 --- /dev/null +++ b/Software/fab-reader2/components/epd_266/CMakeLists.txt @@ -0,0 +1,2 @@ +idf_component_register(SRCS "EPD_2in66.c" "Config/DEV_Config.c" + INCLUDE_DIRS "include" "include/Config") diff --git a/Software/fab-reader2/components/epd_266/Config/DEV_Config.c b/Software/fab-reader2/components/epd_266/Config/DEV_Config.c new file mode 100644 index 0000000..ec1575a --- /dev/null +++ b/Software/fab-reader2/components/epd_266/Config/DEV_Config.c @@ -0,0 +1,70 @@ +/***************************************************************************** +* | File : DEV_Config.c +* | Author : Waveshare team +* | Function : Hardware underlying interface +* | Info : +* Used to shield the underlying layers of each master +* and enhance portability +*---------------- +* | This version: V2.0 +* | Date : 2018-10-30 +* | Info : +# ****************************************************************************** +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documnetation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# +******************************************************************************/ +#include "DEV_Config.h" +#include +#include +#include + +spi_device_handle_t pSpi; + +void DEV_SPI_Init(spi_device_handle_t spi) { + pSpi = spi; +} + +void DEV_SPI_WriteByte(UBYTE value) +{ + spi_transaction_t t; + memset(&t, 0, sizeof(t)); + t.length = 8; + t.tx_buffer = &value; + + ESP_ERROR_CHECK(spi_device_polling_transmit(pSpi, &t)); + +} + +int DEV_Module_Init(void) +{ + DEV_Digital_Write(EPD_DC_PIN, 0); + DEV_Digital_Write(EPD_CS_PIN, 0); + DEV_Digital_Write(EPD_RST_PIN, 1); + return 0; +} + +void DEV_Module_Exit(void) +{ + DEV_Digital_Write(EPD_DC_PIN, 0); + DEV_Digital_Write(EPD_CS_PIN, 0); + + //close 5V + DEV_Digital_Write(EPD_RST_PIN, 0); +} + diff --git a/Software/fab-reader2/components/epd_266/EPD_2in66.c b/Software/fab-reader2/components/epd_266/EPD_2in66.c new file mode 100644 index 0000000..efc64bf --- /dev/null +++ b/Software/fab-reader2/components/epd_266/EPD_2in66.c @@ -0,0 +1,259 @@ +/***************************************************************************** +* | File : EPD_2in66.c +* | Author : Waveshare team +* | Function : 2.66inch e-paper +* | Info : +*---------------- +* | This version: V1.0 +* | Date : 2020-07-29 +* | Info : +* ----------------------------------------------------------------------------- +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documnetation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# +******************************************************************************/ +#include "EPD_2in66.h" +#include "Debug.h" + +const unsigned char WF_PARTIAL[159] ={ +0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x40,0x40,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x0A,0x00,0x00,0x00,0x00,0x00,0x02,0x01,0x00,0x00, +0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x22,0x22,0x22,0x22,0x22,0x22, +0x00,0x00,0x00,0x22,0x17,0x41,0xB0,0x32,0x36, +}; + + +/****************************************************************************** +function : Software reset +parameter: +******************************************************************************/ +static void EPD_2IN66_Reset(void) +{ + DEV_Digital_Write(EPD_RST_PIN, 1); + DEV_Delay_ms(200); + DEV_Digital_Write(EPD_RST_PIN, 0); + DEV_Delay_ms(2); + DEV_Digital_Write(EPD_RST_PIN, 1); + DEV_Delay_ms(200); +} + +/****************************************************************************** +function : send command +parameter: + Reg : Command register +******************************************************************************/ +static void EPD_2IN66_SendCommand(UBYTE Reg) +{ + DEV_Digital_Write(EPD_DC_PIN, 0); + DEV_Digital_Write(EPD_CS_PIN, 0); + DEV_SPI_WriteByte(Reg); + DEV_Digital_Write(EPD_CS_PIN, 1); +} + +/****************************************************************************** +function : send data +parameter: + Data : Write data +******************************************************************************/ +static void EPD_2IN66_SendData(UBYTE Data) +{ + DEV_Digital_Write(EPD_DC_PIN, 1); + DEV_Digital_Write(EPD_CS_PIN, 0); + DEV_SPI_WriteByte(Data); + DEV_Digital_Write(EPD_CS_PIN, 1); +} + +/****************************************************************************** +function : Wait until the busy_pin goes LOW +parameter: +******************************************************************************/ +void EPD_2IN66_ReadBusy(void) +{ + Debug("e-Paper busy\r\n"); + DEV_Delay_ms(100); + while(DEV_Digital_Read(EPD_BUSY_PIN) == 1) { //LOW: idle, HIGH: busy + DEV_Delay_ms(100); + } + DEV_Delay_ms(100); + Debug("e-Paper busy release\r\n"); +} + + +/****************************************************************************** +function : Turn On Display +parameter: +******************************************************************************/ +static void EPD_2IN66_TurnOnDisplay(void) +{ + EPD_2IN66_SendCommand(0x20); + EPD_2IN66_ReadBusy(); + +} + +/****************************************************************************** +function : Send LUT +parameter: +******************************************************************************/ +static void EPD_2IN66_SetLUA(void) +{ + UWORD count; + EPD_2IN66_SendCommand(0x32); + for(count=0;count<153;count++){ + EPD_2IN66_SendData(WF_PARTIAL[count]); + } + EPD_2IN66_ReadBusy(); +} + +/****************************************************************************** +function : Initialize the e-Paper register +parameter: +******************************************************************************/ +void EPD_2IN66_Init(void) +{ + EPD_2IN66_Reset(); + EPD_2IN66_ReadBusy(); + EPD_2IN66_SendCommand(0x12);//soft reset + EPD_2IN66_ReadBusy(); + /* Y increment, X increment */ + EPD_2IN66_SendCommand(0x11); + EPD_2IN66_SendData(0x03); + /* Set RamX-address Start/End position */ + EPD_2IN66_SendCommand(0x44); + EPD_2IN66_SendData(0x01); + EPD_2IN66_SendData((EPD_2IN66_WIDTH % 8 == 0)? (EPD_2IN66_WIDTH / 8 ): (EPD_2IN66_WIDTH / 8 + 1) ); + /* Set RamY-address Start/End position */ + EPD_2IN66_SendCommand(0x45); + EPD_2IN66_SendData(0); + EPD_2IN66_SendData(0); + EPD_2IN66_SendData((EPD_2IN66_HEIGHT&0xff)); + EPD_2IN66_SendData((EPD_2IN66_HEIGHT&0x100)>>8); + + + EPD_2IN66_ReadBusy(); +} + +/****************************************************************************** +function : Initialize the e-Paper register(Partial display) +parameter: +******************************************************************************/ +void EPD_2IN66_Init_Partial(void) +{ + EPD_2IN66_Reset(); + EPD_2IN66_ReadBusy(); + EPD_2IN66_SendCommand(0x12);//soft reset + EPD_2IN66_ReadBusy(); + + EPD_2IN66_SetLUA(); + EPD_2IN66_SendCommand(0x37); + EPD_2IN66_SendData(0x00); + EPD_2IN66_SendData(0x00); + EPD_2IN66_SendData(0x00); + EPD_2IN66_SendData(0x00); + EPD_2IN66_SendData(0x00); + EPD_2IN66_SendData(0x40); + EPD_2IN66_SendData(0x00); + EPD_2IN66_SendData(0x00); + EPD_2IN66_SendData(0x00); + EPD_2IN66_SendData(0x00); + + /* Y increment, X increment */ + EPD_2IN66_SendCommand(0x11); + EPD_2IN66_SendData(0x03); + /* Set RamX-address Start/End position */ + EPD_2IN66_SendCommand(0x44); + EPD_2IN66_SendData(0x01); + EPD_2IN66_SendData((EPD_2IN66_WIDTH % 8 == 0)? (EPD_2IN66_WIDTH / 8 ): (EPD_2IN66_WIDTH / 8 + 1) ); + /* Set RamY-address Start/End position */ + EPD_2IN66_SendCommand(0x45); + EPD_2IN66_SendData(0); + EPD_2IN66_SendData(0); + EPD_2IN66_SendData((EPD_2IN66_HEIGHT&0xff)); + EPD_2IN66_SendData((EPD_2IN66_HEIGHT&0x100)>>8); + + EPD_2IN66_SendCommand(0x3C); + EPD_2IN66_SendData(0x80); + + EPD_2IN66_SendCommand(0x22); + EPD_2IN66_SendData(0xcf); + EPD_2IN66_SendCommand(0x20); + EPD_2IN66_ReadBusy(); +} + +/****************************************************************************** +function : Clear screen +parameter: +******************************************************************************/ +void EPD_2IN66_Clear(void) +{ + UWORD Width, Height; + Width = (EPD_2IN66_WIDTH % 8 == 0)? (EPD_2IN66_WIDTH / 8 ): (EPD_2IN66_WIDTH / 8 + 1); + Height = EPD_2IN66_HEIGHT; + EPD_2IN66_SendCommand(0x24); + for (UWORD j = 0; j <=Height; j++) { + for (UWORD i = 0; i < Width; i++) { + EPD_2IN66_SendData(0xff); + } + } + EPD_2IN66_TurnOnDisplay(); +} + +/****************************************************************************** +function : Sends the image buffer in RAM to e-Paper and displays +parameter: +******************************************************************************/ +void EPD_2IN66_Display(UBYTE *Image) +{ + UWORD Width, Height; + Width = (EPD_2IN66_WIDTH % 8 == 0)? (EPD_2IN66_WIDTH / 8 ): (EPD_2IN66_WIDTH / 8 + 1); + Height = EPD_2IN66_HEIGHT; + + UDOUBLE Addr = 0; + + // UDOUBLE Offset = ImageName; + EPD_2IN66_SendCommand(0x24); + for (UWORD j = 0; j EPD_RST_PIN +* EPD_DC -> EPD_DC_PIN +* EPD_CS -> EPD_CS_PIN +* EPD_BUSY -> EPD_BUSY_PIN +* 3.Remote: +* EPD_RST_1\EPD_RST_0 +* EPD_DC_1\EPD_DC_0 +* EPD_CS_1\EPD_CS_0 +* EPD_BUSY_1\EPD_BUSY_0 +* 3.add: +* #define DEV_Digital_Write(_pin, _value) bcm2835_gpio_write(_pin, _value) +* #define DEV_Digital_Read(_pin) bcm2835_gpio_lev(_pin) +* #define DEV_SPI_WriteByte(__value) bcm2835_spi_transfer(__value) +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documnetation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# +******************************************************************************/ +#ifndef _DEV_CONFIG_H_ +#define _DEV_CONFIG_H_ + +#include "esp_err.h" +#include "driver/gpio.h" +#include +#include +#include +#include +#include + +/** + * data +**/ +#define UBYTE uint8_t +#define UWORD uint16_t +#define UDOUBLE uint32_t + +/** + * e-Paper GPIO +**/ +#define EPD_RST_PIN 40 +#define EPD_DC_PIN 39 +#define EPD_CS_PIN 38 +#define EPD_BUSY_PIN 41 + +/** + * GPIO read and write +**/ +#define DEV_Digital_Write(_pin, _value) ESP_ERROR_CHECK(gpio_set_level(_pin, _value)) +#define DEV_Digital_Read(_pin) gpio_get_level(_pin) + +/** + * delay x ms +**/ +#define DEV_Delay_ms(__xms) vTaskDelay(pdMS_TO_TICKS(__xms)) + +/** + * SPI +**/ +void DEV_SPI_Init(spi_device_handle_t spi); + +void DEV_SPI_WriteByte(UBYTE value); + +int DEV_Module_Init(void); +void DEV_Module_Exit(void); +#endif diff --git a/Software/fab-reader2/components/epd_266/include/Config/Debug.h b/Software/fab-reader2/components/epd_266/include/Config/Debug.h new file mode 100644 index 0000000..1dec591 --- /dev/null +++ b/Software/fab-reader2/components/epd_266/include/Config/Debug.h @@ -0,0 +1,26 @@ +/***************************************************************************** +* | File : Debug.h +* | Author : Waveshare team +* | Function : debug with printf +* | Info : +* Image scanning +* Please use progressive scanning to generate images or fonts +*---------------- +* | This version: V1.0 +* | Date : 2018-01-11 +* | Info : Basic version +* +******************************************************************************/ +#ifndef __DEBUG_H +#define __DEBUG_H + +#include + +#define DEBUG 1 +#if DEBUG + #define Debug(...) ESP_LOGD("EPD", __VA_ARGS__) +#else + #define Debug(__info,...) +#endif + +#endif diff --git a/Software/fab-reader2/components/epd_266/include/EPD_2in66.h b/Software/fab-reader2/components/epd_266/include/EPD_2in66.h new file mode 100644 index 0000000..7d72694 --- /dev/null +++ b/Software/fab-reader2/components/epd_266/include/EPD_2in66.h @@ -0,0 +1,46 @@ +/***************************************************************************** +* | File : EPD_2in66.h +* | Author : Waveshare team +* | Function : 2.66inch e-paper +* | Info : +*---------------- +* | This version: V1.0 +* | Date : 2020-07-29 +* | Info : +* ----------------------------------------------------------------------------- +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documnetation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# +******************************************************************************/ +#ifndef __EPD_2IN66_H_ +#define __EPD_2IN66_H_ + +#include "DEV_Config.h" + +// Display resolution +#define EPD_2IN66_WIDTH 152 +#define EPD_2IN66_HEIGHT 296 + + +void EPD_2IN66_Init(void); +void EPD_2IN66_Init_Partial(void); +void EPD_2IN66_Clear(void); +void EPD_2IN66_Display(UBYTE *Image); +void EPD_2IN66_Sleep(void); + +#endif diff --git a/Software/fab-reader2/components/epd_gfx/CMakeLists.txt b/Software/fab-reader2/components/epd_gfx/CMakeLists.txt new file mode 100644 index 0000000..0c0f2bd --- /dev/null +++ b/Software/fab-reader2/components/epd_gfx/CMakeLists.txt @@ -0,0 +1,3 @@ +idf_component_register(SRCS "GUI/GUI_Paint.c" "Fonts/font8.c" "Fonts/font12.c" "Fonts/font16.c" "Fonts/font20.c" "Fonts/font24.c" + INCLUDE_DIRS "include/GUI" "include/Fonts" + REQUIRES "epd_266") \ No newline at end of file diff --git a/Software/fab-reader2/components/epd_gfx/Fonts/font12.c b/Software/fab-reader2/components/epd_gfx/Fonts/font12.c new file mode 100644 index 0000000..b4bc866 --- /dev/null +++ b/Software/fab-reader2/components/epd_gfx/Fonts/font12.c @@ -0,0 +1,1384 @@ +/** + ****************************************************************************** + * @file Font12.c + * @author MCD Application Team + * @version V1.0.0 + * @date 18-February-2014 + * @brief This file provides text Font12 for STM32xx-EVAL's LCD driver. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2014 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "fonts.h" + +// +// Font data for Courier New 12pt +// + +const uint8_t Font12_Table[] = +{ + // @0 ' ' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @12 '!' (7 pixels wide) + 0x00, // + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x00, // + 0x00, // + 0x10, // # + 0x00, // + 0x00, // + 0x00, // + + // @24 '"' (7 pixels wide) + 0x00, // + 0x6C, // ## ## + 0x48, // # # + 0x48, // # # + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @36 '#' (7 pixels wide) + 0x00, // + 0x14, // # # + 0x14, // # # + 0x28, // # # + 0x7C, // ##### + 0x28, // # # + 0x7C, // ##### + 0x28, // # # + 0x50, // # # + 0x50, // # # + 0x00, // + 0x00, // + + // @48 '$' (7 pixels wide) + 0x00, // + 0x10, // # + 0x38, // ### + 0x40, // # + 0x40, // # + 0x38, // ### + 0x48, // # # + 0x70, // ### + 0x10, // # + 0x10, // # + 0x00, // + 0x00, // + + // @60 '%' (7 pixels wide) + 0x00, // + 0x20, // # + 0x50, // # # + 0x20, // # + 0x0C, // ## + 0x70, // ### + 0x08, // # + 0x14, // # # + 0x08, // # + 0x00, // + 0x00, // + 0x00, // + + // @72 '&' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x18, // ## + 0x20, // # + 0x20, // # + 0x54, // # # # + 0x48, // # # + 0x34, // ## # + 0x00, // + 0x00, // + 0x00, // + + // @84 ''' (7 pixels wide) + 0x00, // + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @96 '(' (7 pixels wide) + 0x00, // + 0x08, // # + 0x08, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x08, // # + 0x08, // # + 0x00, // + + // @108 ')' (7 pixels wide) + 0x00, // + 0x20, // # + 0x20, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x20, // # + 0x20, // # + 0x00, // + + // @120 '*' (7 pixels wide) + 0x00, // + 0x10, // # + 0x7C, // ##### + 0x10, // # + 0x28, // # # + 0x28, // # # + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @132 '+' (7 pixels wide) + 0x00, // + 0x00, // + 0x10, // # + 0x10, // # + 0x10, // # + 0xFE, // ####### + 0x10, // # + 0x10, // # + 0x10, // # + 0x00, // + 0x00, // + 0x00, // + + // @144 ',' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x18, // ## + 0x10, // # + 0x30, // ## + 0x20, // # + 0x00, // + + // @156 '-' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @168 '.' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x30, // ## + 0x30, // ## + 0x00, // + 0x00, // + 0x00, // + + // @180 '/' (7 pixels wide) + 0x00, // + 0x04, // # + 0x04, // # + 0x08, // # + 0x08, // # + 0x10, // # + 0x10, // # + 0x20, // # + 0x20, // # + 0x40, // # + 0x00, // + 0x00, // + + // @192 '0' (7 pixels wide) + 0x00, // + 0x38, // ### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @204 '1' (7 pixels wide) + 0x00, // + 0x30, // ## + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @216 '2' (7 pixels wide) + 0x00, // + 0x38, // ### + 0x44, // # # + 0x04, // # + 0x08, // # + 0x10, // # + 0x20, // # + 0x44, // # # + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @228 '3' (7 pixels wide) + 0x00, // + 0x38, // ### + 0x44, // # # + 0x04, // # + 0x18, // ## + 0x04, // # + 0x04, // # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @240 '4' (7 pixels wide) + 0x00, // + 0x0C, // ## + 0x14, // # # + 0x14, // # # + 0x24, // # # + 0x44, // # # + 0x7E, // ###### + 0x04, // # + 0x0E, // ### + 0x00, // + 0x00, // + 0x00, // + + // @252 '5' (7 pixels wide) + 0x00, // + 0x3C, // #### + 0x20, // # + 0x20, // # + 0x38, // ### + 0x04, // # + 0x04, // # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @264 '6' (7 pixels wide) + 0x00, // + 0x1C, // ### + 0x20, // # + 0x40, // # + 0x78, // #### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @276 '7' (7 pixels wide) + 0x00, // + 0x7C, // ##### + 0x44, // # # + 0x04, // # + 0x08, // # + 0x08, // # + 0x08, // # + 0x10, // # + 0x10, // # + 0x00, // + 0x00, // + 0x00, // + + // @288 '8' (7 pixels wide) + 0x00, // + 0x38, // ### + 0x44, // # # + 0x44, // # # + 0x38, // ### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @300 '9' (7 pixels wide) + 0x00, // + 0x38, // ### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x3C, // #### + 0x04, // # + 0x08, // # + 0x70, // ### + 0x00, // + 0x00, // + 0x00, // + + // @312 ':' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x30, // ## + 0x30, // ## + 0x00, // + 0x00, // + 0x30, // ## + 0x30, // ## + 0x00, // + 0x00, // + 0x00, // + + // @324 ';' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x18, // ## + 0x18, // ## + 0x00, // + 0x00, // + 0x18, // ## + 0x30, // ## + 0x20, // # + 0x00, // + 0x00, // + + // @336 '<' (7 pixels wide) + 0x00, // + 0x00, // + 0x0C, // ## + 0x10, // # + 0x60, // ## + 0x80, // # + 0x60, // ## + 0x10, // # + 0x0C, // ## + 0x00, // + 0x00, // + 0x00, // + + // @348 '=' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x7C, // ##### + 0x00, // + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @360 '>' (7 pixels wide) + 0x00, // + 0x00, // + 0xC0, // ## + 0x20, // # + 0x18, // ## + 0x04, // # + 0x18, // ## + 0x20, // # + 0xC0, // ## + 0x00, // + 0x00, // + 0x00, // + + // @372 '?' (7 pixels wide) + 0x00, // + 0x00, // + 0x18, // ## + 0x24, // # # + 0x04, // # + 0x08, // # + 0x10, // # + 0x00, // + 0x30, // ## + 0x00, // + 0x00, // + 0x00, // + + // @384 '@' (7 pixels wide) + 0x38, // ### + 0x44, // # # + 0x44, // # # + 0x4C, // # ## + 0x54, // # # # + 0x54, // # # # + 0x4C, // # ## + 0x40, // # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + + // @396 'A' (7 pixels wide) + 0x00, // + 0x30, // ## + 0x10, // # + 0x28, // # # + 0x28, // # # + 0x28, // # # + 0x7C, // ##### + 0x44, // # # + 0xEE, // ### ### + 0x00, // + 0x00, // + 0x00, // + + // @408 'B' (7 pixels wide) + 0x00, // + 0xF8, // ##### + 0x44, // # # + 0x44, // # # + 0x78, // #### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0xF8, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @420 'C' (7 pixels wide) + 0x00, // + 0x3C, // #### + 0x44, // # # + 0x40, // # + 0x40, // # + 0x40, // # + 0x40, // # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @432 'D' (7 pixels wide) + 0x00, // + 0xF0, // #### + 0x48, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x48, // # # + 0xF0, // #### + 0x00, // + 0x00, // + 0x00, // + + // @444 'E' (7 pixels wide) + 0x00, // + 0xFC, // ###### + 0x44, // # # + 0x50, // # # + 0x70, // ### + 0x50, // # # + 0x40, // # + 0x44, // # # + 0xFC, // ###### + 0x00, // + 0x00, // + 0x00, // + + // @456 'F' (7 pixels wide) + 0x00, // + 0x7E, // ###### + 0x22, // # # + 0x28, // # # + 0x38, // ### + 0x28, // # # + 0x20, // # + 0x20, // # + 0x70, // ### + 0x00, // + 0x00, // + 0x00, // + + // @468 'G' (7 pixels wide) + 0x00, // + 0x3C, // #### + 0x44, // # # + 0x40, // # + 0x40, // # + 0x4E, // # ### + 0x44, // # # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @480 'H' (7 pixels wide) + 0x00, // + 0xEE, // ### ### + 0x44, // # # + 0x44, // # # + 0x7C, // ##### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0xEE, // ### ### + 0x00, // + 0x00, // + 0x00, // + + // @492 'I' (7 pixels wide) + 0x00, // + 0x7C, // ##### + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @504 'J' (7 pixels wide) + 0x00, // + 0x3C, // #### + 0x08, // # + 0x08, // # + 0x08, // # + 0x48, // # # + 0x48, // # # + 0x48, // # # + 0x30, // ## + 0x00, // + 0x00, // + 0x00, // + + // @516 'K' (7 pixels wide) + 0x00, // + 0xEE, // ### ### + 0x44, // # # + 0x48, // # # + 0x50, // # # + 0x70, // ### + 0x48, // # # + 0x44, // # # + 0xE6, // ### ## + 0x00, // + 0x00, // + 0x00, // + + // @528 'L' (7 pixels wide) + 0x00, // + 0x70, // ### + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x24, // # # + 0x24, // # # + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @540 'M' (7 pixels wide) + 0x00, // + 0xEE, // ### ### + 0x6C, // ## ## + 0x6C, // ## ## + 0x54, // # # # + 0x54, // # # # + 0x44, // # # + 0x44, // # # + 0xEE, // ### ### + 0x00, // + 0x00, // + 0x00, // + + // @552 'N' (7 pixels wide) + 0x00, // + 0xEE, // ### ### + 0x64, // ## # + 0x64, // ## # + 0x54, // # # # + 0x54, // # # # + 0x54, // # # # + 0x4C, // # ## + 0xEC, // ### ## + 0x00, // + 0x00, // + 0x00, // + + // @564 'O' (7 pixels wide) + 0x00, // + 0x38, // ### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @576 'P' (7 pixels wide) + 0x00, // + 0x78, // #### + 0x24, // # # + 0x24, // # # + 0x24, // # # + 0x38, // ### + 0x20, // # + 0x20, // # + 0x70, // ### + 0x00, // + 0x00, // + 0x00, // + + // @588 'Q' (7 pixels wide) + 0x00, // + 0x38, // ### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x38, // ### + 0x1C, // ### + 0x00, // + 0x00, // + + // @600 'R' (7 pixels wide) + 0x00, // + 0xF8, // ##### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x78, // #### + 0x48, // # # + 0x44, // # # + 0xE2, // ### # + 0x00, // + 0x00, // + 0x00, // + + // @612 'S' (7 pixels wide) + 0x00, // + 0x34, // ## # + 0x4C, // # ## + 0x40, // # + 0x38, // ### + 0x04, // # + 0x04, // # + 0x64, // ## # + 0x58, // # ## + 0x00, // + 0x00, // + 0x00, // + + // @624 'T' (7 pixels wide) + 0x00, // + 0xFE, // ####### + 0x92, // # # # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @636 'U' (7 pixels wide) + 0x00, // + 0xEE, // ### ### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @648 'V' (7 pixels wide) + 0x00, // + 0xEE, // ### ### + 0x44, // # # + 0x44, // # # + 0x28, // # # + 0x28, // # # + 0x28, // # # + 0x10, // # + 0x10, // # + 0x00, // + 0x00, // + 0x00, // + + // @660 'W' (7 pixels wide) + 0x00, // + 0xEE, // ### ### + 0x44, // # # + 0x44, // # # + 0x54, // # # # + 0x54, // # # # + 0x54, // # # # + 0x54, // # # # + 0x28, // # # + 0x00, // + 0x00, // + 0x00, // + + // @672 'X' (7 pixels wide) + 0x00, // + 0xC6, // ## ## + 0x44, // # # + 0x28, // # # + 0x10, // # + 0x10, // # + 0x28, // # # + 0x44, // # # + 0xC6, // ## ## + 0x00, // + 0x00, // + 0x00, // + + // @684 'Y' (7 pixels wide) + 0x00, // + 0xEE, // ### ### + 0x44, // # # + 0x28, // # # + 0x28, // # # + 0x10, // # + 0x10, // # + 0x10, // # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @696 'Z' (7 pixels wide) + 0x00, // + 0x7C, // ##### + 0x44, // # # + 0x08, // # + 0x10, // # + 0x10, // # + 0x20, // # + 0x44, // # # + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @708 '[' (7 pixels wide) + 0x00, // + 0x38, // ### + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x38, // ### + 0x00, // + + // @720 '\' (7 pixels wide) + 0x00, // + 0x40, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x10, // # + 0x10, // # + 0x08, // # + 0x08, // # + 0x08, // # + 0x00, // + 0x00, // + + // @732 ']' (7 pixels wide) + 0x00, // + 0x38, // ### + 0x08, // # + 0x08, // # + 0x08, // # + 0x08, // # + 0x08, // # + 0x08, // # + 0x08, // # + 0x08, // # + 0x38, // ### + 0x00, // + + // @744 '^' (7 pixels wide) + 0x00, // + 0x10, // # + 0x10, // # + 0x28, // # # + 0x44, // # # + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @756 '_' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0xFE, // ####### + + // @768 '`' (7 pixels wide) + 0x00, // + 0x10, // # + 0x08, // # + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @780 'a' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x38, // ### + 0x44, // # # + 0x3C, // #### + 0x44, // # # + 0x44, // # # + 0x3E, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @792 'b' (7 pixels wide) + 0x00, // + 0xC0, // ## + 0x40, // # + 0x58, // # ## + 0x64, // ## # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0xF8, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @804 'c' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x3C, // #### + 0x44, // # # + 0x40, // # + 0x40, // # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @816 'd' (7 pixels wide) + 0x00, // + 0x0C, // ## + 0x04, // # + 0x34, // ## # + 0x4C, // # ## + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x3E, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @828 'e' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x38, // ### + 0x44, // # # + 0x7C, // ##### + 0x40, // # + 0x40, // # + 0x3C, // #### + 0x00, // + 0x00, // + 0x00, // + + // @840 'f' (7 pixels wide) + 0x00, // + 0x1C, // ### + 0x20, // # + 0x7C, // ##### + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @852 'g' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x36, // ## ## + 0x4C, // # ## + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x3C, // #### + 0x04, // # + 0x38, // ### + 0x00, // + + // @864 'h' (7 pixels wide) + 0x00, // + 0xC0, // ## + 0x40, // # + 0x58, // # ## + 0x64, // ## # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0xEE, // ### ### + 0x00, // + 0x00, // + 0x00, // + + // @876 'i' (7 pixels wide) + 0x00, // + 0x10, // # + 0x00, // + 0x70, // ### + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @888 'j' (7 pixels wide) + 0x00, // + 0x10, // # + 0x00, // + 0x78, // #### + 0x08, // # + 0x08, // # + 0x08, // # + 0x08, // # + 0x08, // # + 0x08, // # + 0x70, // ### + 0x00, // + + // @900 'k' (7 pixels wide) + 0x00, // + 0xC0, // ## + 0x40, // # + 0x5C, // # ### + 0x48, // # # + 0x70, // ### + 0x50, // # # + 0x48, // # # + 0xDC, // ## ### + 0x00, // + 0x00, // + 0x00, // + + // @912 'l' (7 pixels wide) + 0x00, // + 0x30, // ## + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @924 'm' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0xE8, // ### # + 0x54, // # # # + 0x54, // # # # + 0x54, // # # # + 0x54, // # # # + 0xFE, // ####### + 0x00, // + 0x00, // + 0x00, // + + // @936 'n' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0xD8, // ## ## + 0x64, // ## # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0xEE, // ### ### + 0x00, // + 0x00, // + 0x00, // + + // @948 'o' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x38, // ### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @960 'p' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0xD8, // ## ## + 0x64, // ## # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x78, // #### + 0x40, // # + 0xE0, // ### + 0x00, // + + // @972 'q' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x36, // ## ## + 0x4C, // # ## + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x3C, // #### + 0x04, // # + 0x0E, // ### + 0x00, // + + // @984 'r' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x6C, // ## ## + 0x30, // ## + 0x20, // # + 0x20, // # + 0x20, // # + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @996 's' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x3C, // #### + 0x44, // # # + 0x38, // ### + 0x04, // # + 0x44, // # # + 0x78, // #### + 0x00, // + 0x00, // + 0x00, // + + // @1008 't' (7 pixels wide) + 0x00, // + 0x00, // + 0x20, // # + 0x7C, // ##### + 0x20, // # + 0x20, // # + 0x20, // # + 0x22, // # # + 0x1C, // ### + 0x00, // + 0x00, // + 0x00, // + + // @1020 'u' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0xCC, // ## ## + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x4C, // # ## + 0x36, // ## ## + 0x00, // + 0x00, // + 0x00, // + + // @1032 'v' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0xEE, // ### ### + 0x44, // # # + 0x44, // # # + 0x28, // # # + 0x28, // # # + 0x10, // # + 0x00, // + 0x00, // + 0x00, // + + // @1044 'w' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0xEE, // ### ### + 0x44, // # # + 0x54, // # # # + 0x54, // # # # + 0x54, // # # # + 0x28, // # # + 0x00, // + 0x00, // + 0x00, // + + // @1056 'x' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0xCC, // ## ## + 0x48, // # # + 0x30, // ## + 0x30, // ## + 0x48, // # # + 0xCC, // ## ## + 0x00, // + 0x00, // + 0x00, // + + // @1068 'y' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0xEE, // ### ### + 0x44, // # # + 0x24, // # # + 0x28, // # # + 0x18, // ## + 0x10, // # + 0x10, // # + 0x78, // #### + 0x00, // + + // @1080 'z' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x7C, // ##### + 0x48, // # # + 0x10, // # + 0x20, // # + 0x44, // # # + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @1092 '{' (7 pixels wide) + 0x00, // + 0x08, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x20, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x08, // # + 0x00, // + + // @1104 '|' (7 pixels wide) + 0x00, // + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x00, // + 0x00, // + + // @1116 '}' (7 pixels wide) + 0x00, // + 0x20, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x08, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x20, // # + 0x00, // + + // @1128 '~' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x24, // # # + 0x58, // # ## + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // +}; + +sFONT Font12 = { + Font12_Table, + 7, /* Width */ + 12, /* Height */ +}; + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Software/fab-reader2/components/epd_gfx/Fonts/font16.c b/Software/fab-reader2/components/epd_gfx/Fonts/font16.c new file mode 100644 index 0000000..e93803c --- /dev/null +++ b/Software/fab-reader2/components/epd_gfx/Fonts/font16.c @@ -0,0 +1,1764 @@ +/** + ****************************************************************************** + * @file font16.c + * @author MCD Application Team + * @version V1.0.0 + * @date 18-February-2014 + * @brief This file provides text font16 for STM32xx-EVAL's LCD driver. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2014 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "fonts.h" + +// +// Font data for Courier New 12pt +// + +const uint8_t Font16_Table[] = +{ + // @0 ' ' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @32 '!' (11 pixels wide) + 0x00, 0x00, // + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x00, 0x00, // + 0x0C, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @64 '"' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x1D, 0xC0, // ### ### + 0x1D, 0xC0, // ### ### + 0x08, 0x80, // # # + 0x08, 0x80, // # # + 0x08, 0x80, // # # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @96 '#' (11 pixels wide) + 0x00, 0x00, // + 0x0D, 0x80, // ## ## + 0x0D, 0x80, // ## ## + 0x0D, 0x80, // ## ## + 0x0D, 0x80, // ## ## + 0x3F, 0xC0, // ######## + 0x1B, 0x00, // ## ## + 0x3F, 0xC0, // ######## + 0x1B, 0x00, // ## ## + 0x1B, 0x00, // ## ## + 0x1B, 0x00, // ## ## + 0x1B, 0x00, // ## ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @128 '$' (11 pixels wide) + 0x04, 0x00, // # + 0x1F, 0x80, // ###### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x38, 0x00, // ### + 0x1E, 0x00, // #### + 0x0F, 0x00, // #### + 0x03, 0x80, // ### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x3F, 0x00, // ###### + 0x04, 0x00, // # + 0x04, 0x00, // # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @160 '%' (11 pixels wide) + 0x00, 0x00, // + 0x18, 0x00, // ## + 0x24, 0x00, // # # + 0x24, 0x00, // # # + 0x18, 0xC0, // ## ## + 0x07, 0x80, // #### + 0x1E, 0x00, // #### + 0x31, 0x80, // ## ## + 0x02, 0x40, // # # + 0x02, 0x40, // # # + 0x01, 0x80, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @192 '&' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x0F, 0x00, // #### + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x0C, 0x00, // ## + 0x1D, 0x80, // ### ## + 0x37, 0x00, // ## ### + 0x33, 0x00, // ## ## + 0x1D, 0x80, // ### ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @224 ''' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x02, 0x00, // # + 0x02, 0x00, // # + 0x02, 0x00, // # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @256 '(' (11 pixels wide) + 0x00, 0x00, // + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x06, 0x00, // ## + 0x0E, 0x00, // ### + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0E, 0x00, // ### + 0x06, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @288 ')' (11 pixels wide) + 0x00, 0x00, // + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x0C, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x0C, 0x00, // ## + 0x1C, 0x00, // ### + 0x18, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @320 '*' (11 pixels wide) + 0x00, 0x00, // + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x3F, 0xC0, // ######## + 0x3F, 0xC0, // ######## + 0x0F, 0x00, // #### + 0x1F, 0x80, // ###### + 0x19, 0x80, // ## ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @352 '+' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x04, 0x00, // # + 0x04, 0x00, // # + 0x04, 0x00, // # + 0x3F, 0x80, // ####### + 0x04, 0x00, // # + 0x04, 0x00, // # + 0x04, 0x00, // # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @384 ',' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x06, 0x00, // ## + 0x04, 0x00, // # + 0x0C, 0x00, // ## + 0x08, 0x00, // # + 0x08, 0x00, // # + 0x00, 0x00, // + 0x00, 0x00, // + + // @416 '-' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0x80, // ####### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @448 '.' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @480 '/' (11 pixels wide) + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x06, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @512 '0' (11 pixels wide) + 0x00, 0x00, // + 0x0E, 0x00, // ### + 0x1B, 0x00, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x1B, 0x00, // ## ## + 0x0E, 0x00, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @544 '1' (11 pixels wide) + 0x00, 0x00, // + 0x06, 0x00, // ## + 0x3E, 0x00, // ##### + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x3F, 0xC0, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @576 '2' (11 pixels wide) + 0x00, 0x00, // + 0x0F, 0x00, // #### + 0x19, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x03, 0x00, // ## + 0x06, 0x00, // ## + 0x0C, 0x00, // ## + 0x18, 0x00, // ## + 0x30, 0x00, // ## + 0x3F, 0x80, // ####### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @608 '3' (11 pixels wide) + 0x00, 0x00, // + 0x3F, 0x00, // ###### + 0x61, 0x80, // ## ## + 0x01, 0x80, // ## + 0x03, 0x00, // ## + 0x1F, 0x00, // ##### + 0x03, 0x80, // ### + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x61, 0x80, // ## ## + 0x3F, 0x00, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @640 '4' (11 pixels wide) + 0x00, 0x00, // + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x0F, 0x00, // #### + 0x0B, 0x00, // # ## + 0x1B, 0x00, // ## ## + 0x13, 0x00, // # ## + 0x33, 0x00, // ## ## + 0x3F, 0x80, // ####### + 0x03, 0x00, // ## + 0x0F, 0x80, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @672 '5' (11 pixels wide) + 0x00, 0x00, // + 0x1F, 0x80, // ###### + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x1F, 0x00, // ##### + 0x11, 0x80, // # ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x21, 0x80, // # ## + 0x1F, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @704 '6' (11 pixels wide) + 0x00, 0x00, // + 0x07, 0x80, // #### + 0x1C, 0x00, // ### + 0x18, 0x00, // ## + 0x30, 0x00, // ## + 0x37, 0x00, // ## ### + 0x39, 0x80, // ### ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x19, 0x80, // ## ## + 0x0F, 0x00, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @736 '7' (11 pixels wide) + 0x00, 0x00, // + 0x7F, 0x00, // ####### + 0x43, 0x00, // # ## + 0x03, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @768 '8' (11 pixels wide) + 0x00, 0x00, // + 0x1F, 0x00, // ##### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x1F, 0x00, // ##### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x1F, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @800 '9' (11 pixels wide) + 0x00, 0x00, // + 0x1E, 0x00, // #### + 0x33, 0x00, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x33, 0x80, // ## ### + 0x1D, 0x80, // ### ## + 0x01, 0x80, // ## + 0x03, 0x00, // ## + 0x07, 0x00, // ### + 0x3C, 0x00, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @832 ':' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @864 ';' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x06, 0x00, // ## + 0x04, 0x00, // # + 0x08, 0x00, // # + 0x08, 0x00, // # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @896 '<' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0xC0, // ## + 0x03, 0x00, // ## + 0x04, 0x00, // # + 0x18, 0x00, // ## + 0x60, 0x00, // ## + 0x18, 0x00, // ## + 0x04, 0x00, // # + 0x03, 0x00, // ## + 0x00, 0xC0, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @928 '=' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x7F, 0xC0, // ######### + 0x00, 0x00, // + 0x7F, 0xC0, // ######### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @960 '>' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x60, 0x00, // ## + 0x18, 0x00, // ## + 0x04, 0x00, // # + 0x03, 0x00, // ## + 0x00, 0xC0, // ## + 0x03, 0x00, // ## + 0x04, 0x00, // # + 0x18, 0x00, // ## + 0x60, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @992 '?' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0x00, // ##### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x01, 0x80, // ## + 0x07, 0x00, // ### + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x00, 0x00, // + 0x0C, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1024 '@' (11 pixels wide) + 0x00, 0x00, // + 0x0E, 0x00, // ### + 0x11, 0x00, // # # + 0x21, 0x00, // # # + 0x21, 0x00, // # # + 0x27, 0x00, // # ### + 0x29, 0x00, // # # # + 0x29, 0x00, // # # # + 0x27, 0x00, // # ### + 0x20, 0x00, // # + 0x11, 0x00, // # # + 0x0E, 0x00, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1056 'A' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0x00, // ###### + 0x0F, 0x00, // #### + 0x09, 0x00, // # # + 0x19, 0x80, // ## ## + 0x19, 0x80, // ## ## + 0x1F, 0x80, // ###### + 0x30, 0xC0, // ## ## + 0x30, 0xC0, // ## ## + 0x79, 0xE0, // #### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1088 'B' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7F, 0x00, // ####### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x3F, 0x00, // ###### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x7F, 0x00, // ####### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1120 'C' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0x40, // ##### # + 0x30, 0xC0, // ## ## + 0x60, 0x40, // ## # + 0x60, 0x00, // ## + 0x60, 0x00, // ## + 0x60, 0x00, // ## + 0x60, 0x40, // ## # + 0x30, 0x80, // ## # + 0x1F, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1152 'D' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7F, 0x00, // ####### + 0x31, 0x80, // ## ## + 0x30, 0xC0, // ## ## + 0x30, 0xC0, // ## ## + 0x30, 0xC0, // ## ## + 0x30, 0xC0, // ## ## + 0x30, 0xC0, // ## ## + 0x31, 0x80, // ## ## + 0x7F, 0x00, // ####### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1184 'E' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7F, 0x80, // ######## + 0x30, 0x80, // ## # + 0x30, 0x80, // ## # + 0x32, 0x00, // ## # + 0x3E, 0x00, // ##### + 0x32, 0x00, // ## # + 0x30, 0x80, // ## # + 0x30, 0x80, // ## # + 0x7F, 0x80, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1216 'F' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7F, 0xC0, // ######### + 0x30, 0x40, // ## # + 0x30, 0x40, // ## # + 0x32, 0x00, // ## # + 0x3E, 0x00, // ##### + 0x32, 0x00, // ## # + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x7C, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1248 'G' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x1E, 0x80, // #### # + 0x31, 0x80, // ## ## + 0x60, 0x80, // ## # + 0x60, 0x00, // ## + 0x60, 0x00, // ## + 0x67, 0xC0, // ## ##### + 0x61, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x1F, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1280 'H' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7B, 0xC0, // #### #### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x3F, 0x80, // ####### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x7B, 0xC0, // #### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1312 'I' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0xC0, // ######## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x3F, 0xC0, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1344 'J' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0xC0, // ####### + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x63, 0x00, // ## ## + 0x63, 0x00, // ## ## + 0x63, 0x00, // ## ## + 0x3E, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1376 'K' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7B, 0xC0, // #### #### + 0x31, 0x80, // ## ## + 0x33, 0x00, // ## ## + 0x36, 0x00, // ## ## + 0x3C, 0x00, // #### + 0x3E, 0x00, // ##### + 0x33, 0x00, // ## ## + 0x31, 0x80, // ## ## + 0x79, 0xC0, // #### ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1408 'L' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7E, 0x00, // ###### + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x40, // ## # + 0x18, 0x40, // ## # + 0x18, 0x40, // ## # + 0x7F, 0xC0, // ######### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1440 'M' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0xE0, 0xE0, // ### ### + 0x60, 0xC0, // ## ## + 0x71, 0xC0, // ### ### + 0x7B, 0xC0, // #### #### + 0x6A, 0xC0, // ## # # ## + 0x6E, 0xC0, // ## ### ## + 0x64, 0xC0, // ## # ## + 0x60, 0xC0, // ## ## + 0xFB, 0xE0, // ##### ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1472 'N' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x73, 0xC0, // ### #### + 0x31, 0x80, // ## ## + 0x39, 0x80, // ### ## + 0x3D, 0x80, // #### ## + 0x35, 0x80, // ## # ## + 0x37, 0x80, // ## #### + 0x33, 0x80, // ## ### + 0x31, 0x80, // ## ## + 0x79, 0x80, // #### ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1504 'O' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0x00, // ##### + 0x31, 0x80, // ## ## + 0x60, 0xC0, // ## ## + 0x60, 0xC0, // ## ## + 0x60, 0xC0, // ## ## + 0x60, 0xC0, // ## ## + 0x60, 0xC0, // ## ## + 0x31, 0x80, // ## ## + 0x1F, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1536 'P' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7F, 0x00, // ####### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x3F, 0x00, // ###### + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x7E, 0x00, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1568 'Q' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0x00, // ##### + 0x31, 0x80, // ## ## + 0x60, 0xC0, // ## ## + 0x60, 0xC0, // ## ## + 0x60, 0xC0, // ## ## + 0x60, 0xC0, // ## ## + 0x60, 0xC0, // ## ## + 0x31, 0x80, // ## ## + 0x1F, 0x00, // ##### + 0x0C, 0xC0, // ## ## + 0x1F, 0x80, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1600 'R' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7F, 0x00, // ####### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x3E, 0x00, // ##### + 0x33, 0x00, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x7C, 0xE0, // ##### ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1632 'S' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0x80, // ###### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x38, 0x00, // ### + 0x1F, 0x00, // ##### + 0x03, 0x80, // ### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x3F, 0x00, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1664 'T' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7F, 0x80, // ######## + 0x4C, 0x80, // # ## # + 0x4C, 0x80, // # ## # + 0x4C, 0x80, // # ## # + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x3F, 0x00, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1696 'U' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7B, 0xC0, // #### #### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x1F, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1728 'V' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7B, 0xC0, // #### #### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x1B, 0x00, // ## ## + 0x1B, 0x00, // ## ## + 0x1B, 0x00, // ## ## + 0x0A, 0x00, // # # + 0x0E, 0x00, // ### + 0x0E, 0x00, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1760 'W' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0xFB, 0xE0, // ##### ##### + 0x60, 0xC0, // ## ## + 0x64, 0xC0, // ## # ## + 0x6E, 0xC0, // ## ### ## + 0x6E, 0xC0, // ## ### ## + 0x2A, 0x80, // # # # # + 0x3B, 0x80, // ### ### + 0x3B, 0x80, // ### ### + 0x31, 0x80, // ## ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1792 'X' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7B, 0xC0, // #### #### + 0x31, 0x80, // ## ## + 0x1B, 0x00, // ## ## + 0x0E, 0x00, // ### + 0x0E, 0x00, // ### + 0x0E, 0x00, // ### + 0x1B, 0x00, // ## ## + 0x31, 0x80, // ## ## + 0x7B, 0xC0, // #### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1824 'Y' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x79, 0xE0, // #### #### + 0x30, 0xC0, // ## ## + 0x19, 0x80, // ## ## + 0x0F, 0x00, // #### + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x1F, 0x80, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1856 'Z' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0x80, // ####### + 0x21, 0x80, // # ## + 0x23, 0x00, // # ## + 0x06, 0x00, // ## + 0x04, 0x00, // # + 0x0C, 0x00, // ## + 0x18, 0x80, // ## # + 0x30, 0x80, // ## # + 0x3F, 0x80, // ####### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1888 '[' (11 pixels wide) + 0x00, 0x00, // + 0x07, 0x80, // #### + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x07, 0x80, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1920 '\' (11 pixels wide) + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x06, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1952 ']' (11 pixels wide) + 0x00, 0x00, // + 0x1E, 0x00, // #### + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x1E, 0x00, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1984 '^' (11 pixels wide) + 0x04, 0x00, // # + 0x0A, 0x00, // # # + 0x0A, 0x00, // # # + 0x11, 0x00, // # # + 0x20, 0x80, // # # + 0x20, 0x80, // # # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2016 '_' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0xFF, 0xE0, // ########### + + // @2048 '`' (11 pixels wide) + 0x08, 0x00, // # + 0x04, 0x00, // # + 0x02, 0x00, // # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2080 'a' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0x00, // ##### + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x1F, 0x80, // ###### + 0x31, 0x80, // ## ## + 0x33, 0x80, // ## ### + 0x1D, 0xC0, // ### ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2112 'b' (11 pixels wide) + 0x00, 0x00, // + 0x70, 0x00, // ### + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x37, 0x00, // ## ### + 0x39, 0x80, // ### ## + 0x30, 0xC0, // ## ## + 0x30, 0xC0, // ## ## + 0x30, 0xC0, // ## ## + 0x39, 0x80, // ### ## + 0x77, 0x00, // ### ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2144 'c' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x1E, 0x80, // #### # + 0x31, 0x80, // ## ## + 0x60, 0x80, // ## # + 0x60, 0x00, // ## + 0x60, 0x80, // ## # + 0x31, 0x80, // ## ## + 0x1F, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2176 'd' (11 pixels wide) + 0x00, 0x00, // + 0x03, 0x80, // ### + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x1D, 0x80, // ### ## + 0x33, 0x80, // ## ### + 0x61, 0x80, // ## ## + 0x61, 0x80, // ## ## + 0x61, 0x80, // ## ## + 0x33, 0x80, // ## ### + 0x1D, 0xC0, // ### ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2208 'e' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0x00, // ##### + 0x31, 0x80, // ## ## + 0x60, 0xC0, // ## ## + 0x7F, 0xC0, // ######### + 0x60, 0x00, // ## + 0x30, 0xC0, // ## ## + 0x1F, 0x80, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2240 'f' (11 pixels wide) + 0x00, 0x00, // + 0x07, 0xE0, // ###### + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x3F, 0x80, // ####### + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x3F, 0x80, // ####### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2272 'g' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x1D, 0xC0, // ### ### + 0x33, 0x80, // ## ### + 0x61, 0x80, // ## ## + 0x61, 0x80, // ## ## + 0x61, 0x80, // ## ## + 0x33, 0x80, // ## ### + 0x1D, 0x80, // ### ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x1F, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + + // @2304 'h' (11 pixels wide) + 0x00, 0x00, // + 0x70, 0x00, // ### + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x37, 0x00, // ## ### + 0x39, 0x80, // ### ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x7B, 0xC0, // #### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2336 'i' (11 pixels wide) + 0x00, 0x00, // + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x00, 0x00, // + 0x1E, 0x00, // #### + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x3F, 0xC0, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2368 'j' (11 pixels wide) + 0x00, 0x00, // + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x00, 0x00, // + 0x3F, 0x00, // ###### + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x3E, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + + // @2400 'k' (11 pixels wide) + 0x00, 0x00, // + 0x70, 0x00, // ### + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x37, 0x80, // ## #### + 0x36, 0x00, // ## ## + 0x3C, 0x00, // #### + 0x3C, 0x00, // #### + 0x36, 0x00, // ## ## + 0x33, 0x00, // ## ## + 0x77, 0xC0, // ### ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2432 'l' (11 pixels wide) + 0x00, 0x00, // + 0x1E, 0x00, // #### + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x3F, 0xC0, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2464 'm' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x7F, 0x80, // ######## + 0x36, 0xC0, // ## ## ## + 0x36, 0xC0, // ## ## ## + 0x36, 0xC0, // ## ## ## + 0x36, 0xC0, // ## ## ## + 0x36, 0xC0, // ## ## ## + 0x76, 0xE0, // ### ## ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2496 'n' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x77, 0x00, // ### ### + 0x39, 0x80, // ### ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x7B, 0xC0, // #### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2528 'o' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0x00, // ##### + 0x31, 0x80, // ## ## + 0x60, 0xC0, // ## ## + 0x60, 0xC0, // ## ## + 0x60, 0xC0, // ## ## + 0x31, 0x80, // ## ## + 0x1F, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2560 'p' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x77, 0x00, // ### ### + 0x39, 0x80, // ### ## + 0x30, 0xC0, // ## ## + 0x30, 0xC0, // ## ## + 0x30, 0xC0, // ## ## + 0x39, 0x80, // ### ## + 0x37, 0x00, // ## ### + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x7C, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + + // @2592 'q' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x1D, 0xC0, // ### ### + 0x33, 0x80, // ## ### + 0x61, 0x80, // ## ## + 0x61, 0x80, // ## ## + 0x61, 0x80, // ## ## + 0x33, 0x80, // ## ### + 0x1D, 0x80, // ### ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x07, 0xC0, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + + // @2624 'r' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x7B, 0x80, // #### ### + 0x1C, 0xC0, // ### ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x7F, 0x00, // ####### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2656 's' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0x80, // ###### + 0x31, 0x80, // ## ## + 0x3C, 0x00, // #### + 0x1F, 0x00, // ##### + 0x03, 0x80, // ### + 0x31, 0x80, // ## ## + 0x3F, 0x00, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2688 't' (11 pixels wide) + 0x00, 0x00, // + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x7F, 0x00, // ####### + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x80, // ## # + 0x0F, 0x00, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2720 'u' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x73, 0x80, // ### ### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x33, 0x80, // ## ### + 0x1D, 0xC0, // ### ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2752 'v' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x7B, 0xC0, // #### #### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x1B, 0x00, // ## ## + 0x1B, 0x00, // ## ## + 0x0E, 0x00, // ### + 0x0E, 0x00, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2784 'w' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0xF1, 0xE0, // #### #### + 0x60, 0xC0, // ## ## + 0x64, 0xC0, // ## # ## + 0x6E, 0xC0, // ## ### ## + 0x3B, 0x80, // ### ### + 0x3B, 0x80, // ### ### + 0x31, 0x80, // ## ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2816 'x' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x7B, 0xC0, // #### #### + 0x1B, 0x00, // ## ## + 0x0E, 0x00, // ### + 0x0E, 0x00, // ### + 0x0E, 0x00, // ### + 0x1B, 0x00, // ## ## + 0x7B, 0xC0, // #### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2848 'y' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x79, 0xE0, // #### #### + 0x30, 0xC0, // ## ## + 0x19, 0x80, // ## ## + 0x19, 0x80, // ## ## + 0x0B, 0x00, // # ## + 0x0F, 0x00, // #### + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x0C, 0x00, // ## + 0x3E, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + + // @2880 'z' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0x80, // ####### + 0x21, 0x80, // # ## + 0x03, 0x00, // ## + 0x0E, 0x00, // ### + 0x18, 0x00, // ## + 0x30, 0x80, // ## # + 0x3F, 0x80, // ####### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2912 '{' (11 pixels wide) + 0x00, 0x00, // + 0x06, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x18, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x06, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2944 '|' (11 pixels wide) + 0x00, 0x00, // + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2976 '}' (11 pixels wide) + 0x00, 0x00, // + 0x0C, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x03, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x0C, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3008 '~' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x18, 0x00, // ## + 0x24, 0x80, // # # # + 0x03, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // +}; + +sFONT Font16 = { + Font16_Table, + 11, /* Width */ + 16, /* Height */ +}; + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Software/fab-reader2/components/epd_gfx/Fonts/font20.c b/Software/fab-reader2/components/epd_gfx/Fonts/font20.c new file mode 100644 index 0000000..8fe013e --- /dev/null +++ b/Software/fab-reader2/components/epd_gfx/Fonts/font20.c @@ -0,0 +1,2142 @@ +/** + ****************************************************************************** + * @file font20.c + * @author MCD Application Team + * @version V1.0.0 + * @date 18-February-2014 + * @brief This file provides text font20 for STM32xx-EVAL's LCD driver. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2014 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "fonts.h" + +// Character bitmaps for Courier New 15pt +const uint8_t Font20_Table[] = +{ + // @0 ' ' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @40 '!' (14 pixels wide) + 0x00, 0x00, // + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x02, 0x00, // # + 0x02, 0x00, // # + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @80 '"' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x1C, 0xE0, // ### ### + 0x1C, 0xE0, // ### ### + 0x1C, 0xE0, // ### ### + 0x08, 0x40, // # # + 0x08, 0x40, // # # + 0x08, 0x40, // # # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @120 '#' (14 pixels wide) + 0x0C, 0xC0, // ## ## + 0x0C, 0xC0, // ## ## + 0x0C, 0xC0, // ## ## + 0x0C, 0xC0, // ## ## + 0x0C, 0xC0, // ## ## + 0x3F, 0xF0, // ########## + 0x3F, 0xF0, // ########## + 0x0C, 0xC0, // ## ## + 0x0C, 0xC0, // ## ## + 0x3F, 0xF0, // ########## + 0x3F, 0xF0, // ########## + 0x0C, 0xC0, // ## ## + 0x0C, 0xC0, // ## ## + 0x0C, 0xC0, // ## ## + 0x0C, 0xC0, // ## ## + 0x0C, 0xC0, // ## ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @160 '$' (14 pixels wide) + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x07, 0xE0, // ###### + 0x0F, 0xE0, // ####### + 0x18, 0x60, // ## ## + 0x18, 0x00, // ## + 0x1F, 0x00, // ##### + 0x0F, 0xC0, // ###### + 0x00, 0xE0, // ### + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x1F, 0xC0, // ####### + 0x1F, 0x80, // ###### + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @200 '%' (14 pixels wide) + 0x00, 0x00, // + 0x1C, 0x00, // ### + 0x22, 0x00, // # # + 0x22, 0x00, // # # + 0x22, 0x00, // # # + 0x1C, 0x60, // ### ## + 0x01, 0xE0, // #### + 0x0F, 0x80, // ##### + 0x3C, 0x00, // #### + 0x31, 0xC0, // ## ### + 0x02, 0x20, // # # + 0x02, 0x20, // # # + 0x02, 0x20, // # # + 0x01, 0xC0, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @240 '&' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x03, 0xE0, // ##### + 0x0F, 0xE0, // ####### + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x06, 0x00, // ## + 0x0F, 0x30, // #### ## + 0x1F, 0xF0, // ######### + 0x19, 0xE0, // ## #### + 0x18, 0xC0, // ## ## + 0x1F, 0xF0, // ######### + 0x07, 0xB0, // #### ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @280 ''' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x03, 0x80, // ### + 0x03, 0x80, // ### + 0x03, 0x80, // ### + 0x01, 0x00, // # + 0x01, 0x00, // # + 0x01, 0x00, // # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @320 '(' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @360 ')' (14 pixels wide) + 0x00, 0x00, // + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @400 '*' (14 pixels wide) + 0x00, 0x00, // + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x1B, 0x60, // ## ## ## + 0x1F, 0xE0, // ######## + 0x07, 0x80, // #### + 0x07, 0x80, // #### + 0x0F, 0xC0, // ###### + 0x0C, 0xC0, // ## ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @440 '+' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x3F, 0xF0, // ########## + 0x3F, 0xF0, // ########## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @480 ',' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x03, 0x80, // ### + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x04, 0x00, // # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @520 '-' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0xE0, // ######### + 0x3F, 0xE0, // ######### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @560 '.' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x03, 0x80, // ### + 0x03, 0x80, // ### + 0x03, 0x80, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @600 '/' (14 pixels wide) + 0x00, 0x60, // ## + 0x00, 0x60, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @640 '0' (14 pixels wide) + 0x00, 0x00, // + 0x0F, 0x80, // ##### + 0x1F, 0xC0, // ####### + 0x18, 0xC0, // ## ## + 0x30, 0x60, // ## ## + 0x30, 0x60, // ## ## + 0x30, 0x60, // ## ## + 0x30, 0x60, // ## ## + 0x30, 0x60, // ## ## + 0x30, 0x60, // ## ## + 0x30, 0x60, // ## ## + 0x18, 0xC0, // ## ## + 0x1F, 0xC0, // ####### + 0x0F, 0x80, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @680 '1' (14 pixels wide) + 0x00, 0x00, // + 0x03, 0x00, // ## + 0x1F, 0x00, // ##### + 0x1F, 0x00, // ##### + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @720 '2' (14 pixels wide) + 0x00, 0x00, // + 0x0F, 0x80, // ##### + 0x1F, 0xC0, // ####### + 0x38, 0xE0, // ### ### + 0x30, 0x60, // ## ## + 0x00, 0x60, // ## + 0x00, 0xC0, // ## + 0x01, 0x80, // ## + 0x03, 0x00, // ## + 0x06, 0x00, // ## + 0x0C, 0x00, // ## + 0x18, 0x00, // ## + 0x3F, 0xE0, // ######### + 0x3F, 0xE0, // ######### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @760 '3' (14 pixels wide) + 0x00, 0x00, // + 0x0F, 0x80, // ##### + 0x3F, 0xC0, // ######## + 0x30, 0xE0, // ## ### + 0x00, 0x60, // ## + 0x00, 0xE0, // ### + 0x07, 0xC0, // ##### + 0x07, 0xC0, // ##### + 0x00, 0xE0, // ### + 0x00, 0x60, // ## + 0x00, 0x60, // ## + 0x60, 0xE0, // ## ### + 0x7F, 0xC0, // ######### + 0x3F, 0x80, // ####### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @800 '4' (14 pixels wide) + 0x00, 0x00, // + 0x01, 0xC0, // ### + 0x03, 0xC0, // #### + 0x03, 0xC0, // #### + 0x06, 0xC0, // ## ## + 0x0C, 0xC0, // ## ## + 0x0C, 0xC0, // ## ## + 0x18, 0xC0, // ## ## + 0x30, 0xC0, // ## ## + 0x3F, 0xE0, // ######### + 0x3F, 0xE0, // ######### + 0x00, 0xC0, // ## + 0x03, 0xE0, // ##### + 0x03, 0xE0, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @840 '5' (14 pixels wide) + 0x00, 0x00, // + 0x1F, 0xC0, // ####### + 0x1F, 0xC0, // ####### + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x1F, 0x80, // ###### + 0x1F, 0xC0, // ####### + 0x18, 0xE0, // ## ### + 0x00, 0x60, // ## + 0x00, 0x60, // ## + 0x00, 0x60, // ## + 0x30, 0xE0, // ## ### + 0x3F, 0xC0, // ######## + 0x1F, 0x80, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @880 '6' (14 pixels wide) + 0x00, 0x00, // + 0x03, 0xE0, // ##### + 0x0F, 0xE0, // ####### + 0x1E, 0x00, // #### + 0x18, 0x00, // ## + 0x38, 0x00, // ### + 0x37, 0x80, // ## #### + 0x3F, 0xC0, // ######## + 0x38, 0xE0, // ### ### + 0x30, 0x60, // ## ## + 0x30, 0x60, // ## ## + 0x18, 0xE0, // ## ### + 0x1F, 0xC0, // ####### + 0x07, 0x80, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @920 '7' (14 pixels wide) + 0x00, 0x00, // + 0x3F, 0xE0, // ######### + 0x3F, 0xE0, // ######### + 0x30, 0x60, // ## ## + 0x00, 0x60, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @960 '8' (14 pixels wide) + 0x00, 0x00, // + 0x0F, 0x80, // ##### + 0x1F, 0xC0, // ####### + 0x38, 0xE0, // ### ### + 0x30, 0x60, // ## ## + 0x38, 0xE0, // ### ### + 0x1F, 0xC0, // ####### + 0x1F, 0xC0, // ####### + 0x38, 0xE0, // ### ### + 0x30, 0x60, // ## ## + 0x30, 0x60, // ## ## + 0x38, 0xE0, // ### ### + 0x1F, 0xC0, // ####### + 0x0F, 0x80, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1000 '9' (14 pixels wide) + 0x00, 0x00, // + 0x0F, 0x00, // #### + 0x1F, 0xC0, // ####### + 0x38, 0xC0, // ### ## + 0x30, 0x60, // ## ## + 0x30, 0x60, // ## ## + 0x38, 0xE0, // ### ### + 0x1F, 0xE0, // ######## + 0x0F, 0x60, // #### ## + 0x00, 0xE0, // ### + 0x00, 0xC0, // ## + 0x03, 0xC0, // #### + 0x3F, 0x80, // ####### + 0x3E, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1040 ':' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x03, 0x80, // ### + 0x03, 0x80, // ### + 0x03, 0x80, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x03, 0x80, // ### + 0x03, 0x80, // ### + 0x03, 0x80, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1080 ';' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x01, 0xC0, // ### + 0x01, 0xC0, // ### + 0x01, 0xC0, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x03, 0x80, // ### + 0x03, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x04, 0x00, // # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1120 '<' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x30, // ## + 0x00, 0xF0, // #### + 0x03, 0xC0, // #### + 0x07, 0x00, // ### + 0x1C, 0x00, // ### + 0x78, 0x00, // #### + 0x1C, 0x00, // ### + 0x07, 0x00, // ### + 0x03, 0xC0, // #### + 0x00, 0xF0, // #### + 0x00, 0x30, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1160 '=' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x7F, 0xF0, // ########### + 0x7F, 0xF0, // ########### + 0x00, 0x00, // + 0x00, 0x00, // + 0x7F, 0xF0, // ########### + 0x7F, 0xF0, // ########### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1200 '>' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x30, 0x00, // ## + 0x3C, 0x00, // #### + 0x0F, 0x00, // #### + 0x03, 0x80, // ### + 0x00, 0xE0, // ### + 0x00, 0x78, // #### + 0x00, 0xE0, // ### + 0x03, 0x80, // ### + 0x0F, 0x00, // #### + 0x3C, 0x00, // #### + 0x30, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1240 '?' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x0F, 0x80, // ##### + 0x1F, 0xC0, // ####### + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x00, 0x60, // ## + 0x01, 0xC0, // ### + 0x03, 0x80, // ### + 0x03, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1280 '@' (14 pixels wide) + 0x00, 0x00, // + 0x03, 0x80, // ### + 0x0C, 0x80, // ## # + 0x08, 0x40, // # # + 0x10, 0x40, // # # + 0x10, 0x40, // # # + 0x11, 0xC0, // # ### + 0x12, 0x40, // # # # + 0x12, 0x40, // # # # + 0x12, 0x40, // # # # + 0x11, 0xC0, // # ### + 0x10, 0x00, // # + 0x08, 0x00, // # + 0x08, 0x40, // # # + 0x07, 0x80, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1320 'A' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0x80, // ###### + 0x1F, 0x80, // ###### + 0x03, 0x80, // ### + 0x06, 0xC0, // ## ## + 0x06, 0xC0, // ## ## + 0x0C, 0xC0, // ## ## + 0x0C, 0x60, // ## ## + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x30, 0x30, // ## ## + 0x78, 0x78, // #### #### + 0x78, 0x78, // #### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1360 'B' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0x80, // ####### + 0x3F, 0xC0, // ######## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0xE0, // ## ### + 0x1F, 0xC0, // ####### + 0x1F, 0xE0, // ######## + 0x18, 0x70, // ## ### + 0x18, 0x30, // ## ## + 0x18, 0x30, // ## ## + 0x3F, 0xF0, // ########## + 0x3F, 0xE0, // ######### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1400 'C' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0xB0, // #### ## + 0x0F, 0xF0, // ######## + 0x1C, 0x70, // ### ### + 0x38, 0x30, // ### ## + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x38, 0x30, // ### ## + 0x1C, 0x70, // ### ### + 0x0F, 0xE0, // ####### + 0x07, 0xC0, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1440 'D' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7F, 0x80, // ######## + 0x7F, 0xC0, // ######### + 0x30, 0xE0, // ## ### + 0x30, 0x70, // ## ### + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x70, // ## ### + 0x30, 0xE0, // ## ### + 0x7F, 0xC0, // ######### + 0x7F, 0x80, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1480 'E' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0xF0, // ########## + 0x3F, 0xF0, // ########## + 0x18, 0x30, // ## ## + 0x18, 0x30, // ## ## + 0x19, 0x80, // ## ## + 0x1F, 0x80, // ###### + 0x1F, 0x80, // ###### + 0x19, 0x80, // ## ## + 0x18, 0x30, // ## ## + 0x18, 0x30, // ## ## + 0x3F, 0xF0, // ########## + 0x3F, 0xF0, // ########## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1520 'F' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0xF0, // ########## + 0x3F, 0xF0, // ########## + 0x18, 0x30, // ## ## + 0x18, 0x30, // ## ## + 0x19, 0x80, // ## ## + 0x1F, 0x80, // ###### + 0x1F, 0x80, // ###### + 0x19, 0x80, // ## ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x3F, 0x00, // ###### + 0x3F, 0x00, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1560 'G' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0xB0, // #### ## + 0x1F, 0xF0, // ######### + 0x18, 0x70, // ## ### + 0x30, 0x30, // ## ## + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x31, 0xF8, // ## ###### + 0x31, 0xF8, // ## ###### + 0x30, 0x30, // ## ## + 0x18, 0x30, // ## ## + 0x1F, 0xF0, // ######### + 0x07, 0xC0, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1600 'H' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3C, 0xF0, // #### #### + 0x3C, 0xF0, // #### #### + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x3C, 0xF0, // #### #### + 0x3C, 0xF0, // #### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1640 'I' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1680 'J' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x03, 0xF8, // ####### + 0x03, 0xF8, // ####### + 0x00, 0x60, // ## + 0x00, 0x60, // ## + 0x00, 0x60, // ## + 0x00, 0x60, // ## + 0x30, 0x60, // ## ## + 0x30, 0x60, // ## ## + 0x30, 0x60, // ## ## + 0x30, 0xE0, // ## ### + 0x3F, 0xC0, // ######## + 0x0F, 0x80, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1720 'K' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3E, 0xF8, // ##### ##### + 0x3E, 0xF8, // ##### ##### + 0x18, 0xE0, // ## ### + 0x19, 0x80, // ## ## + 0x1B, 0x00, // ## ## + 0x1F, 0x00, // ##### + 0x1D, 0x80, // ### ## + 0x18, 0xC0, // ## ## + 0x18, 0xC0, // ## ## + 0x18, 0x60, // ## ## + 0x3E, 0x78, // ##### #### + 0x3E, 0x38, // ##### ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1760 'L' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0x00, // ###### + 0x3F, 0x00, // ###### + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x30, // ## ## + 0x0C, 0x30, // ## ## + 0x0C, 0x30, // ## ## + 0x3F, 0xF0, // ########## + 0x3F, 0xF0, // ########## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1800 'M' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x78, 0x78, // #### #### + 0x78, 0x78, // #### #### + 0x38, 0x70, // ### ### + 0x3C, 0xF0, // #### #### + 0x34, 0xB0, // ## # # ## + 0x37, 0xB0, // ## #### ## + 0x37, 0xB0, // ## #### ## + 0x33, 0x30, // ## ## ## + 0x33, 0x30, // ## ## ## + 0x30, 0x30, // ## ## + 0x7C, 0xF8, // ##### ##### + 0x7C, 0xF8, // ##### ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1840 'N' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x39, 0xF0, // ### ##### + 0x3D, 0xF0, // #### ##### + 0x1C, 0x60, // ### ## + 0x1E, 0x60, // #### ## + 0x1E, 0x60, // #### ## + 0x1B, 0x60, // ## ## ## + 0x1B, 0x60, // ## ## ## + 0x19, 0xE0, // ## #### + 0x19, 0xE0, // ## #### + 0x18, 0xE0, // ## ### + 0x3E, 0xE0, // ##### ### + 0x3E, 0x60, // ##### ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1880 'O' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0x80, // #### + 0x0F, 0xC0, // ###### + 0x1C, 0xE0, // ### ### + 0x38, 0x70, // ### ### + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x38, 0x70, // ### ### + 0x1C, 0xE0, // ### ### + 0x0F, 0xC0, // ###### + 0x07, 0x80, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1920 'P' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0xC0, // ######## + 0x3F, 0xE0, // ######### + 0x18, 0x70, // ## ### + 0x18, 0x30, // ## ## + 0x18, 0x30, // ## ## + 0x18, 0x70, // ## ### + 0x1F, 0xE0, // ######## + 0x1F, 0xC0, // ####### + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x3F, 0x00, // ###### + 0x3F, 0x00, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1960 'Q' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0x80, // #### + 0x0F, 0xC0, // ###### + 0x1C, 0xE0, // ### ### + 0x38, 0x70, // ### ### + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x38, 0x70, // ### ### + 0x1C, 0xE0, // ### ### + 0x0F, 0xC0, // ###### + 0x07, 0x80, // #### + 0x07, 0xB0, // #### ## + 0x0F, 0xF0, // ######## + 0x0C, 0xE0, // ## ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2000 'R' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0xC0, // ######## + 0x3F, 0xE0, // ######### + 0x18, 0x70, // ## ### + 0x18, 0x30, // ## ## + 0x18, 0x70, // ## ### + 0x1F, 0xE0, // ######## + 0x1F, 0xC0, // ####### + 0x18, 0xE0, // ## ### + 0x18, 0x60, // ## ## + 0x18, 0x70, // ## ### + 0x3E, 0x38, // ##### ### + 0x3E, 0x18, // ##### ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2040 'S' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x0F, 0xB0, // ##### ## + 0x1F, 0xF0, // ######### + 0x38, 0x70, // ### ### + 0x30, 0x30, // ## ## + 0x38, 0x00, // ### + 0x1F, 0x80, // ###### + 0x07, 0xE0, // ###### + 0x00, 0x70, // ### + 0x30, 0x30, // ## ## + 0x38, 0x70, // ### ### + 0x3F, 0xE0, // ######### + 0x37, 0xC0, // ## ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2080 'T' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0xF0, // ########## + 0x3F, 0xF0, // ########## + 0x33, 0x30, // ## ## ## + 0x33, 0x30, // ## ## ## + 0x33, 0x30, // ## ## ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x0F, 0xC0, // ###### + 0x0F, 0xC0, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2120 'U' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3C, 0xF0, // #### #### + 0x3C, 0xF0, // #### #### + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x1C, 0xE0, // ### ### + 0x0F, 0xC0, // ###### + 0x07, 0x80, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2160 'V' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x78, 0xF0, // #### #### + 0x78, 0xF0, // #### #### + 0x30, 0x60, // ## ## + 0x30, 0x60, // ## ## + 0x18, 0xC0, // ## ## + 0x18, 0xC0, // ## ## + 0x0D, 0x80, // ## ## + 0x0D, 0x80, // ## ## + 0x0D, 0x80, // ## ## + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2200 'W' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7C, 0x7C, // ##### ##### + 0x7C, 0x7C, // ##### ##### + 0x30, 0x18, // ## ## + 0x33, 0x98, // ## ### ## + 0x33, 0x98, // ## ### ## + 0x33, 0x98, // ## ### ## + 0x36, 0xD8, // ## ## ## ## + 0x16, 0xD0, // # ## ## # + 0x1C, 0x70, // ### ### + 0x1C, 0x70, // ### ### + 0x1C, 0x70, // ### ### + 0x18, 0x30, // ## ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2240 'X' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x78, 0xF0, // #### #### + 0x78, 0xF0, // #### #### + 0x30, 0x60, // ## ## + 0x18, 0xC0, // ## ## + 0x0D, 0x80, // ## ## + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x0D, 0x80, // ## ## + 0x18, 0xC0, // ## ## + 0x30, 0x60, // ## ## + 0x78, 0xF0, // #### #### + 0x78, 0xF0, // #### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2280 'Y' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3C, 0xF0, // #### #### + 0x3C, 0xF0, // #### #### + 0x18, 0x60, // ## ## + 0x0C, 0xC0, // ## ## + 0x07, 0x80, // #### + 0x07, 0x80, // #### + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x0F, 0xC0, // ###### + 0x0F, 0xC0, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2320 'Z' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x18, 0x60, // ## ## + 0x18, 0xC0, // ## ## + 0x01, 0x80, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x06, 0x00, // ## + 0x0C, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2360 '[' (14 pixels wide) + 0x00, 0x00, // + 0x03, 0xC0, // #### + 0x03, 0xC0, // #### + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0xC0, // #### + 0x03, 0xC0, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2400 '\' (14 pixels wide) + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x00, 0x60, // ## + 0x00, 0x60, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2440 ']' (14 pixels wide) + 0x00, 0x00, // + 0x0F, 0x00, // #### + 0x0F, 0x00, // #### + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x0F, 0x00, // #### + 0x0F, 0x00, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2480 '^' (14 pixels wide) + 0x00, 0x00, // + 0x02, 0x00, // # + 0x07, 0x00, // ### + 0x0D, 0x80, // ## ## + 0x18, 0xC0, // ## ## + 0x30, 0x60, // ## ## + 0x20, 0x20, // # # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2520 '_' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0xFF, 0xFC, // ############## + 0xFF, 0xFC, // ############## + + // @2560 '`' (14 pixels wide) + 0x00, 0x00, // + 0x04, 0x00, // # + 0x03, 0x00, // ## + 0x00, 0x80, // # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2600 'a' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x0F, 0xC0, // ###### + 0x1F, 0xE0, // ######## + 0x00, 0x60, // ## + 0x0F, 0xE0, // ####### + 0x1F, 0xE0, // ######## + 0x38, 0x60, // ### ## + 0x30, 0xE0, // ## ### + 0x3F, 0xF0, // ########## + 0x1F, 0x70, // ##### ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2640 'b' (14 pixels wide) + 0x00, 0x00, // + 0x70, 0x00, // ### + 0x70, 0x00, // ### + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x37, 0x80, // ## #### + 0x3F, 0xE0, // ######### + 0x38, 0x60, // ### ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x38, 0x60, // ### ## + 0x7F, 0xE0, // ########## + 0x77, 0x80, // ### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2680 'c' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0xB0, // #### ## + 0x1F, 0xF0, // ######### + 0x18, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x38, 0x30, // ### ## + 0x1F, 0xF0, // ######### + 0x0F, 0xC0, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2720 'd' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x70, // ### + 0x00, 0x70, // ### + 0x00, 0x30, // ## + 0x00, 0x30, // ## + 0x07, 0xB0, // #### ## + 0x1F, 0xF0, // ######### + 0x18, 0x70, // ## ### + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x38, 0x70, // ### ### + 0x1F, 0xF8, // ########## + 0x07, 0xB8, // #### ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2760 'e' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0x80, // #### + 0x1F, 0xE0, // ######## + 0x18, 0x60, // ## ## + 0x3F, 0xF0, // ########## + 0x3F, 0xF0, // ########## + 0x30, 0x00, // ## + 0x18, 0x30, // ## ## + 0x1F, 0xF0, // ######### + 0x07, 0xC0, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2800 'f' (14 pixels wide) + 0x00, 0x00, // + 0x03, 0xF0, // ###### + 0x07, 0xF0, // ####### + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2840 'g' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0xB8, // #### ### + 0x1F, 0xF8, // ########## + 0x18, 0x70, // ## ### + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x18, 0x70, // ## ### + 0x1F, 0xF0, // ######### + 0x07, 0xB0, // #### ## + 0x00, 0x30, // ## + 0x00, 0x70, // ### + 0x0F, 0xE0, // ####### + 0x0F, 0xC0, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + + // @2880 'h' (14 pixels wide) + 0x00, 0x00, // + 0x38, 0x00, // ### + 0x38, 0x00, // ### + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x1B, 0xC0, // ## #### + 0x1F, 0xE0, // ######## + 0x1C, 0x60, // ### ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x3C, 0xF0, // #### #### + 0x3C, 0xF0, // #### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2920 'i' (14 pixels wide) + 0x00, 0x00, // + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0x00, // ##### + 0x1F, 0x00, // ##### + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2960 'j' (14 pixels wide) + 0x00, 0x00, // + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0xC0, // ####### + 0x1F, 0xC0, // ####### + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x01, 0xC0, // ### + 0x3F, 0x80, // ####### + 0x3F, 0x00, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + + // @3000 'k' (14 pixels wide) + 0x00, 0x00, // + 0x38, 0x00, // ### + 0x38, 0x00, // ### + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x1B, 0xE0, // ## ##### + 0x1B, 0xE0, // ## ##### + 0x1B, 0x00, // ## ## + 0x1E, 0x00, // #### + 0x1E, 0x00, // #### + 0x1B, 0x00, // ## ## + 0x19, 0x80, // ## ## + 0x39, 0xF0, // ### ##### + 0x39, 0xF0, // ### ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3040 'l' (14 pixels wide) + 0x00, 0x00, // + 0x1F, 0x00, // ##### + 0x1F, 0x00, // ##### + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3080 'm' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x7E, 0xE0, // ###### ### + 0x7F, 0xF0, // ########### + 0x33, 0x30, // ## ## ## + 0x33, 0x30, // ## ## ## + 0x33, 0x30, // ## ## ## + 0x33, 0x30, // ## ## ## + 0x33, 0x30, // ## ## ## + 0x7B, 0xB8, // #### ### ### + 0x7B, 0xB8, // #### ### ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3120 'n' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x3B, 0xC0, // ### #### + 0x3F, 0xE0, // ######### + 0x1C, 0x60, // ### ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x3C, 0xF0, // #### #### + 0x3C, 0xF0, // #### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3160 'o' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0x80, // #### + 0x1F, 0xE0, // ######## + 0x18, 0x60, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x18, 0x60, // ## ## + 0x1F, 0xE0, // ######## + 0x07, 0x80, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3200 'p' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x77, 0x80, // ### #### + 0x7F, 0xE0, // ########## + 0x38, 0x60, // ### ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x38, 0x60, // ### ## + 0x3F, 0xE0, // ######### + 0x37, 0x80, // ## #### + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x7C, 0x00, // ##### + 0x7C, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + + // @3240 'q' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0xB8, // #### ### + 0x1F, 0xF8, // ########## + 0x18, 0x70, // ## ### + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x18, 0x70, // ## ### + 0x1F, 0xF0, // ######### + 0x07, 0xB0, // #### ## + 0x00, 0x30, // ## + 0x00, 0x30, // ## + 0x00, 0xF8, // ##### + 0x00, 0xF8, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + + // @3280 'r' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x3C, 0xE0, // #### ### + 0x3D, 0xF0, // #### ##### + 0x0F, 0x30, // #### ## + 0x0E, 0x00, // ### + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x3F, 0xC0, // ######## + 0x3F, 0xC0, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3320 's' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0xE0, // ###### + 0x1F, 0xE0, // ######## + 0x18, 0x60, // ## ## + 0x1E, 0x00, // #### + 0x0F, 0xC0, // ###### + 0x01, 0xE0, // #### + 0x18, 0x60, // ## ## + 0x1F, 0xE0, // ######## + 0x1F, 0x80, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3360 't' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x3F, 0xE0, // ######### + 0x3F, 0xE0, // ######### + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x30, // ## ## + 0x0F, 0xF0, // ######## + 0x07, 0xC0, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3400 'u' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x38, 0xE0, // ### ### + 0x38, 0xE0, // ### ### + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0xE0, // ## ### + 0x1F, 0xF0, // ######### + 0x0F, 0x70, // #### ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3440 'v' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x78, 0xF0, // #### #### + 0x78, 0xF0, // #### #### + 0x30, 0x60, // ## ## + 0x18, 0xC0, // ## ## + 0x18, 0xC0, // ## ## + 0x0D, 0x80, // ## ## + 0x0D, 0x80, // ## ## + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3480 'w' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x78, 0xF0, // #### #### + 0x78, 0xF0, // #### #### + 0x32, 0x60, // ## # ## + 0x32, 0x60, // ## # ## + 0x37, 0xE0, // ## ###### + 0x1D, 0xC0, // ### ### + 0x1D, 0xC0, // ### ### + 0x18, 0xC0, // ## ## + 0x18, 0xC0, // ## ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3520 'x' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x3C, 0xF0, // #### #### + 0x3C, 0xF0, // #### #### + 0x0C, 0xC0, // ## ## + 0x07, 0x80, // #### + 0x03, 0x00, // ## + 0x07, 0x80, // #### + 0x0C, 0xC0, // ## ## + 0x3C, 0xF0, // #### #### + 0x3C, 0xF0, // #### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3560 'y' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x78, 0xF0, // #### #### + 0x78, 0xF0, // #### #### + 0x30, 0x60, // ## ## + 0x18, 0xC0, // ## ## + 0x18, 0xC0, // ## ## + 0x0D, 0x80, // ## ## + 0x0F, 0x80, // ##### + 0x07, 0x00, // ### + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x0C, 0x00, // ## + 0x7F, 0x00, // ####### + 0x7F, 0x00, // ####### + 0x00, 0x00, // + 0x00, 0x00, // + + // @3600 'z' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x18, 0xC0, // ## ## + 0x01, 0x80, // ## + 0x03, 0x00, // ## + 0x06, 0x00, // ## + 0x0C, 0x60, // ## ## + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3640 '{' (14 pixels wide) + 0x00, 0x00, // + 0x01, 0xC0, // ### + 0x03, 0xC0, // #### + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x07, 0x00, // ### + 0x0E, 0x00, // ### + 0x07, 0x00, // ### + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0xC0, // #### + 0x01, 0xC0, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3680 '|' (14 pixels wide) + 0x00, 0x00, // + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3720 '}' (14 pixels wide) + 0x00, 0x00, // + 0x1C, 0x00, // ### + 0x1E, 0x00, // #### + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x07, 0x00, // ### + 0x03, 0x80, // ### + 0x07, 0x00, // ### + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x1E, 0x00, // #### + 0x1C, 0x00, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3760 '~' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x0E, 0x00, // ### + 0x3F, 0x30, // ###### ## + 0x33, 0xF0, // ## ###### + 0x01, 0xE0, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // +}; + + +sFONT Font20 = { + Font20_Table, + 14, /* Width */ + 20, /* Height */ +}; + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Software/fab-reader2/components/epd_gfx/Fonts/font24.c b/Software/fab-reader2/components/epd_gfx/Fonts/font24.c new file mode 100644 index 0000000..46be5ad --- /dev/null +++ b/Software/fab-reader2/components/epd_gfx/Fonts/font24.c @@ -0,0 +1,2520 @@ +/** + ****************************************************************************** + * @file font24.c + * @author MCD Application Team + * @version V1.0.0 + * @date 18-February-2014 + * @brief This file provides text font24 for STM32xx-EVAL's LCD driver. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2014 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "fonts.h" + +const uint8_t Font24_Table [] = +{ + // @0 ' ' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @72 '!' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x01, 0x00, 0x00, // # + 0x01, 0x00, 0x00, // # + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @144 '"' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x0E, 0x70, 0x00, // ### ### + 0x0E, 0x70, 0x00, // ### ### + 0x0E, 0x70, 0x00, // ### ### + 0x04, 0x20, 0x00, // # # + 0x04, 0x20, 0x00, // # # + 0x04, 0x20, 0x00, // # # + 0x04, 0x20, 0x00, // # # + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @216 '#' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x06, 0x60, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x3F, 0xF8, 0x00, // ########### + 0x3F, 0xF8, 0x00, // ########### + 0x06, 0x60, 0x00, // ## ## + 0x0C, 0xC0, 0x00, // ## ## + 0x3F, 0xF8, 0x00, // ########### + 0x3F, 0xF8, 0x00, // ########### + 0x0C, 0xC0, 0x00, // ## ## + 0x0C, 0xC0, 0x00, // ## ## + 0x0C, 0xC0, 0x00, // ## ## + 0x0C, 0xC0, 0x00, // ## ## + 0x0C, 0xC0, 0x00, // ## ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @288 '$' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x07, 0xB0, 0x00, // #### ## + 0x0F, 0xF0, 0x00, // ######## + 0x18, 0x70, 0x00, // ## ### + 0x18, 0x70, 0x00, // ## ### + 0x1C, 0x00, 0x00, // ### + 0x0F, 0x80, 0x00, // ##### + 0x07, 0xE0, 0x00, // ###### + 0x00, 0xF0, 0x00, // #### + 0x18, 0x30, 0x00, // ## ## + 0x1C, 0x30, 0x00, // ### ## + 0x1C, 0x70, 0x00, // ### ### + 0x1F, 0xE0, 0x00, // ######## + 0x1B, 0xC0, 0x00, // ## #### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @360 '%' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0x80, 0x00, // #### + 0x0F, 0xC0, 0x00, // ###### + 0x1C, 0xE0, 0x00, // ### ### + 0x18, 0x60, 0x00, // ## ## + 0x18, 0x60, 0x00, // ## ## + 0x1C, 0xE0, 0x00, // ### ### + 0x0F, 0xF8, 0x00, // ######### + 0x07, 0xE0, 0x00, // ###### + 0x1F, 0xF0, 0x00, // ######### + 0x07, 0x38, 0x00, // ### ### + 0x06, 0x18, 0x00, // ## ## + 0x06, 0x18, 0x00, // ## ## + 0x07, 0x38, 0x00, // ### ### + 0x03, 0xF0, 0x00, // ###### + 0x01, 0xE0, 0x00, // #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @432 '&' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xF0, 0x00, // ###### + 0x07, 0xF0, 0x00, // ####### + 0x0C, 0x60, 0x00, // ## ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x07, 0x00, 0x00, // ### + 0x0F, 0x9C, 0x00, // ##### ### + 0x1D, 0xFC, 0x00, // ### ####### + 0x18, 0xF0, 0x00, // ## #### + 0x18, 0x70, 0x00, // ## ### + 0x0F, 0xFC, 0x00, // ########## + 0x07, 0xDC, 0x00, // ##### ### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @504 ''' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x01, 0x00, 0x00, // # + 0x01, 0x00, 0x00, // # + 0x01, 0x00, 0x00, // # + 0x01, 0x00, 0x00, // # + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @576 '(' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x18, 0x00, // ## + 0x00, 0x38, 0x00, // ### + 0x00, 0x70, 0x00, // ### + 0x00, 0xF0, 0x00, // #### + 0x00, 0xE0, 0x00, // ### + 0x00, 0xE0, 0x00, // ### + 0x01, 0xC0, 0x00, // ### + 0x01, 0xC0, 0x00, // ### + 0x01, 0xC0, 0x00, // ### + 0x01, 0xC0, 0x00, // ### + 0x01, 0xC0, 0x00, // ### + 0x01, 0xC0, 0x00, // ### + 0x00, 0xE0, 0x00, // ### + 0x00, 0xE0, 0x00, // ### + 0x00, 0x70, 0x00, // ### + 0x00, 0x70, 0x00, // ### + 0x00, 0x38, 0x00, // ### + 0x00, 0x18, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @648 ')' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x18, 0x00, 0x00, // ## + 0x1C, 0x00, 0x00, // ### + 0x0E, 0x00, 0x00, // ### + 0x0E, 0x00, 0x00, // ### + 0x07, 0x00, 0x00, // ### + 0x07, 0x00, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x07, 0x00, 0x00, // ### + 0x07, 0x00, 0x00, // ### + 0x0F, 0x00, 0x00, // #### + 0x0E, 0x00, 0x00, // ### + 0x1C, 0x00, 0x00, // ### + 0x18, 0x00, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @720 '*' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x1D, 0xB8, 0x00, // ### ## ### + 0x1F, 0xF8, 0x00, // ########## + 0x07, 0xE0, 0x00, // ###### + 0x03, 0xC0, 0x00, // #### + 0x03, 0xC0, 0x00, // #### + 0x06, 0x60, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @792 '+' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x3F, 0xFC, 0x00, // ############ + 0x3F, 0xFC, 0x00, // ############ + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @864 ',' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0xE0, 0x00, // ### + 0x00, 0xC0, 0x00, // ## + 0x01, 0xC0, 0x00, // ### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x03, 0x00, 0x00, // ## + 0x03, 0x00, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @936 '-' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x1F, 0xF8, 0x00, // ########## + 0x1F, 0xF8, 0x00, // ########## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1008 '.' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xC0, 0x00, // #### + 0x03, 0xC0, 0x00, // #### + 0x03, 0xC0, 0x00, // #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1080 '/' (17 pixels wide) + 0x00, 0x18, 0x00, // ## + 0x00, 0x18, 0x00, // ## + 0x00, 0x38, 0x00, // ### + 0x00, 0x30, 0x00, // ## + 0x00, 0x70, 0x00, // ### + 0x00, 0x60, 0x00, // ## + 0x00, 0x60, 0x00, // ## + 0x00, 0xC0, 0x00, // ## + 0x00, 0xC0, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x03, 0x00, 0x00, // ## + 0x03, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x0E, 0x00, 0x00, // ### + 0x0C, 0x00, 0x00, // ## + 0x1C, 0x00, 0x00, // ### + 0x18, 0x00, 0x00, // ## + 0x18, 0x00, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1152 '0' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xC0, 0x00, // #### + 0x07, 0xE0, 0x00, // ###### + 0x0C, 0x30, 0x00, // ## ## + 0x0C, 0x30, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x0C, 0x30, 0x00, // ## ## + 0x0C, 0x30, 0x00, // ## ## + 0x07, 0xE0, 0x00, // ###### + 0x03, 0xC0, 0x00, // #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1224 '1' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x80, 0x00, // # + 0x07, 0x80, 0x00, // #### + 0x1F, 0x80, 0x00, // ###### + 0x1D, 0x80, 0x00, // ### ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x1F, 0xF8, 0x00, // ########## + 0x1F, 0xF8, 0x00, // ########## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1296 '2' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0xC0, 0x00, // ##### + 0x1F, 0xF0, 0x00, // ######### + 0x38, 0x30, 0x00, // ### ## + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x00, 0x18, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x60, 0x00, // ## + 0x01, 0xC0, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x06, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x18, 0x00, 0x00, // ## + 0x3F, 0xF8, 0x00, // ########### + 0x3F, 0xF8, 0x00, // ########### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1368 '3' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xC0, 0x00, // #### + 0x0F, 0xE0, 0x00, // ####### + 0x0C, 0x70, 0x00, // ## ### + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x60, 0x00, // ## + 0x03, 0xC0, 0x00, // #### + 0x03, 0xE0, 0x00, // ##### + 0x00, 0x70, 0x00, // ### + 0x00, 0x18, 0x00, // ## + 0x00, 0x18, 0x00, // ## + 0x00, 0x18, 0x00, // ## + 0x18, 0x38, 0x00, // ## ### + 0x1F, 0xF0, 0x00, // ######### + 0x0F, 0xC0, 0x00, // ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1440 '4' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0xE0, 0x00, // ### + 0x01, 0xE0, 0x00, // #### + 0x01, 0xE0, 0x00, // #### + 0x03, 0x60, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x0C, 0x60, 0x00, // ## ## + 0x0C, 0x60, 0x00, // ## ## + 0x18, 0x60, 0x00, // ## ## + 0x30, 0x60, 0x00, // ## ## + 0x3F, 0xF8, 0x00, // ########### + 0x3F, 0xF8, 0x00, // ########### + 0x00, 0x60, 0x00, // ## + 0x03, 0xF8, 0x00, // ####### + 0x03, 0xF8, 0x00, // ####### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1512 '5' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x1F, 0xF0, 0x00, // ######### + 0x1F, 0xF0, 0x00, // ######### + 0x18, 0x00, 0x00, // ## + 0x18, 0x00, 0x00, // ## + 0x18, 0x00, 0x00, // ## + 0x1B, 0xC0, 0x00, // ## #### + 0x1F, 0xF0, 0x00, // ######### + 0x1C, 0x30, 0x00, // ### ## + 0x00, 0x18, 0x00, // ## + 0x00, 0x18, 0x00, // ## + 0x00, 0x18, 0x00, // ## + 0x00, 0x18, 0x00, // ## + 0x30, 0x30, 0x00, // ## ## + 0x3F, 0xF0, 0x00, // ########## + 0x0F, 0xC0, 0x00, // ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1584 '6' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0xF8, 0x00, // ##### + 0x03, 0xF8, 0x00, // ####### + 0x07, 0x00, 0x00, // ### + 0x0E, 0x00, 0x00, // ### + 0x0C, 0x00, 0x00, // ## + 0x18, 0x00, 0x00, // ## + 0x1B, 0xC0, 0x00, // ## #### + 0x1F, 0xF0, 0x00, // ######### + 0x1C, 0x30, 0x00, // ### ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x0C, 0x38, 0x00, // ## ### + 0x0F, 0xF0, 0x00, // ######## + 0x03, 0xE0, 0x00, // ##### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1656 '7' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x1F, 0xF8, 0x00, // ########## + 0x1F, 0xF8, 0x00, // ########## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x38, 0x00, // ## ### + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x70, 0x00, // ### + 0x00, 0x60, 0x00, // ## + 0x00, 0x60, 0x00, // ## + 0x00, 0xE0, 0x00, // ### + 0x00, 0xC0, 0x00, // ## + 0x00, 0xC0, 0x00, // ## + 0x01, 0xC0, 0x00, // ### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1728 '8' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0xE0, 0x00, // ###### + 0x0F, 0xF0, 0x00, // ######## + 0x1C, 0x38, 0x00, // ### ### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x0C, 0x30, 0x00, // ## ## + 0x07, 0xE0, 0x00, // ###### + 0x07, 0xE0, 0x00, // ###### + 0x0C, 0x30, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x1C, 0x38, 0x00, // ### ### + 0x0F, 0xF0, 0x00, // ######## + 0x07, 0xE0, 0x00, // ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1800 '9' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0xC0, 0x00, // ##### + 0x0F, 0xF0, 0x00, // ######## + 0x1C, 0x30, 0x00, // ### ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x0C, 0x38, 0x00, // ## ### + 0x0F, 0xF8, 0x00, // ######### + 0x03, 0xD8, 0x00, // #### ## + 0x00, 0x18, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x70, 0x00, // ### + 0x00, 0xE0, 0x00, // ### + 0x1F, 0xC0, 0x00, // ####### + 0x1F, 0x00, 0x00, // ##### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1872 ':' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xC0, 0x00, // #### + 0x03, 0xC0, 0x00, // #### + 0x03, 0xC0, 0x00, // #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xC0, 0x00, // #### + 0x03, 0xC0, 0x00, // #### + 0x03, 0xC0, 0x00, // #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1944 ';' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0xF0, 0x00, // #### + 0x00, 0xF0, 0x00, // #### + 0x00, 0xF0, 0x00, // #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0xE0, 0x00, // ### + 0x01, 0xC0, 0x00, // ### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x03, 0x00, 0x00, // ## + 0x02, 0x00, 0x00, // # + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2016 '<' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x1C, 0x00, // ### + 0x00, 0x3C, 0x00, // #### + 0x00, 0xF0, 0x00, // #### + 0x03, 0xC0, 0x00, // #### + 0x0F, 0x00, 0x00, // #### + 0x3C, 0x00, 0x00, // #### + 0xF0, 0x00, 0x00, // #### + 0x3C, 0x00, 0x00, // #### + 0x0F, 0x00, 0x00, // #### + 0x03, 0xC0, 0x00, // #### + 0x00, 0xF0, 0x00, // #### + 0x00, 0x3C, 0x00, // #### + 0x00, 0x1C, 0x00, // ### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2088 '=' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7F, 0xFC, 0x00, // ############# + 0x7F, 0xFC, 0x00, // ############# + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7F, 0xFC, 0x00, // ############# + 0x7F, 0xFC, 0x00, // ############# + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2160 '>' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x70, 0x00, 0x00, // ### + 0x78, 0x00, 0x00, // #### + 0x1E, 0x00, 0x00, // #### + 0x07, 0x80, 0x00, // #### + 0x01, 0xE0, 0x00, // #### + 0x00, 0x78, 0x00, // #### + 0x00, 0x1E, 0x00, // #### + 0x00, 0x78, 0x00, // #### + 0x01, 0xE0, 0x00, // #### + 0x07, 0x80, 0x00, // #### + 0x1E, 0x00, 0x00, // #### + 0x78, 0x00, 0x00, // #### + 0x70, 0x00, 0x00, // ### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2232 '?' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0xC0, 0x00, // ##### + 0x0F, 0xE0, 0x00, // ####### + 0x18, 0x70, 0x00, // ## ### + 0x18, 0x30, 0x00, // ## ## + 0x18, 0x30, 0x00, // ## ## + 0x00, 0x70, 0x00, // ### + 0x00, 0xE0, 0x00, // ### + 0x03, 0xC0, 0x00, // #### + 0x03, 0x80, 0x00, // ### + 0x03, 0x00, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0x00, 0x00, // ### + 0x07, 0x00, 0x00, // ### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2304 '@' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xE0, 0x00, // ##### + 0x07, 0xF0, 0x00, // ####### + 0x0E, 0x38, 0x00, // ### ### + 0x0C, 0x18, 0x00, // ## ## + 0x18, 0x78, 0x00, // ## #### + 0x18, 0xF8, 0x00, // ## ##### + 0x19, 0xD8, 0x00, // ## ### ## + 0x19, 0x98, 0x00, // ## ## ## + 0x19, 0x98, 0x00, // ## ## ## + 0x19, 0x98, 0x00, // ## ## ## + 0x18, 0xF8, 0x00, // ## ##### + 0x18, 0x78, 0x00, // ## #### + 0x18, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0E, 0x18, 0x00, // ### ## + 0x07, 0xF8, 0x00, // ######## + 0x03, 0xE0, 0x00, // ##### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2376 'A' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x1F, 0x80, 0x00, // ###### + 0x1F, 0xC0, 0x00, // ####### + 0x01, 0xC0, 0x00, // ### + 0x03, 0x60, 0x00, // ## ## + 0x03, 0x60, 0x00, // ## ## + 0x06, 0x30, 0x00, // ## ## + 0x06, 0x30, 0x00, // ## ## + 0x0C, 0x30, 0x00, // ## ## + 0x0F, 0xF8, 0x00, // ######### + 0x1F, 0xF8, 0x00, // ########## + 0x18, 0x0C, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0xFC, 0x7F, 0x00, // ###### ####### + 0xFC, 0x7F, 0x00, // ###### ####### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2448 'B' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7F, 0xE0, 0x00, // ########## + 0x7F, 0xF0, 0x00, // ########### + 0x18, 0x38, 0x00, // ## ### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x38, 0x00, // ## ### + 0x1F, 0xF0, 0x00, // ######### + 0x1F, 0xF8, 0x00, // ########## + 0x18, 0x1C, 0x00, // ## ### + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x7F, 0xF8, 0x00, // ############ + 0x7F, 0xF0, 0x00, // ########### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2520 'C' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xEC, 0x00, // ##### ## + 0x0F, 0xFC, 0x00, // ########## + 0x1C, 0x1C, 0x00, // ### ### + 0x18, 0x0C, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0x30, 0x00, 0x00, // ## + 0x30, 0x00, 0x00, // ## + 0x30, 0x00, 0x00, // ## + 0x30, 0x00, 0x00, // ## + 0x30, 0x00, 0x00, // ## + 0x18, 0x0C, 0x00, // ## ## + 0x1C, 0x1C, 0x00, // ### ### + 0x0F, 0xF8, 0x00, // ######### + 0x03, 0xF0, 0x00, // ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2592 'D' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7F, 0xC0, 0x00, // ######### + 0x7F, 0xF0, 0x00, // ########### + 0x18, 0x38, 0x00, // ## ### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x38, 0x00, // ## ### + 0x7F, 0xF0, 0x00, // ########### + 0x7F, 0xE0, 0x00, // ########## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2664 'E' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7F, 0xF8, 0x00, // ############ + 0x7F, 0xF8, 0x00, // ############ + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x19, 0x98, 0x00, // ## ## ## + 0x19, 0x80, 0x00, // ## ## + 0x1F, 0x80, 0x00, // ###### + 0x1F, 0x80, 0x00, // ###### + 0x19, 0x80, 0x00, // ## ## + 0x19, 0x98, 0x00, // ## ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x7F, 0xF8, 0x00, // ############ + 0x7F, 0xF8, 0x00, // ############ + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2736 'F' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x3F, 0xFC, 0x00, // ############ + 0x3F, 0xFC, 0x00, // ############ + 0x0C, 0x0C, 0x00, // ## ## + 0x0C, 0x0C, 0x00, // ## ## + 0x0C, 0xCC, 0x00, // ## ## ## + 0x0C, 0xC0, 0x00, // ## ## + 0x0F, 0xC0, 0x00, // ###### + 0x0F, 0xC0, 0x00, // ###### + 0x0C, 0xC0, 0x00, // ## ## + 0x0C, 0xC0, 0x00, // ## ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x3F, 0xC0, 0x00, // ######## + 0x3F, 0xC0, 0x00, // ######## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2808 'G' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xEC, 0x00, // ##### ## + 0x0F, 0xFC, 0x00, // ########## + 0x1C, 0x1C, 0x00, // ### ### + 0x18, 0x0C, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0x30, 0x00, 0x00, // ## + 0x30, 0x00, 0x00, // ## + 0x30, 0xFE, 0x00, // ## ####### + 0x30, 0xFE, 0x00, // ## ####### + 0x30, 0x0C, 0x00, // ## ## + 0x38, 0x0C, 0x00, // ### ## + 0x1C, 0x1C, 0x00, // ### ### + 0x0F, 0xFC, 0x00, // ########## + 0x03, 0xF0, 0x00, // ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2880 'H' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7E, 0x7E, 0x00, // ###### ###### + 0x7E, 0x7E, 0x00, // ###### ###### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x1F, 0xF8, 0x00, // ########## + 0x1F, 0xF8, 0x00, // ########## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x7E, 0x7E, 0x00, // ###### ###### + 0x7E, 0x7E, 0x00, // ###### ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2952 'I' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x1F, 0xF8, 0x00, // ########## + 0x1F, 0xF8, 0x00, // ########## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x1F, 0xF8, 0x00, // ########## + 0x1F, 0xF8, 0x00, // ########## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3024 'J' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0xFE, 0x00, // ########## + 0x07, 0xFE, 0x00, // ########## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x30, 0x30, 0x00, // ## ## + 0x30, 0x30, 0x00, // ## ## + 0x30, 0x30, 0x00, // ## ## + 0x30, 0x30, 0x00, // ## ## + 0x30, 0x60, 0x00, // ## ## + 0x3F, 0xE0, 0x00, // ######### + 0x0F, 0x80, 0x00, // ##### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3096 'K' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7F, 0x3E, 0x00, // ####### ##### + 0x7F, 0x3E, 0x00, // ####### ##### + 0x18, 0x30, 0x00, // ## ## + 0x18, 0x60, 0x00, // ## ## + 0x18, 0xC0, 0x00, // ## ## + 0x19, 0x80, 0x00, // ## ## + 0x1B, 0x80, 0x00, // ## ### + 0x1F, 0xC0, 0x00, // ####### + 0x1C, 0xE0, 0x00, // ### ### + 0x18, 0x70, 0x00, // ## ### + 0x18, 0x30, 0x00, // ## ## + 0x18, 0x38, 0x00, // ## ### + 0x7F, 0x1F, 0x00, // ####### ##### + 0x7F, 0x1F, 0x00, // ####### ##### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3168 'L' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7F, 0x80, 0x00, // ######## + 0x7F, 0x80, 0x00, // ######## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x0C, 0x00, // ## ## + 0x0C, 0x0C, 0x00, // ## ## + 0x0C, 0x0C, 0x00, // ## ## + 0x0C, 0x0C, 0x00, // ## ## + 0x7F, 0xFC, 0x00, // ############# + 0x7F, 0xFC, 0x00, // ############# + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3240 'M' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0xF0, 0x0F, 0x00, // #### #### + 0xF8, 0x1F, 0x00, // ##### ##### + 0x38, 0x1C, 0x00, // ### ### + 0x3C, 0x3C, 0x00, // #### #### + 0x3C, 0x3C, 0x00, // #### #### + 0x36, 0x6C, 0x00, // ## ## ## ## + 0x36, 0x6C, 0x00, // ## ## ## ## + 0x33, 0xCC, 0x00, // ## #### ## + 0x33, 0xCC, 0x00, // ## #### ## + 0x31, 0x8C, 0x00, // ## ## ## + 0x30, 0x0C, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0xFE, 0x7F, 0x00, // ####### ####### + 0xFE, 0x7F, 0x00, // ####### ####### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3312 'N' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x78, 0xFE, 0x00, // #### ####### + 0x78, 0xFE, 0x00, // #### ####### + 0x1C, 0x18, 0x00, // ### ## + 0x1E, 0x18, 0x00, // #### ## + 0x1F, 0x18, 0x00, // ##### ## + 0x1B, 0x18, 0x00, // ## ## ## + 0x1B, 0x98, 0x00, // ## ### ## + 0x19, 0xD8, 0x00, // ## ### ## + 0x18, 0xD8, 0x00, // ## ## ## + 0x18, 0xF8, 0x00, // ## ##### + 0x18, 0x78, 0x00, // ## #### + 0x18, 0x38, 0x00, // ## ### + 0x7F, 0x18, 0x00, // ####### ## + 0x7F, 0x18, 0x00, // ####### ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3384 'O' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xC0, 0x00, // #### + 0x0F, 0xF0, 0x00, // ######## + 0x1C, 0x38, 0x00, // ### ### + 0x18, 0x18, 0x00, // ## ## + 0x38, 0x1C, 0x00, // ### ### + 0x30, 0x0C, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0x38, 0x1C, 0x00, // ### ### + 0x18, 0x18, 0x00, // ## ## + 0x1C, 0x38, 0x00, // ### ### + 0x0F, 0xF0, 0x00, // ######## + 0x03, 0xC0, 0x00, // #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3456 'P' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x3F, 0xF0, 0x00, // ########## + 0x3F, 0xF8, 0x00, // ########### + 0x0C, 0x1C, 0x00, // ## ### + 0x0C, 0x0C, 0x00, // ## ## + 0x0C, 0x0C, 0x00, // ## ## + 0x0C, 0x0C, 0x00, // ## ## + 0x0C, 0x18, 0x00, // ## ## + 0x0F, 0xF8, 0x00, // ######### + 0x0F, 0xE0, 0x00, // ####### + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x3F, 0xC0, 0x00, // ######## + 0x3F, 0xC0, 0x00, // ######## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3528 'Q' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xC0, 0x00, // #### + 0x0F, 0xF0, 0x00, // ######## + 0x1C, 0x38, 0x00, // ### ### + 0x18, 0x18, 0x00, // ## ## + 0x38, 0x1C, 0x00, // ### ### + 0x30, 0x0C, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0x38, 0x1C, 0x00, // ### ### + 0x18, 0x18, 0x00, // ## ## + 0x1C, 0x38, 0x00, // ### ### + 0x0F, 0xF0, 0x00, // ######## + 0x07, 0xC0, 0x00, // ##### + 0x07, 0xCC, 0x00, // ##### ## + 0x0F, 0xFC, 0x00, // ########## + 0x0C, 0x38, 0x00, // ## ### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3600 'R' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7F, 0xE0, 0x00, // ########## + 0x7F, 0xF0, 0x00, // ########### + 0x18, 0x38, 0x00, // ## ### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x38, 0x00, // ## ### + 0x1F, 0xF0, 0x00, // ######### + 0x1F, 0xC0, 0x00, // ####### + 0x18, 0xE0, 0x00, // ## ### + 0x18, 0x70, 0x00, // ## ### + 0x18, 0x30, 0x00, // ## ## + 0x18, 0x38, 0x00, // ## ### + 0x7F, 0x1E, 0x00, // ####### #### + 0x7F, 0x0E, 0x00, // ####### ### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3672 'S' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0xD8, 0x00, // ##### ## + 0x0F, 0xF8, 0x00, // ######### + 0x1C, 0x38, 0x00, // ### ### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x1E, 0x00, 0x00, // #### + 0x0F, 0xC0, 0x00, // ###### + 0x03, 0xF0, 0x00, // ###### + 0x00, 0x78, 0x00, // #### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x1C, 0x38, 0x00, // ### ### + 0x1F, 0xF0, 0x00, // ######### + 0x1B, 0xE0, 0x00, // ## ##### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3744 'T' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x3F, 0xFC, 0x00, // ############ + 0x3F, 0xFC, 0x00, // ############ + 0x31, 0x8C, 0x00, // ## ## ## + 0x31, 0x8C, 0x00, // ## ## ## + 0x31, 0x8C, 0x00, // ## ## ## + 0x31, 0x8C, 0x00, // ## ## ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x0F, 0xF0, 0x00, // ######## + 0x0F, 0xF0, 0x00, // ######## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3816 'U' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7E, 0x7E, 0x00, // ###### ###### + 0x7E, 0x7E, 0x00, // ###### ###### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x0C, 0x30, 0x00, // ## ## + 0x0F, 0xF0, 0x00, // ######## + 0x03, 0xC0, 0x00, // #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3888 'V' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7F, 0x7F, 0x00, // ####### ####### + 0x7F, 0x7F, 0x00, // ####### ####### + 0x18, 0x0C, 0x00, // ## ## + 0x0C, 0x18, 0x00, // ## ## + 0x0C, 0x18, 0x00, // ## ## + 0x0C, 0x18, 0x00, // ## ## + 0x06, 0x30, 0x00, // ## ## + 0x06, 0x30, 0x00, // ## ## + 0x03, 0x60, 0x00, // ## ## + 0x03, 0x60, 0x00, // ## ## + 0x03, 0x60, 0x00, // ## ## + 0x01, 0xC0, 0x00, // ### + 0x01, 0xC0, 0x00, // ### + 0x00, 0x80, 0x00, // # + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3960 'W' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0xFE, 0x3F, 0x80, // ####### ####### + 0xFE, 0x3F, 0x80, // ####### ####### + 0x30, 0x06, 0x00, // ## ## + 0x30, 0x06, 0x00, // ## ## + 0x30, 0x86, 0x00, // ## # ## + 0x19, 0xCC, 0x00, // ## ### ## + 0x19, 0xCC, 0x00, // ## ### ## + 0x1B, 0x6C, 0x00, // ## ## ## ## + 0x1B, 0x6C, 0x00, // ## ## ## ## + 0x1E, 0x7C, 0x00, // #### ##### + 0x0E, 0x38, 0x00, // ### ### + 0x0E, 0x38, 0x00, // ### ### + 0x0C, 0x18, 0x00, // ## ## + 0x0C, 0x18, 0x00, // ## ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4032 'X' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7E, 0x7E, 0x00, // ###### ###### + 0x7E, 0x7E, 0x00, // ###### ###### + 0x18, 0x18, 0x00, // ## ## + 0x0C, 0x30, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x03, 0xC0, 0x00, // #### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x03, 0xC0, 0x00, // #### + 0x06, 0x60, 0x00, // ## ## + 0x0C, 0x30, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x7E, 0x7E, 0x00, // ###### ###### + 0x7E, 0x7E, 0x00, // ###### ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4104 'Y' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7C, 0x7E, 0x00, // ##### ###### + 0x7C, 0x7E, 0x00, // ##### ###### + 0x18, 0x18, 0x00, // ## ## + 0x0C, 0x30, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x03, 0xC0, 0x00, // #### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x0F, 0xF0, 0x00, // ######## + 0x0F, 0xF0, 0x00, // ######## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4176 'Z' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x1F, 0xF8, 0x00, // ########## + 0x1F, 0xF8, 0x00, // ########## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x30, 0x00, // ## ## + 0x18, 0x60, 0x00, // ## ## + 0x18, 0xC0, 0x00, // ## ## + 0x01, 0x80, 0x00, // ## + 0x03, 0x00, 0x00, // ## + 0x06, 0x18, 0x00, // ## ## + 0x0C, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x3F, 0xF8, 0x00, // ########### + 0x3F, 0xF8, 0x00, // ########### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4248 '[' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x01, 0xF0, 0x00, // ##### + 0x01, 0xF0, 0x00, // ##### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0xF0, 0x00, // ##### + 0x01, 0xF0, 0x00, // ##### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4320 '\' (17 pixels wide) + 0x18, 0x00, 0x00, // ## + 0x18, 0x00, 0x00, // ## + 0x1C, 0x00, 0x00, // ### + 0x0C, 0x00, 0x00, // ## + 0x0E, 0x00, 0x00, // ### + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x03, 0x00, 0x00, // ## + 0x03, 0x00, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x00, 0xC0, 0x00, // ## + 0x00, 0xC0, 0x00, // ## + 0x00, 0x60, 0x00, // ## + 0x00, 0x60, 0x00, // ## + 0x00, 0x70, 0x00, // ### + 0x00, 0x30, 0x00, // ## + 0x00, 0x38, 0x00, // ### + 0x00, 0x18, 0x00, // ## + 0x00, 0x18, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4392 ']' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x0F, 0x80, 0x00, // ##### + 0x0F, 0x80, 0x00, // ##### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x0F, 0x80, 0x00, // ##### + 0x0F, 0x80, 0x00, // ##### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4464 '^' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x80, 0x00, // # + 0x01, 0xC0, 0x00, // ### + 0x03, 0xE0, 0x00, // ##### + 0x07, 0x70, 0x00, // ### ### + 0x06, 0x30, 0x00, // ## ## + 0x0C, 0x18, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x10, 0x04, 0x00, // # # + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4536 '_' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0xFF, 0xFF, 0x00, // ################ + 0xFF, 0xFF, 0x00, // ################ + + // @4608 '`' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x03, 0x00, 0x00, // ## + 0x03, 0x80, 0x00, // ### + 0x00, 0xE0, 0x00, // ### + 0x00, 0x60, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4680 'a' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x0F, 0xC0, 0x00, // ###### + 0x1F, 0xE0, 0x00, // ######## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x07, 0xF0, 0x00, // ####### + 0x1F, 0xF0, 0x00, // ######### + 0x38, 0x30, 0x00, // ### ## + 0x30, 0x30, 0x00, // ## ## + 0x30, 0x70, 0x00, // ## ### + 0x1F, 0xFC, 0x00, // ########### + 0x0F, 0xBC, 0x00, // ##### #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4752 'b' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x78, 0x00, 0x00, // #### + 0x78, 0x00, 0x00, // #### + 0x18, 0x00, 0x00, // ## + 0x18, 0x00, 0x00, // ## + 0x1B, 0xE0, 0x00, // ## ##### + 0x1F, 0xF8, 0x00, // ########## + 0x1C, 0x18, 0x00, // ### ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x1C, 0x18, 0x00, // ### ## + 0x7F, 0xF8, 0x00, // ############ + 0x7B, 0xE0, 0x00, // #### ##### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4824 'c' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xEC, 0x00, // ##### ## + 0x0F, 0xFC, 0x00, // ########## + 0x1C, 0x1C, 0x00, // ### ### + 0x38, 0x0C, 0x00, // ### ## + 0x30, 0x0C, 0x00, // ## ## + 0x30, 0x00, 0x00, // ## + 0x30, 0x00, 0x00, // ## + 0x38, 0x0C, 0x00, // ### ## + 0x1C, 0x1C, 0x00, // ### ### + 0x0F, 0xF8, 0x00, // ######### + 0x03, 0xF0, 0x00, // ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4896 'd' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x78, 0x00, // #### + 0x00, 0x78, 0x00, // #### + 0x00, 0x18, 0x00, // ## + 0x00, 0x18, 0x00, // ## + 0x07, 0xD8, 0x00, // ##### ## + 0x1F, 0xF8, 0x00, // ########## + 0x18, 0x38, 0x00, // ## ### + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x18, 0x38, 0x00, // ## ### + 0x1F, 0xFE, 0x00, // ############ + 0x07, 0xDE, 0x00, // ##### #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4968 'e' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0xE0, 0x00, // ###### + 0x1F, 0xF8, 0x00, // ########## + 0x18, 0x18, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0x3F, 0xFC, 0x00, // ############ + 0x3F, 0xFC, 0x00, // ############ + 0x30, 0x00, 0x00, // ## + 0x30, 0x00, 0x00, // ## + 0x18, 0x0C, 0x00, // ## ## + 0x1F, 0xFC, 0x00, // ########### + 0x07, 0xF0, 0x00, // ####### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5040 'f' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x01, 0xFC, 0x00, // ####### + 0x03, 0xFC, 0x00, // ######## + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x3F, 0xF8, 0x00, // ########### + 0x3F, 0xF8, 0x00, // ########### + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x3F, 0xF0, 0x00, // ########## + 0x3F, 0xF0, 0x00, // ########## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5112 'g' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0xDE, 0x00, // ##### #### + 0x1F, 0xFE, 0x00, // ############ + 0x18, 0x38, 0x00, // ## ### + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x18, 0x38, 0x00, // ## ### + 0x1F, 0xF8, 0x00, // ########## + 0x07, 0xD8, 0x00, // ##### ## + 0x00, 0x18, 0x00, // ## + 0x00, 0x18, 0x00, // ## + 0x00, 0x38, 0x00, // ### + 0x0F, 0xF0, 0x00, // ######## + 0x0F, 0xC0, 0x00, // ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5184 'h' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x78, 0x00, 0x00, // #### + 0x78, 0x00, 0x00, // #### + 0x18, 0x00, 0x00, // ## + 0x18, 0x00, 0x00, // ## + 0x1B, 0xE0, 0x00, // ## ##### + 0x1F, 0xF0, 0x00, // ######### + 0x1C, 0x38, 0x00, // ### ### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x7E, 0x7E, 0x00, // ###### ###### + 0x7E, 0x7E, 0x00, // ###### ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5256 'i' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x1F, 0x80, 0x00, // ###### + 0x1F, 0x80, 0x00, // ###### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x3F, 0xFC, 0x00, // ############ + 0x3F, 0xFC, 0x00, // ############ + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5328 'j' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0xC0, 0x00, // ## + 0x00, 0xC0, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x1F, 0xF0, 0x00, // ######### + 0x1F, 0xF0, 0x00, // ######### + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x70, 0x00, // ### + 0x1F, 0xE0, 0x00, // ######## + 0x1F, 0x80, 0x00, // ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5400 'k' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x3C, 0x00, 0x00, // #### + 0x3C, 0x00, 0x00, // #### + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0xF8, 0x00, // ## ##### + 0x0C, 0xF8, 0x00, // ## ##### + 0x0C, 0xC0, 0x00, // ## ## + 0x0D, 0x80, 0x00, // ## ## + 0x0F, 0x80, 0x00, // ##### + 0x0F, 0x00, 0x00, // #### + 0x0F, 0x80, 0x00, // ##### + 0x0D, 0xC0, 0x00, // ## ### + 0x0C, 0xE0, 0x00, // ## ### + 0x3C, 0x7C, 0x00, // #### ##### + 0x3C, 0x7C, 0x00, // #### ##### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5472 'l' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x1F, 0x80, 0x00, // ###### + 0x1F, 0x80, 0x00, // ###### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x3F, 0xFC, 0x00, // ############ + 0x3F, 0xFC, 0x00, // ############ + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5544 'm' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0xF7, 0x78, 0x00, // #### ### #### + 0xFF, 0xFC, 0x00, // ############## + 0x39, 0xCC, 0x00, // ### ### ## + 0x31, 0x8C, 0x00, // ## ## ## + 0x31, 0x8C, 0x00, // ## ## ## + 0x31, 0x8C, 0x00, // ## ## ## + 0x31, 0x8C, 0x00, // ## ## ## + 0x31, 0x8C, 0x00, // ## ## ## + 0x31, 0x8C, 0x00, // ## ## ## + 0xFD, 0xEF, 0x00, // ###### #### #### + 0xFD, 0xEF, 0x00, // ###### #### #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5616 'n' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7B, 0xE0, 0x00, // #### ##### + 0x7F, 0xF0, 0x00, // ########### + 0x1C, 0x38, 0x00, // ### ### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x7E, 0x7E, 0x00, // ###### ###### + 0x7E, 0x7E, 0x00, // ###### ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5688 'o' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xC0, 0x00, // #### + 0x0F, 0xF0, 0x00, // ######## + 0x1C, 0x38, 0x00, // ### ### + 0x38, 0x1C, 0x00, // ### ### + 0x30, 0x0C, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0x38, 0x1C, 0x00, // ### ### + 0x1C, 0x38, 0x00, // ### ### + 0x0F, 0xF0, 0x00, // ######## + 0x03, 0xC0, 0x00, // #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5760 'p' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7B, 0xE0, 0x00, // #### ##### + 0x7F, 0xF8, 0x00, // ############ + 0x1C, 0x18, 0x00, // ### ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x1C, 0x18, 0x00, // ### ## + 0x1F, 0xF8, 0x00, // ########## + 0x1B, 0xE0, 0x00, // ## ##### + 0x18, 0x00, 0x00, // ## + 0x18, 0x00, 0x00, // ## + 0x18, 0x00, 0x00, // ## + 0x7F, 0x00, 0x00, // ####### + 0x7F, 0x00, 0x00, // ####### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5832 'q' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0xDE, 0x00, // ##### #### + 0x1F, 0xFE, 0x00, // ############ + 0x18, 0x38, 0x00, // ## ### + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x18, 0x38, 0x00, // ## ### + 0x1F, 0xF8, 0x00, // ########## + 0x07, 0xD8, 0x00, // ##### ## + 0x00, 0x18, 0x00, // ## + 0x00, 0x18, 0x00, // ## + 0x00, 0x18, 0x00, // ## + 0x00, 0xFE, 0x00, // ####### + 0x00, 0xFE, 0x00, // ####### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5904 'r' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x3E, 0x78, 0x00, // ##### #### + 0x3E, 0xFC, 0x00, // ##### ###### + 0x07, 0xCC, 0x00, // ##### ## + 0x07, 0x00, 0x00, // ### + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x3F, 0xF0, 0x00, // ########## + 0x3F, 0xF0, 0x00, // ########## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5976 's' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0xF8, 0x00, // ######## + 0x0F, 0xF8, 0x00, // ######### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x1F, 0x80, 0x00, // ###### + 0x0F, 0xF0, 0x00, // ######## + 0x00, 0xF8, 0x00, // ##### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x38, 0x00, // ## ### + 0x1F, 0xF0, 0x00, // ######### + 0x1F, 0xE0, 0x00, // ######## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @6048 't' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x3F, 0xF0, 0x00, // ########## + 0x3F, 0xF0, 0x00, // ########## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x1C, 0x00, // ## ### + 0x07, 0xFC, 0x00, // ######### + 0x03, 0xF0, 0x00, // ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @6120 'u' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x78, 0x78, 0x00, // #### #### + 0x78, 0x78, 0x00, // #### #### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x38, 0x00, // ## ### + 0x0F, 0xFE, 0x00, // ########### + 0x07, 0xDE, 0x00, // ##### #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @6192 'v' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7C, 0x3E, 0x00, // ##### ##### + 0x7C, 0x3E, 0x00, // ##### ##### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x0C, 0x30, 0x00, // ## ## + 0x0C, 0x30, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x07, 0xE0, 0x00, // ###### + 0x03, 0xC0, 0x00, // #### + 0x03, 0xC0, 0x00, // #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @6264 'w' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x78, 0x3C, 0x00, // #### #### + 0x78, 0x3C, 0x00, // #### #### + 0x31, 0x18, 0x00, // ## # ## + 0x33, 0x98, 0x00, // ## ### ## + 0x33, 0x98, 0x00, // ## ### ## + 0x1A, 0xB0, 0x00, // ## # # ## + 0x1E, 0xF0, 0x00, // #### #### + 0x1E, 0xF0, 0x00, // #### #### + 0x1C, 0x60, 0x00, // ### ## + 0x0C, 0x60, 0x00, // ## ## + 0x0C, 0x60, 0x00, // ## ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @6336 'x' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x3E, 0x7C, 0x00, // ##### ##### + 0x3E, 0x7C, 0x00, // ##### ##### + 0x0C, 0x30, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x03, 0xC0, 0x00, // #### + 0x01, 0x80, 0x00, // ## + 0x03, 0xC0, 0x00, // #### + 0x06, 0x60, 0x00, // ## ## + 0x0C, 0x30, 0x00, // ## ## + 0x3E, 0x7C, 0x00, // ##### ##### + 0x3E, 0x7C, 0x00, // ##### ##### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @6408 'y' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7E, 0x1F, 0x00, // ###### ##### + 0x7E, 0x1F, 0x00, // ###### ##### + 0x18, 0x0C, 0x00, // ## ## + 0x0C, 0x18, 0x00, // ## ## + 0x0C, 0x18, 0x00, // ## ## + 0x06, 0x30, 0x00, // ## ## + 0x06, 0x30, 0x00, // ## ## + 0x03, 0x60, 0x00, // ## ## + 0x03, 0xE0, 0x00, // ##### + 0x01, 0xC0, 0x00, // ### + 0x00, 0xC0, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x03, 0x00, 0x00, // ## + 0x3F, 0xC0, 0x00, // ######## + 0x3F, 0xC0, 0x00, // ######## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @6480 'z' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x1F, 0xF8, 0x00, // ########## + 0x1F, 0xF8, 0x00, // ########## + 0x18, 0x30, 0x00, // ## ## + 0x18, 0x60, 0x00, // ## ## + 0x00, 0xC0, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x03, 0x00, 0x00, // ## + 0x06, 0x18, 0x00, // ## ## + 0x0C, 0x18, 0x00, // ## ## + 0x1F, 0xF8, 0x00, // ########## + 0x1F, 0xF8, 0x00, // ########## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @6552 '{' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0xE0, 0x00, // ### + 0x01, 0xE0, 0x00, // #### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x03, 0x80, 0x00, // ### + 0x07, 0x00, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0xE0, 0x00, // #### + 0x00, 0xE0, 0x00, // ### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @6624 '|' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @6696 '}' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0x00, 0x00, // ### + 0x07, 0x80, 0x00, // #### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0xC0, 0x00, // ### + 0x00, 0xE0, 0x00, // ### + 0x01, 0xC0, 0x00, // ### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x07, 0x80, 0x00, // #### + 0x07, 0x00, 0x00, // ### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @6768 '~' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x0E, 0x00, 0x00, // ### + 0x1F, 0x18, 0x00, // ##### ## + 0x3B, 0xB8, 0x00, // ### ### ### + 0x31, 0xF0, 0x00, // ## ##### + 0x00, 0xE0, 0x00, // ### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // +}; + +sFONT Font24 = { + Font24_Table, + 17, /* Width */ + 24, /* Height */ +}; + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Software/fab-reader2/components/epd_gfx/Fonts/font8.c b/Software/fab-reader2/components/epd_gfx/Fonts/font8.c new file mode 100644 index 0000000..8cc72aa --- /dev/null +++ b/Software/fab-reader2/components/epd_gfx/Fonts/font8.c @@ -0,0 +1,1004 @@ +/** + ****************************************************************************** + * @file Font8.c + * @author MCD Application Team + * @version V1.0.0 + * @date 18-February-2014 + * @brief This file provides text Font8 for STM32xx-EVAL's LCD driver. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2014 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "fonts.h" + +// +// Font data for Courier New 12pt +// + +const uint8_t Font8_Table[] = +{ + // @0 ' ' (5 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @8 '!' (5 pixels wide) + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x00, // + 0x20, // # + 0x00, // + 0x00, // + + // @16 '"' (5 pixels wide) + 0x50, // # # + 0x50, // # # + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @24 '#' (5 pixels wide) + 0x28, // # # + 0x50, // # # + 0xF8, // ##### + 0x50, // # # + 0xF8, // ##### + 0x50, // # # + 0xA0, // # # + 0x00, // + + // @32 '$' (5 pixels wide) + 0x20, // # + 0x30, // ## + 0x60, // ## + 0x30, // ## + 0x10, // # + 0x60, // ## + 0x20, // # + 0x00, // + + // @40 '%' (5 pixels wide) + 0x20, // # + 0x20, // # + 0x18, // ## + 0x60, // ## + 0x10, // # + 0x10, // # + 0x00, // + 0x00, // + + // @48 '&' (5 pixels wide) + 0x00, // + 0x38, // ### + 0x20, // # + 0x60, // ## + 0x50, // # # + 0x78, // #### + 0x00, // + 0x00, // + + // @56 ''' (5 pixels wide) + 0x20, // # + 0x20, // # + 0x20, // # + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @64 '(' (5 pixels wide) + 0x10, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x10, // # + 0x00, // + + // @72 ')' (5 pixels wide) + 0x40, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x40, // # + 0x00, // + + // @80 '*' (5 pixels wide) + 0x20, // # + 0x70, // ### + 0x20, // # + 0x50, // # # + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @88 '+' (5 pixels wide) + 0x00, // + 0x20, // # + 0x20, // # + 0xF8, // ##### + 0x20, // # + 0x20, // # + 0x00, // + 0x00, // + + // @96 ',' (5 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x10, // # + 0x20, // # + 0x20, // # + 0x00, // + + // @104 '-' (5 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x70, // ### + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @112 '.' (5 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x20, // # + 0x00, // + 0x00, // + + // @120 '/' (5 pixels wide) + 0x10, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x40, // # + 0x40, // # + 0x80, // # + 0x00, // + + // @128 '0' (5 pixels wide) + 0x20, // # + 0x50, // # # + 0x50, // # # + 0x50, // # # + 0x50, // # # + 0x20, // # + 0x00, // + 0x00, // + + // @136 '1' (5 pixels wide) + 0x60, // ## + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0xF8, // ##### + 0x00, // + 0x00, // + + // @144 '2' (5 pixels wide) + 0x20, // # + 0x50, // # # + 0x20, // # + 0x20, // # + 0x40, // # + 0x70, // ### + 0x00, // + 0x00, // + + // @152 '3' (5 pixels wide) + 0x20, // # + 0x50, // # # + 0x10, // # + 0x20, // # + 0x10, // # + 0x60, // ## + 0x00, // + 0x00, // + + // @160 '4' (5 pixels wide) + 0x10, // # + 0x30, // ## + 0x50, // # # + 0x78, // #### + 0x10, // # + 0x38, // ### + 0x00, // + 0x00, // + + // @168 '5' (5 pixels wide) + 0x70, // ### + 0x40, // # + 0x60, // ## + 0x10, // # + 0x50, // # # + 0x20, // # + 0x00, // + 0x00, // + + // @176 '6' (5 pixels wide) + 0x30, // ## + 0x40, // # + 0x60, // ## + 0x50, // # # + 0x50, // # # + 0x60, // ## + 0x00, // + 0x00, // + + // @184 '7' (5 pixels wide) + 0x70, // ### + 0x50, // # # + 0x10, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x00, // + 0x00, // + + // @192 '8' (5 pixels wide) + 0x20, // # + 0x50, // # # + 0x20, // # + 0x50, // # # + 0x50, // # # + 0x20, // # + 0x00, // + 0x00, // + + // @200 '9' (5 pixels wide) + 0x30, // ## + 0x50, // # # + 0x50, // # # + 0x30, // ## + 0x10, // # + 0x60, // ## + 0x00, // + 0x00, // + + // @208 ':' (5 pixels wide) + 0x00, // + 0x00, // + 0x20, // # + 0x00, // + 0x00, // + 0x20, // # + 0x00, // + 0x00, // + + // @216 ';' (5 pixels wide) + 0x00, // + 0x00, // + 0x10, // # + 0x00, // + 0x10, // # + 0x20, // # + 0x00, // + 0x00, // + + // @224 '<' (5 pixels wide) + 0x00, // + 0x10, // # + 0x20, // # + 0xC0, // ## + 0x20, // # + 0x10, // # + 0x00, // + 0x00, // + + // @232 '=' (5 pixels wide) + 0x00, // + 0x70, // ### + 0x00, // + 0x70, // ### + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @240 '>' (5 pixels wide) + 0x00, // + 0x40, // # + 0x20, // # + 0x18, // ## + 0x20, // # + 0x40, // # + 0x00, // + 0x00, // + + // @248 '?' (5 pixels wide) + 0x20, // # + 0x50, // # # + 0x10, // # + 0x20, // # + 0x00, // + 0x20, // # + 0x00, // + 0x00, // + + // @256 '@' (5 pixels wide) + 0x30, // ## + 0x48, // # # + 0x48, // # # + 0x58, // # ## + 0x48, // # # + 0x40, // # + 0x38, // ### + 0x00, // + + // @264 'A' (5 pixels wide) + 0x60, // ## + 0x20, // # + 0x50, // # # + 0x70, // ### + 0x88, // # # + 0xD8, // ## ## + 0x00, // + 0x00, // + + // @272 'B' (5 pixels wide) + 0xF0, // #### + 0x48, // # # + 0x70, // ### + 0x48, // # # + 0x48, // # # + 0xF0, // #### + 0x00, // + 0x00, // + + // @280 'C' (5 pixels wide) + 0x70, // ### + 0x50, // # # + 0x40, // # + 0x40, // # + 0x40, // # + 0x30, // ## + 0x00, // + 0x00, // + + // @288 'D' (5 pixels wide) + 0xF0, // #### + 0x48, // # # + 0x48, // # # + 0x48, // # # + 0x48, // # # + 0xF0, // #### + 0x00, // + 0x00, // + + // @296 'E' (5 pixels wide) + 0xF8, // ##### + 0x48, // # # + 0x60, // ## + 0x40, // # + 0x48, // # # + 0xF8, // ##### + 0x00, // + 0x00, // + + // @304 'F' (5 pixels wide) + 0xF8, // ##### + 0x48, // # # + 0x60, // ## + 0x40, // # + 0x40, // # + 0xE0, // ### + 0x00, // + 0x00, // + + // @312 'G' (5 pixels wide) + 0x70, // ### + 0x40, // # + 0x40, // # + 0x58, // # ## + 0x50, // # # + 0x30, // ## + 0x00, // + 0x00, // + + // @320 'H' (5 pixels wide) + 0xE8, // ### # + 0x48, // # # + 0x78, // #### + 0x48, // # # + 0x48, // # # + 0xE8, // ### # + 0x00, // + 0x00, // + + // @328 'I' (5 pixels wide) + 0x70, // ### + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x70, // ### + 0x00, // + 0x00, // + + // @336 'J' (5 pixels wide) + 0x38, // ### + 0x10, // # + 0x10, // # + 0x50, // # # + 0x50, // # # + 0x20, // # + 0x00, // + 0x00, // + + // @344 'K' (5 pixels wide) + 0xD8, // ## ## + 0x50, // # # + 0x60, // ## + 0x70, // ### + 0x50, // # # + 0xD8, // ## ## + 0x00, // + 0x00, // + + // @352 'L' (5 pixels wide) + 0xE0, // ### + 0x40, // # + 0x40, // # + 0x40, // # + 0x48, // # # + 0xF8, // ##### + 0x00, // + 0x00, // + + // @360 'M' (5 pixels wide) + 0xD8, // ## ## + 0xD8, // ## ## + 0xD8, // ## ## + 0xA8, // # # # + 0x88, // # # + 0xD8, // ## ## + 0x00, // + 0x00, // + + // @368 'N' (5 pixels wide) + 0xD8, // ## ## + 0x68, // ## # + 0x68, // ## # + 0x58, // # ## + 0x58, // # ## + 0xE8, // ### # + 0x00, // + 0x00, // + + // @376 'O' (5 pixels wide) + 0x30, // ## + 0x48, // # # + 0x48, // # # + 0x48, // # # + 0x48, // # # + 0x30, // ## + 0x00, // + 0x00, // + + // @384 'P' (5 pixels wide) + 0xF0, // #### + 0x48, // # # + 0x48, // # # + 0x70, // ### + 0x40, // # + 0xE0, // ### + 0x00, // + 0x00, // + + // @392 'Q' (5 pixels wide) + 0x30, // ## + 0x48, // # # + 0x48, // # # + 0x48, // # # + 0x48, // # # + 0x30, // ## + 0x18, // ## + 0x00, // + + // @400 'R' (5 pixels wide) + 0xF0, // #### + 0x48, // # # + 0x48, // # # + 0x70, // ### + 0x48, // # # + 0xE8, // ### # + 0x00, // + 0x00, // + + // @408 'S' (5 pixels wide) + 0x70, // ### + 0x50, // # # + 0x20, // # + 0x10, // # + 0x50, // # # + 0x70, // ### + 0x00, // + 0x00, // + + // @416 'T' (5 pixels wide) + 0xF8, // ##### + 0xA8, // # # # + 0x20, // # + 0x20, // # + 0x20, // # + 0x70, // ### + 0x00, // + 0x00, // + + // @424 'U' (5 pixels wide) + 0xD8, // ## ## + 0x48, // # # + 0x48, // # # + 0x48, // # # + 0x48, // # # + 0x30, // ## + 0x00, // + 0x00, // + + // @432 'V' (5 pixels wide) + 0xD8, // ## ## + 0x88, // # # + 0x48, // # # + 0x50, // # # + 0x50, // # # + 0x30, // ## + 0x00, // + 0x00, // + + // @440 'W' (5 pixels wide) + 0xD8, // ## ## + 0x88, // # # + 0xA8, // # # # + 0xA8, // # # # + 0xA8, // # # # + 0x50, // # # + 0x00, // + 0x00, // + + // @448 'X' (5 pixels wide) + 0xD8, // ## ## + 0x50, // # # + 0x20, // # + 0x20, // # + 0x50, // # # + 0xD8, // ## ## + 0x00, // + 0x00, // + + // @456 'Y' (5 pixels wide) + 0xD8, // ## ## + 0x88, // # # + 0x50, // # # + 0x20, // # + 0x20, // # + 0x70, // ### + 0x00, // + 0x00, // + + // @464 'Z' (5 pixels wide) + 0x78, // #### + 0x48, // # # + 0x10, // # + 0x20, // # + 0x48, // # # + 0x78, // #### + 0x00, // + 0x00, // + + // @472 '[' (5 pixels wide) + 0x30, // ## + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x30, // ## + 0x00, // + + // @480 '\' (5 pixels wide) + 0x80, // # + 0x40, // # + 0x40, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x10, // # + 0x00, // + + // @488 ']' (5 pixels wide) + 0x60, // ## + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x60, // ## + 0x00, // + + // @496 '^' (5 pixels wide) + 0x20, // # + 0x20, // # + 0x50, // # # + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @504 '_' (5 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0xF8, // ##### + + // @512 '`' (5 pixels wide) + 0x20, // # + 0x10, // # + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @520 'a' (5 pixels wide) + 0x00, // + 0x00, // + 0x30, // ## + 0x10, // # + 0x70, // ### + 0x78, // #### + 0x00, // + 0x00, // + + // @528 'b' (5 pixels wide) + 0xC0, // ## + 0x40, // # + 0x70, // ### + 0x48, // # # + 0x48, // # # + 0xF0, // #### + 0x00, // + 0x00, // + + // @536 'c' (5 pixels wide) + 0x00, // + 0x00, // + 0x70, // ### + 0x40, // # + 0x40, // # + 0x70, // ### + 0x00, // + 0x00, // + + // @544 'd' (5 pixels wide) + 0x18, // ## + 0x08, // # + 0x38, // ### + 0x48, // # # + 0x48, // # # + 0x38, // ### + 0x00, // + 0x00, // + + // @552 'e' (5 pixels wide) + 0x00, // + 0x00, // + 0x70, // ### + 0x70, // ### + 0x40, // # + 0x30, // ## + 0x00, // + 0x00, // + + // @560 'f' (5 pixels wide) + 0x10, // # + 0x20, // # + 0x70, // ### + 0x20, // # + 0x20, // # + 0x70, // ### + 0x00, // + 0x00, // + + // @568 'g' (5 pixels wide) + 0x00, // + 0x00, // + 0x38, // ### + 0x48, // # # + 0x48, // # # + 0x38, // ### + 0x08, // # + 0x30, // ## + + // @576 'h' (5 pixels wide) + 0xC0, // ## + 0x40, // # + 0x70, // ### + 0x48, // # # + 0x48, // # # + 0xE8, // ### # + 0x00, // + 0x00, // + + // @584 'i' (5 pixels wide) + 0x20, // # + 0x00, // + 0x60, // ## + 0x20, // # + 0x20, // # + 0x70, // ### + 0x00, // + 0x00, // + + // @592 'j' (5 pixels wide) + 0x20, // # + 0x00, // + 0x70, // ### + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x70, // ### + + // @600 'k' (5 pixels wide) + 0xC0, // ## + 0x40, // # + 0x58, // # ## + 0x70, // ### + 0x50, // # # + 0xD8, // ## ## + 0x00, // + 0x00, // + + // @608 'l' (5 pixels wide) + 0x60, // ## + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x70, // ### + 0x00, // + 0x00, // + + // @616 'm' (5 pixels wide) + 0x00, // + 0x00, // + 0xD0, // ## # + 0xA8, // # # # + 0xA8, // # # # + 0xA8, // # # # + 0x00, // + 0x00, // + + // @624 'n' (5 pixels wide) + 0x00, // + 0x00, // + 0xF0, // #### + 0x48, // # # + 0x48, // # # + 0xC8, // ## # + 0x00, // + 0x00, // + + // @632 'o' (5 pixels wide) + 0x00, // + 0x00, // + 0x30, // ## + 0x48, // # # + 0x48, // # # + 0x30, // ## + 0x00, // + 0x00, // + + // @640 'p' (5 pixels wide) + 0x00, // + 0x00, // + 0xF0, // #### + 0x48, // # # + 0x48, // # # + 0x70, // ### + 0x40, // # + 0xE0, // ### + + // @648 'q' (5 pixels wide) + 0x00, // + 0x00, // + 0x38, // ### + 0x48, // # # + 0x48, // # # + 0x38, // ### + 0x08, // # + 0x18, // ## + + // @656 'r' (5 pixels wide) + 0x00, // + 0x00, // + 0x78, // #### + 0x20, // # + 0x20, // # + 0x70, // ### + 0x00, // + 0x00, // + + // @664 's' (5 pixels wide) + 0x00, // + 0x00, // + 0x30, // ## + 0x20, // # + 0x10, // # + 0x60, // ## + 0x00, // + 0x00, // + + // @672 't' (5 pixels wide) + 0x00, // + 0x40, // # + 0xF0, // #### + 0x40, // # + 0x48, // # # + 0x30, // ## + 0x00, // + 0x00, // + + // @680 'u' (5 pixels wide) + 0x00, // + 0x00, // + 0xD8, // ## ## + 0x48, // # # + 0x48, // # # + 0x38, // ### + 0x00, // + 0x00, // + + // @688 'v' (5 pixels wide) + 0x00, // + 0x00, // + 0xC8, // ## # + 0x48, // # # + 0x30, // ## + 0x30, // ## + 0x00, // + 0x00, // + + // @696 'w' (5 pixels wide) + 0x00, // + 0x00, // + 0xD8, // ## ## + 0xA8, // # # # + 0xA8, // # # # + 0x50, // # # + 0x00, // + 0x00, // + + // @704 'x' (5 pixels wide) + 0x00, // + 0x00, // + 0x48, // # # + 0x30, // ## + 0x30, // ## + 0x48, // # # + 0x00, // + 0x00, // + + // @712 'y' (5 pixels wide) + 0x00, // + 0x00, // + 0xD8, // ## ## + 0x50, // # # + 0x50, // # # + 0x20, // # + 0x20, // # + 0x60, // ## + + // @720 'z' (5 pixels wide) + 0x00, // + 0x00, // + 0x78, // #### + 0x50, // # # + 0x28, // # # + 0x78, // #### + 0x00, // + 0x00, // + + // @728 '{' (5 pixels wide) + 0x10, // # + 0x20, // # + 0x20, // # + 0x60, // ## + 0x20, // # + 0x20, // # + 0x10, // # + 0x00, // + + // @736 '|' (5 pixels wide) + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x00, // + + // @744 '}' (5 pixels wide) + 0x40, // # + 0x20, // # + 0x20, // # + 0x30, // ## + 0x20, // # + 0x20, // # + 0x40, // # + 0x00, // + + // @752 '~' (5 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x28, // # # + 0x50, // # # + 0x00, // + 0x00, // + 0x00, // +}; + +sFONT Font8 = { + Font8_Table, + 5, /* Width */ + 8, /* Height */ +}; + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Software/fab-reader2/components/epd_gfx/GUI/GUI_Paint.c b/Software/fab-reader2/components/epd_gfx/GUI/GUI_Paint.c new file mode 100644 index 0000000..e3d92e4 --- /dev/null +++ b/Software/fab-reader2/components/epd_gfx/GUI/GUI_Paint.c @@ -0,0 +1,890 @@ +/****************************************************************************** +* | File : GUI_Paint.c +* | Author : Waveshare electronics +* | Function : Achieve drawing: draw points, lines, boxes, circles and +* their size, solid dotted line, solid rectangle hollow +* rectangle, solid circle hollow circle. +* | Info : +* Achieve display characters: Display a single character, string, number +* Achieve time display: adaptive size display time minutes and seconds +*---------------- +* | This version: V3.1 +* | Date : 2020-07-08 +* | Info : +* ----------------------------------------------------------------------------- +* V3.1(2020-07-08): +* 1.Change: Paint_SetScale(UBYTE scale) +* Add scale 7 for 5.65f e-Parper +* 2.Change: Paint_SetPixel(UWORD Xpoint, UWORD Ypoint, UWORD Color) +* Add the branch for scale 7 +* 3.Change: Paint_Clear(UWORD Color) +* Add the branch for scale 7 +* +* ----------------------------------------------------------------------------- +* V3.0(2019-04-18): +* 1.Change: +* Paint_DrawPoint(..., DOT_STYLE DOT_STYLE) +* => Paint_DrawPoint(..., DOT_STYLE Dot_Style) +* Paint_DrawLine(..., LINE_STYLE Line_Style, DOT_PIXEL Dot_Pixel) +* => Paint_DrawLine(..., DOT_PIXEL Line_width, LINE_STYLE Line_Style) +* Paint_DrawRectangle(..., DRAW_FILL Filled, DOT_PIXEL Dot_Pixel) +* => Paint_DrawRectangle(..., DOT_PIXEL Line_width, DRAW_FILL Draw_Fill) +* Paint_DrawCircle(..., DRAW_FILL Draw_Fill, DOT_PIXEL Dot_Pixel) +* => Paint_DrawCircle(..., DOT_PIXEL Line_width, DRAW_FILL Draw_Filll) +* +* ----------------------------------------------------------------------------- +* V2.0(2018-11-15): +* 1.add: Paint_NewImage() +* Create an image's properties +* 2.add: Paint_SelectImage() +* Select the picture to be drawn +* 3.add: Paint_SetRotate() +* Set the direction of the cache +* 4.add: Paint_RotateImage() +* Can flip the picture, Support 0-360 degrees, +* but only 90.180.270 rotation is better +* 4.add: Paint_SetMirroring() +* Can Mirroring the picture, horizontal, vertical, origin +* 5.add: Paint_DrawString_CN() +* Can display Chinese(GB1312) +* +* ----------------------------------------------------------------------------- +* V1.0(2018-07-17): +* Create library +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documnetation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +* THE SOFTWARE. +* +******************************************************************************/ +#include "GUI_Paint.h" +#include "DEV_Config.h" +#include "Debug.h" +#include +#include +#include //memset() +#include + +PAINT Paint; + +/****************************************************************************** +function: Create Image +parameter: + image : Pointer to the image cache + width : The width of the picture + Height : The height of the picture + Color : Whether the picture is inverted +******************************************************************************/ +void Paint_NewImage(UBYTE *image, UWORD Width, UWORD Height, UWORD Rotate, UWORD Color) +{ + Paint.Image = NULL; + Paint.Image = image; + + Paint.WidthMemory = Width; + Paint.HeightMemory = Height; + Paint.Color = Color; + Paint.Scale = 2; + + Paint.WidthByte = (Width % 8 == 0)? (Width / 8 ): (Width / 8 + 1); + Paint.HeightByte = Height; +// printf("WidthByte = %d, HeightByte = %d\r\n", Paint.WidthByte, Paint.HeightByte); +// printf(" EPD_WIDTH / 8 = %d\r\n", 122 / 8); + + Paint.Rotate = Rotate; + Paint.Mirror = MIRROR_NONE; + + if(Rotate == ROTATE_0 || Rotate == ROTATE_180) { + Paint.Width = Width; + Paint.Height = Height; + } else { + Paint.Width = Height; + Paint.Height = Width; + } +} + +/****************************************************************************** +function: Select Image +parameter: + image : Pointer to the image cache +******************************************************************************/ +void Paint_SelectImage(UBYTE *image) +{ + Paint.Image = image; +} + +/****************************************************************************** +function: Select Image Rotate +parameter: + Rotate : 0,90,180,270 +******************************************************************************/ +void Paint_SetRotate(UWORD Rotate) +{ + if(Rotate == ROTATE_0 || Rotate == ROTATE_90 || Rotate == ROTATE_180 || Rotate == ROTATE_270) { + Debug("Set image Rotate %d\r\n", Rotate); + Paint.Rotate = Rotate; + } else { + Debug("rotate = 0, 90, 180, 270\r\n"); + } +} + +void Paint_SetScale(UBYTE scale) +{ + if(scale == 2){ + Paint.Scale = scale; + Paint.WidthByte = (Paint.WidthMemory % 8 == 0)? (Paint.WidthMemory / 8 ): (Paint.WidthMemory / 8 + 1); + }else if(scale == 4){ + Paint.Scale = scale; + Paint.WidthByte = (Paint.WidthMemory % 4 == 0)? (Paint.WidthMemory / 4 ): (Paint.WidthMemory / 4 + 1); + }else if(scale == 7){//Only applicable with 5in65 e-Paper + Paint.Scale = scale; + Paint.WidthByte = (Paint.WidthMemory % 2 == 0)? (Paint.WidthMemory / 2 ): (Paint.WidthMemory / 2 + 1);; + }else{ + Debug("Set Scale Input parameter error\r\n"); + Debug("Scale Only support: 2 4 7\r\n"); + } +} +/****************************************************************************** +function: Select Image mirror +parameter: + mirror :Not mirror,Horizontal mirror,Vertical mirror,Origin mirror +******************************************************************************/ +void Paint_SetMirroring(UBYTE mirror) +{ + if(mirror == MIRROR_NONE || mirror == MIRROR_HORIZONTAL || + mirror == MIRROR_VERTICAL || mirror == MIRROR_ORIGIN) { + Debug("mirror image x:%s, y:%s\r\n",(mirror & 0x01)? "mirror":"none", ((mirror >> 1) & 0x01)? "mirror":"none"); + Paint.Mirror = mirror; + } else { + Debug("mirror should be MIRROR_NONE, MIRROR_HORIZONTAL, \ + MIRROR_VERTICAL or MIRROR_ORIGIN\r\n"); + } +} + +/****************************************************************************** +function: Draw Pixels +parameter: + Xpoint : At point X + Ypoint : At point Y + Color : Painted colors +******************************************************************************/ +void Paint_SetPixel(UWORD Xpoint, UWORD Ypoint, UWORD Color) +{ + if(Xpoint > Paint.Width || Ypoint > Paint.Height){ + Debug("Exceeding display boundaries\r\n"); + return; + } + UWORD X, Y; + + switch(Paint.Rotate) { + case 0: + X = Xpoint; + Y = Ypoint; + break; + case 90: + X = Paint.WidthMemory - Ypoint - 1; + Y = Xpoint; + break; + case 180: + X = Paint.WidthMemory - Xpoint - 1; + Y = Paint.HeightMemory - Ypoint - 1; + break; + case 270: + X = Ypoint; + Y = Paint.HeightMemory - Xpoint - 1; + break; + default: + return; + } + + switch(Paint.Mirror) { + case MIRROR_NONE: + break; + case MIRROR_HORIZONTAL: + X = Paint.WidthMemory - X - 1; + break; + case MIRROR_VERTICAL: + Y = Paint.HeightMemory - Y - 1; + break; + case MIRROR_ORIGIN: + X = Paint.WidthMemory - X - 1; + Y = Paint.HeightMemory - Y - 1; + break; + default: + return; + } + + if(X > Paint.WidthMemory || Y > Paint.HeightMemory){ + Debug("Exceeding display boundaries\r\n"); + return; + } + + if(Paint.Scale == 2){ + UDOUBLE Addr = X / 8 + Y * Paint.WidthByte; + UBYTE Rdata = Paint.Image[Addr]; + if(Color == BLACK) + Paint.Image[Addr] = Rdata & ~(0x80 >> (X % 8)); + else + Paint.Image[Addr] = Rdata | (0x80 >> (X % 8)); + }else if(Paint.Scale == 4){ + UDOUBLE Addr = X / 4 + Y * Paint.WidthByte; + Color = Color % 4;//Guaranteed color scale is 4 --- 0~3 + UBYTE Rdata = Paint.Image[Addr]; + + Rdata = Rdata & (~(0xC0 >> ((X % 4)*2))); + Paint.Image[Addr] = Rdata | ((Color << 6) >> ((X % 4)*2)); + }else if(Paint.Scale == 7){ + UDOUBLE Addr = X / 2 + Y * Paint.WidthByte; + UBYTE Rdata = Paint.Image[Addr]; + Rdata = Rdata & (~(0xF0 >> ((X % 2)*4)));//Clear first, then set value + Paint.Image[Addr] = Rdata | ((Color << 4) >> ((X % 2)*4)); + //printf("Add = %d ,data = %d\r\n",Addr,Rdata); + } +} + +/****************************************************************************** +function: Clear the color of the picture +parameter: + Color : Painted colors +******************************************************************************/ +void Paint_Clear(UWORD Color) +{ + if(Paint.Scale == 2) { + for (UWORD Y = 0; Y < Paint.HeightByte; Y++) { + for (UWORD X = 0; X < Paint.WidthByte; X++ ) {//8 pixel = 1 byte + UDOUBLE Addr = X + Y*Paint.WidthByte; + Paint.Image[Addr] = Color; + } + } + }else if(Paint.Scale == 4) { + for (UWORD Y = 0; Y < Paint.HeightByte; Y++) { + for (UWORD X = 0; X < Paint.WidthByte; X++ ) { + UDOUBLE Addr = X + Y*Paint.WidthByte; + Paint.Image[Addr] = (Color<<6)|(Color<<4)|(Color<<2)|Color; + } + } + }else if(Paint.Scale == 7) { + for (UWORD Y = 0; Y < Paint.HeightByte; Y++) { + for (UWORD X = 0; X < Paint.WidthByte; X++ ) { + UDOUBLE Addr = X + Y*Paint.WidthByte; + Paint.Image[Addr] = (Color<<4)|Color; + } + } + } +} + +/****************************************************************************** +function: Clear the color of a window +parameter: + Xstart : x starting point + Ystart : Y starting point + Xend : x end point + Yend : y end point + Color : Painted colors +******************************************************************************/ +void Paint_ClearWindows(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend, UWORD Color) +{ + UWORD X, Y; + for (Y = Ystart; Y < Yend; Y++) { + for (X = Xstart; X < Xend; X++) {//8 pixel = 1 byte + Paint_SetPixel(X, Y, Color); + } + } +} + +/****************************************************************************** +function: Draw Point(Xpoint, Ypoint) Fill the color +parameter: + Xpoint : The Xpoint coordinate of the point + Ypoint : The Ypoint coordinate of the point + Color : Painted color + Dot_Pixel : point size + Dot_Style : point Style +******************************************************************************/ +void Paint_DrawPoint(UWORD Xpoint, UWORD Ypoint, UWORD Color, + DOT_PIXEL Dot_Pixel, DOT_STYLE Dot_Style) +{ + if (Xpoint > Paint.Width || Ypoint > Paint.Height) { + Debug("Paint_DrawPoint Input exceeds the normal display range\r\n"); + printf("Xpoint = %d , Paint.Width = %d \r\n ",Xpoint,Paint.Width); + printf("Ypoint = %d , Paint.Height = %d \r\n ",Ypoint,Paint.Height); + return; + } + + int16_t XDir_Num , YDir_Num; + if (Dot_Style == DOT_FILL_AROUND) { + for (XDir_Num = 0; XDir_Num < 2 * Dot_Pixel - 1; XDir_Num++) { + for (YDir_Num = 0; YDir_Num < 2 * Dot_Pixel - 1; YDir_Num++) { + if(Xpoint + XDir_Num - Dot_Pixel < 0 || Ypoint + YDir_Num - Dot_Pixel < 0) + break; + // printf("x = %d, y = %d\r\n", Xpoint + XDir_Num - Dot_Pixel, Ypoint + YDir_Num - Dot_Pixel); + Paint_SetPixel(Xpoint + XDir_Num - Dot_Pixel, Ypoint + YDir_Num - Dot_Pixel, Color); + } + } + } else { + for (XDir_Num = 0; XDir_Num < Dot_Pixel; XDir_Num++) { + for (YDir_Num = 0; YDir_Num < Dot_Pixel; YDir_Num++) { + Paint_SetPixel(Xpoint + XDir_Num - 1, Ypoint + YDir_Num - 1, Color); + } + } + } +} + +/****************************************************************************** +function: Draw a line of arbitrary slope +parameter: + Xstart :Starting Xpoint point coordinates + Ystart :Starting Xpoint point coordinates + Xend :End point Xpoint coordinate + Yend :End point Ypoint coordinate + Color :The color of the line segment + Line_width : Line width + Line_Style: Solid and dotted lines +******************************************************************************/ +void Paint_DrawLine(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend, + UWORD Color, DOT_PIXEL Line_width, LINE_STYLE Line_Style) +{ + if (Xstart > Paint.Width || Ystart > Paint.Height || + Xend > Paint.Width || Yend > Paint.Height) { + Debug("Paint_DrawLine Input exceeds the normal display range\r\n"); + return; + } + + UWORD Xpoint = Xstart; + UWORD Ypoint = Ystart; + int dx = (int)Xend - (int)Xstart >= 0 ? Xend - Xstart : Xstart - Xend; + int dy = (int)Yend - (int)Ystart <= 0 ? Yend - Ystart : Ystart - Yend; + + // Increment direction, 1 is positive, -1 is counter; + int XAddway = Xstart < Xend ? 1 : -1; + int YAddway = Ystart < Yend ? 1 : -1; + + //Cumulative error + int Esp = dx + dy; + char Dotted_Len = 0; + + for (;;) { + Dotted_Len++; + //Painted dotted line, 2 point is really virtual + if (Line_Style == LINE_STYLE_DOTTED && Dotted_Len % 3 == 0) { + //Debug("LINE_DOTTED\r\n"); + Paint_DrawPoint(Xpoint, Ypoint, IMAGE_BACKGROUND, Line_width, DOT_STYLE_DFT); + Dotted_Len = 0; + } else { + Paint_DrawPoint(Xpoint, Ypoint, Color, Line_width, DOT_STYLE_DFT); + } + if (2 * Esp >= dy) { + if (Xpoint == Xend) + break; + Esp += dy; + Xpoint += XAddway; + } + if (2 * Esp <= dx) { + if (Ypoint == Yend) + break; + Esp += dx; + Ypoint += YAddway; + } + } +} + +/****************************************************************************** +function: Draw a rectangle +parameter: + Xstart :Rectangular Starting Xpoint point coordinates + Ystart :Rectangular Starting Xpoint point coordinates + Xend :Rectangular End point Xpoint coordinate + Yend :Rectangular End point Ypoint coordinate + Color :The color of the Rectangular segment + Line_width: Line width + Draw_Fill : Whether to fill the inside of the rectangle +******************************************************************************/ +void Paint_DrawRectangle(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend, + UWORD Color, DOT_PIXEL Line_width, DRAW_FILL Draw_Fill) +{ + if (Xstart > Paint.Width || Ystart > Paint.Height || + Xend > Paint.Width || Yend > Paint.Height) { + Debug("Input exceeds the normal display range\r\n"); + return; + } + + if (Draw_Fill) { + UWORD Ypoint; + for(Ypoint = Ystart; Ypoint < Yend; Ypoint++) { + Paint_DrawLine(Xstart, Ypoint, Xend, Ypoint, Color , Line_width, LINE_STYLE_SOLID); + } + } else { + Paint_DrawLine(Xstart, Ystart, Xend, Ystart, Color, Line_width, LINE_STYLE_SOLID); + Paint_DrawLine(Xstart, Ystart, Xstart, Yend, Color, Line_width, LINE_STYLE_SOLID); + Paint_DrawLine(Xend, Yend, Xend, Ystart, Color, Line_width, LINE_STYLE_SOLID); + Paint_DrawLine(Xend, Yend, Xstart, Yend, Color, Line_width, LINE_STYLE_SOLID); + } +} + +/****************************************************************************** +function: Use the 8-point method to draw a circle of the + specified size at the specified position-> +parameter: + X_Center :Center X coordinate + Y_Center :Center Y coordinate + Radius :circle Radius + Color :The color of the :circle segment + Line_width: Line width + Draw_Fill : Whether to fill the inside of the Circle +******************************************************************************/ +void Paint_DrawCircle(UWORD X_Center, UWORD Y_Center, UWORD Radius, + UWORD Color, DOT_PIXEL Line_width, DRAW_FILL Draw_Fill) +{ + if (X_Center > Paint.Width || Y_Center >= Paint.Height) { + Debug("Paint_DrawCircle Input exceeds the normal display range\r\n"); + return; + } + + //Draw a circle from(0, R) as a starting point + int16_t XCurrent, YCurrent; + XCurrent = 0; + YCurrent = Radius; + + //Cumulative error,judge the next point of the logo + int16_t Esp = 3 - (Radius << 1 ); + + int16_t sCountY; + if (Draw_Fill == DRAW_FILL_FULL) { + while (XCurrent <= YCurrent ) { //Realistic circles + for (sCountY = XCurrent; sCountY <= YCurrent; sCountY ++ ) { + Paint_DrawPoint(X_Center + XCurrent, Y_Center + sCountY, Color, DOT_PIXEL_DFT, DOT_STYLE_DFT);//1 + Paint_DrawPoint(X_Center - XCurrent, Y_Center + sCountY, Color, DOT_PIXEL_DFT, DOT_STYLE_DFT);//2 + Paint_DrawPoint(X_Center - sCountY, Y_Center + XCurrent, Color, DOT_PIXEL_DFT, DOT_STYLE_DFT);//3 + Paint_DrawPoint(X_Center - sCountY, Y_Center - XCurrent, Color, DOT_PIXEL_DFT, DOT_STYLE_DFT);//4 + Paint_DrawPoint(X_Center - XCurrent, Y_Center - sCountY, Color, DOT_PIXEL_DFT, DOT_STYLE_DFT);//5 + Paint_DrawPoint(X_Center + XCurrent, Y_Center - sCountY, Color, DOT_PIXEL_DFT, DOT_STYLE_DFT);//6 + Paint_DrawPoint(X_Center + sCountY, Y_Center - XCurrent, Color, DOT_PIXEL_DFT, DOT_STYLE_DFT);//7 + Paint_DrawPoint(X_Center + sCountY, Y_Center + XCurrent, Color, DOT_PIXEL_DFT, DOT_STYLE_DFT); + } + if (Esp < 0 ) + Esp += 4 * XCurrent + 6; + else { + Esp += 10 + 4 * (XCurrent - YCurrent ); + YCurrent --; + } + XCurrent ++; + } + } else { //Draw a hollow circle + while (XCurrent <= YCurrent ) { + Paint_DrawPoint(X_Center + XCurrent, Y_Center + YCurrent, Color, Line_width, DOT_STYLE_DFT);//1 + Paint_DrawPoint(X_Center - XCurrent, Y_Center + YCurrent, Color, Line_width, DOT_STYLE_DFT);//2 + Paint_DrawPoint(X_Center - YCurrent, Y_Center + XCurrent, Color, Line_width, DOT_STYLE_DFT);//3 + Paint_DrawPoint(X_Center - YCurrent, Y_Center - XCurrent, Color, Line_width, DOT_STYLE_DFT);//4 + Paint_DrawPoint(X_Center - XCurrent, Y_Center - YCurrent, Color, Line_width, DOT_STYLE_DFT);//5 + Paint_DrawPoint(X_Center + XCurrent, Y_Center - YCurrent, Color, Line_width, DOT_STYLE_DFT);//6 + Paint_DrawPoint(X_Center + YCurrent, Y_Center - XCurrent, Color, Line_width, DOT_STYLE_DFT);//7 + Paint_DrawPoint(X_Center + YCurrent, Y_Center + XCurrent, Color, Line_width, DOT_STYLE_DFT);//0 + + if (Esp < 0 ) + Esp += 4 * XCurrent + 6; + else { + Esp += 10 + 4 * (XCurrent - YCurrent ); + YCurrent --; + } + XCurrent ++; + } + } +} + +/****************************************************************************** +function: Show English characters +parameter: + Xpoint :X coordinate + Ypoint :Y coordinate + Acsii_Char :To display the English characters + Font :A structure pointer that displays a character size + Color_Foreground : Select the foreground color + Color_Background : Select the background color +******************************************************************************/ +void Paint_DrawChar(UWORD Xpoint, UWORD Ypoint, const char Acsii_Char, + sFONT* Font, UWORD Color_Foreground, UWORD Color_Background) +{ + UWORD Page, Column; + + if (Xpoint > Paint.Width || Ypoint > Paint.Height) { + Debug("Paint_DrawChar Input exceeds the normal display range\r\n"); + return; + } + + uint32_t Char_Offset = (Acsii_Char - ' ') * Font->Height * (Font->Width / 8 + (Font->Width % 8 ? 1 : 0)); + const unsigned char *ptr = &Font->table[Char_Offset]; + + for (Page = 0; Page < Font->Height; Page ++ ) { + for (Column = 0; Column < Font->Width; Column ++ ) { + + //To determine whether the font background color and screen background color is consistent + if (FONT_BACKGROUND == Color_Background) { //this process is to speed up the scan + if (*ptr & (0x80 >> (Column % 8))) + Paint_SetPixel(Xpoint + Column, Ypoint + Page, Color_Foreground); + // Paint_DrawPoint(Xpoint + Column, Ypoint + Page, Color_Foreground, DOT_PIXEL_DFT, DOT_STYLE_DFT); + } else { + if (*ptr & (0x80 >> (Column % 8))) { + Paint_SetPixel(Xpoint + Column, Ypoint + Page, Color_Foreground); + // Paint_DrawPoint(Xpoint + Column, Ypoint + Page, Color_Foreground, DOT_PIXEL_DFT, DOT_STYLE_DFT); + } else { + Paint_SetPixel(Xpoint + Column, Ypoint + Page, Color_Background); + // Paint_DrawPoint(Xpoint + Column, Ypoint + Page, Color_Background, DOT_PIXEL_DFT, DOT_STYLE_DFT); + } + } + //One pixel is 8 bits + if (Column % 8 == 7) + ptr++; + }// Write a line + if (Font->Width % 8 != 0) + ptr++; + }// Write all +} + +/****************************************************************************** +function: Display the string +parameter: + Xstart :X coordinate + Ystart :Y coordinate + pString :The first address of the English string to be displayed + Font :A structure pointer that displays a character size + Color_Foreground : Select the foreground color + Color_Background : Select the background color +******************************************************************************/ +void Paint_DrawString_EN(UWORD Xstart, UWORD Ystart, const char * pString, + sFONT* Font, UWORD Color_Foreground, UWORD Color_Background) +{ + UWORD Xpoint = Xstart; + UWORD Ypoint = Ystart; + + if (Xstart > Paint.Width || Ystart > Paint.Height) { + Debug("Paint_DrawString_EN Input exceeds the normal display range\r\n"); + return; + } + + while (* pString != '\0') { + //if X direction filled , reposition to(Xstart,Ypoint),Ypoint is Y direction plus the Height of the character + if ((Xpoint + Font->Width ) > Paint.Width ) { + Xpoint = Xstart; + Ypoint += Font->Height; + } + + // If the Y direction is full, reposition to(Xstart, Ystart) + if ((Ypoint + Font->Height ) > Paint.Height ) { + Xpoint = Xstart; + Ypoint = Ystart; + } + Paint_DrawChar(Xpoint, Ypoint, * pString, Font, Color_Background, Color_Foreground); + + //The next character of the address + pString ++; + + //The next word of the abscissa increases the font of the broadband + Xpoint += Font->Width; + } +} + + +/****************************************************************************** +function: Display the string +parameter: + Xstart :X coordinate + Ystart :Y coordinate + pString :The first address of the Chinese string and English + string to be displayed + Font :A structure pointer that displays a character size + Color_Foreground : Select the foreground color + Color_Background : Select the background color +******************************************************************************/ +void Paint_DrawString_CN(UWORD Xstart, UWORD Ystart, const char * pString, cFONT* font, + UWORD Color_Foreground, UWORD Color_Background) +{ + const char* p_text = pString; + int x = Xstart, y = Ystart; + int i, j,Num; + + /* Send the string character by character on EPD */ + while (*p_text != 0) { + if(*p_text <= 0x7F) { //ASCII < 126 + for(Num = 0; Num < font->size; Num++) { + if(*p_text== font->table[Num].index[0]) { + const char* ptr = &font->table[Num].matrix[0]; + + for (j = 0; j < font->Height; j++) { + for (i = 0; i < font->Width; i++) { + if (FONT_BACKGROUND == Color_Background) { //this process is to speed up the scan + if (*ptr & (0x80 >> (i % 8))) { + Paint_SetPixel(x + i, y + j, Color_Foreground); + // Paint_DrawPoint(x + i, y + j, Color_Foreground, DOT_PIXEL_DFT, DOT_STYLE_DFT); + } + } else { + if (*ptr & (0x80 >> (i % 8))) { + Paint_SetPixel(x + i, y + j, Color_Foreground); + // Paint_DrawPoint(x + i, y + j, Color_Foreground, DOT_PIXEL_DFT, DOT_STYLE_DFT); + } else { + Paint_SetPixel(x + i, y + j, Color_Background); + // Paint_DrawPoint(x + i, y + j, Color_Background, DOT_PIXEL_DFT, DOT_STYLE_DFT); + } + } + if (i % 8 == 7) { + ptr++; + } + } + if (font->Width % 8 != 0) { + ptr++; + } + } + break; + } + } + /* Point on the next character */ + p_text += 1; + /* Decrement the column position by 16 */ + x += font->ASCII_Width; + } else { //Chinese + for(Num = 0; Num < font->size; Num++) { + if((*p_text== font->table[Num].index[0]) && (*(p_text+1) == font->table[Num].index[1])) { + const char* ptr = &font->table[Num].matrix[0]; + + for (j = 0; j < font->Height; j++) { + for (i = 0; i < font->Width; i++) { + if (FONT_BACKGROUND == Color_Background) { //this process is to speed up the scan + if (*ptr & (0x80 >> (i % 8))) { + Paint_SetPixel(x + i, y + j, Color_Foreground); + // Paint_DrawPoint(x + i, y + j, Color_Foreground, DOT_PIXEL_DFT, DOT_STYLE_DFT); + } + } else { + if (*ptr & (0x80 >> (i % 8))) { + Paint_SetPixel(x + i, y + j, Color_Foreground); + // Paint_DrawPoint(x + i, y + j, Color_Foreground, DOT_PIXEL_DFT, DOT_STYLE_DFT); + } else { + Paint_SetPixel(x + i, y + j, Color_Background); + // Paint_DrawPoint(x + i, y + j, Color_Background, DOT_PIXEL_DFT, DOT_STYLE_DFT); + } + } + if (i % 8 == 7) { + ptr++; + } + } + if (font->Width % 8 != 0) { + ptr++; + } + } + break; + } + } + /* Point on the next character */ + p_text += 2; + /* Decrement the column position by 16 */ + x += font->Width; + } + } +} + +/****************************************************************************** +function: Display nummber +parameter: + Xstart :X coordinate + Ystart : Y coordinate + Nummber : The number displayed + Font :A structure pointer that displays a character size + Color_Foreground : Select the foreground color + Color_Background : Select the background color +******************************************************************************/ +#define ARRAY_LEN 255 +void Paint_DrawNum(UWORD Xpoint, UWORD Ypoint, int32_t Nummber, + sFONT* Font, UWORD Color_Foreground, UWORD Color_Background) +{ + + int16_t Num_Bit = 0, Str_Bit = 0; + uint8_t Str_Array[ARRAY_LEN] = {0}, Num_Array[ARRAY_LEN] = {0}; + uint8_t *pStr = Str_Array; + + if (Xpoint > Paint.Width || Ypoint > Paint.Height) { + Debug("Paint_DisNum Input exceeds the normal display range\r\n"); + return; + } + + //Converts a number to a string + do { + Num_Array[Num_Bit] = Nummber % 10 + '0'; + Num_Bit++; + Nummber /= 10; + } while(Nummber); + + + //The string is inverted + while (Num_Bit > 0) { + Str_Array[Str_Bit] = Num_Array[Num_Bit - 1]; + Str_Bit ++; + Num_Bit --; + } + + //show + Paint_DrawString_EN(Xpoint, Ypoint, (const char*)pStr, Font, Color_Background, Color_Foreground); +} + +/****************************************************************************** +function: Display nummber (Able to display decimals) +parameter: + Xstart :X coordinate + Ystart : Y coordinate + Nummber : The number displayed + Font :A structure pointer that displays a character size + Digit : Fractional width + Color_Foreground : Select the foreground color + Color_Background : Select the background color +******************************************************************************/ +void Paint_DrawNumDecimals(UWORD Xpoint, UWORD Ypoint, double Nummber, + sFONT* Font, UWORD Digit, UWORD Color_Foreground, UWORD Color_Background) +{ + int16_t Num_Bit = 0, Str_Bit = 0; + uint8_t Str_Array[ARRAY_LEN] = {0}, Num_Array[ARRAY_LEN] = {0}; + uint8_t *pStr = Str_Array; + int temp = Nummber; + float decimals; + uint8_t i; + if (Xpoint > Paint.Width || Ypoint > Paint.Height) { + Debug("Paint_DisNum Input exceeds the normal display range\r\n"); + return; + } + + if(Digit > 0) { + decimals = Nummber - temp; + for(i=Digit; i > 0; i--) { + decimals*=10; + } + temp = decimals; + //Converts a number to a string + for(i=Digit; i>0; i--) { + Num_Array[Num_Bit] = temp % 10 + '0'; + Num_Bit++; + temp /= 10; + } + Num_Array[Num_Bit] = '.'; + Num_Bit++; + } + + temp = Nummber; + //Converts a number to a string + do { + Num_Array[Num_Bit] = temp % 10 + '0'; + Num_Bit++; + temp /= 10; + } while(temp); + + //The string is inverted + while (Num_Bit > 0) { + Str_Array[Str_Bit] = Num_Array[Num_Bit - 1]; + Str_Bit ++; + Num_Bit --; + } + + //show + Paint_DrawString_EN(Xpoint, Ypoint, (const char*)pStr, Font, Color_Background, Color_Foreground); +} + +/****************************************************************************** +function: Display time +parameter: + Xstart :X coordinate + Ystart : Y coordinate + pTime : Time-related structures + Font :A structure pointer that displays a character size + Color_Foreground : Select the foreground color + Color_Background : Select the background color +******************************************************************************/ +void Paint_DrawTime(UWORD Xstart, UWORD Ystart, PAINT_TIME *pTime, sFONT* Font, + UWORD Color_Foreground, UWORD Color_Background) +{ + uint8_t value[10] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}; + + UWORD Dx = Font->Width; + + //Write data into the cache + Paint_DrawChar(Xstart , Ystart, value[pTime->Hour / 10], Font, Color_Background, Color_Foreground); + Paint_DrawChar(Xstart + Dx , Ystart, value[pTime->Hour % 10], Font, Color_Background, Color_Foreground); + Paint_DrawChar(Xstart + Dx + Dx / 4 + Dx / 2 , Ystart, ':' , Font, Color_Background, Color_Foreground); + Paint_DrawChar(Xstart + Dx * 2 + Dx / 2 , Ystart, value[pTime->Min / 10] , Font, Color_Background, Color_Foreground); + Paint_DrawChar(Xstart + Dx * 3 + Dx / 2 , Ystart, value[pTime->Min % 10] , Font, Color_Background, Color_Foreground); + Paint_DrawChar(Xstart + Dx * 4 + Dx / 2 - Dx / 4, Ystart, ':' , Font, Color_Background, Color_Foreground); + Paint_DrawChar(Xstart + Dx * 5 , Ystart, value[pTime->Sec / 10] , Font, Color_Background, Color_Foreground); + Paint_DrawChar(Xstart + Dx * 6 , Ystart, value[pTime->Sec % 10] , Font, Color_Background, Color_Foreground); +} + +/****************************************************************************** +function: Display monochrome bitmap +parameter: + image_buffer :A picture data converted to a bitmap +info: + Use a computer to convert the image into a corresponding array, + and then embed the array directly into Imagedata.cpp as a .c file. +******************************************************************************/ +void Paint_DrawBitMap(const unsigned char* image_buffer) +{ + UWORD x, y; + UDOUBLE Addr = 0; + + for (y = 0; y < Paint.HeightByte; y++) { + for (x = 0; x < Paint.WidthByte; x++) {//8 pixel = 1 byte + Addr = x + y * Paint.WidthByte; + Paint.Image[Addr] = (unsigned char)image_buffer[Addr]; + } + } +} + +/****************************************************************************** +function: paste monochrome bitmap to a frame buff +parameter: + image_buffer :A picture data converted to a bitmap + xStart: The starting x coordinate + yStart: The starting y coordinate + imageWidth: Original image width + imageHeight: Original image height + flipColor: Whether the color is reversed +info: + Use this function to paste image data into a buffer +******************************************************************************/ +void Paint_DrawBitMap_Paste(const unsigned char* image_buffer, UWORD xStart, UWORD yStart, UWORD imageWidth, UWORD imageHeight, UBYTE flipColor) +{ + UBYTE color, srcImage; + UWORD x, y; + UWORD width = (imageWidth%8==0 ? imageWidth/8 : imageWidth/8+1); + + for (y = 0; y < imageHeight; y++) { + for (x = 0; x < imageWidth; x++) { + srcImage = image_buffer[y*width + x/8]; + if(flipColor) + color = (((srcImage<<(x%8) & 0x80) == 0) ? 1 : 0); + else + color = (((srcImage<<(x%8) & 0x80) == 0) ? 0 : 1); + Paint_SetPixel(x+xStart, y+yStart, color); + } + } +} + +void Paint_DrawBitMap_Block(const unsigned char* image_buffer, UBYTE Region) +{ + UWORD x, y; + UDOUBLE Addr = 0; + for (y = 0; y < Paint.HeightByte; y++) { + for (x = 0; x < Paint.WidthByte; x++) {//8 pixel = 1 byte + Addr = x + y * Paint.WidthByte ; + Paint.Image[Addr] = \ + (unsigned char)image_buffer[Addr+ (Paint.HeightByte)*Paint.WidthByte*(Region - 1)]; + } + } +} + diff --git a/Software/fab-reader2/components/epd_gfx/include/Fonts/fonts.h b/Software/fab-reader2/components/epd_gfx/include/Fonts/fonts.h new file mode 100644 index 0000000..ca19212 --- /dev/null +++ b/Software/fab-reader2/components/epd_gfx/include/Fonts/fonts.h @@ -0,0 +1,95 @@ +/** + ****************************************************************************** + * @file fonts.h + * @author MCD Application Team + * @version V1.0.0 + * @date 18-February-2014 + * @brief Header for fonts.c file + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2014 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __FONTS_H +#define __FONTS_H + +/*�������΢���ź�24 (32x41) */ +#define MAX_HEIGHT_FONT 41 +#define MAX_WIDTH_FONT 32 +#define OFFSET_BITMAP + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include + +//ASCII +typedef struct _tFont +{ + const uint8_t *table; + uint16_t Width; + uint16_t Height; + +} sFONT; + + +//GB2312 +typedef struct // ������ģ���ݽṹ +{ + unsigned char index[2]; // ������������ + const char matrix[MAX_HEIGHT_FONT*MAX_WIDTH_FONT/8]; // ���������� +}CH_CN; + + +typedef struct +{ + const CH_CN *table; + uint16_t size; + uint16_t ASCII_Width; + uint16_t Width; + uint16_t Height; + +}cFONT; + +extern sFONT Font24; +extern sFONT Font20; +extern sFONT Font16; +extern sFONT Font12; +extern sFONT Font8; + +#ifdef __cplusplus +} +#endif + +#endif /* __FONTS_H */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Software/fab-reader2/components/epd_gfx/include/GUI/GUI_Paint.h b/Software/fab-reader2/components/epd_gfx/include/GUI/GUI_Paint.h new file mode 100644 index 0000000..198dc61 --- /dev/null +++ b/Software/fab-reader2/components/epd_gfx/include/GUI/GUI_Paint.h @@ -0,0 +1,218 @@ +/****************************************************************************** +* | File : GUI_Paint.h +* | Author : Waveshare electronics +* | Function : Achieve drawing: draw points, lines, boxes, circles and +* their size, solid dotted line, solid rectangle hollow +* rectangle, solid circle hollow circle. +* | Info : +* Achieve display characters: Display a single character, string, number +* Achieve time display: adaptive size display time minutes and seconds +*---------------- +* | This version: V3.0 +* | Date : 2019-04-18 +* | Info : +* ----------------------------------------------------------------------------- +* V3.0(2019-04-18): +* 1.Change: +* Paint_DrawPoint(..., DOT_STYLE DOT_STYLE) +* => Paint_DrawPoint(..., DOT_STYLE Dot_Style) +* Paint_DrawLine(..., LINE_STYLE Line_Style, DOT_PIXEL Dot_Pixel) +* => Paint_DrawLine(..., DOT_PIXEL Line_width, LINE_STYLE Line_Style) +* Paint_DrawRectangle(..., DRAW_FILL Filled, DOT_PIXEL Dot_Pixel) +* => Paint_DrawRectangle(..., DOT_PIXEL Line_width, DRAW_FILL Draw_Fill) +* Paint_DrawCircle(..., DRAW_FILL Draw_Fill, DOT_PIXEL Dot_Pixel) +* => Paint_DrawCircle(..., DOT_PIXEL Line_width, DRAW_FILL Draw_Filll) +* +* ----------------------------------------------------------------------------- +* V2.0(2018-11-15): +* 1.add: Paint_NewImage() +* Create an image's properties +* 2.add: Paint_SelectImage() +* Select the picture to be drawn +* 3.add: Paint_SetRotate() +* Set the direction of the cache +* 4.add: Paint_RotateImage() +* Can flip the picture, Support 0-360 degrees, +* but only 90.180.270 rotation is better +* 4.add: Paint_SetMirroring() +* Can Mirroring the picture, horizontal, vertical, origin +* 5.add: Paint_DrawString_CN() +* Can display Chinese(GB1312) +* +* ----------------------------------------------------------------------------- +* V1.0(2018-07-17): +* Create library +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documnetation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +* THE SOFTWARE. +* +******************************************************************************/ +#ifndef __GUI_PAINT_H +#define __GUI_PAINT_H + +#include "DEV_Config.h" +#include "../Fonts/fonts.h" + +/** + * Image attributes +**/ +typedef struct { + UBYTE *Image; + UWORD Width; + UWORD Height; + UWORD WidthMemory; + UWORD HeightMemory; + UWORD Color; + UWORD Rotate; + UWORD Mirror; + UWORD WidthByte; + UWORD HeightByte; + UWORD Scale; +} PAINT; +extern PAINT Paint; + +/** + * Display rotate +**/ +#define ROTATE_0 0 +#define ROTATE_90 90 +#define ROTATE_180 180 +#define ROTATE_270 270 + +/** + * Display Flip +**/ +typedef enum { + MIRROR_NONE = 0x00, + MIRROR_HORIZONTAL = 0x01, + MIRROR_VERTICAL = 0x02, + MIRROR_ORIGIN = 0x03, +} MIRROR_IMAGE; +#define MIRROR_IMAGE_DFT MIRROR_NONE + +/** + * image color +**/ +#define WHITE 0xFF +#define BLACK 0x00 +#define RED BLACK + +#define IMAGE_BACKGROUND WHITE +#define FONT_FOREGROUND BLACK +#define FONT_BACKGROUND WHITE + +#define TRUE 1 +#define FALSE 0 + +//4 Gray level +#define GRAY1 0x03 //Blackest +#define GRAY2 0x02 +#define GRAY3 0x01 //gray +#define GRAY4 0x00 //white + +/** + * The size of the point +**/ +typedef enum { + DOT_PIXEL_1X1 = 1, // 1 x 1 + DOT_PIXEL_2X2 , // 2 X 2 + DOT_PIXEL_3X3 , // 3 X 3 + DOT_PIXEL_4X4 , // 4 X 4 + DOT_PIXEL_5X5 , // 5 X 5 + DOT_PIXEL_6X6 , // 6 X 6 + DOT_PIXEL_7X7 , // 7 X 7 + DOT_PIXEL_8X8 , // 8 X 8 +} DOT_PIXEL; +#define DOT_PIXEL_DFT DOT_PIXEL_1X1 //Default dot pilex + +/** + * Point size fill style +**/ +typedef enum { + DOT_FILL_AROUND = 1, // dot pixel 1 x 1 + DOT_FILL_RIGHTUP , // dot pixel 2 X 2 +} DOT_STYLE; +#define DOT_STYLE_DFT DOT_FILL_AROUND //Default dot pilex + +/** + * Line style, solid or dashed +**/ +typedef enum { + LINE_STYLE_SOLID = 0, + LINE_STYLE_DOTTED, +} LINE_STYLE; + +/** + * Whether the graphic is filled +**/ +typedef enum { + DRAW_FILL_EMPTY = 0, + DRAW_FILL_FULL, +} DRAW_FILL; + +/** + * Custom structure of a time attribute +**/ +typedef struct { + UWORD Year; //0000 + UBYTE Month; //1 - 12 + UBYTE Day; //1 - 30 + UBYTE Hour; //0 - 23 + UBYTE Min; //0 - 59 + UBYTE Sec; //0 - 59 +} PAINT_TIME; +extern PAINT_TIME sPaint_time; + +//init and Clear +void Paint_NewImage(UBYTE *image, UWORD Width, UWORD Height, UWORD Rotate, UWORD Color); +void Paint_SelectImage(UBYTE *image); +void Paint_SetRotate(UWORD Rotate); +void Paint_SetMirroring(UBYTE mirror); +void Paint_SetPixel(UWORD Xpoint, UWORD Ypoint, UWORD Color); +void Paint_SetScale(UBYTE scale); + +void Paint_Clear(UWORD Color); +void Paint_ClearWindows(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend, UWORD Color); + +//Drawing +void Paint_DrawPoint(UWORD Xpoint, UWORD Ypoint, UWORD Color, DOT_PIXEL Dot_Pixel, DOT_STYLE Dot_FillWay); +void Paint_DrawLine(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend, UWORD Color, DOT_PIXEL Line_width, LINE_STYLE Line_Style); +void Paint_DrawRectangle(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend, UWORD Color, DOT_PIXEL Line_width, DRAW_FILL Draw_Fill); +void Paint_DrawCircle(UWORD X_Center, UWORD Y_Center, UWORD Radius, UWORD Color, DOT_PIXEL Line_width, DRAW_FILL Draw_Fill); + +//Display string +void Paint_DrawChar(UWORD Xstart, UWORD Ystart, const char Acsii_Char, sFONT* Font, UWORD Color_Foreground, UWORD Color_Background); +void Paint_DrawString_EN(UWORD Xstart, UWORD Ystart, const char * pString, sFONT* Font, UWORD Color_Foreground, UWORD Color_Background); +void Paint_DrawString_CN(UWORD Xstart, UWORD Ystart, const char * pString, cFONT* font, UWORD Color_Foreground, UWORD Color_Background); +void Paint_DrawNum(UWORD Xpoint, UWORD Ypoint, int32_t Nummber, sFONT* Font, UWORD Color_Foreground, UWORD Color_Background); +void Paint_DrawNumDecimals(UWORD Xpoint, UWORD Ypoint, double Nummber, sFONT* Font, UWORD Digit, UWORD Color_Foreground, UWORD Color_Background); // Able to display decimals +void Paint_DrawTime(UWORD Xstart, UWORD Ystart, PAINT_TIME *pTime, sFONT* Font, UWORD Color_Foreground, UWORD Color_Background); + +//pic +void Paint_DrawBitMap(const unsigned char* image_buffer); +void Paint_DrawBitMap_Paste(const unsigned char* image_buffer, UWORD Xstart, UWORD Ystart, UWORD imageWidth, UWORD imageHeight, UBYTE flipColor); +//void Paint_DrawBitMap_Half(const unsigned char* image_buffer, UBYTE Region); +//void Paint_DrawBitMap_OneQuarter(const unsigned char* image_buffer, UBYTE Region); +//void Paint_DrawBitMap_OneEighth(const unsigned char* image_buffer, UBYTE Region); +void Paint_DrawBitMap_Block(const unsigned char* image_buffer, UBYTE Region); +#endif + + + + + diff --git a/Software/fab-reader2-c/components/rfal/CMakeLists.txt b/Software/fab-reader2/components/rfal/CMakeLists.txt similarity index 100% rename from Software/fab-reader2-c/components/rfal/CMakeLists.txt rename to Software/fab-reader2/components/rfal/CMakeLists.txt diff --git a/Software/fab-reader2-c/components/rfal/Inc/rfal_analogConfig.h b/Software/fab-reader2/components/rfal/Inc/rfal_analogConfig.h similarity index 100% rename from Software/fab-reader2-c/components/rfal/Inc/rfal_analogConfig.h rename to Software/fab-reader2/components/rfal/Inc/rfal_analogConfig.h diff --git a/Software/fab-reader2-c/components/rfal/Inc/rfal_analogConfigTbl.h b/Software/fab-reader2/components/rfal/Inc/rfal_analogConfigTbl.h similarity index 100% rename from Software/fab-reader2-c/components/rfal/Inc/rfal_analogConfigTbl.h rename to Software/fab-reader2/components/rfal/Inc/rfal_analogConfigTbl.h diff --git a/Software/fab-reader2-c/components/rfal/Inc/rfal_chip.h b/Software/fab-reader2/components/rfal/Inc/rfal_chip.h similarity index 100% rename from Software/fab-reader2-c/components/rfal/Inc/rfal_chip.h rename to Software/fab-reader2/components/rfal/Inc/rfal_chip.h diff --git a/Software/fab-reader2-c/components/rfal/Inc/rfal_crc.h b/Software/fab-reader2/components/rfal/Inc/rfal_crc.h similarity index 100% rename from Software/fab-reader2-c/components/rfal/Inc/rfal_crc.h rename to Software/fab-reader2/components/rfal/Inc/rfal_crc.h diff --git a/Software/fab-reader2-c/components/rfal/Inc/rfal_dpo.h b/Software/fab-reader2/components/rfal/Inc/rfal_dpo.h similarity index 100% rename from Software/fab-reader2-c/components/rfal/Inc/rfal_dpo.h rename to Software/fab-reader2/components/rfal/Inc/rfal_dpo.h diff --git a/Software/fab-reader2-c/components/rfal/Inc/rfal_dpoTbl.h b/Software/fab-reader2/components/rfal/Inc/rfal_dpoTbl.h similarity index 100% rename from Software/fab-reader2-c/components/rfal/Inc/rfal_dpoTbl.h rename to Software/fab-reader2/components/rfal/Inc/rfal_dpoTbl.h diff --git a/Software/fab-reader2-c/components/rfal/Inc/rfal_features.h b/Software/fab-reader2/components/rfal/Inc/rfal_features.h similarity index 100% rename from Software/fab-reader2-c/components/rfal/Inc/rfal_features.h rename to Software/fab-reader2/components/rfal/Inc/rfal_features.h diff --git a/Software/fab-reader2-c/components/rfal/Inc/rfal_iso15693_2.h b/Software/fab-reader2/components/rfal/Inc/rfal_iso15693_2.h similarity index 100% rename from Software/fab-reader2-c/components/rfal/Inc/rfal_iso15693_2.h rename to Software/fab-reader2/components/rfal/Inc/rfal_iso15693_2.h diff --git a/Software/fab-reader2-c/components/rfal/Inc/rfal_isoDep.h b/Software/fab-reader2/components/rfal/Inc/rfal_isoDep.h similarity index 100% rename from Software/fab-reader2-c/components/rfal/Inc/rfal_isoDep.h rename to Software/fab-reader2/components/rfal/Inc/rfal_isoDep.h diff --git a/Software/fab-reader2-c/components/rfal/Inc/rfal_nfc.h b/Software/fab-reader2/components/rfal/Inc/rfal_nfc.h similarity index 100% rename from Software/fab-reader2-c/components/rfal/Inc/rfal_nfc.h rename to Software/fab-reader2/components/rfal/Inc/rfal_nfc.h diff --git a/Software/fab-reader2-c/components/rfal/Inc/rfal_nfcDep.h b/Software/fab-reader2/components/rfal/Inc/rfal_nfcDep.h similarity index 100% rename from Software/fab-reader2-c/components/rfal/Inc/rfal_nfcDep.h rename to Software/fab-reader2/components/rfal/Inc/rfal_nfcDep.h diff --git a/Software/fab-reader2-c/components/rfal/Inc/rfal_nfca.h b/Software/fab-reader2/components/rfal/Inc/rfal_nfca.h similarity index 100% rename from Software/fab-reader2-c/components/rfal/Inc/rfal_nfca.h rename to Software/fab-reader2/components/rfal/Inc/rfal_nfca.h diff --git a/Software/fab-reader2-c/components/rfal/Inc/rfal_nfcb.h b/Software/fab-reader2/components/rfal/Inc/rfal_nfcb.h similarity index 100% rename from Software/fab-reader2-c/components/rfal/Inc/rfal_nfcb.h rename to Software/fab-reader2/components/rfal/Inc/rfal_nfcb.h diff --git a/Software/fab-reader2-c/components/rfal/Inc/rfal_nfcf.h b/Software/fab-reader2/components/rfal/Inc/rfal_nfcf.h similarity index 100% rename from Software/fab-reader2-c/components/rfal/Inc/rfal_nfcf.h rename to Software/fab-reader2/components/rfal/Inc/rfal_nfcf.h diff --git a/Software/fab-reader2-c/components/rfal/Inc/rfal_nfcv.h b/Software/fab-reader2/components/rfal/Inc/rfal_nfcv.h similarity index 100% rename from Software/fab-reader2-c/components/rfal/Inc/rfal_nfcv.h rename to Software/fab-reader2/components/rfal/Inc/rfal_nfcv.h diff --git a/Software/fab-reader2-c/components/rfal/Inc/rfal_rf.h b/Software/fab-reader2/components/rfal/Inc/rfal_rf.h similarity index 100% rename from Software/fab-reader2-c/components/rfal/Inc/rfal_rf.h rename to Software/fab-reader2/components/rfal/Inc/rfal_rf.h diff --git a/Software/fab-reader2-c/components/rfal/Inc/rfal_st25tb.h b/Software/fab-reader2/components/rfal/Inc/rfal_st25tb.h similarity index 100% rename from Software/fab-reader2-c/components/rfal/Inc/rfal_st25tb.h rename to Software/fab-reader2/components/rfal/Inc/rfal_st25tb.h diff --git a/Software/fab-reader2-c/components/rfal/Inc/rfal_st25xv.h b/Software/fab-reader2/components/rfal/Inc/rfal_st25xv.h similarity index 100% rename from Software/fab-reader2-c/components/rfal/Inc/rfal_st25xv.h rename to Software/fab-reader2/components/rfal/Inc/rfal_st25xv.h diff --git a/Software/fab-reader2-c/components/rfal/Inc/rfal_t1t.h b/Software/fab-reader2/components/rfal/Inc/rfal_t1t.h similarity index 100% rename from Software/fab-reader2-c/components/rfal/Inc/rfal_t1t.h rename to Software/fab-reader2/components/rfal/Inc/rfal_t1t.h diff --git a/Software/fab-reader2-c/components/rfal/Inc/rfal_t2t.h b/Software/fab-reader2/components/rfal/Inc/rfal_t2t.h similarity index 100% rename from Software/fab-reader2-c/components/rfal/Inc/rfal_t2t.h rename to Software/fab-reader2/components/rfal/Inc/rfal_t2t.h diff --git a/Software/fab-reader2-c/components/rfal/Inc/rfal_t4t.h b/Software/fab-reader2/components/rfal/Inc/rfal_t4t.h similarity index 100% rename from Software/fab-reader2-c/components/rfal/Inc/rfal_t4t.h rename to Software/fab-reader2/components/rfal/Inc/rfal_t4t.h diff --git a/Software/fab-reader2-c/components/rfal/Src/rfal_analogConfig.c b/Software/fab-reader2/components/rfal/Src/rfal_analogConfig.c similarity index 100% rename from Software/fab-reader2-c/components/rfal/Src/rfal_analogConfig.c rename to Software/fab-reader2/components/rfal/Src/rfal_analogConfig.c diff --git a/Software/fab-reader2-c/components/rfal/Src/rfal_crc.c b/Software/fab-reader2/components/rfal/Src/rfal_crc.c similarity index 100% rename from Software/fab-reader2-c/components/rfal/Src/rfal_crc.c rename to Software/fab-reader2/components/rfal/Src/rfal_crc.c diff --git a/Software/fab-reader2-c/components/rfal/Src/rfal_dpo.c b/Software/fab-reader2/components/rfal/Src/rfal_dpo.c similarity index 100% rename from Software/fab-reader2-c/components/rfal/Src/rfal_dpo.c rename to Software/fab-reader2/components/rfal/Src/rfal_dpo.c diff --git a/Software/fab-reader2-c/components/rfal/Src/rfal_iso15693_2.c b/Software/fab-reader2/components/rfal/Src/rfal_iso15693_2.c similarity index 100% rename from Software/fab-reader2-c/components/rfal/Src/rfal_iso15693_2.c rename to Software/fab-reader2/components/rfal/Src/rfal_iso15693_2.c diff --git a/Software/fab-reader2-c/components/rfal/Src/rfal_isoDep.c b/Software/fab-reader2/components/rfal/Src/rfal_isoDep.c similarity index 100% rename from Software/fab-reader2-c/components/rfal/Src/rfal_isoDep.c rename to Software/fab-reader2/components/rfal/Src/rfal_isoDep.c diff --git a/Software/fab-reader2-c/components/rfal/Src/rfal_nfc.c b/Software/fab-reader2/components/rfal/Src/rfal_nfc.c similarity index 100% rename from Software/fab-reader2-c/components/rfal/Src/rfal_nfc.c rename to Software/fab-reader2/components/rfal/Src/rfal_nfc.c diff --git a/Software/fab-reader2-c/components/rfal/Src/rfal_nfcDep.c b/Software/fab-reader2/components/rfal/Src/rfal_nfcDep.c similarity index 100% rename from Software/fab-reader2-c/components/rfal/Src/rfal_nfcDep.c rename to Software/fab-reader2/components/rfal/Src/rfal_nfcDep.c diff --git a/Software/fab-reader2-c/components/rfal/Src/rfal_nfca.c b/Software/fab-reader2/components/rfal/Src/rfal_nfca.c similarity index 100% rename from Software/fab-reader2-c/components/rfal/Src/rfal_nfca.c rename to Software/fab-reader2/components/rfal/Src/rfal_nfca.c diff --git a/Software/fab-reader2-c/components/rfal/Src/rfal_nfcb.c b/Software/fab-reader2/components/rfal/Src/rfal_nfcb.c similarity index 100% rename from Software/fab-reader2-c/components/rfal/Src/rfal_nfcb.c rename to Software/fab-reader2/components/rfal/Src/rfal_nfcb.c diff --git a/Software/fab-reader2-c/components/rfal/Src/rfal_nfcf.c b/Software/fab-reader2/components/rfal/Src/rfal_nfcf.c similarity index 100% rename from Software/fab-reader2-c/components/rfal/Src/rfal_nfcf.c rename to Software/fab-reader2/components/rfal/Src/rfal_nfcf.c diff --git a/Software/fab-reader2-c/components/rfal/Src/rfal_nfcv.c b/Software/fab-reader2/components/rfal/Src/rfal_nfcv.c similarity index 100% rename from Software/fab-reader2-c/components/rfal/Src/rfal_nfcv.c rename to Software/fab-reader2/components/rfal/Src/rfal_nfcv.c diff --git a/Software/fab-reader2-c/components/rfal/Src/rfal_rfst25r3911.c b/Software/fab-reader2/components/rfal/Src/rfal_rfst25r3911.c similarity index 100% rename from Software/fab-reader2-c/components/rfal/Src/rfal_rfst25r3911.c rename to Software/fab-reader2/components/rfal/Src/rfal_rfst25r3911.c diff --git a/Software/fab-reader2-c/components/rfal/Src/rfal_st25tb.c b/Software/fab-reader2/components/rfal/Src/rfal_st25tb.c similarity index 100% rename from Software/fab-reader2-c/components/rfal/Src/rfal_st25tb.c rename to Software/fab-reader2/components/rfal/Src/rfal_st25tb.c diff --git a/Software/fab-reader2-c/components/rfal/Src/rfal_st25xv.c b/Software/fab-reader2/components/rfal/Src/rfal_st25xv.c similarity index 100% rename from Software/fab-reader2-c/components/rfal/Src/rfal_st25xv.c rename to Software/fab-reader2/components/rfal/Src/rfal_st25xv.c diff --git a/Software/fab-reader2-c/components/rfal/Src/rfal_t1t.c b/Software/fab-reader2/components/rfal/Src/rfal_t1t.c similarity index 100% rename from Software/fab-reader2-c/components/rfal/Src/rfal_t1t.c rename to Software/fab-reader2/components/rfal/Src/rfal_t1t.c diff --git a/Software/fab-reader2-c/components/rfal/Src/rfal_t2t.c b/Software/fab-reader2/components/rfal/Src/rfal_t2t.c similarity index 100% rename from Software/fab-reader2-c/components/rfal/Src/rfal_t2t.c rename to Software/fab-reader2/components/rfal/Src/rfal_t2t.c diff --git a/Software/fab-reader2-c/components/rfal/Src/rfal_t4t.c b/Software/fab-reader2/components/rfal/Src/rfal_t4t.c similarity index 100% rename from Software/fab-reader2-c/components/rfal/Src/rfal_t4t.c rename to Software/fab-reader2/components/rfal/Src/rfal_t4t.c diff --git a/Software/fab-reader2-c/components/st25r3911/CMakeLists.txt b/Software/fab-reader2/components/st25r3911/CMakeLists.txt similarity index 61% rename from Software/fab-reader2-c/components/st25r3911/CMakeLists.txt rename to Software/fab-reader2/components/st25r3911/CMakeLists.txt index 66900f1..111a817 100644 --- a/Software/fab-reader2-c/components/st25r3911/CMakeLists.txt +++ b/Software/fab-reader2/components/st25r3911/CMakeLists.txt @@ -1,2 +1,3 @@ idf_component_register(SRCS "st25r3911.c" "st25r3911_com.c" "st25r3911_interrupt.c" "timer.c" "st25r3911_spi.c" "utils.c" - INCLUDE_DIRS "." REQUIRES driver) + INCLUDE_DIRS "." + REQUIRES "driver") diff --git a/Software/fab-reader2-c/components/st25r3911/Release_Notes.html b/Software/fab-reader2/components/st25r3911/Release_Notes.html similarity index 100% rename from Software/fab-reader2-c/components/st25r3911/Release_Notes.html rename to Software/fab-reader2/components/st25r3911/Release_Notes.html diff --git a/Software/fab-reader2-c/components/st25r3911/platform.h b/Software/fab-reader2/components/st25r3911/platform.h similarity index 99% rename from Software/fab-reader2-c/components/st25r3911/platform.h rename to Software/fab-reader2/components/st25r3911/platform.h index c61c170..9686cd5 100644 --- a/Software/fab-reader2-c/components/st25r3911/platform.h +++ b/Software/fab-reader2/components/st25r3911/platform.h @@ -56,7 +56,7 @@ ****************************************************************************** */ #include - +#include #include #include diff --git a/Software/fab-reader2-c/components/st25r3911/st25r3911.c b/Software/fab-reader2/components/st25r3911/st25r3911.c similarity index 100% rename from Software/fab-reader2-c/components/st25r3911/st25r3911.c rename to Software/fab-reader2/components/st25r3911/st25r3911.c diff --git a/Software/fab-reader2-c/components/st25r3911/st25r3911.h b/Software/fab-reader2/components/st25r3911/st25r3911.h similarity index 100% rename from Software/fab-reader2-c/components/st25r3911/st25r3911.h rename to Software/fab-reader2/components/st25r3911/st25r3911.h diff --git a/Software/fab-reader2-c/components/st25r3911/st25r3911_com.c b/Software/fab-reader2/components/st25r3911/st25r3911_com.c similarity index 100% rename from Software/fab-reader2-c/components/st25r3911/st25r3911_com.c rename to Software/fab-reader2/components/st25r3911/st25r3911_com.c diff --git a/Software/fab-reader2-c/components/st25r3911/st25r3911_com.h b/Software/fab-reader2/components/st25r3911/st25r3911_com.h similarity index 100% rename from Software/fab-reader2-c/components/st25r3911/st25r3911_com.h rename to Software/fab-reader2/components/st25r3911/st25r3911_com.h diff --git a/Software/fab-reader2-c/components/st25r3911/st25r3911_interrupt.c b/Software/fab-reader2/components/st25r3911/st25r3911_interrupt.c similarity index 100% rename from Software/fab-reader2-c/components/st25r3911/st25r3911_interrupt.c rename to Software/fab-reader2/components/st25r3911/st25r3911_interrupt.c diff --git a/Software/fab-reader2-c/components/st25r3911/st25r3911_interrupt.h b/Software/fab-reader2/components/st25r3911/st25r3911_interrupt.h similarity index 96% rename from Software/fab-reader2-c/components/st25r3911/st25r3911_interrupt.h rename to Software/fab-reader2/components/st25r3911/st25r3911_interrupt.h index cbc9162..f133d3f 100644 --- a/Software/fab-reader2-c/components/st25r3911/st25r3911_interrupt.h +++ b/Software/fab-reader2/components/st25r3911/st25r3911_interrupt.h @@ -108,9 +108,6 @@ ****************************************************************************** */ -#ifdef __cplusplus -extern "C" { -#endif /*! ***************************************************************************** @@ -240,10 +237,6 @@ extern void st25r3911IRQCallbackSet(void (*cb)(void)); */ extern void st25r3911IRQCallbackRestore(void); -#ifdef __cplusplus -} -#endif - #endif /* ST25R3911_ISR_H */ /** diff --git a/Software/fab-reader2-c/components/st25r3911/st25r3911_spi.c b/Software/fab-reader2/components/st25r3911/st25r3911_spi.c similarity index 100% rename from Software/fab-reader2-c/components/st25r3911/st25r3911_spi.c rename to Software/fab-reader2/components/st25r3911/st25r3911_spi.c diff --git a/Software/fab-reader2-c/components/st25r3911/st25r3911_spi.h b/Software/fab-reader2/components/st25r3911/st25r3911_spi.h similarity index 83% rename from Software/fab-reader2-c/components/st25r3911/st25r3911_spi.h rename to Software/fab-reader2/components/st25r3911/st25r3911_spi.h index de52750..c003686 100644 --- a/Software/fab-reader2-c/components/st25r3911/st25r3911_spi.h +++ b/Software/fab-reader2/components/st25r3911/st25r3911_spi.h @@ -8,16 +8,8 @@ #include #include -#ifdef __cplusplus -extern "C" { -#endif - void st25r3911_spi_init(spi_device_handle_t spi); esp_err_t st25r3911_spiTxRx(const uint8_t *txData, uint8_t *rxData, uint16_t length); -#ifdef __cplusplus -} -#endif - #endif //FAB_READER2_C_ST25R3911_SPI_H diff --git a/Software/fab-reader2-c/components/st25r3911/st_errno.h b/Software/fab-reader2/components/st25r3911/st_errno.h similarity index 100% rename from Software/fab-reader2-c/components/st25r3911/st_errno.h rename to Software/fab-reader2/components/st25r3911/st_errno.h diff --git a/Software/fab-reader2-c/components/st25r3911/timer.c b/Software/fab-reader2/components/st25r3911/timer.c similarity index 100% rename from Software/fab-reader2-c/components/st25r3911/timer.c rename to Software/fab-reader2/components/st25r3911/timer.c diff --git a/Software/fab-reader2-c/components/st25r3911/timer.h b/Software/fab-reader2/components/st25r3911/timer.h similarity index 100% rename from Software/fab-reader2-c/components/st25r3911/timer.h rename to Software/fab-reader2/components/st25r3911/timer.h diff --git a/Software/fab-reader2-c/components/st25r3911/utils.c b/Software/fab-reader2/components/st25r3911/utils.c similarity index 100% rename from Software/fab-reader2-c/components/st25r3911/utils.c rename to Software/fab-reader2/components/st25r3911/utils.c diff --git a/Software/fab-reader2-c/components/st25r3911/utils.h b/Software/fab-reader2/components/st25r3911/utils.h similarity index 100% rename from Software/fab-reader2-c/components/st25r3911/utils.h rename to Software/fab-reader2/components/st25r3911/utils.h diff --git a/Software/fab-reader2-c/esp32s3.svd b/Software/fab-reader2/esp32s3.svd similarity index 100% rename from Software/fab-reader2-c/esp32s3.svd rename to Software/fab-reader2/esp32s3.svd diff --git a/Software/fab-reader2-c/gdbinit b/Software/fab-reader2/gdbinit similarity index 100% rename from Software/fab-reader2-c/gdbinit rename to Software/fab-reader2/gdbinit diff --git a/Software/fab-reader2/main/CMakeLists.txt b/Software/fab-reader2/main/CMakeLists.txt new file mode 100644 index 0000000..e9069de --- /dev/null +++ b/Software/fab-reader2/main/CMakeLists.txt @@ -0,0 +1,4 @@ +idf_component_register(SRCS "fab-reader2.c" "nfc/pollingtagdetect.c" "epd/qrurn.c" "epd/FabAccess_Icon_NoHeader.c" "epd/EPD_2in66_test.c" "epd/epd.c" "epd/EPD_2in66_test.c" "ota/ota.c" + INCLUDE_DIRS "." "nfc" "epd" "ota" + REQUIRES "rfal" "epd_266" "epd_gfx" + PRIV_REQUIRES "driver nvs_flash mqtt") diff --git a/Software/fab-reader2/main/Kconfig.projbuild b/Software/fab-reader2/main/Kconfig.projbuild new file mode 100644 index 0000000..f0bec5c --- /dev/null +++ b/Software/fab-reader2/main/Kconfig.projbuild @@ -0,0 +1,50 @@ +menu "FabReader Configuration" + + config WIFI_SSID + string "WiFi SSID" + default "myssid" + help + SSID (network name) for the example to connect to. + + config WIFI_PASSWORD + string "WiFi Password" + default "mypassword" + help + WiFi password (WPA or WPA2) for the example to use. + + choice WIFI_SCAN_METHOD + prompt "scan method" + default WIFI_FAST_SCAN + help + scan method for the esp32 to use + + config WIFI_FAST_SCAN + bool "fast" + config WIFI_ALL_CHANNEL_SCAN + bool "all" + endchoice + + config BROKER_URI + string "Broker URL" + default "mqtts://mqtt.eclipseprojects.io:8883" + help + URL of an mqtt broker which this example connects to. + + config BROKER_CERTIFICATE_OVERRIDE + string "Broker certificate override" + default "" + help + Please leave empty if broker certificate included from a textfile; otherwise fill in a base64 part of PEM + format certificate + + config BROKER_CERTIFICATE_OVERRIDDEN + bool + default y if BROKER_CERTIFICATE_OVERRIDE != "" + + config FABREADER2_ID + int "FabReader2 ID" + default 1 + help + Numerical ID of the FabReader2 device + +endmenu \ No newline at end of file diff --git a/Software/fab-reader2/main/epd/EPD_2in66_test.c b/Software/fab-reader2/main/epd/EPD_2in66_test.c new file mode 100644 index 0000000..7f684cf --- /dev/null +++ b/Software/fab-reader2/main/epd/EPD_2in66_test.c @@ -0,0 +1,160 @@ +/***************************************************************************** +* | File : EPD_2IN66_test.c +* | Author : Waveshare team +* | Function : 2.66inch e-paper test demo +* | Info : +*---------------- +* | This version: V1.0 +* | Date : 2020-07-29 +* | Info : +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documnetation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# +******************************************************************************/ +#include "epd.h" +#include "EPD_2in66.h" + +int EPD_test(void) +{ + printf("EPD_2IN66_test Demo\r\n"); + if(DEV_Module_Init()!=0){ + return -1; + } + + printf("e-Paper Init and Clear...\r\n"); + EPD_2IN66_Init(); +// EPD_2IN66_Clear(); +// DEV_Delay_ms(500); + + //Create a new image cache + UBYTE *BlackImage; + /* you have to edit the startup_stm32fxxx.s file and set a big enough heap size */ + UWORD Imagesize = ((EPD_2IN66_WIDTH % 8 == 0)? (EPD_2IN66_WIDTH / 8 ): (EPD_2IN66_WIDTH / 8 + 1)) * EPD_2IN66_HEIGHT; + if((BlackImage = (UBYTE *)malloc(Imagesize)) == NULL) { + printf("Failed to apply for black memory...\r\n"); + return -1; + } + printf("Paint_NewImage\r\n"); + Paint_NewImage(BlackImage, EPD_2IN66_WIDTH, EPD_2IN66_HEIGHT, 270, WHITE); + + Paint_SelectImage(BlackImage); + Paint_Clear(WHITE); + Paint_DrawString_EN(10, 10, "Welcome to FabAccess", &Font16, WHITE, BLACK); + Paint_DrawBitMap_Paste(gImage_FabAccess_Icon_NoHeader, 20, 40, 100, 98, TRUE); + Paint_DrawBitMap_Paste(gImage_qrurn, 130, 40, 100, 100, TRUE); + EPD_2IN66_Display(BlackImage); + + +#if 0 //show image for array + printf("show image for array\r\n"); + Paint_SelectImage(BlackImage); + Paint_Clear(WHITE); + Paint_DrawBitMap(gImage_2in66); + Paint_DrawBitMap_Paste(gImage_100X50, 10, 10, 100, 50, TRUE); + EPD_2IN66_Display(BlackImage); + DEV_Delay_ms(10000); +#endif + +#if 0 // Drawing on the image + //1.Select Image + Paint_SelectImage(BlackImage); + Paint_Clear(WHITE); + + // 2.Drawing on the image + printf("Drawing:BlackImage\r\n"); + Paint_DrawPoint(10, 80, BLACK, DOT_PIXEL_1X1, DOT_STYLE_DFT); + Paint_DrawPoint(10, 90, BLACK, DOT_PIXEL_2X2, DOT_STYLE_DFT); + Paint_DrawPoint(10, 100, BLACK, DOT_PIXEL_3X3, DOT_STYLE_DFT); + + Paint_DrawLine(20, 70, 70, 120, BLACK, DOT_PIXEL_1X1, LINE_STYLE_SOLID); + Paint_DrawLine(70, 70, 20, 120, BLACK, DOT_PIXEL_1X1, LINE_STYLE_SOLID); + + Paint_DrawRectangle(20, 70, 70, 120, BLACK, DOT_PIXEL_1X1, DRAW_FILL_EMPTY); + Paint_DrawRectangle(80, 70, 130, 120, BLACK, DOT_PIXEL_1X1, DRAW_FILL_FULL); + + Paint_DrawCircle(45, 95, 20, BLACK, DOT_PIXEL_1X1, DRAW_FILL_EMPTY); + Paint_DrawCircle(105, 95, 20, WHITE, DOT_PIXEL_1X1, DRAW_FILL_FULL); + + Paint_DrawLine(85, 95, 125, 95, BLACK, DOT_PIXEL_1X1, LINE_STYLE_DOTTED); + Paint_DrawLine(105, 75, 105, 115, BLACK, DOT_PIXEL_1X1, LINE_STYLE_DOTTED); + + Paint_DrawString_EN(10, 0, "waveshare", &Font16, BLACK, WHITE); + Paint_DrawString_EN(10, 20, "hello world", &Font12, WHITE, BLACK); + + Paint_DrawNum(10, 33, 123456789, &Font12, BLACK, WHITE); + Paint_DrawNum(10, 50, 987654321, &Font16, WHITE, BLACK); + + EPD_2IN66_Display(BlackImage); + DEV_Delay_ms(10000); +#endif + +#if 0 //partial refresh, show time + printf("EPD_2IN66_DisplayPart\r\n"); + EPD_2IN66_Init_Partial(); + + Paint_SelectImage(BlackImage); + + PAINT_TIME sPaint_time; //time struct + sPaint_time.Hour = 12; + sPaint_time.Min = 34; + sPaint_time.Sec = 56; + + for (uint8_t i = 100; i > 0; i--) { + sPaint_time.Sec = sPaint_time.Sec + 1; + if (sPaint_time.Sec == 60) { + sPaint_time.Min = sPaint_time.Min + 1; + sPaint_time.Sec = 0; + if (sPaint_time.Min == 60) { + sPaint_time.Hour = sPaint_time.Hour + 1; + sPaint_time.Min = 0; + if (sPaint_time.Hour == 24) { + sPaint_time.Hour = 0; + sPaint_time.Min = 0; + sPaint_time.Sec = 0; + } + } + } + + Paint_ClearWindows(180, 100, 296, 152, WHITE); + Paint_DrawTime(180, 110, &sPaint_time, &Font20, WHITE, BLACK); + + printf("Part refresh...\r\n"); + EPD_2IN66_Display(BlackImage); + + DEV_Delay_ms(500); + } + EPD_2IN66_Clear(); +#endif + +// printf("Clear...\r\n"); +// EPD_2IN66_Init(); +// EPD_2IN66_Clear(); + + printf("Goto Sleep...\r\n"); + EPD_2IN66_Sleep(); + + free(BlackImage); + BlackImage = NULL; + // close 5V + printf("close 5V, Module enters 0 power consumption ...\r\n"); + DEV_Module_Exit(); + + return 0; +} + diff --git a/Software/fab-reader2/main/epd/FabAccess_Icon_NoHeader.c b/Software/fab-reader2/main/epd/FabAccess_Icon_NoHeader.c new file mode 100644 index 0000000..5cf8d84 --- /dev/null +++ b/Software/fab-reader2/main/epd/FabAccess_Icon_NoHeader.c @@ -0,0 +1,81 @@ +const unsigned char gImage_FabAccess_Icon_NoHeader[1274] = { /* 0X00,0X01,0X64,0X00,0X62,0X00, */ +0X00,0X00,0X7F,0XC0,0X00,0X00,0X00,0X00,0X00,0X3F,0XE0,0X00,0X00,0X00,0X03,0XFF, +0XF8,0X00,0X00,0X00,0X00,0X01,0XFF,0XFC,0X00,0X00,0X00,0X1F,0XFF,0XFF,0X00,0X00, +0X00,0X00,0X0F,0XFF,0XFF,0X80,0X00,0X00,0X3F,0XFF,0XFF,0X80,0X00,0X00,0X00,0X1F, +0XFF,0XFF,0XC0,0X00,0X00,0XFF,0XFF,0XFF,0XE0,0X00,0X00,0X00,0X7F,0XFF,0XFF,0XF0, +0X00,0X01,0XFF,0XFF,0XFF,0XF0,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XF8,0X00,0X03,0XFF, +0XFF,0XFF,0XF8,0X00,0X00,0X01,0XFF,0XFF,0XFF,0XFC,0X00,0X07,0XFF,0XE0,0XFF,0XFC, +0XFF,0XFF,0XF3,0XFF,0XF0,0X7F,0XFE,0X00,0X0F,0XFF,0X80,0X3F,0XFE,0X7F,0XFF,0XE7, +0XFF,0XC0,0X1F,0XFF,0X00,0X0F,0XFF,0X00,0X1F,0XFE,0X7F,0XFF,0XE7,0XFF,0X80,0X0F, +0XFF,0X00,0X1F,0XFE,0X01,0X8F,0XFF,0X3F,0XFF,0XCF,0XFF,0X18,0X07,0XFF,0X80,0X3F, +0XFE,0X07,0XCF,0XFF,0X00,0X00,0X1F,0XFF,0X3E,0X07,0XFF,0XC0,0X3F,0XFE,0X0F,0XEF, +0XFF,0X80,0X00,0X1F,0XFF,0X7F,0X07,0XFF,0XC0,0X7F,0XFC,0X0F,0X87,0XFF,0X80,0X00, +0X1F,0XFE,0X1F,0X03,0XFF,0XC0,0X7F,0XFC,0X0F,0X07,0XFF,0XC0,0X00,0X3F,0XFE,0X0F, +0X03,0XFF,0XE0,0X7F,0XFC,0X0F,0XEF,0XFF,0XC0,0X00,0X3F,0XFF,0X7F,0X03,0XFF,0XE0, +0X7F,0XFE,0X07,0XC0,0XFF,0XC0,0X00,0X3F,0XF8,0X3E,0X07,0XFF,0XE0,0XFF,0XFE,0X03, +0XC0,0X00,0X60,0X00,0X60,0X00,0X3C,0X07,0XFF,0XF0,0XFF,0XFF,0X00,0X00,0X00,0X0F, +0XFF,0X00,0X00,0X00,0X0F,0XFF,0XF0,0XFF,0XFF,0X80,0X38,0X00,0X07,0XFE,0X00,0X01, +0XC0,0X1F,0XFF,0XF0,0XFF,0XFF,0XC0,0X7F,0XF0,0X07,0XFE,0X00,0XFF,0XE0,0X3F,0XFF, +0XF0,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0X00,0X7F,0XFF,0XFF,0XFF,0XFF,0XF0,0XFF,0XFF, +0XFF,0XFF,0XFF,0XE0,0X00,0X7F,0XFF,0XFF,0XFF,0XFF,0XF0,0XFF,0XFF,0XFF,0XFF,0XFF, +0XE0,0X00,0X7F,0XFF,0XFF,0XFF,0XFF,0XF0,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0X00,0X7F, +0XFF,0XFF,0XFF,0XFF,0XF0,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0,0X00,0X78,0X00,0X00,0X00, +0X00,0XF0,0X7F,0XFF,0XFF,0XFF,0XFF,0XC0,0X00,0X78,0X00,0X00,0X00,0X00,0XF0,0X7F, +0XFF,0XFF,0XFF,0XFF,0XC0,0X00,0X78,0X00,0X00,0X00,0X00,0XF0,0X7F,0XFF,0XFF,0XFF, +0XFF,0XC0,0X00,0X78,0X00,0X00,0X00,0X00,0XF0,0X3F,0XFF,0XFF,0XFF,0XFF,0X80,0X00, +0X78,0X00,0X00,0X00,0X00,0XF0,0X3F,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X78,0X00,0X00, +0X00,0X00,0XF0,0X1F,0XFF,0XFF,0XFF,0XFF,0X00,0X00,0X78,0X00,0X00,0X00,0X00,0XF0, +0X1F,0XFF,0XFF,0XFF,0XFF,0X00,0X00,0X78,0X00,0X00,0X00,0X00,0XF0,0X0F,0XFF,0XFF, +0XFF,0XFE,0X00,0X00,0X78,0X00,0X00,0X00,0X00,0XF0,0X07,0XFF,0XFF,0XFF,0XFC,0X00, +0X00,0X78,0X00,0X7F,0XF0,0X00,0XF0,0X03,0XFF,0XFF,0XFF,0XF8,0X00,0X00,0X78,0X01, +0XFF,0XFC,0X00,0XF0,0X01,0XFF,0XFF,0XFF,0XF0,0X00,0X00,0X78,0X07,0XFF,0XFF,0X00, +0XF0,0X00,0XFF,0XFF,0XFF,0XE0,0X00,0X00,0X78,0X1F,0XF0,0X7F,0XC0,0XF0,0X00,0X7F, +0XFF,0XFF,0XC0,0X00,0X00,0X78,0X3F,0X80,0X07,0XE0,0XF0,0X00,0X1F,0XFF,0XFF,0X00, +0X00,0X00,0X78,0X3E,0X1F,0XC3,0XF0,0XF0,0X00,0X0F,0XFF,0XFC,0X00,0X00,0X00,0X78, +0X78,0XFF,0XF8,0XF0,0XF0,0X00,0X03,0XFF,0XF8,0X00,0X00,0X00,0X78,0X31,0XFF,0XFC, +0X60,0XF0,0X00,0X03,0XFF,0XF8,0X00,0X00,0X00,0X78,0X03,0XFF,0XFE,0X00,0XF0,0X00, +0X03,0XFF,0XF8,0X00,0X00,0X00,0X78,0X07,0XE0,0X1F,0X00,0XF0,0X00,0X03,0XFF,0XF8, +0X00,0X00,0X00,0X78,0X07,0X87,0X0F,0X00,0XF0,0X00,0X03,0XFF,0XF8,0X00,0X00,0X00, +0X78,0X03,0X3F,0XE6,0X00,0XF0,0X00,0X03,0XC7,0XF8,0X00,0X00,0X00,0X78,0X00,0X7F, +0XF0,0X00,0XF0,0X00,0X03,0XC7,0XF8,0X00,0X00,0X00,0X78,0X00,0X7F,0XF0,0X00,0XF0, +0X00,0X03,0XC7,0XF8,0X00,0X00,0X00,0X78,0X00,0X70,0X70,0X00,0XF0,0X00,0X03,0XC7, +0XF8,0X00,0X00,0X00,0X78,0X00,0X00,0X00,0X00,0XF0,0X00,0X03,0XC7,0XF8,0X00,0X00, +0X00,0X78,0X00,0X07,0X00,0X00,0XF0,0X00,0X03,0XC7,0XF0,0X00,0X00,0X00,0X78,0X00, +0X07,0X00,0X00,0XF0,0X00,0X03,0XC7,0XE0,0X00,0X00,0X00,0X78,0X00,0X07,0X00,0X00, +0XF0,0X00,0X03,0XC7,0XE0,0X00,0X00,0X00,0X78,0X00,0X00,0X00,0X00,0XF0,0X00,0X03, +0XC7,0XE0,0X00,0X00,0X00,0X78,0X00,0X00,0X00,0X00,0XF0,0X00,0X03,0XC7,0XE0,0X00, +0X00,0X00,0X78,0X00,0X00,0X00,0X00,0XF0,0X00,0X03,0XC7,0XF0,0X00,0X00,0X00,0X78, +0X00,0X00,0X00,0X00,0XF0,0X00,0X03,0XC7,0XF0,0X00,0X00,0X00,0X78,0X00,0X00,0X00, +0X00,0XF0,0X00,0X03,0XC7,0XF8,0X00,0X00,0X00,0X78,0X00,0X00,0X00,0X00,0XF0,0X00, +0X03,0XC7,0XF8,0X00,0X00,0X00,0X78,0X00,0X00,0X00,0X00,0XF0,0X00,0X03,0XC7,0XF8, +0X00,0X00,0X00,0X7F,0XFF,0XFF,0XFF,0XFF,0XF0,0X00,0X03,0XC7,0XF0,0X00,0X00,0X00, +0X7F,0XFF,0XFF,0XFF,0XFF,0XF0,0X00,0X03,0XC7,0XE0,0X00,0X00,0X00,0X7F,0XFF,0XFF, +0XFF,0XFF,0XF0,0X00,0X03,0XC7,0XC0,0X00,0X00,0X00,0X7F,0XFF,0XFF,0XFF,0XFF,0XF0, +0X00,0X03,0XC7,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X03,0XC7, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X03,0XC7,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X03,0XC7,0X80,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X03,0XC7,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X03,0XC7,0XC0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X03, +0XC7,0XE0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X03,0XC7,0XF0,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X03,0XC7,0XF0,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X03,0XC7,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X03,0XC7,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X03,0XC7,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X03,0XC7,0XF8, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X03,0XC7,0XF8,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X03,0XC7,0XF8,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X03,0XC7,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X03,0XC7,0XE0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X03,0XC7, +0XC0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X03,0XC7,0XE0,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X03,0XC7,0XE0,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X03,0XC7,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X03,0XC7,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X03, +0XC7,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X03,0XC7,0XF8,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X03,0XD7,0XF8,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X03,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X03,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X03,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0XFF,0XF0, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XE0,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X7F,0X80,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X3F,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X1C,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X08, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,}; diff --git a/Software/fab-reader2/main/epd/ImageData.h b/Software/fab-reader2/main/epd/ImageData.h new file mode 100644 index 0000000..2245401 --- /dev/null +++ b/Software/fab-reader2/main/epd/ImageData.h @@ -0,0 +1,43 @@ +/***************************************************************************** +* | File : ImageData.h +* | Author : Waveshare team +* | Function : +*---------------- +* | This version: V1.0 +* | Date : 2018-10-23 +* | Info : +* +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documnetation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# + +******************************************************************************/ + +#ifndef _IMAGEDATA_H_ +#define _IMAGEDATA_H_ + +// FabAccess_Icon.c + +extern const unsigned char gImage_FabAccess_Icon_NoHeader[]; +extern const unsigned char gImage_qrurn[]; + +#endif +/* FILE END */ + + diff --git a/Software/fab-reader2/main/epd/epd.c b/Software/fab-reader2/main/epd/epd.c new file mode 100644 index 0000000..5b86b51 --- /dev/null +++ b/Software/fab-reader2/main/epd/epd.c @@ -0,0 +1,215 @@ +// +// Created by Kai Jan Kriegel on 03.02.23. +// + +#include "epd.h" +#include "EPD_2in66.h" +#include "platform.h" +#include +#include + +display_t epd_display; + + +esp_err_t epd_init(display_t display) { + if (DEV_Module_Init() != 0) { + return ESP_FAIL; + } + + EPD_2IN66_Init(); + + epd_display = display; + + UWORD Imagesize = + ((EPD_2IN66_WIDTH % 8 == 0) ? (EPD_2IN66_WIDTH / 8) : (EPD_2IN66_WIDTH / 8 + 1)) * EPD_2IN66_HEIGHT; + if ((epd_display.canvas = (UBYTE *) malloc(Imagesize)) == NULL) { + ESP_LOGE("EPD", "Failed to allocate epd canvas memory"); + return ESP_FAIL; + } + + Paint_NewImage(epd_display.canvas, EPD_2IN66_WIDTH, EPD_2IN66_HEIGHT, 270, WHITE); + + // Initialise the display + Paint_SelectImage(epd_display.canvas); + Paint_Clear(WHITE); + char readerid[DISPLAY_BUFFER_SIZE]; + snprintf(readerid, DISPLAY_BUFFER_SIZE, "Reader ID: %05d", epd_display.reader_info.reader_id); + char batterlevel[DISPLAY_BUFFER_SIZE]; + snprintf(batterlevel, DISPLAY_BUFFER_SIZE, "Battery: %d%%", epd_display.reader_info.battery_level); + //Draw border + Paint_DrawRectangle(1, 1, EPD_2IN66_HEIGHT - 1, EPD_2IN66_WIDTH, BLACK, DOT_PIXEL_1X1, DRAW_FILL_EMPTY); + // Draw reader id + Paint_DrawString_EN(17, 2, readerid, &Font12, WHITE, BLACK); + // draw divider + Paint_DrawLine(EPD_2IN66_HEIGHT / 2, 1, EPD_2IN66_HEIGHT / 2, 15, BLACK, DOT_PIXEL_1X1, LINE_STYLE_SOLID); + // Draw battery level + Paint_DrawString_EN(175, 2, batterlevel, &Font12, WHITE, BLACK); + // Draw header horizontal divider + Paint_DrawLine(1, 15, EPD_2IN66_HEIGHT, 15, BLACK, DOT_PIXEL_1X1, LINE_STYLE_SOLID); + // draw vertical button divider + ESP_LOGD("EPD", "Drawing vertical button divider"); + Paint_DrawLine(40, 15, 40, EPD_2IN66_WIDTH, BLACK, DOT_PIXEL_1X1, LINE_STYLE_SOLID); + Paint_DrawLine(EPD_2IN66_HEIGHT - 40, 15, EPD_2IN66_HEIGHT - 40, EPD_2IN66_WIDTH, BLACK, DOT_PIXEL_1X1, + LINE_STYLE_SOLID); + // Draw horizontal button divider + ESP_LOGD("EPD", "Drawing horizontal button divider"); + Paint_DrawLine(1, ((EPD_2IN66_WIDTH - 15) / 2) + 15, 40, ((EPD_2IN66_WIDTH - 15) / 2) + 15, BLACK, DOT_PIXEL_1X1, + LINE_STYLE_SOLID); + Paint_DrawLine(EPD_2IN66_HEIGHT - 40, ((EPD_2IN66_WIDTH - 15) / 2) + 15, EPD_2IN66_HEIGHT, + ((EPD_2IN66_WIDTH - 15) / 2) + 15, BLACK, DOT_PIXEL_1X1, LINE_STYLE_SOLID); + + // Draw buttons + ESP_LOGD("EPD", "Drawing buttons"); + Paint_DrawString_EN(12, ((EPD_2IN66_WIDTH - 15) / 2) - 20 - (Font24.Height / 2), epd_display.buttons.btn0, &Font24, WHITE, BLACK); + Paint_DrawString_EN(12, ((EPD_2IN66_WIDTH - 15) / 2) + 40, epd_display.buttons.btn1, &Font24, WHITE, BLACK); + Paint_DrawString_EN(EPD_2IN66_HEIGHT - 12 - Font24.Width, ((EPD_2IN66_WIDTH - 15) / 2) - 20 - (Font24.Height / 2), epd_display.buttons.btn2, &Font24, WHITE, BLACK); + Paint_DrawString_EN(EPD_2IN66_HEIGHT - 12 - Font24.Width, ((EPD_2IN66_WIDTH - 15) / 2) + 40, epd_display.buttons.btn3, &Font24, WHITE, BLACK); + + // Draw machine name + ESP_LOGD("EPD", "Drawing machine name"); + Paint_DrawString_EN(42, 20, epd_display.machine_name, &Font16, WHITE, BLACK); + + // Draw machine state + ESP_LOGD("EPD", "Drawing machine state"); + Paint_DrawString_EN(60, ((EPD_2IN66_WIDTH - 15) / 2) + 15 - (Font24.Height / 2), epd_display.state, &Font24, WHITE, + BLACK); + + // Draw QR code + ESP_LOGD("EPD", "Drawing QR code"); + Paint_DrawBitMap_Paste(gImage_qrurn, EPD_2IN66_HEIGHT - 142, + ((EPD_2IN66_WIDTH - 15) / 2) - 35, 100, 100, TRUE); + + ESP_LOGI("EPD", "Displaying initial layout"); + EPD_2IN66_Display(epd_display.canvas); + ESP_LOGD("EPD", "Sleeping"); + EPD_2IN66_Sleep(); + DEV_Module_Exit(); + return ESP_OK; +} + +void epd_clear() { + EPD_2IN66_Init(); + EPD_2IN66_Clear(); + EPD_2IN66_Sleep(); +} + +void epd_update_reader_info(reader_info_t reader_info) { + if (memcmp(&epd_display.reader_info, &reader_info, sizeof(reader_info_t)) != 0) { + memcpy(&epd_display.reader_info, &reader_info, sizeof(reader_info_t)); + DEV_Module_Init(); + EPD_2IN66_Init(); + EPD_2IN66_Init_Partial(); + Paint_SelectImage(epd_display.canvas); + + char readerid[DISPLAY_BUFFER_SIZE]; + snprintf(readerid, DISPLAY_BUFFER_SIZE, "%05d", epd_display.reader_info.reader_id); + char batterlevel[DISPLAY_BUFFER_SIZE]; + snprintf(batterlevel, DISPLAY_BUFFER_SIZE, "%d%%", epd_display.reader_info.battery_level); + Paint_ClearWindows(94, 2, 129, 14, WHITE); + Paint_DrawString_EN(94, 2, readerid, &Font12, WHITE, BLACK); + // blank out battery level + Paint_ClearWindows(238, 2, 266, 14, WHITE); + // Draw battery level + Paint_DrawString_EN(238, 2, batterlevel, &Font12, WHITE, BLACK); + EPD_2IN66_Display(epd_display.canvas); + EPD_2IN66_Sleep(); + DEV_Module_Exit(); + } +} + +void epd_update_state(char* state) { + if (strcmp(epd_display.state, state) != 0) { + ESP_LOGI("EPD", "Updating state to %s", state); + strncpy(epd_display.state, state, DISPLAY_BUFFER_SIZE); + DEV_Module_Init(); + EPD_2IN66_Init(); + EPD_2IN66_Init_Partial(); + Paint_SelectImage(epd_display.canvas); + Paint_ClearWindows(60, ((EPD_2IN66_WIDTH - 15) / 2) + 15 - (Font24.Height / 2), EPD_2IN66_HEIGHT - 142, + ((EPD_2IN66_WIDTH - 15) / 2) + 15 - (Font24.Height / 2) + Font24.Height, WHITE); + Paint_DrawString_EN(60, ((EPD_2IN66_WIDTH - 15) / 2) + 15 - (Font24.Height / 2), epd_display.state, &Font24, + WHITE, + BLACK); + EPD_2IN66_Display(epd_display.canvas); + EPD_2IN66_Sleep(); + DEV_Module_Exit(); + } +} +void epd_update_buttons(buttons_t* buttons) { + DEV_Module_Init(); + EPD_2IN66_Init(); + EPD_2IN66_Init_Partial(); + if (strcmp(epd_display.buttons.btn0, buttons->btn0) != 0) { + strncpy(epd_display.buttons.btn0, buttons->btn0, DISPLAY_BUFFER_SIZE); + Paint_SelectImage(epd_display.canvas); + Paint_ClearWindows(12, ((EPD_2IN66_WIDTH - 15) / 2) - 20 - (Font24.Height / 2), 12 + Font24.Width, + ((EPD_2IN66_WIDTH - 15) / 2) - 20 - (Font24.Height / 2) + Font24.Height, WHITE); + Paint_DrawString_EN(12, ((EPD_2IN66_WIDTH - 15) / 2) - 20 - (Font24.Height / 2), epd_display.buttons.btn0, &Font24, + WHITE, BLACK); + EPD_2IN66_Display(epd_display.canvas); + } + if (strcmp(epd_display.buttons.btn1, buttons->btn1) != 0) { + strncpy(epd_display.buttons.btn1, buttons->btn1, DISPLAY_BUFFER_SIZE); + Paint_SelectImage(epd_display.canvas); + Paint_ClearWindows(12, ((EPD_2IN66_WIDTH - 15) / 2) + 40, 12 + Font24.Width, + ((EPD_2IN66_WIDTH - 15) / 2) + 40 + Font24.Height, WHITE); + Paint_DrawString_EN(12, ((EPD_2IN66_WIDTH - 15) / 2) + 40, epd_display.buttons.btn1, &Font24, WHITE, BLACK); + EPD_2IN66_Display(epd_display.canvas); + } + if (strcmp(epd_display.buttons.btn2, buttons->btn2) != 0) { + strncpy(epd_display.buttons.btn2, buttons->btn2, DISPLAY_BUFFER_SIZE); + Paint_SelectImage(epd_display.canvas); + Paint_ClearWindows(EPD_2IN66_HEIGHT - 12 - Font24.Width, + ((EPD_2IN66_WIDTH - 15) / 2) - 20 - (Font24.Height / 2), EPD_2IN66_HEIGHT - 12, + ((EPD_2IN66_WIDTH - 15) / 2) - 20 - (Font24.Height / 2) + Font24.Height, WHITE); + Paint_DrawString_EN(EPD_2IN66_HEIGHT - 12 - Font24.Width, + ((EPD_2IN66_WIDTH - 15) / 2) - 20 - (Font24.Height / 2), epd_display.buttons.btn2, &Font24, + WHITE, BLACK); + EPD_2IN66_Display(epd_display.canvas); + } + if (strcmp(epd_display.buttons.btn3, buttons->btn3) != 0) { + strncpy(epd_display.buttons.btn3, buttons->btn3, DISPLAY_BUFFER_SIZE); + Paint_SelectImage(epd_display.canvas); + Paint_ClearWindows(EPD_2IN66_HEIGHT - 12 - Font24.Width, + ((EPD_2IN66_WIDTH - 15) / 2) + 40, EPD_2IN66_HEIGHT - 12, + ((EPD_2IN66_WIDTH - 15) / 2) + 40 + Font24.Height, WHITE); + Paint_DrawString_EN(EPD_2IN66_HEIGHT - 12 - Font24.Width, + ((EPD_2IN66_WIDTH - 15) / 2) + 40, epd_display.buttons.btn3, &Font24, WHITE, BLACK); + EPD_2IN66_Display(epd_display.canvas); + } + EPD_2IN66_Sleep(); + DEV_Module_Exit(); +} +void epd_update_machine_name(char* machine_name) { + if (strcmp(epd_display.machine_name, machine_name) != 0) { + strncpy(epd_display.machine_name, machine_name, DISPLAY_BUFFER_SIZE); + DEV_Module_Init(); + EPD_2IN66_Init(); + EPD_2IN66_Init_Partial(); + Paint_SelectImage(epd_display.canvas); + Paint_ClearWindows(42, 20, 251, + 20 + Font16.Height, WHITE); + Paint_DrawString_EN(42, 20, epd_display.machine_name, &Font16, WHITE, BLACK); + EPD_2IN66_Display(epd_display.canvas); + EPD_2IN66_Sleep(); + DEV_Module_Exit(); + } +} +void epd_update_image(UBYTE* image) { + if (memcmp(epd_display.image, image, DISPLAY_BUFFER_SIZE) != 0) { + memcpy(epd_display.image, image, DISPLAY_BUFFER_SIZE); + DEV_Module_Init(); + EPD_2IN66_Init(); + EPD_2IN66_Init_Partial(); + Paint_SelectImage(epd_display.canvas); + Paint_ClearWindows(EPD_2IN66_HEIGHT - 142, + ((EPD_2IN66_WIDTH - 15) / 2) - 35, + EPD_2IN66_HEIGHT - 142 + 100, + ((EPD_2IN66_WIDTH - 15) / 2) - 35 + 100, WHITE); + Paint_DrawBitMap_Paste(epd_display.image, EPD_2IN66_HEIGHT - 142, + ((EPD_2IN66_WIDTH - 15) / 2) - 35, 100, 100, TRUE); + EPD_2IN66_Display(epd_display.canvas); + EPD_2IN66_Sleep(); + DEV_Module_Exit(); + } +} \ No newline at end of file diff --git a/Software/fab-reader2/main/epd/epd.h b/Software/fab-reader2/main/epd/epd.h new file mode 100644 index 0000000..b9a44a1 --- /dev/null +++ b/Software/fab-reader2/main/epd/epd.h @@ -0,0 +1,73 @@ +/***************************************************************************** +* | File : EPD_Test.h +* | Author : Waveshare team +* | Function : e-Paper test Demo +* | Info : +*---------------- +* | This version: V1.0 +* | Date : 2019-06-11 +* | Info : +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documnetation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# +******************************************************************************/ +#ifndef _EPD_TEST_H_ +#define _EPD_TEST_H_ + +#include "DEV_Config.h" +#include "GUI_Paint.h" +#include "imagedata.h" +#include "Debug.h" +#include // malloc() free() + +#define DISPLAY_BUFFER_SIZE 30 + +typedef struct { + int reader_id; + int battery_level; +} reader_info_t; + +typedef struct { + char btn0[DISPLAY_BUFFER_SIZE]; + char btn1[DISPLAY_BUFFER_SIZE]; + char btn2[DISPLAY_BUFFER_SIZE]; + char btn3[DISPLAY_BUFFER_SIZE]; +} buttons_t; + +typedef struct { + UBYTE* canvas; + reader_info_t reader_info; + char state[DISPLAY_BUFFER_SIZE]; + buttons_t buttons; + char machine_name[DISPLAY_BUFFER_SIZE]; + UBYTE *image; +} display_t; + +esp_err_t epd_init(display_t display); +esp_err_t epd_deinit(); +void epd_clear(); +void epd_update_reader_info(reader_info_t reader_info); +void epd_update_state(char* state); +void epd_update_buttons(buttons_t* buttons); +void epd_update_machine_name(char* machine_name); +void epd_update_image(UBYTE* image); + +int EPD_test(); + +#endif diff --git a/Software/fab-reader2/main/epd/qrurn.c b/Software/fab-reader2/main/epd/qrurn.c new file mode 100644 index 0000000..ae33e1f --- /dev/null +++ b/Software/fab-reader2/main/epd/qrurn.c @@ -0,0 +1,83 @@ +const unsigned char gImage_qrurn[1300] = { /* 0X00,0X01,0X64,0X00,0X64,0X00, */ +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X1F,0XFF,0XFC,0X63,0X9F,0XFC,0X03,0X83,0XFF,0XFF,0X80,0X00,0X00,0X1F,0XFF,0XFC, +0X63,0X9F,0XFC,0X03,0X83,0XFF,0XFF,0X80,0X00,0X00,0X1F,0XFF,0XFC,0X63,0X9F,0XFC, +0X03,0X83,0XFF,0XFF,0X80,0X00,0X00,0X1C,0X00,0X1C,0X1F,0XFF,0X83,0X9C,0X63,0X80, +0X03,0X80,0X00,0X00,0X1C,0X00,0X1C,0X1F,0XFF,0X83,0X9C,0X63,0X80,0X03,0X80,0X00, +0X00,0X1C,0X00,0X1C,0X1F,0XFF,0X83,0X9C,0X63,0X80,0X03,0X80,0X00,0X00,0X1C,0X7F, +0X9C,0X7F,0X80,0X03,0X80,0X63,0X9F,0XE3,0X80,0X00,0X00,0X1C,0X7F,0X9C,0X7F,0X80, +0X03,0X80,0X63,0X9F,0XE3,0X80,0X00,0X00,0X1C,0X7F,0X9C,0X7F,0X9C,0X7C,0X00,0X03, +0X9F,0XE3,0X80,0X00,0X00,0X1C,0X7F,0X9C,0X7F,0X9C,0X7C,0X00,0X03,0X9F,0XE3,0X80, +0X00,0X00,0X1C,0X7F,0X9C,0X7F,0X9C,0X7C,0X00,0X03,0X9F,0XE3,0X80,0X00,0X00,0X1C, +0X7F,0X9C,0X60,0X7C,0X63,0XFF,0XE3,0X9F,0XE3,0X80,0X00,0X00,0X1C,0X7F,0X9C,0X60, +0X7C,0X63,0XFF,0XE3,0X9F,0XE3,0X80,0X00,0X00,0X1C,0X7F,0X9C,0X60,0X7C,0X63,0XFF, +0XE3,0X9F,0XE3,0X80,0X00,0X00,0X1C,0X00,0X1C,0X03,0XE3,0X9F,0XE3,0XE3,0X80,0X03, +0X80,0X00,0X00,0X1C,0X00,0X1C,0X03,0XE3,0X9F,0XE3,0XE3,0X80,0X03,0X80,0X00,0X00, +0X1F,0XFF,0XFC,0X63,0X9C,0X63,0X9C,0X63,0XFF,0XFF,0X80,0X00,0X00,0X1F,0XFF,0XFC, +0X63,0X9C,0X63,0X9C,0X63,0XFF,0XFF,0X80,0X00,0X00,0X1F,0XFF,0XFC,0X63,0X9C,0X63, +0X9C,0X63,0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0X03,0X9C,0X1F,0X9F,0X80,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X03,0X9C,0X1F,0X9F,0X80,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X03,0X9C,0X1F,0X9F,0X80,0X00,0X00,0X00,0X00,0X00,0X1F,0XFC, +0X1C,0X63,0XFF,0X9F,0XE3,0XFC,0X1F,0XE3,0X80,0X00,0X00,0X1F,0XFC,0X1C,0X63,0XFF, +0X9F,0XE3,0XFC,0X1F,0XE3,0X80,0X00,0X00,0X1C,0X7C,0X60,0X63,0X9F,0XFC,0X1C,0X60, +0X7F,0X9F,0X80,0X00,0X00,0X1C,0X7C,0X60,0X63,0X9F,0XFC,0X1C,0X60,0X7F,0X9F,0X80, +0X00,0X00,0X1C,0X7C,0X60,0X63,0X9F,0XFC,0X1C,0X60,0X7F,0X9F,0X80,0X00,0X00,0X1F, +0X9F,0XFF,0X9F,0XFF,0X80,0X7C,0X1C,0X7C,0X00,0X00,0X00,0X00,0X1F,0X9F,0XFF,0X9F, +0XFF,0X80,0X7C,0X1C,0X7C,0X00,0X00,0X00,0X00,0X1F,0X9F,0XFF,0X9F,0XFF,0X80,0X7C, +0X1C,0X7C,0X00,0X00,0X00,0X00,0X1F,0X83,0XE0,0X7F,0X80,0X03,0XE0,0X7C,0X60,0X7C, +0X00,0X00,0X00,0X1F,0X83,0XE0,0X7F,0X80,0X03,0XE0,0X7C,0X60,0X7C,0X00,0X00,0X00, +0X1C,0X63,0XFF,0XFF,0X9C,0X7F,0X80,0X7C,0X60,0X60,0X00,0X00,0X00,0X1C,0X63,0XFF, +0XFF,0X9C,0X7F,0X80,0X7C,0X60,0X60,0X00,0X00,0X00,0X1C,0X63,0XFF,0XFF,0X9C,0X7F, +0X80,0X7C,0X60,0X60,0X00,0X00,0X00,0X1F,0XFC,0X60,0X1C,0X7C,0X60,0X7F,0X9F,0XE0, +0X7C,0X00,0X00,0X00,0X1F,0XFC,0X60,0X1C,0X7C,0X60,0X7F,0X9F,0XE0,0X7C,0X00,0X00, +0X00,0X1F,0XFC,0X60,0X1C,0X7C,0X60,0X7F,0X9F,0XE0,0X7C,0X00,0X00,0X00,0X1C,0X00, +0X1C,0X00,0X63,0X80,0X7C,0X1F,0X9C,0X7F,0X80,0X00,0X00,0X1C,0X00,0X1C,0X00,0X63, +0X80,0X7C,0X1F,0X9C,0X7F,0X80,0X00,0X00,0X03,0X80,0X63,0X83,0XE0,0X60,0X1F,0XE3, +0XFC,0X63,0X80,0X00,0X00,0X03,0X80,0X63,0X83,0XE0,0X60,0X1F,0XE3,0XFC,0X63,0X80, +0X00,0X00,0X03,0X80,0X63,0X83,0XE0,0X60,0X1F,0XE3,0XFC,0X63,0X80,0X00,0X00,0X1F, +0XFC,0X1C,0X00,0X1C,0X63,0XE0,0X00,0X1C,0X1C,0X00,0X00,0X00,0X1F,0XFC,0X1C,0X00, +0X1C,0X63,0XE0,0X00,0X1C,0X1C,0X00,0X00,0X00,0X1F,0XFC,0X1C,0X00,0X1C,0X63,0XE0, +0X00,0X1C,0X1C,0X00,0X00,0X00,0X03,0XE3,0XE0,0X1F,0X80,0X63,0X9C,0X1C,0X00,0X03, +0X80,0X00,0X00,0X03,0XE3,0XE0,0X1F,0X80,0X63,0X9C,0X1C,0X00,0X03,0X80,0X00,0X00, +0X1C,0X00,0X1C,0X1C,0X03,0XFC,0X60,0X7C,0X00,0X7C,0X00,0X00,0X00,0X1C,0X00,0X1C, +0X1C,0X03,0XFC,0X60,0X7C,0X00,0X7C,0X00,0X00,0X00,0X1C,0X00,0X1C,0X1C,0X03,0XFC, +0X60,0X7C,0X00,0X7C,0X00,0X00,0X00,0X00,0X1C,0X63,0X80,0X63,0XE3,0XE3,0X9F,0X83, +0XE3,0X80,0X00,0X00,0X00,0X1C,0X63,0X80,0X63,0XE3,0XE3,0X9F,0X83,0XE3,0X80,0X00, +0X00,0X00,0X1C,0X63,0X80,0X63,0XE3,0XE3,0X9F,0X83,0XE3,0X80,0X00,0X00,0X03,0XE3, +0X9F,0X9F,0X83,0XE0,0X63,0XFF,0XFF,0XE3,0X80,0X00,0X00,0X03,0XE3,0X9F,0X9F,0X83, +0XE0,0X63,0XFF,0XFF,0XE3,0X80,0X00,0X00,0X00,0X00,0X00,0X63,0X80,0X1F,0X83,0XE0, +0X1F,0X9C,0X00,0X00,0X00,0X00,0X00,0X00,0X63,0X80,0X1F,0X83,0XE0,0X1F,0X9C,0X00, +0X00,0X00,0X00,0X00,0X00,0X63,0X80,0X1F,0X83,0XE0,0X1F,0X9C,0X00,0X00,0X00,0X1F, +0XFF,0XFC,0X03,0X80,0X60,0X1C,0X63,0X9C,0X1C,0X00,0X00,0X00,0X1F,0XFF,0XFC,0X03, +0X80,0X60,0X1C,0X63,0X9C,0X1C,0X00,0X00,0X00,0X1F,0XFF,0XFC,0X03,0X80,0X60,0X1C, +0X63,0X9C,0X1C,0X00,0X00,0X00,0X1C,0X00,0X1C,0X00,0X7F,0XFC,0X60,0X60,0X1F,0X80, +0X00,0X00,0X00,0X1C,0X00,0X1C,0X00,0X7F,0XFC,0X60,0X60,0X1F,0X80,0X00,0X00,0X00, +0X1C,0X7F,0X9C,0X1C,0X60,0X1C,0X1C,0X7F,0XFF,0X9F,0X80,0X00,0X00,0X1C,0X7F,0X9C, +0X1C,0X60,0X1C,0X1C,0X7F,0XFF,0X9F,0X80,0X00,0X00,0X1C,0X7F,0X9C,0X1C,0X60,0X1C, +0X1C,0X7F,0XFF,0X9F,0X80,0X00,0X00,0X1C,0X7F,0X9C,0X63,0XE3,0X9F,0XE0,0X03,0X83, +0XFC,0X00,0X00,0X00,0X1C,0X7F,0X9C,0X63,0XE3,0X9F,0XE0,0X03,0X83,0XFC,0X00,0X00, +0X00,0X1C,0X7F,0X9C,0X63,0XE3,0X9F,0XE0,0X03,0X83,0XFC,0X00,0X00,0X00,0X1C,0X7F, +0X9C,0X7C,0X1C,0X7F,0XFC,0X00,0X03,0XE3,0X80,0X00,0X00,0X1C,0X7F,0X9C,0X7C,0X1C, +0X7F,0XFC,0X00,0X03,0XE3,0X80,0X00,0X00,0X1C,0X00,0X1C,0X60,0X1F,0X83,0XFC,0X60, +0X00,0X03,0X80,0X00,0X00,0X1C,0X00,0X1C,0X60,0X1F,0X83,0XFC,0X60,0X00,0X03,0X80, +0X00,0X00,0X1C,0X00,0X1C,0X60,0X1F,0X83,0XFC,0X60,0X00,0X03,0X80,0X00,0X00,0X1F, +0XFF,0XFC,0X60,0X60,0X03,0XE0,0X7F,0X80,0X1C,0X00,0X00,0X00,0X1F,0XFF,0XFC,0X60, +0X60,0X03,0XE0,0X7F,0X80,0X1C,0X00,0X00,0X00,0X1F,0XFF,0XFC,0X60,0X60,0X03,0XE0, +0X7F,0X80,0X1C,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,}; diff --git a/Software/fab-reader2/main/fab-reader2.c b/Software/fab-reader2/main/fab-reader2.c new file mode 100644 index 0000000..a945d5a --- /dev/null +++ b/Software/fab-reader2/main/fab-reader2.c @@ -0,0 +1,363 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "fab-reader2.h" +#include "platform.h" +#include "st25R3911_interrupt.h" +#include "DEV_Config.h" + +#include "pollingtagdetect.h" +#include "epd.h" +#include "ota.h" + +#define SPI_CLK 5 +#define SPI_MOSI 6 +#define SPI_MISO 7 + +#define ESP_INTR_FLAG_DEFAULT 0 + +portMUX_TYPE CommProtectLock = portMUX_INITIALIZER_UNLOCKED; + +esp_err_t init_mqtt(void); + +static void IRAM_ATTR gpio_isr_handler(void *arg) { + st25r3911Isr(); + ets_printf("Interrupt\n"); + } + +static void network_event_handler(void* arg, esp_event_base_t event_base, int32_t event_id, void* event_data) +{ + if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) { + esp_wifi_connect(); + } else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) { + esp_wifi_connect(); + } else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) { + ip_event_got_ip_t* event = (ip_event_got_ip_t*) event_data; + ESP_LOGI("network", "got ip:" IPSTR, IP2STR(&event->ip_info.ip)); + ESP_ERROR_CHECK(init_mqtt()); + ESP_LOGI("main", "init_mqtt done"); + } +} + +/* + * @brief Event handler registered to receive MQTT events + * + * This function is called by the MQTT client event loop. + * + * @param handler_args user data registered to the event. + * @param base Event base for the handler(always MQTT Base in this example). + * @param event_id The id for the received event. + * @param event_data The data for the event, esp_mqtt_event_handle_t. + */ +static void mqtt_event_handler(void *handler_args, esp_event_base_t base, int32_t event_id, void *event_data) +{ + ESP_LOGD("mqtt", "Event dispatched from event loop base=%s, event_id=%d", base, event_id); + esp_mqtt_event_handle_t event = event_data; + esp_mqtt_client_handle_t client = event->client; + int msg_id; + switch ((esp_mqtt_event_id_t)event_id) { + case MQTT_EVENT_CONNECTED: + ESP_LOGI("mqtt", "MQTT_EVENT_CONNECTED"); + + char id[6] = "00000"; + sprintf(id, "%05d", CONFIG_FABREADER2_ID); + + // Register Reader + msg_id = esp_mqtt_client_publish(client, "fabreader", id, 0, 0, 0); + ESP_LOGI("mqtt", "sent publish successful, msg_id=%d", msg_id); + + char topic_requestOTA[] = "fabreader/00000/requestOTA"; + sprintf(topic_requestOTA, "fabreader/%05d/requestOTA", CONFIG_FABREADER2_ID); + msg_id = esp_mqtt_client_subscribe(client, topic_requestOTA, 0); + ESP_LOGI("mqtt", "sent subscribe successful, msg_id=%d", msg_id); + + char topic_stopOTA[] = "fabreader/00000/stopOTA"; + sprintf(topic_stopOTA, "fabreader/%05d/stopOTA", CONFIG_FABREADER2_ID); + msg_id = esp_mqtt_client_subscribe(client, topic_stopOTA, 0); + ESP_LOGI("mqtt", "sent subscribe successful, msg_id=%d", msg_id); + + char topic_display[] = "fabreader/00000/display/#"; + sprintf(topic_display, "fabreader/%05d/display/#", CONFIG_FABREADER2_ID); + msg_id = esp_mqtt_client_subscribe(client, topic_display, 0); + ESP_LOGI("mqtt", "sent subscribe successful, msg_id=%d", msg_id); + + break; + case MQTT_EVENT_DISCONNECTED: + ESP_LOGI("mqtt", "MQTT_EVENT_DISCONNECTED"); + break; + + case MQTT_EVENT_SUBSCRIBED: + ESP_LOGI("mqtt", "MQTT_EVENT_SUBSCRIBED, msg_id=%d", event->msg_id); + break; + case MQTT_EVENT_UNSUBSCRIBED: + ESP_LOGI("mqtt", "MQTT_EVENT_UNSUBSCRIBED, msg_id=%d", event->msg_id); + break; + case MQTT_EVENT_PUBLISHED: + ESP_LOGI("mqtt", "MQTT_EVENT_PUBLISHED, msg_id=%d", event->msg_id); + break; + case MQTT_EVENT_DATA: + ESP_LOGI("mqtt", "MQTT_EVENT_DATA"); + printf("TOPIC=%.*s\r\n", event->topic_len, event->topic); + printf("DATA=%.*s\r\n", event->data_len, event->data); + + if (hasActiveOTA()) { + continueOTA(client, event->topic, event->data, event->data_len); + } + + break; + case MQTT_EVENT_ERROR: + ESP_LOGE("mqtt", "MQTT_EVENT_ERROR"); + if (event->error_handle->error_type == MQTT_ERROR_TYPE_TCP_TRANSPORT) { + ESP_LOGE("mqtt", "Last error code reported from esp-tls: 0x%x", event->error_handle->esp_tls_last_esp_err); + ESP_LOGE("mqtt", "Last tls stack error number: 0x%x", event->error_handle->esp_tls_stack_err); + ESP_LOGE("mqtt", "Last captured errno : %d (%s)", event->error_handle->esp_transport_sock_errno, + strerror(event->error_handle->esp_transport_sock_errno)); + } else if (event->error_handle->error_type == MQTT_ERROR_TYPE_CONNECTION_REFUSED) { + ESP_LOGE("mqtt", "Connection refused error: 0x%x", event->error_handle->connect_return_code); + } else { + ESP_LOGW("mqtt", "Unknown error type: 0x%x", event->error_handle->error_type); + } + break; + default: + ESP_LOGI("mqtt", "Other event id:%d", event->event_id); + break; + } +} + +esp_err_t init_gpio(void) { + gpio_config_t io_conf = {}; + //disable interrupt + io_conf.intr_type = GPIO_INTR_DISABLE; + //set as output mode + io_conf.mode = GPIO_MODE_INPUT_OUTPUT; + //bit mask of the pins that you want to set,e.g.GPIO18/19 + io_conf.pin_bit_mask = (1ULL << ST25R391X_SS_PIN) | (1ULL << EPD_CS_PIN) | (1ULL << EPD_DC_PIN) | (1ULL << EPD_RST_PIN); + //disable pull-down mode + io_conf.pull_down_en = 0; + //disable pull-up mode + io_conf.pull_up_en = 0; + //configure GPIO with the given settings + esp_err_t ret = gpio_config(&io_conf); + ESP_ERROR_CHECK(ret); + + io_conf.mode = GPIO_MODE_INPUT; + io_conf.pin_bit_mask = (1ULL << EPD_BUSY_PIN); + + ret = gpio_config(&io_conf); + ESP_ERROR_CHECK(ret); + + //interrupt of rising edge + io_conf.intr_type = GPIO_INTR_POSEDGE; + //bit mask of the pins, use GPIO4/5 here + io_conf.pin_bit_mask = (1ULL << ST25R391X_INT_PIN); + //set as input mode + io_conf.mode = GPIO_MODE_INPUT; + //disable pull-down mode + io_conf.pull_down_en = 0; + //enable pull-up mode + io_conf.pull_up_en = 0; + ESP_ERROR_CHECK(gpio_config(&io_conf)); + + ESP_ERROR_CHECK(gpio_install_isr_service(ESP_INTR_FLAG_DEFAULT)); + //hook isr handler for specific gpio pin + ESP_ERROR_CHECK(gpio_isr_handler_add(ST25R391X_INT_PIN, gpio_isr_handler, NULL)); + + return ret; +} + +esp_err_t init_spi(void) { + spi_bus_config_t buscfg = { + .miso_io_num=SPI_MISO, + .mosi_io_num=SPI_MOSI, + .sclk_io_num=SPI_CLK, + .quadwp_io_num=-1, + .quadhd_io_num=-1, + }; + esp_err_t ret = spi_bus_initialize(SPI3_HOST, &buscfg, SPI_DMA_CH_AUTO); + ESP_ERROR_CHECK(ret); + + spi_device_interface_config_t nfc_devcfg = { + .clock_speed_hz=SPI_MASTER_FREQ_8M, //Clock out at 26 MHz + .mode=1, //SPI mode 1 + .spics_io_num=-1, //CS pin + .queue_size=1, //We want to be able to queue 7 transactions at a time + }; + + spi_device_handle_t nfc_spi; + ret = spi_bus_add_device(SPI3_HOST, &nfc_devcfg, &nfc_spi); + ESP_ERROR_CHECK(ret); + st25r3911_spi_init(nfc_spi); + + spi_device_interface_config_t epd_devcfg = { + .clock_speed_hz=SPI_MASTER_FREQ_8M, //Clock out at 26 MHz + .mode=0, //SPI mode 1 + .spics_io_num=-1, //CS pin + .queue_size=1, //We want to be able to queue 7 transactions at a time + }; + + spi_device_handle_t epd_spi; + ret = spi_bus_add_device(SPI3_HOST, &epd_devcfg, &epd_spi); + ESP_ERROR_CHECK(ret); + DEV_SPI_Init(epd_spi); + + return ret; +} + +esp_err_t init_eventloop() { + esp_err_t ret = esp_event_loop_create_default(); + ESP_ERROR_CHECK(ret); + return ret; +} + +esp_err_t init_wifi() { + esp_err_t ret; + ret = esp_netif_init(); + ESP_ERROR_CHECK(ret); + + wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); + ret = esp_wifi_init(&cfg); + ESP_ERROR_CHECK(ret); + + ret = esp_event_handler_instance_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &network_event_handler, NULL, NULL); + ESP_ERROR_CHECK(ret); + ret = esp_event_handler_instance_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &network_event_handler, NULL, NULL); + ESP_ERROR_CHECK(ret); + + + // Initialize default station as network interface instance (esp-netif) + esp_netif_t *sta_netif = esp_netif_create_default_wifi_sta(); + assert(sta_netif); + + // Initialize and start WiFi + wifi_config_t wifi_config = { + .sta = { + .ssid = DEFAULT_SSID, + .password = DEFAULT_PWD, + .scan_method = DEFAULT_SCAN_METHOD, + .sort_method = DEFAULT_SORT_METHOD, + .threshold.rssi = DEFAULT_RSSI, + .threshold.authmode = DEFAULT_AUTHMODE, + }, + }; + ret = esp_wifi_set_mode(WIFI_MODE_STA); + ESP_ERROR_CHECK(ret); + ret = esp_wifi_set_config(WIFI_IF_STA, &wifi_config); + ESP_ERROR_CHECK(ret); + ret = esp_wifi_start(); + ESP_ERROR_CHECK(ret); + + return ret; +} + +esp_err_t init_nvs() { + // Initialize NVS + esp_err_t ret = nvs_flash_init(); + if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) { + ESP_ERROR_CHECK(nvs_flash_erase()); + ret = nvs_flash_init(); + } + ESP_ERROR_CHECK( ret ); + return ret; +} + +esp_err_t init_mqtt() { + esp_err_t ret; + const esp_mqtt_client_config_t mqtt_cfg = { + .uri = CONFIG_BROKER_URI, + .crt_bundle_attach = esp_crt_bundle_attach + }; + + esp_mqtt_client_handle_t client = esp_mqtt_client_init(&mqtt_cfg); + /* The last argument may be used to pass data to the event handler, in this example mqtt_event_handler */ + ret = esp_mqtt_client_register_event(client, MQTT_EVENT_ANY, mqtt_event_handler, NULL); + ESP_ERROR_CHECK(ret); + ret = esp_mqtt_client_start(client); + ESP_ERROR_CHECK(ret); + + mqtt_client = client; + + return ret; +} + +esp_err_t init_epd() { + esp_err_t ret; + + reader_info_t reader_info = { + .reader_id = CONFIG_FABREADER2_ID, + .battery_level = 100 + }; + + buttons_t buttons = { + .btn0 = "X", + .btn1 = "<", + .btn2 = "O", + .btn3 = ">" + }; + + display_t display = { + .canvas = NULL, + .image = NULL, + .machine_name = "", + .state = "IDLE", + .buttons = buttons, + .reader_info = reader_info + }; + ret = epd_init(display); + ESP_ERROR_CHECK(ret); + return ret; +} + +_Noreturn static void cycle_task(void *arg) { + while (1) { + TagDetectCycle(); +// ESP_LOGI("cycle_task", "running tag detect cycle_task"); + } +} + +void app_main(void) { + // Log basic information about the system + ESP_LOGI("startup", "Startup.."); + ESP_LOGI("startup", "Built with IDF version: %s", esp_get_idf_version()); + esp_chip_info_t chip_info; + esp_chip_info(&chip_info); + ESP_LOGI("startup", "This is %s chip with %d CPU cores, WiFi%s%s, ", + chip_info.model == CHIP_ESP32S3 ? "ESP32S3" : CHIP_ESP32S2 ? "ESP32S2" : "unknown", + chip_info.cores, + (chip_info.features & CHIP_FEATURE_BT) ? "/BT" : "", + (chip_info.features & CHIP_FEATURE_BLE) ? "/BLE" : ""); + + + // Initialize peripherals + ESP_ERROR_CHECK(init_gpio()); + ESP_LOGI("main", "init_gpio done"); + ESP_ERROR_CHECK(init_spi()); + ESP_LOGI("main", "init_spi done"); +// ESP_ERROR_CHECK(init_epd()); + ESP_LOGI("main", "init_epd done"); + ESP_ERROR_CHECK(init_nvs()); + ESP_LOGI("main", "init_nvs done"); + ESP_ERROR_CHECK(init_eventloop()); + ESP_LOGI("main", "init_eventloop done"); + ESP_ERROR_CHECK(init_wifi()); + ESP_LOGI("main", "init_wifi done"); + +// epd_update_state("OTA..."); + +// Start main application + ESP_ERROR_CHECK(TagDetectInit()); + ESP_LOGI("main", "TagDetectInit done"); + xTaskCreate(cycle_task, "cycle_task", 4096, NULL, tskIDLE_PRIORITY, NULL); + ESP_LOGI("main", "cycle_task sheduled"); + + + ESP_LOGI("app", "Free memory: %d bytes", esp_get_free_heap_size()); + + +} diff --git a/Software/fab-reader2/main/fab-reader2.h b/Software/fab-reader2/main/fab-reader2.h new file mode 100644 index 0000000..628b09b --- /dev/null +++ b/Software/fab-reader2/main/fab-reader2.h @@ -0,0 +1,29 @@ +#pragma once + +#include + +/* Set the SSID and Password via project configuration, or can set directly here */ +#define DEFAULT_SSID CONFIG_WIFI_SSID +#define DEFAULT_PWD CONFIG_WIFI_PASSWORD + +#if CONFIG_WIFI_ALL_CHANNEL_SCAN +#define DEFAULT_SCAN_METHOD WIFI_ALL_CHANNEL_SCAN +#elif CONFIG_WIFI_FAST_SCAN +#define DEFAULT_SCAN_METHOD WIFI_FAST_SCAN +#else +#define DEFAULT_SCAN_METHOD WIFI_FAST_SCAN +#endif /*CONFIG_FABREADER2_SCAN_METHOD*/ + +#if CONFIG_WIFI_CONNECT_AP_BY_SIGNAL +#define DEFAULT_SORT_METHOD WIFI_CONNECT_AP_BY_SIGNAL +#elif CONFIG_WIFI_CONNECT_AP_BY_SECURITY +#define DEFAULT_SORT_METHOD WIFI_CONNECT_AP_BY_SECURITY +#else +#define DEFAULT_SORT_METHOD WIFI_CONNECT_AP_BY_SIGNAL +#endif /*CONFIG_FABREADER2_SORT_METHOD*/ + +#define DEFAULT_RSSI -127 +#define DEFAULT_AUTHMODE WIFI_AUTH_WPA2_PSK + + +esp_mqtt_client_handle_t mqtt_client; \ No newline at end of file diff --git a/Software/fab-reader2-c/main/idf_component.yml b/Software/fab-reader2/main/idf_component.yml similarity index 89% rename from Software/fab-reader2-c/main/idf_component.yml rename to Software/fab-reader2/main/idf_component.yml index 4af0b4c..03e529e 100644 --- a/Software/fab-reader2-c/main/idf_component.yml +++ b/Software/fab-reader2/main/idf_component.yml @@ -1,9 +1,9 @@ ## IDF Component Manager Manifest File dependencies: -# espressif/esp-idf-cxx: "^1.0.0-beta" + espressif/qrcode: "^0.1.0" ## Required IDF version idf: - version: ">=4.4.0" + version: ">=4.1.0" # # Put list of dependencies here # # For components maintained by Espressif: # component: "~1.0.0" diff --git a/Software/fab-reader2-c/main/pollingtagdetect.c b/Software/fab-reader2/main/nfc/pollingtagdetect.c similarity index 86% rename from Software/fab-reader2-c/main/pollingtagdetect.c rename to Software/fab-reader2/main/nfc/pollingtagdetect.c index 73d1838..28bb359 100644 --- a/Software/fab-reader2-c/main/pollingtagdetect.c +++ b/Software/fab-reader2/main/nfc/pollingtagdetect.c @@ -5,6 +5,10 @@ #include "pollingtagdetect.h" #include "rfal_nfc.h" #include "utils.h" +#include "fab-reader2.h" +#include "ota.h" +#include "epd.h" +#include "st25r3911_com.h" /* P2P communication data */ @@ -17,20 +21,12 @@ static uint8_t ndefSelectApp[] = {0x00, 0xA4, 0x04, 0x00, 0x07, 0xD2, 0x76, 0x00 static uint8_t ccSelectFile[] = {0x00, 0xA4, 0x00, 0x0C, 0x02, 0xE1, 0x03}; static uint8_t readBinary[] = {0x00, 0xB0, 0x00, 0x00, 0x0F}; -typedef enum { - NOT_INIT = 0, /*!< Demo State: Not initialized */ - START_DISCOVERY = 1, /*!< Demo State: Start Discovery */ - DISCOVERY = 2 /*!< Demo State: Discovery */ -} TagDetectState; - static rfalNfcDiscoverParam discParam; -static TagDetectState state = NOT_INIT; +static TagDetectState nfc_state = NOT_INIT; void TagDetectAPDU(void); -ReturnCode TagDetectTransceiveBlocking(uint8_t *txBuf, uint16_t txBufSize, uint8_t **rxData, uint16_t **rcvLen, uint32_t fwt); - static void TagDetectNotify(rfalNfcState st) { uint8_t devCnt; rfalNfcDevice *dev; @@ -68,7 +64,10 @@ esp_err_t TagDetectInit(void) { #if defined(ST25R3911) || defined(ST25R3916) discParam.techs2Find |= RFAL_NFC_POLL_TECH_AP2P; #endif /* ST25R95 */ - state = START_DISCOVERY; + nfc_state = START_DISCOVERY; + uint8_t irq_mask = 0; + st25r3911ReadRegister(ST25R3911_REG_IRQ_MASK_TIMER_NFC, &irq_mask); + ESP_LOGI("nfc", "irq_mask: %02x", irq_mask); return ESP_OK; } return err; @@ -90,17 +89,17 @@ void TagDetectCycle(void) { /*******************************************************************************/ /* Check if USER button is pressed */ -// if (platformGpioIsLow(PLATFORM_USER_BUTTON_PORT, PLATFORM_USER_BUTTON_PIN)) { -// discParam.wakeupEnabled = !discParam.wakeupEnabled; /* enable/disable wakeup */ -// state = START_DISCOVERY; /* restart loop */ -// platformLog("Toggling Wake Up mode %s\r\n", discParam.wakeupEnabled ? "ON" : "OFF"); -// -// /* Debounce button */ -// while (platformGpioIsLow(PLATFORM_USER_BUTTON_PORT, PLATFORM_USER_BUTTON_PIN)); -// } + if (platformGpioIsLow(PLATFORM_USER_BUTTON_PORT, PLATFORM_USER_BUTTON_PIN)) { + discParam.wakeupEnabled = !discParam.wakeupEnabled; /* enable/disable wakeup */ + nfc_state = START_DISCOVERY; /* restart loop */ + platformLog("Toggling Wake Up mode %s\r\n", discParam.wakeupEnabled ? "ON" : "OFF"); + + /* Debounce button */ + while (platformGpioIsLow(PLATFORM_USER_BUTTON_PORT, PLATFORM_USER_BUTTON_PIN)); + } - switch (state) { + switch (nfc_state) { /*******************************************************************************/ case START_DISCOVERY: @@ -113,9 +112,8 @@ void TagDetectCycle(void) { rfalNfcDeactivate(false); rfalNfcDiscover(&discParam); - platformLog("Discovery started \r\n"); - state = DISCOVERY; + nfc_state = DISCOVERY; break; /*******************************************************************************/ @@ -123,7 +121,7 @@ void TagDetectCycle(void) { if (rfalNfcIsDevActivated(rfalNfcGetState())) { rfalNfcGetActiveDevice(&nfcDevice); - platformLog("Device activated. \r\n"); + switch (nfcDevice->type) { /*******************************************************************************/ case RFAL_NFC_LISTEN_TYPE_NFCA: @@ -139,7 +137,11 @@ void TagDetectCycle(void) { platformLog("NFCA Passive ISO-DEP device found. UID: %s\r\n", hex2Str(nfcDevice->nfcid, nfcDevice->nfcidLen)); - TagDetectAPDU(); +// TagDetectAPDU(); + if (!hasActiveOTA()) { + startOTA(mqtt_client, nfcDevice->nfcid, nfcDevice->nfcidLen); + epd_update_state("OTA\nrunning"); + } break; case RFAL_NFCA_T4T_NFCDEP: @@ -174,17 +176,15 @@ void TagDetectCycle(void) { break; } - rfalNfcDeactivate(false); - platformLog("Device deactivated. \r\n"); - platformDelay(500); - state = START_DISCOVERY; +// rfalNfcDeactivate(false); +// platformDelay(500); +// state = START_DISCOVERY; } break; /*******************************************************************************/ case NOT_INIT: default: - platformLog("ERROR: Demo not initialized \r\n"); break; } } diff --git a/Software/fab-reader2/main/nfc/pollingtagdetect.h b/Software/fab-reader2/main/nfc/pollingtagdetect.h new file mode 100644 index 0000000..0a717ea --- /dev/null +++ b/Software/fab-reader2/main/nfc/pollingtagdetect.h @@ -0,0 +1,23 @@ +// +// Created by Kai Jan Kriegel on 17.10.22. +// + +#ifndef FAB_READER2_C_POLLINGTAGDETECT_H +#define FAB_READER2_C_POLLINGTAGDETECT_H + +#include "esp_err.h" +#include "st_errno.h" + +typedef enum { + NOT_INIT = 0, /*!< Demo State: Not initialized */ + START_DISCOVERY = 1, /*!< Demo State: Start Discovery */ + DISCOVERY = 2 /*!< Demo State: Discovery */ +} TagDetectState; + +static TagDetectState nfc_state; + +esp_err_t TagDetectInit(void); +void TagDetectCycle(void); +ReturnCode TagDetectTransceiveBlocking(uint8_t *txBuf, uint16_t txBufSize, uint8_t **rxData, uint16_t **rcvLen, uint32_t fwt); + +#endif //FAB_READER2_C_POLLINGTAGDETECT_H diff --git a/Software/fab-reader2/main/nfc/rfalpoller.c b/Software/fab-reader2/main/nfc/rfalpoller.c new file mode 100644 index 0000000..c4cff7a --- /dev/null +++ b/Software/fab-reader2/main/nfc/rfalpoller.c @@ -0,0 +1,7 @@ +// +// Created by Kai Jan Kriegel on 23.01.23. +// + +#include "rfalpoller.h" + + diff --git a/Software/fab-reader2/main/nfc/rfalpoller.h b/Software/fab-reader2/main/nfc/rfalpoller.h new file mode 100644 index 0000000..30ca54f --- /dev/null +++ b/Software/fab-reader2/main/nfc/rfalpoller.h @@ -0,0 +1,8 @@ +// +// Created by Kai Jan Kriegel on 23.01.23. +// + +#ifndef FAB_READER2_C_RFALPOLLER_H +#define FAB_READER2_C_RFALPOLLER_H + +#endif //FAB_READER2_C_RFALPOLLER_H diff --git a/Software/fab-reader2/main/ota/ota.c b/Software/fab-reader2/main/ota/ota.c new file mode 100644 index 0000000..7527d1c --- /dev/null +++ b/Software/fab-reader2/main/ota/ota.c @@ -0,0 +1,92 @@ +// +// Created by Kai Jan Kriegel on 06.02.23. +// + +#include "ota.h" + +#include +#include +#include +#include "pollingtagdetect.h" +#include "st_errno.h" +#include "rfal_nfc.h" + +extern TagDetectState nfc_state; + +bool activeOTA = false; + +uint8_t* current_nfcId; +uint8_t current_nfcIdLen; + +bool hasActiveOTA() { + return activeOTA; +} + +void startOTA(esp_mqtt_client_handle_t client, uint8_t *nfcId, uint8_t nfcIdLen) { + activeOTA = true; + + char topic_stopOTA[] = "fabreader/00000/startOTA"; + sprintf(topic_stopOTA, "fabreader/%05d/stopOTA", CONFIG_FABREADER2_ID); + esp_mqtt_client_publish(client, topic_stopOTA, (const char*)nfcId, nfcIdLen, 0, 0); + + current_nfcId = (uint8_t*)malloc(nfcIdLen); + memcpy(current_nfcId, nfcId, nfcIdLen); + current_nfcIdLen = nfcIdLen; + + + ESP_LOGI("OTA", "Started OTA communication"); +} +void continueOTA(esp_mqtt_client_handle_t client, char* topic, char *payload, unsigned int length) { + char topic_requestOTA[] = "fabreader/00000/requestOTA"; + sprintf(topic_requestOTA, "fabreader/%05d/requestOTA", CONFIG_FABREADER2_ID); + + char topic_responseOTA[] = "fabreader/00000/responseOTA"; + sprintf(topic_responseOTA, "fabreader/%05d/responseOTA", CONFIG_FABREADER2_ID); + + char topic_stopOTA[] = "fabreader/00000/stopOTA"; + sprintf(topic_stopOTA, "fabreader/%05d/stopOTA", CONFIG_FABREADER2_ID); + + char topic_restartOTA[] = "fabreader/00000/restartOTA"; + sprintf(topic_restartOTA, "fabreader/%05d/restartOTA", CONFIG_FABREADER2_ID); + + if (strcmp(topic, topic_requestOTA) == 0) { + uint16_t *rxLen; + uint8_t *rxData; + + ESP_LOGD("OTA", "Received OTA request, transmiting to card"); + ReturnCode err = TagDetectTransceiveBlocking((uint8_t*)payload, length, &rxData, &rxLen, RFAL_FWT_NONE); + + if (err == ERR_NONE) { + ESP_LOGD("OTA", "Transmit to card successful, sending response"); + esp_mqtt_client_publish(client, topic_responseOTA, (const char*)rxData, *rxLen, 0, 0); + } else { + ESP_LOGD("OTA", "Transmit to card failed!"); + cancelOTA(client); + } + + esp_mqtt_client_publish(client, topic_responseOTA, payload, length, 0, 0); + } else if (strcmp(topic, topic_stopOTA) == 0) { + ESP_LOGD("OTA", "Received OTA stop"); + free(current_nfcId); + rfalNfcDeactivate(false); + platformDelay(500); + activeOTA = false; + nfc_state = START_DISCOVERY; + } +} +void cancelOTA(esp_mqtt_client_handle_t client) { + activeOTA = false; + + char topic_cancelOTA[] = "fabreader/00000/cancelOTA"; + sprintf(topic_cancelOTA, "fabreader/%05d/cancelOTA", CONFIG_FABREADER2_ID); + esp_mqtt_client_publish(client, topic_cancelOTA, (const char*)current_nfcId, current_nfcIdLen, 0, 0); + + free(current_nfcId); + rfalNfcDeactivate(false); + platformDelay(500); + activeOTA = false; + nfc_state = START_DISCOVERY; + + + ESP_LOGI("OTA", "Canceled OTA communication"); +} \ No newline at end of file diff --git a/Software/fab-reader2/main/ota/ota.h b/Software/fab-reader2/main/ota/ota.h new file mode 100644 index 0000000..1b74e46 --- /dev/null +++ b/Software/fab-reader2/main/ota/ota.h @@ -0,0 +1,19 @@ +// +// Created by Kai Jan Kriegel on 06.02.23. +// + +#ifndef FAB_READER2_C_OTA_H +#define FAB_READER2_C_OTA_H + +#include +#include +#include + +bool hasActiveOTA(); + +void startOTA(esp_mqtt_client_handle_t client, uint8_t *nfcId, uint8_t nfcIdLen); +void continueOTA(esp_mqtt_client_handle_t client, char* topic, char *payload, unsigned int length); +void cancelOTA(esp_mqtt_client_handle_t client); + + +#endif //FAB_READER2_C_OTA_H diff --git a/Software/fab-reader2/out.bin b/Software/fab-reader2/out.bin deleted file mode 100644 index 1854359..0000000 Binary files a/Software/fab-reader2/out.bin and /dev/null differ diff --git a/Software/fab-reader2/pervasive_epd/Cargo.toml b/Software/fab-reader2/pervasive_epd/Cargo.toml deleted file mode 100644 index e520d47..0000000 --- a/Software/fab-reader2/pervasive_epd/Cargo.toml +++ /dev/null @@ -1,10 +0,0 @@ -[package] -name = "pervasive_epd" -version = "0.1.0" -edition = "2021" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -embedded-hal = "0.2.7" -embedded-graphics-core = "0.3.3" diff --git a/Software/fab-reader2/pervasive_epd/src/E2266CS0Cx/command.rs b/Software/fab-reader2/pervasive_epd/src/E2266CS0Cx/command.rs deleted file mode 100644 index d67edb8..0000000 --- a/Software/fab-reader2/pervasive_epd/src/E2266CS0Cx/command.rs +++ /dev/null @@ -1,39 +0,0 @@ -//! SPI Commands for the Pervasive Displays E2266CS0Cx E-Ink Displays -use crate::traits; - -/// E2266CS0Cx commands -/// -/// More information can be found in the [specification](https://www.waveshare.com/w/upload/d/d8/2.7inch-e-paper-b-specification.pdf) -#[allow(dead_code)] -#[derive(Copy, Clone)] -#[repr(u8)] -pub(crate) enum Command { - /// Set Resolution, LUT selection, BWR pixels, gate scan direction, source shift direction, booster switch, soft reset - PanelSetting = 0x00, - - PowerOff = 0x02, - PowerOn = 0x04, - - /// This command starts transmitting data and write them into SRAM. - DataTransmission1 = 0x10, - - /// After this command is issued, driver will refresh display (data/VCOM) according to SRAM data and LUT. - DisplayRefresh = 0x12, - - /// This command starts transmitting data and write them into SRAM. - DataTransmission2 = 0x13, - - /// Set the ambient Temperatue - /// - InputTemperature = 0xe5, - - /// Activate the set Temperature - ActiveTemperature = 0xe0, -} - -impl traits::Command for Command { - /// Returns the address of the command - fn address(self) -> u8 { - self as u8 - } -} diff --git a/Software/fab-reader2/pervasive_epd/src/E2266CS0Cx/graphics.rs b/Software/fab-reader2/pervasive_epd/src/E2266CS0Cx/graphics.rs deleted file mode 100644 index f9d723e..0000000 --- a/Software/fab-reader2/pervasive_epd/src/E2266CS0Cx/graphics.rs +++ /dev/null @@ -1,62 +0,0 @@ -use crate::graphics::{Display, DisplayRotation}; -use crate::E2266CS0Cx::{DEFAULT_BACKGROUND_COLOR, HEIGHT, WIDTH}; -use embedded_graphics_core::pixelcolor::BinaryColor; -use embedded_graphics_core::prelude::*; - -/// Display with Fullsize buffer for use with the 2in9 EPD -/// -/// Can also be manuall constructed: -/// `buffer: [DEFAULT_BACKGROUND_COLOR.get_byte_value(); WIDTH / 8 * HEIGHT]` -pub struct DisplayE2266CS0Cx { - buffer: [u8; WIDTH as usize * HEIGHT as usize / 8], - rotation: DisplayRotation, -} - -impl Default for DisplayE2266CS0Cx { - fn default() -> Self { - DisplayE2266CS0Cx { - buffer: [DEFAULT_BACKGROUND_COLOR.get_byte_value(); - WIDTH as usize * HEIGHT as usize / 8], - rotation: DisplayRotation::default(), - } - } -} - -impl DrawTarget for DisplayE2266CS0Cx { - type Color = BinaryColor; - type Error = core::convert::Infallible; - - fn draw_iter(&mut self, pixels: I) -> Result<(), Self::Error> - where - I: IntoIterator>, - { - for pixel in pixels { - self.draw_helper(WIDTH, HEIGHT, pixel)?; - } - Ok(()) - } -} - -impl OriginDimensions for DisplayE2266CS0Cx { - fn size(&self) -> Size { - Size::new(WIDTH, HEIGHT) - } -} - -impl Display for DisplayE2266CS0Cx { - fn buffer(&self) -> &[u8] { - &self.buffer - } - - fn get_mut_buffer(&mut self) -> &mut [u8] { - &mut self.buffer - } - - fn set_rotation(&mut self, rotation: DisplayRotation) { - self.rotation = rotation; - } - - fn rotation(&self) -> DisplayRotation { - self.rotation - } -} diff --git a/Software/fab-reader2/pervasive_epd/src/E2266CS0Cx/mod.rs b/Software/fab-reader2/pervasive_epd/src/E2266CS0Cx/mod.rs deleted file mode 100644 index 99f5096..0000000 --- a/Software/fab-reader2/pervasive_epd/src/E2266CS0Cx/mod.rs +++ /dev/null @@ -1,209 +0,0 @@ -mod command; - -/// Width of E2266CS0Cx in pixels -pub const WIDTH: u32 = 152; -/// Height of E2266CS0Cx in pixels -pub const HEIGHT: u32 = 296; -/// Default Background Color (white) -pub const DEFAULT_BACKGROUND_COLOR: Color = Color::White; -const IS_BUSY_LOW: bool = true; - -use crate::buffer_len; -use embedded_hal::{ - blocking::{delay::*, spi::Write}, - digital::v2::*, -}; -use std::io::repeat; - -use command::Command; - -use crate::color::Color; - -use crate::traits::*; - -use crate::interface::DisplayInterface; - -mod graphics; - -/// E2266CS0Cx driver -/// -pub struct E2266CS0Cx { - /// SPI - interface: DisplayInterface, - /// Color - background_color: Color, -} - -impl E2266CS0Cx -where - SPI: Write, - CS: OutputPin, - BUSY: InputPin, - DC: OutputPin, - RST: OutputPin, - DELAY: DelayMs, -{ - fn init(&mut self, spi: &mut SPI, delay: &mut DELAY) -> Result<(), SPI::Error> { - self.interface.reset(delay, 10); - - // soft-reset - self.interface - .cmd_with_data(spi, Command::PanelSetting, &[0x0E])?; - - delay.delay_ms(5); - - let temperature = 25 as i8; // We assume this for now, we should probably measure this. - - // Set temperature - self.interface - .cmd_with_data(spi, Command::InputTemperature, &temperature.to_ne_bytes())?; - - // Activate temperature - self.interface - .cmd_with_data(spi, Command::ActiveTemperature, &[0x02])?; - - // Set PanelSettings - self.interface - .cmd_with_data(spi, Command::PanelSetting, &[0xCF, 0x8D])?; - Ok(()) - } -} - -impl PervasiveDisplay - for E2266CS0Cx -where - SPI: Write, - CS: OutputPin, - BUSY: InputPin, - DC: OutputPin, - RST: OutputPin, - DELAY: DelayMs, -{ - type DisplayColor = Color; - fn width(&self) -> u32 { - WIDTH - } - - fn height(&self) -> u32 { - HEIGHT - } - - fn new( - spi: &mut SPI, - cs: CS, - busy: BUSY, - dc: DC, - rst: RST, - delay: &mut DELAY, - ) -> Result { - let interface = DisplayInterface::new(cs, busy, dc, rst); - - let mut epd = E2266CS0Cx { - interface, - background_color: DEFAULT_BACKGROUND_COLOR, - }; - - epd.init(spi, delay)?; - - Ok(epd) - } - - fn power_off(&mut self, spi: &mut SPI, _delay: &mut DELAY) -> Result<(), SPI::Error> { - self.wait_until_idle(); - self.interface.cmd(spi, Command::PowerOff)?; - Ok(()) - } - - fn wake_up(&mut self, spi: &mut SPI, delay: &mut DELAY) -> Result<(), SPI::Error> { - self.wait_until_idle(); - self.init(spi, delay)?; - Ok(()) - } - - fn update_frame( - &mut self, - spi: &mut SPI, - buffer: &[u8], - _delay: &mut DELAY, - ) -> Result<(), SPI::Error> { - self.wait_until_idle(); - - // Transmit display data - self.interface - .cmd_with_data(spi, Command::DataTransmission1, buffer)?; - - // Transmit WIDTH * HEIGHT bytes of 0x00 - self.interface.cmd(spi, Command::DataTransmission2)?; - self.interface.data_x_times( - spi, - 0x00, - buffer_len(WIDTH as usize, HEIGHT as usize) as u32, - )?; - Ok(()) - } - - fn display_frame(&mut self, spi: &mut SPI, _delay: &mut DELAY) -> Result<(), SPI::Error> { - self.wait_until_idle(); - // Power on DC/DC converter - self.interface.cmd(spi, Command::PowerOn)?; - - self.wait_until_idle(); - - // Refresh the Display - self.interface.cmd(spi, Command::DisplayRefresh)?; - - self.wait_until_idle(); - Ok(()) - } - - fn update_and_display_frame( - &mut self, - spi: &mut SPI, - buffer: &[u8], - delay: &mut DELAY, - ) -> Result<(), SPI::Error> { - self.update_frame(spi, buffer, delay)?; - self.display_frame(spi, delay)?; - Ok(()) - } - - fn clear_frame(&mut self, spi: &mut SPI, _delay: &mut DELAY) -> Result<(), SPI::Error> { - self.wait_until_idle(); - - // clear the ram with the background color - let color = self.background_color.get_byte_value(); - - self.update_frame( - spi, - &[0x00; buffer_len(WIDTH as usize, HEIGHT as usize)], - _delay, - )?; - Ok(()) - } - - fn set_background_color(&mut self, background_color: Color) { - self.background_color = background_color; - } - - fn background_color(&self) -> &Color { - &self.background_color - } - - fn is_busy(&self) -> bool { - self.interface.is_busy(IS_BUSY_LOW) - } -} - -impl E2266CS0Cx -where - SPI: Write, - CS: OutputPin, - BUSY: InputPin, - DC: OutputPin, - RST: OutputPin, - DELAY: DelayMs, -{ - fn wait_until_idle(&mut self) { - let _ = self.interface.wait_until_idle(IS_BUSY_LOW); - } -} diff --git a/Software/fab-reader2/pervasive_epd/src/color.rs b/Software/fab-reader2/pervasive_epd/src/color.rs deleted file mode 100644 index 34f0526..0000000 --- a/Software/fab-reader2/pervasive_epd/src/color.rs +++ /dev/null @@ -1,79 +0,0 @@ -//! B/W Color for EPDs - -use embedded_graphics_core::pixelcolor::BinaryColor; -use embedded_graphics_core::pixelcolor::PixelColor; - -pub use BinaryColor::Off as White; -pub use BinaryColor::On as Black; - -/// When trying to parse u8 to one of the color types -#[derive(Debug, PartialEq, Eq)] -pub struct OutOfColorRangeParseError(u8); -impl core::fmt::Display for OutOfColorRangeParseError { - fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { - write!(f, "Outside of possible Color Range: {}", self.0) - } -} - -impl OutOfColorRangeParseError { - fn _new(size: u8) -> OutOfColorRangeParseError { - OutOfColorRangeParseError(size) - } -} - -/// Only for the Black/White-Displays -#[derive(Clone, Copy, PartialEq, Debug)] -pub enum Color { - /// Black color - Black, - /// White color - White, -} - -//TODO: Rename get_bit_value to bit() and get_byte_value to byte() ? - -impl Color { - /// Get the color encoding of the color for one bit - pub fn get_bit_value(self) -> u8 { - match self { - Color::White => 0u8, - Color::Black => 1u8, - } - } - - /// Gets a full byte of black or white pixels - pub fn get_byte_value(self) -> u8 { - match self { - Color::White => 0x00, - Color::Black => 0xff, - } - } - - /// Parses from u8 to Color - fn from_u8(val: u8) -> Self { - match val { - 1 => Color::Black, - 0 => Color::White, - e => panic!( - "DisplayColor only parses 0 and 1 (Black and White) and not `{}`", - e - ), - } - } - - /// Returns the inverse of the given color. - /// - /// Black returns White and White returns Black - pub fn inverse(self) -> Color { - match self { - Color::White => Color::Black, - Color::Black => Color::White, - } - } -} - -impl From for Color { - fn from(value: u8) -> Self { - Color::from_u8(value) - } -} diff --git a/Software/fab-reader2/pervasive_epd/src/graphics.rs b/Software/fab-reader2/pervasive_epd/src/graphics.rs deleted file mode 100644 index 9eaabc3..0000000 --- a/Software/fab-reader2/pervasive_epd/src/graphics.rs +++ /dev/null @@ -1,242 +0,0 @@ -//! Graphics Support for EPDs - -use crate::buffer_len; -use crate::color::Color; -use embedded_graphics_core::pixelcolor::BinaryColor; -use embedded_graphics_core::prelude::*; - -/// Displayrotation -#[derive(Clone, Copy)] -pub enum DisplayRotation { - /// No rotation - Rotate0, - /// Rotate by 90 degrees clockwise - Rotate90, - /// Rotate by 180 degrees clockwise - Rotate180, - /// Rotate 270 degrees clockwise - Rotate270, -} - -impl Default for DisplayRotation { - fn default() -> Self { - DisplayRotation::Rotate0 - } -} - -/// Necessary traits for all displays to implement for drawing -/// -/// Adds support for: -/// - Drawing (With the help of DrawTarget/Embedded Graphics) -/// - Rotations -/// - Clearing -pub trait Display: DrawTarget { - /// Clears the buffer of the display with the chosen background color - fn clear_buffer(&mut self, background_color: Color) { - for elem in self.get_mut_buffer().iter_mut() { - *elem = background_color.get_byte_value(); - } - } - - /// Returns the buffer - fn buffer(&self) -> &[u8]; - - /// Returns a mutable buffer - fn get_mut_buffer(&mut self) -> &mut [u8]; - - /// Sets the rotation of the display - fn set_rotation(&mut self, rotation: DisplayRotation); - - /// Get the current rotation of the display - fn rotation(&self) -> DisplayRotation; - - /// Helperfunction for the Embedded Graphics draw trait - /// - /// Becomes uneccesary when const_generics become stablised - fn draw_helper( - &mut self, - width: u32, - height: u32, - pixel: Pixel, - ) -> Result<(), Self::Error> { - let rotation = self.rotation(); - let buffer = self.get_mut_buffer(); - - let Pixel(point, color) = pixel; - if outside_display(point, width, height, rotation) { - return Ok(()); - } - - // Give us index inside the buffer and the bit-position in that u8 which needs to be changed - let (index, bit) = find_position(point.x as u32, point.y as u32, width, height, rotation); - let index = index as usize; - - // "Draw" the Pixel on that bit - match color { - // Black - BinaryColor::On => { - buffer[index] &= !bit; - } - // White - BinaryColor::Off => { - buffer[index] |= bit; - } - } - Ok(()) - } -} - -/// A variable Display without a predefined buffer -/// -/// The buffer can be created as following: -/// buffer: [DEFAULT_BACKGROUND_COLOR.get_byte_value(); WIDTH / 8 * HEIGHT] -/// If WIDTH is not a multiple of 8, don't forget to round it up (ie. (WIDTH + 7) / 8) -/// -/// Example: -/// ```rust,no_run -/// # use epd_waveshare::epd2in9::DEFAULT_BACKGROUND_COLOR; -/// # use epd_waveshare::prelude::*; -/// # use epd_waveshare::graphics::VarDisplay; -/// # use epd_waveshare::color::Black; -/// # use embedded_graphics::prelude::*; -/// # use embedded_graphics::primitives::{Circle, Line, PrimitiveStyle}; -/// let width = 128; -/// let height = 296; -/// -/// let mut buffer = [DEFAULT_BACKGROUND_COLOR.get_byte_value(); 128 / 8 * 296]; -/// let mut display = VarDisplay::new(width, height, &mut buffer); -/// -/// display.set_rotation(DisplayRotation::Rotate90); -/// -/// let _ = Line::new(Point::new(0, 120), Point::new(0, 295)) -/// .into_styled(PrimitiveStyle::with_stroke(Black, 1)) -/// .draw(&mut display); -/// ``` -pub struct VarDisplay<'a> { - width: u32, - height: u32, - rotation: DisplayRotation, - buffer: &'a mut [u8], //buffer: Box//[u8; 15000] -} - -impl<'a> VarDisplay<'a> { - /// Create a new variable sized display. - /// - /// Buffersize must be at least (width + 7) / 8 * height bytes. - pub fn new(width: u32, height: u32, buffer: &'a mut [u8]) -> VarDisplay<'a> { - let len = buffer.len() as u32; - assert!(buffer_len(width as usize, height as usize) >= len as usize); - VarDisplay { - width, - height, - rotation: DisplayRotation::default(), - buffer, - } - } -} - -impl<'a> DrawTarget for VarDisplay<'a> { - type Color = BinaryColor; - type Error = core::convert::Infallible; - - fn draw_iter(&mut self, pixels: I) -> Result<(), Self::Error> - where - I: IntoIterator>, - { - for pixel in pixels { - self.draw_helper(self.width, self.height, pixel)?; - } - Ok(()) - } -} - -impl<'a> OriginDimensions for VarDisplay<'a> { - fn size(&self) -> Size { - Size::new(self.width, self.height) - } -} - -impl<'a> Display for VarDisplay<'a> { - fn buffer(&self) -> &[u8] { - self.buffer - } - - fn get_mut_buffer(&mut self) -> &mut [u8] { - self.buffer - } - - fn set_rotation(&mut self, rotation: DisplayRotation) { - self.rotation = rotation; - } - - fn rotation(&self) -> DisplayRotation { - self.rotation - } -} - -// Checks if a pos is outside the defined display -fn outside_display(p: Point, width: u32, height: u32, rotation: DisplayRotation) -> bool { - if p.x < 0 || p.y < 0 { - return true; - } - let (x, y) = (p.x as u32, p.y as u32); - match rotation { - DisplayRotation::Rotate0 | DisplayRotation::Rotate180 => { - if x >= width || y >= height { - return true; - } - } - DisplayRotation::Rotate90 | DisplayRotation::Rotate270 => { - if y >= width || x >= height { - return true; - } - } - } - false -} - -fn find_rotation(x: u32, y: u32, width: u32, height: u32, rotation: DisplayRotation) -> (u32, u32) { - let nx; - let ny; - match rotation { - DisplayRotation::Rotate0 => { - nx = x; - ny = y; - } - DisplayRotation::Rotate90 => { - nx = width - 1 - y; - ny = x; - } - DisplayRotation::Rotate180 => { - nx = width - 1 - x; - ny = height - 1 - y; - } - DisplayRotation::Rotate270 => { - nx = y; - ny = height - 1 - x; - } - } - (nx, ny) -} - -#[rustfmt::skip] -//returns index position in the u8-slice and the bit-position inside that u8 -fn find_oct_position(x: u32, y: u32, width: u32, height: u32, rotation: DisplayRotation) -> (u32, bool) { - let (nx, ny) = find_rotation(x, y, width, height, rotation); - ( - /* what byte address is this? */ - nx / 2 + (width / 2) * ny, - /* is this the lower nibble (within byte)? */ - (nx & 0x1) == 0, - ) -} - -#[rustfmt::skip] -//returns index position in the u8-slice and the bit-position inside that u8 -fn find_position(x: u32, y: u32, width: u32, height: u32, rotation: DisplayRotation) -> (u32, u8) { - let (nx, ny) = find_rotation(x, y, width, height, rotation); - ( - nx / 8 + ((width + 7) / 8) * ny, - 0x80 >> (nx % 8), - ) -} diff --git a/Software/fab-reader2/pervasive_epd/src/interface.rs b/Software/fab-reader2/pervasive_epd/src/interface.rs deleted file mode 100644 index 6a15f9d..0000000 --- a/Software/fab-reader2/pervasive_epd/src/interface.rs +++ /dev/null @@ -1,183 +0,0 @@ -use crate::traits::Command; -use core::marker::PhantomData; -use embedded_hal::{ - blocking::{delay::*, spi::Write}, - digital::v2::*, -}; - -/// The Connection Interface of all (?) Waveshare EPD-Devices -/// -pub(crate) struct DisplayInterface { - /// SPI - _spi: PhantomData, - /// DELAY - _delay: PhantomData, - /// CS for SPI - cs: CS, - /// Low for busy, Wait until display is ready! - busy: BUSY, - /// Data/Command Control Pin (High for data, Low for command) - dc: DC, - /// Pin for Resetting - rst: RST, -} - -impl DisplayInterface -where - SPI: Write, - CS: OutputPin, - BUSY: InputPin, - DC: OutputPin, - RST: OutputPin, - DELAY: DelayMs, -{ - pub fn new(cs: CS, busy: BUSY, dc: DC, rst: RST) -> Self { - DisplayInterface { - _spi: PhantomData::default(), - _delay: PhantomData::default(), - cs, - busy, - dc, - rst, - } - } - - /// Basic function for sending [Commands](Command). - /// - /// Enables direct interaction with the device with the help of [data()](DisplayInterface::data()) - pub(crate) fn cmd(&mut self, spi: &mut SPI, command: T) -> Result<(), SPI::Error> { - // low for commands - let _ = self.dc.set_low(); - - // Transfer the command over spi - self.write(spi, &[command.address()]) - } - - /// Basic function for sending an array of u8-values of data over spi - /// - /// Enables direct interaction with the device with the help of [command()](Epd4in2::command()) - pub(crate) fn data(&mut self, spi: &mut SPI, data: &[u8]) -> Result<(), SPI::Error> { - // high for data - let _ = self.dc.set_high(); - - for val in data.iter().copied() { - // Transfer data one u8 at a time over spi - self.write(spi, &[val])?; - } - - Ok(()) - } - - /// Basic function for sending [Commands](Command) and the data belonging to it. - /// - /// TODO: directly use ::write? cs wouldn't needed to be changed twice than - pub(crate) fn cmd_with_data( - &mut self, - spi: &mut SPI, - command: T, - data: &[u8], - ) -> Result<(), SPI::Error> { - self.cmd(spi, command)?; - self.data(spi, data) - } - - /// Basic function for sending the same byte of data (one u8) multiple times over spi - /// - /// Enables direct interaction with the device with the help of [command()](ConnectionInterface::command()) - pub(crate) fn data_x_times( - &mut self, - spi: &mut SPI, - val: u8, - repetitions: u32, - ) -> Result<(), SPI::Error> { - // high for data - let _ = self.dc.set_high(); - // Transfer data (u8) over spi - for _ in 0..repetitions { - self.write(spi, &[val])?; - } - Ok(()) - } - - // spi write helper/abstraction function - fn write(&mut self, spi: &mut SPI, data: &[u8]) -> Result<(), SPI::Error> { - // activate spi with cs low - let _ = self.cs.set_low(); - - // transfer spi data - // Be careful!! Linux has a default limit of 4096 bytes per spi transfer - // see https://raspberrypi.stackexchange.com/questions/65595/spi-transfer-fails-with-buffer-size-greater-than-4096 - if cfg!(target_os = "linux") { - for data_chunk in data.chunks(4096) { - spi.write(data_chunk)?; - } - } else { - spi.write(data)?; - } - - // deactivate spi with cs high - let _ = self.cs.set_high(); - - Ok(()) - } - - /// Waits until device isn't busy anymore (busy == HIGH) - /// - /// This is normally handled by the more complicated commands themselves, - /// but in the case you send data and commands directly you might need to check - /// if the device is still busy - /// - /// is_busy_low - /// - /// - TRUE for epd4in2, epd2in13, epd2in7, epd5in83, epd7in5 - /// - FALSE for epd2in9, epd1in54 (for all Display Type A ones?) - /// - /// Most likely there was a mistake with the 2in9 busy connection - /// //TODO: use the #cfg feature to make this compile the right way for the certain types - pub(crate) fn wait_until_idle(&mut self, is_busy_low: bool) { - // //tested: worked without the delay for all tested devices - // //self.delay_ms(1); - while self.is_busy(is_busy_low) { - // //tested: REMOVAL of DELAY: it's only waiting for the signal anyway and should continue work asap - // //old: shorten the time? it was 100 in the beginning - // //self.delay_ms(5); - } - } - - /// Checks if device is still busy - /// - /// This is normally handled by the more complicated commands themselves, - /// but in the case you send data and commands directly you might need to check - /// if the device is still busy - /// - /// is_busy_low - /// - /// - TRUE for epd4in2, epd2in13, epd2in7, epd5in83, epd7in5 - /// - FALSE for epd2in9, epd1in54 (for all Display Type A ones?) - /// - /// Most likely there was a mistake with the 2in9 busy connection - /// //TODO: use the #cfg feature to make this compile the right way for the certain types - pub(crate) fn is_busy(&self, is_busy_low: bool) -> bool { - (is_busy_low && self.busy.is_low().unwrap_or(false)) - || (!is_busy_low && self.busy.is_high().unwrap_or(false)) - } - - /// Resets the device. - /// - /// Often used to awake the module from deep sleep. See [Epd4in2::sleep()](Epd4in2::sleep()) - /// - /// The timing of keeping the reset pin low seems to be important and different per device. - /// Most displays seem to require keeping it low for 10ms, but the 7in5_v2 only seems to reset - /// properly with 2ms - pub(crate) fn reset(&mut self, delay: &mut DELAY, duration: u8) { - let _ = self.rst.set_high(); - delay.delay_ms(5); - - let _ = self.rst.set_low(); - delay.delay_ms(duration); - let _ = self.rst.set_high(); - //TODO: the upstream libraries always sleep for 200ms here - // 10ms works fine with just for the 7in5_v2 but this needs to be validated for other devices - delay.delay_ms(5); - } -} diff --git a/Software/fab-reader2/pervasive_epd/src/lib.rs b/Software/fab-reader2/pervasive_epd/src/lib.rs deleted file mode 100644 index 1e4862c..0000000 --- a/Software/fab-reader2/pervasive_epd/src/lib.rs +++ /dev/null @@ -1,37 +0,0 @@ -pub mod color; -pub mod graphics; -mod interface; -mod traits; - -pub mod E2266CS0Cx; - -pub mod prelude { - pub use crate::color::Color; - pub use crate::traits::PervasiveDisplay; - - pub use crate::SPI_MODE; - - pub use crate::graphics::{Display, DisplayRotation}; -} - -/// Computes the needed buffer length. Takes care of rounding up in case width -/// is not divisible by 8. -/// -/// unused -/// bits width -/// <----><------------------------> -/// \[XXXXX210\]\[76543210\]...\[76543210\] ^ -/// \[XXXXX210\]\[76543210\]...\[76543210\] | height -/// \[XXXXX210\]\[76543210\]...\[76543210\] v -pub const fn buffer_len(width: usize, height: usize) -> usize { - (width + 7) / 8 * height -} - -use embedded_hal::spi::{Mode, Phase, Polarity}; - -/// SPI mode - -/// For more infos see [Requirements: SPI](index.html#spi) -pub const SPI_MODE: Mode = Mode { - phase: Phase::CaptureOnFirstTransition, - polarity: Polarity::IdleLow, -}; diff --git a/Software/fab-reader2/pervasive_epd/src/traits.rs b/Software/fab-reader2/pervasive_epd/src/traits.rs deleted file mode 100644 index 0799fc5..0000000 --- a/Software/fab-reader2/pervasive_epd/src/traits.rs +++ /dev/null @@ -1,91 +0,0 @@ -use embedded_hal::{ - blocking::{delay::*, spi::Write}, - digital::v2::*, -}; - -/// All commands need to have this trait which gives the address of the command -/// which needs to be send via SPI with activated CommandsPin (Data/Command Pin in CommandMode) -pub(crate) trait Command { - fn address(self) -> u8; -} - -pub trait PervasiveDisplay -where - SPI: Write, - CS: OutputPin, - BUSY: InputPin, - DC: OutputPin, - RST: OutputPin, - DELAY: DelayMs, -{ - /// The Color Type used by the Display - type DisplayColor; - /// Creates a new driver from a SPI peripheral, CS Pin, Busy InputPin, DC - /// - /// This already initialises the device. - fn new( - spi: &mut SPI, - cs: CS, - busy: BUSY, - dc: DC, - rst: RST, - delay: &mut DELAY, - ) -> Result - where - Self: Sized; - - /// Let the device enter deep-sleep mode to save power. - /// - /// The deep sleep mode returns to standby with a hardware reset. - fn power_off(&mut self, spi: &mut SPI, delay: &mut DELAY) -> Result<(), SPI::Error>; - - /// Wakes the device up from sleep - /// - /// Also reintialises the device if necessary. - fn wake_up(&mut self, spi: &mut SPI, delay: &mut DELAY) -> Result<(), SPI::Error>; - - /// Sets the backgroundcolor for various commands like [clear_frame](WaveshareDisplay::clear_frame) - fn set_background_color(&mut self, color: Self::DisplayColor); - - /// Get current background color - fn background_color(&self) -> &Self::DisplayColor; - - /// Get the width of the display - fn width(&self) -> u32; - - /// Get the height of the display - fn height(&self) -> u32; - - /// Transmit a full frame to the SRAM of the EPD - fn update_frame( - &mut self, - spi: &mut SPI, - buffer: &[u8], - delay: &mut DELAY, - ) -> Result<(), SPI::Error>; - - /// Displays the frame data from SRAM - /// - /// This function waits until the device isn`t busy anymore - fn display_frame(&mut self, spi: &mut SPI, delay: &mut DELAY) -> Result<(), SPI::Error>; - - /// Provide a combined update&display and save some time (skipping a busy check in between) - fn update_and_display_frame( - &mut self, - spi: &mut SPI, - buffer: &[u8], - delay: &mut DELAY, - ) -> Result<(), SPI::Error>; - - /// Clears the frame buffer on the EPD with the declared background color - /// - /// The background color can be changed with [`WaveshareDisplay::set_background_color`] - fn clear_frame(&mut self, spi: &mut SPI, delay: &mut DELAY) -> Result<(), SPI::Error>; - - /// Checks if the display is busy transmitting data - /// - /// This is normally handled by the more complicated commands themselves, - /// but in the case you send data and commands directly you might need to check - /// if the device is still busy - fn is_busy(&self) -> bool; -} diff --git a/Software/fab-reader2/rout.bin b/Software/fab-reader2/rout.bin deleted file mode 100644 index c33d30b..0000000 Binary files a/Software/fab-reader2/rout.bin and /dev/null differ diff --git a/Software/fab-reader2/rust-toolchain.toml b/Software/fab-reader2/rust-toolchain.toml deleted file mode 100644 index 2e27578..0000000 --- a/Software/fab-reader2/rust-toolchain.toml +++ /dev/null @@ -1,2 +0,0 @@ -[toolchain] -channel = "esp" \ No newline at end of file diff --git a/Software/fab-reader2-c/sdkconfig b/Software/fab-reader2/sdkconfig similarity index 98% rename from Software/fab-reader2-c/sdkconfig rename to Software/fab-reader2/sdkconfig index 8def02d..27f3b74 100644 --- a/Software/fab-reader2-c/sdkconfig +++ b/Software/fab-reader2/sdkconfig @@ -143,6 +143,18 @@ CONFIG_PARTITION_TABLE_OFFSET=0x8000 CONFIG_PARTITION_TABLE_MD5=y # end of Partition Table +# +# FabReader Configuration +# +CONFIG_WIFI_SSID="Olympia" +CONFIG_WIFI_PASSWORD="YgPg6ggqVTNzoqMw5SCQ" +CONFIG_WIFI_FAST_SCAN=y +# CONFIG_WIFI_ALL_CHANNEL_SCAN is not set +CONFIG_BROKER_URI="mqtts://mqtt.eclipseprojects.io:8883" +CONFIG_BROKER_CERTIFICATE_OVERRIDE="" +CONFIG_FABREADER2_ID=00002 +# end of FabReader Configuration + # # Compiler options # @@ -156,8 +168,7 @@ CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_ENABLE=y CONFIG_COMPILER_OPTIMIZATION_ASSERTION_LEVEL=2 # CONFIG_COMPILER_OPTIMIZATION_CHECKS_SILENT is not set CONFIG_COMPILER_HIDE_PATHS_MACROS=y -CONFIG_COMPILER_CXX_EXCEPTIONS=y -CONFIG_COMPILER_CXX_EXCEPTIONS_EMG_POOL_SIZE=0 +# CONFIG_COMPILER_CXX_EXCEPTIONS is not set # CONFIG_COMPILER_CXX_RTTI is not set CONFIG_COMPILER_STACK_CHECK_MODE_NONE=y # CONFIG_COMPILER_STACK_CHECK_MODE_NORM is not set @@ -660,7 +671,7 @@ CONFIG_FREERTOS_TICK_SUPPORT_SYSTIMER=y CONFIG_FREERTOS_CORETIMER_SYSTIMER_LVL1=y # CONFIG_FREERTOS_CORETIMER_SYSTIMER_LVL3 is not set CONFIG_FREERTOS_SYSTICK_USES_SYSTIMER=y -CONFIG_FREERTOS_HZ=1000 +CONFIG_FREERTOS_HZ=100 CONFIG_FREERTOS_ASSERT_ON_UNTESTED_FUNCTION=y # CONFIG_FREERTOS_CHECK_STACKOVERFLOW_NONE is not set # CONFIG_FREERTOS_CHECK_STACKOVERFLOW_PTRVAL is not set @@ -1238,7 +1249,7 @@ CONFIG_WL_SECTOR_SIZE=4096 # CONFIG_WIFI_PROV_SCAN_MAX_ENTRIES=16 CONFIG_WIFI_PROV_AUTOSTOP_TIMEOUT=30 -CONFIG_WIFI_PROV_BLE_FORCE_ENCRYPTION=y +# CONFIG_WIFI_PROV_BLE_FORCE_ENCRYPTION is not set # end of Wi-Fi Provisioning Manager # @@ -1292,8 +1303,7 @@ CONFIG_OPTIMIZATION_ASSERTIONS_ENABLED=y # CONFIG_OPTIMIZATION_ASSERTIONS_SILENT is not set # CONFIG_OPTIMIZATION_ASSERTIONS_DISABLED is not set CONFIG_OPTIMIZATION_ASSERTION_LEVEL=2 -CONFIG_CXX_EXCEPTIONS=y -CONFIG_CXX_EXCEPTIONS_EMG_POOL_SIZE=0 +# CONFIG_CXX_EXCEPTIONS is not set CONFIG_STACK_CHECK_NONE=y # CONFIG_STACK_CHECK_NORM is not set # CONFIG_STACK_CHECK_STRONG is not set diff --git a/Software/fab-reader2/sdkconfig.defaults b/Software/fab-reader2/sdkconfig.defaults deleted file mode 100644 index 3ca3b5d..0000000 --- a/Software/fab-reader2/sdkconfig.defaults +++ /dev/null @@ -1,10 +0,0 @@ -# Rust often needs a bit of an extra main task stack size compared to C (the default is 3K) -CONFIG_ESP_MAIN_TASK_STACK_SIZE=7000 - -# Use this to set FreeRTOS kernel tick frequency to 1000 Hz (100 Hz by default). -# This allows to use 1 ms granuality for thread sleeps (10 ms by default). -#CONFIG_FREERTOS_HZ=1000 - -# Workaround for https://github.com/espressif/esp-idf/issues/7631 -#CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=n -#CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_FULL=n diff --git a/Software/fab-reader2-c/sdkconfig.old b/Software/fab-reader2/sdkconfig.old similarity index 63% rename from Software/fab-reader2-c/sdkconfig.old rename to Software/fab-reader2/sdkconfig.old index ff98e11..f2018cd 100644 --- a/Software/fab-reader2-c/sdkconfig.old +++ b/Software/fab-reader2/sdkconfig.old @@ -2,277 +2,19 @@ # Automatically generated file. DO NOT EDIT. # Espressif IoT Development Framework (ESP-IDF) Project Configuration # -CONFIG_SOC_LEDC_SUPPORT_APB_CLOCK=y -CONFIG_SOC_LEDC_SUPPORT_XTAL_CLOCK=y -CONFIG_SOC_LEDC_CHANNEL_NUM=8 -CONFIG_SOC_LEDC_TIMER_BIT_WIDE_NUM=14 -CONFIG_SOC_LEDC_SUPPORT_FADE_STOP=y -CONFIG_SOC_MPU_MIN_REGION_SIZE=0x20000000 -CONFIG_SOC_MPU_REGIONS_MAX_NUM=8 -CONFIG_SOC_ADC_SUPPORTED=y -CONFIG_SOC_PCNT_SUPPORTED=y -CONFIG_SOC_WIFI_SUPPORTED=y -CONFIG_SOC_TWAI_SUPPORTED=y -CONFIG_SOC_GDMA_SUPPORTED=y -CONFIG_SOC_LCDCAM_SUPPORTED=y -CONFIG_SOC_MCPWM_SUPPORTED=y -CONFIG_SOC_DEDICATED_GPIO_SUPPORTED=y -CONFIG_SOC_CACHE_SUPPORT_WRAP=y -CONFIG_SOC_ULP_SUPPORTED=y -CONFIG_SOC_RISCV_COPROC_SUPPORTED=y -CONFIG_SOC_BT_SUPPORTED=y -CONFIG_SOC_USB_OTG_SUPPORTED=y -CONFIG_SOC_USB_SERIAL_JTAG_SUPPORTED=y -CONFIG_SOC_CCOMP_TIMER_SUPPORTED=y -CONFIG_SOC_ASYNC_MEMCPY_SUPPORTED=y -CONFIG_SOC_SUPPORTS_SECURE_DL_MODE=y -CONFIG_SOC_EFUSE_KEY_PURPOSE_FIELD=y -CONFIG_SOC_SDMMC_HOST_SUPPORTED=y -CONFIG_SOC_RTC_FAST_MEM_SUPPORTED=y -CONFIG_SOC_RTC_SLOW_MEM_SUPPORTED=y -CONFIG_SOC_RTC_MEM_SUPPORTED=y -CONFIG_SOC_PSRAM_DMA_CAPABLE=y -CONFIG_SOC_XT_WDT_SUPPORTED=y -CONFIG_SOC_I2S_SUPPORTED=y -CONFIG_SOC_RMT_SUPPORTED=y -CONFIG_SOC_SDM_SUPPORTED=y -CONFIG_SOC_SYSTIMER_SUPPORTED=y -CONFIG_SOC_SUPPORT_COEXISTENCE=y -CONFIG_SOC_TEMP_SENSOR_SUPPORTED=y -CONFIG_SOC_AES_SUPPORTED=y -CONFIG_SOC_MPI_SUPPORTED=y -CONFIG_SOC_SHA_SUPPORTED=y -CONFIG_SOC_HMAC_SUPPORTED=y -CONFIG_SOC_DIG_SIGN_SUPPORTED=y -CONFIG_SOC_FLASH_ENC_SUPPORTED=y -CONFIG_SOC_SECURE_BOOT_SUPPORTED=y -CONFIG_SOC_MEMPROT_SUPPORTED=y -CONFIG_SOC_TOUCH_SENSOR_SUPPORTED=y -CONFIG_SOC_XTAL_SUPPORT_40M=y -CONFIG_SOC_APPCPU_HAS_CLOCK_GATING_BUG=y -CONFIG_SOC_ADC_RTC_CTRL_SUPPORTED=y -CONFIG_SOC_ADC_DIG_CTRL_SUPPORTED=y -CONFIG_SOC_ADC_ARBITER_SUPPORTED=y -CONFIG_SOC_ADC_FILTER_SUPPORTED=y -CONFIG_SOC_ADC_MONITOR_SUPPORTED=y -CONFIG_SOC_ADC_DMA_SUPPORTED=y -CONFIG_SOC_ADC_PERIPH_NUM=2 -CONFIG_SOC_ADC_MAX_CHANNEL_NUM=10 -CONFIG_SOC_ADC_ATTEN_NUM=4 -CONFIG_SOC_ADC_DIGI_CONTROLLER_NUM=2 -CONFIG_SOC_ADC_PATT_LEN_MAX=24 -CONFIG_SOC_ADC_DIGI_MIN_BITWIDTH=12 -CONFIG_SOC_ADC_DIGI_MAX_BITWIDTH=12 -CONFIG_SOC_ADC_DIGI_RESULT_BYTES=4 -CONFIG_SOC_ADC_DIGI_DATA_BYTES_PER_CONV=4 -CONFIG_SOC_ADC_SAMPLE_FREQ_THRES_HIGH=83333 -CONFIG_SOC_ADC_SAMPLE_FREQ_THRES_LOW=611 -CONFIG_SOC_ADC_RTC_MIN_BITWIDTH=12 -CONFIG_SOC_ADC_RTC_MAX_BITWIDTH=12 -CONFIG_SOC_RTC_SLOW_CLOCK_SUPPORT_8MD256=y -CONFIG_SOC_ADC_CALIBRATION_V1_SUPPORTED=y -CONFIG_SOC_APB_BACKUP_DMA=y -CONFIG_SOC_BROWNOUT_RESET_SUPPORTED=y -CONFIG_SOC_MMU_LINEAR_ADDRESS_REGION_NUM=1 -CONFIG_SOC_CPU_CORES_NUM=2 -CONFIG_SOC_CPU_INTR_NUM=32 -CONFIG_SOC_CPU_HAS_FPU=y -CONFIG_SOC_CPU_BREAKPOINTS_NUM=2 -CONFIG_SOC_CPU_WATCHPOINTS_NUM=2 -CONFIG_SOC_CPU_WATCHPOINT_SIZE=64 -CONFIG_SOC_DS_SIGNATURE_MAX_BIT_LEN=4096 -CONFIG_SOC_DS_KEY_PARAM_MD_IV_LENGTH=16 -CONFIG_SOC_DS_KEY_CHECK_MAX_WAIT_US=1100 -CONFIG_SOC_GDMA_GROUPS=y -CONFIG_SOC_GDMA_PAIRS_PER_GROUP=5 -CONFIG_SOC_GDMA_SUPPORT_PSRAM=y -CONFIG_SOC_GDMA_PSRAM_MIN_ALIGN=16 -CONFIG_SOC_GPIO_PORT=1 -CONFIG_SOC_GPIO_PIN_COUNT=49 -CONFIG_SOC_GPIO_SUPPORT_RTC_INDEPENDENT=y -CONFIG_SOC_GPIO_SUPPORT_FORCE_HOLD=y -CONFIG_SOC_GPIO_VALID_GPIO_MASK=0x1FFFFFFFFFFFF -CONFIG_SOC_GPIO_VALID_DIGITAL_IO_PAD_MASK=0x0001FFFFFC000000 -CONFIG_SOC_GPIO_SUPPORT_SLP_SWITCH=y -CONFIG_SOC_DEDIC_GPIO_OUT_CHANNELS_NUM=8 -CONFIG_SOC_DEDIC_GPIO_IN_CHANNELS_NUM=8 -CONFIG_SOC_DEDIC_GPIO_OUT_AUTO_ENABLE=y -CONFIG_SOC_I2C_NUM=2 -CONFIG_SOC_I2C_FIFO_LEN=32 -CONFIG_SOC_I2C_SUPPORT_SLAVE=y -CONFIG_SOC_I2C_SUPPORT_HW_CLR_BUS=y -CONFIG_SOC_I2C_SUPPORT_XTAL=y -CONFIG_SOC_I2C_SUPPORT_RTC=y -CONFIG_SOC_I2S_NUM=2 -CONFIG_SOC_I2S_HW_VERSION_2=y -CONFIG_SOC_I2S_SUPPORTS_PCM=y -CONFIG_SOC_I2S_SUPPORTS_PDM=y -CONFIG_SOC_I2S_SUPPORTS_PDM_TX=y -CONFIG_SOC_I2S_SUPPORTS_PDM_RX=y -CONFIG_SOC_I2S_SUPPORTS_PDM_CODEC=y -CONFIG_SOC_I2S_SUPPORTS_TDM=y -CONFIG_SOC_MCPWM_GROUPS=2 -CONFIG_SOC_MCPWM_TIMERS_PER_GROUP=3 -CONFIG_SOC_MCPWM_OPERATORS_PER_GROUP=3 -CONFIG_SOC_MCPWM_COMPARATORS_PER_OPERATOR=2 -CONFIG_SOC_MCPWM_GENERATORS_PER_OPERATOR=2 -CONFIG_SOC_MCPWM_TRIGGERS_PER_OPERATOR=2 -CONFIG_SOC_MCPWM_GPIO_FAULTS_PER_GROUP=3 -CONFIG_SOC_MCPWM_CAPTURE_TIMERS_PER_GROUP=y -CONFIG_SOC_MCPWM_CAPTURE_CHANNELS_PER_TIMER=3 -CONFIG_SOC_MCPWM_GPIO_SYNCHROS_PER_GROUP=3 -CONFIG_SOC_MCPWM_SWSYNC_CAN_PROPAGATE=y -CONFIG_SOC_PCNT_GROUPS=y -CONFIG_SOC_PCNT_UNITS_PER_GROUP=4 -CONFIG_SOC_PCNT_CHANNELS_PER_UNIT=2 -CONFIG_SOC_PCNT_THRES_POINT_PER_UNIT=2 -CONFIG_SOC_RMT_GROUPS=1 -CONFIG_SOC_RMT_TX_CANDIDATES_PER_GROUP=4 -CONFIG_SOC_RMT_RX_CANDIDATES_PER_GROUP=4 -CONFIG_SOC_RMT_CHANNELS_PER_GROUP=8 -CONFIG_SOC_RMT_MEM_WORDS_PER_CHANNEL=48 -CONFIG_SOC_RMT_SUPPORT_RX_PINGPONG=y -CONFIG_SOC_RMT_SUPPORT_RX_DEMODULATION=y -CONFIG_SOC_RMT_SUPPORT_TX_ASYNC_STOP=y -CONFIG_SOC_RMT_SUPPORT_TX_LOOP_COUNT=y -CONFIG_SOC_RMT_SUPPORT_TX_LOOP_AUTO_STOP=y -CONFIG_SOC_RMT_SUPPORT_TX_SYNCHRO=y -CONFIG_SOC_RMT_SUPPORT_TX_CARRIER_DATA_ONLY=y -CONFIG_SOC_RMT_SUPPORT_XTAL=y -CONFIG_SOC_RMT_SUPPORT_RC_FAST=y -CONFIG_SOC_RMT_SUPPORT_APB=y -CONFIG_SOC_RMT_SUPPORT_DMA=y -CONFIG_SOC_LCD_I80_SUPPORTED=y -CONFIG_SOC_LCD_RGB_SUPPORTED=y -CONFIG_SOC_LCD_I80_BUSES=1 -CONFIG_SOC_LCD_RGB_PANELS=1 -CONFIG_SOC_LCD_I80_BUS_WIDTH=16 -CONFIG_SOC_LCD_RGB_DATA_WIDTH=16 -CONFIG_SOC_LCD_SUPPORT_RGB_YUV_CONV=y -CONFIG_SOC_RTC_CNTL_CPU_PD_DMA_BUS_WIDTH=128 -CONFIG_SOC_RTC_CNTL_CPU_PD_REG_FILE_NUM=549 -CONFIG_SOC_RTC_CNTL_TAGMEM_PD_DMA_BUS_WIDTH=128 -CONFIG_SOC_RTCIO_PIN_COUNT=22 -CONFIG_SOC_RTCIO_INPUT_OUTPUT_SUPPORTED=y -CONFIG_SOC_RTCIO_HOLD_SUPPORTED=y -CONFIG_SOC_RTCIO_WAKE_SUPPORTED=y -CONFIG_SOC_SDM_GROUPS=y -CONFIG_SOC_SDM_CHANNELS_PER_GROUP=8 -CONFIG_SOC_SPI_PERIPH_NUM=3 -CONFIG_SOC_SPI_MAX_CS_NUM=6 -CONFIG_SOC_SPI_MAXIMUM_BUFFER_SIZE=64 -CONFIG_SOC_SPI_SUPPORT_DDRCLK=y -CONFIG_SOC_SPI_SLAVE_SUPPORT_SEG_TRANS=y -CONFIG_SOC_SPI_SUPPORT_CD_SIG=y -CONFIG_SOC_SPI_SUPPORT_CONTINUOUS_TRANS=y -CONFIG_SOC_SPI_SUPPORT_SLAVE_HD_VER2=y -CONFIG_SOC_SPI_PERIPH_SUPPORT_CONTROL_DUMMY_OUT=y -CONFIG_SOC_MEMSPI_IS_INDEPENDENT=y -CONFIG_SOC_SPI_MAX_PRE_DIVIDER=16 -CONFIG_SOC_SPI_SUPPORT_OCT=y -CONFIG_SOC_MEMSPI_SRC_FREQ_120M=y -CONFIG_SOC_MEMSPI_SRC_FREQ_80M_SUPPORTED=y -CONFIG_SOC_MEMSPI_SRC_FREQ_40M_SUPPORTED=y -CONFIG_SOC_MEMSPI_SRC_FREQ_20M_SUPPORTED=y -CONFIG_SOC_SPIRAM_SUPPORTED=y -CONFIG_SOC_SYSTIMER_COUNTER_NUM=2 -CONFIG_SOC_SYSTIMER_ALARM_NUM=3 -CONFIG_SOC_SYSTIMER_BIT_WIDTH_LO=32 -CONFIG_SOC_SYSTIMER_BIT_WIDTH_HI=20 -CONFIG_SOC_SYSTIMER_FIXED_DIVIDER=y -CONFIG_SOC_SYSTIMER_INT_LEVEL=y -CONFIG_SOC_SYSTIMER_ALARM_MISS_COMPENSATE=y -CONFIG_SOC_TIMER_GROUPS=2 -CONFIG_SOC_TIMER_GROUP_TIMERS_PER_GROUP=2 -CONFIG_SOC_TIMER_GROUP_COUNTER_BIT_WIDTH=54 -CONFIG_SOC_TIMER_GROUP_SUPPORT_XTAL=y -CONFIG_SOC_TIMER_GROUP_SUPPORT_APB=y -CONFIG_SOC_TIMER_GROUP_TOTAL_TIMERS=4 -CONFIG_SOC_TOUCH_VERSION_2=y -CONFIG_SOC_TOUCH_SENSOR_NUM=15 -CONFIG_SOC_TOUCH_PROXIMITY_CHANNEL_NUM=3 -CONFIG_SOC_TOUCH_PROXIMITY_MEAS_DONE_SUPPORTED=y -CONFIG_SOC_TOUCH_PAD_THRESHOLD_MAX=0x1FFFFF -CONFIG_SOC_TOUCH_PAD_MEASURE_WAIT_MAX=0xFF -CONFIG_SOC_UART_NUM=3 -CONFIG_SOC_UART_FIFO_LEN=128 -CONFIG_SOC_UART_BITRATE_MAX=5000000 -CONFIG_SOC_UART_SUPPORT_FSM_TX_WAIT_SEND=y -CONFIG_SOC_UART_SUPPORT_WAKEUP_INT=y -CONFIG_SOC_UART_SUPPORT_APB_CLK=y -CONFIG_SOC_UART_SUPPORT_RTC_CLK=y -CONFIG_SOC_UART_SUPPORT_XTAL_CLK=y -CONFIG_SOC_UART_REQUIRE_CORE_RESET=y -CONFIG_SOC_USB_PERIPH_NUM=y -CONFIG_SOC_SHA_DMA_MAX_BUFFER_SIZE=3968 -CONFIG_SOC_SHA_SUPPORT_DMA=y -CONFIG_SOC_SHA_SUPPORT_RESUME=y -CONFIG_SOC_SHA_GDMA=y -CONFIG_SOC_SHA_SUPPORT_SHA1=y -CONFIG_SOC_SHA_SUPPORT_SHA224=y -CONFIG_SOC_SHA_SUPPORT_SHA256=y -CONFIG_SOC_SHA_SUPPORT_SHA384=y -CONFIG_SOC_SHA_SUPPORT_SHA512=y -CONFIG_SOC_SHA_SUPPORT_SHA512_224=y -CONFIG_SOC_SHA_SUPPORT_SHA512_256=y -CONFIG_SOC_SHA_SUPPORT_SHA512_T=y -CONFIG_SOC_RSA_MAX_BIT_LEN=4096 -CONFIG_SOC_AES_SUPPORT_DMA=y -CONFIG_SOC_AES_GDMA=y -CONFIG_SOC_AES_SUPPORT_AES_128=y -CONFIG_SOC_AES_SUPPORT_AES_256=y -CONFIG_SOC_PM_SUPPORT_EXT_WAKEUP=y -CONFIG_SOC_PM_SUPPORT_WIFI_WAKEUP=y -CONFIG_SOC_PM_SUPPORT_BT_WAKEUP=y -CONFIG_SOC_PM_SUPPORT_CPU_PD=y -CONFIG_SOC_PM_SUPPORT_TAGMEM_PD=y -CONFIG_SOC_PM_SUPPORT_RTC_PERIPH_PD=y -CONFIG_SOC_PM_SUPPORT_TOUCH_SENSOR_WAKEUP=y -CONFIG_SOC_PM_SUPPORT_DEEPSLEEP_CHECK_STUB_ONLY=y -CONFIG_SOC_SECURE_BOOT_V2_RSA=y -CONFIG_SOC_EFUSE_SECURE_BOOT_KEY_DIGESTS=3 -CONFIG_SOC_EFUSE_REVOKE_BOOT_KEY_DIGESTS=y -CONFIG_SOC_SUPPORT_SECURE_BOOT_REVOKE_KEY=y -CONFIG_SOC_FLASH_ENCRYPTED_XTS_AES_BLOCK_MAX=64 -CONFIG_SOC_FLASH_ENCRYPTION_XTS_AES=y -CONFIG_SOC_FLASH_ENCRYPTION_XTS_AES_OPTIONS=y -CONFIG_SOC_FLASH_ENCRYPTION_XTS_AES_128=y -CONFIG_SOC_FLASH_ENCRYPTION_XTS_AES_256=y -CONFIG_SOC_MEMPROT_CPU_PREFETCH_PAD_SIZE=16 -CONFIG_SOC_MEMPROT_MEM_ALIGN_SIZE=256 -CONFIG_SOC_PHY_DIG_REGS_MEM_SIZE=21 -CONFIG_SOC_MAC_BB_PD_MEM_SIZE=192 -CONFIG_SOC_WIFI_LIGHT_SLEEP_CLK_WIDTH=12 -CONFIG_SOC_SPI_MEM_SUPPORT_AUTO_WAIT_IDLE=y -CONFIG_SOC_SPI_MEM_SUPPORT_AUTO_SUSPEND=y -CONFIG_SOC_SPI_MEM_SUPPORT_AUTO_RESUME=y -CONFIG_SOC_SPI_MEM_SUPPORT_SW_SUSPEND=y -CONFIG_SOC_SPI_MEM_SUPPORT_OPI_MODE=y -CONFIG_SOC_SPI_MEM_SUPPORT_TIME_TUNING=y -CONFIG_SOC_SPI_MEM_SUPPORT_CONFIG_GPIO_BY_EFUSE=y -CONFIG_SOC_COEX_HW_PTI=y -CONFIG_SOC_SDMMC_USE_GPIO_MATRIX=y -CONFIG_SOC_SDMMC_NUM_SLOTS=2 -CONFIG_SOC_SDMMC_SUPPORT_XTAL_CLOCK=y -CONFIG_SOC_TEMPERATURE_SENSOR_SUPPORT_FAST_RC=y -CONFIG_SOC_WIFI_HW_TSF=y -CONFIG_SOC_WIFI_FTM_SUPPORT=y -CONFIG_SOC_WIFI_GCMP_SUPPORT=y -CONFIG_SOC_WIFI_WAPI_SUPPORT=y -CONFIG_SOC_WIFI_CSI_SUPPORT=y -CONFIG_SOC_WIFI_MESH_SUPPORT=y -CONFIG_SOC_BLE_SUPPORTED=y -CONFIG_SOC_BLE_MESH_SUPPORTED=y -CONFIG_SOC_TWAI_BRP_MIN=2 -CONFIG_SOC_TWAI_BRP_MAX=16384 -CONFIG_SOC_TWAI_SUPPORTS_RX_STATUS=y CONFIG_IDF_CMAKE=y CONFIG_IDF_TARGET_ARCH_XTENSA=y -CONFIG_IDF_TARGET_ARCH="xtensa" CONFIG_IDF_TARGET="esp32s3" CONFIG_IDF_TARGET_ESP32S3=y CONFIG_IDF_FIRMWARE_CHIP_ID=0x0009 +# +# SDK tool configuration +# +CONFIG_SDK_TOOLPREFIX="xtensa-esp32s3-elf-" +# CONFIG_SDK_TOOLCHAIN_SUPPORTS_TIME_WIDE_64_BITS is not set +# end of SDK tool configuration + # # Build type # @@ -281,10 +23,18 @@ CONFIG_APP_BUILD_TYPE_APP_2NDBOOT=y CONFIG_APP_BUILD_GENERATE_BINARIES=y CONFIG_APP_BUILD_BOOTLOADER=y CONFIG_APP_BUILD_USE_FLASH_SECTIONS=y -# CONFIG_APP_REPRODUCIBLE_BUILD is not set -# CONFIG_APP_NO_BLOBS is not set # end of Build type +# +# Application manager +# +CONFIG_APP_COMPILE_TIME_DATE=y +# CONFIG_APP_EXCLUDE_PROJECT_VER_VAR is not set +# CONFIG_APP_EXCLUDE_PROJECT_NAME_VAR is not set +# CONFIG_APP_PROJECT_VER_FROM_CONFIG is not set +CONFIG_APP_RETRIEVE_LEN_ELF_SHA=16 +# end of Application manager + # # Bootloader config # @@ -319,37 +69,13 @@ CONFIG_BOOTLOADER_FLASH_XMC_SUPPORT=y # # Security features # -CONFIG_SECURE_BOOT_V2_RSA_SUPPORTED=y -CONFIG_SECURE_BOOT_V2_PREFERRED=y +CONFIG_SECURE_BOOT_SUPPORTS_RSA=y +CONFIG_SECURE_TARGET_HAS_SECURE_ROM_DL_MODE=y # CONFIG_SECURE_SIGNED_APPS_NO_SECURE_BOOT is not set # CONFIG_SECURE_BOOT is not set # CONFIG_SECURE_FLASH_ENC_ENABLED is not set -CONFIG_SECURE_ROM_DL_MODE_ENABLED=y # end of Security features -# -# Application manager -# -CONFIG_APP_COMPILE_TIME_DATE=y -# CONFIG_APP_EXCLUDE_PROJECT_VER_VAR is not set -# CONFIG_APP_EXCLUDE_PROJECT_NAME_VAR is not set -# CONFIG_APP_PROJECT_VER_FROM_CONFIG is not set -CONFIG_APP_RETRIEVE_LEN_ELF_SHA=16 -# end of Application manager - -CONFIG_ESP_ROM_HAS_CRC_LE=y -CONFIG_ESP_ROM_HAS_CRC_BE=y -CONFIG_ESP_ROM_HAS_MZ_CRC32=y -CONFIG_ESP_ROM_HAS_JPEG_DECODE=y -CONFIG_ESP_ROM_UART_CLK_IS_XTAL=y -CONFIG_ESP_ROM_HAS_RETARGETABLE_LOCKING=y -CONFIG_ESP_ROM_USB_SERIAL_DEVICE_NUM=4 -CONFIG_ESP_ROM_HAS_ERASE_0_REGION_BUG=y -CONFIG_ESP_ROM_GET_CLK_FREQ=y -CONFIG_ESP_ROM_HAS_HAL_WDT=y -CONFIG_ESP_ROM_NEEDS_SWSETUP_WORKAROUND=y -CONFIG_ESP_ROM_HAS_ETS_PRINTF_BUG=y - # # Boot ROM Behavior # @@ -362,6 +88,7 @@ CONFIG_BOOT_ROM_LOG_ALWAYS_ON=y # # Serial flasher config # +CONFIG_ESPTOOLPY_BAUD_OTHER_VAL=115200 # CONFIG_ESPTOOLPY_NO_STUB is not set # CONFIG_ESPTOOLPY_OCT_FLASH is not set # CONFIG_ESPTOOLPY_FLASHMODE_QIO is not set @@ -384,13 +111,22 @@ CONFIG_ESPTOOLPY_FLASHSIZE_2MB=y # CONFIG_ESPTOOLPY_FLASHSIZE_64MB is not set # CONFIG_ESPTOOLPY_FLASHSIZE_128MB is not set CONFIG_ESPTOOLPY_FLASHSIZE="2MB" -# CONFIG_ESPTOOLPY_HEADER_FLASHSIZE_UPDATE is not set +CONFIG_ESPTOOLPY_FLASHSIZE_DETECT=y CONFIG_ESPTOOLPY_BEFORE_RESET=y # CONFIG_ESPTOOLPY_BEFORE_NORESET is not set CONFIG_ESPTOOLPY_BEFORE="default_reset" CONFIG_ESPTOOLPY_AFTER_RESET=y # CONFIG_ESPTOOLPY_AFTER_NORESET is not set CONFIG_ESPTOOLPY_AFTER="hard_reset" +# CONFIG_ESPTOOLPY_MONITOR_BAUD_CONSOLE is not set +# CONFIG_ESPTOOLPY_MONITOR_BAUD_9600B is not set +# CONFIG_ESPTOOLPY_MONITOR_BAUD_57600B is not set +CONFIG_ESPTOOLPY_MONITOR_BAUD_115200B=y +# CONFIG_ESPTOOLPY_MONITOR_BAUD_230400B is not set +# CONFIG_ESPTOOLPY_MONITOR_BAUD_921600B is not set +# CONFIG_ESPTOOLPY_MONITOR_BAUD_2MB is not set +# CONFIG_ESPTOOLPY_MONITOR_BAUD_OTHER is not set +CONFIG_ESPTOOLPY_MONITOR_BAUD_OTHER_VAL=115200 CONFIG_ESPTOOLPY_MONITOR_BAUD=115200 # end of Serial flasher config @@ -407,6 +143,18 @@ CONFIG_PARTITION_TABLE_OFFSET=0x8000 CONFIG_PARTITION_TABLE_MD5=y # end of Partition Table +# +# FabReader Configuration +# +CONFIG_WIFI_SSID="Olympia" +CONFIG_WIFI_PASSWORD="YgPg6ggqVTNzoqMw5SCQ" +CONFIG_WIFI_FAST_SCAN=y +# CONFIG_WIFI_ALL_CHANNEL_SCAN is not set +CONFIG_BROKER_URI="mqtts://mqtt.eclipseprojects.io:8883" +CONFIG_BROKER_CERTIFICATE_OVERRIDE="" +CONFIG_FABREADER2_ID=00002 +# end of FabReader Configuration + # # Compiler options # @@ -417,7 +165,6 @@ CONFIG_COMPILER_OPTIMIZATION_DEFAULT=y CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_ENABLE=y # CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT is not set # CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE is not set -CONFIG_COMPILER_FLOAT_LIB_FROM_GCCLIB=y CONFIG_COMPILER_OPTIMIZATION_ASSERTION_LEVEL=2 # CONFIG_COMPILER_OPTIMIZATION_CHECKS_SILENT is not set CONFIG_COMPILER_HIDE_PATHS_MACROS=y @@ -428,6 +175,7 @@ CONFIG_COMPILER_STACK_CHECK_MODE_NONE=y # CONFIG_COMPILER_STACK_CHECK_MODE_STRONG is not set # CONFIG_COMPILER_STACK_CHECK_MODE_ALL is not set # CONFIG_COMPILER_WARN_WRITE_STRINGS is not set +# CONFIG_COMPILER_DISABLE_GCC8_WARNINGS is not set # CONFIG_COMPILER_DUMP_RTL_FILES is not set # end of Compiler options @@ -440,14 +188,15 @@ CONFIG_COMPILER_STACK_CHECK_MODE_NONE=y # # CONFIG_APPTRACE_DEST_JTAG is not set CONFIG_APPTRACE_DEST_NONE=y -# CONFIG_APPTRACE_DEST_UART1 is not set -# CONFIG_APPTRACE_DEST_UART2 is not set -# CONFIG_APPTRACE_DEST_USB_CDC is not set -CONFIG_APPTRACE_DEST_UART_NONE=y -CONFIG_APPTRACE_UART_TASK_PRIO=1 CONFIG_APPTRACE_LOCK_ENABLE=y # end of Application Level Tracing +# +# ESP-ASIO +# +# CONFIG_ASIO_SSL_SUPPORT is not set +# end of ESP-ASIO + # # Bluetooth # @@ -455,106 +204,59 @@ CONFIG_APPTRACE_LOCK_ENABLE=y # end of Bluetooth # -# Driver Configurations +# CoAP Configuration +# +CONFIG_COAP_MBEDTLS_PSK=y +# CONFIG_COAP_MBEDTLS_PKI is not set +# CONFIG_COAP_MBEDTLS_DEBUG is not set +CONFIG_COAP_LOG_DEFAULT_LEVEL=0 +# end of CoAP Configuration + +# +# Driver configurations # # -# Legacy ADC Configuration +# ADC configuration # -# CONFIG_ADC_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_ADC_FORCE_XPD_FSM is not set +CONFIG_ADC_DISABLE_DAC=y +# end of ADC configuration # -# Legacy ADC Calibration Configuration +# MCPWM configuration # -# CONFIG_ADC_CALI_SUPPRESS_DEPRECATE_WARN is not set -# end of Legacy ADC Calibration Configuration -# end of Legacy ADC Configuration +# CONFIG_MCPWM_ISR_IN_IRAM is not set +# end of MCPWM configuration # -# SPI Configuration +# SPI configuration # # CONFIG_SPI_MASTER_IN_IRAM is not set CONFIG_SPI_MASTER_ISR_IN_IRAM=y # CONFIG_SPI_SLAVE_IN_IRAM is not set CONFIG_SPI_SLAVE_ISR_IN_IRAM=y -# end of SPI Configuration +# end of SPI configuration # -# TWAI Configuration +# TWAI configuration # # CONFIG_TWAI_ISR_IN_IRAM is not set -# end of TWAI Configuration +# end of TWAI configuration # -# Temperature sensor Configuration -# -# CONFIG_TEMP_SENSOR_SUPPRESS_DEPRECATE_WARN is not set -# CONFIG_TEMP_SENSOR_ENABLE_DEBUG_LOG is not set -# end of Temperature sensor Configuration - -# -# UART Configuration +# UART configuration # # CONFIG_UART_ISR_IN_IRAM is not set -# end of UART Configuration +# end of UART configuration # -# GPIO Configuration +# GDMA Configuration # -# CONFIG_GPIO_CTRL_FUNC_IN_IRAM is not set -# end of GPIO Configuration - -# -# Sigma Delta Modulator Configuration -# -# CONFIG_SDM_CTRL_FUNC_IN_IRAM is not set -# CONFIG_SDM_SUPPRESS_DEPRECATE_WARN is not set -# CONFIG_SDM_ENABLE_DEBUG_LOG is not set -# end of Sigma Delta Modulator Configuration - -# -# GPTimer Configuration -# -# CONFIG_GPTIMER_CTRL_FUNC_IN_IRAM is not set -# CONFIG_GPTIMER_ISR_IRAM_SAFE is not set -# CONFIG_GPTIMER_SUPPRESS_DEPRECATE_WARN is not set -# CONFIG_GPTIMER_ENABLE_DEBUG_LOG is not set -# end of GPTimer Configuration - -# -# PCNT Configuration -# -# CONFIG_PCNT_CTRL_FUNC_IN_IRAM is not set -# CONFIG_PCNT_ISR_IRAM_SAFE is not set -# CONFIG_PCNT_SUPPRESS_DEPRECATE_WARN is not set -# CONFIG_PCNT_ENABLE_DEBUG_LOG is not set -# end of PCNT Configuration - -# -# RMT Configuration -# -# CONFIG_RMT_ISR_IRAM_SAFE is not set -# CONFIG_RMT_SUPPRESS_DEPRECATE_WARN is not set -# CONFIG_RMT_ENABLE_DEBUG_LOG is not set -# end of RMT Configuration - -# -# MCPWM Configuration -# -# CONFIG_MCPWM_ISR_IRAM_SAFE is not set -# CONFIG_MCPWM_CTRL_FUNC_IN_IRAM is not set -# CONFIG_MCPWM_SUPPRESS_DEPRECATE_WARN is not set -# CONFIG_MCPWM_ENABLE_DEBUG_LOG is not set -# end of MCPWM Configuration - -# -# I2S Configuration -# -# CONFIG_I2S_ISR_IRAM_SAFE is not set -# CONFIG_I2S_SUPPRESS_DEPRECATE_WARN is not set -# CONFIG_I2S_ENABLE_DEBUG_LOG is not set -# end of I2S Configuration -# end of Driver Configurations +# CONFIG_GDMA_CTRL_FUNC_IN_IRAM is not set +# CONFIG_GDMA_ISR_IRAM_SAFE is not set +# end of GDMA Configuration +# end of Driver configurations # # eFuse Bit Manager @@ -576,12 +278,74 @@ CONFIG_ESP_TLS_USE_DS_PERIPHERAL=y # end of ESP-TLS # -# ADC and ADC Calibration +# ESP32S3-Specific # -# CONFIG_ADC_ONESHOT_CTRL_FUNC_IN_IRAM is not set -# CONFIG_ADC_CONTINUOUS_ISR_IRAM_SAFE is not set -# CONFIG_ADC_CONTINUOUS_FORCE_USE_ADC2_ON_C3_S3 is not set -# end of ADC and ADC Calibration +# CONFIG_ESP32S3_DEFAULT_CPU_FREQ_80 is not set +CONFIG_ESP32S3_DEFAULT_CPU_FREQ_160=y +# CONFIG_ESP32S3_DEFAULT_CPU_FREQ_240 is not set +CONFIG_ESP32S3_DEFAULT_CPU_FREQ_MHZ=160 + +# +# Cache config +# +CONFIG_ESP32S3_INSTRUCTION_CACHE_16KB=y +# CONFIG_ESP32S3_INSTRUCTION_CACHE_32KB is not set +CONFIG_ESP32S3_INSTRUCTION_CACHE_SIZE=0x4000 +# CONFIG_ESP32S3_INSTRUCTION_CACHE_4WAYS is not set +CONFIG_ESP32S3_INSTRUCTION_CACHE_8WAYS=y +CONFIG_ESP32S3_ICACHE_ASSOCIATED_WAYS=8 +# CONFIG_ESP32S3_INSTRUCTION_CACHE_LINE_16B is not set +CONFIG_ESP32S3_INSTRUCTION_CACHE_LINE_32B=y +CONFIG_ESP32S3_INSTRUCTION_CACHE_LINE_SIZE=32 +# CONFIG_ESP32S3_INSTRUCTION_CACHE_WRAP is not set +# CONFIG_ESP32S3_DATA_CACHE_16KB is not set +CONFIG_ESP32S3_DATA_CACHE_32KB=y +# CONFIG_ESP32S3_DATA_CACHE_64KB is not set +CONFIG_ESP32S3_DATA_CACHE_SIZE=0x8000 +# CONFIG_ESP32S3_DATA_CACHE_4WAYS is not set +CONFIG_ESP32S3_DATA_CACHE_8WAYS=y +CONFIG_ESP32S3_DCACHE_ASSOCIATED_WAYS=8 +# CONFIG_ESP32S3_DATA_CACHE_LINE_16B is not set +CONFIG_ESP32S3_DATA_CACHE_LINE_32B=y +# CONFIG_ESP32S3_DATA_CACHE_LINE_64B is not set +CONFIG_ESP32S3_DATA_CACHE_LINE_SIZE=32 +# CONFIG_ESP32S3_DATA_CACHE_WRAP is not set +# end of Cache config + +# CONFIG_ESP32S3_SPIRAM_SUPPORT is not set +# CONFIG_ESP32S3_TRAX is not set +CONFIG_ESP32S3_TRACEMEM_RESERVE_DRAM=0x0 +# CONFIG_ESP32S3_ULP_COPROC_ENABLED is not set +CONFIG_ESP32S3_ULP_COPROC_RESERVE_MEM=0 +CONFIG_ESP32S3_DEBUG_OCDAWARE=y +CONFIG_ESP32S3_BROWNOUT_DET=y +CONFIG_ESP32S3_BROWNOUT_DET_LVL_SEL_7=y +# CONFIG_ESP32S3_BROWNOUT_DET_LVL_SEL_6 is not set +# CONFIG_ESP32S3_BROWNOUT_DET_LVL_SEL_5 is not set +# CONFIG_ESP32S3_BROWNOUT_DET_LVL_SEL_4 is not set +# CONFIG_ESP32S3_BROWNOUT_DET_LVL_SEL_3 is not set +# CONFIG_ESP32S3_BROWNOUT_DET_LVL_SEL_2 is not set +# CONFIG_ESP32S3_BROWNOUT_DET_LVL_SEL_1 is not set +CONFIG_ESP32S3_BROWNOUT_DET_LVL=7 +CONFIG_ESP32S3_TIME_SYSCALL_USE_RTC_FRC1=y +# CONFIG_ESP32S3_TIME_SYSCALL_USE_RTC is not set +# CONFIG_ESP32S3_TIME_SYSCALL_USE_FRC1 is not set +# CONFIG_ESP32S3_TIME_SYSCALL_USE_NONE is not set +CONFIG_ESP32S3_RTC_CLK_SRC_INT_RC=y +# CONFIG_ESP32S3_RTC_CLK_SRC_EXT_CRYS is not set +# CONFIG_ESP32S3_RTC_CLK_SRC_EXT_OSC is not set +# CONFIG_ESP32S3_RTC_CLK_SRC_INT_8MD256 is not set +CONFIG_ESP32S3_RTC_CLK_CAL_CYCLES=1024 +CONFIG_ESP32S3_DEEP_SLEEP_WAKEUP_DELAY=2000 +# CONFIG_ESP32S3_NO_BLOBS is not set +# CONFIG_ESP32S3_RTCDATA_IN_FAST_MEM is not set +# CONFIG_ESP32S3_USE_FIXED_STATIC_RAM_SIZE is not set +# end of ESP32S3-Specific + +# +# ADC-Calibration +# +# end of ADC-Calibration # # Common ESP-related @@ -598,7 +362,6 @@ CONFIG_ETH_USE_SPI_ETHERNET=y # CONFIG_ETH_SPI_ETHERNET_W5500 is not set # CONFIG_ETH_SPI_ETHERNET_KSZ8851SNL is not set # CONFIG_ETH_USE_OPENETH is not set -# CONFIG_ETH_TRANSMIT_MUTEX is not set # end of Ethernet # @@ -631,14 +394,12 @@ CONFIG_HTTPD_ERR_RESP_NO_DELAY=y CONFIG_HTTPD_PURGE_BUF_LEN=32 # CONFIG_HTTPD_LOG_PURGE_DATA is not set # CONFIG_HTTPD_WS_SUPPORT is not set -# CONFIG_HTTPD_QUEUE_WORK_BLOCKING is not set # end of HTTP Server # # ESP HTTPS OTA # -# CONFIG_ESP_HTTPS_OTA_DECRYPT_CB is not set -# CONFIG_ESP_HTTPS_OTA_ALLOW_HTTP is not set +# CONFIG_OTA_ALLOW_HTTP is not set # end of ESP HTTPS OTA # @@ -671,64 +432,32 @@ CONFIG_ESP_SLEEP_RTC_BUS_ISO_WORKAROUND=y CONFIG_ESP_SLEEP_GPIO_RESET_WORKAROUND=y CONFIG_ESP_SLEEP_FLASH_LEAKAGE_WORKAROUND=y CONFIG_ESP_SLEEP_MSPI_NEED_ALL_IO_PU=y -CONFIG_ESP_SLEEP_DEEP_SLEEP_WAKEUP_DELAY=2000 # end of Sleep Config # # RTC Clock Config # -CONFIG_RTC_CLK_SRC_INT_RC=y -# CONFIG_RTC_CLK_SRC_EXT_CRYS is not set -# CONFIG_RTC_CLK_SRC_EXT_OSC is not set -# CONFIG_RTC_CLK_SRC_INT_8MD256 is not set -CONFIG_RTC_CLK_CAL_CYCLES=1024 CONFIG_RTC_CLOCK_BBPLL_POWER_ON_WITH_USB=y # end of RTC Clock Config - -# -# Peripheral Control -# -# CONFIG_PERIPH_CTRL_FUNC_IN_IRAM is not set -# end of Peripheral Control - -# -# MMU Config -# -CONFIG_MMU_PAGE_SIZE_64KB=y -CONFIG_MMU_PAGE_MODE="64KB" -CONFIG_MMU_PAGE_SIZE=0x10000 -# end of MMU Config - -# -# GDMA Configuration -# -# CONFIG_GDMA_CTRL_FUNC_IN_IRAM is not set -# CONFIG_GDMA_ISR_IRAM_SAFE is not set -# end of GDMA Configuration - -# -# Main XTAL Config -# -CONFIG_XTAL_FREQ_40=y -CONFIG_XTAL_FREQ=40 -# end of Main XTAL Config # end of Hardware Settings +# +# IPC (Inter-Processor Call) +# +CONFIG_ESP_IPC_TASK_STACK_SIZE=1536 +CONFIG_ESP_IPC_USES_CALLERS_PRIORITY=y +CONFIG_ESP_IPC_ISR_ENABLE=y +# end of IPC (Inter-Processor Call) + # # LCD and Touch Panel # -# -# LCD Touch Drivers are maintained in the IDF Component Registry -# - # # LCD Peripheral Configuration # CONFIG_LCD_PANEL_IO_FORMAT_BUF_SIZE=32 -# CONFIG_LCD_ENABLE_DEBUG_LOG is not set # CONFIG_LCD_RGB_ISR_IRAM_SAFE is not set -# CONFIG_LCD_RGB_RESTART_IN_VSYNC is not set # end of LCD Peripheral Configuration # end of LCD and Touch Panel @@ -738,8 +467,7 @@ CONFIG_LCD_PANEL_IO_FORMAT_BUF_SIZE=32 CONFIG_ESP_NETIF_IP_LOST_TIMER_INTERVAL=120 CONFIG_ESP_NETIF_TCPIP_LWIP=y # CONFIG_ESP_NETIF_LOOPBACK is not set -# CONFIG_ESP_NETIF_L2_TAP is not set -# CONFIG_ESP_NETIF_BRIDGE_EN is not set +CONFIG_ESP_NETIF_TCPIP_ADAPTER_COMPATIBLE_LAYER=y # end of ESP NETIF Adapter # @@ -749,7 +477,6 @@ CONFIG_ESP_PHY_CALIBRATION_AND_DATA_STORAGE=y # CONFIG_ESP_PHY_INIT_DATA_IN_PARTITION is not set CONFIG_ESP_PHY_MAX_WIFI_TX_POWER=20 CONFIG_ESP_PHY_MAX_TX_POWER=20 -CONFIG_ESP_PHY_REDUCE_TX_POWER=y CONFIG_ESP_PHY_ENABLE_USB=y # end of PHY @@ -761,12 +488,6 @@ CONFIG_PM_POWER_DOWN_CPU_IN_LIGHT_SLEEP=y CONFIG_PM_POWER_DOWN_TAGMEM_IN_LIGHT_SLEEP=y # end of Power Management -# -# ESP PSRAM -# -# CONFIG_SPIRAM is not set -# end of ESP PSRAM - # # ESP Ringbuf # @@ -777,50 +498,6 @@ CONFIG_PM_POWER_DOWN_TAGMEM_IN_LIGHT_SLEEP=y # # ESP System Settings # -# CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_80 is not set -CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_160=y -# CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_240 is not set -CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ=160 - -# -# Cache config -# -CONFIG_ESP32S3_INSTRUCTION_CACHE_16KB=y -# CONFIG_ESP32S3_INSTRUCTION_CACHE_32KB is not set -CONFIG_ESP32S3_INSTRUCTION_CACHE_SIZE=0x4000 -# CONFIG_ESP32S3_INSTRUCTION_CACHE_4WAYS is not set -CONFIG_ESP32S3_INSTRUCTION_CACHE_8WAYS=y -CONFIG_ESP32S3_ICACHE_ASSOCIATED_WAYS=8 -# CONFIG_ESP32S3_INSTRUCTION_CACHE_LINE_16B is not set -CONFIG_ESP32S3_INSTRUCTION_CACHE_LINE_32B=y -CONFIG_ESP32S3_INSTRUCTION_CACHE_LINE_SIZE=32 -# CONFIG_ESP32S3_DATA_CACHE_16KB is not set -CONFIG_ESP32S3_DATA_CACHE_32KB=y -# CONFIG_ESP32S3_DATA_CACHE_64KB is not set -CONFIG_ESP32S3_DATA_CACHE_SIZE=0x8000 -# CONFIG_ESP32S3_DATA_CACHE_4WAYS is not set -CONFIG_ESP32S3_DATA_CACHE_8WAYS=y -CONFIG_ESP32S3_DCACHE_ASSOCIATED_WAYS=8 -# CONFIG_ESP32S3_DATA_CACHE_LINE_16B is not set -CONFIG_ESP32S3_DATA_CACHE_LINE_32B=y -# CONFIG_ESP32S3_DATA_CACHE_LINE_64B is not set -CONFIG_ESP32S3_DATA_CACHE_LINE_SIZE=32 -# end of Cache config - -# -# Memory -# -# CONFIG_ESP32S3_RTCDATA_IN_FAST_MEM is not set -# CONFIG_ESP32S3_USE_FIXED_STATIC_RAM_SIZE is not set -# end of Memory - -# -# Trace memory -# -# CONFIG_ESP32S3_TRAX is not set -CONFIG_ESP32S3_TRACEMEM_RESERVE_DRAM=0x0 -# end of Trace memory - # CONFIG_ESP_SYSTEM_PANIC_PRINT_HALT is not set CONFIG_ESP_SYSTEM_PANIC_PRINT_REBOOT=y # CONFIG_ESP_SYSTEM_PANIC_SILENT_REBOOT is not set @@ -832,8 +509,6 @@ CONFIG_ESP_SYSTEM_ALLOW_RTC_FAST_MEM_AS_HEAP=y # # Memory protection # -CONFIG_ESP_SYSTEM_MEMPROT_FEATURE=y -CONFIG_ESP_SYSTEM_MEMPROT_FEATURE_LOCK=y # end of Memory protection CONFIG_ESP_SYSTEM_EVENT_QUEUE_SIZE=32 @@ -858,42 +533,16 @@ CONFIG_ESP_CONSOLE_UART_BAUDRATE=115200 CONFIG_ESP_INT_WDT=y CONFIG_ESP_INT_WDT_TIMEOUT_MS=300 CONFIG_ESP_INT_WDT_CHECK_CPU1=y -CONFIG_ESP_TASK_WDT_EN=y -CONFIG_ESP_TASK_WDT_INIT=y +CONFIG_ESP_TASK_WDT=y # CONFIG_ESP_TASK_WDT_PANIC is not set CONFIG_ESP_TASK_WDT_TIMEOUT_S=5 CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU0=y CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU1=y # CONFIG_ESP_PANIC_HANDLER_IRAM is not set # CONFIG_ESP_DEBUG_STUBS_ENABLE is not set -CONFIG_ESP_DEBUG_OCDAWARE=y CONFIG_ESP_SYSTEM_CHECK_INT_LEVEL_4=y - -# -# Brownout Detector -# -CONFIG_ESP_BROWNOUT_DET=y -CONFIG_ESP_BROWNOUT_DET_LVL_SEL_7=y -# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_6 is not set -# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_5 is not set -# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_4 is not set -# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_3 is not set -# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_2 is not set -# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_1 is not set -CONFIG_ESP_BROWNOUT_DET_LVL=7 -# end of Brownout Detector - -CONFIG_ESP_SYSTEM_BROWNOUT_INTR=y # end of ESP System Settings -# -# IPC (Inter-Processor Call) -# -CONFIG_ESP_IPC_TASK_STACK_SIZE=1536 -CONFIG_ESP_IPC_USES_CALLERS_PRIORITY=y -CONFIG_ESP_IPC_ISR_ENABLE=y -# end of IPC (Inter-Processor Call) - # # High resolution timer (esp_timer) # @@ -929,11 +578,9 @@ CONFIG_ESP32_WIFI_MGMT_SBUF_NUM=32 CONFIG_ESP32_WIFI_IRAM_OPT=y CONFIG_ESP32_WIFI_RX_IRAM_OPT=y CONFIG_ESP32_WIFI_ENABLE_WPA3_SAE=y -CONFIG_ESP32_WIFI_ENABLE_WPA3_OWE_STA=y # CONFIG_ESP_WIFI_SLP_IRAM_OPT is not set # CONFIG_ESP_WIFI_FTM_ENABLE is not set # CONFIG_ESP_WIFI_STA_DISCONNECTED_PM_ENABLE is not set -# CONFIG_ESP_WIFI_EXTERNAL_COEXIST_ENABLE is not set # CONFIG_ESP_WIFI_GCMP_SUPPORT is not set # CONFIG_ESP_WIFI_GMAC_SUPPORT is not set CONFIG_ESP_WIFI_SOFTAP_SUPPORT=y @@ -952,19 +599,6 @@ CONFIG_ESP_COREDUMP_ENABLE_TO_NONE=y # # FAT Filesystem support # -CONFIG_FATFS_VOLUME_COUNT=2 -# CONFIG_FATFS_SECTOR_512 is not set -# CONFIG_FATFS_SECTOR_1024 is not set -# CONFIG_FATFS_SECTOR_2048 is not set -CONFIG_FATFS_SECTOR_4096=y -CONFIG_FATFS_SECTORS_PER_CLUSTER_1=y -# CONFIG_FATFS_SECTORS_PER_CLUSTER_2 is not set -# CONFIG_FATFS_SECTORS_PER_CLUSTER_4 is not set -# CONFIG_FATFS_SECTORS_PER_CLUSTER_8 is not set -# CONFIG_FATFS_SECTORS_PER_CLUSTER_16 is not set -# CONFIG_FATFS_SECTORS_PER_CLUSTER_32 is not set -# CONFIG_FATFS_SECTORS_PER_CLUSTER_64 is not set -# CONFIG_FATFS_SECTORS_PER_CLUSTER_128 is not set # CONFIG_FATFS_CODEPAGE_DYNAMIC is not set CONFIG_FATFS_CODEPAGE_437=y # CONFIG_FATFS_CODEPAGE_720 is not set @@ -987,9 +621,6 @@ CONFIG_FATFS_CODEPAGE_437=y # CONFIG_FATFS_CODEPAGE_936 is not set # CONFIG_FATFS_CODEPAGE_949 is not set # CONFIG_FATFS_CODEPAGE_950 is not set -CONFIG_FATFS_AUTO_TYPE=y -# CONFIG_FATFS_FAT12 is not set -# CONFIG_FATFS_FAT16 is not set CONFIG_FATFS_CODEPAGE=437 CONFIG_FATFS_LFN_NONE=y # CONFIG_FATFS_LFN_HEAP is not set @@ -1001,55 +632,75 @@ CONFIG_FATFS_PER_FILE_CACHE=y # end of FAT Filesystem support # -# FreeRTOS +# Modbus configuration # +CONFIG_FMB_COMM_MODE_TCP_EN=y +CONFIG_FMB_TCP_PORT_DEFAULT=502 +CONFIG_FMB_TCP_PORT_MAX_CONN=5 +CONFIG_FMB_TCP_CONNECTION_TOUT_SEC=20 +CONFIG_FMB_COMM_MODE_RTU_EN=y +CONFIG_FMB_COMM_MODE_ASCII_EN=y +CONFIG_FMB_MASTER_TIMEOUT_MS_RESPOND=150 +CONFIG_FMB_MASTER_DELAY_MS_CONVERT=200 +CONFIG_FMB_QUEUE_LENGTH=20 +CONFIG_FMB_PORT_TASK_STACK_SIZE=4096 +CONFIG_FMB_SERIAL_BUF_SIZE=256 +CONFIG_FMB_SERIAL_ASCII_BITS_PER_SYMB=8 +CONFIG_FMB_SERIAL_ASCII_TIMEOUT_RESPOND_MS=1000 +CONFIG_FMB_PORT_TASK_PRIO=10 +# CONFIG_FMB_PORT_TASK_AFFINITY_NO_AFFINITY is not set +CONFIG_FMB_PORT_TASK_AFFINITY_CPU0=y +# CONFIG_FMB_PORT_TASK_AFFINITY_CPU1 is not set +CONFIG_FMB_PORT_TASK_AFFINITY=0x0 +CONFIG_FMB_CONTROLLER_SLAVE_ID_SUPPORT=y +CONFIG_FMB_CONTROLLER_SLAVE_ID=0x00112233 +CONFIG_FMB_CONTROLLER_NOTIFY_TIMEOUT=20 +CONFIG_FMB_CONTROLLER_NOTIFY_QUEUE_SIZE=20 +CONFIG_FMB_CONTROLLER_STACK_SIZE=4096 +CONFIG_FMB_EVENT_QUEUE_TIMEOUT=20 +# CONFIG_FMB_TIMER_PORT_ENABLED is not set +# CONFIG_FMB_TIMER_USE_ISR_DISPATCH_METHOD is not set +# end of Modbus configuration # -# Kernel +# FreeRTOS # -# CONFIG_FREERTOS_SMP is not set # CONFIG_FREERTOS_UNICORE is not set -CONFIG_FREERTOS_HZ=1000 +CONFIG_FREERTOS_NO_AFFINITY=0x7FFFFFFF +CONFIG_FREERTOS_TICK_SUPPORT_SYSTIMER=y +CONFIG_FREERTOS_CORETIMER_SYSTIMER_LVL1=y +# CONFIG_FREERTOS_CORETIMER_SYSTIMER_LVL3 is not set +CONFIG_FREERTOS_SYSTICK_USES_SYSTIMER=y +CONFIG_FREERTOS_HZ=100 +CONFIG_FREERTOS_ASSERT_ON_UNTESTED_FUNCTION=y # CONFIG_FREERTOS_CHECK_STACKOVERFLOW_NONE is not set # CONFIG_FREERTOS_CHECK_STACKOVERFLOW_PTRVAL is not set CONFIG_FREERTOS_CHECK_STACKOVERFLOW_CANARY=y +# CONFIG_FREERTOS_WATCHPOINT_END_OF_STACK is not set +CONFIG_FREERTOS_INTERRUPT_BACKTRACE=y CONFIG_FREERTOS_THREAD_LOCAL_STORAGE_POINTERS=1 +CONFIG_FREERTOS_ASSERT_FAIL_ABORT=y +# CONFIG_FREERTOS_ASSERT_FAIL_PRINT_CONTINUE is not set +# CONFIG_FREERTOS_ASSERT_DISABLE is not set CONFIG_FREERTOS_IDLE_TASK_STACKSIZE=1536 -# CONFIG_FREERTOS_USE_IDLE_HOOK is not set -# CONFIG_FREERTOS_USE_TICK_HOOK is not set +CONFIG_FREERTOS_ISR_STACKSIZE=1536 +# CONFIG_FREERTOS_LEGACY_HOOKS is not set CONFIG_FREERTOS_MAX_TASK_NAME_LEN=16 -# CONFIG_FREERTOS_ENABLE_BACKWARD_COMPATIBILITY is not set +CONFIG_FREERTOS_SUPPORT_STATIC_ALLOCATION=y +# CONFIG_FREERTOS_ENABLE_STATIC_TASK_CLEAN_UP is not set CONFIG_FREERTOS_TIMER_TASK_PRIORITY=1 CONFIG_FREERTOS_TIMER_TASK_STACK_DEPTH=2048 CONFIG_FREERTOS_TIMER_QUEUE_LENGTH=10 CONFIG_FREERTOS_QUEUE_REGISTRY_SIZE=0 # CONFIG_FREERTOS_USE_TRACE_FACILITY is not set # CONFIG_FREERTOS_GENERATE_RUN_TIME_STATS is not set -# end of Kernel - -# -# Port -# CONFIG_FREERTOS_TASK_FUNCTION_WRAPPER=y -# CONFIG_FREERTOS_WATCHPOINT_END_OF_STACK is not set -# CONFIG_FREERTOS_ENABLE_STATIC_TASK_CLEAN_UP is not set CONFIG_FREERTOS_CHECK_MUTEX_GIVEN_BY_OWNER=y -CONFIG_FREERTOS_ISR_STACKSIZE=1536 -CONFIG_FREERTOS_INTERRUPT_BACKTRACE=y -CONFIG_FREERTOS_TICK_SUPPORT_SYSTIMER=y -CONFIG_FREERTOS_CORETIMER_SYSTIMER_LVL1=y -# CONFIG_FREERTOS_CORETIMER_SYSTIMER_LVL3 is not set -CONFIG_FREERTOS_SYSTICK_USES_SYSTIMER=y -# CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH is not set -# CONFIG_FREERTOS_PLACE_SNAPSHOT_FUNS_INTO_FLASH is not set # CONFIG_FREERTOS_CHECK_PORT_CRITICAL_COMPLIANCE is not set -CONFIG_FREERTOS_ASSERT_ON_UNTESTED_FUNCTION=y -CONFIG_FREERTOS_ENABLE_TASK_SNAPSHOT=y -# end of Port - -CONFIG_FREERTOS_NO_AFFINITY=0x7FFFFFFF -CONFIG_FREERTOS_SUPPORT_STATIC_ALLOCATION=y +# CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH is not set CONFIG_FREERTOS_DEBUG_OCDAWARE=y +CONFIG_FREERTOS_ENABLE_TASK_SNAPSHOT=y +# CONFIG_FREERTOS_PLACE_SNAPSHOT_FUNS_INTO_FLASH is not set # end of FreeRTOS # @@ -1057,10 +708,9 @@ CONFIG_FREERTOS_DEBUG_OCDAWARE=y # CONFIG_HAL_ASSERTION_EQUALS_SYSTEM=y # CONFIG_HAL_ASSERTION_DISABLE is not set -# CONFIG_HAL_ASSERTION_SILENT is not set +# CONFIG_HAL_ASSERTION_SILIENT is not set # CONFIG_HAL_ASSERTION_ENABLE is not set CONFIG_HAL_DEFAULT_ASSERTION_LEVEL=2 -CONFIG_HAL_WDT_USE_ROM_IMPL=y # end of Hardware Abstraction Layer (HAL) and Low Level (LL) # @@ -1075,20 +725,31 @@ CONFIG_HEAP_TRACING_OFF=y # CONFIG_HEAP_ABORT_WHEN_ALLOCATION_FAILS is not set # end of Heap memory debugging +# +# jsmn +# +# CONFIG_JSMN_PARENT_LINKS is not set +# CONFIG_JSMN_STRICT is not set +# end of jsmn + +# +# libsodium +# +# end of libsodium + # # Log output # # CONFIG_LOG_DEFAULT_LEVEL_NONE is not set # CONFIG_LOG_DEFAULT_LEVEL_ERROR is not set # CONFIG_LOG_DEFAULT_LEVEL_WARN is not set -CONFIG_LOG_DEFAULT_LEVEL_INFO=y -# CONFIG_LOG_DEFAULT_LEVEL_DEBUG is not set +# CONFIG_LOG_DEFAULT_LEVEL_INFO is not set +CONFIG_LOG_DEFAULT_LEVEL_DEBUG=y # CONFIG_LOG_DEFAULT_LEVEL_VERBOSE is not set -CONFIG_LOG_DEFAULT_LEVEL=3 +CONFIG_LOG_DEFAULT_LEVEL=4 CONFIG_LOG_MAXIMUM_EQUALS_DEFAULT=y -# CONFIG_LOG_MAXIMUM_LEVEL_DEBUG is not set # CONFIG_LOG_MAXIMUM_LEVEL_VERBOSE is not set -CONFIG_LOG_MAXIMUM_LEVEL=3 +CONFIG_LOG_MAXIMUM_LEVEL=4 CONFIG_LOG_COLORS=y CONFIG_LOG_TIMESTAMP_SOURCE_RTOS=y # CONFIG_LOG_TIMESTAMP_SOURCE_SYSTEM is not set @@ -1117,6 +778,7 @@ CONFIG_LWIP_IP6_FRAG=y # CONFIG_LWIP_IP6_REASSEMBLY is not set # CONFIG_LWIP_IP_FORWARD is not set # CONFIG_LWIP_STATS is not set +# CONFIG_LWIP_ETHARP_TRUST_IP_MAC is not set CONFIG_LWIP_ESP_GRATUITOUS_ARP=y CONFIG_LWIP_GARP_TMR_INTERVAL=60 CONFIG_LWIP_TCPIP_RECVMBOX_SIZE=32 @@ -1125,7 +787,6 @@ CONFIG_LWIP_DHCP_DOES_ARP_CHECK=y CONFIG_LWIP_DHCP_DISABLE_VENDOR_CLASS_ID=y # CONFIG_LWIP_DHCP_RESTORE_LAST_IP is not set CONFIG_LWIP_DHCP_OPTIONS_LEN=68 -CONFIG_LWIP_NUM_NETIF_CLIENT_DATA=0 # # DHCP server @@ -1161,6 +822,7 @@ CONFIG_LWIP_TCP_WND_DEFAULT=5744 CONFIG_LWIP_TCP_RECVMBOX_SIZE=6 CONFIG_LWIP_TCP_QUEUE_OOSEQ=y # CONFIG_LWIP_TCP_SACK_OUT is not set +# CONFIG_LWIP_TCP_KEEP_CONNECTION_WHEN_IP_CHANGES is not set CONFIG_LWIP_TCP_OVERSIZE_MSS=y # CONFIG_LWIP_TCP_OVERSIZE_QUARTER_MSS is not set # CONFIG_LWIP_TCP_OVERSIZE_DISABLE is not set @@ -1214,7 +876,6 @@ CONFIG_LWIP_SNTP_MAX_SERVERS=1 CONFIG_LWIP_SNTP_UPDATE_DELAY=3600000 # end of SNTP -CONFIG_LWIP_BRIDGEIF_MAX_PORTS=7 CONFIG_LWIP_ESP_LWIP_ASSERT=y # @@ -1232,9 +893,6 @@ CONFIG_LWIP_HOOK_ND6_GET_GW_NONE=y CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_NONE=y # CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_DEFAULT is not set # CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_CUSTOM is not set -CONFIG_LWIP_HOOK_IP6_INPUT_NONE=y -# CONFIG_LWIP_HOOK_IP6_INPUT_DEFAULT is not set -# CONFIG_LWIP_HOOK_IP6_INPUT_CUSTOM is not set # end of Hooks # CONFIG_LWIP_DEBUG is not set @@ -1253,14 +911,13 @@ CONFIG_MBEDTLS_SSL_OUT_CONTENT_LEN=4096 # CONFIG_MBEDTLS_DEBUG is not set # -# mbedTLS v3.x related +# mbedTLS v2.28.x related # -# CONFIG_MBEDTLS_SSL_PROTO_TLS1_3 is not set # CONFIG_MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH is not set # CONFIG_MBEDTLS_X509_TRUSTED_CERT_CALLBACK is not set # CONFIG_MBEDTLS_SSL_CONTEXT_SERIALIZATION is not set CONFIG_MBEDTLS_SSL_KEEP_PEER_CERTIFICATE=y -# end of mbedTLS v3.x related +# end of mbedTLS v2.28.x related # # Certificate Bundle @@ -1278,13 +935,11 @@ CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_MAX_CERTS=200 CONFIG_MBEDTLS_HARDWARE_AES=y CONFIG_MBEDTLS_AES_USE_INTERRUPT=y CONFIG_MBEDTLS_HARDWARE_MPI=y -CONFIG_MBEDTLS_MPI_USE_INTERRUPT=y CONFIG_MBEDTLS_HARDWARE_SHA=y CONFIG_MBEDTLS_ROM_MD5=y # CONFIG_MBEDTLS_ATCA_HW_ECDSA_SIGN is not set # CONFIG_MBEDTLS_ATCA_HW_ECDSA_VERIFY is not set CONFIG_MBEDTLS_HAVE_TIME=y -# CONFIG_MBEDTLS_PLATFORM_TIME_ALT is not set # CONFIG_MBEDTLS_HAVE_TIME_DATE is not set CONFIG_MBEDTLS_ECDSA_DETERMINISTIC=y CONFIG_MBEDTLS_SHA512_C=y @@ -1301,6 +956,7 @@ CONFIG_MBEDTLS_TLS_ENABLED=y # # CONFIG_MBEDTLS_PSK_MODES is not set CONFIG_MBEDTLS_KEY_EXCHANGE_RSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_DHE_RSA=y CONFIG_MBEDTLS_KEY_EXCHANGE_ELLIPTIC_CURVE=y CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_RSA=y CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA=y @@ -1309,11 +965,16 @@ CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_RSA=y # end of TLS Key Exchange Methods CONFIG_MBEDTLS_SSL_RENEGOTIATION=y +# CONFIG_MBEDTLS_SSL_PROTO_SSL3 is not set +CONFIG_MBEDTLS_SSL_PROTO_TLS1=y +CONFIG_MBEDTLS_SSL_PROTO_TLS1_1=y CONFIG_MBEDTLS_SSL_PROTO_TLS1_2=y # CONFIG_MBEDTLS_SSL_PROTO_GMTSSL1_1 is not set # CONFIG_MBEDTLS_SSL_PROTO_DTLS is not set CONFIG_MBEDTLS_SSL_ALPN=y CONFIG_MBEDTLS_CLIENT_SSL_SESSION_TICKETS=y +CONFIG_MBEDTLS_X509_CHECK_KEY_USAGE=y +CONFIG_MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE=y CONFIG_MBEDTLS_SERVER_SSL_SESSION_TICKETS=y # @@ -1322,6 +983,9 @@ CONFIG_MBEDTLS_SERVER_SSL_SESSION_TICKETS=y CONFIG_MBEDTLS_AES_C=y # CONFIG_MBEDTLS_CAMELLIA_C is not set # CONFIG_MBEDTLS_DES_C is not set +CONFIG_MBEDTLS_RC4_DISABLED=y +# CONFIG_MBEDTLS_RC4_ENABLED_NO_DEFAULT is not set +# CONFIG_MBEDTLS_RC4_ENABLED is not set # CONFIG_MBEDTLS_BLOWFISH_C is not set # CONFIG_MBEDTLS_XTEA_C is not set CONFIG_MBEDTLS_CCM_C=y @@ -1341,7 +1005,6 @@ CONFIG_MBEDTLS_X509_CSR_PARSE_C=y # end of Certificates CONFIG_MBEDTLS_ECP_C=y -# CONFIG_MBEDTLS_DHM_C is not set CONFIG_MBEDTLS_ECDH_C=y CONFIG_MBEDTLS_ECDSA_C=y # CONFIG_MBEDTLS_ECJPAKE_C is not set @@ -1366,11 +1029,27 @@ CONFIG_MBEDTLS_ECP_NIST_OPTIM=y # CONFIG_MBEDTLS_SECURITY_RISKS is not set # end of mbedTLS +# +# mDNS +# +CONFIG_MDNS_MAX_SERVICES=10 +CONFIG_MDNS_TASK_PRIORITY=1 +CONFIG_MDNS_TASK_STACK_SIZE=4096 +# CONFIG_MDNS_TASK_AFFINITY_NO_AFFINITY is not set +CONFIG_MDNS_TASK_AFFINITY_CPU0=y +# CONFIG_MDNS_TASK_AFFINITY_CPU1 is not set +CONFIG_MDNS_TASK_AFFINITY=0x0 +CONFIG_MDNS_SERVICE_ADD_TIMEOUT_MS=2000 +# CONFIG_MDNS_STRICT_MODE is not set +CONFIG_MDNS_TIMER_PERIOD_MS=100 +# CONFIG_MDNS_NETWORKING_SOCKET is not set +CONFIG_MDNS_MULTIPLE_INSTANCE=y +# end of mDNS + # # ESP-MQTT Configurations # CONFIG_MQTT_PROTOCOL_311=y -# CONFIG_MQTT_PROTOCOL_5 is not set CONFIG_MQTT_TRANSPORT_SSL=y CONFIG_MQTT_TRANSPORT_WEBSOCKET=y CONFIG_MQTT_TRANSPORT_WEBSOCKET_SECURE=y @@ -1392,10 +1071,6 @@ CONFIG_NEWLIB_STDOUT_LINE_ENDING_CRLF=y # CONFIG_NEWLIB_STDIN_LINE_ENDING_LF is not set CONFIG_NEWLIB_STDIN_LINE_ENDING_CR=y # CONFIG_NEWLIB_NANO_FORMAT is not set -CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC_HRT=y -# CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC is not set -# CONFIG_NEWLIB_TIME_SYSCALL_USE_HRT is not set -# CONFIG_NEWLIB_TIME_SYSCALL_USE_NONE is not set # end of Newlib # @@ -1404,20 +1079,21 @@ CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC_HRT=y # CONFIG_NVS_ASSERT_ERROR_CHECK is not set # end of NVS +# +# OpenSSL +# +# CONFIG_OPENSSL_DEBUG is not set +CONFIG_OPENSSL_ERROR_STACK=y +# CONFIG_OPENSSL_ASSERT_DO_NOTHING is not set +CONFIG_OPENSSL_ASSERT_EXIT=y +# end of OpenSSL + # # OpenThread # # CONFIG_OPENTHREAD_ENABLED is not set # end of OpenThread -# -# Protocomm -# -CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_0=y -CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_1=y -CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_2=y -# end of Protocomm - # # PThreads # @@ -1437,11 +1113,11 @@ CONFIG_PTHREAD_TASK_NAME_DEFAULT="pthread" # CONFIG_SPI_FLASH_VERIFY_WRITE is not set # CONFIG_SPI_FLASH_ENABLE_COUNTERS is not set CONFIG_SPI_FLASH_ROM_DRIVER_PATCH=y -CONFIG_SPI_FLASH_HAS_ROM_IMPL=y # CONFIG_SPI_FLASH_ROM_IMPL is not set CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS=y # CONFIG_SPI_FLASH_DANGEROUS_WRITE_FAILS is not set # CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED is not set +# CONFIG_SPI_FLASH_USE_LEGACY_IMPL is not set # CONFIG_SPI_FLASH_SHARE_SPI1_BUS is not set # CONFIG_SPI_FLASH_BYPASS_BLOCK_ERASE is not set CONFIG_SPI_FLASH_YIELD_DURING_ERASE=y @@ -1452,13 +1128,6 @@ CONFIG_SPI_FLASH_WRITE_CHUNK_SIZE=8192 # CONFIG_SPI_FLASH_CHECK_ERASE_TIMEOUT_DISABLED is not set # CONFIG_SPI_FLASH_OVERRIDE_CHIP_DRIVER_LIST is not set -# -# SPI Flash behavior when brownout -# -CONFIG_SPI_FLASH_BROWNOUT_RESET_XMC=y -CONFIG_SPI_FLASH_BROWNOUT_RESET=y -# end of SPI Flash behavior when brownout - # # Auto-detect flash chips # @@ -1519,15 +1188,14 @@ CONFIG_SPIFFS_USE_MTIME=y # CONFIG_WS_TRANSPORT=y CONFIG_WS_BUFFER_SIZE=1024 -# CONFIG_WS_DYNAMIC_BUFFER is not set # end of Websocket # end of TCP Transport # -# Ultra Low Power (ULP) Co-processor +# TinyUSB Stack # -# CONFIG_ULP_COPROC_ENABLED is not set -# end of Ultra Low Power (ULP) Co-processor +# CONFIG_TINYUSB is not set +# end of TinyUSB Stack # # Unity unit testing library @@ -1580,14 +1248,13 @@ CONFIG_WL_SECTOR_SIZE=4096 # CONFIG_WIFI_PROV_SCAN_MAX_ENTRIES=16 CONFIG_WIFI_PROV_AUTOSTOP_TIMEOUT=30 -CONFIG_WIFI_PROV_BLE_FORCE_ENCRYPTION=y +# CONFIG_WIFI_PROV_BLE_FORCE_ENCRYPTION is not set # end of Wi-Fi Provisioning Manager # # Supplicant # CONFIG_WPA_MBEDTLS_CRYPTO=y -CONFIG_WPA_MBEDTLS_TLS_CLIENT=y # CONFIG_WPA_WAPI_PSK is not set # CONFIG_WPA_SUITE_B_192 is not set # CONFIG_WPA_DEBUG_PRINT is not set @@ -1596,7 +1263,11 @@ CONFIG_WPA_MBEDTLS_TLS_CLIENT=y # CONFIG_WPA_11KV_SUPPORT is not set # CONFIG_WPA_MBO_SUPPORT is not set # CONFIG_WPA_DPP_SUPPORT is not set -# CONFIG_WPA_11R_SUPPORT is not set -# CONFIG_WPA_WPS_SOFTAP_REGISTRAR is not set # end of Supplicant # end of Component config + +# +# Compatibility options +# +# CONFIG_LEGACY_INCLUDE_COMMON_HEADERS is not set +# end of Compatibility options diff --git a/Software/fab-reader2/src/main.rs b/Software/fab-reader2/src/main.rs deleted file mode 100644 index 8d2ebd2..0000000 --- a/Software/fab-reader2/src/main.rs +++ /dev/null @@ -1,136 +0,0 @@ -use esp_idf_sys as _; // If using the `binstart` feature of `esp-idf-sys`, always keep this module imported -use std::thread; -use std::time::Duration; - -use embedded_hal::blocking::i2c::Operation; -use embedded_hal::digital::v2::OutputPin; - -use esp_idf_sys::esp_sleep_pd_domain_t_ESP_PD_DOMAIN_VDDSDIO; -use esp_idf_sys::EspError; - -use esp_idf_hal::gpio::{GpioPin, Unknown}; -use esp_idf_hal::prelude::*; -use esp_idf_hal::spi; -use esp_idf_hal::{delay, gpio}; - -use anyhow::Result; -use embedded_graphics::mono_font::iso_8859_15::FONT_10X20; -use embedded_graphics::mono_font::MonoTextStyle; -use embedded_graphics::pixelcolor::BinaryColor; -use embedded_graphics::prelude::Point; -use embedded_graphics::text::Text; -use embedded_graphics::{mono_font, Drawable}; - -use pervasive_epd::graphics::{Display, VarDisplay}; -use pervasive_epd::prelude::*; -use pervasive_epd::E2266CS0Cx; - -fn main() -> Result<()> { - // Temporary. Will disappear once ESP-IDF 4.4 is released, but for now it is necessary to call this function once, - // or else some patches to the runtime implemented by esp-idf-sys might not link properly. - esp_idf_sys::link_patches(); - - let peripherals = Peripherals::take().unwrap(); - let pins = peripherals.pins; - - // NFC related pins - let nfc_cs = pins.gpio4.into_output()?; - let nfc_irq = pins.gpio15.into_input()?; - - // EPD related pins - let epd_cs = pins.gpio38.into_output()?; - let epd_busy = pins.gpio41.into_input()?; - let epd_dc = pins.gpio39.into_output()?; - let epd_rst = pins.gpio40.into_output()?; - let mut epd_bs = pins.gpio42.into_output()?; - epd_bs.set_low()?; - - // generic outputs - let mut buzzer = pins.gpio16.into_output()?; - - // ui switches inputs - let mut sw1 = pins.gpio12.into_input(); - let mut sw2 = pins.gpio13.into_input(); - let mut sw3 = pins.gpio14.into_input(); - let mut sw4 = pins.gpio21.into_input(); - - // SPI Bus - let sclk = pins.gpio5.into_output()?; - let sdo = pins.gpio6.into_output()?; - let sdi = pins.gpio7.into_input()?; - let spi = peripherals.spi3; - let config = ::default().baudrate(10.MHz().into()); - let mut spi_master = spi::Master::::new( - spi, - spi::Pins { - sclk, - sdo, - sdi: Some(sdi), - cs: Option::>::None, - }, - config, - )?; - - // Setup EPD - let mut epd = E2266CS0Cx::E2266CS0Cx::new( - &mut spi_master, - epd_cs, - epd_busy, - epd_dc, - epd_rst, - &mut delay::Ets, - ) - .unwrap(); - // Use display graphics from embedded-graphics - let mut buffer = vec![ - E2266CS0Cx::DEFAULT_BACKGROUND_COLOR.get_byte_value(); - E2266CS0Cx::WIDTH as usize / 8 * E2266CS0Cx::HEIGHT as usize - ]; - let mut display = VarDisplay::new(E2266CS0Cx::WIDTH, E2266CS0Cx::HEIGHT, &mut buffer); - - let style = MonoTextStyle::new(&FONT_10X20, BinaryColor::On); - - // Create a text at position (20, 30) and draw it using the previously defined style - Text::new("FabReader2!", Point::new(20, 30), style).draw(&mut display)?; - - // Display updated frame - epd.update_and_display_frame(&mut spi_master, &display.buffer(), &mut delay::Ets)?; - - println!("Hello, world!"); - - loop { - buzzer.set_high()?; - // we are using thread::sleep here to make sure the watchdog isn't triggered - thread::sleep(Duration::from_secs(1)); - - buzzer.set_low()?; - thread::sleep(Duration::from_secs(1)); - } - - #[allow(unreachable_code)] - Ok(()) -} - -fn deep_sleep(wakeup_pin_num: u8) -> Result<()> { - let bitmask: u64 = 0b01 << wakeup_pin_num - 1; - - // Configure RTC for wakeup if the given pin goes high - EspError::convert(unsafe { - esp_idf_sys::esp_sleep_enable_ext1_wakeup( - bitmask, - esp_idf_sys::esp_sleep_ext1_wakeup_mode_t_ESP_EXT1_WAKEUP_ANY_HIGH, - ) - })?; - // Power down flash - EspError::convert(unsafe { - esp_idf_sys::esp_sleep_pd_config( - esp_sleep_pd_domain_t_ESP_PD_DOMAIN_VDDSDIO, - esp_idf_sys::esp_sleep_pd_option_t_ESP_PD_OPTION_OFF, - ) - })?; - //Go into deep sleep - unsafe { - esp_idf_sys::esp_deep_sleep_start(); - } - Ok(()) -} diff --git a/Software/fab-reader2/st25r3911b/Cargo.toml b/Software/fab-reader2/st25r3911b/Cargo.toml deleted file mode 100644 index 6430023..0000000 --- a/Software/fab-reader2/st25r3911b/Cargo.toml +++ /dev/null @@ -1,16 +0,0 @@ -[package] -name = "st25r3911b" -version = "0.1.0" -edition = "2021" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -embedded-hal = { version ="0.2.7", features = ["unproven"] } -embedded-svc = "0.22.1" -anyhow = "1.0.65" -array-concat = "0.5.1" - -[build-dependencies] -anyhow = "1.0.65" -embuild = "0.30.3" \ No newline at end of file diff --git a/Software/fab-reader2/st25r3911b/FIXME b/Software/fab-reader2/st25r3911b/FIXME deleted file mode 100644 index e69de29..0000000 diff --git a/Software/fab-reader2/st25r3911b/src/analog_config.rs b/Software/fab-reader2/st25r3911b/src/analog_config.rs deleted file mode 100644 index 88f4b6b..0000000 --- a/Software/fab-reader2/st25r3911b/src/analog_config.rs +++ /dev/null @@ -1,437 +0,0 @@ -use array_concat::*; - -use crate::constants::*; -use crate::Register; - -/* Helpers */ -// Register Helpers for 1 to 13 sets -const fn mode_entry_1_reg(mode: u32, r0: u32, m0: u8, v0: u8) -> [u8; 7] { - [(mode << 8) as u8, (mode & 0xFF) as u8, 1, (r0 << 8) as u8, (r0 & 0xFF) as u8, m0, v0] -} - -const fn mode_entry_2_reg(mode: u32, r0: u32, m0: u8, v0: u8, r1: u32, m1: u8, v1: u8) -> [u8; 11] { - [(mode << 8) as u8, (mode & 0xFF) as u8, 2, (r0 << 8) as u8, (r0 & 0xFF) as u8, m0, v0, (r1 << 8) as u8, (r1 & 0xFF) as u8, m1, v1] -} - -const fn mode_entry_3_reg(mode: u32, r0: u32, m0: u8, v0: u8, r1: u32, m1: u8, v1: u8, r2: u32, m2: u8, v2: u8) -> [u8; 15] { - [(mode << 8) as u8, (mode & 0xFF) as u8, 3, (r0 << 8) as u8, (r0 & 0xFF) as u8, m0, v0, (r1 << 8) as u8, (r1 & 0xFF) as u8, m1, v1, (r2 << 8) as u8, (r2 & 0xFF) as u8, m2, v2] -} - -const fn mode_entry_4_reg(mode: u32, r0: u32, m0: u8, v0: u8, r1: u32, m1: u8, v1: u8, r2: u32, m2: u8, v2: u8, r3: u32, m3: u8, v3: u8) -> [u8; 19] { - [(mode << 8) as u8, (mode & 0xFF) as u8, 4, (r0 << 8) as u8, (r0 & 0xFF) as u8, m0, v0, (r1 << 8) as u8, (r1 & 0xFF) as u8, m1, v1, (r2 << 8) as u8, (r2 & 0xFF) as u8, m2, v2, (r3 << 8) as u8, (r3 & 0xFF) as u8, m3, v3] -} - -const fn mode_entry_5_reg(mode: u32, r0: u32, m0: u8, v0: u8, r1: u32, m1: u8, v1: u8, r2: u32, m2: u8, v2: u8, r3: u32, m3: u8, v3: u8, r4: u32, m4: u8, v4: u8) -> [u8; 23] { - [(mode << 8) as u8, (mode & 0xFF) as u8, 5, (r0 << 8) as u8, (r0 & 0xFF) as u8, m0, v0, (r1 << 8) as u8, (r1 & 0xFF) as u8, m1, v1, (r2 << 8) as u8, (r2 & 0xFF) as u8, m2, v2, (r3 << 8) as u8, (r3 & 0xFF) as u8, m3, v3, (r4 << 8) as u8, (r4 & 0xFF) as u8, m4, v4] -} - -const fn mode_entry_6_reg(mode: u32, r0: u32, m0: u8, v0: u8, r1: u32, m1: u8, v1: u8, r2: u32, m2: u8, v2: u8, r3: u32, m3: u8, v3: u8, r4: u32, m4: u8, v4: u8, r5: u32, m5: u8, v5: u8) -> [u8; 27] { - [(mode << 8) as u8, (mode & 0xFF) as u8, 6, (r0 << 8) as u8, (r0 & 0xFF) as u8, m0, v0, (r1 << 8) as u8, (r1 & 0xFF) as u8, m1, v1, (r2 << 8) as u8, (r2 & 0xFF) as u8, m2, v2, (r3 << 8) as u8, (r3 & 0xFF) as u8, m3, v3, (r4 << 8) as u8, (r4 & 0xFF) as u8, m4, v4, (r5 << 8) as u8, (r5 & 0xFF) as u8, m5, v5] -} - -const fn mode_entry_7_reg(mode: u32, r0: u32, m0: u8, v0: u8, r1: u32, m1: u8, v1: u8, r2: u32, m2: u8, v2: u8, r3: u32, m3: u8, v3: u8, r4: u32, m4: u8, v4: u8, r5: u32, m5: u8, v5: u8, r6: u32, m6: u8, v6: u8) -> [u8; 31] { - [(mode << 8) as u8, (mode & 0xFF) as u8, 7, (r0 << 8) as u8, (r0 & 0xFF) as u8, m0, v0, (r1 << 8) as u8, (r1 & 0xFF) as u8, m1, v1, (r2 << 8) as u8, (r2 & 0xFF) as u8, m2, v2, (r3 << 8) as u8, (r3 & 0xFF) as u8, m3, v3, (r4 << 8) as u8, (r4 & 0xFF) as u8, m4, v4, (r5 << 8) as u8, (r5 & 0xFF) as u8, m5, v5, (r6 << 8) as u8, (r6 & 0xFF) as u8, m6, v6] -} - -const fn mode_entry_8_reg(mode: u32, r0: u32, m0: u8, v0: u8, r1: u32, m1: u8, v1: u8, r2: u32, m2: u8, v2: u8, r3: u32, m3: u8, v3: u8, r4: u32, m4: u8, v4: u8, r5: u32, m5: u8, v5: u8, r6: u32, m6: u8, v6: u8, r7: u32, m7: u8, v7: u8) -> [u8; 35] { - [(mode << 8) as u8, (mode & 0xFF) as u8, 8, (r0 << 8) as u8, (r0 & 0xFF) as u8, m0, v0, (r1 << 8) as u8, (r1 & 0xFF) as u8, m1, v1, (r2 << 8) as u8, (r2 & 0xFF) as u8, m2, v2, (r3 << 8) as u8, (r3 & 0xFF) as u8, m3, v3, (r4 << 8) as u8, (r4 & 0xFF) as u8, m4, v4, (r5 << 8) as u8, (r5 & 0xFF) as u8, m5, v5, (r6 << 8) as u8, (r6 & 0xFF) as u8, m6, v6, (r7 << 8) as u8, (r7 & 0xFF) as u8, m7, v7] -} - -const fn mode_entry_9_reg(mode: u32, r0: u32, m0: u8, v0: u8, r1: u32, m1: u8, v1: u8, r2: u32, m2: u8, v2: u8, r3: u32, m3: u8, v3: u8, r4: u32, m4: u8, v4: u8, r5: u32, m5: u8, v5: u8, r6: u32, m6: u8, v6: u8, r7: u32, m7: u8, v7: u8, r8: u32, m8: u8, v8: u8) -> [u8; 39] { - [(mode << 8) as u8, (mode & 0xFF) as u8, 9, (r0 << 8) as u8, (r0 & 0xFF) as u8, m0, v0, (r1 << 8) as u8, (r1 & 0xFF) as u8, m1, v1, (r2 << 8) as u8, (r2 & 0xFF) as u8, m2, v2, (r3 << 8) as u8, (r3 & 0xFF) as u8, m3, v3, (r4 << 8) as u8, (r4 & 0xFF) as u8, m4, v4, (r5 << 8) as u8, (r5 & 0xFF) as u8, m5, v5, (r6 << 8) as u8, (r6 & 0xFF) as u8, m6, v6, (r7 << 8) as u8, (r7 & 0xFF) as u8, m7, v7, (r8 << 8) as u8, (r8 & 0xFF) as u8, m8, v8] -} - -const fn mode_entry_10_reg(mode: u32, r0: u32, m0: u8, v0: u8, r1: u32, m1: u8, v1: u8, r2: u32, m2: u8, v2: u8, r3: u32, m3: u8, v3: u8, r4: u32, m4: u8, v4: u8, r5: u32, m5: u8, v5: u8, r6: u32, m6: u8, v6: u8, r7: u32, m7: u8, v7: u8, r8: u32, m8: u8, v8: u8, r9: u32, m9: u8, v9: u8) -> [u8; 43] { - [(mode << 8) as u8, (mode & 0xFF) as u8, 10, (r0 << 8) as u8, (r0 & 0xFF) as u8, m0, v0, (r1 << 8) as u8, (r1 & 0xFF) as u8, m1, v1, (r2 << 8) as u8, (r2 & 0xFF) as u8, m2, v2, (r3 << 8) as u8, (r3 & 0xFF) as u8, m3, v3, (r4 << 8) as u8, (r4 & 0xFF) as u8, m4, v4, (r5 << 8) as u8, (r5 & 0xFF) as u8, m5, v5, (r6 << 8) as u8, (r6 & 0xFF) as u8, m6, v6, (r7 << 8) as u8, (r7 & 0xFF) as u8, m7, v7, (r8 << 8) as u8, (r8 & 0xFF) as u8, m8, v8, (r9 << 8) as u8, (r9 & 0xFF) as u8, m9, v9] -} - -const fn mode_entry_11_reg(mode: u32, r0: u32, m0: u8, v0: u8, r1: u32, m1: u8, v1: u8, r2: u32, m2: u8, v2: u8, r3: u32, m3: u8, v3: u8, r4: u32, m4: u8, v4: u8, r5: u32, m5: u8, v5: u8, r6: u32, m6: u8, v6: u8, r7: u32, m7: u8, v7: u8, r8: u32, m8: u8, v8: u8, r9: u32, m9: u8, v9: u8, r10: u32, m10: u8, v10: u8) -> [u8; 47] { - [(mode << 8) as u8, (mode & 0xFF) as u8, 11, (r0 << 8) as u8, (r0 & 0xFF) as u8, m0, v0, (r1 << 8) as u8, (r1 & 0xFF) as u8, m1, v1, (r2 << 8) as u8, (r2 & 0xFF) as u8, m2, v2, (r3 << 8) as u8, (r3 & 0xFF) as u8, m3, v3, (r4 << 8) as u8, (r4 & 0xFF) as u8, m4, v4, (r5 << 8) as u8, (r5 & 0xFF) as u8, m5, v5, (r6 << 8) as u8, (r6 & 0xFF) as u8, m6, v6, (r7 << 8) as u8, (r7 & 0xFF) as u8, m7, v7, (r8 << 8) as u8, (r8 & 0xFF) as u8, m8, v8, (r9 << 8) as u8, (r9 & 0xFF) as u8, m9, v9, (r10 << 8) as u8, (r10 & 0xFF) as u8, m10, v10] -} - -const fn mode_entry_12_reg(mode: u32, r0: u32, m0: u8, v0: u8, r1: u32, m1: u8, v1: u8, r2: u32, m2: u8, v2: u8, r3: u32, m3: u8, v3: u8, r4: u32, m4: u8, v4: u8, r5: u32, m5: u8, v5: u8, r6: u32, m6: u8, v6: u8, r7: u32, m7: u8, v7: u8, r8: u32, m8: u8, v8: u8, r9: u32, m9: u8, v9: u8, r10: u32, m10: u8, v10: u8, r11: u32, m11: u8, v11: u8) -> [u8; 51] { - [(mode << 8) as u8, (mode & 0xFF) as u8, 12, (r0 << 8) as u8, (r0 & 0xFF) as u8, m0, v0, (r1 << 8) as u8, (r1 & 0xFF) as u8, m1, v1, (r2 << 8) as u8, (r2 & 0xFF) as u8, m2, v2, (r3 << 8) as u8, (r3 & 0xFF) as u8, m3, v3, (r4 << 8) as u8, (r4 & 0xFF) as u8, m4, v4, (r5 << 8) as u8, (r5 & 0xFF) as u8, m5, v5, (r6 << 8) as u8, (r6 & 0xFF) as u8, m6, v6, (r7 << 8) as u8, (r7 & 0xFF) as u8, m7, v7, (r8 << 8) as u8, (r8 & 0xFF) as u8, m8, v8, (r9 << 8) as u8, (r9 & 0xFF) as u8, m9, v9, (r10 << 8) as u8, (r10 & 0xFF) as u8, m10, v10, (r11 << 8) as u8, (r11 & 0xFF) as u8, m11, v11] -} - -const fn mode_entry_13_reg(mode: u32, r0: u32, m0: u8, v0: u8, r1: u32, m1: u8, v1: u8, r2: u32, m2: u8, v2: u8, r3: u32, m3: u8, v3: u8, r4: u32, m4: u8, v4: u8, r5: u32, m5: u8, v5: u8, r6: u32, m6: u8, v6: u8, r7: u32, m7: u8, v7: u8, r8: u32, m8: u8, v8: u8, r9: u32, m9: u8, v9: u8, r10: u32, m10: u8, v10: u8, r11: u32, m11: u8, v11: u8, r12: u32, m12: u8, v12: u8) -> [u8; 55] { - [(mode << 8) as u8, (mode & 0xFF) as u8, 13, (r0 << 8) as u8, (r0 & 0xFF) as u8, m0, v0, (r1 << 8) as u8, (r1 & 0xFF) as u8, m1, v1, (r2 << 8) as u8, (r2 & 0xFF) as u8, m2, v2, (r3 << 8) as u8, (r3 & 0xFF) as u8, m3, v3, (r4 << 8) as u8, (r4 & 0xFF) as u8, m4, v4, (r5 << 8) as u8, (r5 & 0xFF) as u8, m5, v5, (r6 << 8) as u8, (r6 & 0xFF) as u8, m6, v6, (r7 << 8) as u8, (r7 & 0xFF) as u8, m7, v7, (r8 << 8) as u8, (r8 & 0xFF) as u8, m8, v8, (r9 << 8) as u8, (r9 & 0xFF) as u8, m9, v9, (r10 << 8) as u8, (r10 & 0xFF) as u8, m10, v10, (r11 << 8) as u8, (r11 & 0xFF) as u8, m11, v11, (r12 << 8) as u8, (r12 & 0xFF) as u8, m12, v12] -} - -const AM_MOD_DRIVER_LEVEL_DEFAULT: u8 = 0xb9; - -const ANALOG_CONFIG_LUT_SIZE: u32 = 87; /* Maximum number of Configuration IDs in the Loop Up Table */ -const ANALOG_CONFIG_LUT_NOT_FOUND: u32 = 0xFF; /* Index value indicating no Configuration IDs found */ - -const ANALOG_CONFIG_TBL_SIZE: u32 = 1024; /* Maximum number of Register-Mask-Value in the Setting List */ - - -const ANALOG_CONFIG_POLL_LISTEN_MODE_MASK: u32 = 0x8000; /* Mask bit of Poll Mode in Analog Configuration ID */ -const ANALOG_CONFIG_TECH_MASK: u32 = 0x7F00; /* Mask bits for Technology in Analog Configuration ID */ -const ANALOG_CONFIG_BITRATE_MASK: u32 = 0x00F0; /* Mask bits for Bit rate in Analog Configuration ID */ -const ANALOG_CONFIG_DIRECTION_MASK: u32 = 0x0003; /* Mask bits for Direction in Analog Configuration ID */ -const ANALOG_CONFIG_CHIP_SPECIFIC_MASK: u32 = 0x00FF; /* Mask bits for Chip Specific Technology */ - -const ANALOG_CONFIG_POLL_LISTEN_MODE_SHIFT: u32 = 15; /* Shift value of Poll Mode in Analog Configuration ID */ -const ANALOG_CONFIG_TECH_SHIFT: u32 = 8; /* Shift value for Technology in Analog Configuration ID */ -const ANALOG_CONFIG_BITRATE_SHIFT: u32 = 4; /* Shift value for Technology in Analog Configuration ID */ -const ANALOG_CONFIG_DIRECTION_SHIFT: u32 = 0; /* Shift value for Direction in Analog Configuration ID */ - -const ANALOG_CONFIG_POLL: u32 = 0x0000; /* Poll Mode bit setting in Analog Configuration ID */ -const ANALOG_CONFIG_LISTEN: u32 = 0x8000; /* Listen Mode bit setting in Analog Configuration ID */ - -const ANALOG_CONFIG_TECH_CHIP: u32 = 0x0000; /* Chip-Specific bit setting in Analog Configuration ID */ -const ANALOG_CONFIG_TECH_NFCA: u32 = 0x0100; /* NFC-A Technology bits setting in Analog Configuration ID */ -const ANALOG_CONFIG_TECH_NFCB: u32 = 0x0200; /* NFC-B Technology bits setting in Analog Configuration ID */ -const ANALOG_CONFIG_TECH_NFCF: u32 = 0x0400; /* NFC-F Technology bits setting in Analog Configuration ID */ -const ANALOG_CONFIG_TECH_AP2P: u32 = 0x0800; /* AP2P Technology bits setting in Analog Configuration ID */ -const ANALOG_CONFIG_TECH_NFCV: u32 = 0x1000; /* NFC-V Technology bits setting in Analog Configuration ID */ -const ANALOG_CONFIG_TECH_RFU: u32 = 0x2000; /* RFU for Technology bits */ - -const ANALOG_CONFIG_BITRATE_COMMON: u32 = 0x0000; /* Common settings for all bit rates in Analog Configuration ID */ -const ANALOG_CONFIG_BITRATE_106: u32 = 0x0010; /* 106kbits/s settings in Analog Configuration ID */ -const ANALOG_CONFIG_BITRATE_212: u32 = 0x0020; /* 212kbits/s settings in Analog Configuration ID */ -const ANALOG_CONFIG_BITRATE_424: u32 = 0x0030; /* 424kbits/s settings in Analog Configuration ID */ -const ANALOG_CONFIG_BITRATE_848: u32 = 0x0040; /* 848kbits/s settings in Analog Configuration ID */ -const ANALOG_CONFIG_BITRATE_1695: u32 = 0x0050; /* 1695kbits/s settings in Analog Configuration ID */ -const ANALOG_CONFIG_BITRATE_3390: u32 = 0x0060; /* 3390kbits/s settings in Analog Configuration ID */ -const ANALOG_CONFIG_BITRATE_6780: u32 = 0x0070; /* 6780kbits/s settings in Analog Configuration ID */ -const ANALOG_CONFIG_BITRATE_1OF4: u32 = 0x00C0; /* 1 out of 4 for NFC-V setting in Analog Configuration ID */ -const ANALOG_CONFIG_BITRATE_1OF256: u32 = 0x00D0; /* 1 out of 256 for NFC-V setting in Analog Configuration ID */ - -const ANALOG_CONFIG_NO_DIRECTION: u32 = 0x0000; /* No direction setting in Analog Conf ID (Chip Specific only) */ -const ANALOG_CONFIG_TX: u32 = 0x0001; /* Transmission bit setting in Analog Configuration ID */ -const ANALOG_CONFIG_RX: u32 = 0x0002; /* Reception bit setting in Analog Configuration ID */ -const ANALOG_CONFIG_ANTICOL: u32 = 0x0003; /* Anticollision setting in Analog Configuration ID */ - -const ANALOG_CONFIG_CHIP_INIT: u32 = 0x0000; /* Chip-Specific event: Startup;Reset;Initialize */ -const ANALOG_CONFIG_CHIP_DEINIT: u32 = 0x0001; /* Chip-Specific event: Deinitialize */ -const ANALOG_CONFIG_CHIP_FIELD_ON: u32 = 0x0002; /* Chip-Specific event: Field On */ -const ANALOG_CONFIG_CHIP_FIELD_OFF: u32 = 0x0003; /* Chip-Specific event: Field Off */ -const ANALOG_CONFIG_CHIP_WAKEUP_ON: u32 = 0x0004; /* Chip-Specific event: Wake-up On */ -const ANALOG_CONFIG_CHIP_WAKEUP_OFF: u32 = 0x0005; /* Chip-Specific event: Wake-up Off */ -const ANALOG_CONFIG_CHIP_LISTEN_ON: u32 = 0x0006; /* Chip-Specific event: Listen On */ -const ANALOG_CONFIG_CHIP_LISTEN_OFF: u32 = 0x0007; /* Chip-Specific event: Listen Off */ -const ANALOG_CONFIG_CHIP_POLL_COMMON: u32 = 0x0008; /* Chip-Specific event: Poll common */ -const ANALOG_CONFIG_CHIP_LISTEN_COMMON: u32 = 0x0009; /* Chip-Specific event: Listen common */ - -const ANALOG_CONFIG_UPDATE_LAST: u32 = 0x00; /* Value indicating Last configuration set during update */ -const ANALOG_CONFIG_UPDATE_MORE: u32 = 0x01; /* Value indicating More configuration set coming during update */ - -//****** Default Analog Configuration for Chip-Specific Reset. ******/ -const RESET_INIT: [u8; 43] = mode_entry_10_reg( - ANALOG_CONFIG_TECH_CHIP | ANALOG_CONFIG_CHIP_INIT, - Register::OperationControl as u32, 0x30, 0x10, //Default to AM - Register::IOConfiguration1 as u32, 0x06, 0x06, //MCUCLK: HF clk off - Register::IOConfiguration1 as u32, IOConfiguration1Bits::MaskOutCl as u8 | IOConfiguration1Bits::LfClkOff as u8, 0x07, // MCUCLK: LF clk off - Register::IOConfiguration2 as u32, 0x18, 0x18, // pull downs - Register::ReceiverConfiguration4 as u32, ReceiverConfiguration4Mask::MaskRg2Pm as u8, 0x1 << ReceiverConfiguration4Mask::ShiftRg2Pm as u8, //increase digitizer windows for PM - Register::AnntenaCalibrationTarget as u32, 0xFF, 0x80, // 90 deg, - Register::AnntenaCalibrationControl as u32, 0xF8, 0x00, // trim value from calibrate antenna - Register::AMModulationDepthControl as u32, AMModulationDepthControlConstans::AmS as u8, AMModulationDepthControlConstans::AmS as u8, // AM modulated level is defined by RFO AM Modulated Level Def Reg, fixed setting, no automatic adjustment - Register::ExternalFieldDetectorThreshold as u32, EXT_FIELD_DET_TRG_MASK, ExternalFieldDetectorThresholdTrgVoltage::Trg75mV as u8, - Register::ExternalFieldDetectorThreshold as u32, EXT_FIELD_DET_RFE_MASK, ExternalFieldDetectorThresholdRfeVoltage::Rfe75mV as u8, -); - -//****** Default Analog Configuration for Poll NFC-A Rx. ******/ -const NFCA_TX_COMMON: [u8; 7] = mode_entry_1_reg( - ANALOG_CONFIG_POLL | ANALOG_CONFIG_TECH_NFCA | ANALOG_CONFIG_BITRATE_COMMON | ANALOG_CONFIG_TX, - Register::RFOAMModulationLevelDefinition as u32, 0xff, 0xf0, // Used for 848 TX: very high AM to keep wave shapes -); -const NFCA_TX_106: [u8; 7] = mode_entry_1_reg( - ANALOG_CONFIG_POLL | ANALOG_CONFIG_TECH_NFCA | ANALOG_CONFIG_BITRATE_106 | ANALOG_CONFIG_TX, - Register::AuxDefinition as u32, AuxDefinitionBits::TrAm as u8, 0x00, // OOK -); -const NFCA_TX_212: [u8; 7] = mode_entry_1_reg( - ANALOG_CONFIG_POLL | ANALOG_CONFIG_TECH_NFCA | ANALOG_CONFIG_BITRATE_212 | ANALOG_CONFIG_TX, - Register::AuxDefinition as u32, AuxDefinitionBits::TrAm as u8, 0x00, // OOK -); -const NFCA_TX_424: [u8; 7] = mode_entry_1_reg( - ANALOG_CONFIG_POLL | ANALOG_CONFIG_TECH_NFCA | ANALOG_CONFIG_BITRATE_424 | ANALOG_CONFIG_TX, - Register::AuxDefinition as u32, AuxDefinitionBits::TrAm as u8, 0x00, // OOK -); -const NFCA_TX_848: [u8; 7] = mode_entry_1_reg( - ANALOG_CONFIG_POLL | ANALOG_CONFIG_TECH_NFCA | ANALOG_CONFIG_BITRATE_848 | ANALOG_CONFIG_TX, - Register::AuxDefinition as u32, AuxDefinitionBits::TrAm as u8, 0x00, // OOK -); -const NFCA_TX_848_AUX: [u8; 11] = mode_entry_2_reg( - ANALOG_CONFIG_POLL | ANALOG_CONFIG_TECH_NFCA | ANALOG_CONFIG_BITRATE_848 | ANALOG_CONFIG_TX, - Register::AuxDefinition as u32, AuxDefinitionBits::TrAm as u8, AuxDefinitionBits::TrAm as u8, // AM - Register::RFOAMModulationLevelDefinition as u32, 0xff, 0x00, // Used for 848 TX: very high AM to keep wave shapes -); - -//****** Default Analog Configuration for Poll NFC-A Rx. ******/ -const NFCA_RX_COMMON: [u8; 15] = mode_entry_3_reg( - ANALOG_CONFIG_POLL | ANALOG_CONFIG_TECH_NFCA | ANALOG_CONFIG_BITRATE_COMMON | ANALOG_CONFIG_RX, - Register::ReceiverConfiguration3 as u32, 0xff, 0x18, - Register::ReceiverConfiguration4 as u32, ReceiverConfiguration4Mask::MaskRg2Am as u8, 0x2 << ReceiverConfiguration4Mask::ShiftRg2Am as u8, //increase digitizer windows for AM - Register::AuxDefinition as u32, AuxDefinitionBits::RxTol as u8, 0x00, //rx_tol off -); -const NFCA_RX_106: [u8; 7] = mode_entry_1_reg( - ANALOG_CONFIG_POLL | ANALOG_CONFIG_TECH_NFCA | ANALOG_CONFIG_BITRATE_106 | ANALOG_CONFIG_RX, - Register::ReceiverConfiguration1 as u32, 0x7f, 0x00, -); -const NFCA_RX_212: [u8; 7] = mode_entry_1_reg( - ANALOG_CONFIG_POLL | ANALOG_CONFIG_TECH_NFCA | ANALOG_CONFIG_BITRATE_212 | ANALOG_CONFIG_RX, - Register::ReceiverConfiguration1 as u32, 0x7f, 0x04, -); -const NFCA_RX_424: [u8; 7] = mode_entry_1_reg( - ANALOG_CONFIG_POLL | ANALOG_CONFIG_TECH_NFCA | ANALOG_CONFIG_BITRATE_424 | ANALOG_CONFIG_RX, - Register::ReceiverConfiguration1 as u32, 0x7f, 0x22, -); -const NFCA_RX_848: [u8; 7] = mode_entry_1_reg( - ANALOG_CONFIG_POLL | ANALOG_CONFIG_TECH_NFCA | ANALOG_CONFIG_BITRATE_848 | ANALOG_CONFIG_RX, - Register::ReceiverConfiguration1 as u32, 0x7f, 0x22, -); - -//****** Default Analog Configuration for Poll NFC-B Tx. ******/ -const NFCB_TX_COMMON: [u8; 11] = mode_entry_2_reg( - ANALOG_CONFIG_POLL | ANALOG_CONFIG_TECH_NFCB | ANALOG_CONFIG_BITRATE_COMMON | ANALOG_CONFIG_TX, - Register::AuxDefinition as u32, AuxDefinitionBits::TrAm as u8, AuxDefinitionBits::TrAm as u8, // AM - Register::RFOAMModulationLevelDefinition as u32, 0xff, AM_MOD_DRIVER_LEVEL_DEFAULT, //Fixed driver for AM level: -14% -); - -//****** Default Analog Configuration for Poll NFC-B Rx. ******/ -const NFCB_RX_COMMON: [u8; 15] = mode_entry_3_reg( - ANALOG_CONFIG_POLL | ANALOG_CONFIG_TECH_NFCB | ANALOG_CONFIG_BITRATE_COMMON | ANALOG_CONFIG_RX, - Register::ReceiverConfiguration3 as u32, 0xff, 0x18, - Register::ReceiverConfiguration4 as u32, ReceiverConfiguration4Mask::MaskRg2Am as u8, 0x2 << ReceiverConfiguration4Mask::ShiftRg2Am as u8, //increase digitizer windows for AM - Register::AuxDefinition as u32, AuxDefinitionBits::RxTol as u8, 0x00, //rx_tol off -); -const NFCB_RX_106: [u8; 7] = mode_entry_1_reg( - ANALOG_CONFIG_POLL | ANALOG_CONFIG_TECH_NFCB | ANALOG_CONFIG_BITRATE_106 | ANALOG_CONFIG_RX, - Register::ReceiverConfiguration1 as u32, 0x7f, 0x00, -); -const NFCB_RX_212: [u8; 7] = mode_entry_1_reg( - ANALOG_CONFIG_POLL | ANALOG_CONFIG_TECH_NFCB | ANALOG_CONFIG_BITRATE_212 | ANALOG_CONFIG_RX, - Register::ReceiverConfiguration1 as u32, 0x7f, 0x04, -); -const NFCB_RX_424: [u8; 7] = mode_entry_1_reg( - ANALOG_CONFIG_POLL | ANALOG_CONFIG_TECH_NFCB | ANALOG_CONFIG_BITRATE_424 | ANALOG_CONFIG_RX, - Register::ReceiverConfiguration1 as u32, 0x7f, 0x22, -); -const NFCB_RX_848: [u8; 7] = mode_entry_1_reg( - ANALOG_CONFIG_POLL | ANALOG_CONFIG_TECH_NFCB | ANALOG_CONFIG_BITRATE_848 | ANALOG_CONFIG_RX, - Register::ReceiverConfiguration1 as u32, 0x7f, 0x22, -); - -//****** Default Analog Configuration for Poll NFC-F Tx. ******/ -const NFCF_TX_COMMON: [u8; 11] = mode_entry_2_reg( - ANALOG_CONFIG_POLL | ANALOG_CONFIG_TECH_NFCF | ANALOG_CONFIG_BITRATE_COMMON | ANALOG_CONFIG_TX, - Register::AuxDefinition as u32, AuxDefinitionBits::TrAm as u8, AuxDefinitionBits::TrAm as u8, // AM - Register::RFOAMModulationLevelDefinition as u32, 0xff, AM_MOD_DRIVER_LEVEL_DEFAULT, //Fixed driver for AM level: -14% -); - -//****** Default Analog Configuration for Poll NFC-F Rx. ******/ -const NFCF_RX_COMMON: [u8; 15] = mode_entry_3_reg( - ANALOG_CONFIG_POLL | ANALOG_CONFIG_TECH_NFCF | ANALOG_CONFIG_BITRATE_COMMON | ANALOG_CONFIG_RX, - Register::ReceiverConfiguration3 as u32, 0xff, 0x18, - Register::ReceiverConfiguration4 as u32, ReceiverConfiguration4Mask::MaskRg2Am as u8, 0x1 << ReceiverConfiguration4Mask::ShiftRg2Am as u8, //increase digitizer windows for AM - Register::AuxDefinition as u32, AuxDefinitionBits::RxTol as u8, AuxDefinitionBits::RxTol as u8, //rx_tol On as default -); -const NFCF_RX_212: [u8; 7] = mode_entry_1_reg( - ANALOG_CONFIG_POLL | ANALOG_CONFIG_TECH_NFCF | ANALOG_CONFIG_BITRATE_212 | ANALOG_CONFIG_RX, - Register::ReceiverConfiguration1 as u32, 0x7f, 0x13, /* dev. from data sheet: lp 300kKz */ -); -const NFCF_RX_424: [u8; 7] = mode_entry_1_reg( - ANALOG_CONFIG_POLL | ANALOG_CONFIG_TECH_NFCF | ANALOG_CONFIG_BITRATE_424 | ANALOG_CONFIG_RX, - Register::ReceiverConfiguration1 as u32, 0x7f, 0x0b, /* dev. from data sheet: lp 600kKz */ -); - -//****** Default Analog Configuration for Poll NFC-V Tx. ******/ -const NFCV_TX_COMMON: [u8; 7] = mode_entry_1_reg( - ANALOG_CONFIG_POLL | ANALOG_CONFIG_TECH_NFCV | ANALOG_CONFIG_BITRATE_COMMON | ANALOG_CONFIG_TX, - Register::AuxDefinition as u32, AuxDefinitionBits::TrAm as u8, 0x00, // AM -); - -//****** Default Analog Configuration for Poll NFC-V Rx. ******/ -const NFCV_RX_COMMON: [u8; 19] = mode_entry_4_reg( - ANALOG_CONFIG_POLL | ANALOG_CONFIG_TECH_NFCV | ANALOG_CONFIG_BITRATE_COMMON | ANALOG_CONFIG_RX, - Register::ReceiverConfiguration1 as u32, 0x7f, 0x0c, /* use filter settings from table 9: "Recommended for 424/484 kHz sub-carrier" */ - Register::ReceiverConfiguration3 as u32, 0xff, 0x18, - Register::ReceiverConfiguration4 as u32, ReceiverConfiguration4Mask::MaskRg2Am as u8, 0x1 << ReceiverConfiguration4Mask::ShiftRg2Am as u8, //increase digitizer windows for AM - Register::AuxDefinition as u32, AuxDefinitionBits::RxTol as u8, AuxDefinitionBits::RxTol as u8, //rx_tol On as default -); - -//****** Default Analog Configuration for Poll AP2P Tx. ******/ -const AP2P_TX_COMMON: [u8; 7] = mode_entry_1_reg( - ANALOG_CONFIG_POLL | ANALOG_CONFIG_TECH_AP2P | ANALOG_CONFIG_BITRATE_COMMON | ANALOG_CONFIG_TX, - Register::RFOAMModulationLevelDefinition as u32, 0xff, AM_MOD_DRIVER_LEVEL_DEFAULT, -); -const AP2P_TX_106: [u8; 7] = mode_entry_1_reg( - ANALOG_CONFIG_POLL | ANALOG_CONFIG_TECH_AP2P | ANALOG_CONFIG_BITRATE_106 | ANALOG_CONFIG_TX, - Register::AuxDefinition as u32, AuxDefinitionBits::TrAm as u8, 0x00, // OOK -); -const AP2P_TX_212: [u8; 11] = mode_entry_2_reg( - ANALOG_CONFIG_POLL | ANALOG_CONFIG_TECH_AP2P | ANALOG_CONFIG_BITRATE_212 | ANALOG_CONFIG_TX, - Register::AuxDefinition as u32, AuxDefinitionBits::TrAm as u8, AuxDefinitionBits::TrAm as u8, // AM - Register::RFOAMModulationLevelDefinition as u32, 0xff, AM_MOD_DRIVER_LEVEL_DEFAULT, //Fixed driver for AM level: -14% -); -const AP2P_TX_424: [u8; 11] = mode_entry_2_reg( - ANALOG_CONFIG_POLL | ANALOG_CONFIG_TECH_AP2P | ANALOG_CONFIG_BITRATE_424 | ANALOG_CONFIG_TX, - Register::AuxDefinition as u32, AuxDefinitionBits::TrAm as u8, AuxDefinitionBits::TrAm as u8, // AM - Register::RFOAMModulationLevelDefinition as u32, 0xff, AM_MOD_DRIVER_LEVEL_DEFAULT, //Fixed driver for AM level: -14% -); - -//****** Default Analog Configuration for Poll AP2P Rx. ******/ -const AP2P_RX_TECH: [u8; 19] = mode_entry_4_reg( - ANALOG_CONFIG_TECH_CHIP | ANALOG_CONFIG_CHIP_LISTEN_ON, - Register::ReceiverConfiguration1 as u32, 0x7f, 0x45, - Register::ReceiverConfiguration3 as u32, ReceiverConfiguration3Bits::Lim as u8 | ReceiverConfiguration3Bits::RgNfc as u8, ReceiverConfiguration3Bits::Lim as u8 | ReceiverConfiguration3Bits::RgNfc as u8, - Register::AuxDefinition as u32, AuxDefinitionBits::RxTol as u8, AuxDefinitionBits::RxTol as u8, //rx_tol On as default - Register::ReceiverConfiguration4 as u32, ReceiverConfiguration4Mask::MaskRg2Am as u8, 0x1 << ReceiverConfiguration4Mask::ShiftRg2Am as u8, //increase digitizer windows for AM -); -const AP2P_RX_COMMON: [u8; 19] = mode_entry_4_reg( - ANALOG_CONFIG_POLL | ANALOG_CONFIG_TECH_AP2P | ANALOG_CONFIG_BITRATE_COMMON | ANALOG_CONFIG_RX, - Register::ReceiverConfiguration1 as u32, 0x7f, 0x45, - Register::ReceiverConfiguration3 as u32, ReceiverConfiguration3Bits::Lim as u8 | ReceiverConfiguration3Bits::RgNfc as u8, ReceiverConfiguration3Bits::Lim as u8 | ReceiverConfiguration3Bits::RgNfc as u8, - Register::AuxDefinition as u32, AuxDefinitionBits::RxTol as u8, AuxDefinitionBits::RxTol as u8, //rx_tol On as default - Register::ReceiverConfiguration4 as u32, ReceiverConfiguration4Mask::MaskRg2Am as u8, 0x1 << ReceiverConfiguration4Mask::ShiftRg2Am as u8, //increase digitizer windows for AM -); -const AP2P_RX_106: [u8; 7] = mode_entry_1_reg( - ANALOG_CONFIG_POLL | ANALOG_CONFIG_TECH_AP2P | ANALOG_CONFIG_BITRATE_106 | ANALOG_CONFIG_RX, - Register::ReceiverConfiguration3 as u32, ReceiverConfiguration3Mask::MaskRg1Am as u8, 0xc0, -); -const AP2P_RX_212: [u8; 7] = mode_entry_1_reg( - ANALOG_CONFIG_POLL | ANALOG_CONFIG_TECH_AP2P | ANALOG_CONFIG_BITRATE_212 | ANALOG_CONFIG_RX, - Register::ReceiverConfiguration3 as u32, ReceiverConfiguration3Mask::MaskRg1Am as u8, 0x00, -); -const AP2P_RX_424: [u8; 7] = mode_entry_1_reg( - ANALOG_CONFIG_POLL | ANALOG_CONFIG_TECH_AP2P | ANALOG_CONFIG_BITRATE_424 | ANALOG_CONFIG_RX, - Register::ReceiverConfiguration3 as u32, ReceiverConfiguration3Mask::MaskRg1Am as u8, 0x00, -); - -//****** Default Analog Configuration for Listen AP2P Tx. ******/ -const AP2P_LTX_COMMON: [u8; 7] = mode_entry_1_reg( - ANALOG_CONFIG_LISTEN | ANALOG_CONFIG_TECH_AP2P | ANALOG_CONFIG_BITRATE_COMMON | ANALOG_CONFIG_TX, - Register::RFOAMModulationLevelDefinition as u32, 0xff, AM_MOD_DRIVER_LEVEL_DEFAULT, //Fixed driver for AM level: -14% -); -const AP2P_LTX_106: [u8; 7] = mode_entry_1_reg( - ANALOG_CONFIG_LISTEN | ANALOG_CONFIG_TECH_AP2P | ANALOG_CONFIG_BITRATE_106 | ANALOG_CONFIG_TX, - Register::AuxDefinition as u32, AuxDefinitionBits::TrAm as u8, 0x00, // OOK -); -const AP2P_LTX_212: [u8; 7] = mode_entry_1_reg( - ANALOG_CONFIG_LISTEN | ANALOG_CONFIG_TECH_AP2P | ANALOG_CONFIG_BITRATE_212 | ANALOG_CONFIG_TX, - Register::AuxDefinition as u32, AuxDefinitionBits::TrAm as u8, AuxDefinitionBits::TrAm as u8, // AM -); -const AP2P_LTX_424: [u8; 7] = mode_entry_1_reg( - ANALOG_CONFIG_LISTEN | ANALOG_CONFIG_TECH_AP2P | ANALOG_CONFIG_BITRATE_424 | ANALOG_CONFIG_TX, - Register::AuxDefinition as u32, AuxDefinitionBits::TrAm as u8, AuxDefinitionBits::TrAm as u8, // AM -); - -//****** Default Analog Configuration for Listen AP2P Rx. ******/ -const AP2P_LRX_COMMON: [u8; 15] = mode_entry_3_reg( - ANALOG_CONFIG_LISTEN | ANALOG_CONFIG_TECH_AP2P | ANALOG_CONFIG_BITRATE_COMMON | ANALOG_CONFIG_RX, - Register::ReceiverConfiguration1 as u32, 0x7f, 0x45, - Register::ReceiverConfiguration3 as u32, ReceiverConfiguration3Bits::Lim as u8 | ReceiverConfiguration3Bits::RgNfc as u8, ReceiverConfiguration3Bits::Lim as u8 | ReceiverConfiguration3Bits::RgNfc as u8, - Register::ReceiverConfiguration4 as u32, ReceiverConfiguration4Mask::MaskRg2Am as u8, 0x1 << ReceiverConfiguration4Mask::ShiftRg2Am as u8, //increase digitizer windows for AM -); -const AP2P_LRX_106: [u8; 7] = mode_entry_1_reg( - ANALOG_CONFIG_LISTEN | ANALOG_CONFIG_TECH_AP2P | ANALOG_CONFIG_BITRATE_106 | ANALOG_CONFIG_RX, - Register::ReceiverConfiguration3 as u32, ReceiverConfiguration3Mask::MaskRg1Am as u8, 0xc0, -); -const AP2P_LRX_212: [u8; 7] = mode_entry_1_reg( - ANALOG_CONFIG_LISTEN | ANALOG_CONFIG_TECH_AP2P | ANALOG_CONFIG_BITRATE_212 | ANALOG_CONFIG_RX, - Register::ReceiverConfiguration3 as u32, ReceiverConfiguration3Mask::MaskRg1Am as u8, 0x00, -); -const AP2P_LRX_424: [u8; 7] = mode_entry_1_reg( - ANALOG_CONFIG_LISTEN | ANALOG_CONFIG_TECH_AP2P | ANALOG_CONFIG_BITRATE_424 | ANALOG_CONFIG_RX, - Register::ReceiverConfiguration3 as u32, ReceiverConfiguration3Mask::MaskRg1Am as u8, 0x00, -); - -static DEFAULT_ANALOG_CONFIG: [u8; concat_arrays_size!( - RESET_INIT, - NFCA_TX_COMMON, - NFCA_TX_106, - NFCA_TX_212, - NFCA_TX_424, - NFCA_TX_848, - NFCA_TX_848_AUX, - NFCA_RX_COMMON, - NFCA_RX_106, - NFCA_RX_212, - NFCA_RX_424, - NFCA_RX_848, - NFCB_TX_COMMON, - NFCB_RX_COMMON, - NFCB_RX_106, - NFCB_RX_212, - NFCB_RX_424, - NFCB_RX_848, - NFCF_TX_COMMON, - NFCF_RX_COMMON, - NFCF_RX_212, - NFCF_RX_424, - NFCV_TX_COMMON, - NFCV_RX_COMMON, - AP2P_TX_COMMON, - AP2P_TX_106, - AP2P_TX_212, - AP2P_TX_424, - AP2P_RX_TECH, - AP2P_RX_COMMON, - AP2P_RX_106, - AP2P_RX_212, - AP2P_RX_424, - AP2P_LTX_COMMON, - AP2P_LTX_106, - AP2P_LTX_212, - AP2P_LTX_424, - AP2P_LRX_COMMON, - AP2P_LRX_106, - AP2P_LRX_212, - AP2P_LRX_424 -)] = concat_arrays!( - RESET_INIT, - NFCA_TX_COMMON, - NFCA_TX_106, - NFCA_TX_212, - NFCA_TX_424, - NFCA_TX_848, - NFCA_TX_848_AUX, - NFCA_RX_COMMON, - NFCA_RX_106, - NFCA_RX_212, - NFCA_RX_424, - NFCA_RX_848, - NFCB_TX_COMMON, - NFCB_RX_COMMON, - NFCB_RX_106, - NFCB_RX_212, - NFCB_RX_424, - NFCB_RX_848, - NFCF_TX_COMMON, - NFCF_RX_COMMON, - NFCF_RX_212, - NFCF_RX_424, - NFCV_TX_COMMON, - NFCV_RX_COMMON, - AP2P_TX_COMMON, - AP2P_TX_106, - AP2P_TX_212, - AP2P_TX_424, - AP2P_RX_TECH, - AP2P_RX_COMMON, - AP2P_RX_106, - AP2P_RX_212, - AP2P_RX_424, - AP2P_LTX_COMMON, - AP2P_LTX_106, - AP2P_LTX_212, - AP2P_LTX_424, - AP2P_LRX_COMMON, - AP2P_LRX_106, - AP2P_LRX_212, - AP2P_LRX_424 -); - -pub(crate) struct AnalogConfigMgmt { - config_tbl: Box<[u8]>, -} - -impl AnalogConfigMgmt { - pub fn new_default() -> Self { - Self { - config_tbl: Box::new(DEFAULT_ANALOG_CONFIG), - } - } -} \ No newline at end of file diff --git a/Software/fab-reader2/st25r3911b/src/constants.rs b/Software/fab-reader2/st25r3911b/src/constants.rs deleted file mode 100644 index 4acb68a..0000000 --- a/Software/fab-reader2/st25r3911b/src/constants.rs +++ /dev/null @@ -1,536 +0,0 @@ -use std::time::Duration; - -#[repr(u8)] -#[derive(PartialEq, Clone, Copy, Debug)] -pub(crate) enum Register { - IOConfiguration1 = 0x00, - IOConfiguration2 = 0x01, - OperationControl = 0x02, - ModeDefinition = 0x03, - BitRateDefinition = 0x04, - ISO14443ANFCSettings = 0x05, - ISO14443BSettings1 = 0x06, - ISO14443BFeliCaSettings = 0x07, - StreamModeDefinition = 0x08, - AuxDefinition = 0x09, - ReceiverConfiguration1 = 0x0A, - ReceiverConfiguration2 = 0x0B, - ReceiverConfiguration3 = 0x0C, - ReceiverConfiguration4 = 0x0D, - MaskReceiveTimer = 0x0E, - NoResponseTimer1 = 0x0F, - NoResponseTimer2 = 0x10, - GeneralPurposeNoResponseTimerControl = 0x11, - GeneralPurposeTimer1 = 0x12, - GeneralPurposeTimer2 = 0x13, - MaskMainInterrupt = 0x14, - MaskTimerNFCInterrupt = 0x15, - MaskErrorWakeUpInterrupt = 0x16, - MainInterruptStatus = 0x17, - TimerNFCInterruptStatus = 0x18, - ErrorWakeUpInterruptStatus = 0x19, - FIFOStatus1 = 0x1A, - FIFOStatus2 = 0x1B, - CollisionStatus = 0x1C, - NoOfTransmittedBytes1 = 0x1D, - NoOfTransmittedBytes2 = 0x1E, - NFCIPBitRateDetectionStatus = 0x1F, - ADCOutput = 0x20, - AnntenaCalibrationControl = 0x21, - AnntenaCalibrationTarget = 0x22, - AnntenaCalibrationStatus = 0x23, - AMModulationDepthControl = 0x24, - AMModulationDepthStatus = 0x25, - RFOAMModulationLevelDefinition = 0x26, - RFONormalLevelDefinition = 0x27, - ExternalFieldDetectorThreshold = 0x29, - RegulatorVoltageControl = 0x2A, - RegulatorTimerStatus = 0x2B, - RSSIStatus = 0x2C, - GainReductionState = 0x2D, - CapacitiveSensorControl = 0x2E, - CapacitiveSensorStatus = 0x2F, - AuxStatus = 0x30, - WakeUpTimerControl = 0x31, - AmplitudeMeasurementConfiguration = 0x32, - AmplitudeMeasurementReference = 0x33, - AmplitudeMeasurementAutoAveragingStatus = 0x34, - AmplitudeMeasurementStatus = 0x35, - PhaseMeasurementConfiguration = 0x36, - PhaseMeasurementReference = 0x37, - PhaseMeasurementAutoAveragingStatus = 0x38, - PhaseMeasurementStatus = 0x39, - CapacitanceMeasurementConfiguration = 0x3A, - CapacitanceMeasurementReference = 0x3B, - CapacitanceMeasurementAutoAveragingStatus = 0x3C, - CapacitanceMeasurementStatus = 0x3D, - ICIdentity = 0x3F, - InvalidRegister = 0xFF, -} - -impl From for Register { - fn from(value: u8) -> Self { - match value { - 0x00 => Register::IOConfiguration1, - 0x01 => Register::IOConfiguration2, - 0x02 => Register::OperationControl, - 0x03 => Register::ModeDefinition, - 0x04 => Register::BitRateDefinition, - 0x05 => Register::ISO14443ANFCSettings, - 0x06 => Register::ISO14443BSettings1, - 0x07 => Register::ISO14443BFeliCaSettings, - 0x08 => Register::StreamModeDefinition, - 0x09 => Register::AuxDefinition, - 0x0A => Register::ReceiverConfiguration1, - 0x0B => Register::ReceiverConfiguration2, - 0x0C => Register::ReceiverConfiguration3, - 0x0D => Register::ReceiverConfiguration4, - 0x0E => Register::MaskReceiveTimer, - 0x0F => Register::NoResponseTimer1, - 0x10 => Register::NoResponseTimer2, - 0x11 => Register::GeneralPurposeNoResponseTimerControl, - 0x12 => Register::GeneralPurposeTimer1, - 0x13 => Register::GeneralPurposeTimer2, - 0x14 => Register::MaskMainInterrupt, - 0x15 => Register::MaskTimerNFCInterrupt, - 0x16 => Register::MaskErrorWakeUpInterrupt, - 0x17 => Register::MainInterruptStatus, - 0x18 => Register::TimerNFCInterruptStatus, - 0x19 => Register::ErrorWakeUpInterruptStatus, - 0x1A => Register::FIFOStatus1, - 0x1B => Register::FIFOStatus2, - 0x1C => Register::CollisionStatus, - 0x1D => Register::NoOfTransmittedBytes1, - 0x1E => Register::NoOfTransmittedBytes2, - 0x1F => Register::NFCIPBitRateDetectionStatus, - 0x20 => Register::ADCOutput, - 0x21 => Register::AnntenaCalibrationControl, - 0x22 => Register::AnntenaCalibrationTarget, - 0x23 => Register::AnntenaCalibrationStatus, - 0x24 => Register::AMModulationDepthControl, - 0x25 => Register::AMModulationDepthStatus, - 0x26 => Register::RFOAMModulationLevelDefinition, - 0x27 => Register::RFONormalLevelDefinition, - 0x29 => Register::ExternalFieldDetectorThreshold, - 0x2A => Register::RegulatorVoltageControl, - 0x2B => Register::RegulatorTimerStatus, - 0x2C => Register::RSSIStatus, - 0x2D => Register::GainReductionState, - 0x2E => Register::CapacitiveSensorControl, - 0x2F => Register::CapacitiveSensorStatus, - 0x30 => Register::AuxStatus, - 0x31 => Register::WakeUpTimerControl, - 0x32 => Register::AmplitudeMeasurementConfiguration, - 0x33 => Register::AmplitudeMeasurementReference, - 0x34 => Register::AmplitudeMeasurementAutoAveragingStatus, - 0x35 => Register::AmplitudeMeasurementStatus, - 0x36 => Register::PhaseMeasurementConfiguration, - 0x37 => Register::PhaseMeasurementReference, - 0x38 => Register::PhaseMeasurementAutoAveragingStatus, - 0x39 => Register::PhaseMeasurementStatus, - 0x3A => Register::CapacitanceMeasurementConfiguration, - 0x3B => Register::CapacitanceMeasurementReference, - 0x3C => Register::CapacitanceMeasurementAutoAveragingStatus, - 0x3D => Register::CapacitanceMeasurementStatus, - 0x3F => Register::ICIdentity, - 40_u8 | 62_u8 | 64_u8..=u8::MAX => Register::InvalidRegister, - } - } -} - -impl Register { - /// Get register address - pub fn addr(self) -> u8 { - self as u8 - } -} - -#[repr(u8)] -#[derive(PartialEq, Clone, Copy, Debug)] -pub enum OperationControlBits { - Wu = 1 << 2, - TxEn = 1 << 3, - RxMan = 1 << 4, - RxChn = 1 << 5, - RxEn = 1 << 6, - En = 1 << 7, -} - -#[repr(u8)] -#[derive(PartialEq, Clone, Copy, Debug)] -pub enum RegulatorControlBits { - ShiftMpsv = 1, - MpsvVdd = 0 << 1, - MpsvVspA = 1 << 1, - MpsvVspD = 2 << 1, - MpsvVspRf = 3 << 1, - ShiftRege = 3, - RegS = 1 << 7, -} - -#[repr(u8)] -#[derive(PartialEq, Clone, Copy, Debug)] -pub enum RegulatorControlMask { - Mpsv = 3 << 1, - Rege = 0xf << 3, -} - -#[repr(u8)] -#[derive(PartialEq, Clone, Copy, Debug)] -pub enum AuxDefinitionBits { - MaskNfcN = 3 << 0, - NfcN0 = 1 << 0, - NfcN1 = 1 << 1, - RxTol = 1 << 2, - OokHr = 1 << 3, - EnFd = 1 << 4, - TrAm = 1 << 5, - Crc2Fifo = 1 << 6, - NoCrcRx = 1 << 7, -} - -#[repr(u8)] -#[derive(PartialEq, Clone, Copy, Debug)] -pub enum IOConfiguration2Bits { - SlowUp = 1 << 0, - Io18 = 1 << 2, - MisoPd1 = 1 << 3, - MisoPd2 = 1 << 4, - VspdOff = 1 << 6, - Sup3V = 1 << 7, -} - -#[repr(u8)] -#[derive(PartialEq, Clone, Copy, Debug)] -pub enum IOConfiguration1Bits { - LfClkOff = 1 << 0, - OutCl0 = 1 << 1, - OutCl1 = 1 << 2, - MaskOutCl = 3 << 1, - Osc = 1 << 3, - Rfo2 = 1 << 6, - Single = 1 << 7, -} - -const FIFO_LT: u8 = 1 << 4; - -#[repr(u8)] -#[derive(PartialEq, Clone, Copy, Debug)] -pub enum IOConfiguration1FIFOLt { - FifoLt32bytes = 0 << 4, - FifoLt16bytes = 1 << 4, -} - -const FIFO_LR: u8 = 1 << 5; - -#[repr(u8)] -#[derive(PartialEq, Clone, Copy, Debug)] -pub enum IOConfiguration1FIFOLr { - FifoLr64bytes = 0 << 5, - FifoLr80bytes = 1 << 5, -} - -#[repr(u8)] -#[derive(PartialEq, Clone, Copy, Debug)] -pub enum ReceiverConfiguration3Mask { - ShiftRg1Pm = 2, - MaskRg1Pm = 0x7 << 2, - ShiftRg1Am = 5, - MaskRg1Am = 0x7 << 5, -} - -#[repr(u8)] -#[derive(PartialEq, Clone, Copy, Debug)] -pub enum ReceiverConfiguration3Bits { - RgNfc = 1 << 0, - Lim = 1 << 1, - Rg1Pm0 = 1 << 2, - Rg1Pm1 = 1 << 3, - Rg1Pm2 = 1 << 4, - Rg1Am0 = 1 << 5, - Rg1Am1 = 1 << 6, - Rg1Am2 = 1 << 7, -} - -#[repr(u8)] -#[derive(PartialEq, Clone, Copy, Debug)] -pub enum ReceiverConfiguration4Mask { - ShiftRg2Pm = 0, - MaskRg2Pm = 0xf << 0, - ShiftRg2Am = 4, - MaskRg2Am = 0xf << 4, -} - -#[repr(u8)] -#[derive(PartialEq, Clone, Copy, Debug)] -pub enum ReceiverConfiguration4Bits { - Rg2Pm0 = 1 << 0, - Rg2Pm1 = 1 << 1, - Rg2Pm2 = 1 << 2, - Rg2Pm3 = 1 << 3, - Rg2Am0 = 1 << 4, - Rg2Am1 = 1 << 5, - Rg2Am2 = 1 << 6, - Rg2Am3 = 1 << 7, -} - -const AM_MOD_DEPTH_CONTROL_MASK: u8 = 0x3f << 1; -const AM_MOD_DEPTH_CONTROL_SHIFT: u8 = 1; - -#[repr(u8)] -#[derive(PartialEq, Clone, Copy, Debug)] -pub enum AMModulationDepthControlConstans { - Mod8percent = 0xb << 1, - Mod10percent = 0xe << 1, - Mod14percent = 0x14 << 1, - Mod20percent = 0x20 << 1, - Mod25percent = 0x2a << 1, - Mod30percent = 0x37 << 1, - Mod33percent = 0x3f << 1, - AmS = 1 << 7, -} - -pub const EXT_FIELD_DET_RFE_MASK: u8 = 0x0f; - -#[repr(u8)] -#[derive(PartialEq, Clone, Copy, Debug)] -pub enum ExternalFieldDetectorThresholdRfe { - RfeT0 = 1 << 0, - RfeT1 = 1 << 1, - RfeT2 = 1 << 2, - RfeT3 = 1 << 3, -} - -#[repr(u8)] -#[derive(PartialEq, Clone, Copy, Debug)] -pub enum ExternalFieldDetectorThresholdRfeVoltage { - Rfe75mV = 0x00 << 0, - Rfe105mV = 0x01 << 0, - Rfe150mV = 0x02 << 0, - Rfe205mV = 0x03 << 0, - Rfe290mV = 0x04 << 0, - Rfe400mV = 0x05 << 0, - Rfe560mV = 0x06 << 0, - Rfe800mV = 0x07 << 0, - Rfe25mV = 0x08 << 0, - Rfe33mV = 0x09 << 0, - Rfe47mV = 0x0A << 0, - Rfe64mV = 0x0B << 0, - Rfe90mV = 0x0C << 0, - Rfe125mV = 0x0D << 0, - Rfe175mV = 0x0E << 0, - Rfe250mV = 0x0F << 0, -} - -pub const EXT_FIELD_DET_TRG_MASK: u8 = 0x07 << 4; - -#[repr(u8)] -#[derive(PartialEq, Clone, Copy, Debug)] -pub enum ExternalFieldDetectorThresholdTrg { - TrgL0 = 1 << 4, - TrgL1 = 1 << 5, - TrgL2 = 1 << 6, -} - -#[repr(u8)] -#[derive(PartialEq, Clone, Copy, Debug)] -pub enum ExternalFieldDetectorThresholdTrgVoltage { - Trg75mV = 0x00 << 4, - Trg105mV = 0x01 << 4, - Trg150mV = 0x02 << 4, - Trg205mV = 0x03 << 4, - Trg290mV = 0x04 << 4, - Trg400mV = 0x05 << 4, - Trg560mV = 0x06 << 4, - Trg800mV = 0x07 << 4, -} - -#[repr(u8)] -#[derive(PartialEq, Clone, Copy, Debug)] -pub enum ICIdentityBits { - V2 = 0x09, - IcType = 1 << 3, - MaskIcType = 0x1F << 3, - ShiftIcType = 3, - MaskIcRev = 7, -} - -/* ST25R3911 direct commands */ -#[repr(u8)] -#[derive(PartialEq, Clone, Copy, Debug)] -pub(crate) enum DirectCmd { - /*< Puts the chip in default state (same as after power-up) */ - SetDefault = 0xC1, - /*< Stops all activities and clears FIFO */ - ClearFifo = 0xC2, - /*< Transmit with CRC */ - TransmitWithCrc = 0xC4, - /* Transmit without CRC */ - TransmitWithoutCrc = 0xC5, - /* Transmit REQA */ - TransmitReqa = 0xC6, - /* Transmit WUPA */ - TransmitWupa = 0xC7, - /* NFC transmit with Initial RF Collision Avoidance */ - InitialRfCollision = 0xC8, - /* NFC transmit with Response RF Collision Avoidance */ - ResponseRfCollisionN = 0xC9, - /* NFC transmit with Response RF Collision Avoidance with n=0 */ - ResponseRfCollision0 = 0xCA, - /* NFC switch to normal NFC mode */ - NormalNfcMode = 0xCB, - /* Analog Preset */ - AnalogPreset = 0xCC, - /* Mask recive data */ - MaskReceiveData = 0xD0, - /* Unmask recive data */ - UnmaskReceiveData = 0xD1, - /* Measure singal amplitude on RFI inputs */ - MeasureAmplitude = 0xD3, - /* Squelch */ - Squelch = 0xD4, - /* Clear Squelch */ - ClearSquelch = 0xD5, - /* Adjust regulators */ - AdjustRegulators = 0xD6, - /* Calibrate modulation depth */ - CalibrateModulation = 0xD7, - /* Calibrate antenna */ - CalibrateAntenna = 0xD8, - /* Measure phase between RFO and RFI signal */ - MeasurePhase = 0xD9, - /* clear RSSI bits and restart the measurement */ - ClearRssi = 0xDA, - /* Transparent mode */ - TransparentMode = 0xDC, - /* Calibrate the capacitive sensor */ - CalibrateCSensor = 0xDD, - /* Measure capacitance */ - MeasureCapacitance = 0xDE, - /* Measure power supply voltage */ - MeasureVdd = 0xDF, - /* Start the general purpose timer */ - StartGpTimer = 0xE0, - /* Start the wake-up timer */ - StartWupTimer = 0xE1, - /* Start the mask-receive timer */ - StartMaskReceiveTimer = 0xE2, - /* Start the no-repsonse timer */ - StartNoResponseTimer = 0xE3, - /* Clear Test register */ - TestCleara = 0xFA, - /* Clear Test register */ - TestClearb = 0xFB, - /* Enable R/W access to the test registers */ - TestAccess = 0xFC, - /* Load data from the poly fuses to RAM */ - LoadPprom = 0xFD, - /* Fuse poly fuses with data from the RAM */ - FusePprom = 0xFE, -} - -impl DirectCmd { - /// Get DirectCmd address - pub fn addr(self) -> u8 { - self as u8 - } -} - -#[repr(u32)] -#[derive(PartialEq, Clone, Copy, Debug)] -pub(crate) enum OperationMode { - WriteMode = 0, - ReadMode = 1u32 << 6, - FifoLoad = 2u32 << 6, - FifoRead = 0xBF, - CmdMode = 3u32 << 6, -} - -#[repr(u8)] -#[derive(PartialEq, Clone, Copy, Debug)] -pub(crate) enum NfcState { - NotInit = 0, - Idle = 1, - StartDiscovery = 2, - WakeUpMode = 3, - PollTechDetect = 10, - PollColAvoidance = 11, - PollSelect = 12, - PollActivation = 13, - ListenTechDetect = 20, - ListenColAvoidance = 21, - ListenActivation = 22, - ListenSleep = 23, - Activated = 30, - DataExchange = 31, - DataExchangeDone = 33, - Deactivation = 34, -} - -/* RFAL Bit rates */ -#[derive(PartialEq, Clone, Copy, Debug)] -pub(crate) enum BitRate { - Br106 = 0, - /* Bit Rate 106 kbit/s (fc/128) */ - Br212 = 1, - /* Bit Rate 212 kbit/s (fc/64) */ - Br424 = 2, - /* Bit Rate 424 kbit/s (fc/32) */ - Br848 = 3, - /* Bit Rate 848 kbit/s (fc/16) */ - Br1695 = 4, - /* Bit Rate 1695 kbit/s (fc/8) */ - Br3390 = 5, - /* Bit Rate 3390 kbit/s (fc/4) */ - Br6780 = 6, - /* Bit Rate 6780 kbit/s (fc/2) */ - Br13560 = 7, - /* Bit Rate 13560 kbit/s (fc) */ - Br52p97 = 0xEB, - /* Bit Rate 52.97 kbit/s (fc/256) Fast Mode VICC->VCD */ - Br26p48 = 0xEC, - /* Bit Rate 26,48 kbit/s (fc/512) NFCV VICC->VCD & VCD->VICC 1of4 */ - Br1p66 = 0xED, - /* Bit Rate 1,66 kbit/s (fc/8192) NFCV VCD->VICC 1of256 */ - BrKeep = 0xFF, - /* Value indicating to keep the same previous bit rate */ -} - -/// Compliance modes for upper modules -#[repr(u8)] -#[derive(PartialEq, Clone, Copy, Debug)] -pub(crate) enum ComplianceMode { - /// Perform with NFC Forum 1.1 compliance - Nfc, - /// Perform with EMVCo compliance - EmvCo, - /// Perform with ISO10373 compliance - Iso, -} - -#[repr(u8)] -#[derive(Debug, Copy, Clone)] -pub(crate) enum WakeUpPeriod { - Period10ms = 0x00, - Period20ms = 0x01, - Period30ms = 0x02, - Period40ms = 0x03, - Period50ms = 0x04, - Period60ms = 0x05, - Period70ms = 0x06, - Period80ms = 0x07, - Period100ms = 0x10, - Period200ms = 0x11, - Period300ms = 0x12, - Period400ms = 0x13, - Period500ms = 0x14, - Period600ms = 0x15, - Period700ms = 0x16, - Period800ms = 0x17, -} - -pub(crate) const FifoDepth: u32 = 96; -pub(crate) const CmdLen: u32 = 1; -pub(crate) const BufLen: u32 = CmdLen + FifoDepth; - -pub(crate) const OscStableTimeout: Duration = Duration::from_millis(5); \ No newline at end of file diff --git a/Software/fab-reader2/st25r3911b/src/device/iso_dep.rs b/Software/fab-reader2/st25r3911b/src/device/iso_dep.rs deleted file mode 100644 index cf79603..0000000 --- a/Software/fab-reader2/st25r3911b/src/device/iso_dep.rs +++ /dev/null @@ -1,3 +0,0 @@ -struct IsoDep { - -} \ No newline at end of file diff --git a/Software/fab-reader2/st25r3911b/src/device/mod.rs b/Software/fab-reader2/st25r3911b/src/device/mod.rs deleted file mode 100644 index 2c8fa14..0000000 --- a/Software/fab-reader2/st25r3911b/src/device/mod.rs +++ /dev/null @@ -1,94 +0,0 @@ -use std::time::Duration; -use crate::{BitRate, NfcState}; -use crate::constants::ComplianceMode; -use crate::rf::{LmConfPA, LmConfPF}; - -// TODO: Implement NFC-B, NFC-F, NFC-V, ST25TB, AP2P -mod nfca; -mod iso_dep; - -/// NFCID1 -#[derive(Debug, Clone, Copy, PartialEq, Eq)] -pub struct NfcId1 { - /// NFCID1 - pub nfcid1: [u8; 10], - /// Length of NFCID1 - pub len: u8, -} - - - -// TODO: Have th enum contain the device -#[derive(Debug, Copy, Clone, PartialEq)] -pub(crate) enum DeviceType { - ListenTypeNfcA = 0, /* NFC-A Listener device type */ - ListenTypeNfcB = 1, /* NFC-B Listener device type */ - ListenTypeNfcF = 2, /* NFC-F Listener device type */ - ListenTypeNfcV = 3, /* NFC-V Listener device type */ - ListenTypeST25TB = 4, /* ST25TB Listener device type */ - ListenTypeAp2p = 5, /* AP2P Listener device type */ - PollTypeNfcA = 10, /* NFC-A Poller device type */ - PollTypeNfcB = 11, /* NFC-B Poller device type */ - PollTypeNfcF = 12, /* NFC-F Poller device type */ - PollTypeNfcV = 13, /* NFC-V Poller device type */ - PollTypeAp2p = 15 /* AP2P Poller device type */ -} - -#[derive(Debug, Copy, Clone)] -pub(crate) enum RfInterface { - Rf = 0, /* RF Frame interface */ - IsoDep = 1, /* ISO-DEP interface */ - NfcDep = 2, /* NFC-DEP interface */ -} - -/// Device struct containing all its details -#[derive(Debug, Clone)] -pub(crate) struct Device { - /// Device type - pub device_type: DeviceType, // TODO: enum should wrap the device - /// NFCID1 - pub nfcid1: NfcId1, - /// RF interface - pub rf_interface: RfInterface, - // Protocol - // TODO: add enum for proto and implement isodep and nfcdep -} - -// TODO: Implement Wakeup Config - -/// Discovery Parameters - -#[derive(Debug, Copy, Clone)] -pub(crate) struct DiscoveryParams { - /// Compliance mode to be used - compliance_mode: ComplianceMode, - /// Number of Technologies to search for - techs_2_find: u16, - /// Duration of whole Poll + Listen Cycle - total_duration: Duration, - /// Max Number of devices - dev_limit: u8, - /// Bit rate to poll for NFC-F - poll_br: BitRate, - /// NFCID3 to be used on the ATR_REQ/ATR_RES - nfcid3: NfcId1, - /// General bytes to be used on the ATR-REQ - gb: [u8; 48], - /// Bit rate to poll for AP2P - ap2p_br: BitRate, - - /// Configuration for Passive Listen mode NFC-A - lm_conf_pa: LmConfPA, - /// Configuration for Passive Listen mode NFC-F - lm_conf_pf: LmConfPF, - - /// Callback to notify upper layer - notify_cb: fn(NfcState), - - /// Eanble Wake-Up mode before polling - wakeup_enable: bool, - /// Wake-Up mode default configuration - wakeup_cfg_default: bool, - /// Wake-Up mode configuration - wakeup_cfg: Wake -} diff --git a/Software/fab-reader2/st25r3911b/src/device/nfca.rs b/Software/fab-reader2/st25r3911b/src/device/nfca.rs deleted file mode 100644 index 1f5ca15..0000000 --- a/Software/fab-reader2/st25r3911b/src/device/nfca.rs +++ /dev/null @@ -1,58 +0,0 @@ -use super::NfcId1; - -/// NFC-A Listen device types -#[repr(u8)] -#[derive(Copy, Clone, Debug, PartialEq)] -enum ListenDeviceType { - T1T = 0x01, - T2T = 0x00, - T4T = 0x20, - NfcDep = 0x40, - T4tNfcDep = 0x60, -} - -/// SENS_RES (ATQA) format Digital 1.1 6.6.3 & Table 7 -#[derive(Copy, Clone, Debug, PartialEq)] -struct SensRes { - anti_collision_info: u8, - platform_info: u8, -} - -/// SDD_REQ (Anticollision) format Digital 1.1 6.7.1 & Table 11 -#[derive(Copy, Clone, Debug, PartialEq)] -struct SddReq { - sel_cmd: u8, - sel_par: u8, -} - -/// SDD_RES (UID CLn) format Digital 1.1 6.7.2 & Table 15 -#[derive(Copy, Clone, Debug, PartialEq)] -struct SddRes { - uid: NfcId1, - bcc: u8, -} - -/// SEL_REQ (Select) format Digital 1.1 6.8.1 & Table 17 -#[derive(Copy, Clone, Debug, PartialEq)] -struct SelReq { - sel_cmd: u8, - sel_par: u8, - uid: NfcId1, - bcc: u8, -} - -/// SEL_RES (SAK) format Digital 1.1 6.8.2 & Table 19 -#[derive(Copy, Clone, Debug, PartialEq)] -struct SelRes { - sak: u8, -} - -/// NFC-A listener device (PICC) struct -pub(crate) struct NFCAListenDevice { - device_type: ListenDeviceType, - sens_res: SensRes, - sel_res: SelRes, - nfcid1: NfcId1, - // FIXME: T1T not implemented - is_sleeping: bool, -} \ No newline at end of file diff --git a/Software/fab-reader2/st25r3911b/src/interface.rs b/Software/fab-reader2/st25r3911b/src/interface.rs deleted file mode 100644 index b738a14..0000000 --- a/Software/fab-reader2/st25r3911b/src/interface.rs +++ /dev/null @@ -1,113 +0,0 @@ -use std::time::Duration; -use embedded_hal::{ - digital::v2::*, -}; -use embedded_hal::blocking::spi::{Transfer, Write}; -use anyhow::Result; -use crate::Error; - -use crate::constants::*; - -pub(crate) struct Interface { - /// SPI - spi: SPI, - /// CS for SPI - cs: CS, - /// Low for busy - irq: IRQ, -} - -impl Interface - where - SPI: Write + Transfer, - CS: OutputPin, - IRQ: InputPin, -{ - pub fn new(spi: SPI, cs: CS, irq: IRQ) -> Self { - Interface { - spi, - cs, - irq, - } - } - - pub fn execute_cmd(&mut self, command: DirectCmd) -> Result<(), Error> { - // FIXME: Aquire Lock to Protect Comms with ST25R3911 - self.cs.set_low(); - - self.spi.write(&[command.addr() | OperationMode::CmdMode as u8])?; //FIXME: make this more generic - - self.cs.set_high(); - // FIXME: Release Lock to Protect Comms with ST25R3911 - Ok(()) - } - - pub fn write_register(&mut self, register: Register, value: u8) -> Result<(), Error> { - // FIXME: Aquire Lock to Protect Comms with ST25R3911 - self.cs.set_low(); - - self.spi.write(&[register.addr() | OperationMode::WriteMode as u8, value])?; //FIXME: make this more generic - - self.cs.set_high(); - // FIXME: Release Lock to Protect Comms with ST25R3911 - Ok(()) - } - - pub fn read_register(&mut self, register: Register) -> Result> { - // FIXME: Aquire Lock to Protect Comms with ST25R3911 - self.cs.set_low(); - - let mut buf = [register.addr() | OperationMode::ReadMode as u8, 0x00]; - - let value = self.spi.transfer(&mut buf)?; //FIXME: make this more generic - - - self.cs.set_high(); - // FIXME: Release Lock to Protect Comms with ST25R3911 - Ok(value[1]) - } - - pub fn modify_register(&mut self, register: Register, clr_mask: u8, set_mask: u8) -> Result<(), Error> { - let mut tmp = self.read_register(register)?; - tmp &= !clr_mask; - tmp |= set_mask; - self.write_register(register, tmp)?; - Ok(()) - } - - pub fn change_register_bits(&mut self, register: Register, mask: u8, value: u8) -> Result<(), Error> { - self.modify_register(register, mask, value & mask) - } - - pub fn clr_register_bits(&mut self, register: Register, mask: u8) -> Result<(), Error> { - let tmp = self.read_register(register)? & !mask; - self.write_register(register, tmp) - } - - pub fn set_register_bits(&mut self, register: Register, mask: u8) -> Result<(), Error> { - let tmp = self.read_register(register)? | mask; - self.write_register(register, tmp) - } - - pub fn check_register(&mut self, register: Register, mask: u8, value: u8) -> Result> { - let tmp = self.read_register(register)?; - Ok((tmp & mask) == value) - } - - pub fn read_multiple_registers(&mut self, register: Register, length: u8) -> Result, Error> { - // FIXME: Aquire Lock to Protect Comms with ST25R3911 - self.cs.set_low(); - - let cmd = register.addr() | OperationMode::ReadMode as u8; - - self.spi.write(&[cmd])?; //FIXME: make this more generic - - let mut buf = vec![0; length as usize]; - let value = self.spi.transfer(&mut buf)?; //FIXME: make this more generic - - - self.cs.set_high(); - // FIXME: Release Lock to Protect Comms with ST25R3911 - Ok(value.into()) - } -} \ No newline at end of file diff --git a/Software/fab-reader2/st25r3911b/src/interrupts.rs b/Software/fab-reader2/st25r3911b/src/interrupts.rs deleted file mode 100644 index 616b41c..0000000 --- a/Software/fab-reader2/st25r3911b/src/interrupts.rs +++ /dev/null @@ -1,123 +0,0 @@ -use embedded_hal::digital::v2::InputPin; -use crate::{Interface, Register}; - -#[repr(u32)] -pub enum IRQMask { - /* Main interrupt register. */ - - /* No ST25R3911 interrupt source */ - None = 0, - /* All ST25R3911 interrupt sources */ - All = 0xFFFFFF, - /* ST25R3911 oscillator stable interrupt */ - Osc = 0x80, - /* ST25R3911 FIFO water level interrupt */ - Fwl = 0x40, - /* ST25R3911 start of receive interrupt */ - Rxs = 0x20, - /* ST25R3911 end of receive interrupt */ - Rxe = 0x10, - /* ST25R3911 end of transmission interrupt */ - Txe = 0x08, - /* ST25R3911 bit collision interrupt */ - Col = 0x04, - - /* Timer and NFC interrupt register. */ - - /* ST25R3911 termination of direct command interrupt */ - Dct = 0x8000, - /* ST25R3911 no-response timer expired interrupt */ - Nre = 0x4000, - /* ST25R3911 general purpose timer expired interrupt */ - Gpe = 0x2000, - /* ST25R3911 external field on interrupt */ - Eon = 0x1000, - /* ST25R3911 external field off interrupt */ - Eof = 0x0800, - /* ST25R3911 collision during RF collision avoidance interrupt */ - Cac = 0x0400, - /* ST25R3911 minimum guard time expired interrupt */ - Cat = 0x0200, - /* ST25R3911 initiator bit rate recognized interrupt */ - Nfct = 0x0100, - - /* Error and wake-up interrupt register. */ - - /* ST25R3911 CRC error interrupt */ - Crc = 0x800000, - /* ST25R3911 parity error interrupt */ - Par = 0x400000, - /* ST25R3911 soft framing error interrupt */ - Err2 = 0x200000, - /* ST25R3911 hard framing error interrupt */ - Err1 = 0x100000, - /* ST25R3911 wake-up interrupt */ - Wt = 0x080000, - /* ST25R3911 wake-up due to amplitude interrupt */ - Wam = 0x040000, - /* ST25R3911 wake-up due to phase interrupt */ - Wph = 0x020000, - /* ST25R3911 wake-up due to capacitance measurement */ - Wcap = 0x010000, - - - /* additional interrupts in ST25R3911_REG_IRQ_TIMER_NFC */ - Tim = 0x02, - /* additional interrupts in ST25R3911_REG_IRQ_ERROR_WUP */ - Err = 0x01, -} - -type InterruptCallback = fn(&mut Interrupt); - -const INT_REGS_LEN: u8 = Register::ErrorWakeUpInterruptStatus as u8 - Register::MainInterruptStatus as u8 + 1; -//FIXME: Finish this -pub(crate) fn default_callback(interrupt: &mut Interrupt, interface: &mut Interface, irq_pin: IRQ) { - let mut iregs: [u8; INT_REGS_LEN as usize] = interface.read_register_range(Register::MainInterruptStatus, INT_REGS_LEN).unwrap(); - while irq_pin.is_high() { - iregs = interface.read_multiple_registers(Register::MainInterruptStatus, INT_REGS_LEN).unwrap().into(); - } - - // FIXME: Protect IRQ status - interrupt.status = (iregs[0] as u32) | (iregs[1] as u32) << 8 | iregs[2] << 16 as u32; -} - -pub struct Interrupt { - prevCallback: Option, - callback: Option, - status: u32, - mask: u32, -} - -//FIXME: Protect Status when writing - -impl Interrupt { - pub fn new() -> Self { - Interrupt { - prevCallback: None, - callback: None, - status: 0, - mask: 0, - } - } - pub fn modifyMask(&mut self, clr_mask: u32, set_mask: u32) { - self.mask = (self.mask & !clr_mask) | set_mask; - } - pub fn status(&self) -> u32 { - self.status - } - pub fn mask(&self) -> u32 { - self.mask - } - pub fn set_prevCallback(&mut self, prevCallback: Option) { - self.prevCallback = prevCallback; - } - pub fn set_callback(&mut self, callback: Option) { - self.callback = callback; - } - pub fn set_status(&mut self, status: u32) { - self.status = status; - } - pub fn set_mask(&mut self, mask: u32) { - self.mask = mask; - } -} \ No newline at end of file diff --git a/Software/fab-reader2/st25r3911b/src/lib.rs b/Software/fab-reader2/st25r3911b/src/lib.rs deleted file mode 100644 index b137a40..0000000 --- a/Software/fab-reader2/st25r3911b/src/lib.rs +++ /dev/null @@ -1,204 +0,0 @@ -use std::time::Duration; -use embedded_hal::blocking::spi::{Transfer, Write}; -use embedded_hal::digital::v2::OutputPin; -use embedded_hal::digital::v2::InputPin; - -use embedded_svc::timer::*; - -mod interface; -mod interrupts; -mod constants; -mod analog_config; -mod device; -mod rf; - -use crate::interface::Interface; -use crate::interrupts::{Interrupt, IRQMask}; -use crate::constants::{BitRate, DirectCmd, ICIdentityBits, IOConfiguration2Bits, NfcState, OperationControlBits, OscStableTimeout, Register, RegulatorControlBits, RegulatorControlMask}; - -/// Error -#[derive(Debug)] -pub enum Error { - /// SPI error - Spi(E), - InvalidRegister, - InvalidChipId, -} - -impl From for Error { - fn from(e: E) -> Self { - Error::Spi(e) - } -} - - -/// ST25R3911B driver -struct ST25R3911B { - // Low level interface - interface: Interface, - interrupt: Interrupt, - timer: TIMER, - // internal state - state: NfcState, - techs_found: u16, - techs_2_do: u16, - ap2p_bitrate: BitRate, - discovery_params: - -} - -impl ST25R3911B - where - SPI: Write + Transfer, - CS: OutputPin, - IRQ: InputPin, - TIMER: TimerService, Error: From<::Error>, Error: From, -{ - pub fn new(spi: SPI, cs: CS, irq: IRQ, timer_service: TIMER) -> Self { - Self { - interface: Interface::new(spi, cs, irq), - interrupt: Interrupt::new(), - timer: timer_service, - state: NfcState::NotInit, - techs_found: 0, - techs_2_do: 0, - ap2p_bitrate: BitRate::BrKeep, - } - } - - pub(crate) fn get_interrupt(&mut self, mask: IRQMask) -> Result> { - let irqs = self.interrupt.status() & mask as u32; - if irqs != IRQMask::None as u32 { - self.interrupt.set_status(self.interrupt.status() & !irqs); - } - Ok(irqs) - } - - pub(crate) fn modify_interrupts(&mut self, clr_mask: u32, set_mask: u32) -> Result<(), Error> { - self.interrupt.modifyMask(clr_mask, set_mask); - - for i in 0..2 { - if (self.interrupt.mask() >> (i * 8)) & 0xFF != 0 { - self.interface.write_register((Register::MaskMainInterrupt as u8 + i).into(), ((self.interrupt.mask() << (i * 8)) & 0xFF) as u8)?; - } - } - Ok(()) - } - - pub(crate) fn enable_interrupts(&mut self, mask: u32) -> Result<(), Error> { - self.modify_interrupts(mask, 0) - } - - pub(crate) fn disable_interrupts(&mut self, mask: u32) -> Result<(), Error> { - self.modify_interrupts(0, mask) - } - - pub(crate) fn clear_interrupts(&mut self) -> Result<(), Error> { - self.interface.read_multiple_registers(Register::MainInterruptStatus, 2)?; - self.interrupt.set_status(0); - Ok(()) - } - - pub(crate) fn wait_for_interrupts_timed(&mut self, mask: u32, timeout: Duration) -> Result> { - let mut irqs = 0; - let mut timer = self.timer.timer(|| {})?; - - timer.after(timeout); - let mut status = self.interrupt.status() & mask; - while timer.is_scheduled()? || !timeout.is_zero() && (status == 0) { - status = self.interrupt.status() & mask; - } - - status = self.interrupt.status() & mask; - - //protect irq status - self.interrupt.set_status(!status); - - Ok(12) - } - - pub(crate) fn execute_cmd_and_get_result(&mut self, command: DirectCmd, result_register: Register, sleeptime: Duration) -> Result> { - self.enable_interrupts(IRQMask::Dct as u32)?; - self.get_interrupt(IRQMask::Dct)?; - self.interface.execute_cmd(command)?; - self.wait_for_interrupts_timed(IRQMask::Dct as u32, sleeptime)?; - self.disable_interrupts(IRQMask::Dct as u32)?; - - self.interface.read_register(result_register) - } - - pub(crate) fn osc_on(&mut self) -> Result<(), Error> { - if !self.interface.check_register(Register::OperationControl, OperationControlBits::En as u8, OperationControlBits::En as u8)? { //FIXME: use traits for stuff that we cast to u8 - /* Clear any eventual previous oscillator IRQ */ - self.get_interrupt(IRQMask::Osc)?; - - /* enable oscillator frequency stable interrupt */ - self.enable_interrupts(IRQMask::Osc as u32)?; - - /* enable oscillator and regulator output */ - self.interface.modify_register(Register::OperationControl, 0x00, OperationControlBits::En as u8)?; - - /* wait for the oscillator interrupt */ - self.wait_for_interrupts_timed(IRQMask::Osc as u32, OscStableTimeout)?; - self.disable_interrupts(IRQMask::Osc as u32)?; - } - Ok(()) - } - - pub(crate) fn measure_powersupply(&mut self, mpsv: RegulatorControlBits) -> Result> { - self.interface.change_register_bits(Register::RegulatorVoltageControl, RegulatorControlMask::Mpsv as u8, mpsv as u8); - self.execute_cmd_and_get_result(DirectCmd::MeasureVdd, Register::ADCOutput, Duration::from_millis(10)) - } - - pub(crate) fn measure_voltage(&mut self, mpsv: RegulatorControlBits) -> Result> { - let result = self.measure_powersupply(mpsv)?; - let mut mV = result as u16 * 23; - mV += ((result as u16 * 438) + 500) / 1000; - Ok(mV) - } - - pub(crate) fn tx_rx_on(&mut self) -> Result<(), Error> { - self.interface.set_register_bits(Register::OperationControl, OperationControlBits::TxEn as u8 | OperationControlBits::RxEn as u8) - } - - pub(crate) fn tx_rx_off(&mut self) -> Result<(), Error> { - self.interface.clr_register_bits(Register::OperationControl, OperationControlBits::TxEn as u8 | OperationControlBits::RxEn as u8) - } - - pub fn init(&mut self) -> Result<(), Error> { - /* first, reset the st25r3911 */ - self.interface.execute_cmd(DirectCmd::SetDefault)?; - - /* Set Operation Control Register to default value */ - self.interface.write_register(Register::OperationControl, 0x00)?; - - /* enable pull downs on miso line */ - self.interface.modify_register(Register::IOConfiguration2, 0x00, IOConfiguration2Bits::MisoPd1 as u8 | IOConfiguration2Bits::MisoPd2 as u8)?; - - /* after reset all interrupts are enabled. so disable them at first */ - self.disable_interrupts(IRQMask::All as u32)?; - /* and clear them, just to be sure... */ - self.clear_interrupts()?; - - self.osc_on()?; - - /* Measure vdd and set sup3V bit accordingly */ - let vdd_mV = self.measure_voltage(RegulatorControlBits::MpsvVdd)?; - - self.interface.modify_register(Register::IOConfiguration2, IOConfiguration2Bits::Sup3V as u8, if vdd_mV < 3600 { IOConfiguration2Bits::Sup3V as u8 } else { 0 })?; - - /* Make sure Transmitter and Receiver are disabled */ - self.tx_rx_off()?; - Ok(()) - } - - pub fn check_chip_id(&mut self) -> Result> { - let chip_id = self.interface.read_register(Register::ICIdentity)?; - if (chip_id & ICIdentityBits::IcType as u8) != ICIdentityBits::IcType as u8 { - return Err(Error::InvalidChipId); - } - - Ok(chip_id & ICIdentityBits::MaskIcRev as u8) - } -} - diff --git a/Software/fab-reader2/st25r3911b/src/rf.rs b/Software/fab-reader2/st25r3911b/src/rf.rs deleted file mode 100644 index d22840d..0000000 --- a/Software/fab-reader2/st25r3911b/src/rf.rs +++ /dev/null @@ -1,30 +0,0 @@ -use crate::device::NfcId1; - -/// RFAL Listen Mode Passive A configs -#[derive(Debug, Copy, Clone, PartialEq)] -pub(crate) struct LmConfPA { - /// NFCID1 - nfcid1: NfcId1, - /// NFC-106k; SENS_REQ Response - sens_res: [u8; 2], - /// SEL_RES (SAK) with complete NFCID1 (UID) - sel_res: u8, -} - -/// RFAL Listen Mode Passive B configs -#[derive(Debug, Copy, Clone, PartialEq)] -pub(crate) struct LmConfPB { - /// SENSB_RES - sensb_res: [u8; 13], -} - -/// RFAL Listen Mode Passive F configs -#[derive(Debug, Copy, Clone, PartialEq)] -pub(crate) struct LmConfPF { - /// System Code to listen for - sc: [u8; 2], - /// SENSF_RES - sensf_res: [u8; 19], -} - -// TODO: Implement Wakeup Config \ No newline at end of file diff --git a/Software/fab-reader2/st25r3911b/src/traits.rs b/Software/fab-reader2/st25r3911b/src/traits.rs deleted file mode 100644 index e69de29..0000000