Copy disabled (too large)
Download .txt
Showing preview only (55,483K chars total). Download the full file to get everything.
Repository: shufps/qaxe
Branch: main
Commit: be1a4a071def
Files: 346
Total size: 52.8 MB
Directory structure:
gitextract_0o2rhde6/
├── .gitignore
├── .gitmodules
├── LICENSE
├── README.md
├── case/
│ ├── back.stl
│ ├── case.stl
│ ├── grill-part1.stl
│ └── grill-part2.stl
├── firmware/
│ └── fw-L072CB/
│ ├── .cargo/
│ │ └── config.toml
│ ├── Cargo.toml
│ ├── README.md
│ ├── build.rs
│ ├── build.sh
│ ├── run.sh
│ └── src/
│ └── bin/
│ ├── blinky.rs
│ ├── protobuf/
│ │ ├── README.md
│ │ ├── coms.proto
│ │ ├── coms.rs
│ │ ├── coms_pb2.py
│ │ └── mod.rs
│ ├── qaxe.rs
│ └── uid/
│ └── mod.rs
├── legacy/
│ ├── README.md
│ ├── qaxe/
│ │ ├── bom/
│ │ │ └── ibom.html
│ │ ├── gerbers/
│ │ │ ├── qaxe-B_Cu.gbl
│ │ │ ├── qaxe-B_Mask.gbs
│ │ │ ├── qaxe-B_Paste.gbp
│ │ │ ├── qaxe-B_Silkscreen.gbo
│ │ │ ├── qaxe-Edge_Cuts.gm1
│ │ │ ├── qaxe-F_Cu.gtl
│ │ │ ├── qaxe-F_Mask.gts
│ │ │ ├── qaxe-F_Paste.gtp
│ │ │ ├── qaxe-F_Silkscreen.gto
│ │ │ ├── qaxe-In1_Cu.g2
│ │ │ ├── qaxe-In2_Cu.g3
│ │ │ ├── qaxe-NPTH.drl
│ │ │ └── qaxe-PTH.drl
│ │ └── qaxe/
│ │ ├── .gitattributes
│ │ ├── .gitignore
│ │ ├── 1366_logo.kicad_mod
│ │ ├── 3d/
│ │ │ ├── AB2_SON5x6MM.wrl
│ │ │ ├── FP1006V2-R.STEP
│ │ │ ├── KMR231GLFS.stp
│ │ │ ├── Littelfuse 0154.500DRT without value_black v2.step
│ │ │ ├── barrel-jack.step
│ │ │ ├── bm1366.step
│ │ │ ├── heatsink-13x12x5.step
│ │ │ └── lga115x.step
│ │ ├── bitaxe.kicad_sym
│ │ ├── bm1366.kicad_sch
│ │ ├── fp-lib-table
│ │ ├── ibom.config.ini
│ │ ├── pi.kicad_sch
│ │ ├── power.kicad_sch
│ │ ├── qaxe.kicad_pcb
│ │ ├── qaxe.kicad_pro
│ │ ├── qaxe.kicad_sch
│ │ ├── qaxe.pretty/
│ │ │ ├── BM1366.kicad_mod
│ │ │ ├── BarrelJack_CUI_PJ-102AH_Horizontal.kicad_mod
│ │ │ ├── CP_EIA-7343-15_Kemet-W.kicad_mod
│ │ │ ├── CP_Elec_8x10.kicad_mod
│ │ │ ├── C_0805_2012Metric.kicad_mod
│ │ │ ├── C_1206_3216Metric.kicad_mod
│ │ │ ├── C_1210_3225Metric.kicad_mod
│ │ │ ├── D_SMB.kicad_mod
│ │ │ ├── D_SOD-128.kicad_mod
│ │ │ ├── D_SOD-323.kicad_mod
│ │ │ ├── FanPinHeader_1x04_P2.54mm_Vertical.kicad_mod
│ │ │ ├── IFLR-4031GC-01-8x10.kicad_mod
│ │ │ ├── KiCad-Logo2_5mm_SilkScreen.kicad_mod
│ │ │ ├── LED_1206_3216Metric.kicad_mod
│ │ │ ├── LQFP-48_7x7mm_P0.5mm.kicad_mod
│ │ │ ├── L_Taiyo-Yuden_NR-50xx.kicad_mod
│ │ │ ├── MountingHole_3.2mm_M3.kicad_mod
│ │ │ ├── MountingHole_3.2mm_M3_Pad_Via.kicad_mod
│ │ │ ├── NetTie-2_L3_SMD_Pad0.5mm.kicad_mod
│ │ │ ├── NetTie-2_SMD_Pad0.5mm.kicad_mod
│ │ │ ├── Oscillator_SMD_EuroQuartz_XO32-4Pin_3.2x2.5mm.kicad_mod
│ │ │ ├── PinHeader_1x02_P2.54mm_Vertical.kicad_mod
│ │ │ ├── PinHeader_1x06_P1.27mm_Vertical.kicad_mod
│ │ │ ├── PinHeader_IDC_2x05_P1.27mm_Vertical_SMD.kicad_mod
│ │ │ ├── QFN-32-1EP_5x5mm_P0.5mm_EP3.45x3.45mm_ThermalVias.kicad_mod
│ │ │ ├── R_0805_2012Metric.kicad_mod
│ │ │ ├── R_1206_3216Metric.kicad_mod
│ │ │ ├── R_1210_3225Metric.kicad_mod
│ │ │ ├── R_2010_5025Metric.kicad_mod
│ │ │ ├── SOT-223-3_TabPin2.kicad_mod
│ │ │ ├── SOT-23-5.kicad_mod
│ │ │ ├── SOT-23-6.kicad_mod
│ │ │ ├── SOT-23.kicad_mod
│ │ │ ├── SOT-363_SC-70-6.kicad_mod
│ │ │ ├── TMP1075-DRL.kicad_mod
│ │ │ ├── TestPoint_Pad_2.0x2.0mm.kicad_mod
│ │ │ ├── TestPoint_Pad_D1.5mm.kicad_mod
│ │ │ ├── USB_C_Receptacle_GCT_USB4105-xx-A_16P_TopMnt_Horizontal.kicad_mod
│ │ │ ├── VSONP-8-1EP_5x6_P1.27mm.kicad_mod
│ │ │ ├── dummy.kicad_mod
│ │ │ ├── fuseholder_littlefuse_blok.kicad_mod
│ │ │ ├── polarity.kicad_mod
│ │ │ └── qaxelogo.kicad_mod
│ │ ├── qaxelogo.kicad_mod
│ │ └── sym-lib-table
│ └── qaxe+/
│ ├── bom/
│ │ └── ibom.html
│ ├── gerbers/
│ │ ├── qaxe-B_Cu.gbl
│ │ ├── qaxe-B_Mask.gbs
│ │ ├── qaxe-B_Paste.gbp
│ │ ├── qaxe-B_Silkscreen.gbo
│ │ ├── qaxe-Edge_Cuts.gm1
│ │ ├── qaxe-F_Cu.gtl
│ │ ├── qaxe-F_Mask.gts
│ │ ├── qaxe-F_Paste.gtp
│ │ ├── qaxe-F_Silkscreen.gto
│ │ ├── qaxe-In1_Cu.g2
│ │ ├── qaxe-In2_Cu.g3
│ │ ├── qaxe-NPTH.drl
│ │ └── qaxe-PTH.drl
│ └── qaxe/
│ ├── .gitattributes
│ ├── .gitignore
│ ├── 1366_logo.kicad_mod
│ ├── 3d/
│ │ ├── AB2_SON5x6MM.wrl
│ │ ├── FP1006V2-R.STEP
│ │ ├── KMR231GLFS.stp
│ │ ├── Littelfuse 0154.500DRT without value_black v2.step
│ │ ├── barrel-jack.step
│ │ ├── bm1366.step
│ │ ├── heatsink-13x12x5.step
│ │ └── lga115x.step
│ ├── bitaxe.kicad_sym
│ ├── bm1366.kicad_sch
│ ├── fp-lib-table
│ ├── ibom.config.ini
│ ├── pi.kicad_sch
│ ├── power.kicad_sch
│ ├── qaxe.kicad_pcb
│ ├── qaxe.kicad_pro
│ ├── qaxe.kicad_sch
│ ├── qaxe.pretty/
│ │ ├── BM1366.kicad_mod
│ │ ├── BarrelJack_CUI_PJ-102AH_Horizontal.kicad_mod
│ │ ├── CP_EIA-7343-15_Kemet-W.kicad_mod
│ │ ├── CP_Elec_8x10.kicad_mod
│ │ ├── C_0805_2012Metric.kicad_mod
│ │ ├── C_1206_3216Metric.kicad_mod
│ │ ├── C_1210_3225Metric.kicad_mod
│ │ ├── D_SMB.kicad_mod
│ │ ├── D_SOD-128.kicad_mod
│ │ ├── D_SOD-323.kicad_mod
│ │ ├── FanPinHeader_1x04_P2.54mm_Vertical.kicad_mod
│ │ ├── IFLR-4031GC-01-8x10.kicad_mod
│ │ ├── KiCad-Logo2_5mm_SilkScreen.kicad_mod
│ │ ├── LED_1206_3216Metric.kicad_mod
│ │ ├── LQFP-48_7x7mm_P0.5mm.kicad_mod
│ │ ├── L_Taiyo-Yuden_NR-50xx.kicad_mod
│ │ ├── MountingHole_3.2mm_M3.kicad_mod
│ │ ├── MountingHole_3.2mm_M3_Pad_Via.kicad_mod
│ │ ├── NetTie-2_L3_SMD_Pad0.5mm.kicad_mod
│ │ ├── NetTie-2_SMD_Pad0.5mm.kicad_mod
│ │ ├── Oscillator_SMD_EuroQuartz_XO32-4Pin_3.2x2.5mm.kicad_mod
│ │ ├── PinHeader_1x02_P2.54mm_Vertical.kicad_mod
│ │ ├── PinHeader_1x06_P1.27mm_Vertical.kicad_mod
│ │ ├── PinHeader_IDC_2x05_P1.27mm_Vertical_SMD.kicad_mod
│ │ ├── QFN-32-1EP_5x5mm_P0.5mm_EP3.45x3.45mm_ThermalVias.kicad_mod
│ │ ├── R_0805_2012Metric.kicad_mod
│ │ ├── R_1206_3216Metric.kicad_mod
│ │ ├── R_1210_3225Metric.kicad_mod
│ │ ├── R_2010_5025Metric.kicad_mod
│ │ ├── SOT-223-3_TabPin2.kicad_mod
│ │ ├── SOT-23-5.kicad_mod
│ │ ├── SOT-23-6.kicad_mod
│ │ ├── SOT-23.kicad_mod
│ │ ├── SOT-363_SC-70-6.kicad_mod
│ │ ├── TMP1075-DRL.kicad_mod
│ │ ├── TestPoint_Pad_2.0x2.0mm.kicad_mod
│ │ ├── TestPoint_Pad_D1.5mm.kicad_mod
│ │ ├── USB_C_Receptacle_GCT_USB4105-xx-A_16P_TopMnt_Horizontal.kicad_mod
│ │ ├── VSONP-8-1EP_5x6_P1.27mm.kicad_mod
│ │ ├── dummy.kicad_mod
│ │ ├── fuseholder_littlefuse_blok.kicad_mod
│ │ ├── polarity.kicad_mod
│ │ └── qaxelogo.kicad_mod
│ ├── qaxelogo.kicad_mod
│ └── sym-lib-table
├── nerdqaxe+/
│ ├── .gitattributes
│ ├── .gitignore
│ ├── bom/
│ │ └── ibom.html
│ ├── gerbers/
│ │ ├── nerdqaxe+-B_Cu.gbl
│ │ ├── nerdqaxe+-B_Mask.gbs
│ │ ├── nerdqaxe+-B_Paste.gbp
│ │ ├── nerdqaxe+-B_Silkscreen.gbo
│ │ ├── nerdqaxe+-Edge_Cuts.gm1
│ │ ├── nerdqaxe+-F_Cu.gtl
│ │ ├── nerdqaxe+-F_Mask.gts
│ │ ├── nerdqaxe+-F_Paste.gtp
│ │ ├── nerdqaxe+-F_Silkscreen.gto
│ │ ├── nerdqaxe+-In1_Cu.g2
│ │ ├── nerdqaxe+-In2_Cu.g3
│ │ ├── nerdqaxe+-NPTH.drl
│ │ └── nerdqaxe+-PTH.drl
│ └── nerdqaxe+/
│ ├── 3d/
│ │ ├── AB2_SON5x6MM.wrl
│ │ ├── FP1006V2-R.STEP
│ │ ├── KMR231GLFS.stp
│ │ ├── Littelfuse 0154.500DRT without value_black v2.step
│ │ ├── T-Display-S3.STEP
│ │ ├── barrel-jack.step
│ │ ├── bm1366.step
│ │ ├── heatsink-13x12x5.step
│ │ └── lga115x.step
│ ├── bitaxe.kicad_sym
│ ├── bm1366.kicad_sch
│ ├── fp-lib-table
│ ├── ibom.config.ini
│ ├── nerdqaxe+.kicad_pcb
│ ├── nerdqaxe+.kicad_pro
│ ├── nerdqaxe+.kicad_sch
│ ├── nerdqaxe+.pretty/
│ │ ├── BM1366.kicad_mod
│ │ ├── BarrelJack_CUI_PJ-102AH_Horizontal.kicad_mod
│ │ ├── CP_EIA-7343-15_Kemet-W.kicad_mod
│ │ ├── CP_Elec_8x10.kicad_mod
│ │ ├── C_0805_2012Metric.kicad_mod
│ │ ├── C_1206_3216Metric.kicad_mod
│ │ ├── C_1210_3225Metric.kicad_mod
│ │ ├── D_SMB.kicad_mod
│ │ ├── D_SOD-128.kicad_mod
│ │ ├── D_SOD-323.kicad_mod
│ │ ├── FanPinHeader_1x04_P2.54mm_Vertical.kicad_mod
│ │ ├── IFLR-4031GC-01-8x10.kicad_mod
│ │ ├── KiCad-Logo2_5mm_SilkScreen.kicad_mod
│ │ ├── LED_1206_3216Metric.kicad_mod
│ │ ├── LQFP-48_7x7mm_P0.5mm.kicad_mod
│ │ ├── L_Taiyo-Yuden_NR-50xx.kicad_mod
│ │ ├── MountingHole_3.2mm_M3.kicad_mod
│ │ ├── MountingHole_3.2mm_M3_Pad_Via.kicad_mod
│ │ ├── NetTie-2_L3_SMD_Pad0.5mm.kicad_mod
│ │ ├── NetTie-2_SMD_Pad0.5mm.kicad_mod
│ │ ├── Oscillator_SMD_EuroQuartz_XO32-4Pin_3.2x2.5mm.kicad_mod
│ │ ├── PinHeader_1x02_P2.54mm_Vertical.kicad_mod
│ │ ├── PinHeader_1x06_P1.27mm_Vertical.kicad_mod
│ │ ├── PinHeader_IDC_2x05_P1.27mm_Vertical_SMD.kicad_mod
│ │ ├── QFN-32-1EP_5x5mm_P0.5mm_EP3.45x3.45mm_ThermalVias.kicad_mod
│ │ ├── R_0805_2012Metric.kicad_mod
│ │ ├── R_1206_3216Metric.kicad_mod
│ │ ├── R_1210_3225Metric.kicad_mod
│ │ ├── R_2010_5025Metric.kicad_mod
│ │ ├── SOT-223-3_TabPin2.kicad_mod
│ │ ├── SOT-23-5.kicad_mod
│ │ ├── SOT-23-6.kicad_mod
│ │ ├── SOT-23.kicad_mod
│ │ ├── SOT-363_SC-70-6.kicad_mod
│ │ ├── TMP1075-DRL.kicad_mod
│ │ ├── TestPoint_Pad_2.0x2.0mm.kicad_mod
│ │ ├── TestPoint_Pad_D1.5mm.kicad_mod
│ │ ├── USB_C_Receptacle_GCT_USB4105-xx-A_16P_TopMnt_Horizontal.kicad_mod
│ │ ├── VSONP-8-1EP_5x6_P1.27mm.kicad_mod
│ │ ├── dummy.kicad_mod
│ │ ├── fuseholder_littlefuse_blok.kicad_mod
│ │ ├── polarity.kicad_mod
│ │ └── qaxelogo.kicad_mod
│ ├── pi.kicad_sch
│ ├── power.kicad_sch
│ └── sym-lib-table
└── nerdqaxe++/
├── bom/
│ └── ibom.html
├── gerbers/
│ ├── nerdqaxe++-B_Cu.gbl
│ ├── nerdqaxe++-B_Mask.gbs
│ ├── nerdqaxe++-B_Paste.gbp
│ ├── nerdqaxe++-B_Silkscreen.gbo
│ ├── nerdqaxe++-Edge_Cuts.gm1
│ ├── nerdqaxe++-F_Cu.gtl
│ ├── nerdqaxe++-F_Mask.gts
│ ├── nerdqaxe++-F_Paste.gtp
│ ├── nerdqaxe++-F_Silkscreen.gto
│ ├── nerdqaxe++-In1_Cu.g1
│ ├── nerdqaxe++-In2_Cu.g2
│ ├── nerdqaxe++-In3_Cu.g3
│ ├── nerdqaxe++-In4_Cu.g4
│ ├── nerdqaxe++-NPTH.drl
│ └── nerdqaxe++-PTH.drl
└── nerdqaxe++/
├── 3d/
│ ├── AB2_SON5x6MM.wrl
│ ├── DCJ250-20-B-XX-X_REVA1.step
│ ├── FP1006V2-R.STEP
│ ├── KMR231GLFS.stp
│ ├── Littelfuse 0154.500DRT without value_black v2.step
│ ├── T-Display-S3.STEP
│ ├── barrel-jack.step
│ ├── bm1366.step
│ ├── bm1370.csg
│ ├── bm1370.scad
│ ├── bm1370.step
│ ├── bm1370.wrl
│ ├── csd95472.csg
│ ├── csd95472.scad
│ ├── csd95472.wrl
│ ├── csg95472.step
│ ├── heatsink-13x12x5.step
│ └── lga115x.step
├── bm1366.kicad_sch
├── fp-lib-table
├── ibom.config.ini
├── nerdqaxe++.kicad_pcb
├── nerdqaxe++.kicad_pro
├── nerdqaxe++.kicad_sch
├── nerdqaxe++.pretty/
│ ├── BM1366.kicad_mod
│ ├── BarrelJack_CUI_PJ-102AH_Horizontal.kicad_mod
│ ├── CP_EIA-7343-15_Kemet-W.kicad_mod
│ ├── CP_Elec_8x10.kicad_mod
│ ├── C_0805_2012Metric.kicad_mod
│ ├── C_1206_3216Metric.kicad_mod
│ ├── C_1210_3225Metric.kicad_mod
│ ├── D_SMB.kicad_mod
│ ├── D_SOD-128.kicad_mod
│ ├── D_SOD-323.kicad_mod
│ ├── FanPinHeader_1x04_P2.54mm_Vertical.kicad_mod
│ ├── GCT_DCJ250-20-B-XX-X_REVA1.kicad_mod
│ ├── IFLR-4031GC-01-8x10.kicad_mod
│ ├── KiCad-Logo2_5mm_SilkScreen.kicad_mod
│ ├── LED_1206_3216Metric.kicad_mod
│ ├── LQFP-48_7x7mm_P0.5mm.kicad_mod
│ ├── L_Taiyo-Yuden_NR-50xx.kicad_mod
│ ├── MountingHole_3.2mm_M3.kicad_mod
│ ├── MountingHole_3.2mm_M3_Pad_Via.kicad_mod
│ ├── NetTie-2_L3_SMD_Pad0.5mm.kicad_mod
│ ├── NetTie-2_SMD_Pad0.5mm.kicad_mod
│ ├── Oscillator_SMD_EuroQuartz_XO32-4Pin_3.2x2.5mm.kicad_mod
│ ├── PinHeader_1x02_P2.54mm_Vertical.kicad_mod
│ ├── PinHeader_1x06_P1.27mm_Vertical.kicad_mod
│ ├── PinHeader_IDC_2x05_P1.27mm_Vertical_SMD.kicad_mod
│ ├── QFN-32-1EP_5x5mm_P0.5mm_EP3.45x3.45mm_ThermalVias.kicad_mod
│ ├── R_0805_2012Metric.kicad_mod
│ ├── R_1206_3216Metric.kicad_mod
│ ├── R_1210_3225Metric.kicad_mod
│ ├── R_2010_5025Metric.kicad_mod
│ ├── SOT-223-3_TabPin2.kicad_mod
│ ├── SOT-23-5.kicad_mod
│ ├── SOT-23-6.kicad_mod
│ ├── SOT-23.kicad_mod
│ ├── SOT-363_SC-70-6.kicad_mod
│ ├── TMP1075-DRL.kicad_mod
│ ├── TestPoint_Pad_2.0x2.0mm.kicad_mod
│ ├── TestPoint_Pad_D1.5mm.kicad_mod
│ ├── USB_C_Receptacle_GCT_USB4105-xx-A_16P_TopMnt_Horizontal.kicad_mod
│ ├── VSONP-8-1EP_5x6_P1.27mm.kicad_mod
│ ├── dummy.kicad_mod
│ ├── fuseholder_littlefuse_blok.kicad_mod
│ ├── polarity.kicad_mod
│ └── qaxelogo.kicad_mod
├── pi.kicad_sch
├── power-stage.kicad_sch
└── power.kicad_sch
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
# For PCBs designed using KiCad: https://www.kicad.org/
# Format documentation: https://kicad.org/help/file-formats/
# Temporary files
*.000
*.bak
*.bck
*.kicad_pcb-bak
*.kicad_sch-bak
*-backups
*.kicad_prl
*.sch-bak
*~
_autosave-*
*.tmp
*-save.pro
*-save.kicad_pcb
fp-info-cache
*.kicad_sch.lck
*.kicad_pcb.lck
# Netlist files (exported from Eeschema)
*.net
# Autorouter files (exported from Pcbnew)
*.dsn
*.ses
# Exported BOM files
*.xml
*.csv
*auto_saved_files*
*bak
================================================
FILE: .gitmodules
================================================
[submodule "firmware/embassy"]
path = firmware/embassy
url = https://github.com/embassy-rs/embassy
================================================
FILE: LICENSE
================================================
CERN Open Hardware Licence Version 2 - Strongly Reciprocal
Preamble
CERN has developed this licence to promote collaboration among
hardware designers and to provide a legal tool which supports the
freedom to use, study, modify, share and distribute hardware designs
and products based on those designs. Version 2 of the CERN Open
Hardware Licence comes in three variants: CERN-OHL-P (permissive); and
two reciprocal licences: CERN-OHL-W (weakly reciprocal) and this
licence, CERN-OHL-S (strongly reciprocal).
The CERN-OHL-S is copyright CERN 2020. Anyone is welcome to use it, in
unmodified form only.
Use of this Licence does not imply any endorsement by CERN of any
Licensor or their designs nor does it imply any involvement by CERN in
their development.
1 Definitions
1.1 'Licence' means this CERN-OHL-S.
1.2 'Compatible Licence' means
a) any earlier version of the CERN Open Hardware licence, or
b) any version of the CERN-OHL-S, or
c) any licence which permits You to treat the Source to which
it applies as licensed under CERN-OHL-S provided that on
Conveyance of any such Source, or any associated Product You
treat the Source in question as being licensed under
CERN-OHL-S.
1.3 'Source' means information such as design materials or digital
code which can be applied to Make or test a Product or to
prepare a Product for use, Conveyance or sale, regardless of its
medium or how it is expressed. It may include Notices.
1.4 'Covered Source' means Source that is explicitly made available
under this Licence.
1.5 'Product' means any device, component, work or physical object,
whether in finished or intermediate form, arising from the use,
application or processing of Covered Source.
1.6 'Make' means to create or configure something, whether by
manufacture, assembly, compiling, loading or applying Covered
Source or another Product or otherwise.
1.7 'Available Component' means any part, sub-assembly, library or
code which:
a) is licensed to You as Complete Source under a Compatible
Licence; or
b) is available, at the time a Product or the Source containing
it is first Conveyed, to You and any other prospective
licensees
i) as a physical part with sufficient rights and
information (including any configuration and
programming files and information about its
characteristics and interfaces) to enable it either to
be Made itself, or to be sourced and used to Make the
Product; or
ii) as part of the normal distribution of a tool used to
design or Make the Product.
1.8 'Complete Source' means the set of all Source necessary to Make
a Product, in the preferred form for making modifications,
including necessary installation and interfacing information
both for the Product, and for any included Available Components.
If the format is proprietary, it must also be made available in
a format (if the proprietary tool can create it) which is
viewable with a tool available to potential licensees and
licensed under a licence approved by the Free Software
Foundation or the Open Source Initiative. Complete Source need
not include the Source of any Available Component, provided that
You include in the Complete Source sufficient information to
enable a recipient to Make or source and use the Available
Component to Make the Product.
1.9 'Source Location' means a location where a Licensor has placed
Covered Source, and which that Licensor reasonably believes will
remain easily accessible for at least three years for anyone to
obtain a digital copy.
1.10 'Notice' means copyright, acknowledgement and trademark notices,
Source Location references, modification notices (subsection
3.3(b)) and all notices that refer to this Licence and to the
disclaimer of warranties that are included in the Covered
Source.
1.11 'Licensee' or 'You' means any person exercising rights under
this Licence.
1.12 'Licensor' means a natural or legal person who creates or
modifies Covered Source. A person may be a Licensee and a
Licensor at the same time.
1.13 'Convey' means to communicate to the public or distribute.
2 Applicability
2.1 This Licence governs the use, copying, modification, Conveying
of Covered Source and Products, and the Making of Products. By
exercising any right granted under this Licence, You irrevocably
accept these terms and conditions.
2.2 This Licence is granted by the Licensor directly to You, and
shall apply worldwide and without limitation in time.
2.3 You shall not attempt to restrict by contract or otherwise the
rights granted under this Licence to other Licensees.
2.4 This Licence is not intended to restrict fair use, fair dealing,
or any other similar right.
3 Copying, Modifying and Conveying Covered Source
3.1 You may copy and Convey verbatim copies of Covered Source, in
any medium, provided You retain all Notices.
3.2 You may modify Covered Source, other than Notices, provided that
You irrevocably undertake to make that modified Covered Source
available from a Source Location should You Convey a Product in
circumstances where the recipient does not otherwise receive a
copy of the modified Covered Source. In each case subsection 3.3
shall apply.
You may only delete Notices if they are no longer applicable to
the corresponding Covered Source as modified by You and You may
add additional Notices applicable to Your modifications.
Including Covered Source in a larger work is modifying the
Covered Source, and the larger work becomes modified Covered
Source.
3.3 You may Convey modified Covered Source (with the effect that You
shall also become a Licensor) provided that You:
a) retain Notices as required in subsection 3.2;
b) add a Notice to the modified Covered Source stating that You
have modified it, with the date and brief description of how
You have modified it;
c) add a Source Location Notice for the modified Covered Source
if You Convey in circumstances where the recipient does not
otherwise receive a copy of the modified Covered Source; and
d) license the modified Covered Source under the terms and
conditions of this Licence (or, as set out in subsection
8.3, a later version, if permitted by the licence of the
original Covered Source). Such modified Covered Source must
be licensed as a whole, but excluding Available Components
contained in it, which remain licensed under their own
applicable licences.
4 Making and Conveying Products
You may Make Products, and/or Convey them, provided that You either
provide each recipient with a copy of the Complete Source or ensure
that each recipient is notified of the Source Location of the Complete
Source. That Complete Source is Covered Source, and You must
accordingly satisfy Your obligations set out in subsection 3.3. If
specified in a Notice, the Product must visibly and securely display
the Source Location on it or its packaging or documentation in the
manner specified in that Notice.
5 Research and Development
You may Convey Covered Source, modified Covered Source or Products to
a legal entity carrying out development, testing or quality assurance
work on Your behalf provided that the work is performed on terms which
prevent the entity from both using the Source or Products for its own
internal purposes and Conveying the Source or Products or any
modifications to them to any person other than You. Any modifications
made by the entity shall be deemed to be made by You pursuant to
subsection 3.2.
6 DISCLAIMER AND LIABILITY
6.1 DISCLAIMER OF WARRANTY -- The Covered Source and any Products
are provided 'as is' and any express or implied warranties,
including, but not limited to, implied warranties of
merchantability, of satisfactory quality, non-infringement of
third party rights, and fitness for a particular purpose or use
are disclaimed in respect of any Source or Product to the
maximum extent permitted by law. The Licensor makes no
representation that any Source or Product does not or will not
infringe any patent, copyright, trade secret or other
proprietary right. The entire risk as to the use, quality, and
performance of any Source or Product shall be with You and not
the Licensor. This disclaimer of warranty is an essential part
of this Licence and a condition for the grant of any rights
granted under this Licence.
6.2 EXCLUSION AND LIMITATION OF LIABILITY -- The Licensor shall, to
the maximum extent permitted by law, have no liability for
direct, indirect, special, incidental, consequential, exemplary,
punitive or other damages of any character including, without
limitation, procurement of substitute goods or services, loss of
use, data or profits, or business interruption, however caused
and on any theory of contract, warranty, tort (including
negligence), product liability or otherwise, arising in any way
in relation to the Covered Source, modified Covered Source
and/or the Making or Conveyance of a Product, even if advised of
the possibility of such damages, and You shall hold the
Licensor(s) free and harmless from any liability, costs,
damages, fees and expenses, including claims by third parties,
in relation to such use.
7 Patents
7.1 Subject to the terms and conditions of this Licence, each
Licensor hereby grants to You a perpetual, worldwide,
non-exclusive, no-charge, royalty-free, irrevocable (except as
stated in subsections 7.2 and 8.4) patent licence to Make, have
Made, use, offer to sell, sell, import, and otherwise transfer
the Covered Source and Products, where such licence applies only
to those patent claims licensable by such Licensor that are
necessarily infringed by exercising rights under the Covered
Source as Conveyed by that Licensor.
7.2 If You institute patent litigation against any entity (including
a cross-claim or counterclaim in a lawsuit) alleging that the
Covered Source or a Product constitutes direct or contributory
patent infringement, or You seek any declaration that a patent
licensed to You under this Licence is invalid or unenforceable
then any rights granted to You under this Licence shall
terminate as of the date such process is initiated.
8 General
8.1 If any provisions of this Licence are or subsequently become
invalid or unenforceable for any reason, the remaining
provisions shall remain effective.
8.2 You shall not use any of the name (including acronyms and
abbreviations), image, or logo by which the Licensor or CERN is
known, except where needed to comply with section 3, or where
the use is otherwise allowed by law. Any such permitted use
shall be factual and shall not be made so as to suggest any kind
of endorsement or implication of involvement by the Licensor or
its personnel.
8.3 CERN may publish updated versions and variants of this Licence
which it considers to be in the spirit of this version, but may
differ in detail to address new problems or concerns. New
versions will be published with a unique version number and a
variant identifier specifying the variant. If the Licensor has
specified that a given variant applies to the Covered Source
without specifying a version, You may treat that Covered Source
as being released under any version of the CERN-OHL with that
variant. If no variant is specified, the Covered Source shall be
treated as being released under CERN-OHL-S. The Licensor may
also specify that the Covered Source is subject to a specific
version of the CERN-OHL or any later version in which case You
may apply this or any later version of CERN-OHL with the same
variant identifier published by CERN.
8.4 This Licence shall terminate with immediate effect if You fail
to comply with any of its terms and conditions.
8.5 However, if You cease all breaches of this Licence, then Your
Licence from any Licensor is reinstated unless such Licensor has
terminated this Licence by giving You, while You remain in
breach, a notice specifying the breach and requiring You to cure
it within 30 days, and You have failed to come into compliance
in all material respects by the end of the 30 day period. Should
You repeat the breach after receipt of a cure notice and
subsequent reinstatement, this Licence will terminate
immediately and permanently. Section 6 shall continue to apply
after any termination.
8.6 This Licence shall not be enforceable except by a Licensor
acting as such, and third party beneficiary rights are
specifically excluded.
================================================
FILE: README.md
================================================
# NerdQ Hardware Repository
This repository contains multiple generations of small-scale Bitcoin miner hardware designs.
## NerdQAxe++
<img src="https://github.com/user-attachments/assets/e4ff81a3-103d-487d-b92c-4151bf7aecff" width="600px">
Current high-performance design based on 4× BM1370 ASICs.
<img src="https://github.com/user-attachments/assets/e59b47c3-221b-4ca1-80bd-fd26008c72ec" width="300px">
- ~4.8 TH/s at ~76 W (~15.8 J/TH)
- Previous stable version (that was used for most NQ++): [rev5.1](https://github.com/shufps/qaxe/releases/tag/rev5.1)
- Latest: [rev5.1.2](https://github.com/shufps/qaxe/releases/tag/rev5.1.2)*
*: contains some [improvements](https://github.com/shufps/qaxe/pull/31) but is untested yet.
## NerdQAxe+
<img src="https://github.com/user-attachments/assets/9e9a51d5-f22e-4789-9750-17623fee1ff3" width="600px">
Design based on 4x BM1368 ASICs.
- ~2.5TH/s at ~55 W (~22 J/TH)
- Latest revision 5.0
## Firmware for NQ+ and NQ++
The latest version can be found here:
https://github.com/shufps/ESP-Miner-NerdQAxePlus
## Legacy Designs
The following designs are **end of life** and no longer supported:
- QAxe+
- QAxe
They are provided for reference, documentation, and historical reasons only.
**No support, fixes, or updates will be provided for legacy designs.**
See `legacy/README.md` for full documentation of deprecated hardware.
---
## Compatible Replacement Parts
### For NerdQAxe++
- 25 MHz Oscillator
Original: IQD LFSPXO076024
Replacement: Taitien OXLTDLJANF-25.000000
### For NerdQAxe++ and NerdQAxe+
- 0.8 V LDO
Original: Microchip MCP1824T-0802E-OT
Replacement: TI TPS78408QDBVRQ1
================================================
FILE: firmware/fw-L072CB/.cargo/config.toml
================================================
[target.'cfg(all(target_arch = "arm", target_os = "none"))']
# replace your chip as listed in `probe-rs chip list`
runner = "probe-rs run --chip STM32L072CBTx"
[build]
target = "thumbv6m-none-eabi"
[env]
DEFMT_LOG = "trace"
================================================
FILE: firmware/fw-L072CB/Cargo.toml
================================================
[package]
edition = "2021"
name = "embassy-stm32l1-examples"
version = "0.1.0"
license = "MIT OR Apache-2.0"
[dependencies]
embassy-sync = { version = "0.5.0", path = "../embassy/embassy-sync", features = ["defmt"] }
embassy-executor = { version = "0.5.0", path = "../embassy/embassy-executor", features = ["arch-cortex-m", "executor-thread", "defmt", "integrated-timers"] }
embassy-time = { version = "0.3", path = "../embassy/embassy-time", features = ["defmt", "defmt-timestamp-uptime", "tick-hz-32_768"] }
embassy-stm32 = { version = "0.1.0", path = "../embassy/embassy-stm32", features = [ "defmt", "stm32l072cb", "time-driver-tim3", "memory-x"] }
embassy-usb = { version = "0.1.0", path = "../embassy/embassy-usb", features = ["defmt"] }
critical-section = "1.1"
defmt = "0.3"
defmt-rtt = "0.4"
cortex-m = { version = "0.7.6", features = ["inline-asm", "critical-section-single-core"] }
cortex-m-rt = "0.7.0"
embedded-hal = "0.2.6"
panic-probe = { version = "0.3", features = ["print-defmt"] }
futures = { version = "0.3.17", default-features = false, features = ["async-await"] }
heapless = { version = "0.8", default-features = false }
embedded-storage = "0.3.1"
quick-protobuf = { version = "0.8.1", default-features = false }
alloc-cortex-m = "0.4.4"
embedded-io-async = { version = "0.6.1" }
#static_cell = { version = "2.0.0" }
[profile.release]
debug = 2
================================================
FILE: firmware/fw-L072CB/README.md
================================================
needed for compiling:
```
rustup target add thumbv6m-none-eabi
```
================================================
FILE: firmware/fw-L072CB/build.rs
================================================
fn main() {
println!("cargo:rustc-link-arg-bins=--nmagic");
println!("cargo:rustc-link-arg-bins=-Tlink.x");
println!("cargo:rustc-link-arg-bins=-Tdefmt.x");
}
================================================
FILE: firmware/fw-L072CB/build.sh
================================================
#!/bin/bash
DEFMT_LOG=info cargo build --release --bin qaxe
================================================
FILE: firmware/fw-L072CB/run.sh
================================================
#!/bin/bash
DEFMT_LOG=info cargo run --release --bin qaxe
================================================
FILE: firmware/fw-L072CB/src/bin/blinky.rs
================================================
#![no_std]
#![no_main]
use defmt::*;
use embassy_executor::Spawner;
use embassy_stm32::gpio::{Level, Output, Speed};
use embassy_time::Timer;
use {defmt_rtt as _, panic_probe as _};
#[embassy_executor::main]
async fn main(_spawner: Spawner) {
//let p = embassy_stm32::init(Default::default());
info!("Hello World!");
//let mut led = Output::new(p.PB5, Level::High, Speed::Low);
loop {
info!("high");
// led.set_high();
Timer::after_millis(300).await;
info!("low");
// led.set_low();
Timer::after_millis(300).await;
}
}
================================================
FILE: firmware/fw-L072CB/src/bin/protobuf/README.md
================================================
for rust:
```
pb-rs --nostd coms.proto
```
for python:
```
protoc --python_out=. coms.proto
```
================================================
FILE: firmware/fw-L072CB/src/bin/protobuf/coms.proto
================================================
// Filename: coms.proto
syntax = "proto3";
message QRequest {
int32 id = 1;
int32 op = 2;
bytes data = 3;
}
message QResponse {
int32 id = 1;
int32 error = 2;
bytes data = 3;
}
message QControl {
int32 state_1v2 = 1;
int32 pwm1 = 2;
int32 pwm2 = 3;
}
message QState {
int32 pgood_1v2 = 1;
int32 temp1 = 2;
int32 temp2 = 3;
}
================================================
FILE: firmware/fw-L072CB/src/bin/protobuf/coms.rs
================================================
// Automatically generated rust module for 'coms.proto' file
#![allow(non_snake_case)]
#![allow(non_upper_case_globals)]
#![allow(non_camel_case_types)]
#![allow(unused_imports)]
#![allow(unknown_lints)]
#![allow(clippy::all)]
#![cfg_attr(rustfmt, rustfmt_skip)]
use alloc::vec::Vec;
use alloc::borrow::Cow;
use quick_protobuf::{MessageInfo, MessageRead, MessageWrite, BytesReader, Writer, WriterBackend, Result};
use quick_protobuf::sizeofs::*;
use super::*;
#[allow(clippy::derive_partial_eq_without_eq)]
#[derive(Debug, Default, PartialEq, Clone)]
pub struct QRequest<'a> {
pub id: i32,
pub op: i32,
pub data: Cow<'a, [u8]>,
}
impl<'a> MessageRead<'a> for QRequest<'a> {
fn from_reader(r: &mut BytesReader, bytes: &'a [u8]) -> Result<Self> {
let mut msg = Self::default();
while !r.is_eof() {
match r.next_tag(bytes) {
Ok(8) => msg.id = r.read_int32(bytes)?,
Ok(16) => msg.op = r.read_int32(bytes)?,
Ok(26) => msg.data = r.read_bytes(bytes).map(Cow::Borrowed)?,
Ok(t) => { r.read_unknown(bytes, t)?; }
Err(e) => return Err(e),
}
}
Ok(msg)
}
}
impl<'a> MessageWrite for QRequest<'a> {
fn get_size(&self) -> usize {
0
+ if self.id == 0i32 { 0 } else { 1 + sizeof_varint(*(&self.id) as u64) }
+ if self.op == 0i32 { 0 } else { 1 + sizeof_varint(*(&self.op) as u64) }
+ if self.data == Cow::Borrowed(b"") { 0 } else { 1 + sizeof_len((&self.data).len()) }
}
fn write_message<W: WriterBackend>(&self, w: &mut Writer<W>) -> Result<()> {
if self.id != 0i32 { w.write_with_tag(8, |w| w.write_int32(*&self.id))?; }
if self.op != 0i32 { w.write_with_tag(16, |w| w.write_int32(*&self.op))?; }
if self.data != Cow::Borrowed(b"") { w.write_with_tag(26, |w| w.write_bytes(&**&self.data))?; }
Ok(())
}
}
#[allow(clippy::derive_partial_eq_without_eq)]
#[derive(Debug, Default, PartialEq, Clone)]
pub struct QResponse<'a> {
pub id: i32,
pub error: i32,
pub data: Cow<'a, [u8]>,
}
impl<'a> MessageRead<'a> for QResponse<'a> {
fn from_reader(r: &mut BytesReader, bytes: &'a [u8]) -> Result<Self> {
let mut msg = Self::default();
while !r.is_eof() {
match r.next_tag(bytes) {
Ok(8) => msg.id = r.read_int32(bytes)?,
Ok(16) => msg.error = r.read_int32(bytes)?,
Ok(26) => msg.data = r.read_bytes(bytes).map(Cow::Borrowed)?,
Ok(t) => { r.read_unknown(bytes, t)?; }
Err(e) => return Err(e),
}
}
Ok(msg)
}
}
impl<'a> MessageWrite for QResponse<'a> {
fn get_size(&self) -> usize {
0
+ if self.id == 0i32 { 0 } else { 1 + sizeof_varint(*(&self.id) as u64) }
+ if self.error == 0i32 { 0 } else { 1 + sizeof_varint(*(&self.error) as u64) }
+ if self.data == Cow::Borrowed(b"") { 0 } else { 1 + sizeof_len((&self.data).len()) }
}
fn write_message<W: WriterBackend>(&self, w: &mut Writer<W>) -> Result<()> {
if self.id != 0i32 { w.write_with_tag(8, |w| w.write_int32(*&self.id))?; }
if self.error != 0i32 { w.write_with_tag(16, |w| w.write_int32(*&self.error))?; }
if self.data != Cow::Borrowed(b"") { w.write_with_tag(26, |w| w.write_bytes(&**&self.data))?; }
Ok(())
}
}
#[allow(clippy::derive_partial_eq_without_eq)]
#[derive(Debug, Default, PartialEq, Clone)]
pub struct QControl {
pub state_1v2: i32,
pub pwm1: i32,
pub pwm2: i32,
}
impl<'a> MessageRead<'a> for QControl {
fn from_reader(r: &mut BytesReader, bytes: &'a [u8]) -> Result<Self> {
let mut msg = Self::default();
while !r.is_eof() {
match r.next_tag(bytes) {
Ok(8) => msg.state_1v2 = r.read_int32(bytes)?,
Ok(16) => msg.pwm1 = r.read_int32(bytes)?,
Ok(24) => msg.pwm2 = r.read_int32(bytes)?,
Ok(t) => { r.read_unknown(bytes, t)?; }
Err(e) => return Err(e),
}
}
Ok(msg)
}
}
impl MessageWrite for QControl {
fn get_size(&self) -> usize {
0
+ if self.state_1v2 == 0i32 { 0 } else { 1 + sizeof_varint(*(&self.state_1v2) as u64) }
+ if self.pwm1 == 0i32 { 0 } else { 1 + sizeof_varint(*(&self.pwm1) as u64) }
+ if self.pwm2 == 0i32 { 0 } else { 1 + sizeof_varint(*(&self.pwm2) as u64) }
}
fn write_message<W: WriterBackend>(&self, w: &mut Writer<W>) -> Result<()> {
if self.state_1v2 != 0i32 { w.write_with_tag(8, |w| w.write_int32(*&self.state_1v2))?; }
if self.pwm1 != 0i32 { w.write_with_tag(16, |w| w.write_int32(*&self.pwm1))?; }
if self.pwm2 != 0i32 { w.write_with_tag(24, |w| w.write_int32(*&self.pwm2))?; }
Ok(())
}
}
#[allow(clippy::derive_partial_eq_without_eq)]
#[derive(Debug, Default, PartialEq, Clone)]
pub struct QState {
pub pgood_1v2: i32,
pub temp1: i32,
pub temp2: i32,
}
impl<'a> MessageRead<'a> for QState {
fn from_reader(r: &mut BytesReader, bytes: &'a [u8]) -> Result<Self> {
let mut msg = Self::default();
while !r.is_eof() {
match r.next_tag(bytes) {
Ok(8) => msg.pgood_1v2 = r.read_int32(bytes)?,
Ok(16) => msg.temp1 = r.read_int32(bytes)?,
Ok(24) => msg.temp2 = r.read_int32(bytes)?,
Ok(t) => { r.read_unknown(bytes, t)?; }
Err(e) => return Err(e),
}
}
Ok(msg)
}
}
impl MessageWrite for QState {
fn get_size(&self) -> usize {
0
+ if self.pgood_1v2 == 0i32 { 0 } else { 1 + sizeof_varint(*(&self.pgood_1v2) as u64) }
+ if self.temp1 == 0i32 { 0 } else { 1 + sizeof_varint(*(&self.temp1) as u64) }
+ if self.temp2 == 0i32 { 0 } else { 1 + sizeof_varint(*(&self.temp2) as u64) }
}
fn write_message<W: WriterBackend>(&self, w: &mut Writer<W>) -> Result<()> {
if self.pgood_1v2 != 0i32 { w.write_with_tag(8, |w| w.write_int32(*&self.pgood_1v2))?; }
if self.temp1 != 0i32 { w.write_with_tag(16, |w| w.write_int32(*&self.temp1))?; }
if self.temp2 != 0i32 { w.write_with_tag(24, |w| w.write_int32(*&self.temp2))?; }
Ok(())
}
}
================================================
FILE: firmware/fw-L072CB/src/bin/protobuf/coms_pb2.py
================================================
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: coms.proto
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
from google.protobuf import reflection as _reflection
from google.protobuf import symbol_database as _symbol_database
# @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default()
DESCRIPTOR = _descriptor.FileDescriptor(
name='coms.proto',
package='',
syntax='proto3',
serialized_options=None,
create_key=_descriptor._internal_create_key,
serialized_pb=b'\n\ncoms.proto\"0\n\x08QRequest\x12\n\n\x02id\x18\x01 \x01(\x05\x12\n\n\x02op\x18\x02 \x01(\x05\x12\x0c\n\x04\x64\x61ta\x18\x03 \x01(\x0c\"4\n\tQResponse\x12\n\n\x02id\x18\x01 \x01(\x05\x12\r\n\x05\x65rror\x18\x02 \x01(\x05\x12\x0c\n\x04\x64\x61ta\x18\x03 \x01(\x0c\"9\n\x08QControl\x12\x11\n\tstate_1v2\x18\x01 \x01(\x05\x12\x0c\n\x04pwm1\x18\x02 \x01(\x05\x12\x0c\n\x04pwm2\x18\x03 \x01(\x05\"9\n\x06QState\x12\x11\n\tpgood_1v2\x18\x01 \x01(\x05\x12\r\n\x05temp1\x18\x02 \x01(\x05\x12\r\n\x05temp2\x18\x03 \x01(\x05\x62\x06proto3'
)
_QREQUEST = _descriptor.Descriptor(
name='QRequest',
full_name='QRequest',
filename=None,
file=DESCRIPTOR,
containing_type=None,
create_key=_descriptor._internal_create_key,
fields=[
_descriptor.FieldDescriptor(
name='id', full_name='QRequest.id', index=0,
number=1, type=5, cpp_type=1, label=1,
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key),
_descriptor.FieldDescriptor(
name='op', full_name='QRequest.op', index=1,
number=2, type=5, cpp_type=1, label=1,
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key),
_descriptor.FieldDescriptor(
name='data', full_name='QRequest.data', index=2,
number=3, type=12, cpp_type=9, label=1,
has_default_value=False, default_value=b"",
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key),
],
extensions=[
],
nested_types=[],
enum_types=[
],
serialized_options=None,
is_extendable=False,
syntax='proto3',
extension_ranges=[],
oneofs=[
],
serialized_start=14,
serialized_end=62,
)
_QRESPONSE = _descriptor.Descriptor(
name='QResponse',
full_name='QResponse',
filename=None,
file=DESCRIPTOR,
containing_type=None,
create_key=_descriptor._internal_create_key,
fields=[
_descriptor.FieldDescriptor(
name='id', full_name='QResponse.id', index=0,
number=1, type=5, cpp_type=1, label=1,
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key),
_descriptor.FieldDescriptor(
name='error', full_name='QResponse.error', index=1,
number=2, type=5, cpp_type=1, label=1,
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key),
_descriptor.FieldDescriptor(
name='data', full_name='QResponse.data', index=2,
number=3, type=12, cpp_type=9, label=1,
has_default_value=False, default_value=b"",
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key),
],
extensions=[
],
nested_types=[],
enum_types=[
],
serialized_options=None,
is_extendable=False,
syntax='proto3',
extension_ranges=[],
oneofs=[
],
serialized_start=64,
serialized_end=116,
)
_QCONTROL = _descriptor.Descriptor(
name='QControl',
full_name='QControl',
filename=None,
file=DESCRIPTOR,
containing_type=None,
create_key=_descriptor._internal_create_key,
fields=[
_descriptor.FieldDescriptor(
name='state_1v2', full_name='QControl.state_1v2', index=0,
number=1, type=5, cpp_type=1, label=1,
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key),
_descriptor.FieldDescriptor(
name='pwm1', full_name='QControl.pwm1', index=1,
number=2, type=5, cpp_type=1, label=1,
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key),
_descriptor.FieldDescriptor(
name='pwm2', full_name='QControl.pwm2', index=2,
number=3, type=5, cpp_type=1, label=1,
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key),
],
extensions=[
],
nested_types=[],
enum_types=[
],
serialized_options=None,
is_extendable=False,
syntax='proto3',
extension_ranges=[],
oneofs=[
],
serialized_start=118,
serialized_end=175,
)
_QSTATE = _descriptor.Descriptor(
name='QState',
full_name='QState',
filename=None,
file=DESCRIPTOR,
containing_type=None,
create_key=_descriptor._internal_create_key,
fields=[
_descriptor.FieldDescriptor(
name='pgood_1v2', full_name='QState.pgood_1v2', index=0,
number=1, type=5, cpp_type=1, label=1,
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key),
_descriptor.FieldDescriptor(
name='temp1', full_name='QState.temp1', index=1,
number=2, type=5, cpp_type=1, label=1,
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key),
_descriptor.FieldDescriptor(
name='temp2', full_name='QState.temp2', index=2,
number=3, type=5, cpp_type=1, label=1,
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key),
],
extensions=[
],
nested_types=[],
enum_types=[
],
serialized_options=None,
is_extendable=False,
syntax='proto3',
extension_ranges=[],
oneofs=[
],
serialized_start=177,
serialized_end=234,
)
DESCRIPTOR.message_types_by_name['QRequest'] = _QREQUEST
DESCRIPTOR.message_types_by_name['QResponse'] = _QRESPONSE
DESCRIPTOR.message_types_by_name['QControl'] = _QCONTROL
DESCRIPTOR.message_types_by_name['QState'] = _QSTATE
_sym_db.RegisterFileDescriptor(DESCRIPTOR)
QRequest = _reflection.GeneratedProtocolMessageType('QRequest', (_message.Message,), {
'DESCRIPTOR' : _QREQUEST,
'__module__' : 'coms_pb2'
# @@protoc_insertion_point(class_scope:QRequest)
})
_sym_db.RegisterMessage(QRequest)
QResponse = _reflection.GeneratedProtocolMessageType('QResponse', (_message.Message,), {
'DESCRIPTOR' : _QRESPONSE,
'__module__' : 'coms_pb2'
# @@protoc_insertion_point(class_scope:QResponse)
})
_sym_db.RegisterMessage(QResponse)
QControl = _reflection.GeneratedProtocolMessageType('QControl', (_message.Message,), {
'DESCRIPTOR' : _QCONTROL,
'__module__' : 'coms_pb2'
# @@protoc_insertion_point(class_scope:QControl)
})
_sym_db.RegisterMessage(QControl)
QState = _reflection.GeneratedProtocolMessageType('QState', (_message.Message,), {
'DESCRIPTOR' : _QSTATE,
'__module__' : 'coms_pb2'
# @@protoc_insertion_point(class_scope:QState)
})
_sym_db.RegisterMessage(QState)
# @@protoc_insertion_point(module_scope)
================================================
FILE: firmware/fw-L072CB/src/bin/protobuf/mod.rs
================================================
// Automatically generated mod.rs
pub mod coms;
================================================
FILE: firmware/fw-L072CB/src/bin/qaxe.rs
================================================
#![no_std]
#![no_main]
use core::option::Option::Some;
use defmt::{panic, *};
use defmt_rtt as _; // global logger
use embassy_executor::Spawner;
use embassy_stm32::gpio::{Input, Level, Output, OutputType, Pull, Speed};
use embassy_stm32::i2c;
use embassy_stm32::i2c::I2c;
use embassy_stm32::rcc::*;
use embassy_stm32::time::{khz, Hertz};
use embassy_stm32::timer::simple_pwm::{PwmPin, SimplePwm};
use embassy_stm32::timer::Channel as PWMChannel;
use embassy_stm32::usart::BufferedUart;
use embassy_stm32::usb::{Driver, Instance};
use embassy_stm32::{bind_interrupts, peripherals, usart, usb, Config};
use embassy_sync::blocking_mutex::raw::{CriticalSectionRawMutex, ThreadModeRawMutex};
use embassy_sync::channel::Channel;
use embassy_sync::mutex::Mutex;
use embassy_sync::signal::Signal;
use embassy_time::Timer;
use embedded_io_async::Read;
use embassy_stm32::rcc::mux::Clk48sel;
mod uid;
use embassy_stm32::timer::low_level::OutputPolarity;
use embassy_usb::class::cdc_acm::{CdcAcmClass, State};
use embassy_usb::driver::EndpointError;
use embassy_usb::Builder;
use embedded_io_async::Write;
use futures::future::join4;
use panic_probe as _;
extern crate alloc;
extern crate alloc_cortex_m;
mod protobuf;
use protobuf::coms::{QControl, QRequest, QResponse, QState};
use quick_protobuf::{self, MessageWrite};
use alloc::borrow::Cow;
use alloc_cortex_m::CortexMHeap;
#[global_allocator]
static ALLOCATOR: CortexMHeap = CortexMHeap::empty();
bind_interrupts!(struct Irqs {
USB => usb::InterruptHandler<peripherals::USB>;
USART1 => usart::BufferedInterruptHandler<peripherals::USART1>;
I2C2 => i2c::EventInterruptHandler<peripherals::I2C2>, i2c::ErrorInterruptHandler<peripherals::I2C2>;
});
use embassy_stm32::peripherals::*;
#[derive(PartialEq)]
enum ResetManagerCommand {
Reset,
Shutdown,
}
static RESET_MANAGER_SIGNAL: Signal<CriticalSectionRawMutex, ResetManagerCommand> = Signal::new();
static PGOOD: Mutex<ThreadModeRawMutex, bool> = Mutex::new(false);
static TEMP1: Mutex<ThreadModeRawMutex, u16> = Mutex::new(0u16);
static TEMP2: Mutex<ThreadModeRawMutex, u16> = Mutex::new(0u16);
struct PWMControl {
pwm1_value: u16,
pwm2_value: u16,
}
static PWM_CTRL_CHANNEL: Channel<ThreadModeRawMutex, PWMControl, 1> = Channel::new();
const RX_BUF_SIZE : usize = 256;
const TX_BUF_SIZE : usize = 256;
#[embassy_executor::main]
async fn main(spawner: Spawner) {
info!("Hello World!");
// Initialize the allocator before using it
let start = cortex_m_rt::heap_start() as usize;
let size = 1024;
unsafe { ALLOCATOR.init(start, size) }
let mut config = Config::default();
config.rcc.hsi48 = Some(Hsi48Config {
sync_from_usb: true,
}); // needed for USB
config.rcc.sys = Sysclk::PLL1_R;
config.rcc.hsi = true;
config.rcc.pll = Some(Pll {
source: PllSource::HSI,
div: PllDiv::DIV3,
mul: PllMul::MUL6,
});
config.rcc.mux.clk48sel = Clk48sel::HSI48;
let p = embassy_stm32::init(config);
let driver = Driver::new(p.USB, Irqs, p.PA12, p.PA11);
// Create embassy-usb Config
let mut config = embassy_usb::Config::new(0xc0de, 0xcaff);
config.max_packet_size_0 = 64;
config.manufacturer = Some("Microengineer");
config.product = Some("Qaxe");
config.serial_number = Some(uid::uid_hex());
config.self_powered = true;
// Required for windows compatibility.
// https://developer.nordicsemi.com/nRF_Connect_SDK/doc/1.9.1/kconfig/CONFIG_CDC_ACM_IAD.html#help
config.device_class = 0xEF;
config.device_sub_class = 0x02;
config.device_protocol = 0x01;
config.composite_with_iads = true;
// Create embassy-usb DeviceBuilder using the driver and config.
// It needs some buffers for building the descriptors.
let mut config_descriptor = [0; 256];
let mut bos_descriptor = [0; 256];
let mut control_buf = [0; 64];
let mut state_usb_asic = State::new();
let mut state_usb_ctrl = State::new();
let mut builder = Builder::new(
driver,
config,
&mut config_descriptor,
&mut bos_descriptor,
&mut [], // no msos descriptors
&mut control_buf,
);
// Create classes on the builder.
let class_usb_asic = CdcAcmClass::new(&mut builder, &mut state_usb_asic, 64);
let (mut sender, mut receiver) = class_usb_asic.split();
let mut class_usb_ctrl = CdcAcmClass::new(&mut builder, &mut state_usb_ctrl, 64);
// Build the builder.
let mut usb = builder.build();
let mut config = usart::Config::default();
config.baudrate = 115200;
let mut tx_buf = [0u8; TX_BUF_SIZE];
let mut rx_buf = [0u8; RX_BUF_SIZE];
let usart = BufferedUart::new(p.USART1, Irqs, p.PA10, p.PA9, &mut tx_buf, &mut rx_buf, config).unwrap();
let (mut tx_ctrl, mut rx_ctrl) = usart.split();
// Run the USB device.
let usb_fut = usb.run();
let run_1v2 = Output::new(p.PA2, Level::Low, Speed::Low);
let pgood_1v2 = Input::new(p.PA3, Pull::None);
let pgood_led = Output::new(p.PA5, Level::High, Speed::Low);
let mut activity_led = Output::new(p.PA4, Level::High, Speed::Low);
// init ldo_en with low
let ldo_en = Output::new(p.PA7, Level::Low, Speed::Low);
let reset = Output::new(p.PB13, Level::High, Speed::Low);
let ch1 = PwmPin::new_ch1(p.PA0, OutputType::PushPull);
let ch2 = PwmPin::new_ch2(p.PA1, OutputType::PushPull);
let mut pwm1 = SimplePwm::new(
p.TIM2,
Some(ch1),
Some(ch2),
None,
None,
khz(10),
Default::default(),
);
pwm1.set_polarity(PWMChannel::Ch1, OutputPolarity::ActiveHigh);
pwm1.set_polarity(PWMChannel::Ch2, OutputPolarity::ActiveHigh);
pwm1.set_duty(PWMChannel::Ch1, pwm1.get_max_duty());
pwm1.set_duty(PWMChannel::Ch2, pwm1.get_max_duty());
pwm1.enable(PWMChannel::Ch1);
pwm1.enable(PWMChannel::Ch2);
let mut i2c_config = embassy_stm32::i2c::Config::default();
i2c_config.scl_pullup = true;
i2c_config.sda_pullup = true;
let i2c = I2c::new(
p.I2C2,
p.PB10,
p.PB11,
Irqs,
p.DMA1_CH4,
p.DMA1_CH5,
Hertz(100_000),
i2c_config, /*Default::default()*/
);
unwrap!(spawner.spawn(reset_manager(run_1v2, reset, ldo_en)));
unwrap!(spawner.spawn(power_good_task(pgood_1v2, pgood_led)));
unwrap!(spawner.spawn(pwm_manager(pwm1)));
unwrap!(spawner.spawn(temp_manager(i2c)));
let protobuf_rpc_fut = async {
loop {
class_usb_ctrl.wait_connection().await;
info!("Connected");
let _ = json_rpc(&mut class_usb_ctrl).await;
info!("Disconnected");
}
};
let relay_receiver_fut = async {
loop {
let mut usb_buf = [0; 64];
receiver.wait_connection().await;
info!("Connected relay receiver");
loop {
let usb_read = match receiver.read_packet(&mut usb_buf).await {
Ok(n) => n,
Err(e) => {
error!("Error reading from USB: {:?}", e);
break;
}
};
if usb_read == 0 {
continue; // No data read, continue the loop
}
debug!("USB -> USART: {:x}", &usb_buf[..usb_read]);
if let Err(e) = tx_ctrl.write_all(&usb_buf[..usb_read]).await {
error!("Error writing to USART: {:?}", e);
break;
}
}
}
};
let relay_sender_fut = async {
loop {
sender.wait_connection().await;
info!("Connected relay sender");
let mut toggle = 0;
let mut num_bytes = 0;
let mut received = [0u8;11];
let preample = [0xaa, 0x55];
loop {
let mut byte = [0u8;1];
match rx_ctrl.read_exact(&mut byte).await {
Ok(_) => (),
Err(e) => {
error!("Error reading from USART: {:?}", e);
}
};
received[num_bytes] = byte[0];
// try to sync on serial data
match num_bytes {
0 | 1 => // wait for 0xaa 0x55
if received[num_bytes] != preample[num_bytes] {
debug!("unexpected start of serial data, trying to resync ...");
num_bytes = 0;
continue;
},
_ => {},
};
num_bytes += 1;
if num_bytes != 11 {
continue;
}
num_bytes = 0;
// toggle led with each response received
toggle = 1 - toggle;
match toggle {
0 => activity_led.set_high(),
1 => activity_led.set_low(),
_ => {}
};
debug!("USART -> USB: {:x}", &received[..]);
if let Err(e) = sender.write_packet(&received[..]).await {
error!("Error writing to USB: {:?}", e);
break;
}
}
}
};
let _ = join4(
usb_fut,
protobuf_rpc_fut,
relay_receiver_fut,
relay_sender_fut,
)
.await;
}
#[embassy_executor::task]
async fn power_good_task(pgood_1v2: Input<'static>, mut pgood_led: Output<'static>) {
loop {
let mut pgood_state = PGOOD.lock().await;
if pgood_1v2.is_high() {
*pgood_state = true;
pgood_led.set_low();
} else {
*pgood_state = false;
pgood_led.set_high();
}
drop(pgood_state);
Timer::after_millis(500).await;
}
}
#[embassy_executor::task]
async fn reset_manager(mut run_1v2: Output<'static>, mut reset: Output<'static>, mut ldo_en: Output<'static>) {
loop {
let signal = RESET_MANAGER_SIGNAL.wait().await;
match signal {
ResetManagerCommand::Reset => {
info!("reset triggered!");
// switch off all LDOs and assert reset
run_1v2.set_low();
ldo_en.set_low();
reset.set_high();
Timer::after_millis(250).await;
// switch on LDOs
ldo_en.set_high();
Timer::after_millis(100).await;
// switch on buck
run_1v2.set_high();
Timer::after_millis(250).await;
// deassert reset
reset.set_low();
Timer::after_millis(250).await;
}
ResetManagerCommand::Shutdown => {
info!("shutdown triggered!");
// switch off all LDOs and assert reset
run_1v2.set_low();
ldo_en.set_low();
reset.set_high();
}
}
}
}
#[embassy_executor::task]
async fn pwm_manager(mut pwm1: SimplePwm<'static, TIM2>) {
loop {
let pwm = PWM_CTRL_CHANNEL.receive().await;
let max_duty = pwm1.get_max_duty() as u32;
for i in 0..2 {
let (channel, value) = match i {
0 => (PWMChannel::Ch1, pwm.pwm1_value),
1 => (PWMChannel::Ch2, pwm.pwm2_value),
_ => (PWMChannel::Ch3, 0),
};
let duty = max_duty * value as u32 / 100;
info!("pwm{}: {}, max: {}", i, duty, max_duty);
pwm1.set_duty(
channel,
if duty <= max_duty {
duty
} else {
max_duty
},
);
}
Timer::after_millis(500).await;
}
}
struct Disconnected {}
impl From<EndpointError> for Disconnected {
fn from(val: EndpointError) -> Self {
match val {
EndpointError::BufferOverflow => panic!("Buffer overflow"),
EndpointError::Disabled => Disconnected {},
}
}
}
enum Errors {
None = 0,
InvalidCommand = 1,
ErrorDeserializingRequest = 2,
ErrorSerializingResponse = 3,
ErrorDeserializingRequestData = 4,
ErrorSerializingResponseData = 5,
}
impl Errors {
fn to_string(error: &Errors) -> &'static str {
match error {
Errors::InvalidCommand => "invalid command",
Errors::ErrorDeserializingRequest => "error deserializing request",
Errors::ErrorSerializingResponse => "error serializing response",
Errors::ErrorDeserializingRequestData => "error deserializing request data",
Errors::ErrorSerializingResponseData => "error serializing response data",
_ => "unknown error",
}
}
}
enum Commands {
Nop = 0,
Control = 1,
Status = 2,
Reset = 3,
Shutdown = 4,
}
impl Commands {
fn from_i32(value: i32) -> Option<Commands> {
match value {
0 => Some(Commands::Nop),
1 => Some(Commands::Control),
2 => Some(Commands::Status),
3 => Some(Commands::Reset),
4 => Some(Commands::Shutdown),
_ => None,
}
}
}
impl QResponse<'_> {
fn default() -> QResponse<'static> {
QResponse {
id: 0,
error: 0,
data: Cow::Borrowed(&[0u8]),
}
}
}
// The response_bytes should be a mutable slice of u8, not a slice of a mutable slice.
async fn process_request<'a>(
request: &QRequest<'_>,
response: &mut QResponse<'_>,
) -> Result<usize, Errors> {
let mut response_data = [0u8; 32];
let mut response_len = 0;
let error = Errors::None as i32;
let op = Commands::from_i32(request.op);
if op.is_none() {
return Err(Errors::InvalidCommand);
}
match op.unwrap() {
Commands::Nop => {
// nop
}
Commands::Control => {
let cmd: QControl = quick_protobuf::deserialize_from_slice(&request.data)
.map_err(|_| Errors::ErrorDeserializingRequestData)?;
info!(
"received ctrl command with parameters state_1v2: {}, pwm1: {}, pwm2: {}",
cmd.state_1v2, cmd.pwm1, cmd.pwm2
);
PWM_CTRL_CHANNEL
.send(PWMControl {
pwm1_value: cmd.pwm1 as u16,
pwm2_value: cmd.pwm2 as u16,
})
.await;
}
Commands::Status => {
info!("status");
// get current power state
let pgood_state = PGOOD.lock().await;
let temp1 = TEMP1.lock().await;
let temp1_data = *temp1;
let temp2 = TEMP2.lock().await;
let temp2_data = *temp2;
let state = QState {
pgood_1v2: *pgood_state as i32,
temp1: temp1_data as i32,
temp2: temp2_data as i32,
};
drop(pgood_state);
drop(temp1);
drop(temp2);
response_len = state.get_size() + 1 /* varint */;
debug!("response-len: {}", response_len);
quick_protobuf::serialize_into_slice(&state, &mut response_data[..])
.map_err(|_| Errors::ErrorSerializingResponseData)?;
}
Commands::Reset => RESET_MANAGER_SIGNAL.signal(ResetManagerCommand::Reset),
Commands::Shutdown => RESET_MANAGER_SIGNAL.signal(ResetManagerCommand::Shutdown),
};
response.id = request.id;
response.error = error;
response.data = Cow::Owned(response_data[..response_len].to_vec());
debug!(
"response.id: {}, response.error:{}, response.data: {:?}",
response.id,
response.error,
response_data[..response_len]
);
Ok(response_len)
}
async fn json_rpc<'d, T: Instance + 'd>(
class: &mut CdcAcmClass<'d, Driver<'d, T>>,
) -> Result<(), Disconnected> {
let mut request_bytes = [0u8; 64];
let mut response_bytes = [0u8; 64];
loop {
let n = class.read_packet(&mut request_bytes).await?;
let mut response = QResponse::default();
let request = match quick_protobuf::deserialize_from_slice(&request_bytes[..n]) {
Ok(req) => Some(req),
Err(_) => {
error!("{}", Errors::to_string(&Errors::ErrorDeserializingRequest));
response = QResponse::default();
response.error = Errors::ErrorDeserializingRequest as i32;
None
}
};
// if request is some then we can process the request
if request.is_some() {
if let Err(e) = process_request(&request.unwrap(), &mut response).await {
error!("{}", Errors::to_string(&e));
response = QResponse::default();
response.error = e as i32;
}
}
let serialized_len = response.get_size() + 1 /* varint */;
if quick_protobuf::serialize_into_slice(&response, &mut response_bytes).is_err() {
error!("{}", Errors::to_string(&Errors::ErrorSerializingResponse));
continue;
}
class
.write_packet(&response_bytes[..serialized_len])
.await?;
}
}
#[embassy_executor::task]
async fn temp_manager(mut i2c: I2c<'static, I2C2, DMA1_CH4, DMA1_CH5>) {
loop {
Timer::after_millis(5000).await;
for i in 0..2 {
let mut data = [0u8; 2];
if let Err(e) = i2c.read(0x48 + i, &mut data).await {
error!("i2c error: {:?}", e);
continue;
}
let mut temp_data = ((data[0] as u16) << 4) | ((data[1] as u16) >> 4);
if temp_data > 2047 {
temp_data -= 4096
}
info!("read temp{}: {}", i + 1, temp_data);
if i == 0 {
let mut temp1 = TEMP1.lock().await;
*temp1 = temp_data;
} else {
let mut temp2 = TEMP2.lock().await;
*temp2 = temp_data;
}
}
}
}
================================================
FILE: firmware/fw-L072CB/src/bin/uid/mod.rs
================================================
use critical_section;
const BASE_ADDRESS: usize = 0x1FF80050;
const OFFSETS: [usize; 3] = [0x00, 0x04, 0x14];
/// Read a 32-bit value from the given address.
fn read_u32_at_address(address: *const u32) -> u32 {
unsafe { address.read_volatile() }
}
/// Get the unique 96-bit ID as an array of 12 bytes.
fn uid() -> [u8; 12] {
let mut uid_bytes = [0u8; 12];
let uids = [
read_u32_at_address((BASE_ADDRESS + OFFSETS[0]) as *const u32),
read_u32_at_address((BASE_ADDRESS + OFFSETS[1]) as *const u32),
read_u32_at_address((BASE_ADDRESS + OFFSETS[2]) as *const u32),
];
// Convert each u32 to bytes and store them in uid_bytes
for (i, &word) in uids.iter().enumerate() {
let word = word.to_be(); // Convert to big-endian
uid_bytes[i * 4] = (word >> 24) as u8;
uid_bytes[i * 4 + 1] = (word >> 16) as u8;
uid_bytes[i * 4 + 2] = (word >> 8) as u8;
uid_bytes[i * 4 + 3] = word as u8;
}
uid_bytes
}
/// Get this device's unique 96-bit ID, encoded into a string of 24 hexadecimal ASCII digits.
pub fn uid_hex() -> &'static str {
unsafe { core::str::from_utf8_unchecked(uid_hex_bytes()) }
}
/// Get this device's unique 96-bit ID, encoded into 24 hexadecimal ASCII bytes.
pub fn uid_hex_bytes() -> &'static [u8; 24] {
const HEX: &[u8; 16] = b"0123456789ABCDEF";
static mut UID_HEX: [u8; 24] = [0; 24];
static mut LOADED: bool = false;
critical_section::with(|_| unsafe {
if !LOADED {
let uid = uid();
for (idx, v) in uid.iter().enumerate() {
let lo = v & 0x0f;
let hi = (v & 0xf0) >> 4;
UID_HEX[idx * 2] = HEX[hi as usize];
UID_HEX[idx * 2 + 1] = HEX[lo as usize];
}
LOADED = true;
}
});
unsafe { &*core::ptr::addr_of!(UID_HEX) }
}
================================================
FILE: legacy/README.md
================================================
# Legacy Hardware Designs
⚠️ **Status: End of Support**
This directory contains deprecated hardware designs that are no longer maintained.
- No bug fixes
- No hardware revisions
- No firmware updates
- No user support
The designs are provided **as-is** for reference and historical documentation.
---
## QAxe+
<img src="https://github.com/shufps/qaxe/assets/3079832/79d25550-ae5b-4eae-92bb-4ff231449e13" width="600px">
Quad-BM1368 miner.
- ~2.4 TH/s at ~55 W (230 V measured)
- Final revisions: rev4 / rev4.1
- Known quirks with ASIC reset behavior
---
## QAxe

Quad-BM1366 miner.
- ~1.7–1.8 TH/s depending on revision
- Multiple early hardware revisions (rev1–rev3.2)
Notes:
- Boards with BOOT button require STM32L072CB
- USB DFU bootloader recommended for flashing
---
Firmware & Tooling
=====================
Legacy firmware, build instructions, and tooling are preserved for completeness.
They may require outdated dependencies and are not guaranteed to work on modern systems.
## Compilation (Bootloader or CMSIS-DAP) (QAxe, QAxe+)
### Dockered compilation and flashing
There is a wonderfull Docker based single-script compilation and flash tool for the QAxe Firmware:
https://github.com/AnimaI/QAxe-Docker-Bootloader
### Manual compilation and installation
```bash
# install curl
sudo apt install curl
# install rust
curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf | sh
# add to ~/.bash.rc (afterwards, opening a new terminal is needed)
echo 'source "$HOME/.cargo/env"' >> ~/.bashrc
# clone repository
git clone https://github.com/shufps/qaxe
# clone submodules
cd qaxe
git submodule init
git submodule update
# add rust target for STM32L0 variants
rustup target add thumbv6m-none-eabi
# or add rust target for STM32L1 variants
#rustup target add thumbv7m-none-eabi
# build firmware for L072
cd firmware/fw-L072CB
./build.sh
```
### Installation via USB Bootloader on board with `BOOT` button (QAxe, QAxe+)
The STM32L072CB variant has an integrated DFU Bootloader that starts when pressing the `BOOT` button during reset.
Afterwards the firmware can be flashed via `dfu-utils`:
```bash
# install cargo-binutils and llvm tools
cargo install cargo-binutils
rustup component add llvm-tools-preview
# create the firmware.bin
DEFMT_LOG=info cargo objcopy --release --bin qaxe -- -O binary qaxe.bin
# install dfu-utils
sudo apt-get install dfu-util
now start the stm32 in DFU mode by pressing `boot` (only works with the STM32L072CB variant)
# after booting, list the devices
dfu-util --list
# flash the binary
dfu-util -a 0 -s 0x08000000:leave -D qaxe.bin
```
Mining Client (QAxe, QAxe+)
=============

Stratum Mining Client:<br>
https://github.com/shufps/piaxe-miner
---
## Disclaimer
These designs are **not recommended for new builds**.
If you are looking for a supported and actively developed project, refer to the main repository README.
================================================
FILE: legacy/qaxe/bom/ibom.html
================================================
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Interactive BOM for KiCAD</title>
<style type="text/css">
:root {
--pcb-edge-color: black;
--pad-color: #878787;
--pad-hole-color: #CCCCCC;
--pad-color-highlight: #D04040;
--pad-color-highlight-both: #D0D040;
--pad-color-highlight-marked: #44a344;
--pin1-outline-color: #ffb629;
--pin1-outline-color-highlight: #ffb629;
--pin1-outline-color-highlight-both: #fcbb39;
--pin1-outline-color-highlight-marked: #fdbe41;
--silkscreen-edge-color: #aa4;
--silkscreen-polygon-color: #4aa;
--silkscreen-text-color: #4aa;
--fabrication-edge-color: #907651;
--fabrication-polygon-color: #907651;
--fabrication-text-color: #a27c24;
--track-color: #def5f1;
--track-color-highlight: #D04040;
--zone-color: #def5f1;
--zone-color-highlight: #d0404080;
}
html,
body {
margin: 0px;
height: 100%;
font-family: Verdana, sans-serif;
}
.dark.topmostdiv {
--pcb-edge-color: #eee;
--pad-color: #808080;
--pin1-outline-color: #ffa800;
--pin1-outline-color-highlight: #ccff00;
--track-color: #42524f;
--zone-color: #42524f;
background-color: #252c30;
color: #eee;
}
button {
background-color: #eee;
border: 1px solid #888;
color: black;
height: 44px;
width: 44px;
text-align: center;
text-decoration: none;
display: inline-block;
font-size: 14px;
font-weight: bolder;
}
.dark button {
/* This will be inverted */
background-color: #c3b7b5;
}
button.depressed {
background-color: #0a0;
color: white;
}
.dark button.depressed {
/* This will be inverted */
background-color: #b3b;
}
button:focus {
outline: 0;
}
button#tb-btn {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8.47 8.47'%3E%3Crect transform='translate(0 -288.53)' ry='1.17' y='288.8' x='.27' height='7.94' width='7.94' fill='%23f9f9f9'/%3E%3Cg transform='translate(0 -288.53)'%3E%3Crect width='7.94' height='7.94' x='.27' y='288.8' ry='1.17' fill='none' stroke='%23000' stroke-width='.4' stroke-linejoin='round'/%3E%3Cpath d='M1.32 290.12h5.82M1.32 291.45h5.82' fill='none' stroke='%23000' stroke-width='.4'/%3E%3Cpath d='M4.37 292.5v4.23M.26 292.63H8.2' fill='none' stroke='%23000' stroke-width='.3'/%3E%3Ctext font-weight='700' font-size='3.17' font-family='sans-serif'%3E%3Ctspan x='1.35' y='295.73'%3EF%3C/tspan%3E%3Ctspan x='5.03' y='295.68'%3EB%3C/tspan%3E%3C/text%3E%3C/g%3E%3C/svg%3E%0A");
}
button#lr-btn {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8.47 8.47'%3E%3Crect transform='translate(0 -288.53)' ry='1.17' y='288.8' x='.27' height='7.94' width='7.94' fill='%23f9f9f9'/%3E%3Cg transform='translate(0 -288.53)'%3E%3Crect width='7.94' height='7.94' x='.27' y='288.8' ry='1.17' fill='none' stroke='%23000' stroke-width='.4' stroke-linejoin='round'/%3E%3Cpath d='M1.06 290.12H3.7m-2.64 1.33H3.7m-2.64 1.32H3.7m-2.64 1.3H3.7m-2.64 1.33H3.7' fill='none' stroke='%23000' stroke-width='.4'/%3E%3Cpath d='M4.37 288.8v7.94m0-4.11h3.96' fill='none' stroke='%23000' stroke-width='.3'/%3E%3Ctext font-weight='700' font-size='3.17' font-family='sans-serif'%3E%3Ctspan x='5.11' y='291.96'%3EF%3C/tspan%3E%3Ctspan x='5.03' y='295.68'%3EB%3C/tspan%3E%3C/text%3E%3C/g%3E%3C/svg%3E%0A");
}
button#bom-btn {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8.47 8.47'%3E%3Crect transform='translate(0 -288.53)' ry='1.17' y='288.8' x='.27' height='7.94' width='7.94' fill='%23f9f9f9'/%3E%3Cg transform='translate(0 -288.53)' fill='none' stroke='%23000' stroke-width='.4'%3E%3Crect width='7.94' height='7.94' x='.27' y='288.8' ry='1.17' stroke-linejoin='round'/%3E%3Cpath d='M1.59 290.12h5.29M1.59 291.45h5.33M1.59 292.75h5.33M1.59 294.09h5.33M1.59 295.41h5.33'/%3E%3C/g%3E%3C/svg%3E");
}
button#bom-grouped-btn {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Cg stroke='%23000' stroke-linejoin='round' class='layer'%3E%3Crect width='29' height='29' x='1.5' y='1.5' stroke-width='2' fill='%23fff' rx='5' ry='5'/%3E%3Cpath stroke-linecap='square' stroke-width='2' d='M6 10h4m4 0h5m4 0h3M6.1 22h3m3.9 0h5m4 0h4m-16-8h4m4 0h4'/%3E%3Cpath stroke-linecap='null' d='M5 17.5h22M5 26.6h22M5 5.5h22'/%3E%3C/g%3E%3C/svg%3E");
}
button#bom-ungrouped-btn {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Cg stroke='%23000' stroke-linejoin='round' class='layer'%3E%3Crect width='29' height='29' x='1.5' y='1.5' stroke-width='2' fill='%23fff' rx='5' ry='5'/%3E%3Cpath stroke-linecap='square' stroke-width='2' d='M6 10h4m-4 8h3m-3 8h4'/%3E%3Cpath stroke-linecap='null' d='M5 13.5h22m-22 8h22M5 5.5h22'/%3E%3C/g%3E%3C/svg%3E");
}
button#bom-netlist-btn {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Cg fill='none' stroke='%23000' class='layer'%3E%3Crect width='29' height='29' x='1.5' y='1.5' stroke-width='2' fill='%23fff' rx='5' ry='5'/%3E%3Cpath stroke-width='2' d='M6 26l6-6v-8m13.8-6.3l-6 6v8'/%3E%3Ccircle cx='11.8' cy='9.5' r='2.8' stroke-width='2'/%3E%3Ccircle cx='19.8' cy='22.8' r='2.8' stroke-width='2'/%3E%3C/g%3E%3C/svg%3E");
}
button#copy {
background-image: url("data:image/svg+xml,%3Csvg height='48' viewBox='0 0 48 48' width='48' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0 0h48v48h-48z' fill='none'/%3E%3Cpath d='M32 2h-24c-2.21 0-4 1.79-4 4v28h4v-28h24v-4zm6 8h-22c-2.21 0-4 1.79-4 4v28c0 2.21 1.79 4 4 4h22c2.21 0 4-1.79 4-4v-28c0-2.21-1.79-4-4-4zm0 32h-22v-28h22v28z'/%3E%3C/svg%3E");
background-position: 6px 6px;
background-repeat: no-repeat;
background-size: 26px 26px;
border-radius: 6px;
height: 40px;
width: 40px;
margin: 10px 5px;
}
button#copy:active {
box-shadow: inset 0px 0px 5px #6c6c6c;
}
textarea.clipboard-temp {
position: fixed;
top: 0;
left: 0;
width: 2em;
height: 2em;
padding: 0;
border: None;
outline: None;
box-shadow: None;
background: transparent;
}
.left-most-button {
border-right: 0;
border-top-left-radius: 6px;
border-bottom-left-radius: 6px;
}
.middle-button {
border-right: 0;
}
.right-most-button {
border-top-right-radius: 6px;
border-bottom-right-radius: 6px;
}
.button-container {
font-size: 0;
margin: 0.4rem 0.4rem 0.4rem 0;
}
.dark .button-container {
filter: invert(1);
}
.button-container button {
background-size: 32px 32px;
background-position: 5px 5px;
background-repeat: no-repeat;
}
@media print {
.hideonprint {
display: none;
}
}
canvas {
cursor: crosshair;
}
canvas:active {
cursor: grabbing;
}
.fileinfo {
width: 100%;
max-width: 1000px;
border: none;
padding: 3px;
}
.fileinfo .title {
font-size: 20pt;
font-weight: bold;
}
.fileinfo td {
overflow: hidden;
white-space: nowrap;
max-width: 1px;
width: 50%;
text-overflow: ellipsis;
}
.bom {
border-collapse: collapse;
font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;
font-size: 10pt;
table-layout: fixed;
width: 100%;
margin-top: 1px;
position: relative;
}
.bom th,
.bom td {
border: 1px solid black;
padding: 5px;
word-wrap: break-word;
text-align: center;
position: relative;
}
.dark .bom th,
.dark .bom td {
border: 1px solid #777;
}
.bom th {
background-color: #CCCCCC;
background-clip: padding-box;
}
.dark .bom th {
background-color: #3b4749;
}
.bom tr.highlighted:nth-child(n) {
background-color: #cfc;
}
.dark .bom tr.highlighted:nth-child(n) {
background-color: #226022;
}
.bom tr:nth-child(even) {
background-color: #f2f2f2;
}
.dark .bom tr:nth-child(even) {
background-color: #313b40;
}
.bom tr.checked {
color: #1cb53d;
}
.dark .bom tr.checked {
color: #2cce54;
}
.bom tr {
transition: background-color 0.2s;
}
.bom .numCol {
width: 30px;
}
.bom .value {
width: 15%;
}
.bom .quantity {
width: 65px;
}
.bom th .sortmark {
position: absolute;
right: 1px;
top: 1px;
margin-top: -5px;
border-width: 5px;
border-style: solid;
border-color: transparent transparent #221 transparent;
transform-origin: 50% 85%;
transition: opacity 0.2s, transform 0.4s;
}
.dark .bom th .sortmark {
filter: invert(1);
}
.bom th .sortmark.none {
opacity: 0;
}
.bom th .sortmark.desc {
transform: rotate(180deg);
}
.bom th:hover .sortmark.none {
opacity: 0.5;
}
.bom .bom-checkbox {
width: 30px;
position: relative;
user-select: none;
-moz-user-select: none;
}
.bom .bom-checkbox:before {
content: "";
position: absolute;
border-width: 15px;
border-style: solid;
border-color: #51829f transparent transparent transparent;
visibility: hidden;
top: -15px;
}
.bom .bom-checkbox:after {
content: "Double click to set/unset all";
position: absolute;
color: white;
top: -35px;
left: -26px;
background: #51829f;
padding: 5px 15px;
border-radius: 8px;
white-space: nowrap;
visibility: hidden;
}
.bom .bom-checkbox:hover:before,
.bom .bom-checkbox:hover:after {
visibility: visible;
transition: visibility 0.2s linear 1s;
}
.split {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
overflow-y: auto;
overflow-x: hidden;
background-color: inherit;
}
.split.split-horizontal,
.gutter.gutter-horizontal {
height: 100%;
float: left;
}
.gutter {
background-color: #ddd;
background-repeat: no-repeat;
background-position: 50%;
transition: background-color 0.3s;
}
.dark .gutter {
background-color: #777;
}
.gutter.gutter-horizontal {
background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAeCAYAAADkftS9AAAAIklEQVQoU2M4c+bMfxAGAgYYmwGrIIiDjrELjpo5aiZeMwF+yNnOs5KSvgAAAABJRU5ErkJggg==');
cursor: ew-resize;
width: 5px;
}
.gutter.gutter-vertical {
background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAFAQMAAABo7865AAAABlBMVEVHcEzMzMzyAv2sAAAAAXRSTlMAQObYZgAAABBJREFUeF5jOAMEEAIEEFwAn3kMwcB6I2AAAAAASUVORK5CYII=');
cursor: ns-resize;
height: 5px;
}
.searchbox {
float: left;
height: 40px;
margin: 10px 5px;
padding: 12px 32px;
font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;
font-size: 18px;
box-sizing: border-box;
border: 1px solid #888;
border-radius: 6px;
outline: none;
background-color: #eee;
transition: background-color 0.2s, border 0.2s;
background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABNklEQVQ4T8XSMUvDQBQH8P/LElFa/AIZHcTBQSz0I/gFstTBRR2KUC4ldDxw7h0Bl3RRUATxi4iiODgoiLNrbQYp5J6cpJJqomkX33Z37/14d/dIa33MzDuYI4johOI4XhyNRteO46zNYjDzAxE1yBZprVeZ+QbAUhXEGJMA2Ox2u4+fQIa0mPmsCgCgJYQ4t7lfgF0opQYAdv9ABkKI/UnOFCClXKjX61cA1osQY8x9kiRNKeV7IWA3oyhaSdP0FkAtjxhj3hzH2RBCPOf3pzqYHCilfAAX+URm9oMguPzeWSGQvUcMYC8rOBJCHBRdqxTo9/vbRHRqi8bj8XKv1xvODbiuW2u32/bvf0SlDv4XYOY7z/Mavu+nM1+BmQ+NMc0wDF/LprP0DbTWW0T00ul0nn4b7Q87+X4Qmfiq2wAAAABJRU5ErkJggg==');
background-position: 10px 10px;
background-repeat: no-repeat;
}
.dark .searchbox {
background-color: #111;
color: #eee;
}
.searchbox::placeholder {
color: #ccc;
}
.dark .searchbox::placeholder {
color: #666;
}
.filter {
width: calc(60% - 64px);
}
.reflookup {
width: calc(40% - 10px);
}
input[type=text]:focus {
background-color: white;
border: 1px solid #333;
}
.dark input[type=text]:focus {
background-color: #333;
border: 1px solid #ccc;
}
mark.highlight {
background-color: #5050ff;
color: #fff;
padding: 2px;
border-radius: 6px;
}
.dark mark.highlight {
background-color: #76a6da;
color: #111;
}
.menubtn {
background-color: white;
border: none;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='36' height='36' viewBox='0 0 20 20'%3E%3Cpath fill='none' d='M0 0h20v20H0V0z'/%3E%3Cpath d='M15.95 10.78c.03-.25.05-.51.05-.78s-.02-.53-.06-.78l1.69-1.32c.15-.12.19-.34.1-.51l-1.6-2.77c-.1-.18-.31-.24-.49-.18l-1.99.8c-.42-.32-.86-.58-1.35-.78L12 2.34c-.03-.2-.2-.34-.4-.34H8.4c-.2 0-.36.14-.39.34l-.3 2.12c-.49.2-.94.47-1.35.78l-1.99-.8c-.18-.07-.39 0-.49.18l-1.6 2.77c-.1.18-.06.39.1.51l1.69 1.32c-.04.25-.07.52-.07.78s.02.53.06.78L2.37 12.1c-.15.12-.19.34-.1.51l1.6 2.77c.1.18.31.24.49.18l1.99-.8c.42.32.86.58 1.35.78l.3 2.12c.04.2.2.34.4.34h3.2c.2 0 .37-.14.39-.34l.3-2.12c.49-.2.94-.47 1.35-.78l1.99.8c.18.07.39 0 .49-.18l1.6-2.77c.1-.18.06-.39-.1-.51l-1.67-1.32zM10 13c-1.65 0-3-1.35-3-3s1.35-3 3-3 3 1.35 3 3-1.35 3-3 3z'/%3E%3C/svg%3E%0A");
background-position: center;
background-repeat: no-repeat;
}
.statsbtn {
background-color: white;
border: none;
background-image: url("data:image/svg+xml,%3Csvg width='36' height='36' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M4 6h28v24H4V6zm0 8h28v8H4m9-16v24h10V5.8' fill='none' stroke='%23000' stroke-width='2'/%3E%3C/svg%3E");
background-position: center;
background-repeat: no-repeat;
}
.iobtn {
background-color: white;
border: none;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='36' height='36'%3E%3Cpath fill='none' stroke='%23000' stroke-width='2' d='M3 33v-7l6.8-7h16.5l6.7 7v7H3zM3.2 26H33M21 9l5-5.9 5 6h-2.5V15h-5V9H21zm-4.9 0l-5 6-5-6h2.5V3h5v6h2.5z'/%3E%3Cpath fill='none' stroke='%23000' d='M6.1 29.5H10'/%3E%3C/svg%3E");
background-position: center;
background-repeat: no-repeat;
}
.visbtn {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24'%3E%3Cpath fill='none' stroke='%23333' d='M2.5 4.5h5v15h-5zM9.5 4.5h5v15h-5zM16.5 4.5h5v15h-5z'/%3E%3C/svg%3E");
background-position: center;
background-repeat: no-repeat;
padding: 15px;
}
#vismenu-content {
left: 0px;
font-family: Verdana, sans-serif;
}
.dark .statsbtn,
.dark .savebtn,
.dark .menubtn,
.dark .iobtn,
.dark .visbtn {
filter: invert(1);
}
.flexbox {
display: flex;
align-items: center;
justify-content: space-between;
width: 100%;
}
.savebtn {
background-color: #d6d6d6;
width: auto;
height: 30px;
flex-grow: 1;
margin: 5px;
border-radius: 4px;
}
.savebtn:active {
background-color: #0a0;
color: white;
}
.dark .savebtn:active {
/* This will be inverted */
background-color: #b3b;
}
.stats {
border-collapse: collapse;
font-size: 12pt;
table-layout: fixed;
width: 100%;
min-width: 450px;
}
.dark .stats td {
border: 1px solid #bbb;
}
.stats td {
border: 1px solid black;
padding: 5px;
word-wrap: break-word;
text-align: center;
position: relative;
}
#checkbox-stats div {
position: absolute;
left: 0;
top: 0;
height: 100%;
width: 100%;
display: flex;
align-items: center;
justify-content: center;
}
#checkbox-stats .bar {
background-color: rgba(28, 251, 0, 0.6);
}
.menu {
position: relative;
display: inline-block;
margin: 0.4rem 0.4rem 0.4rem 0;
}
.menu-content {
font-size: 12pt !important;
text-align: left !important;
font-weight: normal !important;
display: none;
position: absolute;
background-color: white;
right: 0;
min-width: 300px;
box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2);
z-index: 100;
padding: 8px;
}
.dark .menu-content {
background-color: #111;
}
.menu:hover .menu-content {
display: block;
}
.menu:hover .menubtn,
.menu:hover .iobtn,
.menu:hover .statsbtn {
background-color: #eee;
}
.menu-label {
display: inline-block;
padding: 8px;
border: 1px solid #ccc;
border-top: 0;
width: calc(100% - 18px);
}
.menu-label-top {
border-top: 1px solid #ccc;
}
.menu-textbox {
float: left;
height: 24px;
margin: 10px 5px;
padding: 5px 5px;
font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;
font-size: 14px;
box-sizing: border-box;
border: 1px solid #888;
border-radius: 4px;
outline: none;
background-color: #eee;
transition: background-color 0.2s, border 0.2s;
width: calc(100% - 10px);
}
.menu-textbox.invalid,
.dark .menu-textbox.invalid {
color: red;
}
.dark .menu-textbox {
background-color: #222;
color: #eee;
}
.radio-container {
margin: 4px;
}
.topmostdiv {
display: flex;
flex-direction: column;
width: 100%;
background-color: white;
transition: background-color 0.3s;
}
#top {
display: flex;
flex-wrap: wrap;
justify-content: flex-end;
align-items: center;
border-bottom: 2px solid black;
}
#fileinfodiv {
flex: 20rem 1 0;
overflow: auto;
}
#bomcontrols {
display: flex;
flex-direction: row-reverse;
}
#bomcontrols>* {
flex-shrink: 0;
}
.dark #top {
border-bottom: 2px solid #ccc;
}
#dbg {
display: block;
}
::-webkit-scrollbar {
width: 8px;
}
::-webkit-scrollbar-track {
background: #aaa;
}
::-webkit-scrollbar-thumb {
background: #666;
border-radius: 3px;
}
::-webkit-scrollbar-thumb:hover {
background: #555;
}
.slider {
-webkit-appearance: none;
width: 100%;
margin: 3px 0;
padding: 0;
outline: none;
opacity: 0.7;
-webkit-transition: .2s;
transition: opacity .2s;
border-radius: 3px;
}
.slider:hover {
opacity: 1;
}
.slider:focus {
outline: none;
}
.slider::-webkit-slider-runnable-track {
-webkit-appearance: none;
width: 100%;
height: 8px;
background: #d3d3d3;
border-radius: 3px;
border: none;
}
.slider::-webkit-slider-thumb {
-webkit-appearance: none;
width: 15px;
height: 15px;
border-radius: 50%;
background: #0a0;
cursor: pointer;
margin-top: -4px;
}
.dark .slider::-webkit-slider-thumb {
background: #3d3;
}
.slider::-moz-range-thumb {
width: 15px;
height: 15px;
border-radius: 50%;
background: #0a0;
cursor: pointer;
}
.slider::-moz-range-track {
height: 8px;
background: #d3d3d3;
border-radius: 3px;
}
.dark .slider::-moz-range-thumb {
background: #3d3;
}
.slider::-ms-track {
width: 100%;
height: 8px;
border-width: 3px 0;
background: transparent;
border-color: transparent;
color: transparent;
transition: opacity .2s;
}
.slider::-ms-fill-lower {
background: #d3d3d3;
border: none;
border-radius: 3px;
}
.slider::-ms-fill-upper {
background: #d3d3d3;
border: none;
border-radius: 3px;
}
.slider::-ms-thumb {
width: 15px;
height: 15px;
border-radius: 50%;
background: #0a0;
cursor: pointer;
margin: 0;
}
.shameless-plug {
font-size: 0.8em;
text-align: center;
display: block;
}
a {
color: #0278a4;
}
.dark a {
color: #00b9fd;
}
#frontcanvas,
#backcanvas {
touch-action: none;
}
.placeholder {
border: 1px dashed #9f9fda !important;
background-color: #edf2f7 !important;
}
.dragging {
z-index: 999;
}
.dark .dragging>table>tbody>tr {
background-color: #252c30;
}
.dark .placeholder {
filter: invert(1);
}
.column-spacer {
top: 0;
left: 0;
width: calc(100% - 4px);
position: absolute;
cursor: pointer;
user-select: none;
height: 100%;
}
.column-width-handle {
top: 0;
right: 0;
width: 4px;
position: absolute;
cursor: col-resize;
user-select: none;
height: 100%;
}
.column-width-handle:hover {
background-color: #4f99bd;
}
.help-link {
border: 1px solid #0278a4;
padding-inline: 0.3rem;
border-radius: 3px;
cursor: pointer;
}
.dark .help-link {
border: 1px solid #00b9fd;
}
.bom-color {
width: 20%;
}
.color-column input {
width: 1.6rem;
height: 1rem;
border: 1px solid black;
cursor: pointer;
padding: 0;
}
/* removes default styling from input color element */
::-webkit-color-swatch {
border: none;
}
::-webkit-color-swatch-wrapper {
padding: 0;
}
::-moz-color-swatch,
::-moz-focus-inner {
border: none;
}
::-moz-focus-inner {
padding: 0;
}
</style>
<script type="text/javascript" >
///////////////////////////////////////////////
/*
Split.js - v1.3.5
MIT License
https://github.com/nathancahill/Split.js
*/
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.Split=t()}(this,function(){"use strict";var e=window,t=e.document,n="addEventListener",i="removeEventListener",r="getBoundingClientRect",s=function(){return!1},o=e.attachEvent&&!e[n],a=["","-webkit-","-moz-","-o-"].filter(function(e){var n=t.createElement("div");return n.style.cssText="width:"+e+"calc(9px)",!!n.style.length}).shift()+"calc",l=function(e){return"string"==typeof e||e instanceof String?t.querySelector(e):e};return function(u,c){function z(e,t,n){var i=A(y,t,n);Object.keys(i).forEach(function(t){return e.style[t]=i[t]})}function h(e,t){var n=B(y,t);Object.keys(n).forEach(function(t){return e.style[t]=n[t]})}function f(e){var t=E[this.a],n=E[this.b],i=t.size+n.size;t.size=e/this.size*i,n.size=i-e/this.size*i,z(t.element,t.size,this.aGutterSize),z(n.element,n.size,this.bGutterSize)}function m(e){var t;this.dragging&&((t="touches"in e?e.touches[0][b]-this.start:e[b]-this.start)<=E[this.a].minSize+M+this.aGutterSize?t=E[this.a].minSize+this.aGutterSize:t>=this.size-(E[this.b].minSize+M+this.bGutterSize)&&(t=this.size-(E[this.b].minSize+this.bGutterSize)),f.call(this,t),c.onDrag&&c.onDrag())}function g(){var e=E[this.a].element,t=E[this.b].element;this.size=e[r]()[y]+t[r]()[y]+this.aGutterSize+this.bGutterSize,this.start=e[r]()[G]}function d(){var t=this,n=E[t.a].element,r=E[t.b].element;t.dragging&&c.onDragEnd&&c.onDragEnd(),t.dragging=!1,e[i]("mouseup",t.stop),e[i]("touchend",t.stop),e[i]("touchcancel",t.stop),t.parent[i]("mousemove",t.move),t.parent[i]("touchmove",t.move),delete t.stop,delete t.move,n[i]("selectstart",s),n[i]("dragstart",s),r[i]("selectstart",s),r[i]("dragstart",s),n.style.userSelect="",n.style.webkitUserSelect="",n.style.MozUserSelect="",n.style.pointerEvents="",r.style.userSelect="",r.style.webkitUserSelect="",r.style.MozUserSelect="",r.style.pointerEvents="",t.gutter.style.cursor="",t.parent.style.cursor=""}function S(t){var i=this,r=E[i.a].element,o=E[i.b].element;!i.dragging&&c.onDragStart&&c.onDragStart(),t.preventDefault(),i.dragging=!0,i.move=m.bind(i),i.stop=d.bind(i),e[n]("mouseup",i.stop),e[n]("touchend",i.stop),e[n]("touchcancel",i.stop),i.parent[n]("mousemove",i.move),i.parent[n]("touchmove",i.move),r[n]("selectstart",s),r[n]("dragstart",s),o[n]("selectstart",s),o[n]("dragstart",s),r.style.userSelect="none",r.style.webkitUserSelect="none",r.style.MozUserSelect="none",r.style.pointerEvents="none",o.style.userSelect="none",o.style.webkitUserSelect="none",o.style.MozUserSelect="none",o.style.pointerEvents="none",i.gutter.style.cursor=j,i.parent.style.cursor=j,g.call(i)}function v(e){e.forEach(function(t,n){if(n>0){var i=F[n-1],r=E[i.a],s=E[i.b];r.size=e[n-1],s.size=t,z(r.element,r.size,i.aGutterSize),z(s.element,s.size,i.bGutterSize)}})}function p(){F.forEach(function(e){e.parent.removeChild(e.gutter),E[e.a].element.style[y]="",E[e.b].element.style[y]=""})}void 0===c&&(c={});var y,b,G,E,w=l(u[0]).parentNode,D=e.getComputedStyle(w).flexDirection,U=c.sizes||u.map(function(){return 100/u.length}),k=void 0!==c.minSize?c.minSize:100,x=Array.isArray(k)?k:u.map(function(){return k}),L=void 0!==c.gutterSize?c.gutterSize:10,M=void 0!==c.snapOffset?c.snapOffset:30,O=c.direction||"horizontal",j=c.cursor||("horizontal"===O?"ew-resize":"ns-resize"),C=c.gutter||function(e,n){var i=t.createElement("div");return i.className="gutter gutter-"+n,i},A=c.elementStyle||function(e,t,n){var i={};return"string"==typeof t||t instanceof String?i[e]=t:i[e]=o?t+"%":a+"("+t+"% - "+n+"px)",i},B=c.gutterStyle||function(e,t){return n={},n[e]=t+"px",n;var n};"horizontal"===O?(y="width","clientWidth",b="clientX",G="left","paddingLeft"):"vertical"===O&&(y="height","clientHeight",b="clientY",G="top","paddingTop");var F=[];return E=u.map(function(e,t){var i,s={element:l(e),size:U[t],minSize:x[t]};if(t>0&&(i={a:t-1,b:t,dragging:!1,isFirst:1===t,isLast:t===u.length-1,direction:O,parent:w},i.aGutterSize=L,i.bGutterSize=L,i.isFirst&&(i.aGutterSize=L/2),i.isLast&&(i.bGutterSize=L/2),"row-reverse"===D||"column-reverse"===D)){var a=i.a;i.a=i.b,i.b=a}if(!o&&t>0){var c=C(t,O);h(c,L),c[n]("mousedown",S.bind(i)),c[n]("touchstart",S.bind(i)),w.insertBefore(c,s.element),i.gutter=c}0===t||t===u.length-1?z(s.element,s.size,L/2):z(s.element,s.size,L);var f=s.element[r]()[y];return f<s.minSize&&(s.minSize=f),t>0&&F.push(i),s}),o?{setSizes:v,destroy:p}:{setSizes:v,getSizes:function(){return E.map(function(e){return e.size})},collapse:function(e){if(e===F.length){var t=F[e-1];g.call(t),o||f.call(t,t.size-t.bGutterSize)}else{var n=F[e];g.call(n),o||f.call(n,n.aGutterSize)}},destroy:p}}});
///////////////////////////////////////////////
///////////////////////////////////////////////
// Copyright (c) 2013 Pieroxy <pieroxy@pieroxy.net>
// This work is free. You can redistribute it and/or modify it
// under the terms of the WTFPL, Version 2
// For more information see LICENSE.txt or http://www.wtfpl.net/
//
// For more information, the home page:
// http://pieroxy.net/blog/pages/lz-string/testing.html
//
// LZ-based compression algorithm, version 1.4.4
var LZString=function(){var o=String.fromCharCode,i={};var n={decompressFromBase64:function(o){return null==o?"":""==o?null:n._decompress(o.length,32,function(n){return function(o,n){if(!i[o]){i[o]={};for(var t=0;t<o.length;t++)i[o][o.charAt(t)]=t}return i[o][n]}("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",o.charAt(n))})},_decompress:function(i,n,t){var r,e,a,s,p,u,l,f=[],c=4,d=4,h=3,v="",g=[],m={val:t(0),position:n,index:1};for(r=0;r<3;r+=1)f[r]=r;for(a=0,p=Math.pow(2,2),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;switch(a){case 0:for(a=0,p=Math.pow(2,8),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;l=o(a);break;case 1:for(a=0,p=Math.pow(2,16),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;l=o(a);break;case 2:return""}for(f[3]=l,e=l,g.push(l);;){if(m.index>i)return"";for(a=0,p=Math.pow(2,h),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;switch(l=a){case 0:for(a=0,p=Math.pow(2,8),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;f[d++]=o(a),l=d-1,c--;break;case 1:for(a=0,p=Math.pow(2,16),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;f[d++]=o(a),l=d-1,c--;break;case 2:return g.join("")}if(0==c&&(c=Math.pow(2,h),h++),f[l])v=f[l];else{if(l!==d)return null;v=e+e.charAt(0)}g.push(v),f[d++]=e+v.charAt(0),e=v,0==--c&&(c=Math.pow(2,h),h++)}}};return n}();"function"==typeof define&&define.amd?define(function(){return LZString}):"undefined"!=typeof module&&null!=module?module.exports=LZString:"undefined"!=typeof angular&&null!=angular&&angular.module("LZString",[]).factory("LZString",function(){return LZString});
///////////////////////////////////////////////
///////////////////////////////////////////////
/*!
* PEP v0.4.3 | https://github.com/jquery/PEP
* Copyright jQuery Foundation and other contributors | http://jquery.org/license
*/
!function(a,b){"object"==typeof exports&&"undefined"!=typeof module?module.exports=b():"function"==typeof define&&define.amd?define(b):a.PointerEventsPolyfill=b()}(this,function(){"use strict";function a(a,b){b=b||Object.create(null);var c=document.createEvent("Event");c.initEvent(a,b.bubbles||!1,b.cancelable||!1);
for(var d,e=2;e<m.length;e++)d=m[e],c[d]=b[d]||n[e];c.buttons=b.buttons||0;
var f=0;return f=b.pressure&&c.buttons?b.pressure:c.buttons?.5:0,c.x=c.clientX,c.y=c.clientY,c.pointerId=b.pointerId||0,c.width=b.width||0,c.height=b.height||0,c.pressure=f,c.tiltX=b.tiltX||0,c.tiltY=b.tiltY||0,c.twist=b.twist||0,c.tangentialPressure=b.tangentialPressure||0,c.pointerType=b.pointerType||"",c.hwTimestamp=b.hwTimestamp||0,c.isPrimary=b.isPrimary||!1,c}function b(){this.array=[],this.size=0}function c(a,b,c,d){this.addCallback=a.bind(d),this.removeCallback=b.bind(d),this.changedCallback=c.bind(d),A&&(this.observer=new A(this.mutationWatcher.bind(this)))}function d(a){return"body /shadow-deep/ "+e(a)}function e(a){return'[touch-action="'+a+'"]'}function f(a){return"{ -ms-touch-action: "+a+"; touch-action: "+a+"; }"}function g(){if(F){D.forEach(function(a){String(a)===a?(E+=e(a)+f(a)+"\n",G&&(E+=d(a)+f(a)+"\n")):(E+=a.selectors.map(e)+f(a.rule)+"\n",G&&(E+=a.selectors.map(d)+f(a.rule)+"\n"))});var a=document.createElement("style");a.textContent=E,document.head.appendChild(a)}}function h(){if(!window.PointerEvent){if(window.PointerEvent=a,window.navigator.msPointerEnabled){var b=window.navigator.msMaxTouchPoints;Object.defineProperty(window.navigator,"maxTouchPoints",{value:b,enumerable:!0}),u.registerSource("ms",_)}else Object.defineProperty(window.navigator,"maxTouchPoints",{value:0,enumerable:!0}),u.registerSource("mouse",N),void 0!==window.ontouchstart&&u.registerSource("touch",V);u.register(document)}}function i(a){if(!u.pointermap.has(a)){var b=new Error("InvalidPointerId");throw b.name="InvalidPointerId",b}}function j(a){for(var b=a.parentNode;b&&b!==a.ownerDocument;)b=b.parentNode;if(!b){var c=new Error("InvalidStateError");throw c.name="InvalidStateError",c}}function k(a){var b=u.pointermap.get(a);return 0!==b.buttons}function l(){window.Element&&!Element.prototype.setPointerCapture&&Object.defineProperties(Element.prototype,{setPointerCapture:{value:W},releasePointerCapture:{value:X},hasPointerCapture:{value:Y}})}
var m=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","pageX","pageY"],n=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0],o=window.Map&&window.Map.prototype.forEach,p=o?Map:b;b.prototype={set:function(a,b){return void 0===b?this["delete"](a):(this.has(a)||this.size++,void(this.array[a]=b))},has:function(a){return void 0!==this.array[a]},"delete":function(a){this.has(a)&&(delete this.array[a],this.size--)},get:function(a){return this.array[a]},clear:function(){this.array.length=0,this.size=0},forEach:function(a,b){return this.array.forEach(function(c,d){a.call(b,c,d,this)},this)}};var q=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","buttons","pointerId","width","height","pressure","tiltX","tiltY","pointerType","hwTimestamp","isPrimary","type","target","currentTarget","which","pageX","pageY","timeStamp"],r=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0,0,0,0,0,0,"",0,!1,"",null,null,0,0,0,0],s={pointerover:1,pointerout:1,pointerenter:1,pointerleave:1},t="undefined"!=typeof SVGElementInstance,u={pointermap:new p,eventMap:Object.create(null),captureInfo:Object.create(null),eventSources:Object.create(null),eventSourceList:[],registerSource:function(a,b){var c=b,d=c.events;d&&(d.forEach(function(a){c[a]&&(this.eventMap[a]=c[a].bind(c))},this),this.eventSources[a]=c,this.eventSourceList.push(c))},register:function(a){for(var b,c=this.eventSourceList.length,d=0;d<c&&(b=this.eventSourceList[d]);d++)
b.register.call(b,a)},unregister:function(a){for(var b,c=this.eventSourceList.length,d=0;d<c&&(b=this.eventSourceList[d]);d++)
b.unregister.call(b,a)},contains:function(a,b){try{return a.contains(b)}catch(c){return!1}},down:function(a){a.bubbles=!0,this.fireEvent("pointerdown",a)},move:function(a){a.bubbles=!0,this.fireEvent("pointermove",a)},up:function(a){a.bubbles=!0,this.fireEvent("pointerup",a)},enter:function(a){a.bubbles=!1,this.fireEvent("pointerenter",a)},leave:function(a){a.bubbles=!1,this.fireEvent("pointerleave",a)},over:function(a){a.bubbles=!0,this.fireEvent("pointerover",a)},out:function(a){a.bubbles=!0,this.fireEvent("pointerout",a)},cancel:function(a){a.bubbles=!0,this.fireEvent("pointercancel",a)},leaveOut:function(a){this.out(a),this.propagate(a,this.leave,!1)},enterOver:function(a){this.over(a),this.propagate(a,this.enter,!0)},eventHandler:function(a){if(!a._handledByPE){var b=a.type,c=this.eventMap&&this.eventMap[b];c&&c(a),a._handledByPE=!0}},listen:function(a,b){b.forEach(function(b){this.addEvent(a,b)},this)},unlisten:function(a,b){b.forEach(function(b){this.removeEvent(a,b)},this)},addEvent:function(a,b){a.addEventListener(b,this.boundHandler)},removeEvent:function(a,b){a.removeEventListener(b,this.boundHandler)},makeEvent:function(b,c){this.captureInfo[c.pointerId]&&(c.relatedTarget=null);var d=new a(b,c);return c.preventDefault&&(d.preventDefault=c.preventDefault),d._target=d._target||c.target,d},fireEvent:function(a,b){var c=this.makeEvent(a,b);return this.dispatchEvent(c)},cloneEvent:function(a){for(var b,c=Object.create(null),d=0;d<q.length;d++)b=q[d],c[b]=a[b]||r[d],!t||"target"!==b&&"relatedTarget"!==b||c[b]instanceof SVGElementInstance&&(c[b]=c[b].correspondingUseElement);return a.preventDefault&&(c.preventDefault=function(){a.preventDefault()}),c},getTarget:function(a){var b=this.captureInfo[a.pointerId];return b?a._target!==b&&a.type in s?void 0:b:a._target},propagate:function(a,b,c){for(var d=a.target,e=[];d!==document&&!d.contains(a.relatedTarget);) if(e.push(d),d=d.parentNode,!d)return;c&&e.reverse(),e.forEach(function(c){a.target=c,b.call(this,a)},this)},setCapture:function(b,c,d){this.captureInfo[b]&&this.releaseCapture(b,d),this.captureInfo[b]=c,this.implicitRelease=this.releaseCapture.bind(this,b,d),document.addEventListener("pointerup",this.implicitRelease),document.addEventListener("pointercancel",this.implicitRelease);var e=new a("gotpointercapture");e.pointerId=b,e._target=c,d||this.asyncDispatchEvent(e)},releaseCapture:function(b,c){var d=this.captureInfo[b];if(d){this.captureInfo[b]=void 0,document.removeEventListener("pointerup",this.implicitRelease),document.removeEventListener("pointercancel",this.implicitRelease);var e=new a("lostpointercapture");e.pointerId=b,e._target=d,c||this.asyncDispatchEvent(e)}},dispatchEvent:/*scope.external.dispatchEvent || */function(a){var b=this.getTarget(a);if(b)return b.dispatchEvent(a)},asyncDispatchEvent:function(a){requestAnimationFrame(this.dispatchEvent.bind(this,a))}};u.boundHandler=u.eventHandler.bind(u);var v={shadow:function(a){if(a)return a.shadowRoot||a.webkitShadowRoot},canTarget:function(a){return a&&Boolean(a.elementFromPoint)},targetingShadow:function(a){var b=this.shadow(a);if(this.canTarget(b))return b},olderShadow:function(a){var b=a.olderShadowRoot;if(!b){var c=a.querySelector("shadow");c&&(b=c.olderShadowRoot)}return b},allShadows:function(a){for(var b=[],c=this.shadow(a);c;)b.push(c),c=this.olderShadow(c);return b},searchRoot:function(a,b,c){if(a){var d,e,f=a.elementFromPoint(b,c);for(e=this.targetingShadow(f);e;){if(d=e.elementFromPoint(b,c)){var g=this.targetingShadow(d);return this.searchRoot(g,b,c)||d} e=this.olderShadow(e)} return f}},owner:function(a){
for(var b=a;b.parentNode;)b=b.parentNode;
return b.nodeType!==Node.DOCUMENT_NODE&&b.nodeType!==Node.DOCUMENT_FRAGMENT_NODE&&(b=document),b},findTarget:function(a){var b=a.clientX,c=a.clientY,d=this.owner(a.target);
return d.elementFromPoint(b,c)||(d=document),this.searchRoot(d,b,c)}},w=Array.prototype.forEach.call.bind(Array.prototype.forEach),x=Array.prototype.map.call.bind(Array.prototype.map),y=Array.prototype.slice.call.bind(Array.prototype.slice),z=Array.prototype.filter.call.bind(Array.prototype.filter),A=window.MutationObserver||window.WebKitMutationObserver,B="[touch-action]",C={subtree:!0,childList:!0,attributes:!0,attributeOldValue:!0,attributeFilter:["touch-action"]};c.prototype={watchSubtree:function(a){
//
this.observer&&v.canTarget(a)&&this.observer.observe(a,C)},enableOnSubtree:function(a){this.watchSubtree(a),a===document&&"complete"!==document.readyState?this.installOnLoad():this.installNewSubtree(a)},installNewSubtree:function(a){w(this.findElements(a),this.addElement,this)},findElements:function(a){return a.querySelectorAll?a.querySelectorAll(B):[]},removeElement:function(a){this.removeCallback(a)},addElement:function(a){this.addCallback(a)},elementChanged:function(a,b){this.changedCallback(a,b)},concatLists:function(a,b){return a.concat(y(b))},
installOnLoad:function(){document.addEventListener("readystatechange",function(){"complete"===document.readyState&&this.installNewSubtree(document)}.bind(this))},isElement:function(a){return a.nodeType===Node.ELEMENT_NODE},flattenMutationTree:function(a){
var b=x(a,this.findElements,this);
return b.push(z(a,this.isElement)),b.reduce(this.concatLists,[])},mutationWatcher:function(a){a.forEach(this.mutationHandler,this)},mutationHandler:function(a){if("childList"===a.type){var b=this.flattenMutationTree(a.addedNodes);b.forEach(this.addElement,this);var c=this.flattenMutationTree(a.removedNodes);c.forEach(this.removeElement,this)}else"attributes"===a.type&&this.elementChanged(a.target,a.oldValue)}};var D=["none","auto","pan-x","pan-y",{rule:"pan-x pan-y",selectors:["pan-x pan-y","pan-y pan-x"]}],E="",F=window.PointerEvent||window.MSPointerEvent,G=!window.ShadowDOMPolyfill&&document.head.createShadowRoot,H=u.pointermap,I=25,J=[1,4,2,8,16],K=!1;try{K=1===new MouseEvent("test",{buttons:1}).buttons}catch(L){}
var M,N={POINTER_ID:1,POINTER_TYPE:"mouse",events:["mousedown","mousemove","mouseup","mouseover","mouseout"],register:function(a){u.listen(a,this.events)},unregister:function(a){u.unlisten(a,this.events)},lastTouches:[],
isEventSimulatedFromTouch:function(a){for(var b,c=this.lastTouches,d=a.clientX,e=a.clientY,f=0,g=c.length;f<g&&(b=c[f]);f++){
var h=Math.abs(d-b.x),i=Math.abs(e-b.y);if(h<=I&&i<=I)return!0}},prepareEvent:function(a){var b=u.cloneEvent(a),c=b.preventDefault;return b.preventDefault=function(){a.preventDefault(),c()},b.pointerId=this.POINTER_ID,b.isPrimary=!0,b.pointerType=this.POINTER_TYPE,b},prepareButtonsForMove:function(a,b){var c=H.get(this.POINTER_ID);
0!==b.which&&c?a.buttons=c.buttons:a.buttons=0,b.buttons=a.buttons},mousedown:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=H.get(this.POINTER_ID),c=this.prepareEvent(a);K||(c.buttons=J[c.button],b&&(c.buttons|=b.buttons),a.buttons=c.buttons),H.set(this.POINTER_ID,a),b&&0!==b.buttons?u.move(c):u.down(c)}},mousemove:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=this.prepareEvent(a);K||this.prepareButtonsForMove(b,a),b.button=-1,H.set(this.POINTER_ID,a),u.move(b)}},mouseup:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=H.get(this.POINTER_ID),c=this.prepareEvent(a);if(!K){var d=J[c.button];
c.buttons=b?b.buttons&~d:0,a.buttons=c.buttons}H.set(this.POINTER_ID,a),
c.buttons&=~J[c.button],0===c.buttons?u.up(c):u.move(c)}},mouseover:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=this.prepareEvent(a);K||this.prepareButtonsForMove(b,a),b.button=-1,H.set(this.POINTER_ID,a),u.enterOver(b)}},mouseout:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=this.prepareEvent(a);K||this.prepareButtonsForMove(b,a),b.button=-1,u.leaveOut(b)}},cancel:function(a){var b=this.prepareEvent(a);u.cancel(b),this.deactivateMouse()},deactivateMouse:function(){H["delete"](this.POINTER_ID)}},O=u.captureInfo,P=v.findTarget.bind(v),Q=v.allShadows.bind(v),R=u.pointermap,S=2500,T=200,U="touch-action",V={events:["touchstart","touchmove","touchend","touchcancel"],register:function(a){M.enableOnSubtree(a)},unregister:function(){},elementAdded:function(a){var b=a.getAttribute(U),c=this.touchActionToScrollType(b);c&&(a._scrollType=c,u.listen(a,this.events),
Q(a).forEach(function(a){a._scrollType=c,u.listen(a,this.events)},this))},elementRemoved:function(a){a._scrollType=void 0,u.unlisten(a,this.events),
Q(a).forEach(function(a){a._scrollType=void 0,u.unlisten(a,this.events)},this)},elementChanged:function(a,b){var c=a.getAttribute(U),d=this.touchActionToScrollType(c),e=this.touchActionToScrollType(b);
d&&e?(a._scrollType=d,Q(a).forEach(function(a){a._scrollType=d},this)):e?this.elementRemoved(a):d&&this.elementAdded(a)},scrollTypes:{EMITTER:"none",XSCROLLER:"pan-x",YSCROLLER:"pan-y",SCROLLER:/^(?:pan-x pan-y)|(?:pan-y pan-x)|auto$/},touchActionToScrollType:function(a){var b=a,c=this.scrollTypes;return"none"===b?"none":b===c.XSCROLLER?"X":b===c.YSCROLLER?"Y":c.SCROLLER.exec(b)?"XY":void 0},POINTER_TYPE:"touch",firstTouch:null,isPrimaryTouch:function(a){return this.firstTouch===a.identifier},setPrimaryTouch:function(a){
(0===R.size||1===R.size&&R.has(1))&&(this.firstTouch=a.identifier,this.firstXY={X:a.clientX,Y:a.clientY},this.scrolling=!1,this.cancelResetClickCount())},removePrimaryPointer:function(a){a.isPrimary&&(this.firstTouch=null,this.firstXY=null,this.resetClickCount())},clickCount:0,resetId:null,resetClickCount:function(){var a=function(){this.clickCount=0,this.resetId=null}.bind(this);this.resetId=setTimeout(a,T)},cancelResetClickCount:function(){this.resetId&&clearTimeout(this.resetId)},typeToButtons:function(a){var b=0;return"touchstart"!==a&&"touchmove"!==a||(b=1),b},touchToPointer:function(a){var b=this.currentTouchEvent,c=u.cloneEvent(a),d=c.pointerId=a.identifier+2;c.target=O[d]||P(c),c.bubbles=!0,c.cancelable=!0,c.detail=this.clickCount,c.button=0,c.buttons=this.typeToButtons(b.type),c.width=2*(a.radiusX||a.webkitRadiusX||0),c.height=2*(a.radiusY||a.webkitRadiusY||0),c.pressure=a.force||a.webkitForce||.5,c.isPrimary=this.isPrimaryTouch(a),c.pointerType=this.POINTER_TYPE,
c.altKey=b.altKey,c.ctrlKey=b.ctrlKey,c.metaKey=b.metaKey,c.shiftKey=b.shiftKey;
var e=this;return c.preventDefault=function(){e.scrolling=!1,e.firstXY=null,b.preventDefault()},c},processTouches:function(a,b){var c=a.changedTouches;this.currentTouchEvent=a;for(var d,e=0;e<c.length;e++)d=c[e],b.call(this,this.touchToPointer(d))},
shouldScroll:function(a){if(this.firstXY){var b,c=a.currentTarget._scrollType;if("none"===c)
b=!1;else if("XY"===c)
b=!0;else{var d=a.changedTouches[0],e=c,f="Y"===c?"X":"Y",g=Math.abs(d["client"+e]-this.firstXY[e]),h=Math.abs(d["client"+f]-this.firstXY[f]);
b=g>=h}return this.firstXY=null,b}},findTouch:function(a,b){for(var c,d=0,e=a.length;d<e&&(c=a[d]);d++)if(c.identifier===b)return!0},
vacuumTouches:function(a){var b=a.touches;
if(R.size>=b.length){var c=[];R.forEach(function(a,d){
if(1!==d&&!this.findTouch(b,d-2)){var e=a.out;c.push(e)}},this),c.forEach(this.cancelOut,this)}},touchstart:function(a){this.vacuumTouches(a),this.setPrimaryTouch(a.changedTouches[0]),this.dedupSynthMouse(a),this.scrolling||(this.clickCount++,this.processTouches(a,this.overDown))},overDown:function(a){R.set(a.pointerId,{target:a.target,out:a,outTarget:a.target}),u.enterOver(a),u.down(a)},touchmove:function(a){this.scrolling||(this.shouldScroll(a)?(this.scrolling=!0,this.touchcancel(a)):(a.preventDefault(),this.processTouches(a,this.moveOverOut)))},moveOverOut:function(a){var b=a,c=R.get(b.pointerId);
if(c){var d=c.out,e=c.outTarget;u.move(b),d&&e!==b.target&&(d.relatedTarget=b.target,b.relatedTarget=e,
d.target=e,b.target?(u.leaveOut(d),u.enterOver(b)):(
b.target=e,b.relatedTarget=null,this.cancelOut(b))),c.out=b,c.outTarget=b.target}},touchend:function(a){this.dedupSynthMouse(a),this.processTouches(a,this.upOut)},upOut:function(a){this.scrolling||(u.up(a),u.leaveOut(a)),this.cleanUpPointer(a)},touchcancel:function(a){this.processTouches(a,this.cancelOut)},cancelOut:function(a){u.cancel(a),u.leaveOut(a),this.cleanUpPointer(a)},cleanUpPointer:function(a){R["delete"](a.pointerId),this.removePrimaryPointer(a)},
dedupSynthMouse:function(a){var b=N.lastTouches,c=a.changedTouches[0];
if(this.isPrimaryTouch(c)){
var d={x:c.clientX,y:c.clientY};b.push(d);var e=function(a,b){var c=a.indexOf(b);c>-1&&a.splice(c,1)}.bind(null,b,d);setTimeout(e,S)}}};M=new c(V.elementAdded,V.elementRemoved,V.elementChanged,V);var W,X,Y,Z=u.pointermap,$=window.MSPointerEvent&&"number"==typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE,_={events:["MSPointerDown","MSPointerMove","MSPointerUp","MSPointerOut","MSPointerOver","MSPointerCancel","MSGotPointerCapture","MSLostPointerCapture"],register:function(a){u.listen(a,this.events)},unregister:function(a){u.unlisten(a,this.events)},POINTER_TYPES:["","unavailable","touch","pen","mouse"],prepareEvent:function(a){var b=a;return $&&(b=u.cloneEvent(a),b.pointerType=this.POINTER_TYPES[a.pointerType]),b},cleanup:function(a){Z["delete"](a)},MSPointerDown:function(a){Z.set(a.pointerId,a);var b=this.prepareEvent(a);u.down(b)},MSPointerMove:function(a){var b=this.prepareEvent(a);u.move(b)},MSPointerUp:function(a){var b=this.prepareEvent(a);u.up(b),this.cleanup(a.pointerId)},MSPointerOut:function(a){var b=this.prepareEvent(a);u.leaveOut(b)},MSPointerOver:function(a){var b=this.prepareEvent(a);u.enterOver(b)},MSPointerCancel:function(a){var b=this.prepareEvent(a);u.cancel(b),this.cleanup(a.pointerId)},MSLostPointerCapture:function(a){var b=u.makeEvent("lostpointercapture",a);u.dispatchEvent(b)},MSGotPointerCapture:function(a){var b=u.makeEvent("gotpointercapture",a);u.dispatchEvent(b)}},aa=window.navigator;aa.msPointerEnabled?(W=function(a){i(a),j(this),k(a)&&(u.setCapture(a,this,!0),this.msSetPointerCapture(a))},X=function(a){i(a),u.releaseCapture(a,!0),this.msReleasePointerCapture(a)}):(W=function(a){i(a),j(this),k(a)&&u.setCapture(a,this)},X=function(a){i(a),u.releaseCapture(a)}),Y=function(a){return!!u.captureInfo[a]},g(),h(),l();var ba={dispatcher:u,Installer:c,PointerEvent:a,PointerMap:p,targetFinding:v};return ba});
///////////////////////////////////////////////
///////////////////////////////////////////////
var config = {"dark_mode": false, "show_pads": true, "show_fabrication": false, "show_silkscreen": true, "highlight_pin1": "none", "redraw_on_drag": true, "board_rotation": 0, "checkboxes": "Sourced,Placed", "bom_view": "left-right", "layer_view": "FB", "offset_back_rotation": false, "kicad_text_formatting": true, "fields": ["Value", "Footprint"]}
///////////////////////////////////////////////
///////////////////////////////////////////////
var pcbdata = JSON.parse(LZString.decompressFromBase64("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
gitextract_0o2rhde6/
├── .gitignore
├── .gitmodules
├── LICENSE
├── README.md
├── case/
│ ├── back.stl
│ ├── case.stl
│ ├── grill-part1.stl
│ └── grill-part2.stl
├── firmware/
│ └── fw-L072CB/
│ ├── .cargo/
│ │ └── config.toml
│ ├── Cargo.toml
│ ├── README.md
│ ├── build.rs
│ ├── build.sh
│ ├── run.sh
│ └── src/
│ └── bin/
│ ├── blinky.rs
│ ├── protobuf/
│ │ ├── README.md
│ │ ├── coms.proto
│ │ ├── coms.rs
│ │ ├── coms_pb2.py
│ │ └── mod.rs
│ ├── qaxe.rs
│ └── uid/
│ └── mod.rs
├── legacy/
│ ├── README.md
│ ├── qaxe/
│ │ ├── bom/
│ │ │ └── ibom.html
│ │ ├── gerbers/
│ │ │ ├── qaxe-B_Cu.gbl
│ │ │ ├── qaxe-B_Mask.gbs
│ │ │ ├── qaxe-B_Paste.gbp
│ │ │ ├── qaxe-B_Silkscreen.gbo
│ │ │ ├── qaxe-Edge_Cuts.gm1
│ │ │ ├── qaxe-F_Cu.gtl
│ │ │ ├── qaxe-F_Mask.gts
│ │ │ ├── qaxe-F_Paste.gtp
│ │ │ ├── qaxe-F_Silkscreen.gto
│ │ │ ├── qaxe-In1_Cu.g2
│ │ │ ├── qaxe-In2_Cu.g3
│ │ │ ├── qaxe-NPTH.drl
│ │ │ └── qaxe-PTH.drl
│ │ └── qaxe/
│ │ ├── .gitattributes
│ │ ├── .gitignore
│ │ ├── 1366_logo.kicad_mod
│ │ ├── 3d/
│ │ │ ├── AB2_SON5x6MM.wrl
│ │ │ ├── FP1006V2-R.STEP
│ │ │ ├── KMR231GLFS.stp
│ │ │ ├── Littelfuse 0154.500DRT without value_black v2.step
│ │ │ ├── barrel-jack.step
│ │ │ ├── bm1366.step
│ │ │ ├── heatsink-13x12x5.step
│ │ │ └── lga115x.step
│ │ ├── bitaxe.kicad_sym
│ │ ├── bm1366.kicad_sch
│ │ ├── fp-lib-table
│ │ ├── ibom.config.ini
│ │ ├── pi.kicad_sch
│ │ ├── power.kicad_sch
│ │ ├── qaxe.kicad_pcb
│ │ ├── qaxe.kicad_pro
│ │ ├── qaxe.kicad_sch
│ │ ├── qaxe.pretty/
│ │ │ ├── BM1366.kicad_mod
│ │ │ ├── BarrelJack_CUI_PJ-102AH_Horizontal.kicad_mod
│ │ │ ├── CP_EIA-7343-15_Kemet-W.kicad_mod
│ │ │ ├── CP_Elec_8x10.kicad_mod
│ │ │ ├── C_0805_2012Metric.kicad_mod
│ │ │ ├── C_1206_3216Metric.kicad_mod
│ │ │ ├── C_1210_3225Metric.kicad_mod
│ │ │ ├── D_SMB.kicad_mod
│ │ │ ├── D_SOD-128.kicad_mod
│ │ │ ├── D_SOD-323.kicad_mod
│ │ │ ├── FanPinHeader_1x04_P2.54mm_Vertical.kicad_mod
│ │ │ ├── IFLR-4031GC-01-8x10.kicad_mod
│ │ │ ├── KiCad-Logo2_5mm_SilkScreen.kicad_mod
│ │ │ ├── LED_1206_3216Metric.kicad_mod
│ │ │ ├── LQFP-48_7x7mm_P0.5mm.kicad_mod
│ │ │ ├── L_Taiyo-Yuden_NR-50xx.kicad_mod
│ │ │ ├── MountingHole_3.2mm_M3.kicad_mod
│ │ │ ├── MountingHole_3.2mm_M3_Pad_Via.kicad_mod
│ │ │ ├── NetTie-2_L3_SMD_Pad0.5mm.kicad_mod
│ │ │ ├── NetTie-2_SMD_Pad0.5mm.kicad_mod
│ │ │ ├── Oscillator_SMD_EuroQuartz_XO32-4Pin_3.2x2.5mm.kicad_mod
│ │ │ ├── PinHeader_1x02_P2.54mm_Vertical.kicad_mod
│ │ │ ├── PinHeader_1x06_P1.27mm_Vertical.kicad_mod
│ │ │ ├── PinHeader_IDC_2x05_P1.27mm_Vertical_SMD.kicad_mod
│ │ │ ├── QFN-32-1EP_5x5mm_P0.5mm_EP3.45x3.45mm_ThermalVias.kicad_mod
│ │ │ ├── R_0805_2012Metric.kicad_mod
│ │ │ ├── R_1206_3216Metric.kicad_mod
│ │ │ ├── R_1210_3225Metric.kicad_mod
│ │ │ ├── R_2010_5025Metric.kicad_mod
│ │ │ ├── SOT-223-3_TabPin2.kicad_mod
│ │ │ ├── SOT-23-5.kicad_mod
│ │ │ ├── SOT-23-6.kicad_mod
│ │ │ ├── SOT-23.kicad_mod
│ │ │ ├── SOT-363_SC-70-6.kicad_mod
│ │ │ ├── TMP1075-DRL.kicad_mod
│ │ │ ├── TestPoint_Pad_2.0x2.0mm.kicad_mod
│ │ │ ├── TestPoint_Pad_D1.5mm.kicad_mod
│ │ │ ├── USB_C_Receptacle_GCT_USB4105-xx-A_16P_TopMnt_Horizontal.kicad_mod
│ │ │ ├── VSONP-8-1EP_5x6_P1.27mm.kicad_mod
│ │ │ ├── dummy.kicad_mod
│ │ │ ├── fuseholder_littlefuse_blok.kicad_mod
│ │ │ ├── polarity.kicad_mod
│ │ │ └── qaxelogo.kicad_mod
│ │ ├── qaxelogo.kicad_mod
│ │ └── sym-lib-table
│ └── qaxe+/
│ ├── bom/
│ │ └── ibom.html
│ ├── gerbers/
│ │ ├── qaxe-B_Cu.gbl
│ │ ├── qaxe-B_Mask.gbs
│ │ ├── qaxe-B_Paste.gbp
│ │ ├── qaxe-B_Silkscreen.gbo
│ │ ├── qaxe-Edge_Cuts.gm1
│ │ ├── qaxe-F_Cu.gtl
│ │ ├── qaxe-F_Mask.gts
│ │ ├── qaxe-F_Paste.gtp
│ │ ├── qaxe-F_Silkscreen.gto
│ │ ├── qaxe-In1_Cu.g2
│ │ ├── qaxe-In2_Cu.g3
│ │ ├── qaxe-NPTH.drl
│ │ └── qaxe-PTH.drl
│ └── qaxe/
│ ├── .gitattributes
│ ├── .gitignore
│ ├── 1366_logo.kicad_mod
│ ├── 3d/
│ │ ├── AB2_SON5x6MM.wrl
│ │ ├── FP1006V2-R.STEP
│ │ ├── KMR231GLFS.stp
│ │ ├── Littelfuse 0154.500DRT without value_black v2.step
│ │ ├── barrel-jack.step
│ │ ├── bm1366.step
│ │ ├── heatsink-13x12x5.step
│ │ └── lga115x.step
│ ├── bitaxe.kicad_sym
│ ├── bm1366.kicad_sch
│ ├── fp-lib-table
│ ├── ibom.config.ini
│ ├── pi.kicad_sch
│ ├── power.kicad_sch
│ ├── qaxe.kicad_pcb
│ ├── qaxe.kicad_pro
│ ├── qaxe.kicad_sch
│ ├── qaxe.pretty/
│ │ ├── BM1366.kicad_mod
│ │ ├── BarrelJack_CUI_PJ-102AH_Horizontal.kicad_mod
│ │ ├── CP_EIA-7343-15_Kemet-W.kicad_mod
│ │ ├── CP_Elec_8x10.kicad_mod
│ │ ├── C_0805_2012Metric.kicad_mod
│ │ ├── C_1206_3216Metric.kicad_mod
│ │ ├── C_1210_3225Metric.kicad_mod
│ │ ├── D_SMB.kicad_mod
│ │ ├── D_SOD-128.kicad_mod
│ │ ├── D_SOD-323.kicad_mod
│ │ ├── FanPinHeader_1x04_P2.54mm_Vertical.kicad_mod
│ │ ├── IFLR-4031GC-01-8x10.kicad_mod
│ │ ├── KiCad-Logo2_5mm_SilkScreen.kicad_mod
│ │ ├── LED_1206_3216Metric.kicad_mod
│ │ ├── LQFP-48_7x7mm_P0.5mm.kicad_mod
│ │ ├── L_Taiyo-Yuden_NR-50xx.kicad_mod
│ │ ├── MountingHole_3.2mm_M3.kicad_mod
│ │ ├── MountingHole_3.2mm_M3_Pad_Via.kicad_mod
│ │ ├── NetTie-2_L3_SMD_Pad0.5mm.kicad_mod
│ │ ├── NetTie-2_SMD_Pad0.5mm.kicad_mod
│ │ ├── Oscillator_SMD_EuroQuartz_XO32-4Pin_3.2x2.5mm.kicad_mod
│ │ ├── PinHeader_1x02_P2.54mm_Vertical.kicad_mod
│ │ ├── PinHeader_1x06_P1.27mm_Vertical.kicad_mod
│ │ ├── PinHeader_IDC_2x05_P1.27mm_Vertical_SMD.kicad_mod
│ │ ├── QFN-32-1EP_5x5mm_P0.5mm_EP3.45x3.45mm_ThermalVias.kicad_mod
│ │ ├── R_0805_2012Metric.kicad_mod
│ │ ├── R_1206_3216Metric.kicad_mod
│ │ ├── R_1210_3225Metric.kicad_mod
│ │ ├── R_2010_5025Metric.kicad_mod
│ │ ├── SOT-223-3_TabPin2.kicad_mod
│ │ ├── SOT-23-5.kicad_mod
│ │ ├── SOT-23-6.kicad_mod
│ │ ├── SOT-23.kicad_mod
│ │ ├── SOT-363_SC-70-6.kicad_mod
│ │ ├── TMP1075-DRL.kicad_mod
│ │ ├── TestPoint_Pad_2.0x2.0mm.kicad_mod
│ │ ├── TestPoint_Pad_D1.5mm.kicad_mod
│ │ ├── USB_C_Receptacle_GCT_USB4105-xx-A_16P_TopMnt_Horizontal.kicad_mod
│ │ ├── VSONP-8-1EP_5x6_P1.27mm.kicad_mod
│ │ ├── dummy.kicad_mod
│ │ ├── fuseholder_littlefuse_blok.kicad_mod
│ │ ├── polarity.kicad_mod
│ │ └── qaxelogo.kicad_mod
│ ├── qaxelogo.kicad_mod
│ └── sym-lib-table
├── nerdqaxe+/
│ ├── .gitattributes
│ ├── .gitignore
│ ├── bom/
│ │ └── ibom.html
│ ├── gerbers/
│ │ ├── nerdqaxe+-B_Cu.gbl
│ │ ├── nerdqaxe+-B_Mask.gbs
│ │ ├── nerdqaxe+-B_Paste.gbp
│ │ ├── nerdqaxe+-B_Silkscreen.gbo
│ │ ├── nerdqaxe+-Edge_Cuts.gm1
│ │ ├── nerdqaxe+-F_Cu.gtl
│ │ ├── nerdqaxe+-F_Mask.gts
│ │ ├── nerdqaxe+-F_Paste.gtp
│ │ ├── nerdqaxe+-F_Silkscreen.gto
│ │ ├── nerdqaxe+-In1_Cu.g2
│ │ ├── nerdqaxe+-In2_Cu.g3
│ │ ├── nerdqaxe+-NPTH.drl
│ │ └── nerdqaxe+-PTH.drl
│ └── nerdqaxe+/
│ ├── 3d/
│ │ ├── AB2_SON5x6MM.wrl
│ │ ├── FP1006V2-R.STEP
│ │ ├── KMR231GLFS.stp
│ │ ├── Littelfuse 0154.500DRT without value_black v2.step
│ │ ├── T-Display-S3.STEP
│ │ ├── barrel-jack.step
│ │ ├── bm1366.step
│ │ ├── heatsink-13x12x5.step
│ │ └── lga115x.step
│ ├── bitaxe.kicad_sym
│ ├── bm1366.kicad_sch
│ ├── fp-lib-table
│ ├── ibom.config.ini
│ ├── nerdqaxe+.kicad_pcb
│ ├── nerdqaxe+.kicad_pro
│ ├── nerdqaxe+.kicad_sch
│ ├── nerdqaxe+.pretty/
│ │ ├── BM1366.kicad_mod
│ │ ├── BarrelJack_CUI_PJ-102AH_Horizontal.kicad_mod
│ │ ├── CP_EIA-7343-15_Kemet-W.kicad_mod
│ │ ├── CP_Elec_8x10.kicad_mod
│ │ ├── C_0805_2012Metric.kicad_mod
│ │ ├── C_1206_3216Metric.kicad_mod
│ │ ├── C_1210_3225Metric.kicad_mod
│ │ ├── D_SMB.kicad_mod
│ │ ├── D_SOD-128.kicad_mod
│ │ ├── D_SOD-323.kicad_mod
│ │ ├── FanPinHeader_1x04_P2.54mm_Vertical.kicad_mod
│ │ ├── IFLR-4031GC-01-8x10.kicad_mod
│ │ ├── KiCad-Logo2_5mm_SilkScreen.kicad_mod
│ │ ├── LED_1206_3216Metric.kicad_mod
│ │ ├── LQFP-48_7x7mm_P0.5mm.kicad_mod
│ │ ├── L_Taiyo-Yuden_NR-50xx.kicad_mod
│ │ ├── MountingHole_3.2mm_M3.kicad_mod
│ │ ├── MountingHole_3.2mm_M3_Pad_Via.kicad_mod
│ │ ├── NetTie-2_L3_SMD_Pad0.5mm.kicad_mod
│ │ ├── NetTie-2_SMD_Pad0.5mm.kicad_mod
│ │ ├── Oscillator_SMD_EuroQuartz_XO32-4Pin_3.2x2.5mm.kicad_mod
│ │ ├── PinHeader_1x02_P2.54mm_Vertical.kicad_mod
│ │ ├── PinHeader_1x06_P1.27mm_Vertical.kicad_mod
│ │ ├── PinHeader_IDC_2x05_P1.27mm_Vertical_SMD.kicad_mod
│ │ ├── QFN-32-1EP_5x5mm_P0.5mm_EP3.45x3.45mm_ThermalVias.kicad_mod
│ │ ├── R_0805_2012Metric.kicad_mod
│ │ ├── R_1206_3216Metric.kicad_mod
│ │ ├── R_1210_3225Metric.kicad_mod
│ │ ├── R_2010_5025Metric.kicad_mod
│ │ ├── SOT-223-3_TabPin2.kicad_mod
│ │ ├── SOT-23-5.kicad_mod
│ │ ├── SOT-23-6.kicad_mod
│ │ ├── SOT-23.kicad_mod
│ │ ├── SOT-363_SC-70-6.kicad_mod
│ │ ├── TMP1075-DRL.kicad_mod
│ │ ├── TestPoint_Pad_2.0x2.0mm.kicad_mod
│ │ ├── TestPoint_Pad_D1.5mm.kicad_mod
│ │ ├── USB_C_Receptacle_GCT_USB4105-xx-A_16P_TopMnt_Horizontal.kicad_mod
│ │ ├── VSONP-8-1EP_5x6_P1.27mm.kicad_mod
│ │ ├── dummy.kicad_mod
│ │ ├── fuseholder_littlefuse_blok.kicad_mod
│ │ ├── polarity.kicad_mod
│ │ └── qaxelogo.kicad_mod
│ ├── pi.kicad_sch
│ ├── power.kicad_sch
│ └── sym-lib-table
└── nerdqaxe++/
├── bom/
│ └── ibom.html
├── gerbers/
│ ├── nerdqaxe++-B_Cu.gbl
│ ├── nerdqaxe++-B_Mask.gbs
│ ├── nerdqaxe++-B_Paste.gbp
│ ├── nerdqaxe++-B_Silkscreen.gbo
│ ├── nerdqaxe++-Edge_Cuts.gm1
│ ├── nerdqaxe++-F_Cu.gtl
│ ├── nerdqaxe++-F_Mask.gts
│ ├── nerdqaxe++-F_Paste.gtp
│ ├── nerdqaxe++-F_Silkscreen.gto
│ ├── nerdqaxe++-In1_Cu.g1
│ ├── nerdqaxe++-In2_Cu.g2
│ ├── nerdqaxe++-In3_Cu.g3
│ ├── nerdqaxe++-In4_Cu.g4
│ ├── nerdqaxe++-NPTH.drl
│ └── nerdqaxe++-PTH.drl
└── nerdqaxe++/
├── 3d/
│ ├── AB2_SON5x6MM.wrl
│ ├── DCJ250-20-B-XX-X_REVA1.step
│ ├── FP1006V2-R.STEP
│ ├── KMR231GLFS.stp
│ ├── Littelfuse 0154.500DRT without value_black v2.step
│ ├── T-Display-S3.STEP
│ ├── barrel-jack.step
│ ├── bm1366.step
│ ├── bm1370.csg
│ ├── bm1370.scad
│ ├── bm1370.step
│ ├── bm1370.wrl
│ ├── csd95472.csg
│ ├── csd95472.scad
│ ├── csd95472.wrl
│ ├── csg95472.step
│ ├── heatsink-13x12x5.step
│ └── lga115x.step
├── bm1366.kicad_sch
├── fp-lib-table
├── ibom.config.ini
├── nerdqaxe++.kicad_pcb
├── nerdqaxe++.kicad_pro
├── nerdqaxe++.kicad_sch
├── nerdqaxe++.pretty/
│ ├── BM1366.kicad_mod
│ ├── BarrelJack_CUI_PJ-102AH_Horizontal.kicad_mod
│ ├── CP_EIA-7343-15_Kemet-W.kicad_mod
│ ├── CP_Elec_8x10.kicad_mod
│ ├── C_0805_2012Metric.kicad_mod
│ ├── C_1206_3216Metric.kicad_mod
│ ├── C_1210_3225Metric.kicad_mod
│ ├── D_SMB.kicad_mod
│ ├── D_SOD-128.kicad_mod
│ ├── D_SOD-323.kicad_mod
│ ├── FanPinHeader_1x04_P2.54mm_Vertical.kicad_mod
│ ├── GCT_DCJ250-20-B-XX-X_REVA1.kicad_mod
│ ├── IFLR-4031GC-01-8x10.kicad_mod
│ ├── KiCad-Logo2_5mm_SilkScreen.kicad_mod
│ ├── LED_1206_3216Metric.kicad_mod
│ ├── LQFP-48_7x7mm_P0.5mm.kicad_mod
│ ├── L_Taiyo-Yuden_NR-50xx.kicad_mod
│ ├── MountingHole_3.2mm_M3.kicad_mod
│ ├── MountingHole_3.2mm_M3_Pad_Via.kicad_mod
│ ├── NetTie-2_L3_SMD_Pad0.5mm.kicad_mod
│ ├── NetTie-2_SMD_Pad0.5mm.kicad_mod
│ ├── Oscillator_SMD_EuroQuartz_XO32-4Pin_3.2x2.5mm.kicad_mod
│ ├── PinHeader_1x02_P2.54mm_Vertical.kicad_mod
│ ├── PinHeader_1x06_P1.27mm_Vertical.kicad_mod
│ ├── PinHeader_IDC_2x05_P1.27mm_Vertical_SMD.kicad_mod
│ ├── QFN-32-1EP_5x5mm_P0.5mm_EP3.45x3.45mm_ThermalVias.kicad_mod
│ ├── R_0805_2012Metric.kicad_mod
│ ├── R_1206_3216Metric.kicad_mod
│ ├── R_1210_3225Metric.kicad_mod
│ ├── R_2010_5025Metric.kicad_mod
│ ├── SOT-223-3_TabPin2.kicad_mod
│ ├── SOT-23-5.kicad_mod
│ ├── SOT-23-6.kicad_mod
│ ├── SOT-23.kicad_mod
│ ├── SOT-363_SC-70-6.kicad_mod
│ ├── TMP1075-DRL.kicad_mod
│ ├── TestPoint_Pad_2.0x2.0mm.kicad_mod
│ ├── TestPoint_Pad_D1.5mm.kicad_mod
│ ├── USB_C_Receptacle_GCT_USB4105-xx-A_16P_TopMnt_Horizontal.kicad_mod
│ ├── VSONP-8-1EP_5x6_P1.27mm.kicad_mod
│ ├── dummy.kicad_mod
│ ├── fuseholder_littlefuse_blok.kicad_mod
│ ├── polarity.kicad_mod
│ └── qaxelogo.kicad_mod
├── pi.kicad_sch
├── power-stage.kicad_sch
└── power.kicad_sch
SYMBOL INDEX (42 symbols across 5 files)
FILE: firmware/fw-L072CB/build.rs
function main (line 1) | fn main() {
FILE: firmware/fw-L072CB/src/bin/blinky.rs
function main (line 11) | async fn main(_spawner: Spawner) {
FILE: firmware/fw-L072CB/src/bin/protobuf/coms.rs
type QRequest (line 20) | pub struct QRequest<'a> {
function from_reader (line 27) | fn from_reader(r: &mut BytesReader, bytes: &'a [u8]) -> Result<Self> {
method get_size (line 43) | fn get_size(&self) -> usize {
method write_message (line 50) | fn write_message<W: WriterBackend>(&self, w: &mut Writer<W>) -> Result<(...
type QResponse (line 60) | pub struct QResponse<'a> {
function from_reader (line 67) | fn from_reader(r: &mut BytesReader, bytes: &'a [u8]) -> Result<Self> {
method get_size (line 83) | fn get_size(&self) -> usize {
method write_message (line 90) | fn write_message<W: WriterBackend>(&self, w: &mut Writer<W>) -> Result<(...
type QControl (line 100) | pub struct QControl {
method from_reader (line 107) | fn from_reader(r: &mut BytesReader, bytes: &'a [u8]) -> Result<Self> {
method get_size (line 123) | fn get_size(&self) -> usize {
method write_message (line 130) | fn write_message<W: WriterBackend>(&self, w: &mut Writer<W>) -> Result<(...
type QState (line 140) | pub struct QState {
method from_reader (line 147) | fn from_reader(r: &mut BytesReader, bytes: &'a [u8]) -> Result<Self> {
method get_size (line 163) | fn get_size(&self) -> usize {
method write_message (line 170) | fn write_message<W: WriterBackend>(&self, w: &mut Writer<W>) -> Result<(...
FILE: firmware/fw-L072CB/src/bin/qaxe.rs
type ResetManagerCommand (line 58) | enum ResetManagerCommand {
type PWMControl (line 70) | struct PWMControl {
constant RX_BUF_SIZE (line 77) | const RX_BUF_SIZE : usize = 256;
constant TX_BUF_SIZE (line 78) | const TX_BUF_SIZE : usize = 256;
function main (line 81) | async fn main(spawner: Spawner) {
function power_good_task (line 313) | async fn power_good_task(pgood_1v2: Input<'static>, mut pgood_led: Outpu...
function reset_manager (line 329) | async fn reset_manager(mut run_1v2: Output<'static>, mut reset: Output<'...
function pwm_manager (line 366) | async fn pwm_manager(mut pwm1: SimplePwm<'static, TIM2>) {
type Disconnected (line 391) | struct Disconnected {}
method from (line 394) | fn from(val: EndpointError) -> Self {
type Errors (line 402) | enum Errors {
method to_string (line 412) | fn to_string(error: &Errors) -> &'static str {
type Commands (line 423) | enum Commands {
method from_i32 (line 432) | fn from_i32(value: i32) -> Option<Commands> {
function default (line 445) | fn default() -> QResponse<'static> {
function process_request (line 455) | async fn process_request<'a>(
function json_rpc (line 529) | async fn json_rpc<'d, T: Instance + 'd>(
function temp_manager (line 572) | async fn temp_manager(mut i2c: I2c<'static, I2C2, DMA1_CH4, DMA1_CH5>) {
FILE: firmware/fw-L072CB/src/bin/uid/mod.rs
constant BASE_ADDRESS (line 5) | const BASE_ADDRESS: usize = 0x1FF80050;
constant OFFSETS (line 6) | const OFFSETS: [usize; 3] = [0x00, 0x04, 0x14];
function read_u32_at_address (line 9) | fn read_u32_at_address(address: *const u32) -> u32 {
function uid (line 14) | fn uid() -> [u8; 12] {
function uid_hex (line 35) | pub fn uid_hex() -> &'static str {
function uid_hex_bytes (line 40) | pub fn uid_hex_bytes() -> &'static [u8; 24] {
Copy disabled (too large)
Download .json
Condensed preview — 346 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (59,601K chars).
[
{
"path": ".gitignore",
"chars": 474,
"preview": "# For PCBs designed using KiCad: https://www.kicad.org/\n# Format documentation: https://kicad.org/help/file-formats/\n\n# "
},
{
"path": ".gitmodules",
"chars": 101,
"preview": "[submodule \"firmware/embassy\"]\n\tpath = firmware/embassy\n\turl = https://github.com/embassy-rs/embassy\n"
},
{
"path": "LICENSE",
"chars": 13419,
"preview": "CERN Open Hardware Licence Version 2 - Strongly Reciprocal\n\n\nPreamble\n\nCERN has developed this licence to promote collab"
},
{
"path": "README.md",
"chars": 1659,
"preview": "# NerdQ Hardware Repository\n\nThis repository contains multiple generations of small-scale Bitcoin miner hardware designs"
},
{
"path": "firmware/fw-L072CB/.cargo/config.toml",
"chars": 226,
"preview": "[target.'cfg(all(target_arch = \"arm\", target_os = \"none\"))']\n# replace your chip as listed in `probe-rs chip list`\nrunne"
},
{
"path": "firmware/fw-L072CB/Cargo.toml",
"chars": 1376,
"preview": "[package]\nedition = \"2021\"\nname = \"embassy-stm32l1-examples\"\nversion = \"0.1.0\"\nlicense = \"MIT OR Apache-2.0\"\n\n[dependenc"
},
{
"path": "firmware/fw-L072CB/README.md",
"chars": 66,
"preview": "needed for compiling:\n```\nrustup target add thumbv6m-none-eabi\n```"
},
{
"path": "firmware/fw-L072CB/build.rs",
"chars": 171,
"preview": "fn main() {\n println!(\"cargo:rustc-link-arg-bins=--nmagic\");\n println!(\"cargo:rustc-link-arg-bins=-Tlink.x\");\n "
},
{
"path": "firmware/fw-L072CB/build.sh",
"chars": 60,
"preview": "#!/bin/bash\nDEFMT_LOG=info cargo build --release --bin qaxe\n"
},
{
"path": "firmware/fw-L072CB/run.sh",
"chars": 58,
"preview": "#!/bin/bash\nDEFMT_LOG=info cargo run --release --bin qaxe\n"
},
{
"path": "firmware/fw-L072CB/src/bin/blinky.rs",
"chars": 590,
"preview": "#![no_std]\n#![no_main]\n\nuse defmt::*;\nuse embassy_executor::Spawner;\nuse embassy_stm32::gpio::{Level, Output, Speed};\nus"
},
{
"path": "firmware/fw-L072CB/src/bin/protobuf/README.md",
"chars": 97,
"preview": "for rust:\n```\npb-rs --nostd coms.proto\n```\n\nfor python:\n```\nprotoc --python_out=. coms.proto\n```\n"
},
{
"path": "firmware/fw-L072CB/src/bin/protobuf/coms.proto",
"chars": 377,
"preview": "// Filename: coms.proto\n\nsyntax = \"proto3\";\n\nmessage QRequest {\n int32 id = 1;\n int32 op = 2;\n bytes data = 3;\n"
},
{
"path": "firmware/fw-L072CB/src/bin/protobuf/coms.rs",
"chars": 6343,
"preview": "// Automatically generated rust module for 'coms.proto' file\n\n#![allow(non_snake_case)]\n#![allow(non_upper_case_globals)"
},
{
"path": "firmware/fw-L072CB/src/bin/protobuf/coms_pb2.py",
"chars": 8702,
"preview": "# -*- coding: utf-8 -*-\n# Generated by the protocol buffer compiler. DO NOT EDIT!\n# source: coms.proto\n\nfrom google.pro"
},
{
"path": "firmware/fw-L072CB/src/bin/protobuf/mod.rs",
"chars": 48,
"preview": "// Automatically generated mod.rs\npub mod coms;\n"
},
{
"path": "firmware/fw-L072CB/src/bin/qaxe.rs",
"chars": 18342,
"preview": "#![no_std]\n#![no_main]\n\nuse core::option::Option::Some;\nuse defmt::{panic, *};\nuse defmt_rtt as _; // global logger\nuse "
},
{
"path": "firmware/fw-L072CB/src/bin/uid/mod.rs",
"chars": 1880,
"preview": "\nuse critical_section;\n\n\nconst BASE_ADDRESS: usize = 0x1FF80050;\nconst OFFSETS: [usize; 3] = [0x00, 0x04, 0x14];\n\n/// Re"
},
{
"path": "legacy/README.md",
"chars": 3088,
"preview": "# Legacy Hardware Designs\n\n⚠️ **Status: End of Support**\n\nThis directory contains deprecated hardware designs that are n"
},
{
"path": "legacy/qaxe/bom/ibom.html",
"chars": 410816,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, i"
},
{
"path": "legacy/qaxe/gerbers/qaxe-B_Cu.gbl",
"chars": 339514,
"preview": "G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,7.0.7-7.0.7~ubuntu22.04.1*\nG04 #@! TF.CreationDate,2024-03-12T11:13:49+01:00*"
},
{
"path": "legacy/qaxe/gerbers/qaxe-B_Mask.gbs",
"chars": 8836,
"preview": "G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,7.0.7-7.0.7~ubuntu22.04.1*\nG04 #@! TF.CreationDate,2024-03-12T11:13:49+01:00*"
},
{
"path": "legacy/qaxe/gerbers/qaxe-B_Paste.gbp",
"chars": 6102,
"preview": "G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,7.0.7-7.0.7~ubuntu22.04.1*\nG04 #@! TF.CreationDate,2024-03-12T11:13:49+01:00*"
},
{
"path": "legacy/qaxe/gerbers/qaxe-B_Silkscreen.gbo",
"chars": 222315,
"preview": "G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,7.0.7-7.0.7~ubuntu22.04.1*\nG04 #@! TF.CreationDate,2024-03-12T11:13:49+01:00*"
},
{
"path": "legacy/qaxe/gerbers/qaxe-Edge_Cuts.gm1",
"chars": 759,
"preview": "G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,7.0.7-7.0.7~ubuntu22.04.1*\nG04 #@! TF.CreationDate,2024-03-12T11:13:49+01:00*"
},
{
"path": "legacy/qaxe/gerbers/qaxe-F_Cu.gtl",
"chars": 510901,
"preview": "G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,7.0.7-7.0.7~ubuntu22.04.1*\nG04 #@! TF.CreationDate,2024-03-12T11:13:49+01:00*"
},
{
"path": "legacy/qaxe/gerbers/qaxe-F_Mask.gts",
"chars": 21336,
"preview": "G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,7.0.7-7.0.7~ubuntu22.04.1*\nG04 #@! TF.CreationDate,2024-03-12T11:13:49+01:00*"
},
{
"path": "legacy/qaxe/gerbers/qaxe-F_Paste.gtp",
"chars": 37947,
"preview": "G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,7.0.7-7.0.7~ubuntu22.04.1*\nG04 #@! TF.CreationDate,2024-03-12T11:13:49+01:00*"
},
{
"path": "legacy/qaxe/gerbers/qaxe-F_Silkscreen.gto",
"chars": 364270,
"preview": "G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,7.0.7-7.0.7~ubuntu22.04.1*\nG04 #@! TF.CreationDate,2024-03-12T11:13:49+01:00*"
},
{
"path": "legacy/qaxe/gerbers/qaxe-In1_Cu.g2",
"chars": 403310,
"preview": "G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,7.0.7-7.0.7~ubuntu22.04.1*\nG04 #@! TF.CreationDate,2024-03-12T11:13:49+01:00*"
},
{
"path": "legacy/qaxe/gerbers/qaxe-In2_Cu.g3",
"chars": 236645,
"preview": "G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,7.0.7-7.0.7~ubuntu22.04.1*\nG04 #@! TF.CreationDate,2024-03-12T11:13:49+01:00*"
},
{
"path": "legacy/qaxe/gerbers/qaxe-NPTH.drl",
"chars": 624,
"preview": "M48\n; DRILL file {KiCad 7.0.7-7.0.7~ubuntu22.04.1} date Tue 12 Mar 2024 11:13:51 CET\n; FORMAT={-:-/ absolute / metric / "
},
{
"path": "legacy/qaxe/gerbers/qaxe-PTH.drl",
"chars": 8775,
"preview": "M48\n; DRILL file {KiCad 7.0.7-7.0.7~ubuntu22.04.1} date Tue 12 Mar 2024 11:13:51 CET\n; FORMAT={-:-/ absolute / metric / "
},
{
"path": "legacy/qaxe/qaxe/.gitattributes",
"chars": 33,
"preview": "*.html linguist-detectable=false\n"
},
{
"path": "legacy/qaxe/qaxe/.gitignore",
"chars": 474,
"preview": "# For PCBs designed using KiCad: https://www.kicad.org/\n# Format documentation: https://kicad.org/help/file-formats/\n\n# "
},
{
"path": "legacy/qaxe/qaxe/1366_logo.kicad_mod",
"chars": 55255,
"preview": "(footprint \"LOGO\" (version 20221018) (generator bitmap2component)\n (layer \"F.Cu\")\n (attr board_only exclude_from_pos_f"
},
{
"path": "legacy/qaxe/qaxe/3d/AB2_SON5x6MM.wrl",
"chars": 56166,
"preview": "#VRML V2.0 utf8\n#Exported from Wings 3D 1.5.1\nDEF STL_object Transform {\n children [\n Shape {\n appearance Appea"
},
{
"path": "legacy/qaxe/qaxe/3d/FP1006V2-R.STEP",
"chars": 184518,
"preview": "ISO-10303-21;\r\nHEADER;\r\nFILE_DESCRIPTION (( 'STEP AP203' ),\r\n '1' );\r\nFILE_NAME ('FP1006V2-R.STEP',\r\n '2020-01-07T"
},
{
"path": "legacy/qaxe/qaxe/3d/KMR231GLFS.stp",
"chars": 869606,
"preview": "ISO-10303-21;\r\nHEADER;\r\nFILE_DESCRIPTION( ( 'STEP AP214' ), ' ' );\r\nFILE_NAME( 'C:/Users/KMIROS~1/AppData/Local/Temp/pso"
},
{
"path": "legacy/qaxe/qaxe/3d/Littelfuse 0154.500DRT without value_black v2.step",
"chars": 482569,
"preview": "ISO-10303-21;\r\nHEADER;\r\n/* Generated by software containing ST-Developer\r\n * from STEP Tools, Inc. (www.steptools.com) \r"
},
{
"path": "legacy/qaxe/qaxe/3d/barrel-jack.step",
"chars": 51080,
"preview": "ISO-10303-21;\nHEADER;\nFILE_DESCRIPTION(('FreeCAD Model'),'2;1');\nFILE_NAME('Open CASCADE Shape Model','2023-10-26T14:26:"
},
{
"path": "legacy/qaxe/qaxe/3d/bm1366.step",
"chars": 18631,
"preview": "ISO-10303-21;\nHEADER;\nFILE_DESCRIPTION(('FreeCAD Model'),'2;1');\nFILE_NAME('Open CASCADE Shape Model','2023-12-24T11:25:"
},
{
"path": "legacy/qaxe/qaxe/3d/heatsink-13x12x5.step",
"chars": 243531,
"preview": "ISO-10303-21;\nHEADER;\nFILE_DESCRIPTION(('FreeCAD Model'),'2;1');\nFILE_NAME('Open CASCADE Shape Model','2023-12-24T10:34:"
},
{
"path": "legacy/qaxe/qaxe/3d/lga115x.step",
"chars": 2351717,
"preview": "ISO-10303-21;\nHEADER;\nFILE_DESCRIPTION(('FreeCAD Model'),'2;1');\nFILE_NAME('Open CASCADE Shape Model','2023-12-25T14:54:"
},
{
"path": "legacy/qaxe/qaxe/bitaxe.kicad_sym",
"chars": 144491,
"preview": "(kicad_symbol_lib (version 20220914) (generator kicad_symbol_editor)\n (symbol \"176x320_st7789\" (pin_names (offset 1.016"
},
{
"path": "legacy/qaxe/qaxe/bm1366.kicad_sch",
"chars": 365885,
"preview": "(kicad_sch\n\t(version 20231120)\n\t(generator \"eeschema\")\n\t(generator_version \"8.0\")\n\t(uuid \"5ffa02c9-1f90-4b06-abee-1fc0c4"
},
{
"path": "legacy/qaxe/qaxe/fp-lib-table",
"chars": 215,
"preview": "(fp_lib_table\n (version 7)\n (lib (name \"bitaxe\")(type \"KiCad\")(uri \"${KIPRJMOD}/../bitaxe.pretty\")(options \"\")(descr \""
},
{
"path": "legacy/qaxe/qaxe/ibom.config.ini",
"chars": 623,
"preview": "[html_defaults]\ndark_mode=0\nshow_pads=1\nshow_fabrication=0\nshow_silkscreen=1\nhighlight_pin1=0\nredraw_on_drag=1\nboard_rot"
},
{
"path": "legacy/qaxe/qaxe/pi.kicad_sch",
"chars": 274906,
"preview": "(kicad_sch\n\t(version 20231120)\n\t(generator \"eeschema\")\n\t(generator_version \"8.0\")\n\t(uuid \"8e794590-5d75-43f7-90af-cb959c"
},
{
"path": "legacy/qaxe/qaxe/power.kicad_sch",
"chars": 286676,
"preview": "(kicad_sch\n\t(version 20231120)\n\t(generator \"eeschema\")\n\t(generator_version \"8.0\")\n\t(uuid \"d3eaf28f-d55a-4d77-ac4e-fd16c6"
},
{
"path": "legacy/qaxe/qaxe/qaxe.kicad_pcb",
"chars": 3164233,
"preview": "(kicad_pcb\n\t(version 20240108)\n\t(generator \"pcbnew\")\n\t(generator_version \"8.0\")\n\t(general\n\t\t(thickness 1.6)\n\t\t(legacy_te"
},
{
"path": "legacy/qaxe/qaxe/qaxe.kicad_pro",
"chars": 16060,
"preview": "{\n \"board\": {\n \"3dviewports\": [],\n \"design_settings\": {\n \"defaults\": {\n \"apply_defaults_to_fp_fields\""
},
{
"path": "legacy/qaxe/qaxe/qaxe.kicad_sch",
"chars": 32230,
"preview": "(kicad_sch\n\t(version 20231120)\n\t(generator \"eeschema\")\n\t(generator_version \"8.0\")\n\t(uuid \"e63e39d7-6ac0-4ffd-8aa3-1841a4"
},
{
"path": "legacy/qaxe/qaxe/qaxe.pretty/BM1366.kicad_mod",
"chars": 7569,
"preview": "(footprint \"BM1366\" (version 20221018) (generator pcbnew)\n (layer \"F.Cu\")\n (property \"Distributor\" \"X\")\n (property \"S"
},
{
"path": "legacy/qaxe/qaxe/qaxe.pretty/BarrelJack_CUI_PJ-102AH_Horizontal.kicad_mod",
"chars": 5414,
"preview": "(footprint \"BarrelJack_CUI_PJ-102AH_Horizontal\" (version 20221018) (generator pcbnew)\n (layer \"F.Cu\")\n (descr \"Thin-pi"
},
{
"path": "legacy/qaxe/qaxe/qaxe.pretty/CP_EIA-7343-15_Kemet-W.kicad_mod",
"chars": 3434,
"preview": "(footprint \"CP_EIA-7343-15_Kemet-W\" (version 20221018) (generator pcbnew)\n (layer \"F.Cu\")\n (descr \"Tantalum Capacitor "
},
{
"path": "legacy/qaxe/qaxe/qaxe.pretty/CP_Elec_8x10.kicad_mod",
"chars": 6421,
"preview": "(footprint \"CP_Elec_8x10\" (version 20221018) (generator pcbnew)\n (layer \"F.Cu\")\n (descr \"SMD capacitor, aluminum elect"
},
{
"path": "legacy/qaxe/qaxe/qaxe.pretty/C_0805_2012Metric.kicad_mod",
"chars": 3176,
"preview": "(footprint \"C_0805_2012Metric\" (version 20221018) (generator pcbnew)\n (layer \"F.Cu\")\n (descr \"Capacitor SMD 0805 (2012"
},
{
"path": "legacy/qaxe/qaxe/qaxe.pretty/C_1206_3216Metric.kicad_mod",
"chars": 3143,
"preview": "(footprint \"C_1206_3216Metric\" (version 20221018) (generator pcbnew)\n (layer \"F.Cu\")\n (descr \"Capacitor SMD 1206 (3216"
},
{
"path": "legacy/qaxe/qaxe/qaxe.pretty/C_1210_3225Metric.kicad_mod",
"chars": 3173,
"preview": "(footprint \"C_1210_3225Metric\" (version 20221018) (generator pcbnew)\n (layer \"F.Cu\")\n (descr \"Capacitor SMD 1210 (3225"
},
{
"path": "legacy/qaxe/qaxe/qaxe.pretty/D_SMB.kicad_mod",
"chars": 4034,
"preview": "(footprint \"D_SMB\" (version 20221018) (generator pcbnew)\n (layer \"F.Cu\")\n (descr \"Diode SMB (DO-214AA)\")\n (tags \"Diod"
},
{
"path": "legacy/qaxe/qaxe/qaxe.pretty/D_SOD-128.kicad_mod",
"chars": 4130,
"preview": "(footprint \"D_SOD-128\" (version 20221018) (generator pcbnew)\n (layer \"F.Cu\")\n (descr \"D_SOD-128 (CFP5 SlimSMAW), https"
},
{
"path": "legacy/qaxe/qaxe/qaxe.pretty/D_SOD-323.kicad_mod",
"chars": 3897,
"preview": "(footprint \"D_SOD-323\" (version 20221018) (generator pcbnew)\n (layer \"F.Cu\")\n (descr \"SOD-323\")\n (tags \"SOD-323\")\n ("
},
{
"path": "legacy/qaxe/qaxe/qaxe.pretty/FanPinHeader_1x04_P2.54mm_Vertical.kicad_mod",
"chars": 5161,
"preview": "(footprint \"FanPinHeader_1x04_P2.54mm_Vertical\" (version 20221018) (generator pcbnew)\n (layer \"F.Cu\")\n (descr \"4-pin C"
},
{
"path": "legacy/qaxe/qaxe/qaxe.pretty/IFLR-4031GC-01-8x10.kicad_mod",
"chars": 2708,
"preview": "(footprint \"IFLR-4031GC-01-8x10\" (version 20221018) (generator pcbnew)\n (layer \"F.Cu\")\n (property \"Distributor\" \"D\")\n "
},
{
"path": "legacy/qaxe/qaxe/qaxe.pretty/KiCad-Logo2_5mm_SilkScreen.kicad_mod",
"chars": 58011,
"preview": "(footprint \"KiCad-Logo2_5mm_SilkScreen\" (version 20221018) (generator pcbnew)\n locked (layer \"F.Cu\")\n (descr \"KiCad Lo"
},
{
"path": "legacy/qaxe/qaxe/qaxe.pretty/LED_1206_3216Metric.kicad_mod",
"chars": 3273,
"preview": "(footprint \"LED_1206_3216Metric\" (version 20221018) (generator pcbnew)\n (layer \"F.Cu\")\n (descr \"LED SMD 1206 (3216 Met"
},
{
"path": "legacy/qaxe/qaxe/qaxe.pretty/LQFP-48_7x7mm_P0.5mm.kicad_mod",
"chars": 15028,
"preview": "(footprint \"LQFP-48_7x7mm_P0.5mm\" (version 20221018) (generator pcbnew)\n (layer \"F.Cu\")\n (descr \"LQFP, 48 Pin (https:/"
},
{
"path": "legacy/qaxe/qaxe/qaxe.pretty/L_Taiyo-Yuden_NR-50xx.kicad_mod",
"chars": 3521,
"preview": "(footprint \"L_Taiyo-Yuden_NR-50xx\" (version 20221018) (generator pcbnew)\n (layer \"F.Cu\")\n (descr \"Inductor, Taiyo Yude"
},
{
"path": "legacy/qaxe/qaxe/qaxe.pretty/MountingHole_3.2mm_M3.kicad_mod",
"chars": 1205,
"preview": "(footprint \"MountingHole_3.2mm_M3\" (version 20221018) (generator pcbnew)\n locked (layer \"F.Cu\")\n (descr \"Mounting Hole"
},
{
"path": "legacy/qaxe/qaxe/qaxe.pretty/MountingHole_3.2mm_M3_Pad_Via.kicad_mod",
"chars": 2414,
"preview": "(footprint \"MountingHole_3.2mm_M3_Pad_Via\" (version 20221018) (generator pcbnew)\n locked (layer \"F.Cu\")\n (descr \"Mount"
},
{
"path": "legacy/qaxe/qaxe/qaxe.pretty/NetTie-2_L3_SMD_Pad0.5mm.kicad_mod",
"chars": 1254,
"preview": "(footprint \"NetTie-2_L3_SMD_Pad0.5mm\" (version 20221018) (generator pcbnew)\n (layer \"F.Cu\")\n (descr \"Net tie, 2 pin, 0"
},
{
"path": "legacy/qaxe/qaxe/qaxe.pretty/NetTie-2_SMD_Pad0.5mm.kicad_mod",
"chars": 1288,
"preview": "(footprint \"NetTie-2_SMD_Pad0.5mm\" (version 20221018) (generator pcbnew)\n (layer \"F.Cu\")\n (descr \"Net tie, 2 pin, 0.5m"
},
{
"path": "legacy/qaxe/qaxe/qaxe.pretty/Oscillator_SMD_EuroQuartz_XO32-4Pin_3.2x2.5mm.kicad_mod",
"chars": 4808,
"preview": "(footprint \"Oscillator_SMD_EuroQuartz_XO32-4Pin_3.2x2.5mm\" (version 20221018) (generator pcbnew)\n (layer \"F.Cu\")\n (des"
},
{
"path": "legacy/qaxe/qaxe/qaxe.pretty/PinHeader_1x02_P2.54mm_Vertical.kicad_mod",
"chars": 3736,
"preview": "(footprint \"PinHeader_1x02_P2.54mm_Vertical\" (version 20221018) (generator pcbnew)\n (layer \"F.Cu\")\n (descr \"Through ho"
},
{
"path": "legacy/qaxe/qaxe/qaxe.pretty/PinHeader_1x06_P1.27mm_Vertical.kicad_mod",
"chars": 4710,
"preview": "(footprint \"PinHeader_1x06_P1.27mm_Vertical\" (version 20221018) (generator pcbnew)\n (layer \"F.Cu\")\n (descr \"Through ho"
},
{
"path": "legacy/qaxe/qaxe/qaxe.pretty/PinHeader_IDC_2x05_P1.27mm_Vertical_SMD.kicad_mod",
"chars": 6290,
"preview": "(footprint \"PinHeader_IDC_2x05_P1.27mm_Vertical_SMD\" (version 20221018) (generator pcbnew)\n (layer \"F.Cu\")\n (descr \"Th"
},
{
"path": "legacy/qaxe/qaxe/qaxe.pretty/QFN-32-1EP_5x5mm_P0.5mm_EP3.45x3.45mm_ThermalVias.kicad_mod",
"chars": 17012,
"preview": "(footprint \"QFN-32-1EP_5x5mm_P0.5mm_EP3.45x3.45mm_ThermalVias\" (version 20221018) (generator pcbnew)\n (layer \"F.Cu\")\n "
},
{
"path": "legacy/qaxe/qaxe/qaxe.pretty/R_0805_2012Metric.kicad_mod",
"chars": 3049,
"preview": "(footprint \"R_0805_2012Metric\" (version 20221018) (generator pcbnew)\n (layer \"F.Cu\")\n (descr \"Resistor SMD 0805 (2012 "
},
{
"path": "legacy/qaxe/qaxe/qaxe.pretty/R_1206_3216Metric.kicad_mod",
"chars": 3050,
"preview": "(footprint \"R_1206_3216Metric\" (version 20221018) (generator pcbnew)\n (layer \"F.Cu\")\n (descr \"Resistor SMD 1206 (3216 "
},
{
"path": "legacy/qaxe/qaxe/qaxe.pretty/R_1210_3225Metric.kicad_mod",
"chars": 3139,
"preview": "(footprint \"R_1210_3225Metric\" (version 20221018) (generator pcbnew)\n (layer \"F.Cu\")\n (descr \"Resistor SMD 1210 (3225 "
},
{
"path": "legacy/qaxe/qaxe/qaxe.pretty/R_2010_5025Metric.kicad_mod",
"chars": 3173,
"preview": "(footprint \"R_2010_5025Metric\" (version 20221018) (generator pcbnew)\n (layer \"F.Cu\")\n (descr \"Resistor SMD 2010 (5025 "
},
{
"path": "legacy/qaxe/qaxe/qaxe.pretty/SOT-223-3_TabPin2.kicad_mod",
"chars": 3523,
"preview": "(footprint \"SOT-223-3_TabPin2\" (version 20221018) (generator pcbnew)\n (layer \"F.Cu\")\n (descr \"module CMS SOT223 4 pins"
},
{
"path": "legacy/qaxe/qaxe/qaxe.pretty/SOT-23-5.kicad_mod",
"chars": 3940,
"preview": "(footprint \"SOT-23-5\" (version 20221018) (generator pcbnew)\n (layer \"F.Cu\")\n (descr \"SOT, 5 Pin (https://www.jedec.org"
},
{
"path": "legacy/qaxe/qaxe/qaxe.pretty/SOT-23-6.kicad_mod",
"chars": 4040,
"preview": "(footprint \"SOT-23-6\" (version 20221018) (generator pcbnew)\n (layer \"F.Cu\")\n (descr \"SOT, 6 Pin (https://www.jedec.org"
},
{
"path": "legacy/qaxe/qaxe/qaxe.pretty/SOT-23.kicad_mod",
"chars": 3547,
"preview": "(footprint \"SOT-23\" (version 20221018) (generator pcbnew)\n (layer \"F.Cu\")\n (descr \"SOT, 3 Pin (https://www.jedec.org/s"
},
{
"path": "legacy/qaxe/qaxe/qaxe.pretty/SOT-363_SC-70-6.kicad_mod",
"chars": 3437,
"preview": "(footprint \"SOT-363_SC-70-6\" (version 20221018) (generator pcbnew)\n (layer \"F.Cu\")\n (descr \"SOT-363, SC-70-6\")\n (tags"
},
{
"path": "legacy/qaxe/qaxe/qaxe.pretty/TMP1075-DRL.kicad_mod",
"chars": 3371,
"preview": "(footprint \"TMP1075-DRL\" (version 20221018) (generator pcbnew)\n (layer \"F.Cu\")\n (property \"Distributor\" \"D\")\n (proper"
},
{
"path": "legacy/qaxe/qaxe/qaxe.pretty/TestPoint_Pad_2.0x2.0mm.kicad_mod",
"chars": 2216,
"preview": "(footprint \"TestPoint_Pad_2.0x2.0mm\" (version 20221018) (generator pcbnew)\n (layer \"F.Cu\")\n (descr \"SMD rectangular pa"
},
{
"path": "legacy/qaxe/qaxe/qaxe.pretty/TestPoint_Pad_D1.5mm.kicad_mod",
"chars": 1327,
"preview": "(footprint \"TestPoint_Pad_D1.5mm\" (version 20221018) (generator pcbnew)\n (layer \"F.Cu\")\n (descr \"SMD pad as test Point"
},
{
"path": "legacy/qaxe/qaxe/qaxe.pretty/USB_C_Receptacle_GCT_USB4105-xx-A_16P_TopMnt_Horizontal.kicad_mod",
"chars": 5814,
"preview": "(footprint \"USB_C_Receptacle_GCT_USB4105-xx-A_16P_TopMnt_Horizontal\" (version 20221018) (generator pcbnew)\n (layer \"F.C"
},
{
"path": "legacy/qaxe/qaxe/qaxe.pretty/VSONP-8-1EP_5x6_P1.27mm.kicad_mod",
"chars": 5007,
"preview": "(footprint \"VSONP-8-1EP_5x6_P1.27mm\" (version 20221018) (generator pcbnew)\n (layer \"F.Cu\")\n (descr \"SON, 8-Leads, Body"
},
{
"path": "legacy/qaxe/qaxe/qaxe.pretty/dummy.kicad_mod",
"chars": 862,
"preview": "(footprint \"dummy\" (version 20221018) (generator pcbnew)\n locked (layer \"F.Cu\")\n (attr through_hole)\n (fp_text refere"
},
{
"path": "legacy/qaxe/qaxe/qaxe.pretty/fuseholder_littlefuse_blok.kicad_mod",
"chars": 2344,
"preview": "(footprint \"fuseholder_littlefuse_blok\" (version 20221018) (generator pcbnew)\n (layer \"F.Cu\")\n (property \"Distributor\""
},
{
"path": "legacy/qaxe/qaxe/qaxe.pretty/polarity.kicad_mod",
"chars": 2164,
"preview": "(footprint \"polarity\" (version 20221018) (generator pcbnew)\n (layer \"F.Cu\")\n (property \"Distributor\" \"-\")\n (property "
},
{
"path": "legacy/qaxe/qaxe/qaxe.pretty/qaxelogo.kicad_mod",
"chars": 30264,
"preview": "(footprint \"qaxelogo\" (version 20221018) (generator pcbnew)\n locked (layer \"F.Cu\")\n (attr board_only exclude_from_pos_"
},
{
"path": "legacy/qaxe/qaxe/qaxelogo.kicad_mod",
"chars": 30509,
"preview": "(footprint \"LOGO\" (version 20221018) (generator bitmap2component)\n (layer \"F.Cu\")\n (attr board_only exclude_from_pos_f"
},
{
"path": "legacy/qaxe/qaxe/sym-lib-table",
"chars": 127,
"preview": "(sym_lib_table\n (version 7)\n (lib (name \"bitaxe\")(type \"KiCad\")(uri \"${KIPRJMOD}/bitaxe.kicad_sym\")(options \"\")(descr "
},
{
"path": "legacy/qaxe+/bom/ibom.html",
"chars": 434792,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, i"
},
{
"path": "legacy/qaxe+/gerbers/qaxe-B_Cu.gbl",
"chars": 323300,
"preview": "G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,8.0.1-8.0.1-1~ubuntu22.04.1*\nG04 #@! TF.CreationDate,2024-05-15T13:20:28+02:0"
},
{
"path": "legacy/qaxe+/gerbers/qaxe-B_Mask.gbs",
"chars": 9355,
"preview": "G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,8.0.1-8.0.1-1~ubuntu22.04.1*\nG04 #@! TF.CreationDate,2024-05-15T13:20:28+02:0"
},
{
"path": "legacy/qaxe+/gerbers/qaxe-B_Paste.gbp",
"chars": 6482,
"preview": "G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,8.0.1-8.0.1-1~ubuntu22.04.1*\nG04 #@! TF.CreationDate,2024-05-15T13:20:28+02:0"
},
{
"path": "legacy/qaxe+/gerbers/qaxe-B_Silkscreen.gbo",
"chars": 234053,
"preview": "G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,8.0.1-8.0.1-1~ubuntu22.04.1*\nG04 #@! TF.CreationDate,2024-05-15T13:20:28+02:0"
},
{
"path": "legacy/qaxe+/gerbers/qaxe-Edge_Cuts.gm1",
"chars": 763,
"preview": "G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,8.0.1-8.0.1-1~ubuntu22.04.1*\nG04 #@! TF.CreationDate,2024-05-15T13:20:28+02:0"
},
{
"path": "legacy/qaxe+/gerbers/qaxe-F_Cu.gtl",
"chars": 478293,
"preview": "G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,8.0.1-8.0.1-1~ubuntu22.04.1*\nG04 #@! TF.CreationDate,2024-05-15T13:20:27+02:0"
},
{
"path": "legacy/qaxe+/gerbers/qaxe-F_Mask.gts",
"chars": 29974,
"preview": "G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,8.0.1-8.0.1-1~ubuntu22.04.1*\nG04 #@! TF.CreationDate,2024-05-15T13:20:28+02:0"
},
{
"path": "legacy/qaxe+/gerbers/qaxe-F_Paste.gtp",
"chars": 29647,
"preview": "G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,8.0.1-8.0.1-1~ubuntu22.04.1*\nG04 #@! TF.CreationDate,2024-05-15T13:20:28+02:0"
},
{
"path": "legacy/qaxe+/gerbers/qaxe-F_Silkscreen.gto",
"chars": 428118,
"preview": "G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,8.0.1-8.0.1-1~ubuntu22.04.1*\nG04 #@! TF.CreationDate,2024-05-15T13:20:28+02:0"
},
{
"path": "legacy/qaxe+/gerbers/qaxe-In1_Cu.g2",
"chars": 404139,
"preview": "G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,8.0.1-8.0.1-1~ubuntu22.04.1*\nG04 #@! TF.CreationDate,2024-05-15T13:20:28+02:0"
},
{
"path": "legacy/qaxe+/gerbers/qaxe-In2_Cu.g3",
"chars": 254738,
"preview": "G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,8.0.1-8.0.1-1~ubuntu22.04.1*\nG04 #@! TF.CreationDate,2024-05-15T13:20:28+02:0"
},
{
"path": "legacy/qaxe+/gerbers/qaxe-NPTH.drl",
"chars": 737,
"preview": "M48\n; DRILL file {KiCad 8.0.1-8.0.1-1~ubuntu22.04.1} date 2024-05-15T13:20:31+0200\n; FORMAT={-:-/ absolute / metric / de"
},
{
"path": "legacy/qaxe+/gerbers/qaxe-PTH.drl",
"chars": 9263,
"preview": "M48\n; DRILL file {KiCad 8.0.1-8.0.1-1~ubuntu22.04.1} date 2024-05-15T13:20:31+0200\n; FORMAT={-:-/ absolute / metric / de"
},
{
"path": "legacy/qaxe+/qaxe/.gitattributes",
"chars": 33,
"preview": "*.html linguist-detectable=false\n"
},
{
"path": "legacy/qaxe+/qaxe/.gitignore",
"chars": 474,
"preview": "# For PCBs designed using KiCad: https://www.kicad.org/\n# Format documentation: https://kicad.org/help/file-formats/\n\n# "
},
{
"path": "legacy/qaxe+/qaxe/1366_logo.kicad_mod",
"chars": 55255,
"preview": "(footprint \"LOGO\" (version 20221018) (generator bitmap2component)\n (layer \"F.Cu\")\n (attr board_only exclude_from_pos_f"
},
{
"path": "legacy/qaxe+/qaxe/3d/AB2_SON5x6MM.wrl",
"chars": 56166,
"preview": "#VRML V2.0 utf8\n#Exported from Wings 3D 1.5.1\nDEF STL_object Transform {\n children [\n Shape {\n appearance Appea"
},
{
"path": "legacy/qaxe+/qaxe/3d/FP1006V2-R.STEP",
"chars": 184518,
"preview": "ISO-10303-21;\r\nHEADER;\r\nFILE_DESCRIPTION (( 'STEP AP203' ),\r\n '1' );\r\nFILE_NAME ('FP1006V2-R.STEP',\r\n '2020-01-07T"
},
{
"path": "legacy/qaxe+/qaxe/3d/KMR231GLFS.stp",
"chars": 869606,
"preview": "ISO-10303-21;\r\nHEADER;\r\nFILE_DESCRIPTION( ( 'STEP AP214' ), ' ' );\r\nFILE_NAME( 'C:/Users/KMIROS~1/AppData/Local/Temp/pso"
},
{
"path": "legacy/qaxe+/qaxe/3d/Littelfuse 0154.500DRT without value_black v2.step",
"chars": 482569,
"preview": "ISO-10303-21;\r\nHEADER;\r\n/* Generated by software containing ST-Developer\r\n * from STEP Tools, Inc. (www.steptools.com) \r"
},
{
"path": "legacy/qaxe+/qaxe/3d/barrel-jack.step",
"chars": 51080,
"preview": "ISO-10303-21;\nHEADER;\nFILE_DESCRIPTION(('FreeCAD Model'),'2;1');\nFILE_NAME('Open CASCADE Shape Model','2023-10-26T14:26:"
},
{
"path": "legacy/qaxe+/qaxe/3d/bm1366.step",
"chars": 18631,
"preview": "ISO-10303-21;\nHEADER;\nFILE_DESCRIPTION(('FreeCAD Model'),'2;1');\nFILE_NAME('Open CASCADE Shape Model','2023-12-24T11:25:"
},
{
"path": "legacy/qaxe+/qaxe/3d/heatsink-13x12x5.step",
"chars": 243531,
"preview": "ISO-10303-21;\nHEADER;\nFILE_DESCRIPTION(('FreeCAD Model'),'2;1');\nFILE_NAME('Open CASCADE Shape Model','2023-12-24T10:34:"
},
{
"path": "legacy/qaxe+/qaxe/3d/lga115x.step",
"chars": 2351717,
"preview": "ISO-10303-21;\nHEADER;\nFILE_DESCRIPTION(('FreeCAD Model'),'2;1');\nFILE_NAME('Open CASCADE Shape Model','2023-12-25T14:54:"
},
{
"path": "legacy/qaxe+/qaxe/bitaxe.kicad_sym",
"chars": 144491,
"preview": "(kicad_symbol_lib (version 20220914) (generator kicad_symbol_editor)\n (symbol \"176x320_st7789\" (pin_names (offset 1.016"
},
{
"path": "legacy/qaxe+/qaxe/bm1366.kicad_sch",
"chars": 384655,
"preview": "(kicad_sch\n\t(version 20231120)\n\t(generator \"eeschema\")\n\t(generator_version \"8.0\")\n\t(uuid \"5ffa02c9-1f90-4b06-abee-1fc0c4"
},
{
"path": "legacy/qaxe+/qaxe/fp-lib-table",
"chars": 215,
"preview": "(fp_lib_table\n (version 7)\n (lib (name \"bitaxe\")(type \"KiCad\")(uri \"${KIPRJMOD}/../bitaxe.pretty\")(options \"\")(descr \""
},
{
"path": "legacy/qaxe+/qaxe/ibom.config.ini",
"chars": 623,
"preview": "[html_defaults]\ndark_mode=0\nshow_pads=1\nshow_fabrication=0\nshow_silkscreen=1\nhighlight_pin1=0\nredraw_on_drag=1\nboard_rot"
},
{
"path": "legacy/qaxe+/qaxe/pi.kicad_sch",
"chars": 274568,
"preview": "(kicad_sch\n\t(version 20231120)\n\t(generator \"eeschema\")\n\t(generator_version \"8.0\")\n\t(uuid \"8e794590-5d75-43f7-90af-cb959c"
},
{
"path": "legacy/qaxe+/qaxe/power.kicad_sch",
"chars": 295175,
"preview": "(kicad_sch\n\t(version 20231120)\n\t(generator \"eeschema\")\n\t(generator_version \"8.0\")\n\t(uuid \"d3eaf28f-d55a-4d77-ac4e-fd16c6"
},
{
"path": "legacy/qaxe+/qaxe/qaxe.kicad_pcb",
"chars": 3228344,
"preview": "(kicad_pcb\n\t(version 20240108)\n\t(generator \"pcbnew\")\n\t(generator_version \"8.0\")\n\t(general\n\t\t(thickness 1.6)\n\t\t(legacy_te"
},
{
"path": "legacy/qaxe+/qaxe/qaxe.kicad_pro",
"chars": 16072,
"preview": "{\n \"board\": {\n \"3dviewports\": [],\n \"design_settings\": {\n \"defaults\": {\n \"apply_defaults_to_fp_fields\""
},
{
"path": "legacy/qaxe+/qaxe/qaxe.kicad_sch",
"chars": 32230,
"preview": "(kicad_sch\n\t(version 20231120)\n\t(generator \"eeschema\")\n\t(generator_version \"8.0\")\n\t(uuid \"e63e39d7-6ac0-4ffd-8aa3-1841a4"
},
{
"path": "legacy/qaxe+/qaxe/qaxe.pretty/BM1366.kicad_mod",
"chars": 7569,
"preview": "(footprint \"BM1366\" (version 20221018) (generator pcbnew)\n (layer \"F.Cu\")\n (property \"Distributor\" \"X\")\n (property \"S"
},
{
"path": "legacy/qaxe+/qaxe/qaxe.pretty/BarrelJack_CUI_PJ-102AH_Horizontal.kicad_mod",
"chars": 5414,
"preview": "(footprint \"BarrelJack_CUI_PJ-102AH_Horizontal\" (version 20221018) (generator pcbnew)\n (layer \"F.Cu\")\n (descr \"Thin-pi"
},
{
"path": "legacy/qaxe+/qaxe/qaxe.pretty/CP_EIA-7343-15_Kemet-W.kicad_mod",
"chars": 3434,
"preview": "(footprint \"CP_EIA-7343-15_Kemet-W\" (version 20221018) (generator pcbnew)\n (layer \"F.Cu\")\n (descr \"Tantalum Capacitor "
},
{
"path": "legacy/qaxe+/qaxe/qaxe.pretty/CP_Elec_8x10.kicad_mod",
"chars": 6421,
"preview": "(footprint \"CP_Elec_8x10\" (version 20221018) (generator pcbnew)\n (layer \"F.Cu\")\n (descr \"SMD capacitor, aluminum elect"
},
{
"path": "legacy/qaxe+/qaxe/qaxe.pretty/C_0805_2012Metric.kicad_mod",
"chars": 3176,
"preview": "(footprint \"C_0805_2012Metric\" (version 20221018) (generator pcbnew)\n (layer \"F.Cu\")\n (descr \"Capacitor SMD 0805 (2012"
},
{
"path": "legacy/qaxe+/qaxe/qaxe.pretty/C_1206_3216Metric.kicad_mod",
"chars": 3143,
"preview": "(footprint \"C_1206_3216Metric\" (version 20221018) (generator pcbnew)\n (layer \"F.Cu\")\n (descr \"Capacitor SMD 1206 (3216"
},
{
"path": "legacy/qaxe+/qaxe/qaxe.pretty/C_1210_3225Metric.kicad_mod",
"chars": 3173,
"preview": "(footprint \"C_1210_3225Metric\" (version 20221018) (generator pcbnew)\n (layer \"F.Cu\")\n (descr \"Capacitor SMD 1210 (3225"
},
{
"path": "legacy/qaxe+/qaxe/qaxe.pretty/D_SMB.kicad_mod",
"chars": 4034,
"preview": "(footprint \"D_SMB\" (version 20221018) (generator pcbnew)\n (layer \"F.Cu\")\n (descr \"Diode SMB (DO-214AA)\")\n (tags \"Diod"
},
{
"path": "legacy/qaxe+/qaxe/qaxe.pretty/D_SOD-128.kicad_mod",
"chars": 4130,
"preview": "(footprint \"D_SOD-128\" (version 20221018) (generator pcbnew)\n (layer \"F.Cu\")\n (descr \"D_SOD-128 (CFP5 SlimSMAW), https"
},
{
"path": "legacy/qaxe+/qaxe/qaxe.pretty/D_SOD-323.kicad_mod",
"chars": 3897,
"preview": "(footprint \"D_SOD-323\" (version 20221018) (generator pcbnew)\n (layer \"F.Cu\")\n (descr \"SOD-323\")\n (tags \"SOD-323\")\n ("
},
{
"path": "legacy/qaxe+/qaxe/qaxe.pretty/FanPinHeader_1x04_P2.54mm_Vertical.kicad_mod",
"chars": 5161,
"preview": "(footprint \"FanPinHeader_1x04_P2.54mm_Vertical\" (version 20221018) (generator pcbnew)\n (layer \"F.Cu\")\n (descr \"4-pin C"
},
{
"path": "legacy/qaxe+/qaxe/qaxe.pretty/IFLR-4031GC-01-8x10.kicad_mod",
"chars": 2708,
"preview": "(footprint \"IFLR-4031GC-01-8x10\" (version 20221018) (generator pcbnew)\n (layer \"F.Cu\")\n (property \"Distributor\" \"D\")\n "
},
{
"path": "legacy/qaxe+/qaxe/qaxe.pretty/KiCad-Logo2_5mm_SilkScreen.kicad_mod",
"chars": 58011,
"preview": "(footprint \"KiCad-Logo2_5mm_SilkScreen\" (version 20221018) (generator pcbnew)\n locked (layer \"F.Cu\")\n (descr \"KiCad Lo"
},
{
"path": "legacy/qaxe+/qaxe/qaxe.pretty/LED_1206_3216Metric.kicad_mod",
"chars": 3273,
"preview": "(footprint \"LED_1206_3216Metric\" (version 20221018) (generator pcbnew)\n (layer \"F.Cu\")\n (descr \"LED SMD 1206 (3216 Met"
},
{
"path": "legacy/qaxe+/qaxe/qaxe.pretty/LQFP-48_7x7mm_P0.5mm.kicad_mod",
"chars": 15028,
"preview": "(footprint \"LQFP-48_7x7mm_P0.5mm\" (version 20221018) (generator pcbnew)\n (layer \"F.Cu\")\n (descr \"LQFP, 48 Pin (https:/"
},
{
"path": "legacy/qaxe+/qaxe/qaxe.pretty/L_Taiyo-Yuden_NR-50xx.kicad_mod",
"chars": 3521,
"preview": "(footprint \"L_Taiyo-Yuden_NR-50xx\" (version 20221018) (generator pcbnew)\n (layer \"F.Cu\")\n (descr \"Inductor, Taiyo Yude"
},
{
"path": "legacy/qaxe+/qaxe/qaxe.pretty/MountingHole_3.2mm_M3.kicad_mod",
"chars": 1205,
"preview": "(footprint \"MountingHole_3.2mm_M3\" (version 20221018) (generator pcbnew)\n locked (layer \"F.Cu\")\n (descr \"Mounting Hole"
},
{
"path": "legacy/qaxe+/qaxe/qaxe.pretty/MountingHole_3.2mm_M3_Pad_Via.kicad_mod",
"chars": 2414,
"preview": "(footprint \"MountingHole_3.2mm_M3_Pad_Via\" (version 20221018) (generator pcbnew)\n locked (layer \"F.Cu\")\n (descr \"Mount"
},
{
"path": "legacy/qaxe+/qaxe/qaxe.pretty/NetTie-2_L3_SMD_Pad0.5mm.kicad_mod",
"chars": 1254,
"preview": "(footprint \"NetTie-2_L3_SMD_Pad0.5mm\" (version 20221018) (generator pcbnew)\n (layer \"F.Cu\")\n (descr \"Net tie, 2 pin, 0"
},
{
"path": "legacy/qaxe+/qaxe/qaxe.pretty/NetTie-2_SMD_Pad0.5mm.kicad_mod",
"chars": 1288,
"preview": "(footprint \"NetTie-2_SMD_Pad0.5mm\" (version 20221018) (generator pcbnew)\n (layer \"F.Cu\")\n (descr \"Net tie, 2 pin, 0.5m"
},
{
"path": "legacy/qaxe+/qaxe/qaxe.pretty/Oscillator_SMD_EuroQuartz_XO32-4Pin_3.2x2.5mm.kicad_mod",
"chars": 4808,
"preview": "(footprint \"Oscillator_SMD_EuroQuartz_XO32-4Pin_3.2x2.5mm\" (version 20221018) (generator pcbnew)\n (layer \"F.Cu\")\n (des"
},
{
"path": "legacy/qaxe+/qaxe/qaxe.pretty/PinHeader_1x02_P2.54mm_Vertical.kicad_mod",
"chars": 3736,
"preview": "(footprint \"PinHeader_1x02_P2.54mm_Vertical\" (version 20221018) (generator pcbnew)\n (layer \"F.Cu\")\n (descr \"Through ho"
},
{
"path": "legacy/qaxe+/qaxe/qaxe.pretty/PinHeader_1x06_P1.27mm_Vertical.kicad_mod",
"chars": 4710,
"preview": "(footprint \"PinHeader_1x06_P1.27mm_Vertical\" (version 20221018) (generator pcbnew)\n (layer \"F.Cu\")\n (descr \"Through ho"
},
{
"path": "legacy/qaxe+/qaxe/qaxe.pretty/PinHeader_IDC_2x05_P1.27mm_Vertical_SMD.kicad_mod",
"chars": 6290,
"preview": "(footprint \"PinHeader_IDC_2x05_P1.27mm_Vertical_SMD\" (version 20221018) (generator pcbnew)\n (layer \"F.Cu\")\n (descr \"Th"
},
{
"path": "legacy/qaxe+/qaxe/qaxe.pretty/QFN-32-1EP_5x5mm_P0.5mm_EP3.45x3.45mm_ThermalVias.kicad_mod",
"chars": 17012,
"preview": "(footprint \"QFN-32-1EP_5x5mm_P0.5mm_EP3.45x3.45mm_ThermalVias\" (version 20221018) (generator pcbnew)\n (layer \"F.Cu\")\n "
},
{
"path": "legacy/qaxe+/qaxe/qaxe.pretty/R_0805_2012Metric.kicad_mod",
"chars": 3049,
"preview": "(footprint \"R_0805_2012Metric\" (version 20221018) (generator pcbnew)\n (layer \"F.Cu\")\n (descr \"Resistor SMD 0805 (2012 "
},
{
"path": "legacy/qaxe+/qaxe/qaxe.pretty/R_1206_3216Metric.kicad_mod",
"chars": 3050,
"preview": "(footprint \"R_1206_3216Metric\" (version 20221018) (generator pcbnew)\n (layer \"F.Cu\")\n (descr \"Resistor SMD 1206 (3216 "
},
{
"path": "legacy/qaxe+/qaxe/qaxe.pretty/R_1210_3225Metric.kicad_mod",
"chars": 3139,
"preview": "(footprint \"R_1210_3225Metric\" (version 20221018) (generator pcbnew)\n (layer \"F.Cu\")\n (descr \"Resistor SMD 1210 (3225 "
},
{
"path": "legacy/qaxe+/qaxe/qaxe.pretty/R_2010_5025Metric.kicad_mod",
"chars": 3173,
"preview": "(footprint \"R_2010_5025Metric\" (version 20221018) (generator pcbnew)\n (layer \"F.Cu\")\n (descr \"Resistor SMD 2010 (5025 "
},
{
"path": "legacy/qaxe+/qaxe/qaxe.pretty/SOT-223-3_TabPin2.kicad_mod",
"chars": 3523,
"preview": "(footprint \"SOT-223-3_TabPin2\" (version 20221018) (generator pcbnew)\n (layer \"F.Cu\")\n (descr \"module CMS SOT223 4 pins"
},
{
"path": "legacy/qaxe+/qaxe/qaxe.pretty/SOT-23-5.kicad_mod",
"chars": 3940,
"preview": "(footprint \"SOT-23-5\" (version 20221018) (generator pcbnew)\n (layer \"F.Cu\")\n (descr \"SOT, 5 Pin (https://www.jedec.org"
},
{
"path": "legacy/qaxe+/qaxe/qaxe.pretty/SOT-23-6.kicad_mod",
"chars": 4040,
"preview": "(footprint \"SOT-23-6\" (version 20221018) (generator pcbnew)\n (layer \"F.Cu\")\n (descr \"SOT, 6 Pin (https://www.jedec.org"
},
{
"path": "legacy/qaxe+/qaxe/qaxe.pretty/SOT-23.kicad_mod",
"chars": 3547,
"preview": "(footprint \"SOT-23\" (version 20221018) (generator pcbnew)\n (layer \"F.Cu\")\n (descr \"SOT, 3 Pin (https://www.jedec.org/s"
},
{
"path": "legacy/qaxe+/qaxe/qaxe.pretty/SOT-363_SC-70-6.kicad_mod",
"chars": 3437,
"preview": "(footprint \"SOT-363_SC-70-6\" (version 20221018) (generator pcbnew)\n (layer \"F.Cu\")\n (descr \"SOT-363, SC-70-6\")\n (tags"
},
{
"path": "legacy/qaxe+/qaxe/qaxe.pretty/TMP1075-DRL.kicad_mod",
"chars": 3371,
"preview": "(footprint \"TMP1075-DRL\" (version 20221018) (generator pcbnew)\n (layer \"F.Cu\")\n (property \"Distributor\" \"D\")\n (proper"
},
{
"path": "legacy/qaxe+/qaxe/qaxe.pretty/TestPoint_Pad_2.0x2.0mm.kicad_mod",
"chars": 2216,
"preview": "(footprint \"TestPoint_Pad_2.0x2.0mm\" (version 20221018) (generator pcbnew)\n (layer \"F.Cu\")\n (descr \"SMD rectangular pa"
},
{
"path": "legacy/qaxe+/qaxe/qaxe.pretty/TestPoint_Pad_D1.5mm.kicad_mod",
"chars": 1327,
"preview": "(footprint \"TestPoint_Pad_D1.5mm\" (version 20221018) (generator pcbnew)\n (layer \"F.Cu\")\n (descr \"SMD pad as test Point"
},
{
"path": "legacy/qaxe+/qaxe/qaxe.pretty/USB_C_Receptacle_GCT_USB4105-xx-A_16P_TopMnt_Horizontal.kicad_mod",
"chars": 5814,
"preview": "(footprint \"USB_C_Receptacle_GCT_USB4105-xx-A_16P_TopMnt_Horizontal\" (version 20221018) (generator pcbnew)\n (layer \"F.C"
},
{
"path": "legacy/qaxe+/qaxe/qaxe.pretty/VSONP-8-1EP_5x6_P1.27mm.kicad_mod",
"chars": 5007,
"preview": "(footprint \"VSONP-8-1EP_5x6_P1.27mm\" (version 20221018) (generator pcbnew)\n (layer \"F.Cu\")\n (descr \"SON, 8-Leads, Body"
},
{
"path": "legacy/qaxe+/qaxe/qaxe.pretty/dummy.kicad_mod",
"chars": 862,
"preview": "(footprint \"dummy\" (version 20221018) (generator pcbnew)\n locked (layer \"F.Cu\")\n (attr through_hole)\n (fp_text refere"
},
{
"path": "legacy/qaxe+/qaxe/qaxe.pretty/fuseholder_littlefuse_blok.kicad_mod",
"chars": 2344,
"preview": "(footprint \"fuseholder_littlefuse_blok\" (version 20221018) (generator pcbnew)\n (layer \"F.Cu\")\n (property \"Distributor\""
},
{
"path": "legacy/qaxe+/qaxe/qaxe.pretty/polarity.kicad_mod",
"chars": 2164,
"preview": "(footprint \"polarity\" (version 20221018) (generator pcbnew)\n (layer \"F.Cu\")\n (property \"Distributor\" \"-\")\n (property "
},
{
"path": "legacy/qaxe+/qaxe/qaxe.pretty/qaxelogo.kicad_mod",
"chars": 30264,
"preview": "(footprint \"qaxelogo\" (version 20221018) (generator pcbnew)\n locked (layer \"F.Cu\")\n (attr board_only exclude_from_pos_"
},
{
"path": "legacy/qaxe+/qaxe/qaxelogo.kicad_mod",
"chars": 30509,
"preview": "(footprint \"LOGO\" (version 20221018) (generator bitmap2component)\n (layer \"F.Cu\")\n (attr board_only exclude_from_pos_f"
},
{
"path": "legacy/qaxe+/qaxe/sym-lib-table",
"chars": 127,
"preview": "(sym_lib_table\n (version 7)\n (lib (name \"bitaxe\")(type \"KiCad\")(uri \"${KIPRJMOD}/bitaxe.kicad_sym\")(options \"\")(descr "
},
{
"path": "nerdqaxe+/.gitattributes",
"chars": 33,
"preview": "*.html linguist-detectable=false\n"
},
{
"path": "nerdqaxe+/.gitignore",
"chars": 474,
"preview": "# For PCBs designed using KiCad: https://www.kicad.org/\n# Format documentation: https://kicad.org/help/file-formats/\n\n# "
},
{
"path": "nerdqaxe+/bom/ibom.html",
"chars": 431876,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, i"
},
{
"path": "nerdqaxe+/gerbers/nerdqaxe+-B_Cu.gbl",
"chars": 398488,
"preview": "G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,8.0.1-8.0.1-1~ubuntu22.04.1*\nG04 #@! TF.CreationDate,2024-09-27T09:22:18+02:0"
},
{
"path": "nerdqaxe+/gerbers/nerdqaxe+-B_Mask.gbs",
"chars": 11050,
"preview": "G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,8.0.1-8.0.1-1~ubuntu22.04.1*\nG04 #@! TF.CreationDate,2024-09-27T09:22:18+02:0"
},
{
"path": "nerdqaxe+/gerbers/nerdqaxe+-B_Paste.gbp",
"chars": 7084,
"preview": "G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,8.0.1-8.0.1-1~ubuntu22.04.1*\nG04 #@! TF.CreationDate,2024-09-27T09:22:18+02:0"
},
{
"path": "nerdqaxe+/gerbers/nerdqaxe+-B_Silkscreen.gbo",
"chars": 254174,
"preview": "G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,8.0.1-8.0.1-1~ubuntu22.04.1*\nG04 #@! TF.CreationDate,2024-09-27T09:22:18+02:0"
},
{
"path": "nerdqaxe+/gerbers/nerdqaxe+-Edge_Cuts.gm1",
"chars": 768,
"preview": "G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,8.0.1-8.0.1-1~ubuntu22.04.1*\nG04 #@! TF.CreationDate,2024-09-27T09:22:18+02:0"
},
{
"path": "nerdqaxe+/gerbers/nerdqaxe+-F_Cu.gtl",
"chars": 419813,
"preview": "G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,8.0.1-8.0.1-1~ubuntu22.04.1*\nG04 #@! TF.CreationDate,2024-09-27T09:22:17+02:0"
},
{
"path": "nerdqaxe+/gerbers/nerdqaxe+-F_Mask.gts",
"chars": 25904,
"preview": "G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,8.0.1-8.0.1-1~ubuntu22.04.1*\nG04 #@! TF.CreationDate,2024-09-27T09:22:18+02:0"
},
{
"path": "nerdqaxe+/gerbers/nerdqaxe+-F_Paste.gtp",
"chars": 29828,
"preview": "G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,8.0.1-8.0.1-1~ubuntu22.04.1*\nG04 #@! TF.CreationDate,2024-09-27T09:22:18+02:0"
},
{
"path": "nerdqaxe+/gerbers/nerdqaxe+-F_Silkscreen.gto",
"chars": 411386,
"preview": "G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,8.0.1-8.0.1-1~ubuntu22.04.1*\nG04 #@! TF.CreationDate,2024-09-27T09:22:18+02:0"
},
{
"path": "nerdqaxe+/gerbers/nerdqaxe+-In1_Cu.g2",
"chars": 421749,
"preview": "G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,8.0.1-8.0.1-1~ubuntu22.04.1*\nG04 #@! TF.CreationDate,2024-09-27T09:22:17+02:0"
},
{
"path": "nerdqaxe+/gerbers/nerdqaxe+-In2_Cu.g3",
"chars": 262884,
"preview": "G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,8.0.1-8.0.1-1~ubuntu22.04.1*\nG04 #@! TF.CreationDate,2024-09-27T09:22:17+02:0"
},
{
"path": "nerdqaxe+/gerbers/nerdqaxe+-NPTH.drl",
"chars": 637,
"preview": "M48\n; DRILL file {KiCad 8.0.1-8.0.1-1~ubuntu22.04.1} date 2024-09-27T09:22:20+0200\n; FORMAT={-:-/ absolute / metric / de"
},
{
"path": "nerdqaxe+/gerbers/nerdqaxe+-PTH.drl",
"chars": 9832,
"preview": "M48\n; DRILL file {KiCad 8.0.1-8.0.1-1~ubuntu22.04.1} date 2024-09-27T09:22:20+0200\n; FORMAT={-:-/ absolute / metric / de"
},
{
"path": "nerdqaxe+/nerdqaxe+/3d/AB2_SON5x6MM.wrl",
"chars": 56166,
"preview": "#VRML V2.0 utf8\n#Exported from Wings 3D 1.5.1\nDEF STL_object Transform {\n children [\n Shape {\n appearance Appea"
},
{
"path": "nerdqaxe+/nerdqaxe+/3d/FP1006V2-R.STEP",
"chars": 184518,
"preview": "ISO-10303-21;\r\nHEADER;\r\nFILE_DESCRIPTION (( 'STEP AP203' ),\r\n '1' );\r\nFILE_NAME ('FP1006V2-R.STEP',\r\n '2020-01-07T"
},
{
"path": "nerdqaxe+/nerdqaxe+/3d/KMR231GLFS.stp",
"chars": 869606,
"preview": "ISO-10303-21;\r\nHEADER;\r\nFILE_DESCRIPTION( ( 'STEP AP214' ), ' ' );\r\nFILE_NAME( 'C:/Users/KMIROS~1/AppData/Local/Temp/pso"
},
{
"path": "nerdqaxe+/nerdqaxe+/3d/Littelfuse 0154.500DRT without value_black v2.step",
"chars": 482569,
"preview": "ISO-10303-21;\r\nHEADER;\r\n/* Generated by software containing ST-Developer\r\n * from STEP Tools, Inc. (www.steptools.com) \r"
},
{
"path": "nerdqaxe+/nerdqaxe+/3d/T-Display-S3.STEP",
"chars": 1945773,
"preview": "ISO-10303-21;\nHEADER;\nFILE_DESCRIPTION (( 'STEP AP214' ),\n '1' );\nFILE_NAME ('T-Display-S3.STEP',\n '2023-04-08T17:"
},
{
"path": "nerdqaxe+/nerdqaxe+/3d/barrel-jack.step",
"chars": 51080,
"preview": "ISO-10303-21;\nHEADER;\nFILE_DESCRIPTION(('FreeCAD Model'),'2;1');\nFILE_NAME('Open CASCADE Shape Model','2023-10-26T14:26:"
},
{
"path": "nerdqaxe+/nerdqaxe+/3d/bm1366.step",
"chars": 18631,
"preview": "ISO-10303-21;\nHEADER;\nFILE_DESCRIPTION(('FreeCAD Model'),'2;1');\nFILE_NAME('Open CASCADE Shape Model','2023-12-24T11:25:"
}
]
// ... and 146 more files (download for full content)
About this extraction
This page contains the full source code of the shufps/qaxe GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 346 files (52.8 MB), approximately 13.9M tokens, and a symbol index with 42 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.