From 95060d3db984a178f5ce0b1113870e5056e3ab93 Mon Sep 17 00:00:00 2001 From: Kai Jan Kriegel Date: Sat, 15 Apr 2023 02:34:26 +0200 Subject: [PATCH] argh --- .gitmodules | 6 + Hardware/FabReader1.5/FabReader1.5.kicad_pcb | 825 ++++++ Hardware/FabReader1.5/FabReader1.5.kicad_pro | 487 ++++ Hardware/FabReader1.5/FabReader1.5.kicad_sch | 1146 ++++++++ Hardware/FabReader1.5/Library/espressif | 1 + Hardware/FabReader1.5/fp-lib-table | 4 + Hardware/FabReader1.5/kicad-libraries | 1 + Hardware/FabReader1.5/sym-lib-table | 4 + Hardware/FabReader2/FabReader2.kicad_prl | 2 + Hardware/FabReader2/FabReader2.kicad_pro | 33 +- Software/fab-reader2-c/.gitignore | 102 - Software/fab-reader2-c/main/CMakeLists.txt | 3 - Software/fab-reader2-c/main/fab-reader2.c | 102 - .../fab-reader2-c/main/pollingtagdetect.h | 21 - Software/fab-reader2/.cargo/config.toml | 34 - Software/fab-reader2/.gitignore | 200 +- Software/fab-reader2/.idea/fab-reader2.iml | 68 - .../CMakeLists.txt | 2 - Software/fab-reader2/Cargo.toml | 31 - Software/fab-reader2/build.rs | 5 - .../components/epd_266/CMakeLists.txt | 2 + .../components/epd_266/Config/DEV_Config.c | 70 + .../components/epd_266/EPD_2in66.c | 259 ++ .../epd_266/include/Config/DEV_Config.h | 94 + .../components/epd_266/include/Config/Debug.h | 26 + .../components/epd_266/include/EPD_2in66.h | 46 + .../components/epd_gfx/CMakeLists.txt | 3 + .../components/epd_gfx/Fonts/font12.c | 1384 +++++++++ .../components/epd_gfx/Fonts/font16.c | 1764 ++++++++++++ .../components/epd_gfx/Fonts/font20.c | 2142 ++++++++++++++ .../components/epd_gfx/Fonts/font24.c | 2520 +++++++++++++++++ .../components/epd_gfx/Fonts/font8.c | 1004 +++++++ .../components/epd_gfx/GUI/GUI_Paint.c | 890 ++++++ .../components/epd_gfx/include/Fonts/fonts.h | 95 + .../epd_gfx/include/GUI/GUI_Paint.h | 218 ++ .../components/rfal/CMakeLists.txt | 0 .../components/rfal/Inc/rfal_analogConfig.h | 0 .../rfal/Inc/rfal_analogConfigTbl.h | 0 .../components/rfal/Inc/rfal_chip.h | 0 .../components/rfal/Inc/rfal_crc.h | 0 .../components/rfal/Inc/rfal_dpo.h | 0 .../components/rfal/Inc/rfal_dpoTbl.h | 0 .../components/rfal/Inc/rfal_features.h | 0 .../components/rfal/Inc/rfal_iso15693_2.h | 0 .../components/rfal/Inc/rfal_isoDep.h | 0 .../components/rfal/Inc/rfal_nfc.h | 0 .../components/rfal/Inc/rfal_nfcDep.h | 0 .../components/rfal/Inc/rfal_nfca.h | 0 .../components/rfal/Inc/rfal_nfcb.h | 0 .../components/rfal/Inc/rfal_nfcf.h | 0 .../components/rfal/Inc/rfal_nfcv.h | 0 .../components/rfal/Inc/rfal_rf.h | 0 .../components/rfal/Inc/rfal_st25tb.h | 0 .../components/rfal/Inc/rfal_st25xv.h | 0 .../components/rfal/Inc/rfal_t1t.h | 0 .../components/rfal/Inc/rfal_t2t.h | 0 .../components/rfal/Inc/rfal_t4t.h | 0 .../components/rfal/Src/rfal_analogConfig.c | 0 .../components/rfal/Src/rfal_crc.c | 0 .../components/rfal/Src/rfal_dpo.c | 0 .../components/rfal/Src/rfal_iso15693_2.c | 0 .../components/rfal/Src/rfal_isoDep.c | 0 .../components/rfal/Src/rfal_nfc.c | 0 .../components/rfal/Src/rfal_nfcDep.c | 0 .../components/rfal/Src/rfal_nfca.c | 0 .../components/rfal/Src/rfal_nfcb.c | 0 .../components/rfal/Src/rfal_nfcf.c | 0 .../components/rfal/Src/rfal_nfcv.c | 0 .../components/rfal/Src/rfal_rfst25r3911.c | 0 .../components/rfal/Src/rfal_st25tb.c | 0 .../components/rfal/Src/rfal_st25xv.c | 0 .../components/rfal/Src/rfal_t1t.c | 0 .../components/rfal/Src/rfal_t2t.c | 0 .../components/rfal/Src/rfal_t4t.c | 0 .../components/st25r3911/CMakeLists.txt | 3 +- .../components/st25r3911/Release_Notes.html | 0 .../components/st25r3911/platform.h | 2 +- .../components/st25r3911/st25r3911.c | 0 .../components/st25r3911/st25r3911.h | 0 .../components/st25r3911/st25r3911_com.c | 0 .../components/st25r3911/st25r3911_com.h | 0 .../st25r3911/st25r3911_interrupt.c | 0 .../st25r3911/st25r3911_interrupt.h | 7 - .../components/st25r3911/st25r3911_spi.c | 0 .../components/st25r3911/st25r3911_spi.h | 8 - .../components/st25r3911/st_errno.h | 0 .../components/st25r3911/timer.c | 0 .../components/st25r3911/timer.h | 0 .../components/st25r3911/utils.c | 0 .../components/st25r3911/utils.h | 0 .../esp32s3.svd | 0 .../{fab-reader2-c => fab-reader2}/gdbinit | 0 Software/fab-reader2/main/CMakeLists.txt | 4 + Software/fab-reader2/main/Kconfig.projbuild | 50 + .../fab-reader2/main/epd/EPD_2in66_test.c | 160 ++ .../main/epd/FabAccess_Icon_NoHeader.c | 81 + Software/fab-reader2/main/epd/ImageData.h | 43 + Software/fab-reader2/main/epd/epd.c | 215 ++ Software/fab-reader2/main/epd/epd.h | 73 + Software/fab-reader2/main/epd/qrurn.c | 83 + Software/fab-reader2/main/fab-reader2.c | 363 +++ Software/fab-reader2/main/fab-reader2.h | 29 + .../main/idf_component.yml | 4 +- .../main/nfc}/pollingtagdetect.c | 56 +- .../fab-reader2/main/nfc/pollingtagdetect.h | 23 + Software/fab-reader2/main/nfc/rfalpoller.c | 7 + Software/fab-reader2/main/nfc/rfalpoller.h | 8 + Software/fab-reader2/main/ota/ota.c | 92 + Software/fab-reader2/main/ota/ota.h | 19 + Software/fab-reader2/out.bin | Bin 490256 -> 0 bytes Software/fab-reader2/pervasive_epd/Cargo.toml | 10 - .../pervasive_epd/src/E2266CS0Cx/command.rs | 39 - .../pervasive_epd/src/E2266CS0Cx/graphics.rs | 62 - .../pervasive_epd/src/E2266CS0Cx/mod.rs | 209 -- .../fab-reader2/pervasive_epd/src/color.rs | 79 - .../fab-reader2/pervasive_epd/src/graphics.rs | 242 -- .../pervasive_epd/src/interface.rs | 183 -- Software/fab-reader2/pervasive_epd/src/lib.rs | 37 - .../fab-reader2/pervasive_epd/src/traits.rs | 91 - Software/fab-reader2/rout.bin | Bin 395712 -> 0 bytes Software/fab-reader2/rust-toolchain.toml | 2 - .../{fab-reader2-c => fab-reader2}/sdkconfig | 22 +- Software/fab-reader2/sdkconfig.defaults | 10 - .../sdkconfig.old | 869 ++---- Software/fab-reader2/src/main.rs | 136 - Software/fab-reader2/st25r3911b/Cargo.toml | 16 - Software/fab-reader2/st25r3911b/FIXME | 0 .../st25r3911b/src/analog_config.rs | 437 --- .../fab-reader2/st25r3911b/src/constants.rs | 536 ---- .../st25r3911b/src/device/iso_dep.rs | 3 - .../fab-reader2/st25r3911b/src/device/mod.rs | 94 - .../fab-reader2/st25r3911b/src/device/nfca.rs | 58 - .../fab-reader2/st25r3911b/src/interface.rs | 113 - .../fab-reader2/st25r3911b/src/interrupts.rs | 123 - Software/fab-reader2/st25r3911b/src/lib.rs | 204 -- Software/fab-reader2/st25r3911b/src/rf.rs | 30 - Software/fab-reader2/st25r3911b/src/traits.rs | 0 137 files changed, 14669 insertions(+), 3860 deletions(-) create mode 100644 .gitmodules create mode 100644 Hardware/FabReader1.5/FabReader1.5.kicad_pcb create mode 100644 Hardware/FabReader1.5/FabReader1.5.kicad_pro create mode 100644 Hardware/FabReader1.5/FabReader1.5.kicad_sch create mode 160000 Hardware/FabReader1.5/Library/espressif create mode 100644 Hardware/FabReader1.5/fp-lib-table create mode 160000 Hardware/FabReader1.5/kicad-libraries create mode 100644 Hardware/FabReader1.5/sym-lib-table delete mode 100644 Software/fab-reader2-c/.gitignore delete mode 100644 Software/fab-reader2-c/main/CMakeLists.txt delete mode 100644 Software/fab-reader2-c/main/fab-reader2.c delete mode 100644 Software/fab-reader2-c/main/pollingtagdetect.h delete mode 100644 Software/fab-reader2/.cargo/config.toml delete mode 100644 Software/fab-reader2/.idea/fab-reader2.iml rename Software/{fab-reader2-c => fab-reader2}/CMakeLists.txt (88%) delete mode 100644 Software/fab-reader2/Cargo.toml delete mode 100644 Software/fab-reader2/build.rs create mode 100644 Software/fab-reader2/components/epd_266/CMakeLists.txt create mode 100644 Software/fab-reader2/components/epd_266/Config/DEV_Config.c create mode 100644 Software/fab-reader2/components/epd_266/EPD_2in66.c create mode 100644 Software/fab-reader2/components/epd_266/include/Config/DEV_Config.h create mode 100644 Software/fab-reader2/components/epd_266/include/Config/Debug.h create mode 100644 Software/fab-reader2/components/epd_266/include/EPD_2in66.h create mode 100644 Software/fab-reader2/components/epd_gfx/CMakeLists.txt create mode 100644 Software/fab-reader2/components/epd_gfx/Fonts/font12.c create mode 100644 Software/fab-reader2/components/epd_gfx/Fonts/font16.c create mode 100644 Software/fab-reader2/components/epd_gfx/Fonts/font20.c create mode 100644 Software/fab-reader2/components/epd_gfx/Fonts/font24.c create mode 100644 Software/fab-reader2/components/epd_gfx/Fonts/font8.c create mode 100644 Software/fab-reader2/components/epd_gfx/GUI/GUI_Paint.c create mode 100644 Software/fab-reader2/components/epd_gfx/include/Fonts/fonts.h create mode 100644 Software/fab-reader2/components/epd_gfx/include/GUI/GUI_Paint.h rename Software/{fab-reader2-c => fab-reader2}/components/rfal/CMakeLists.txt (100%) rename Software/{fab-reader2-c => fab-reader2}/components/rfal/Inc/rfal_analogConfig.h (100%) rename Software/{fab-reader2-c => fab-reader2}/components/rfal/Inc/rfal_analogConfigTbl.h (100%) rename Software/{fab-reader2-c => fab-reader2}/components/rfal/Inc/rfal_chip.h (100%) rename Software/{fab-reader2-c => fab-reader2}/components/rfal/Inc/rfal_crc.h (100%) rename Software/{fab-reader2-c => fab-reader2}/components/rfal/Inc/rfal_dpo.h (100%) rename Software/{fab-reader2-c => fab-reader2}/components/rfal/Inc/rfal_dpoTbl.h (100%) rename Software/{fab-reader2-c => fab-reader2}/components/rfal/Inc/rfal_features.h (100%) rename Software/{fab-reader2-c => fab-reader2}/components/rfal/Inc/rfal_iso15693_2.h (100%) rename Software/{fab-reader2-c => fab-reader2}/components/rfal/Inc/rfal_isoDep.h (100%) rename Software/{fab-reader2-c => fab-reader2}/components/rfal/Inc/rfal_nfc.h (100%) rename Software/{fab-reader2-c => fab-reader2}/components/rfal/Inc/rfal_nfcDep.h (100%) rename Software/{fab-reader2-c => fab-reader2}/components/rfal/Inc/rfal_nfca.h (100%) rename Software/{fab-reader2-c => fab-reader2}/components/rfal/Inc/rfal_nfcb.h (100%) rename Software/{fab-reader2-c => fab-reader2}/components/rfal/Inc/rfal_nfcf.h (100%) rename Software/{fab-reader2-c => fab-reader2}/components/rfal/Inc/rfal_nfcv.h (100%) rename Software/{fab-reader2-c => fab-reader2}/components/rfal/Inc/rfal_rf.h (100%) rename Software/{fab-reader2-c => fab-reader2}/components/rfal/Inc/rfal_st25tb.h (100%) rename Software/{fab-reader2-c => fab-reader2}/components/rfal/Inc/rfal_st25xv.h (100%) rename Software/{fab-reader2-c => fab-reader2}/components/rfal/Inc/rfal_t1t.h (100%) rename Software/{fab-reader2-c => fab-reader2}/components/rfal/Inc/rfal_t2t.h (100%) rename Software/{fab-reader2-c => fab-reader2}/components/rfal/Inc/rfal_t4t.h (100%) rename Software/{fab-reader2-c => fab-reader2}/components/rfal/Src/rfal_analogConfig.c (100%) rename Software/{fab-reader2-c => fab-reader2}/components/rfal/Src/rfal_crc.c (100%) rename Software/{fab-reader2-c => fab-reader2}/components/rfal/Src/rfal_dpo.c (100%) rename Software/{fab-reader2-c => fab-reader2}/components/rfal/Src/rfal_iso15693_2.c (100%) rename Software/{fab-reader2-c => fab-reader2}/components/rfal/Src/rfal_isoDep.c (100%) rename Software/{fab-reader2-c => fab-reader2}/components/rfal/Src/rfal_nfc.c (100%) rename Software/{fab-reader2-c => fab-reader2}/components/rfal/Src/rfal_nfcDep.c (100%) rename Software/{fab-reader2-c => fab-reader2}/components/rfal/Src/rfal_nfca.c (100%) rename Software/{fab-reader2-c => fab-reader2}/components/rfal/Src/rfal_nfcb.c (100%) rename Software/{fab-reader2-c => fab-reader2}/components/rfal/Src/rfal_nfcf.c (100%) rename Software/{fab-reader2-c => fab-reader2}/components/rfal/Src/rfal_nfcv.c (100%) rename Software/{fab-reader2-c => fab-reader2}/components/rfal/Src/rfal_rfst25r3911.c (100%) rename Software/{fab-reader2-c => fab-reader2}/components/rfal/Src/rfal_st25tb.c (100%) rename Software/{fab-reader2-c => fab-reader2}/components/rfal/Src/rfal_st25xv.c (100%) rename Software/{fab-reader2-c => fab-reader2}/components/rfal/Src/rfal_t1t.c (100%) rename Software/{fab-reader2-c => fab-reader2}/components/rfal/Src/rfal_t2t.c (100%) rename Software/{fab-reader2-c => fab-reader2}/components/rfal/Src/rfal_t4t.c (100%) rename Software/{fab-reader2-c => fab-reader2}/components/st25r3911/CMakeLists.txt (61%) rename Software/{fab-reader2-c => fab-reader2}/components/st25r3911/Release_Notes.html (100%) rename Software/{fab-reader2-c => fab-reader2}/components/st25r3911/platform.h (99%) rename Software/{fab-reader2-c => fab-reader2}/components/st25r3911/st25r3911.c (100%) rename Software/{fab-reader2-c => fab-reader2}/components/st25r3911/st25r3911.h (100%) rename Software/{fab-reader2-c => fab-reader2}/components/st25r3911/st25r3911_com.c (100%) rename Software/{fab-reader2-c => fab-reader2}/components/st25r3911/st25r3911_com.h (100%) rename Software/{fab-reader2-c => fab-reader2}/components/st25r3911/st25r3911_interrupt.c (100%) rename Software/{fab-reader2-c => fab-reader2}/components/st25r3911/st25r3911_interrupt.h (96%) rename Software/{fab-reader2-c => fab-reader2}/components/st25r3911/st25r3911_spi.c (100%) rename Software/{fab-reader2-c => fab-reader2}/components/st25r3911/st25r3911_spi.h (83%) rename Software/{fab-reader2-c => fab-reader2}/components/st25r3911/st_errno.h (100%) rename Software/{fab-reader2-c => fab-reader2}/components/st25r3911/timer.c (100%) rename Software/{fab-reader2-c => fab-reader2}/components/st25r3911/timer.h (100%) rename Software/{fab-reader2-c => fab-reader2}/components/st25r3911/utils.c (100%) rename Software/{fab-reader2-c => fab-reader2}/components/st25r3911/utils.h (100%) rename Software/{fab-reader2-c => fab-reader2}/esp32s3.svd (100%) rename Software/{fab-reader2-c => fab-reader2}/gdbinit (100%) create mode 100644 Software/fab-reader2/main/CMakeLists.txt create mode 100644 Software/fab-reader2/main/Kconfig.projbuild create mode 100644 Software/fab-reader2/main/epd/EPD_2in66_test.c create mode 100644 Software/fab-reader2/main/epd/FabAccess_Icon_NoHeader.c create mode 100644 Software/fab-reader2/main/epd/ImageData.h create mode 100644 Software/fab-reader2/main/epd/epd.c create mode 100644 Software/fab-reader2/main/epd/epd.h create mode 100644 Software/fab-reader2/main/epd/qrurn.c create mode 100644 Software/fab-reader2/main/fab-reader2.c create mode 100644 Software/fab-reader2/main/fab-reader2.h rename Software/{fab-reader2-c => fab-reader2}/main/idf_component.yml (89%) rename Software/{fab-reader2-c/main => fab-reader2/main/nfc}/pollingtagdetect.c (86%) create mode 100644 Software/fab-reader2/main/nfc/pollingtagdetect.h create mode 100644 Software/fab-reader2/main/nfc/rfalpoller.c create mode 100644 Software/fab-reader2/main/nfc/rfalpoller.h create mode 100644 Software/fab-reader2/main/ota/ota.c create mode 100644 Software/fab-reader2/main/ota/ota.h delete mode 100644 Software/fab-reader2/out.bin delete mode 100644 Software/fab-reader2/pervasive_epd/Cargo.toml delete mode 100644 Software/fab-reader2/pervasive_epd/src/E2266CS0Cx/command.rs delete mode 100644 Software/fab-reader2/pervasive_epd/src/E2266CS0Cx/graphics.rs delete mode 100644 Software/fab-reader2/pervasive_epd/src/E2266CS0Cx/mod.rs delete mode 100644 Software/fab-reader2/pervasive_epd/src/color.rs delete mode 100644 Software/fab-reader2/pervasive_epd/src/graphics.rs delete mode 100644 Software/fab-reader2/pervasive_epd/src/interface.rs delete mode 100644 Software/fab-reader2/pervasive_epd/src/lib.rs delete mode 100644 Software/fab-reader2/pervasive_epd/src/traits.rs delete mode 100644 Software/fab-reader2/rout.bin delete mode 100644 Software/fab-reader2/rust-toolchain.toml rename Software/{fab-reader2-c => fab-reader2}/sdkconfig (98%) delete mode 100644 Software/fab-reader2/sdkconfig.defaults rename Software/{fab-reader2-c => fab-reader2}/sdkconfig.old (63%) delete mode 100644 Software/fab-reader2/src/main.rs delete mode 100644 Software/fab-reader2/st25r3911b/Cargo.toml delete mode 100644 Software/fab-reader2/st25r3911b/FIXME delete mode 100644 Software/fab-reader2/st25r3911b/src/analog_config.rs delete mode 100644 Software/fab-reader2/st25r3911b/src/constants.rs delete mode 100644 Software/fab-reader2/st25r3911b/src/device/iso_dep.rs delete mode 100644 Software/fab-reader2/st25r3911b/src/device/mod.rs delete mode 100644 Software/fab-reader2/st25r3911b/src/device/nfca.rs delete mode 100644 Software/fab-reader2/st25r3911b/src/interface.rs delete mode 100644 Software/fab-reader2/st25r3911b/src/interrupts.rs delete mode 100644 Software/fab-reader2/st25r3911b/src/lib.rs delete mode 100644 Software/fab-reader2/st25r3911b/src/rf.rs delete mode 100644 Software/fab-reader2/st25r3911b/src/traits.rs 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 185435947e204c422256707ea4aee3f8e204a2a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 490256 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 z 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

?`?}jZo%TvrV6d< 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 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

UFdTK)BasN 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 HMjZKn1jkWY 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 c33d30be3a36903cafe20be711f94a0863f24ae2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 395712 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