├── .cargo └── config.toml ├── .github ├── FUNDING.yml └── workflows │ ├── release.yml │ └── rust_ci.yml ├── .gitignore ├── .vscode └── settings.json ├── Cargo.lock ├── Cargo.toml ├── LICENSE-APACHE ├── LICENSE-MIT ├── README.md ├── assets └── prototype.png ├── hardware ├── crimpdeq │ ├── crimpdeq.kicad_pcb │ ├── crimpdeq.kicad_prl │ ├── crimpdeq.kicad_pro │ ├── crimpdeq.kicad_sch │ ├── fabrication-toolkit-options.json │ ├── fp-info-cache │ ├── layout.pdf │ ├── production │ │ ├── backups │ │ │ └── crimpdeq_2025-04-24_12-07-14.zip │ │ ├── crimpdeq.zip │ │ ├── gerber.zip │ │ ├── gerber │ │ │ ├── crimpdeq-B_Cu.gbr │ │ │ ├── crimpdeq-B_Mask.gbr │ │ │ ├── crimpdeq-B_Paste.gbr │ │ │ ├── crimpdeq-B_Silkscreen.gbr │ │ │ ├── crimpdeq-Edge_Cuts.gbr │ │ │ ├── crimpdeq-F_Cu.gbr │ │ │ ├── crimpdeq-F_Mask.gbr │ │ │ ├── crimpdeq-F_Paste.gbr │ │ │ ├── crimpdeq-F_Silkscreen.gbr │ │ │ ├── crimpdeq-NPTH.drl │ │ │ ├── crimpdeq-PTH.drl │ │ │ └── crimpdeq-job.gbrjob │ │ └── netlist.ipc │ └── schematic.pdf └── libraries │ ├── B5819W │ ├── B5819W.kicad_sym │ ├── SOD-123.kicad_mod │ └── how-to-import.htm │ ├── DMG3415U-7 │ ├── DMG3415U-7.kicad_sym │ ├── DMG3415U-7.step │ ├── SOT95P240X105-3N.kicad_mod │ └── how-to-import.htm │ ├── LESD5D5.0CT1G │ ├── LESD5D5.0CT1G.kicad_sym │ ├── LESD5D5.0CT1G.step │ ├── TVS_LESD5D5.0CT1G.kicad_mod │ └── how-to-import.htm │ └── USB4105-GF-A │ ├── GCT_USB4105-GF-A.kicad_mod │ ├── USB4105-GF-A.kicad_sym │ ├── USB4105-GF-A.step │ └── how-to-import.htm ├── rust-toolchain.toml ├── rustfmt.toml ├── src ├── ble.rs ├── hx711.rs ├── main.rs └── progressor.rs └── taplo.toml /.cargo/config.toml: -------------------------------------------------------------------------------- 1 | [alias] 2 | bin = "espflash save-image --chip esp32c3 crimpdeq.bin" 3 | 4 | [target.riscv32imc-unknown-none-elf] 5 | runner = "probe-rs run --chip esp32c3 --no-location --preverify --restore-unwritten --always-print-stacktrace --catch-hardfault" 6 | 7 | [env] 8 | # Defmt Logging 9 | DEFMT_LOG = "off" # Use "trace/debug/info/error" to enable defmt logging 10 | 11 | # Progressor 12 | CALIBRATION_CURVE = "FFFFFFFFFFFFFFFF00000000" 13 | DEVICE_ID = "AAAAAA" 14 | DEVICE_NAME = "Progressor_7125" 15 | DEVICE_VERSION_NUMBER = "1.1.4" 16 | 17 | [build] 18 | rustflags = [ 19 | # Required to obtain backtraces (e.g. when using the "esp-backtrace" crate.) 20 | # NOTE: May negatively impact performance of produced code 21 | "-C", 22 | "force-frame-pointers", 23 | # Defmt support 24 | "-C", 25 | "link-arg=-Tdefmt.x", 26 | # Link all sections 27 | "-C", 28 | "link-arg=-Tlinkall.x", 29 | ] 30 | 31 | target = "riscv32imc-unknown-none-elf" 32 | 33 | [unstable] 34 | build-std = ["alloc", "core"] 35 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: SergioGasquez 4 | patreon: # Replace with a single Patreon username 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: # Replace with a single Ko-fi username 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry 12 | polar: # Replace with a single Polar username 13 | buy_me_a_coffee: # Replace with a single Buy Me a Coffee username 14 | thanks_dev: # Replace with a single thanks.dev username 15 | custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] 16 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Releases Deployment 2 | 3 | on: 4 | release: 5 | types: [created] 6 | 7 | env: 8 | CARGO_TERM_COLOR: always 9 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 10 | 11 | jobs: 12 | publish-release: 13 | name: Generating binary 14 | permissions: write-all 15 | runs-on: ubuntu-latest 16 | steps: 17 | - name: Checkout repository 18 | uses: actions/checkout@v4 19 | - name: Install Rust toolchain 20 | uses: dtolnay/rust-toolchain@v1 21 | with: 22 | toolchain: stable 23 | target: riscv32imc-unknown-none-elf 24 | - name: Enable caching 25 | uses: Swatinem/rust-cache@v2 26 | - name: Install espflash 27 | run: | 28 | curl -L "https://github.com/esp-rs/espflash/releases/latest/download/espflash-x86_64-unknown-linux-gnu.zip" -o "${HOME}/.cargo/bin/espflash.zip" && \ 29 | unzip "${HOME}/.cargo/bin/espflash.zip" -d "${HOME}/.cargo/bin/" && \ 30 | rm "${HOME}/.cargo/bin/espflash.zip" && \ 31 | chmod u+x "${HOME}/.cargo/bin/espflash" 32 | 33 | - name: Cargo build 34 | run: cargo build --release 35 | - name: Generate binary 36 | run: | 37 | ${HOME}/.cargo/bin/espflash save-image --chip esp32c3 target/riscv32imc-unknown-none-elf/release/crimpdeq crimpdeq.bin 38 | 39 | - name: Compress (Unix) 40 | run: zip -j crimpdeq.zip crimpdeq.bin 41 | - name: Upload compressed artifact 42 | uses: svenstaro/upload-release-action@v2 43 | with: 44 | repo_token: ${{ secrets.GITHUB_TOKEN }} 45 | file: crimpdeq.zip 46 | tag: ${{ github.ref }} 47 | - name: Upload binary artifact 48 | uses: svenstaro/upload-release-action@v2 49 | with: 50 | repo_token: ${{ secrets.GITHUB_TOKEN }} 51 | file: crimpdeq.bin 52 | tag: ${{ github.ref }} 53 | -------------------------------------------------------------------------------- /.github/workflows/rust_ci.yml: -------------------------------------------------------------------------------- 1 | name: Rust CI 2 | 3 | on: 4 | push: 5 | paths-ignore: 6 | - "**/README.md" 7 | - "**/*.md" 8 | - "**/*.kicad*" 9 | - .github/workflows/release.yml 10 | pull_request: 11 | paths-ignore: 12 | - "**/README.md" 13 | - "**/*.kicad*" 14 | - .github/workflows/release.yml 15 | workflow_dispatch: 16 | 17 | env: 18 | CARGO_TERM_COLOR: always 19 | 20 | jobs: 21 | rust-checks: 22 | name: Rust Check | ${{ matrix.action.command }} 23 | runs-on: ubuntu-latest 24 | strategy: 25 | fail-fast: false 26 | matrix: 27 | action: 28 | - command: build 29 | args: --release 30 | - command: fmt 31 | args: --all -- --check 32 | - command: clippy 33 | args: --all-features --workspace -- -D warnings 34 | steps: 35 | - name: Checkout repository 36 | uses: actions/checkout@v4 37 | - name: Setup Rust 38 | uses: dtolnay/rust-toolchain@v1 39 | with: 40 | target: riscv32imc-unknown-none-elf 41 | toolchain: nightly 42 | components: rust-src, rustfmt, clippy 43 | - name: Enable caching 44 | uses: Swatinem/rust-cache@v2 45 | - name: Run command 46 | run: cargo +nightly ${{ matrix.action.command }} ${{ matrix.action.args }} 47 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Binaries 2 | crimpdeq.bin 3 | 4 | # Environment variables 5 | .env 6 | 7 | # Rust Gitignore 8 | # Generated by Cargo 9 | # will have compiled files and executables 10 | debug/ 11 | target/ 12 | 13 | # These are backup files generated by rustfmt 14 | **/*.rs.bk 15 | 16 | # MSVC Windows builds of rustc generate these, which store debugging information 17 | *.pdb 18 | 19 | # RustRover 20 | # JetBrains specific template is maintained in a separate JetBrains.gitignore that can 21 | # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore 22 | # and can be added to the global gitignore or merged into this file. For a more nuclear 23 | # option (not recommended) you can uncomment the following to ignore the entire idea folder. 24 | #.idea/ 25 | 26 | # MDBook 27 | book/book 28 | .vale.ini 29 | .vale 30 | 31 | # KiCad Gitignore 32 | # For PCBs designed using KiCad: https://www.kicad.org/ 33 | # Format documentation: https://kicad.org/help/file-formats/ 34 | 35 | # Temporary files 36 | *.000 37 | *.bak 38 | *.bck 39 | *.kicad_pcb-bak 40 | *.kicad_sch-bak 41 | *-backups 42 | *.kicad_prl 43 | *.sch-bak 44 | *~ 45 | _autosave-* 46 | *.tmp 47 | *-save.pro 48 | *-save.kicad_pcb 49 | fp-info-cache 50 | ~*.lck 51 | \#auto_saved_files# 52 | 53 | # Netlist files (exported from Eeschema) 54 | *.net 55 | 56 | # Autorouter files (exported from Pcbnew) 57 | *.dsn 58 | *.ses 59 | 60 | # Exported BOM files 61 | *.xml 62 | hardware/**/*.csv 63 | 64 | # macOS 65 | .DS_Store 66 | 67 | # Cursor 68 | .cursor/rules/rust-verification.mdc 69 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "rust-analyzer.cargo.allTargets": false, 3 | "rust-analyzer.cargo.target": "riscv32imc-unknown-none-elf", 4 | "rust-analyzer.cargo.extraEnv": { 5 | "RUSTUP_TOOLCHAIN": "nightly" 6 | }, 7 | "[toml]": { 8 | "editor.formatOnSave": true, 9 | }, 10 | } 11 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | authors = ["Sergio Gasquez "] 3 | edition = "2021" 4 | license = "MIT OR Apache-2.0" 5 | name = "crimpdeq" 6 | version = "0.1.0" 7 | 8 | [dependencies] 9 | arrayvec = { version = "0.7.6", default-features = false } 10 | bt-hci = { version = "0.6.0", features = ["defmt"] } 11 | critical-section = "1.2.0" 12 | defmt = "1.0.1" 13 | embassy-executor = { version = "0.9.1", features = ["defmt"] } 14 | embassy-futures = "0.1.2" 15 | embassy-sync = { version = "0.7.2", features = ["defmt"] } 16 | embassy-time = { version = "0.5.0", features = ["defmt"] } 17 | embedded-hal = "1.0.0" 18 | embedded-storage = "0.3.1" 19 | esp-alloc = { version = "0.9.0", features = ["defmt"] } 20 | esp-bootloader-esp-idf = { version = "0.3.0", features = ["esp32c3"] } 21 | esp-hal = { version = "1.0.0-rc.1", features = [ 22 | "defmt", 23 | "esp32c3", 24 | "unstable", 25 | ] } 26 | esp-radio = { version = "0.16.0", features = [ 27 | "ble", 28 | "defmt", 29 | "esp-alloc", 30 | "esp32c3", 31 | "unstable", 32 | ] } 33 | esp-rtos = { version = "0.1.1", features = [ 34 | "defmt", 35 | "embassy", 36 | "esp-alloc", 37 | "esp-radio", 38 | "esp32c3", 39 | 40 | ] } 41 | esp-storage = { version = "0.8.0", features = ["defmt", "esp32c3"] } 42 | panic-rtt-target = { version = "0.2.0", features = ["defmt"] } 43 | rtt-target = { version = "0.6.2", features = ["defmt"] } 44 | static_cell = "2.1.1" 45 | trouble-host = { version = "0.5.0", features = ["defmt"] } 46 | 47 | [profile.dev] 48 | # Rust debug is too slow. 49 | # For debug builds always builds with some optimization 50 | opt-level = "s" 51 | 52 | [profile.release] 53 | codegen-units = 1 # LLVM can perform better optimizations using a single thread 54 | debug = 2 55 | debug-assertions = false 56 | incremental = false 57 | lto = 'fat' 58 | opt-level = 's' 59 | overflow-checks = false 60 | -------------------------------------------------------------------------------- /LICENSE-APACHE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright 2025 Sergio Gasquez Arcos 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /LICENSE-MIT: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 Sergio Gasquez Arcos 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Crimpdeq 2 | 3 | [![Rust CI](https://github.com/crimpdeq/crimpdeq-firmware/actions/workflows/rust_ci.yml/badge.svg)](https://github.com/crimpdeq/crimpdeq-firmware/actions/workflows/rust_ci.yml) 4 | [![Documentation](https://img.shields.io/badge/Documentation-Book-orange.svg)](https://crimpdeq.github.io/book/) 5 | 6 | Crimpdeq is a bluetooth dynamometer designed for finger training, powered by an [ESP32-C3](https://github.com/esp-rs/esp-rust-board) and a WH-C100 crane scale, with firmware fully written in Rust! 7 | 8 | > [!NOTE] 9 | > If you're interested in reproducing this project or giving it a try, please, reach out! You can contact me via email (sergio.gasquez@gmail.com), [Twitter](https://x.com/Sergio_Gasquez) or [Bluesky](https://bsky.app/profile/sergiogasquez.bsky.social). 10 | 11 | ## Features 12 | - Open-source firmware written in Rust 13 | - Open-source PCB design 14 | - USB-C rechargeable battery 15 | - Compatible with Tindeq Progressor app ([Android](https://play.google.com/store/apps/details?id=com.progressor&hl=es_419) [iOs](https://apps.apple.com/es/app/tindeq-progressor/id1380412428)) 16 | - Compatible with Frez (formerly ClimbHarder) app ([Android](https://play.google.com/store/apps/details?id=com.holdtight.climbharder&pcampaignid=web_share) [iOs](https://apps.apple.com/us/app/climbharder-no-hang-training/id6730120024)) 17 | - Sampling Frequency: 80 Hz 18 | - Design Load: 1500 N (150 kg) (Full Scale) 19 | - Precision: 20 | - *0.05 kg* between 0 and 99 kg 21 | - *0.1 kg* between 100 and 150 kg 22 | - Working temperature: 0ºC - 40ºC 23 | - Dimension: 80 mm x 90 mm x 35 mm 24 | - Uses the [Tindeq Progressor API](https://tindeq.com/progressor_api/) 25 | 26 | ## [Book](https://crimpdeq.github.io/book/) 27 | For detailed guidance on assembly, calibration, and charging of Crimpdeq, refer to the [Crimpdeq book](https://crimpdeq.github.io/book/). 28 | 29 | The book covers everything you need to know, from building your own Crimpdeq to firmware installation and PCB details. Below is the list of available sections: 30 | 31 | - [Introduction](https://crimpdeq.github.io/book/introduction.html) 32 | - [Making your own Crimpdeq](https://crimpdeq.github.io/book/assembly.html) 33 | - [Calibration](https://crimpdeq.github.io/book/calibration.html) 34 | - [Charging the Battery](https://crimpdeq.github.io/book/battery.html) 35 | - [Firmware](https://crimpdeq.github.io/book/firmware.html) 36 | - [PCB](https://crimpdeq.github.io/book/pcb.html) 37 | 38 | ## Prototype 39 | 40 | Here is how the current prototype looks like: 41 | 42 | ![Prototype](assets/prototype.png) 43 | 44 | ## Contributing 45 | Contributions are welcome! Feel free to: 46 | - Submit PRs for bug fixes or new features 47 | - Test and report issues 48 | - Suggest improvements to documentation 49 | 50 | ## Issues 51 | If you encounter any issue or want to leave any feedback, please [open an issue](https://github.com/SergioGasquez/crimpdeq/issues/new) 52 | 53 | ## License 54 | This repository is licensed under either of: 55 | 56 | - Apache License, Version 2.0 ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0) 57 | - MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT) 58 | 59 | at your option. 60 | 61 | ## Kudos 62 | - @bjoernQ for helping me during the development and developing the [`bleps`](https://github.com/bjoernQ/bleps) crate, which was fundamental for this project. 63 | - [hangman](https://github.com/kesyog/hangman) for being an improved version of this project and a great source of inspiration for this project. 64 | - Tindeq for having its API public and allowing for projects like this to exist! 65 | -------------------------------------------------------------------------------- /assets/prototype.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crimpdeq/crimpdeq-firmware/acdc8f839fa5189ffc05e1d28622c75b35d902b0/assets/prototype.png -------------------------------------------------------------------------------- /hardware/crimpdeq/crimpdeq.kicad_prl: -------------------------------------------------------------------------------- 1 | { 2 | "board": { 3 | "active_layer": 0, 4 | "active_layer_preset": "All Layers", 5 | "auto_track_width": true, 6 | "hidden_netclasses": [], 7 | "hidden_nets": [], 8 | "high_contrast_mode": 0, 9 | "net_color_mode": 1, 10 | "opacity": { 11 | "images": 0.6, 12 | "pads": 1.0, 13 | "shapes": 1.0, 14 | "tracks": 1.0, 15 | "vias": 1.0, 16 | "zones": 0.3100000023841858 17 | }, 18 | "selection_filter": { 19 | "dimensions": true, 20 | "footprints": true, 21 | "graphics": true, 22 | "keepouts": true, 23 | "lockedItems": false, 24 | "otherItems": true, 25 | "pads": true, 26 | "text": true, 27 | "tracks": true, 28 | "vias": true, 29 | "zones": true 30 | }, 31 | "visible_items": [ 32 | "vias", 33 | "footprint_text", 34 | "footprint_anchors", 35 | "ratsnest", 36 | "grid", 37 | "footprints_front", 38 | "footprints_back", 39 | "footprint_values", 40 | "footprint_references", 41 | "tracks", 42 | "drc_errors", 43 | "drawing_sheet", 44 | "bitmaps", 45 | "pads", 46 | "zones", 47 | "drc_warnings", 48 | "locked_item_shadows", 49 | "conflict_shadows", 50 | "shapes" 51 | ], 52 | "visible_layers": "ffffffff_ffffffff_ffffffff_ffffffff", 53 | "zone_display_mode": 0 54 | }, 55 | "git": { 56 | "repo_password": "", 57 | "repo_type": "", 58 | "repo_username": "", 59 | "ssh_key": "" 60 | }, 61 | "meta": { 62 | "filename": "crimpdeq.kicad_prl", 63 | "version": 5 64 | }, 65 | "net_inspector_panel": { 66 | "col_hidden": [ 67 | false, 68 | false, 69 | false, 70 | false, 71 | false, 72 | false, 73 | false, 74 | false, 75 | false, 76 | false 77 | ], 78 | "col_order": [ 79 | 0, 80 | 1, 81 | 2, 82 | 3, 83 | 4, 84 | 5, 85 | 6, 86 | 7, 87 | 8, 88 | 9 89 | ], 90 | "col_widths": [ 91 | 10, 92 | 10, 93 | 10, 94 | 10, 95 | 10, 96 | 10, 97 | 10, 98 | 10, 99 | 10, 100 | 10 101 | ], 102 | "custom_group_rules": [], 103 | "expanded_rows": [], 104 | "filter_by_net_name": true, 105 | "filter_by_netclass": true, 106 | "filter_text": "", 107 | "group_by_constraint": false, 108 | "group_by_netclass": false, 109 | "show_unconnected_nets": false, 110 | "show_zero_pad_nets": false, 111 | "sort_ascending": true, 112 | "sorting_column": 0 113 | }, 114 | "open_jobsets": [], 115 | "project": { 116 | "files": [] 117 | }, 118 | "schematic": { 119 | "selection_filter": { 120 | "graphics": true, 121 | "images": true, 122 | "labels": true, 123 | "lockedItems": false, 124 | "otherItems": true, 125 | "pins": true, 126 | "symbols": true, 127 | "text": true, 128 | "wires": true 129 | } 130 | } 131 | } 132 | -------------------------------------------------------------------------------- /hardware/crimpdeq/crimpdeq.kicad_pro: -------------------------------------------------------------------------------- 1 | { 2 | "board": { 3 | "3dviewports": [], 4 | "design_settings": { 5 | "defaults": { 6 | "apply_defaults_to_fp_fields": false, 7 | "apply_defaults_to_fp_shapes": false, 8 | "apply_defaults_to_fp_text": false, 9 | "board_outline_line_width": 0.05, 10 | "copper_line_width": 0.2, 11 | "copper_text_italic": false, 12 | "copper_text_size_h": 1.5, 13 | "copper_text_size_v": 1.5, 14 | "copper_text_thickness": 0.3, 15 | "copper_text_upright": false, 16 | "courtyard_line_width": 0.05, 17 | "dimension_precision": 4, 18 | "dimension_units": 3, 19 | "dimensions": { 20 | "arrow_length": 1270000, 21 | "extension_offset": 500000, 22 | "keep_text_aligned": true, 23 | "suppress_zeroes": false, 24 | "text_position": 0, 25 | "units_format": 1 26 | }, 27 | "fab_line_width": 0.1, 28 | "fab_text_italic": false, 29 | "fab_text_size_h": 1.0, 30 | "fab_text_size_v": 1.0, 31 | "fab_text_thickness": 0.15, 32 | "fab_text_upright": false, 33 | "other_line_width": 0.1, 34 | "other_text_italic": false, 35 | "other_text_size_h": 1.0, 36 | "other_text_size_v": 1.0, 37 | "other_text_thickness": 0.15, 38 | "other_text_upright": false, 39 | "pads": { 40 | "drill": 0.0, 41 | "height": 1.45, 42 | "width": 1.45 43 | }, 44 | "silk_line_width": 0.1, 45 | "silk_text_italic": false, 46 | "silk_text_size_h": 1.0, 47 | "silk_text_size_v": 1.0, 48 | "silk_text_thickness": 0.1, 49 | "silk_text_upright": false, 50 | "zones": { 51 | "min_clearance": 0.5 52 | } 53 | }, 54 | "diff_pair_dimensions": [ 55 | { 56 | "gap": 0.0, 57 | "via_gap": 0.0, 58 | "width": 0.0 59 | } 60 | ], 61 | "drc_exclusions": [], 62 | "meta": { 63 | "version": 2 64 | }, 65 | "rule_severities": { 66 | "annular_width": "error", 67 | "clearance": "error", 68 | "connection_width": "warning", 69 | "copper_edge_clearance": "error", 70 | "copper_sliver": "warning", 71 | "courtyards_overlap": "error", 72 | "creepage": "error", 73 | "diff_pair_gap_out_of_range": "error", 74 | "diff_pair_uncoupled_length_too_long": "error", 75 | "drill_out_of_range": "error", 76 | "duplicate_footprints": "warning", 77 | "extra_footprint": "warning", 78 | "footprint": "error", 79 | "footprint_filters_mismatch": "ignore", 80 | "footprint_symbol_mismatch": "warning", 81 | "footprint_type_mismatch": "ignore", 82 | "hole_clearance": "error", 83 | "hole_near_hole": "error", 84 | "hole_to_hole": "error", 85 | "holes_co_located": "warning", 86 | "invalid_outline": "error", 87 | "isolated_copper": "warning", 88 | "item_on_disabled_layer": "error", 89 | "items_not_allowed": "error", 90 | "length_out_of_range": "error", 91 | "lib_footprint_issues": "warning", 92 | "lib_footprint_mismatch": "warning", 93 | "malformed_courtyard": "error", 94 | "microvia_drill_out_of_range": "error", 95 | "mirrored_text_on_front_layer": "warning", 96 | "missing_courtyard": "ignore", 97 | "missing_footprint": "warning", 98 | "net_conflict": "warning", 99 | "nonmirrored_text_on_back_layer": "warning", 100 | "npth_inside_courtyard": "ignore", 101 | "padstack": "warning", 102 | "pth_inside_courtyard": "ignore", 103 | "shorting_items": "error", 104 | "silk_edge_clearance": "warning", 105 | "silk_over_copper": "warning", 106 | "silk_overlap": "warning", 107 | "skew_out_of_range": "error", 108 | "solder_mask_bridge": "error", 109 | "starved_thermal": "error", 110 | "text_height": "warning", 111 | "text_on_edge_cuts": "error", 112 | "text_thickness": "warning", 113 | "through_hole_pad_without_hole": "error", 114 | "too_many_vias": "error", 115 | "track_angle": "error", 116 | "track_dangling": "warning", 117 | "track_segment_length": "error", 118 | "track_width": "error", 119 | "tracks_crossing": "error", 120 | "unconnected_items": "error", 121 | "unresolved_variable": "error", 122 | "via_dangling": "warning", 123 | "zones_intersect": "error" 124 | }, 125 | "rules": { 126 | "max_error": 0.005, 127 | "min_clearance": 0.0, 128 | "min_connection": 0.0, 129 | "min_copper_edge_clearance": 0.5, 130 | "min_groove_width": 0.0, 131 | "min_hole_clearance": 0.25, 132 | "min_hole_to_hole": 0.25, 133 | "min_microvia_diameter": 0.2, 134 | "min_microvia_drill": 0.1, 135 | "min_resolved_spokes": 2, 136 | "min_silk_clearance": 0.0, 137 | "min_text_height": 0.8, 138 | "min_text_thickness": 0.08, 139 | "min_through_hole_diameter": 0.3, 140 | "min_track_width": 0.0, 141 | "min_via_annular_width": 0.1, 142 | "min_via_diameter": 0.5, 143 | "solder_mask_to_copper_clearance": 0.005, 144 | "use_height_for_length_calcs": true 145 | }, 146 | "teardrop_options": [ 147 | { 148 | "td_onpthpad": true, 149 | "td_onroundshapesonly": false, 150 | "td_onsmdpad": true, 151 | "td_ontrackend": false, 152 | "td_onvia": true 153 | } 154 | ], 155 | "teardrop_parameters": [ 156 | { 157 | "td_allow_use_two_tracks": true, 158 | "td_curve_segcount": 0, 159 | "td_height_ratio": 1.0, 160 | "td_length_ratio": 0.5, 161 | "td_maxheight": 2.0, 162 | "td_maxlen": 1.0, 163 | "td_on_pad_in_zone": false, 164 | "td_target_name": "td_round_shape", 165 | "td_width_to_size_filter_ratio": 0.9 166 | }, 167 | { 168 | "td_allow_use_two_tracks": true, 169 | "td_curve_segcount": 0, 170 | "td_height_ratio": 1.0, 171 | "td_length_ratio": 0.5, 172 | "td_maxheight": 2.0, 173 | "td_maxlen": 1.0, 174 | "td_on_pad_in_zone": false, 175 | "td_target_name": "td_rect_shape", 176 | "td_width_to_size_filter_ratio": 0.9 177 | }, 178 | { 179 | "td_allow_use_two_tracks": true, 180 | "td_curve_segcount": 0, 181 | "td_height_ratio": 1.0, 182 | "td_length_ratio": 0.5, 183 | "td_maxheight": 2.0, 184 | "td_maxlen": 1.0, 185 | "td_on_pad_in_zone": false, 186 | "td_target_name": "td_track_end", 187 | "td_width_to_size_filter_ratio": 0.9 188 | } 189 | ], 190 | "track_widths": [ 191 | 0.0, 192 | 0.1524, 193 | 0.254, 194 | 0.4064, 195 | 0.508, 196 | 0.6096 197 | ], 198 | "tuning_pattern_settings": { 199 | "diff_pair_defaults": { 200 | "corner_radius_percentage": 80, 201 | "corner_style": 1, 202 | "max_amplitude": 1.0, 203 | "min_amplitude": 0.2, 204 | "single_sided": false, 205 | "spacing": 1.0 206 | }, 207 | "diff_pair_skew_defaults": { 208 | "corner_radius_percentage": 80, 209 | "corner_style": 1, 210 | "max_amplitude": 1.0, 211 | "min_amplitude": 0.2, 212 | "single_sided": false, 213 | "spacing": 0.6 214 | }, 215 | "single_track_defaults": { 216 | "corner_radius_percentage": 80, 217 | "corner_style": 1, 218 | "max_amplitude": 1.0, 219 | "min_amplitude": 0.2, 220 | "single_sided": false, 221 | "spacing": 0.6 222 | } 223 | }, 224 | "via_dimensions": [ 225 | { 226 | "diameter": 0.0, 227 | "drill": 0.0 228 | } 229 | ], 230 | "zones_allow_external_fillets": false 231 | }, 232 | "ipc2581": { 233 | "dist": "", 234 | "distpn": "", 235 | "internal_id": "", 236 | "mfg": "", 237 | "mpn": "" 238 | }, 239 | "layer_pairs": [], 240 | "layer_presets": [], 241 | "viewports": [] 242 | }, 243 | "boards": [], 244 | "cvpcb": { 245 | "equivalence_files": [] 246 | }, 247 | "erc": { 248 | "erc_exclusions": [], 249 | "meta": { 250 | "version": 0 251 | }, 252 | "pin_map": [ 253 | [ 254 | 0, 255 | 0, 256 | 0, 257 | 0, 258 | 0, 259 | 0, 260 | 1, 261 | 0, 262 | 0, 263 | 0, 264 | 0, 265 | 2 266 | ], 267 | [ 268 | 0, 269 | 2, 270 | 0, 271 | 1, 272 | 0, 273 | 0, 274 | 1, 275 | 0, 276 | 2, 277 | 2, 278 | 2, 279 | 2 280 | ], 281 | [ 282 | 0, 283 | 0, 284 | 0, 285 | 0, 286 | 0, 287 | 0, 288 | 1, 289 | 0, 290 | 1, 291 | 0, 292 | 1, 293 | 2 294 | ], 295 | [ 296 | 0, 297 | 1, 298 | 0, 299 | 0, 300 | 0, 301 | 0, 302 | 1, 303 | 1, 304 | 2, 305 | 1, 306 | 1, 307 | 2 308 | ], 309 | [ 310 | 0, 311 | 0, 312 | 0, 313 | 0, 314 | 0, 315 | 0, 316 | 1, 317 | 0, 318 | 0, 319 | 0, 320 | 0, 321 | 2 322 | ], 323 | [ 324 | 0, 325 | 0, 326 | 0, 327 | 0, 328 | 0, 329 | 0, 330 | 0, 331 | 0, 332 | 0, 333 | 0, 334 | 0, 335 | 2 336 | ], 337 | [ 338 | 1, 339 | 1, 340 | 1, 341 | 1, 342 | 1, 343 | 0, 344 | 1, 345 | 1, 346 | 1, 347 | 1, 348 | 1, 349 | 2 350 | ], 351 | [ 352 | 0, 353 | 0, 354 | 0, 355 | 1, 356 | 0, 357 | 0, 358 | 1, 359 | 0, 360 | 0, 361 | 0, 362 | 0, 363 | 2 364 | ], 365 | [ 366 | 0, 367 | 2, 368 | 1, 369 | 2, 370 | 0, 371 | 0, 372 | 1, 373 | 0, 374 | 2, 375 | 2, 376 | 2, 377 | 2 378 | ], 379 | [ 380 | 0, 381 | 2, 382 | 0, 383 | 1, 384 | 0, 385 | 0, 386 | 1, 387 | 0, 388 | 2, 389 | 0, 390 | 0, 391 | 2 392 | ], 393 | [ 394 | 0, 395 | 2, 396 | 1, 397 | 1, 398 | 0, 399 | 0, 400 | 1, 401 | 0, 402 | 2, 403 | 0, 404 | 0, 405 | 2 406 | ], 407 | [ 408 | 2, 409 | 2, 410 | 2, 411 | 2, 412 | 2, 413 | 2, 414 | 2, 415 | 2, 416 | 2, 417 | 2, 418 | 2, 419 | 2 420 | ] 421 | ], 422 | "rule_severities": { 423 | "bus_definition_conflict": "error", 424 | "bus_entry_needed": "error", 425 | "bus_to_bus_conflict": "error", 426 | "bus_to_net_conflict": "error", 427 | "conflicting_netclasses": "error", 428 | "different_unit_footprint": "error", 429 | "different_unit_net": "error", 430 | "duplicate_reference": "error", 431 | "duplicate_sheet_names": "error", 432 | "endpoint_off_grid": "warning", 433 | "extra_units": "error", 434 | "footprint_filter": "ignore", 435 | "footprint_link_issues": "warning", 436 | "four_way_junction": "ignore", 437 | "global_label_dangling": "warning", 438 | "hier_label_mismatch": "error", 439 | "label_dangling": "error", 440 | "label_multiple_wires": "warning", 441 | "lib_symbol_issues": "warning", 442 | "lib_symbol_mismatch": "warning", 443 | "missing_bidi_pin": "warning", 444 | "missing_input_pin": "warning", 445 | "missing_power_pin": "error", 446 | "missing_unit": "warning", 447 | "multiple_net_names": "warning", 448 | "net_not_bus_member": "warning", 449 | "no_connect_connected": "warning", 450 | "no_connect_dangling": "warning", 451 | "pin_not_connected": "error", 452 | "pin_not_driven": "error", 453 | "pin_to_pin": "error", 454 | "power_pin_not_driven": "error", 455 | "same_local_global_label": "warning", 456 | "similar_label_and_power": "warning", 457 | "similar_labels": "warning", 458 | "similar_power": "warning", 459 | "simulation_model_issue": "ignore", 460 | "single_global_label": "ignore", 461 | "unannotated": "error", 462 | "unconnected_wire_endpoint": "warning", 463 | "unit_value_mismatch": "error", 464 | "unresolved_variable": "error", 465 | "wire_dangling": "error" 466 | } 467 | }, 468 | "libraries": { 469 | "pinned_footprint_libs": [], 470 | "pinned_symbol_libs": [] 471 | }, 472 | "meta": { 473 | "filename": "crimpdeq.kicad_pro", 474 | "version": 3 475 | }, 476 | "net_settings": { 477 | "classes": [ 478 | { 479 | "bus_width": 12, 480 | "clearance": 0.2, 481 | "diff_pair_gap": 0.25, 482 | "diff_pair_via_gap": 0.25, 483 | "diff_pair_width": 0.2, 484 | "line_style": 0, 485 | "microvia_diameter": 0.3, 486 | "microvia_drill": 0.1, 487 | "name": "Default", 488 | "pcb_color": "rgba(0, 0, 0, 0.000)", 489 | "priority": 2147483647, 490 | "schematic_color": "rgba(0, 0, 0, 0.000)", 491 | "track_width": 0.2, 492 | "via_diameter": 0.6, 493 | "via_drill": 0.3, 494 | "wire_width": 6 495 | } 496 | ], 497 | "meta": { 498 | "version": 4 499 | }, 500 | "net_colors": null, 501 | "netclass_assignments": null, 502 | "netclass_patterns": [] 503 | }, 504 | "pcbnew": { 505 | "last_paths": { 506 | "gencad": "", 507 | "idf": "", 508 | "netlist": "", 509 | "plot": "production/gerber/", 510 | "pos_files": "", 511 | "specctra_dsn": "", 512 | "step": "", 513 | "svg": "", 514 | "vrml": "" 515 | }, 516 | "page_layout_descr_file": "" 517 | }, 518 | "schematic": { 519 | "annotate_start_num": 0, 520 | "bom_export_filename": "bom", 521 | "bom_fmt_presets": [], 522 | "bom_fmt_settings": { 523 | "field_delimiter": ",", 524 | "keep_line_breaks": false, 525 | "keep_tabs": false, 526 | "name": "CSV", 527 | "ref_delimiter": ",", 528 | "ref_range_delimiter": "", 529 | "string_delimiter": "\"" 530 | }, 531 | "bom_presets": [], 532 | "bom_settings": { 533 | "exclude_dnp": false, 534 | "fields_ordered": [ 535 | { 536 | "group_by": false, 537 | "label": "Reference", 538 | "name": "Reference", 539 | "show": true 540 | }, 541 | { 542 | "group_by": true, 543 | "label": "Value", 544 | "name": "Value", 545 | "show": true 546 | }, 547 | { 548 | "group_by": false, 549 | "label": "Datasheet", 550 | "name": "Datasheet", 551 | "show": true 552 | }, 553 | { 554 | "group_by": false, 555 | "label": "Footprint", 556 | "name": "Footprint", 557 | "show": true 558 | }, 559 | { 560 | "group_by": false, 561 | "label": "Qty", 562 | "name": "${QUANTITY}", 563 | "show": true 564 | }, 565 | { 566 | "group_by": true, 567 | "label": "DNP", 568 | "name": "${DNP}", 569 | "show": true 570 | }, 571 | { 572 | "group_by": false, 573 | "label": "#", 574 | "name": "${ITEM_NUMBER}", 575 | "show": false 576 | }, 577 | { 578 | "group_by": false, 579 | "label": "LCSC", 580 | "name": "LCSC", 581 | "show": false 582 | }, 583 | { 584 | "group_by": false, 585 | "label": "MANUFACTURER", 586 | "name": "MANUFACTURER", 587 | "show": false 588 | }, 589 | { 590 | "group_by": false, 591 | "label": "MAXIMUM_PACKAGE_HEIGHT", 592 | "name": "MAXIMUM_PACKAGE_HEIGHT", 593 | "show": false 594 | }, 595 | { 596 | "group_by": false, 597 | "label": "PARTREV", 598 | "name": "PARTREV", 599 | "show": false 600 | }, 601 | { 602 | "group_by": false, 603 | "label": "STANDARD", 604 | "name": "STANDARD", 605 | "show": false 606 | }, 607 | { 608 | "group_by": false, 609 | "label": "Description", 610 | "name": "Description", 611 | "show": false 612 | } 613 | ], 614 | "filter_string": "", 615 | "group_symbols": true, 616 | "include_excluded_from_bom": false, 617 | "name": "", 618 | "sort_asc": true, 619 | "sort_field": "Reference" 620 | }, 621 | "connection_grid_size": 50.0, 622 | "drawing": { 623 | "dashed_lines_dash_length_ratio": 12.0, 624 | "dashed_lines_gap_length_ratio": 3.0, 625 | "default_line_thickness": 6.0, 626 | "default_text_size": 50.0, 627 | "field_names": [], 628 | "intersheets_ref_own_page": false, 629 | "intersheets_ref_prefix": "", 630 | "intersheets_ref_short": false, 631 | "intersheets_ref_show": false, 632 | "intersheets_ref_suffix": "", 633 | "junction_size_choice": 3, 634 | "label_size_ratio": 0.375, 635 | "operating_point_overlay_i_precision": 3, 636 | "operating_point_overlay_i_range": "~A", 637 | "operating_point_overlay_v_precision": 3, 638 | "operating_point_overlay_v_range": "~V", 639 | "overbar_offset_ratio": 1.23, 640 | "pin_symbol_size": 25.0, 641 | "text_offset_ratio": 0.15 642 | }, 643 | "legacy_lib_dir": "", 644 | "legacy_lib_list": [], 645 | "meta": { 646 | "version": 1 647 | }, 648 | "net_format_name": "", 649 | "page_layout_descr_file": "", 650 | "plot_directory": "./", 651 | "space_save_all_events": true, 652 | "spice_current_sheet_as_root": false, 653 | "spice_external_command": "spice \"%I\"", 654 | "spice_model_current_sheet_as_root": true, 655 | "spice_save_all_currents": false, 656 | "spice_save_all_dissipations": false, 657 | "spice_save_all_voltages": false, 658 | "subpart_first_id": 65, 659 | "subpart_id_separator": 0 660 | }, 661 | "sheets": [ 662 | [ 663 | "eb289f4a-30cd-4b15-be5d-5da73d92c8be", 664 | "Root" 665 | ] 666 | ], 667 | "text_variables": {} 668 | } 669 | -------------------------------------------------------------------------------- /hardware/crimpdeq/fabrication-toolkit-options.json: -------------------------------------------------------------------------------- 1 | {"EXTRA_LAYERS": "", "ALL_ACTIVE_LAYERS": false, "EXTEND_EDGE_CUT": false, "ALTERNATIVE_EDGE_CUT": false, "AUTO TRANSLATE": true, "AUTO FILL": true, "EXCLUDE DNP": false} -------------------------------------------------------------------------------- /hardware/crimpdeq/layout.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crimpdeq/crimpdeq-firmware/acdc8f839fa5189ffc05e1d28622c75b35d902b0/hardware/crimpdeq/layout.pdf -------------------------------------------------------------------------------- /hardware/crimpdeq/production/backups/crimpdeq_2025-04-24_12-07-14.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crimpdeq/crimpdeq-firmware/acdc8f839fa5189ffc05e1d28622c75b35d902b0/hardware/crimpdeq/production/backups/crimpdeq_2025-04-24_12-07-14.zip -------------------------------------------------------------------------------- /hardware/crimpdeq/production/crimpdeq.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crimpdeq/crimpdeq-firmware/acdc8f839fa5189ffc05e1d28622c75b35d902b0/hardware/crimpdeq/production/crimpdeq.zip -------------------------------------------------------------------------------- /hardware/crimpdeq/production/gerber.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crimpdeq/crimpdeq-firmware/acdc8f839fa5189ffc05e1d28622c75b35d902b0/hardware/crimpdeq/production/gerber.zip -------------------------------------------------------------------------------- /hardware/crimpdeq/production/gerber/crimpdeq-B_Mask.gbr: -------------------------------------------------------------------------------- 1 | %TF.GenerationSoftware,KiCad,Pcbnew,9.0.1*% 2 | %TF.CreationDate,2025-04-24T12:06:56+02:00*% 3 | %TF.ProjectId,crimpdeq,6372696d-7064-4657-912e-6b696361645f,rev?*% 4 | %TF.SameCoordinates,Original*% 5 | %TF.FileFunction,Soldermask,Bot*% 6 | %TF.FilePolarity,Negative*% 7 | %FSLAX46Y46*% 8 | G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* 9 | G04 Created by KiCad (PCBNEW 9.0.1) date 2025-04-24 12:06:56* 10 | %MOMM*% 11 | %LPD*% 12 | G01* 13 | G04 APERTURE LIST* 14 | G04 Aperture macros list* 15 | %AMRoundRect* 16 | 0 Rectangle with rounded corners* 17 | 0 $1 Rounding radius* 18 | 0 $2 $3 $4 $5 $6 $7 $8 $9 X,Y pos of 4 corners* 19 | 0 Add a 4 corners polygon primitive as box body* 20 | 4,1,4,$2,$3,$4,$5,$6,$7,$8,$9,$2,$3,0* 21 | 0 Add four circle primitives for the rounded corners* 22 | 1,1,$1+$1,$2,$3* 23 | 1,1,$1+$1,$4,$5* 24 | 1,1,$1+$1,$6,$7* 25 | 1,1,$1+$1,$8,$9* 26 | 0 Add four rect primitives between the rounded corners* 27 | 20,1,$1+$1,$2,$3,$4,$5,0* 28 | 20,1,$1+$1,$4,$5,$6,$7,0* 29 | 20,1,$1+$1,$6,$7,$8,$9,0* 30 | 20,1,$1+$1,$8,$9,$2,$3,0*% 31 | %AMFreePoly0* 32 | 4,1,31,0.703661,0.741839,0.724803,0.724803,1.359803,0.089803,1.394098,0.026996,1.388993,-0.044382,1.359803,-0.089803,0.724803,-0.724803,0.661996,-0.759098,0.635000,-0.762000,0.000000,-0.762000,-0.012495,-0.758331,-0.074689,-0.758331,-0.221197,-0.729189,-0.359204,-0.672024,-0.483408,-0.589034,-0.589034,-0.483408,-0.672024,-0.359204,-0.729189,-0.221197,-0.758331,-0.074689,-0.758331,0.074689, 33 | -0.729189,0.221197,-0.672024,0.359204,-0.589034,0.483408,-0.483408,0.589034,-0.359204,0.672024,-0.221197,0.729189,-0.074689,0.758331,-0.016866,0.758331,0.000000,0.762000,0.635000,0.762000,0.703661,0.741839,0.703661,0.741839,$1*% 34 | %AMFreePoly1* 35 | 4,1,31,0.012495,0.758331,0.074689,0.758331,0.221197,0.729189,0.359204,0.672024,0.483408,0.589034,0.589034,0.483408,0.672024,0.359204,0.729189,0.221197,0.758331,0.074689,0.758331,-0.074689,0.729189,-0.221197,0.672024,-0.359204,0.589034,-0.483408,0.483408,-0.589034,0.359204,-0.672024,0.221197,-0.729189,0.074689,-0.758331,0.016866,-0.758331,0.000000,-0.762000,-0.635000,-0.762000, 36 | -0.703661,-0.741839,-0.724803,-0.724803,-1.359803,-0.089803,-1.394098,-0.026996,-1.388993,0.044382,-1.359803,0.089803,-0.724803,0.724803,-0.661996,0.759098,-0.635000,0.762000,0.000000,0.762000,0.012495,0.758331,0.012495,0.758331,$1*% 37 | %AMFreePoly2* 38 | 4,1,24,0.635000,0.000000,0.631942,0.000000,0.631942,-0.062241,0.607657,-0.184331,0.560020,-0.299337,0.490862,-0.402840,0.402840,-0.490862,0.299337,-0.560020,0.184331,-0.607657,0.062241,-0.631942,-0.062241,-0.631942,-0.184331,-0.607657,-0.299337,-0.560020,-0.402840,-0.490862,-0.490862,-0.402840,-0.560020,-0.299337,-0.607657,-0.184331,-0.631942,-0.062241,-0.631942,0.000000,-0.635000,0.000000, 39 | -0.635000,1.905000,0.000000,1.270000,0.635000,1.905000,0.635000,0.000000,0.635000,0.000000,$1*% 40 | %AMFreePoly3* 41 | 4,1,24,0.635000,1.270000,0.635000,0.000000,0.631942,0.000000,0.631942,-0.062241,0.607657,-0.184331,0.560020,-0.299337,0.490862,-0.402840,0.402840,-0.490862,0.299337,-0.560020,0.184331,-0.607657,0.062241,-0.631942,-0.062241,-0.631942,-0.184331,-0.607657,-0.299337,-0.560020,-0.402840,-0.490862,-0.490862,-0.402840,-0.560020,-0.299337,-0.607657,-0.184331,-0.631942,-0.062241,-0.631942,0.000000, 42 | -0.635000,0.000000,-0.635000,1.270000,0.000000,1.905000,0.635000,1.270000,0.635000,1.270000,$1*% 43 | G04 Aperture macros list end* 44 | %ADD10R,1.050000X1.500000*% 45 | %ADD11O,1.050000X1.500000*% 46 | %ADD12FreePoly0,0.000000*% 47 | %ADD13RoundRect,0.381000X-0.381000X-0.381000X0.381000X-0.381000X0.381000X0.381000X-0.381000X0.381000X0*% 48 | %ADD14C,1.524000*% 49 | %ADD15FreePoly1,0.000000*% 50 | %ADD16FreePoly2,90.000000*% 51 | %ADD17FreePoly3,90.000000*% 52 | %ADD18C,0.650000*% 53 | %ADD19O,1.050000X2.100000*% 54 | %ADD20O,1.000000X2.000000*% 55 | G04 APERTURE END LIST* 56 | D10* 57 | %TO.C,Q1*% 58 | X139460000Y-80500000D03* 59 | D11* 60 | X140730000Y-80500000D03* 61 | X142000000Y-80500000D03* 62 | %TD*% 63 | D12* 64 | %TO.C,U4*% 65 | X130660000Y-58685000D03* 66 | D13* 67 | X131160000Y-62185000D03* 68 | D14* 69 | X130660000Y-65185000D03* 70 | X150660000Y-65185000D03* 71 | X150660000Y-67685000D03* 72 | X150660000Y-56185000D03* 73 | X150660000Y-58685000D03* 74 | X150660000Y-93185000D03* 75 | X150660000Y-95685000D03* 76 | D15* 77 | X150660000Y-86185000D03* 78 | X150660000Y-83685000D03* 79 | D14* 80 | X150660000Y-72685000D03* 81 | X150660000Y-70185000D03* 82 | D13* 83 | X131160000Y-70685000D03* 84 | D14* 85 | X130660000Y-68185000D03* 86 | D16* 87 | X150820000Y-102450000D03* 88 | D17* 89 | X150820000Y-100185000D03* 90 | %TD*% 91 | D18* 92 | %TO.C,J2*% 93 | X137830000Y-103520000D03* 94 | X143610000Y-103520000D03* 95 | D19* 96 | X136400000Y-103020000D03* 97 | D20* 98 | X136400000Y-107200000D03* 99 | X145040000Y-107200000D03* 100 | D19* 101 | X145040000Y-103020000D03* 102 | %TD*% 103 | M02* 104 | -------------------------------------------------------------------------------- /hardware/crimpdeq/production/gerber/crimpdeq-B_Paste.gbr: -------------------------------------------------------------------------------- 1 | %TF.GenerationSoftware,KiCad,Pcbnew,9.0.1*% 2 | %TF.CreationDate,2025-04-24T12:06:56+02:00*% 3 | %TF.ProjectId,crimpdeq,6372696d-7064-4657-912e-6b696361645f,rev?*% 4 | %TF.SameCoordinates,Original*% 5 | %TF.FileFunction,Paste,Bot*% 6 | %TF.FilePolarity,Positive*% 7 | %FSLAX46Y46*% 8 | G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* 9 | G04 Created by KiCad (PCBNEW 9.0.1) date 2025-04-24 12:06:56* 10 | %MOMM*% 11 | %LPD*% 12 | G01* 13 | G04 APERTURE LIST* 14 | G04 APERTURE END LIST* 15 | M02* 16 | -------------------------------------------------------------------------------- /hardware/crimpdeq/production/gerber/crimpdeq-B_Silkscreen.gbr: -------------------------------------------------------------------------------- 1 | %TF.GenerationSoftware,KiCad,Pcbnew,9.0.1*% 2 | %TF.CreationDate,2025-04-24T12:06:56+02:00*% 3 | %TF.ProjectId,crimpdeq,6372696d-7064-4657-912e-6b696361645f,rev?*% 4 | %TF.SameCoordinates,Original*% 5 | %TF.FileFunction,Legend,Bot*% 6 | %TF.FilePolarity,Positive*% 7 | %FSLAX46Y46*% 8 | G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* 9 | G04 Created by KiCad (PCBNEW 9.0.1) date 2025-04-24 12:06:56* 10 | %MOMM*% 11 | %LPD*% 12 | G01* 13 | G04 APERTURE LIST* 14 | G04 APERTURE END LIST* 15 | M02* 16 | -------------------------------------------------------------------------------- /hardware/crimpdeq/production/gerber/crimpdeq-Edge_Cuts.gbr: -------------------------------------------------------------------------------- 1 | %TF.GenerationSoftware,KiCad,Pcbnew,9.0.1*% 2 | %TF.CreationDate,2025-04-24T12:06:56+02:00*% 3 | %TF.ProjectId,crimpdeq,6372696d-7064-4657-912e-6b696361645f,rev?*% 4 | %TF.SameCoordinates,Original*% 5 | %TF.FileFunction,Profile,NP*% 6 | %FSLAX46Y46*% 7 | G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* 8 | G04 Created by KiCad (PCBNEW 9.0.1) date 2025-04-24 12:06:56* 9 | %MOMM*% 10 | %LPD*% 11 | G01* 12 | G04 APERTURE LIST* 13 | %TA.AperFunction,Profile*% 14 | %ADD10C,0.050000*% 15 | %TD*% 16 | G04 APERTURE END LIST* 17 | D10* 18 | X129200000Y-46400000D02* 19 | X129200000Y-110200000D01* 20 | X152200000Y-46400000D02* 21 | X129200000Y-46400000D01* 22 | X129200000Y-110200000D02* 23 | X152200000Y-110200000D01* 24 | X152200000Y-110200000D02* 25 | X152200000Y-46400000D01* 26 | M02* 27 | -------------------------------------------------------------------------------- /hardware/crimpdeq/production/gerber/crimpdeq-F_Mask.gbr: -------------------------------------------------------------------------------- 1 | %TF.GenerationSoftware,KiCad,Pcbnew,9.0.1*% 2 | %TF.CreationDate,2025-04-24T12:06:56+02:00*% 3 | %TF.ProjectId,crimpdeq,6372696d-7064-4657-912e-6b696361645f,rev?*% 4 | %TF.SameCoordinates,Original*% 5 | %TF.FileFunction,Soldermask,Top*% 6 | %TF.FilePolarity,Negative*% 7 | %FSLAX46Y46*% 8 | G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* 9 | G04 Created by KiCad (PCBNEW 9.0.1) date 2025-04-24 12:06:56* 10 | %MOMM*% 11 | %LPD*% 12 | G01* 13 | G04 APERTURE LIST* 14 | G04 Aperture macros list* 15 | %AMRoundRect* 16 | 0 Rectangle with rounded corners* 17 | 0 $1 Rounding radius* 18 | 0 $2 $3 $4 $5 $6 $7 $8 $9 X,Y pos of 4 corners* 19 | 0 Add a 4 corners polygon primitive as box body* 20 | 4,1,4,$2,$3,$4,$5,$6,$7,$8,$9,$2,$3,0* 21 | 0 Add four circle primitives for the rounded corners* 22 | 1,1,$1+$1,$2,$3* 23 | 1,1,$1+$1,$4,$5* 24 | 1,1,$1+$1,$6,$7* 25 | 1,1,$1+$1,$8,$9* 26 | 0 Add four rect primitives between the rounded corners* 27 | 20,1,$1+$1,$2,$3,$4,$5,0* 28 | 20,1,$1+$1,$4,$5,$6,$7,0* 29 | 20,1,$1+$1,$6,$7,$8,$9,0* 30 | 20,1,$1+$1,$8,$9,$2,$3,0*% 31 | %AMFreePoly0* 32 | 4,1,6,0.725000,-0.725000,-0.725000,-0.725000,-0.725000,0.125000,-0.125000,0.725000,0.725000,0.725000,0.725000,-0.725000,0.725000,-0.725000,$1*% 33 | %AMFreePoly1* 34 | 4,1,31,0.703661,0.741839,0.724803,0.724803,1.359803,0.089803,1.394098,0.026996,1.388993,-0.044382,1.359803,-0.089803,0.724803,-0.724803,0.661996,-0.759098,0.635000,-0.762000,0.000000,-0.762000,-0.012495,-0.758331,-0.074689,-0.758331,-0.221197,-0.729189,-0.359204,-0.672024,-0.483408,-0.589034,-0.589034,-0.483408,-0.672024,-0.359204,-0.729189,-0.221197,-0.758331,-0.074689,-0.758331,0.074689, 35 | -0.729189,0.221197,-0.672024,0.359204,-0.589034,0.483408,-0.483408,0.589034,-0.359204,0.672024,-0.221197,0.729189,-0.074689,0.758331,-0.016866,0.758331,0.000000,0.762000,0.635000,0.762000,0.703661,0.741839,0.703661,0.741839,$1*% 36 | %AMFreePoly2* 37 | 4,1,31,0.012495,0.758331,0.074689,0.758331,0.221197,0.729189,0.359204,0.672024,0.483408,0.589034,0.589034,0.483408,0.672024,0.359204,0.729189,0.221197,0.758331,0.074689,0.758331,-0.074689,0.729189,-0.221197,0.672024,-0.359204,0.589034,-0.483408,0.483408,-0.589034,0.359204,-0.672024,0.221197,-0.729189,0.074689,-0.758331,0.016866,-0.758331,0.000000,-0.762000,-0.635000,-0.762000, 38 | -0.703661,-0.741839,-0.724803,-0.724803,-1.359803,-0.089803,-1.394098,-0.026996,-1.388993,0.044382,-1.359803,0.089803,-0.724803,0.724803,-0.661996,0.759098,-0.635000,0.762000,0.000000,0.762000,0.012495,0.758331,0.012495,0.758331,$1*% 39 | %AMFreePoly3* 40 | 4,1,24,0.635000,0.000000,0.631942,0.000000,0.631942,-0.062241,0.607657,-0.184331,0.560020,-0.299337,0.490862,-0.402840,0.402840,-0.490862,0.299337,-0.560020,0.184331,-0.607657,0.062241,-0.631942,-0.062241,-0.631942,-0.184331,-0.607657,-0.299337,-0.560020,-0.402840,-0.490862,-0.490862,-0.402840,-0.560020,-0.299337,-0.607657,-0.184331,-0.631942,-0.062241,-0.631942,0.000000,-0.635000,0.000000, 41 | -0.635000,1.905000,0.000000,1.270000,0.635000,1.905000,0.635000,0.000000,0.635000,0.000000,$1*% 42 | %AMFreePoly4* 43 | 4,1,24,0.635000,1.270000,0.635000,0.000000,0.631942,0.000000,0.631942,-0.062241,0.607657,-0.184331,0.560020,-0.299337,0.490862,-0.402840,0.402840,-0.490862,0.299337,-0.560020,0.184331,-0.607657,0.062241,-0.631942,-0.062241,-0.631942,-0.184331,-0.607657,-0.299337,-0.560020,-0.402840,-0.490862,-0.490862,-0.402840,-0.560020,-0.299337,-0.607657,-0.184331,-0.631942,-0.062241,-0.631942,0.000000, 44 | -0.635000,0.000000,-0.635000,1.270000,0.000000,1.905000,0.635000,1.270000,0.635000,1.270000,$1*% 45 | G04 Aperture macros list end* 46 | %ADD10RoundRect,0.135000X-0.135000X-0.185000X0.135000X-0.185000X0.135000X0.185000X-0.135000X0.185000X0*% 47 | %ADD11RoundRect,0.150000X-0.200000X0.150000X-0.200000X-0.150000X0.200000X-0.150000X0.200000X0.150000X0*% 48 | %ADD12RoundRect,0.250000X-0.250000X-0.475000X0.250000X-0.475000X0.250000X0.475000X-0.250000X0.475000X0*% 49 | %ADD13RoundRect,0.218750X-0.256250X0.218750X-0.256250X-0.218750X0.256250X-0.218750X0.256250X0.218750X0*% 50 | %ADD14RoundRect,0.140000X0.170000X-0.140000X0.170000X0.140000X-0.170000X0.140000X-0.170000X-0.140000X0*% 51 | %ADD15RoundRect,0.150000X-0.512500X-0.150000X0.512500X-0.150000X0.512500X0.150000X-0.512500X0.150000X0*% 52 | %ADD16RoundRect,0.225000X-0.250000X0.225000X-0.250000X-0.225000X0.250000X-0.225000X0.250000X0.225000X0*% 53 | %ADD17RoundRect,0.225000X-0.225000X-0.250000X0.225000X-0.250000X0.225000X0.250000X-0.225000X0.250000X0*% 54 | %ADD18RoundRect,0.135000X-0.185000X0.135000X-0.185000X-0.135000X0.185000X-0.135000X0.185000X0.135000X0*% 55 | %ADD19RoundRect,0.225000X0.250000X-0.225000X0.250000X0.225000X-0.250000X0.225000X-0.250000X-0.225000X0*% 56 | %ADD20RoundRect,0.140000X-0.170000X0.140000X-0.170000X-0.140000X0.170000X-0.140000X0.170000X0.140000X0*% 57 | %ADD21RoundRect,0.150000X-0.150000X0.587500X-0.150000X-0.587500X0.150000X-0.587500X0.150000X0.587500X0*% 58 | %ADD22R,0.650000X1.050000*% 59 | %ADD23RoundRect,0.135000X0.135000X0.185000X-0.135000X0.185000X-0.135000X-0.185000X0.135000X-0.185000X0*% 60 | %ADD24RoundRect,0.225000X0.225000X0.375000X-0.225000X0.375000X-0.225000X-0.375000X0.225000X-0.375000X0*% 61 | %ADD25RoundRect,0.150000X0.150000X-0.512500X0.150000X0.512500X-0.150000X0.512500X-0.150000X-0.512500X0*% 62 | %ADD26RoundRect,0.135000X0.185000X-0.135000X0.185000X0.135000X-0.185000X0.135000X-0.185000X-0.135000X0*% 63 | %ADD27R,0.800000X0.400000*% 64 | %ADD28R,0.400000X0.800000*% 65 | %ADD29FreePoly0,0.000000*% 66 | %ADD30R,1.450000X1.450000*% 67 | %ADD31R,0.700000X0.700000*% 68 | %ADD32R,1.500000X3.600000*% 69 | %ADD33R,1.050000X1.500000*% 70 | %ADD34O,1.050000X1.500000*% 71 | %ADD35R,1.000000X1.800000*% 72 | %ADD36RoundRect,0.250000X0.250000X0.475000X-0.250000X0.475000X-0.250000X-0.475000X0.250000X-0.475000X0*% 73 | %ADD37RoundRect,0.225000X-0.375000X0.225000X-0.375000X-0.225000X0.375000X-0.225000X0.375000X0.225000X0*% 74 | %ADD38RoundRect,0.140000X0.140000X0.170000X-0.140000X0.170000X-0.140000X-0.170000X0.140000X-0.170000X0*% 75 | %ADD39FreePoly1,0.000000*% 76 | %ADD40RoundRect,0.381000X-0.381000X-0.381000X0.381000X-0.381000X0.381000X0.381000X-0.381000X0.381000X0*% 77 | %ADD41C,1.524000*% 78 | %ADD42FreePoly2,0.000000*% 79 | %ADD43FreePoly3,90.000000*% 80 | %ADD44FreePoly4,90.000000*% 81 | %ADD45RoundRect,0.050000X0.150000X0.300000X-0.150000X0.300000X-0.150000X-0.300000X0.150000X-0.300000X0*% 82 | %ADD46RoundRect,0.150000X0.150000X-0.850000X0.150000X0.850000X-0.150000X0.850000X-0.150000X-0.850000X0*% 83 | %ADD47C,0.650000*% 84 | %ADD48R,0.600000X1.150000*% 85 | %ADD49R,0.300000X1.150000*% 86 | %ADD50O,1.050000X2.100000*% 87 | %ADD51O,1.000000X2.000000*% 88 | G04 APERTURE END LIST* 89 | D10* 90 | %TO.C,R8*% 91 | X148180000Y-70200000D03* 92 | X149200000Y-70200000D03* 93 | %TD*% 94 | D11* 95 | %TO.C,D10*% 96 | X141000000Y-100800000D03* 97 | X141000000Y-99400000D03* 98 | %TD*% 99 | D12* 100 | %TO.C,C17*% 101 | X133650000Y-87200000D03* 102 | X135550000Y-87200000D03* 103 | %TD*% 104 | D13* 105 | %TO.C,D1*% 106 | X134400000Y-94812500D03* 107 | X134400000Y-96387500D03* 108 | %TD*% 109 | D14* 110 | %TO.C,C7*% 111 | X133600000Y-65880000D03* 112 | X133600000Y-64920000D03* 113 | %TD*% 114 | D11* 115 | %TO.C,D9*% 116 | X142800000Y-100900000D03* 117 | X142800000Y-99500000D03* 118 | %TD*% 119 | D15* 120 | %TO.C,U6*% 121 | X143450000Y-88200000D03* 122 | X143450000Y-89150000D03* 123 | X143450000Y-90100000D03* 124 | X145725000Y-90100000D03* 125 | X145725000Y-88200000D03* 126 | %TD*% 127 | D11* 128 | %TO.C,D7*% 129 | X139200000Y-100800000D03* 130 | X139200000Y-99400000D03* 131 | %TD*% 132 | D16* 133 | %TO.C,C16*% 134 | X147650000Y-88200000D03* 135 | X147650000Y-89750000D03* 136 | %TD*% 137 | D17* 138 | %TO.C,C10*% 139 | X141725000Y-83500000D03* 140 | X143275000Y-83500000D03* 141 | %TD*% 142 | D10* 143 | %TO.C,R6*% 144 | X141690000Y-77000000D03* 145 | X142710000Y-77000000D03* 146 | %TD*% 147 | D16* 148 | %TO.C,C11*% 149 | X145200000Y-70000000D03* 150 | X145200000Y-71550000D03* 151 | %TD*% 152 | D18* 153 | %TO.C,R19*% 154 | X134800000Y-104890000D03* 155 | X134800000Y-105910000D03* 156 | %TD*% 157 | D19* 158 | %TO.C,C12*% 159 | X145200000Y-74750000D03* 160 | X145200000Y-73200000D03* 161 | %TD*% 162 | D20* 163 | %TO.C,C3*% 164 | X133200000Y-59120000D03* 165 | X133200000Y-60080000D03* 166 | %TD*% 167 | D10* 168 | %TO.C,R11*% 169 | X139890000Y-64800000D03* 170 | X140910000Y-64800000D03* 171 | %TD*% 172 | D21* 173 | %TO.C,Q2*% 174 | X146800000Y-98262500D03* 175 | X144900000Y-98262500D03* 176 | X145850000Y-100137500D03* 177 | %TD*% 178 | D22* 179 | %TO.C,SW2*% 180 | X144925000Y-82075000D03* 181 | X144925000Y-77925000D03* 182 | X147075000Y-82075000D03* 183 | X147075000Y-77925000D03* 184 | %TD*% 185 | D14* 186 | %TO.C,C1*% 187 | X133200000Y-54400000D03* 188 | X133200000Y-53440000D03* 189 | %TD*% 190 | %TO.C,C4*% 191 | X130800000Y-54400000D03* 192 | X130800000Y-53440000D03* 193 | %TD*% 194 | D23* 195 | %TO.C,R15*% 196 | X147870000Y-86800000D03* 197 | X146850000Y-86800000D03* 198 | %TD*% 199 | D24* 200 | %TO.C,D2*% 201 | X146850000Y-94800000D03* 202 | X143550000Y-94800000D03* 203 | %TD*% 204 | D25* 205 | %TO.C,U2*% 206 | X139300000Y-96275000D03* 207 | X140250000Y-96275000D03* 208 | X141200000Y-96275000D03* 209 | X141200000Y-94000000D03* 210 | X139300000Y-94000000D03* 211 | %TD*% 212 | D18* 213 | %TO.C,R9*% 214 | X148600000Y-97690000D03* 215 | X148600000Y-98710000D03* 216 | %TD*% 217 | D23* 218 | %TO.C,R10*% 219 | X148910000Y-74375000D03* 220 | X147890000Y-74375000D03* 221 | %TD*% 222 | D18* 223 | %TO.C,R18*% 224 | X146600000Y-105490000D03* 225 | X146600000Y-106510000D03* 226 | %TD*% 227 | D26* 228 | %TO.C,R17*% 229 | X134800000Y-108020000D03* 230 | X134800000Y-107000000D03* 231 | %TD*% 232 | D27* 233 | %TO.C,U1*% 234 | X134900000Y-54400000D03* 235 | X134900000Y-55200000D03* 236 | X134900000Y-56000000D03* 237 | X134900000Y-56800000D03* 238 | X134900000Y-57600000D03* 239 | X134900000Y-58400000D03* 240 | X134900000Y-59200000D03* 241 | X134900000Y-60000000D03* 242 | X134900000Y-60800000D03* 243 | X134900000Y-61600000D03* 244 | X134900000Y-62400000D03* 245 | D28* 246 | X136000000Y-63300000D03* 247 | X136800000Y-63300000D03* 248 | X137600000Y-63300000D03* 249 | X138400000Y-63300000D03* 250 | X139200000Y-63300000D03* 251 | X140000000Y-63300000D03* 252 | X140800000Y-63300000D03* 253 | X141600000Y-63300000D03* 254 | X142400000Y-63300000D03* 255 | X143200000Y-63300000D03* 256 | X144000000Y-63300000D03* 257 | X144800000Y-63300000D03* 258 | X145600000Y-63300000D03* 259 | D27* 260 | X146700000Y-62400000D03* 261 | X146700000Y-61600000D03* 262 | X146700000Y-60800000D03* 263 | X146700000Y-60000000D03* 264 | X146700000Y-59200000D03* 265 | X146700000Y-58400000D03* 266 | X146700000Y-57600000D03* 267 | X146700000Y-56800000D03* 268 | X146700000Y-56000000D03* 269 | X146700000Y-55200000D03* 270 | X146700000Y-54400000D03* 271 | D28* 272 | X145600000Y-53500000D03* 273 | X144800000Y-53500000D03* 274 | X144000000Y-53500000D03* 275 | X143200000Y-53500000D03* 276 | X142400000Y-53500000D03* 277 | X141600000Y-53500000D03* 278 | X140800000Y-53500000D03* 279 | X140000000Y-53500000D03* 280 | X139200000Y-53500000D03* 281 | X138400000Y-53500000D03* 282 | X137600000Y-53500000D03* 283 | X136800000Y-53500000D03* 284 | X136000000Y-53500000D03* 285 | D29* 286 | X138825000Y-56425000D03* 287 | D30* 288 | X138825000Y-58400000D03* 289 | X138825000Y-60375000D03* 290 | X140800000Y-56425000D03* 291 | X140800000Y-58400000D03* 292 | X140800000Y-60375000D03* 293 | X142775000Y-56425000D03* 294 | X142775000Y-58400000D03* 295 | X142775000Y-60375000D03* 296 | D31* 297 | X146750000Y-53450000D03* 298 | X146750000Y-63350000D03* 299 | X134850000Y-63350000D03* 300 | X134850000Y-53450000D03* 301 | %TD*% 302 | D23* 303 | %TO.C,R3*% 304 | X137620000Y-95200000D03* 305 | X136600000Y-95200000D03* 306 | %TD*% 307 | D32* 308 | %TO.C,L1*% 309 | X136925000Y-90800000D03* 310 | X133875000Y-90800000D03* 311 | %TD*% 312 | D14* 313 | %TO.C,C2*% 314 | X132000000Y-54400000D03* 315 | X132000000Y-53440000D03* 316 | %TD*% 317 | D26* 318 | %TO.C,R16*% 319 | X145340000Y-86910000D03* 320 | X145340000Y-85890000D03* 321 | %TD*% 322 | D33* 323 | %TO.C,Q1*% 324 | X139460000Y-80500000D03* 325 | D34* 326 | X140730000Y-80500000D03* 327 | X142000000Y-80500000D03* 328 | %TD*% 329 | D26* 330 | %TO.C,R12*% 331 | X139800000Y-66910000D03* 332 | X139800000Y-65890000D03* 333 | %TD*% 334 | D20* 335 | %TO.C,C8*% 336 | X138800000Y-64920000D03* 337 | X138800000Y-65880000D03* 338 | %TD*% 339 | D18* 340 | %TO.C,R1*% 341 | X133200000Y-57090000D03* 342 | X133200000Y-58110000D03* 343 | %TD*% 344 | D23* 345 | %TO.C,R14*% 346 | X143850000Y-86800000D03* 347 | X142830000Y-86800000D03* 348 | %TD*% 349 | D35* 350 | %TO.C,Y1*% 351 | X134950000Y-65600000D03* 352 | X137450000Y-65600000D03* 353 | %TD*% 354 | D26* 355 | %TO.C,R7*% 356 | X146600000Y-75085000D03* 357 | X146600000Y-74065000D03* 358 | %TD*% 359 | D17* 360 | %TO.C,C9*% 361 | X138450000Y-83500000D03* 362 | X140000000Y-83500000D03* 363 | %TD*% 364 | %TO.C,C5*% 365 | X139225000Y-92200000D03* 366 | X140775000Y-92200000D03* 367 | %TD*% 368 | D36* 369 | %TO.C,C15*% 370 | X146000000Y-92200000D03* 371 | X144100000Y-92200000D03* 372 | %TD*% 373 | D16* 374 | %TO.C,C6*% 375 | X147400000Y-102025000D03* 376 | X147400000Y-103575000D03* 377 | %TD*% 378 | D37* 379 | %TO.C,D8*% 380 | X136800000Y-96550000D03* 381 | X136800000Y-99850000D03* 382 | %TD*% 383 | D22* 384 | %TO.C,SW1*% 385 | X134425000Y-82075000D03* 386 | X134425000Y-77925000D03* 387 | X136575000Y-82075000D03* 388 | X136575000Y-77925000D03* 389 | %TD*% 390 | D38* 391 | %TO.C,C14*% 392 | X148880000Y-75575000D03* 393 | X147920000Y-75575000D03* 394 | %TD*% 395 | D10* 396 | %TO.C,R2*% 397 | X136690000Y-94000000D03* 398 | X137710000Y-94000000D03* 399 | %TD*% 400 | D39* 401 | %TO.C,U4*% 402 | X130660000Y-58685000D03* 403 | D40* 404 | X131160000Y-62185000D03* 405 | D41* 406 | X130660000Y-65185000D03* 407 | X150660000Y-65185000D03* 408 | X150660000Y-67685000D03* 409 | X150660000Y-56185000D03* 410 | X150660000Y-58685000D03* 411 | X150660000Y-93185000D03* 412 | X150660000Y-95685000D03* 413 | D42* 414 | X150660000Y-86185000D03* 415 | X150660000Y-83685000D03* 416 | D41* 417 | X150660000Y-72685000D03* 418 | X150660000Y-70185000D03* 419 | D40* 420 | X131160000Y-70685000D03* 421 | D41* 422 | X130660000Y-68185000D03* 423 | D43* 424 | X150820000Y-102450000D03* 425 | D44* 426 | X150820000Y-100185000D03* 427 | %TD*% 428 | D45* 429 | %TO.C,D3*% 430 | X131950000Y-56000000D03* 431 | X131250000Y-56000000D03* 432 | %TD*% 433 | D10* 434 | %TO.C,R5*% 435 | X138980000Y-77000000D03* 436 | X140000000Y-77000000D03* 437 | %TD*% 438 | D46* 439 | %TO.C,U3*% 440 | X134355000Y-74700000D03* 441 | X135625000Y-74700000D03* 442 | X136895000Y-74700000D03* 443 | X138165000Y-74700000D03* 444 | X139435000Y-74700000D03* 445 | X140705000Y-74700000D03* 446 | X141975000Y-74700000D03* 447 | X143245000Y-74700000D03* 448 | X143245000Y-69700000D03* 449 | X141975000Y-69700000D03* 450 | X140705000Y-69700000D03* 451 | X139435000Y-69700000D03* 452 | X138165000Y-69700000D03* 453 | X136895000Y-69700000D03* 454 | X135625000Y-69700000D03* 455 | X134355000Y-69700000D03* 456 | %TD*% 457 | D10* 458 | %TO.C,R4*% 459 | X135690000Y-67400000D03* 460 | X136710000Y-67400000D03* 461 | %TD*% 462 | D47* 463 | %TO.C,J2*% 464 | X137830000Y-103520000D03* 465 | X143610000Y-103520000D03* 466 | D48* 467 | X137520000Y-102445000D03* 468 | X138320000Y-102445000D03* 469 | D49* 470 | X139470000Y-102445000D03* 471 | X140470000Y-102445000D03* 472 | X140970000Y-102445000D03* 473 | X141970000Y-102445000D03* 474 | D48* 475 | X143920000Y-102445000D03* 476 | X143120000Y-102445000D03* 477 | D49* 478 | X142470000Y-102445000D03* 479 | X141470000Y-102445000D03* 480 | X139970000Y-102445000D03* 481 | X138970000Y-102445000D03* 482 | D50* 483 | X136400000Y-103020000D03* 484 | D51* 485 | X136400000Y-107200000D03* 486 | X145040000Y-107200000D03* 487 | D50* 488 | X145040000Y-103020000D03* 489 | %TD*% 490 | M02* 491 | -------------------------------------------------------------------------------- /hardware/crimpdeq/production/gerber/crimpdeq-F_Paste.gbr: -------------------------------------------------------------------------------- 1 | %TF.GenerationSoftware,KiCad,Pcbnew,9.0.1*% 2 | %TF.CreationDate,2025-04-24T12:06:56+02:00*% 3 | %TF.ProjectId,crimpdeq,6372696d-7064-4657-912e-6b696361645f,rev?*% 4 | %TF.SameCoordinates,Original*% 5 | %TF.FileFunction,Paste,Top*% 6 | %TF.FilePolarity,Positive*% 7 | %FSLAX46Y46*% 8 | G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* 9 | G04 Created by KiCad (PCBNEW 9.0.1) date 2025-04-24 12:06:56* 10 | %MOMM*% 11 | %LPD*% 12 | G01* 13 | G04 APERTURE LIST* 14 | G04 Aperture macros list* 15 | %AMRoundRect* 16 | 0 Rectangle with rounded corners* 17 | 0 $1 Rounding radius* 18 | 0 $2 $3 $4 $5 $6 $7 $8 $9 X,Y pos of 4 corners* 19 | 0 Add a 4 corners polygon primitive as box body* 20 | 4,1,4,$2,$3,$4,$5,$6,$7,$8,$9,$2,$3,0* 21 | 0 Add four circle primitives for the rounded corners* 22 | 1,1,$1+$1,$2,$3* 23 | 1,1,$1+$1,$4,$5* 24 | 1,1,$1+$1,$6,$7* 25 | 1,1,$1+$1,$8,$9* 26 | 0 Add four rect primitives between the rounded corners* 27 | 20,1,$1+$1,$2,$3,$4,$5,0* 28 | 20,1,$1+$1,$4,$5,$6,$7,0* 29 | 20,1,$1+$1,$6,$7,$8,$9,0* 30 | 20,1,$1+$1,$8,$9,$2,$3,0*% 31 | %AMFreePoly0* 32 | 4,1,6,0.725000,-0.725000,-0.725000,-0.725000,-0.725000,0.125000,-0.125000,0.725000,0.725000,0.725000,0.725000,-0.725000,0.725000,-0.725000,$1*% 33 | G04 Aperture macros list end* 34 | %ADD10RoundRect,0.135000X-0.135000X-0.185000X0.135000X-0.185000X0.135000X0.185000X-0.135000X0.185000X0*% 35 | %ADD11RoundRect,0.150000X-0.200000X0.150000X-0.200000X-0.150000X0.200000X-0.150000X0.200000X0.150000X0*% 36 | %ADD12RoundRect,0.250000X-0.250000X-0.475000X0.250000X-0.475000X0.250000X0.475000X-0.250000X0.475000X0*% 37 | %ADD13RoundRect,0.218750X-0.256250X0.218750X-0.256250X-0.218750X0.256250X-0.218750X0.256250X0.218750X0*% 38 | %ADD14RoundRect,0.140000X0.170000X-0.140000X0.170000X0.140000X-0.170000X0.140000X-0.170000X-0.140000X0*% 39 | %ADD15RoundRect,0.150000X-0.512500X-0.150000X0.512500X-0.150000X0.512500X0.150000X-0.512500X0.150000X0*% 40 | %ADD16RoundRect,0.225000X-0.250000X0.225000X-0.250000X-0.225000X0.250000X-0.225000X0.250000X0.225000X0*% 41 | %ADD17RoundRect,0.225000X-0.225000X-0.250000X0.225000X-0.250000X0.225000X0.250000X-0.225000X0.250000X0*% 42 | %ADD18RoundRect,0.135000X-0.185000X0.135000X-0.185000X-0.135000X0.185000X-0.135000X0.185000X0.135000X0*% 43 | %ADD19RoundRect,0.225000X0.250000X-0.225000X0.250000X0.225000X-0.250000X0.225000X-0.250000X-0.225000X0*% 44 | %ADD20RoundRect,0.140000X-0.170000X0.140000X-0.170000X-0.140000X0.170000X-0.140000X0.170000X0.140000X0*% 45 | %ADD21RoundRect,0.150000X-0.150000X0.587500X-0.150000X-0.587500X0.150000X-0.587500X0.150000X0.587500X0*% 46 | %ADD22R,0.650000X1.050000*% 47 | %ADD23RoundRect,0.135000X0.135000X0.185000X-0.135000X0.185000X-0.135000X-0.185000X0.135000X-0.185000X0*% 48 | %ADD24RoundRect,0.225000X0.225000X0.375000X-0.225000X0.375000X-0.225000X-0.375000X0.225000X-0.375000X0*% 49 | %ADD25RoundRect,0.150000X0.150000X-0.512500X0.150000X0.512500X-0.150000X0.512500X-0.150000X-0.512500X0*% 50 | %ADD26RoundRect,0.135000X0.185000X-0.135000X0.185000X0.135000X-0.185000X0.135000X-0.185000X-0.135000X0*% 51 | %ADD27R,0.800000X0.400000*% 52 | %ADD28R,0.400000X0.800000*% 53 | %ADD29FreePoly0,0.000000*% 54 | %ADD30R,1.450000X1.450000*% 55 | %ADD31R,0.700000X0.700000*% 56 | %ADD32R,1.500000X3.600000*% 57 | %ADD33R,1.000000X1.800000*% 58 | %ADD34RoundRect,0.250000X0.250000X0.475000X-0.250000X0.475000X-0.250000X-0.475000X0.250000X-0.475000X0*% 59 | %ADD35RoundRect,0.225000X-0.375000X0.225000X-0.375000X-0.225000X0.375000X-0.225000X0.375000X0.225000X0*% 60 | %ADD36RoundRect,0.140000X0.140000X0.170000X-0.140000X0.170000X-0.140000X-0.170000X0.140000X-0.170000X0*% 61 | %ADD37RoundRect,0.050000X0.100000X0.250000X-0.100000X0.250000X-0.100000X-0.250000X0.100000X-0.250000X0*% 62 | %ADD38RoundRect,0.150000X0.150000X-0.850000X0.150000X0.850000X-0.150000X0.850000X-0.150000X-0.850000X0*% 63 | %ADD39R,0.600000X1.150000*% 64 | %ADD40R,0.300000X1.150000*% 65 | G04 APERTURE END LIST* 66 | D10* 67 | %TO.C,R8*% 68 | X148180000Y-70200000D03* 69 | X149200000Y-70200000D03* 70 | %TD*% 71 | D11* 72 | %TO.C,D10*% 73 | X141000000Y-100800000D03* 74 | X141000000Y-99400000D03* 75 | %TD*% 76 | D12* 77 | %TO.C,C17*% 78 | X133650000Y-87200000D03* 79 | X135550000Y-87200000D03* 80 | %TD*% 81 | D13* 82 | %TO.C,D1*% 83 | X134400000Y-94812500D03* 84 | X134400000Y-96387500D03* 85 | %TD*% 86 | D14* 87 | %TO.C,C7*% 88 | X133600000Y-65880000D03* 89 | X133600000Y-64920000D03* 90 | %TD*% 91 | D11* 92 | %TO.C,D9*% 93 | X142800000Y-100900000D03* 94 | X142800000Y-99500000D03* 95 | %TD*% 96 | D15* 97 | %TO.C,U6*% 98 | X143450000Y-88200000D03* 99 | X143450000Y-89150000D03* 100 | X143450000Y-90100000D03* 101 | X145725000Y-90100000D03* 102 | X145725000Y-88200000D03* 103 | %TD*% 104 | D11* 105 | %TO.C,D7*% 106 | X139200000Y-100800000D03* 107 | X139200000Y-99400000D03* 108 | %TD*% 109 | D16* 110 | %TO.C,C16*% 111 | X147650000Y-88200000D03* 112 | X147650000Y-89750000D03* 113 | %TD*% 114 | D17* 115 | %TO.C,C10*% 116 | X141725000Y-83500000D03* 117 | X143275000Y-83500000D03* 118 | %TD*% 119 | D10* 120 | %TO.C,R6*% 121 | X141690000Y-77000000D03* 122 | X142710000Y-77000000D03* 123 | %TD*% 124 | D16* 125 | %TO.C,C11*% 126 | X145200000Y-70000000D03* 127 | X145200000Y-71550000D03* 128 | %TD*% 129 | D18* 130 | %TO.C,R19*% 131 | X134800000Y-104890000D03* 132 | X134800000Y-105910000D03* 133 | %TD*% 134 | D19* 135 | %TO.C,C12*% 136 | X145200000Y-74750000D03* 137 | X145200000Y-73200000D03* 138 | %TD*% 139 | D20* 140 | %TO.C,C3*% 141 | X133200000Y-59120000D03* 142 | X133200000Y-60080000D03* 143 | %TD*% 144 | D10* 145 | %TO.C,R11*% 146 | X139890000Y-64800000D03* 147 | X140910000Y-64800000D03* 148 | %TD*% 149 | D21* 150 | %TO.C,Q2*% 151 | X146800000Y-98262500D03* 152 | X144900000Y-98262500D03* 153 | X145850000Y-100137500D03* 154 | %TD*% 155 | D22* 156 | %TO.C,SW2*% 157 | X144925000Y-82075000D03* 158 | X144925000Y-77925000D03* 159 | X147075000Y-82075000D03* 160 | X147075000Y-77925000D03* 161 | %TD*% 162 | D14* 163 | %TO.C,C1*% 164 | X133200000Y-54400000D03* 165 | X133200000Y-53440000D03* 166 | %TD*% 167 | %TO.C,C4*% 168 | X130800000Y-54400000D03* 169 | X130800000Y-53440000D03* 170 | %TD*% 171 | D23* 172 | %TO.C,R15*% 173 | X147870000Y-86800000D03* 174 | X146850000Y-86800000D03* 175 | %TD*% 176 | D24* 177 | %TO.C,D2*% 178 | X146850000Y-94800000D03* 179 | X143550000Y-94800000D03* 180 | %TD*% 181 | D25* 182 | %TO.C,U2*% 183 | X139300000Y-96275000D03* 184 | X140250000Y-96275000D03* 185 | X141200000Y-96275000D03* 186 | X141200000Y-94000000D03* 187 | X139300000Y-94000000D03* 188 | %TD*% 189 | D18* 190 | %TO.C,R9*% 191 | X148600000Y-97690000D03* 192 | X148600000Y-98710000D03* 193 | %TD*% 194 | D23* 195 | %TO.C,R10*% 196 | X148910000Y-74375000D03* 197 | X147890000Y-74375000D03* 198 | %TD*% 199 | D18* 200 | %TO.C,R18*% 201 | X146600000Y-105490000D03* 202 | X146600000Y-106510000D03* 203 | %TD*% 204 | D26* 205 | %TO.C,R17*% 206 | X134800000Y-108020000D03* 207 | X134800000Y-107000000D03* 208 | %TD*% 209 | D27* 210 | %TO.C,U1*% 211 | X134900000Y-54400000D03* 212 | X134900000Y-55200000D03* 213 | X134900000Y-56000000D03* 214 | X134900000Y-56800000D03* 215 | X134900000Y-57600000D03* 216 | X134900000Y-58400000D03* 217 | X134900000Y-59200000D03* 218 | X134900000Y-60000000D03* 219 | X134900000Y-60800000D03* 220 | X134900000Y-61600000D03* 221 | X134900000Y-62400000D03* 222 | D28* 223 | X136000000Y-63300000D03* 224 | X136800000Y-63300000D03* 225 | X137600000Y-63300000D03* 226 | X138400000Y-63300000D03* 227 | X139200000Y-63300000D03* 228 | X140000000Y-63300000D03* 229 | X140800000Y-63300000D03* 230 | X141600000Y-63300000D03* 231 | X142400000Y-63300000D03* 232 | X143200000Y-63300000D03* 233 | X144000000Y-63300000D03* 234 | X144800000Y-63300000D03* 235 | X145600000Y-63300000D03* 236 | D27* 237 | X146700000Y-62400000D03* 238 | X146700000Y-61600000D03* 239 | X146700000Y-60800000D03* 240 | X146700000Y-60000000D03* 241 | X146700000Y-59200000D03* 242 | X146700000Y-58400000D03* 243 | X146700000Y-57600000D03* 244 | X146700000Y-56800000D03* 245 | X146700000Y-56000000D03* 246 | X146700000Y-55200000D03* 247 | X146700000Y-54400000D03* 248 | D28* 249 | X145600000Y-53500000D03* 250 | X144800000Y-53500000D03* 251 | X144000000Y-53500000D03* 252 | X143200000Y-53500000D03* 253 | X142400000Y-53500000D03* 254 | X141600000Y-53500000D03* 255 | X140800000Y-53500000D03* 256 | X140000000Y-53500000D03* 257 | X139200000Y-53500000D03* 258 | X138400000Y-53500000D03* 259 | X137600000Y-53500000D03* 260 | X136800000Y-53500000D03* 261 | X136000000Y-53500000D03* 262 | D29* 263 | X138825000Y-56425000D03* 264 | D30* 265 | X138825000Y-58400000D03* 266 | X138825000Y-60375000D03* 267 | X140800000Y-56425000D03* 268 | X140800000Y-58400000D03* 269 | X140800000Y-60375000D03* 270 | X142775000Y-56425000D03* 271 | X142775000Y-58400000D03* 272 | X142775000Y-60375000D03* 273 | D31* 274 | X146750000Y-53450000D03* 275 | X146750000Y-63350000D03* 276 | X134850000Y-63350000D03* 277 | X134850000Y-53450000D03* 278 | %TD*% 279 | D23* 280 | %TO.C,R3*% 281 | X137620000Y-95200000D03* 282 | X136600000Y-95200000D03* 283 | %TD*% 284 | D32* 285 | %TO.C,L1*% 286 | X136925000Y-90800000D03* 287 | X133875000Y-90800000D03* 288 | %TD*% 289 | D14* 290 | %TO.C,C2*% 291 | X132000000Y-54400000D03* 292 | X132000000Y-53440000D03* 293 | %TD*% 294 | D26* 295 | %TO.C,R16*% 296 | X145340000Y-86910000D03* 297 | X145340000Y-85890000D03* 298 | %TD*% 299 | %TO.C,R12*% 300 | X139800000Y-66910000D03* 301 | X139800000Y-65890000D03* 302 | %TD*% 303 | D20* 304 | %TO.C,C8*% 305 | X138800000Y-64920000D03* 306 | X138800000Y-65880000D03* 307 | %TD*% 308 | D18* 309 | %TO.C,R1*% 310 | X133200000Y-57090000D03* 311 | X133200000Y-58110000D03* 312 | %TD*% 313 | D23* 314 | %TO.C,R14*% 315 | X143850000Y-86800000D03* 316 | X142830000Y-86800000D03* 317 | %TD*% 318 | D33* 319 | %TO.C,Y1*% 320 | X134950000Y-65600000D03* 321 | X137450000Y-65600000D03* 322 | %TD*% 323 | D26* 324 | %TO.C,R7*% 325 | X146600000Y-75085000D03* 326 | X146600000Y-74065000D03* 327 | %TD*% 328 | D17* 329 | %TO.C,C9*% 330 | X138450000Y-83500000D03* 331 | X140000000Y-83500000D03* 332 | %TD*% 333 | %TO.C,C5*% 334 | X139225000Y-92200000D03* 335 | X140775000Y-92200000D03* 336 | %TD*% 337 | D34* 338 | %TO.C,C15*% 339 | X146000000Y-92200000D03* 340 | X144100000Y-92200000D03* 341 | %TD*% 342 | D16* 343 | %TO.C,C6*% 344 | X147400000Y-102025000D03* 345 | X147400000Y-103575000D03* 346 | %TD*% 347 | D35* 348 | %TO.C,D8*% 349 | X136800000Y-96550000D03* 350 | X136800000Y-99850000D03* 351 | %TD*% 352 | D22* 353 | %TO.C,SW1*% 354 | X134425000Y-82075000D03* 355 | X134425000Y-77925000D03* 356 | X136575000Y-82075000D03* 357 | X136575000Y-77925000D03* 358 | %TD*% 359 | D36* 360 | %TO.C,C14*% 361 | X148880000Y-75575000D03* 362 | X147920000Y-75575000D03* 363 | %TD*% 364 | D10* 365 | %TO.C,R2*% 366 | X136690000Y-94000000D03* 367 | X137710000Y-94000000D03* 368 | %TD*% 369 | D37* 370 | %TO.C,D3*% 371 | X131950000Y-56000000D03* 372 | X131250000Y-56000000D03* 373 | %TD*% 374 | D10* 375 | %TO.C,R5*% 376 | X138980000Y-77000000D03* 377 | X140000000Y-77000000D03* 378 | %TD*% 379 | D38* 380 | %TO.C,U3*% 381 | X134355000Y-74700000D03* 382 | X135625000Y-74700000D03* 383 | X136895000Y-74700000D03* 384 | X138165000Y-74700000D03* 385 | X139435000Y-74700000D03* 386 | X140705000Y-74700000D03* 387 | X141975000Y-74700000D03* 388 | X143245000Y-74700000D03* 389 | X143245000Y-69700000D03* 390 | X141975000Y-69700000D03* 391 | X140705000Y-69700000D03* 392 | X139435000Y-69700000D03* 393 | X138165000Y-69700000D03* 394 | X136895000Y-69700000D03* 395 | X135625000Y-69700000D03* 396 | X134355000Y-69700000D03* 397 | %TD*% 398 | D10* 399 | %TO.C,R4*% 400 | X135690000Y-67400000D03* 401 | X136710000Y-67400000D03* 402 | %TD*% 403 | D39* 404 | %TO.C,J2*% 405 | X137520000Y-102445000D03* 406 | X138320000Y-102445000D03* 407 | D40* 408 | X139470000Y-102445000D03* 409 | X140470000Y-102445000D03* 410 | X140970000Y-102445000D03* 411 | X141970000Y-102445000D03* 412 | D39* 413 | X143920000Y-102445000D03* 414 | X143120000Y-102445000D03* 415 | D40* 416 | X142470000Y-102445000D03* 417 | X141470000Y-102445000D03* 418 | X139970000Y-102445000D03* 419 | X138970000Y-102445000D03* 420 | %TD*% 421 | M02* 422 | -------------------------------------------------------------------------------- /hardware/crimpdeq/production/gerber/crimpdeq-F_Silkscreen.gbr: -------------------------------------------------------------------------------- 1 | %TF.GenerationSoftware,KiCad,Pcbnew,9.0.1*% 2 | %TF.CreationDate,2025-04-24T12:06:56+02:00*% 3 | %TF.ProjectId,crimpdeq,6372696d-7064-4657-912e-6b696361645f,rev?*% 4 | %TF.SameCoordinates,Original*% 5 | %TF.FileFunction,Legend,Top*% 6 | %TF.FilePolarity,Positive*% 7 | %FSLAX46Y46*% 8 | G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* 9 | G04 Created by KiCad (PCBNEW 9.0.1) date 2025-04-24 12:06:56* 10 | %MOMM*% 11 | %LPD*% 12 | G01* 13 | G04 APERTURE LIST* 14 | %ADD10C,0.150000*% 15 | %ADD11C,0.120000*% 16 | %ADD12C,0.200000*% 17 | G04 APERTURE END LIST* 18 | D10* 19 | X140038095Y-50654819D02* 20 | X140038095Y-51464342D01* 21 | X140038095Y-51464342D02* 22 | X140085714Y-51559580D01* 23 | X140085714Y-51559580D02* 24 | X140133333Y-51607200D01* 25 | X140133333Y-51607200D02* 26 | X140228571Y-51654819D01* 27 | X140228571Y-51654819D02* 28 | X140419047Y-51654819D01* 29 | X140419047Y-51654819D02* 30 | X140514285Y-51607200D01* 31 | X140514285Y-51607200D02* 32 | X140561904Y-51559580D01* 33 | X140561904Y-51559580D02* 34 | X140609523Y-51464342D01* 35 | X140609523Y-51464342D02* 36 | X140609523Y-50654819D01* 37 | X141609523Y-51654819D02* 38 | X141038095Y-51654819D01* 39 | X141323809Y-51654819D02* 40 | X141323809Y-50654819D01* 41 | X141323809Y-50654819D02* 42 | X141228571Y-50797676D01* 43 | X141228571Y-50797676D02* 44 | X141133333Y-50892914D01* 45 | X141133333Y-50892914D02* 46 | X141038095Y-50940533D01* 47 | X136038094Y-50019104D02* 48 | X136514284Y-50019104D01* 49 | X135942856Y-50304819D02* 50 | X136276189Y-49304819D01* 51 | X136276189Y-49304819D02* 52 | X136609522Y-50304819D01* 53 | X136942856Y-49638152D02* 54 | X136942856Y-50304819D01* 55 | X136942856Y-49733390D02* 56 | X136990475Y-49685771D01* 57 | X136990475Y-49685771D02* 58 | X137085713Y-49638152D01* 59 | X137085713Y-49638152D02* 60 | X137228570Y-49638152D01* 61 | X137228570Y-49638152D02* 62 | X137323808Y-49685771D01* 63 | X137323808Y-49685771D02* 64 | X137371427Y-49781009D01* 65 | X137371427Y-49781009D02* 66 | X137371427Y-50304819D01* 67 | X137704761Y-49638152D02* 68 | X138085713Y-49638152D01* 69 | X137847618Y-49304819D02* 70 | X137847618Y-50161961D01* 71 | X137847618Y-50161961D02* 72 | X137895237Y-50257200D01* 73 | X137895237Y-50257200D02* 74 | X137990475Y-50304819D01* 75 | X137990475Y-50304819D02* 76 | X138085713Y-50304819D01* 77 | X138799999Y-50257200D02* 78 | X138704761Y-50304819D01* 79 | X138704761Y-50304819D02* 80 | X138514285Y-50304819D01* 81 | X138514285Y-50304819D02* 82 | X138419047Y-50257200D01* 83 | X138419047Y-50257200D02* 84 | X138371428Y-50161961D01* 85 | X138371428Y-50161961D02* 86 | X138371428Y-49781009D01* 87 | X138371428Y-49781009D02* 88 | X138419047Y-49685771D01* 89 | X138419047Y-49685771D02* 90 | X138514285Y-49638152D01* 91 | X138514285Y-49638152D02* 92 | X138704761Y-49638152D01* 93 | X138704761Y-49638152D02* 94 | X138799999Y-49685771D01* 95 | X138799999Y-49685771D02* 96 | X138847618Y-49781009D01* 97 | X138847618Y-49781009D02* 98 | X138847618Y-49876247D01* 99 | X138847618Y-49876247D02* 100 | X138371428Y-49971485D01* 101 | X139276190Y-49638152D02* 102 | X139276190Y-50304819D01* 103 | X139276190Y-49733390D02* 104 | X139323809Y-49685771D01* 105 | X139323809Y-49685771D02* 106 | X139419047Y-49638152D01* 107 | X139419047Y-49638152D02* 108 | X139561904Y-49638152D01* 109 | X139561904Y-49638152D02* 110 | X139657142Y-49685771D01* 111 | X139657142Y-49685771D02* 112 | X139704761Y-49781009D01* 113 | X139704761Y-49781009D02* 114 | X139704761Y-50304819D01* 115 | X140180952Y-49638152D02* 116 | X140180952Y-50304819D01* 117 | X140180952Y-49733390D02* 118 | X140228571Y-49685771D01* 119 | X140228571Y-49685771D02* 120 | X140323809Y-49638152D01* 121 | X140323809Y-49638152D02* 122 | X140466666Y-49638152D01* 123 | X140466666Y-49638152D02* 124 | X140561904Y-49685771D01* 125 | X140561904Y-49685771D02* 126 | X140609523Y-49781009D01* 127 | X140609523Y-49781009D02* 128 | X140609523Y-50304819D01* 129 | X141514285Y-50304819D02* 130 | X141514285Y-49781009D01* 131 | X141514285Y-49781009D02* 132 | X141466666Y-49685771D01* 133 | X141466666Y-49685771D02* 134 | X141371428Y-49638152D01* 135 | X141371428Y-49638152D02* 136 | X141180952Y-49638152D01* 137 | X141180952Y-49638152D02* 138 | X141085714Y-49685771D01* 139 | X141514285Y-50257200D02* 140 | X141419047Y-50304819D01* 141 | X141419047Y-50304819D02* 142 | X141180952Y-50304819D01* 143 | X141180952Y-50304819D02* 144 | X141085714Y-50257200D01* 145 | X141085714Y-50257200D02* 146 | X141038095Y-50161961D01* 147 | X141038095Y-50161961D02* 148 | X141038095Y-50066723D01* 149 | X141038095Y-50066723D02* 150 | X141085714Y-49971485D01* 151 | X141085714Y-49971485D02* 152 | X141180952Y-49923866D01* 153 | X141180952Y-49923866D02* 154 | X141419047Y-49923866D01* 155 | X141419047Y-49923866D02* 156 | X141514285Y-49876247D01* 157 | X142704762Y-50019104D02* 158 | X143180952Y-50019104D01* 159 | X142609524Y-50304819D02* 160 | X142942857Y-49304819D01* 161 | X142942857Y-49304819D02* 162 | X143276190Y-50304819D01* 163 | X143609524Y-50304819D02* 164 | X143609524Y-49638152D01* 165 | X143609524Y-49828628D02* 166 | X143657143Y-49733390D01* 167 | X143657143Y-49733390D02* 168 | X143704762Y-49685771D01* 169 | X143704762Y-49685771D02* 170 | X143800000Y-49638152D01* 171 | X143800000Y-49638152D02* 172 | X143895238Y-49638152D01* 173 | X144609524Y-50257200D02* 174 | X144514286Y-50304819D01* 175 | X144514286Y-50304819D02* 176 | X144323810Y-50304819D01* 177 | X144323810Y-50304819D02* 178 | X144228572Y-50257200D01* 179 | X144228572Y-50257200D02* 180 | X144180953Y-50161961D01* 181 | X144180953Y-50161961D02* 182 | X144180953Y-49781009D01* 183 | X144180953Y-49781009D02* 184 | X144228572Y-49685771D01* 185 | X144228572Y-49685771D02* 186 | X144323810Y-49638152D01* 187 | X144323810Y-49638152D02* 188 | X144514286Y-49638152D01* 189 | X144514286Y-49638152D02* 190 | X144609524Y-49685771D01* 191 | X144609524Y-49685771D02* 192 | X144657143Y-49781009D01* 193 | X144657143Y-49781009D02* 194 | X144657143Y-49876247D01* 195 | X144657143Y-49876247D02* 196 | X144180953Y-49971485D01* 197 | X145514286Y-50304819D02* 198 | X145514286Y-49781009D01* 199 | X145514286Y-49781009D02* 200 | X145466667Y-49685771D01* 201 | X145466667Y-49685771D02* 202 | X145371429Y-49638152D01* 203 | X145371429Y-49638152D02* 204 | X145180953Y-49638152D01* 205 | X145180953Y-49638152D02* 206 | X145085715Y-49685771D01* 207 | X145514286Y-50257200D02* 208 | X145419048Y-50304819D01* 209 | X145419048Y-50304819D02* 210 | X145180953Y-50304819D01* 211 | X145180953Y-50304819D02* 212 | X145085715Y-50257200D01* 213 | X145085715Y-50257200D02* 214 | X145038096Y-50161961D01* 215 | X145038096Y-50161961D02* 216 | X145038096Y-50066723D01* 217 | X145038096Y-50066723D02* 218 | X145085715Y-49971485D01* 219 | X145085715Y-49971485D02* 220 | X145180953Y-49923866D01* 221 | X145180953Y-49923866D02* 222 | X145419048Y-49923866D01* 223 | X145419048Y-49923866D02* 224 | X145514286Y-49876247D01* 225 | D11* 226 | %TO.C,R8*% 227 | X148536359Y-69820000D02* 228 | X148843641Y-69820000D01* 229 | X148536359Y-70580000D02* 230 | X148843641Y-70580000D01* 231 | %TO.C,D10*% 232 | X140400000Y-99400000D02* 233 | X140400000Y-101360000D01* 234 | X140400000Y-101360000D02* 235 | X141600000Y-101360000D01* 236 | X141600000Y-99400000D02* 237 | X141600000Y-101360000D01* 238 | %TO.C,C17*% 239 | X134338748Y-86465000D02* 240 | X134861252Y-86465000D01* 241 | X134338748Y-87935000D02* 242 | X134861252Y-87935000D01* 243 | %TO.C,D1*% 244 | X133665000Y-94115000D02* 245 | X133665000Y-96400000D01* 246 | X135135000Y-94115000D02* 247 | X133665000Y-94115000D01* 248 | X135135000Y-96400000D02* 249 | X135135000Y-94115000D01* 250 | %TO.C,C7*% 251 | X133240000Y-65507836D02* 252 | X133240000Y-65292164D01* 253 | X133960000Y-65507836D02* 254 | X133960000Y-65292164D01* 255 | %TO.C,D9*% 256 | X142200000Y-99500000D02* 257 | X142200000Y-101460000D01* 258 | X142200000Y-101460000D02* 259 | X143400000Y-101460000D01* 260 | X143400000Y-99500000D02* 261 | X143400000Y-101460000D01* 262 | %TO.C,U6*% 263 | X144587500Y-87590000D02* 264 | X143787500Y-87590000D01* 265 | X144587500Y-87590000D02* 266 | X145387500Y-87590000D01* 267 | X144587500Y-90710000D02* 268 | X143787500Y-90710000D01* 269 | X144587500Y-90710000D02* 270 | X145387500Y-90710000D01* 271 | X143287500Y-87640000D02* 272 | X143047500Y-87310000D01* 273 | X143527500Y-87310000D01* 274 | X143287500Y-87640000D01* 275 | G36* 276 | X143287500Y-87640000D02* 277 | G01* 278 | X143047500Y-87310000D01* 279 | X143527500Y-87310000D01* 280 | X143287500Y-87640000D01* 281 | G37* 282 | %TO.C,D7*% 283 | X138600000Y-99400000D02* 284 | X138600000Y-101360000D01* 285 | X138600000Y-101360000D02* 286 | X139800000Y-101360000D01* 287 | X139800000Y-99400000D02* 288 | X139800000Y-101360000D01* 289 | %TO.C,C16*% 290 | X147140000Y-88834420D02* 291 | X147140000Y-89115580D01* 292 | X148160000Y-88834420D02* 293 | X148160000Y-89115580D01* 294 | %TO.C,C10*% 295 | X142359420Y-82990000D02* 296 | X142640580Y-82990000D01* 297 | X142359420Y-84010000D02* 298 | X142640580Y-84010000D01* 299 | %TO.C,R6*% 300 | X142046359Y-76620000D02* 301 | X142353641Y-76620000D01* 302 | X142046359Y-77380000D02* 303 | X142353641Y-77380000D01* 304 | %TO.C,C11*% 305 | X144690000Y-70634420D02* 306 | X144690000Y-70915580D01* 307 | X145710000Y-70634420D02* 308 | X145710000Y-70915580D01* 309 | %TO.C,R19*% 310 | X134420000Y-105246359D02* 311 | X134420000Y-105553641D01* 312 | X135180000Y-105246359D02* 313 | X135180000Y-105553641D01* 314 | %TO.C,C12*% 315 | X144690000Y-74115580D02* 316 | X144690000Y-73834420D01* 317 | X145710000Y-74115580D02* 318 | X145710000Y-73834420D01* 319 | %TO.C,C3*% 320 | X132840000Y-59492164D02* 321 | X132840000Y-59707836D01* 322 | X133560000Y-59492164D02* 323 | X133560000Y-59707836D01* 324 | %TO.C,R11*% 325 | X140246359Y-64420000D02* 326 | X140553641Y-64420000D01* 327 | X140246359Y-65180000D02* 328 | X140553641Y-65180000D01* 329 | %TO.C,Q2*% 330 | X144290000Y-99200000D02* 331 | X144290000Y-98550000D01* 332 | X144290000Y-99200000D02* 333 | X144290000Y-99850000D01* 334 | X147410000Y-99200000D02* 335 | X147410000Y-98550000D01* 336 | X147410000Y-99200000D02* 337 | X147410000Y-99850000D01* 338 | X147690000Y-98277500D02* 339 | X147360000Y-98037500D01* 340 | X147690000Y-97797500D01* 341 | X147690000Y-98277500D01* 342 | G36* 343 | X147690000Y-98277500D02* 344 | G01* 345 | X147360000Y-98037500D01* 346 | X147690000Y-97797500D01* 347 | X147690000Y-98277500D01* 348 | G37* 349 | %TO.C,SW2*% 350 | X144300000Y-77800000D02* 351 | X144300000Y-82200000D01* 352 | X144300000Y-82200000D02* 353 | X144420000Y-82200000D01* 354 | X144420000Y-77800000D02* 355 | X144300000Y-77800000D01* 356 | X145430000Y-82200000D02* 357 | X146570000Y-82200000D01* 358 | X146570000Y-77800000D02* 359 | X145430000Y-77800000D01* 360 | X147580000Y-82200000D02* 361 | X147700000Y-82200000D01* 362 | X147700000Y-77800000D02* 363 | X147580000Y-77800000D01* 364 | X147700000Y-82200000D02* 365 | X147700000Y-77800000D01* 366 | %TO.C,C1*% 367 | X132840000Y-54027836D02* 368 | X132840000Y-53812164D01* 369 | X133560000Y-54027836D02* 370 | X133560000Y-53812164D01* 371 | %TO.C,C4*% 372 | X130440000Y-54027836D02* 373 | X130440000Y-53812164D01* 374 | X131160000Y-54027836D02* 375 | X131160000Y-53812164D01* 376 | %TO.C,R15*% 377 | X147513641Y-86420000D02* 378 | X147206359Y-86420000D01* 379 | X147513641Y-87180000D02* 380 | X147206359Y-87180000D01* 381 | %TO.C,D2*% 382 | X147560000Y-93800000D02* 383 | X143550000Y-93800000D01* 384 | X147560000Y-95800000D02* 385 | X143550000Y-95800000D01* 386 | X147560000Y-95800000D02* 387 | X147560000Y-93800000D01* 388 | %TO.C,U2*% 389 | X138690000Y-95137500D02* 390 | X138690000Y-94337500D01* 391 | X138690000Y-95137500D02* 392 | X138690000Y-95937500D01* 393 | X141810000Y-95137500D02* 394 | X141810000Y-94337500D01* 395 | X141810000Y-95137500D02* 396 | X141810000Y-95937500D01* 397 | X138740000Y-96437500D02* 398 | X138410000Y-96677500D01* 399 | X138410000Y-96197500D01* 400 | X138740000Y-96437500D01* 401 | G36* 402 | X138740000Y-96437500D02* 403 | G01* 404 | X138410000Y-96677500D01* 405 | X138410000Y-96197500D01* 406 | X138740000Y-96437500D01* 407 | G37* 408 | %TO.C,R9*% 409 | X148220000Y-98046359D02* 410 | X148220000Y-98353641D01* 411 | X148980000Y-98046359D02* 412 | X148980000Y-98353641D01* 413 | %TO.C,R10*% 414 | X148553641Y-73995000D02* 415 | X148246359Y-73995000D01* 416 | X148553641Y-74755000D02* 417 | X148246359Y-74755000D01* 418 | %TO.C,R18*% 419 | X146220000Y-105846359D02* 420 | X146220000Y-106153641D01* 421 | X146980000Y-105846359D02* 422 | X146980000Y-106153641D01* 423 | %TO.C,R17*% 424 | X134420000Y-107663641D02* 425 | X134420000Y-107356359D01* 426 | X135180000Y-107663641D02* 427 | X135180000Y-107356359D01* 428 | %TO.C,U1*% 429 | X134000000Y-63400000D02* 430 | X134000000Y-64200000D01* 431 | X134000000Y-64200000D02* 432 | X134800000Y-64200000D01* 433 | X134200000Y-47400000D02* 434 | X147400000Y-47400000D01* 435 | X134200000Y-52800000D02* 436 | X147400000Y-52800000D01* 437 | X134200000Y-64000000D02* 438 | X134200000Y-47400000D01* 439 | X134875000Y-47200000D02* 440 | X134025000Y-47200000D01* 441 | X146850000Y-47200000D02* 442 | X147600000Y-47200000D01* 443 | X147400000Y-47400000D02* 444 | X147400000Y-64000000D01* 445 | X147400000Y-64000000D02* 446 | X134200000Y-64000000D01* 447 | X147600000Y-47200000D02* 448 | X147600000Y-47800000D01* 449 | X147600000Y-63400000D02* 450 | X147600000Y-64200000D01* 451 | X147600000Y-64200000D02* 452 | X146800000Y-64200000D01* 453 | %TO.C,R3*% 454 | X137263641Y-94820000D02* 455 | X136956359Y-94820000D01* 456 | X137263641Y-95580000D02* 457 | X136956359Y-95580000D01* 458 | %TO.C,L1*% 459 | X133015000Y-88690000D02* 460 | X133015000Y-89715000D01* 461 | X133015000Y-88690000D02* 462 | X134040000Y-88690000D01* 463 | X133015000Y-92910000D02* 464 | X133015000Y-91885000D01* 465 | X133015000Y-92910000D02* 466 | X134040000Y-92910000D01* 467 | X137785000Y-88690000D02* 468 | X136760000Y-88690000D01* 469 | X137785000Y-88690000D02* 470 | X137785000Y-89715000D01* 471 | X137785000Y-92910000D02* 472 | X136760000Y-92910000D01* 473 | X137785000Y-92910000D02* 474 | X137785000Y-91885000D01* 475 | %TO.C,C2*% 476 | X131640000Y-54027836D02* 477 | X131640000Y-53812164D01* 478 | X132360000Y-54027836D02* 479 | X132360000Y-53812164D01* 480 | %TO.C,R16*% 481 | X144960000Y-86553641D02* 482 | X144960000Y-86246359D01* 483 | X145720000Y-86553641D02* 484 | X145720000Y-86246359D01* 485 | %TO.C,Q1*% 486 | X138930000Y-82350000D02* 487 | X142530000Y-82350000D01* 488 | X138891522Y-82338478D02* 489 | G75* 490 | G02* 491 | X140730000Y-77899999I1838478J1838478D01* 492 | G01* 493 | X140730000Y-77900000D02* 494 | G75* 495 | G02* 496 | X142568478Y-82338478I0J-2600000D01* 497 | G01* 498 | %TO.C,R12*% 499 | X139420000Y-66553641D02* 500 | X139420000Y-66246359D01* 501 | X140180000Y-66553641D02* 502 | X140180000Y-66246359D01* 503 | %TO.C,C8*% 504 | X138440000Y-65292164D02* 505 | X138440000Y-65507836D01* 506 | X139160000Y-65292164D02* 507 | X139160000Y-65507836D01* 508 | %TO.C,R1*% 509 | X132820000Y-57446359D02* 510 | X132820000Y-57753641D01* 511 | X133580000Y-57446359D02* 512 | X133580000Y-57753641D01* 513 | %TO.C,R14*% 514 | X143493641Y-86420000D02* 515 | X143186359Y-86420000D01* 516 | X143493641Y-87180000D02* 517 | X143186359Y-87180000D01* 518 | %TO.C,Y1*% 519 | X136875000Y-64725000D02* 520 | X135525000Y-64725000D01* 521 | X136875000Y-66475000D02* 522 | X135525000Y-66475000D01* 523 | %TO.C,R7*% 524 | X146220000Y-74728641D02* 525 | X146220000Y-74421359D01* 526 | X146980000Y-74728641D02* 527 | X146980000Y-74421359D01* 528 | %TO.C,C9*% 529 | X139084420Y-82990000D02* 530 | X139365580Y-82990000D01* 531 | X139084420Y-84010000D02* 532 | X139365580Y-84010000D01* 533 | %TO.C,C5*% 534 | X139859420Y-91690000D02* 535 | X140140580Y-91690000D01* 536 | X139859420Y-92710000D02* 537 | X140140580Y-92710000D01* 538 | %TO.C,C15*% 539 | X145311252Y-91465000D02* 540 | X144788748Y-91465000D01* 541 | X145311252Y-92935000D02* 542 | X144788748Y-92935000D01* 543 | %TO.C,C6*% 544 | X146890000Y-102659420D02* 545 | X146890000Y-102940580D01* 546 | X147910000Y-102659420D02* 547 | X147910000Y-102940580D01* 548 | %TO.C,D8*% 549 | X135800000Y-95840000D02* 550 | X135800000Y-99850000D01* 551 | X137800000Y-95840000D02* 552 | X135800000Y-95840000D01* 553 | X137800000Y-95840000D02* 554 | X137800000Y-99850000D01* 555 | %TO.C,SW1*% 556 | X133800000Y-77800000D02* 557 | X133800000Y-82200000D01* 558 | X133800000Y-82200000D02* 559 | X133920000Y-82200000D01* 560 | X133920000Y-77800000D02* 561 | X133800000Y-77800000D01* 562 | X134930000Y-82200000D02* 563 | X136070000Y-82200000D01* 564 | X136070000Y-77800000D02* 565 | X134930000Y-77800000D01* 566 | X137080000Y-82200000D02* 567 | X137200000Y-82200000D01* 568 | X137200000Y-77800000D02* 569 | X137080000Y-77800000D01* 570 | X137200000Y-82200000D02* 571 | X137200000Y-77800000D01* 572 | %TO.C,C14*% 573 | X148507836Y-75215000D02* 574 | X148292164Y-75215000D01* 575 | X148507836Y-75935000D02* 576 | X148292164Y-75935000D01* 577 | %TO.C,R2*% 578 | X137046359Y-93620000D02* 579 | X137353641Y-93620000D01* 580 | X137046359Y-94380000D02* 581 | X137353641Y-94380000D01* 582 | %TO.C,D3*% 583 | X132410000Y-55390000D02* 584 | X131100000Y-55390000D01* 585 | X132410000Y-56610000D02* 586 | X131100000Y-56610000D01* 587 | X132410000Y-56610000D02* 588 | X132410000Y-55390000D01* 589 | %TO.C,R5*% 590 | X139336359Y-76620000D02* 591 | X139643641Y-76620000D01* 592 | X139336359Y-77380000D02* 593 | X139643641Y-77380000D01* 594 | %TO.C,U3*% 595 | X133740000Y-72200000D02* 596 | X133740000Y-70250000D01* 597 | X133740000Y-72200000D02* 598 | X133740000Y-74150000D01* 599 | X143860000Y-72200000D02* 600 | X143860000Y-70250000D01* 601 | X143860000Y-72200000D02* 602 | X143860000Y-74150000D01* 603 | X133795000Y-74925000D02* 604 | X133465000Y-75165000D01* 605 | X133465000Y-74685000D01* 606 | X133795000Y-74925000D01* 607 | G36* 608 | X133795000Y-74925000D02* 609 | G01* 610 | X133465000Y-75165000D01* 611 | X133465000Y-74685000D01* 612 | X133795000Y-74925000D01* 613 | G37* 614 | %TO.C,R4*% 615 | X136046359Y-67020000D02* 616 | X136353641Y-67020000D01* 617 | X136046359Y-67780000D02* 618 | X136353641Y-67780000D01* 619 | D12* 620 | %TO.C,J2*% 621 | X135930000Y-104550000D02* 622 | X135930000Y-105800000D01* 623 | X135930000Y-108520000D02* 624 | X135930000Y-109800000D01* 625 | X135930000Y-109800000D02* 626 | X145510000Y-109800000D01* 627 | X145510000Y-104550000D02* 628 | X145510000Y-105800000D01* 629 | X145510000Y-109800000D02* 630 | X145510000Y-108520000D01* 631 | %TD*% 632 | M02* 633 | -------------------------------------------------------------------------------- /hardware/crimpdeq/production/gerber/crimpdeq-NPTH.drl: -------------------------------------------------------------------------------- 1 | M48 2 | ; DRILL file {KiCad 9.0.1} date 2025-04-24T12:07:01+0200 3 | ; FORMAT={-:-/ absolute / metric / decimal} 4 | ; #@! TF.CreationDate,2025-04-24T12:07:01+02:00 5 | ; #@! TF.GenerationSoftware,Kicad,Pcbnew,9.0.1 6 | ; #@! TF.FileFunction,NonPlated,1,2,NPTH 7 | FMAT,2 8 | METRIC 9 | ; #@! TA.AperFunction,NonPlated,NPTH,ComponentDrill 10 | T1C0.650 11 | % 12 | G90 13 | G05 14 | T1 15 | X137.83Y-103.52 16 | X143.61Y-103.52 17 | M30 18 | -------------------------------------------------------------------------------- /hardware/crimpdeq/production/gerber/crimpdeq-PTH.drl: -------------------------------------------------------------------------------- 1 | M48 2 | ; DRILL file {KiCad 9.0.1} date 2025-04-24T12:07:01+0200 3 | ; FORMAT={-:-/ absolute / metric / decimal} 4 | ; #@! TF.CreationDate,2025-04-24T12:07:01+02:00 5 | ; #@! TF.GenerationSoftware,Kicad,Pcbnew,9.0.1 6 | ; #@! TF.FileFunction,Plated,1,2,PTH 7 | FMAT,2 8 | METRIC 9 | ; #@! TA.AperFunction,Plated,PTH,ViaDrill 10 | T1C0.300 11 | ; #@! TA.AperFunction,Plated,PTH,ComponentDrill 12 | T2C0.600 13 | ; #@! TA.AperFunction,Plated,PTH,ComponentDrill 14 | T3C0.750 15 | ; #@! TA.AperFunction,Plated,PTH,ComponentDrill 16 | T4C0.762 17 | % 18 | G90 19 | G05 20 | T1 21 | X130.2Y-52.0 22 | X130.2Y-56.0 23 | X130.2Y-57.0 24 | X130.6Y-74.8 25 | X130.6Y-78.2 26 | X131.0Y-72.6 27 | X131.2Y-52.0 28 | X132.2Y-52.0 29 | X132.2Y-99.8 30 | X132.2Y-102.0 31 | X132.8Y-65.4 32 | X133.0Y-67.6 33 | X133.0Y-71.0 34 | X133.0Y-73.2 35 | X133.0Y-95.6 36 | X133.2Y-62.8 37 | X133.2Y-64.0 38 | X133.4Y-52.0 39 | X133.8Y-93.6 40 | X134.2Y-67.6 41 | X134.4Y-76.6 42 | X134.4Y-102.8 43 | X134.4Y-103.8 44 | X134.934Y-98.354 45 | X135.0Y-100.6 46 | X135.6Y-72.0 47 | X135.6Y-76.6 48 | X135.6Y-93.6 49 | X135.8Y-101.2 50 | X136.0Y-54.8 51 | X136.0Y-55.6 52 | X136.0Y-56.4 53 | X136.0Y-57.2 54 | X136.0Y-58.0 55 | X136.6Y-61.4 56 | X136.8Y-54.8 57 | X136.8Y-101.2 58 | X137.0Y-58.6 59 | X137.6Y-54.8 60 | X137.8Y-67.8 61 | X138.2Y-86.2 62 | X138.2Y-87.6 63 | X138.4Y-54.8 64 | X138.6Y-67.8 65 | X138.8Y-62.0 66 | X138.8Y-66.8 67 | X138.8Y-97.6 68 | X139.2Y-54.8 69 | X139.4Y-72.8 70 | X139.6Y-68.2 71 | X139.8Y-57.4 72 | X139.8Y-59.4 73 | X140.0Y-54.8 74 | X140.2Y-98.2 75 | X140.267Y-95.067 76 | X140.6Y-84.6 77 | X140.8Y-54.8 78 | X140.8Y-65.8 79 | X140.8Y-71.8 80 | X141.0Y-87.6 81 | X141.2Y-86.2 82 | X141.6Y-54.8 83 | X141.6Y-89.0 84 | X141.8Y-57.4 85 | X141.8Y-59.4 86 | X141.8Y-98.4 87 | X142.0Y-91.2 88 | X142.093Y-76.237 89 | X142.4Y-54.8 90 | X142.4Y-96.4 91 | X142.6Y-93.2 92 | X142.8Y-66.4 93 | X143.186Y-96.551 94 | X143.2Y-54.8 95 | X143.206Y-92.206 96 | X143.4Y-98.6 97 | X143.533Y-97.667 98 | X143.6Y-66.4 99 | X143.667Y-99.933 100 | X143.8Y-77.0 101 | X143.8Y-101.0 102 | X144.0Y-54.8 103 | X144.2Y-85.8 104 | X144.377Y-68.781 105 | X144.6Y-84.0 106 | X144.8Y-54.8 107 | X144.8Y-76.4 108 | X144.95Y-101.2 109 | X145.0Y-66.0 110 | X145.2Y-58.6 111 | X145.2Y-60.4 112 | X145.2Y-61.8 113 | X145.6Y-54.8 114 | X145.6Y-83.6 115 | X146.0Y-66.4 116 | X146.4Y-85.8 117 | X146.556Y-96.334 118 | X146.6Y-69.4 119 | X146.6Y-71.0 120 | X146.6Y-72.8 121 | X147.0Y-66.4 122 | X147.4Y-72.0 123 | X147.8Y-73.4 124 | X147.8Y-91.4 125 | X147.8Y-96.915 126 | X148.0Y-66.4 127 | X148.0Y-99.6 128 | X148.0Y-105.0 129 | X148.4Y-52.8 130 | X148.4Y-54.0 131 | X148.4Y-55.4 132 | X148.4Y-71.6 133 | X148.404Y-78.6 134 | X148.6Y-59.4 135 | X148.6Y-60.4 136 | X148.8Y-66.4 137 | X148.8Y-76.8 138 | X148.8Y-89.4 139 | X148.8Y-91.8 140 | X148.8Y-93.2 141 | X148.906Y-73.312 142 | X148.982Y-77.579 143 | X149.0Y-105.0 144 | X149.292Y-88.692 145 | X149.4Y-52.8 146 | X149.6Y-66.4 147 | X149.6Y-71.6 148 | X149.8Y-61.2 149 | X149.8Y-97.8 150 | X150.054Y-74.089 151 | X150.4Y-52.8 152 | X150.4Y-78.0 153 | X150.4Y-79.6 154 | X150.4Y-81.2 155 | X150.8Y-61.2 156 | X151.2Y-98.2 157 | X151.4Y-50.6 158 | X151.4Y-51.8 159 | X151.4Y-53.2 160 | X151.4Y-54.4 161 | T3 162 | X139.46Y-80.5 163 | X140.73Y-80.5 164 | X142.0Y-80.5 165 | T4 166 | X130.66Y-58.685 167 | X130.66Y-65.185 168 | X130.66Y-68.185 169 | X131.16Y-62.185 170 | X131.16Y-70.685 171 | X150.66Y-56.185 172 | X150.66Y-58.685 173 | X150.66Y-65.185 174 | X150.66Y-67.685 175 | X150.66Y-70.185 176 | X150.66Y-72.685 177 | X150.66Y-83.685 178 | X150.66Y-86.185 179 | X150.66Y-93.185 180 | X150.66Y-95.685 181 | X150.82Y-100.185 182 | X150.82Y-102.45 183 | T2 184 | X136.4Y-102.47G85X136.4Y-103.57 185 | G05 186 | X136.4Y-106.8G85X136.4Y-107.6 187 | G05 188 | X145.04Y-102.47G85X145.04Y-103.57 189 | G05 190 | X145.04Y-106.8G85X145.04Y-107.6 191 | G05 192 | M30 193 | -------------------------------------------------------------------------------- /hardware/crimpdeq/production/gerber/crimpdeq-job.gbrjob: -------------------------------------------------------------------------------- 1 | { 2 | "Header": { 3 | "GenerationSoftware": { 4 | "Vendor": "KiCad", 5 | "Application": "Pcbnew", 6 | "Version": "9.0.1" 7 | }, 8 | "CreationDate": "2025-04-24T12:06:56+02:00" 9 | }, 10 | "GeneralSpecs": { 11 | "ProjectId": { 12 | "Name": "crimpdeq", 13 | "GUID": "6372696d-7064-4657-912e-6b696361645f", 14 | "Revision": "rev?" 15 | }, 16 | "Size": { 17 | "X": 23.05, 18 | "Y": 63.85 19 | }, 20 | "LayerNumber": 2, 21 | "BoardThickness": 1.6, 22 | "Finish": "None" 23 | }, 24 | "DesignRules": [ 25 | { 26 | "Layers": "Outer", 27 | "PadToPad": 0.2, 28 | "PadToTrack": 0.2, 29 | "TrackToTrack": 0.2, 30 | "MinLineWidth": 0.1524, 31 | "TrackToRegion": 0.5, 32 | "RegionToRegion": 0.5 33 | } 34 | ], 35 | "FilesAttributes": [ 36 | { 37 | "Path": "crimpdeq-F_Cu.gbr", 38 | "FileFunction": "Copper,L1,Top", 39 | "FilePolarity": "Positive" 40 | }, 41 | { 42 | "Path": "crimpdeq-B_Cu.gbr", 43 | "FileFunction": "Copper,L2,Bot", 44 | "FilePolarity": "Positive" 45 | }, 46 | { 47 | "Path": "crimpdeq-F_Paste.gbr", 48 | "FileFunction": "SolderPaste,Top", 49 | "FilePolarity": "Positive" 50 | }, 51 | { 52 | "Path": "crimpdeq-B_Paste.gbr", 53 | "FileFunction": "SolderPaste,Bot", 54 | "FilePolarity": "Positive" 55 | }, 56 | { 57 | "Path": "crimpdeq-F_Silkscreen.gbr", 58 | "FileFunction": "Legend,Top", 59 | "FilePolarity": "Positive" 60 | }, 61 | { 62 | "Path": "crimpdeq-B_Silkscreen.gbr", 63 | "FileFunction": "Legend,Bot", 64 | "FilePolarity": "Positive" 65 | }, 66 | { 67 | "Path": "crimpdeq-F_Mask.gbr", 68 | "FileFunction": "SolderMask,Top", 69 | "FilePolarity": "Negative" 70 | }, 71 | { 72 | "Path": "crimpdeq-B_Mask.gbr", 73 | "FileFunction": "SolderMask,Bot", 74 | "FilePolarity": "Negative" 75 | }, 76 | { 77 | "Path": "crimpdeq-Edge_Cuts.gbr", 78 | "FileFunction": "Profile", 79 | "FilePolarity": "Positive" 80 | } 81 | ], 82 | "MaterialStackup": [ 83 | { 84 | "Type": "Legend", 85 | "Name": "Top Silk Screen" 86 | }, 87 | { 88 | "Type": "SolderPaste", 89 | "Name": "Top Solder Paste" 90 | }, 91 | { 92 | "Type": "SolderMask", 93 | "Thickness": 0.01, 94 | "Name": "Top Solder Mask" 95 | }, 96 | { 97 | "Type": "Copper", 98 | "Thickness": 0.035, 99 | "Name": "F.Cu" 100 | }, 101 | { 102 | "Type": "Dielectric", 103 | "Thickness": 1.51, 104 | "Material": "FR4", 105 | "Name": "F.Cu/B.Cu", 106 | "Notes": "Type: dielectric layer 1 (from F.Cu to B.Cu)" 107 | }, 108 | { 109 | "Type": "Copper", 110 | "Thickness": 0.035, 111 | "Name": "B.Cu" 112 | }, 113 | { 114 | "Type": "SolderMask", 115 | "Thickness": 0.01, 116 | "Name": "Bottom Solder Mask" 117 | }, 118 | { 119 | "Type": "SolderPaste", 120 | "Name": "Bottom Solder Paste" 121 | }, 122 | { 123 | "Type": "Legend", 124 | "Name": "Bottom Silk Screen" 125 | } 126 | ] 127 | } 128 | -------------------------------------------------------------------------------- /hardware/crimpdeq/production/netlist.ipc: -------------------------------------------------------------------------------- 1 | P CODE 00 2 | P UNITS CUST 0 3 | P arrayDim N 4 | 317GND VIA MD0118PA00X+059606Y-020945X0236Y0000R000S3 5 | 317GND VIA MD0118PA00X+054173Y-021575X0236Y0000R000S3 6 | 317GND VIA MD0118PA00X+058661Y-041339X0236Y0000R000S3 7 | 317GND VIA MD0118PA00X+051417Y-029449X0236Y0000R000S3 8 | 317GND VIA MD0118PA00X+058425Y-021811X0236Y0000R000S3 9 | 317GND VIA MD0118PA00X+052047Y-039291X0236Y0000R000S3 10 | 317GND VIA MD0118PA00X+058583Y-036693X0236Y0000R000S3 11 | 317GND VIA MD0118PA00X+059606Y-019921X0236Y0000R000S3 12 | 317GND VIA MD0118PA00X+057638Y-033780X0236Y0000R000S3 13 | 317GND VIA MD0118PA00X+056378Y-021575X0236Y0000R000S3 14 | 317GND VIA MD0118PA00X+056614Y-030315X0236Y0000R000S3 15 | 317GND VIA MD0118PA00X+058189Y-035984X0236Y0000R000S3 16 | 317GND VIA MD0118PA00X+055827Y-038740X0236Y0000R000S3 17 | 317GND VIA MD0118PA00X+055039Y-023386X0236Y0000R000S3 18 | 317GND VIA MD0118PA00X+055118Y-021575X0236Y0000R000S3 19 | 317GND VIA MD0118PA00X+059213Y-020787X0236Y0000R000S3 20 | 317GND VIA MD0118PA00X+051417Y-030787X0236Y0000R000S3 21 | 317GND VIA MD0118PA00X+058583Y-036142X0236Y0000R000S3 22 | 317GND VIA MD0118PA00X+054646Y-024409X0236Y0000R000S3 23 | 317GND VIA MD0118PA00X+052047Y-020472X0236Y0000R000S3 24 | 317GND VIA MD0118PA00X+057480Y-026142X0236Y0000R000S3 25 | 317GND VIA MD0118PA00X+055827Y-022598X0236Y0000R000S3 26 | 317GND VIA MD0118PA00X+058268Y-041339X0236Y0000R000S3 27 | 317GND VIA MD0118PA00X+055223Y-037428X0236Y0000R000S3 28 | 317GND VIA MD0118PA00X+059606Y-021417X0236Y0000R000S3 29 | 317GND VIA MD0118PA00X+057165Y-023780X0236Y0000R000S3 30 | 317GND VIA MD0118PA00X+054252Y-026693X0236Y0000R000S3 31 | 317GND VIA MD0118PA00X+054409Y-034488X0236Y0000R000S3 32 | 317GND VIA MD0118PA00X+055039Y-022598X0236Y0000R000S3 33 | 317GND VIA MD0118PA00X+054488Y-021575X0236Y0000R000S3 34 | 317GND VIA MD0118PA00X+053543Y-021575X0236Y0000R000S3 35 | 317GND VIA MD0118PA00X+053543Y-022835X0236Y0000R000S3 36 | 317GND VIA MD0118PA00X+058583Y-030236X0236Y0000R000S3 37 | 317GND VIA MD0118PA00X+056220Y-026142X0236Y0000R000S3 38 | 317GND VIA MD0118PA00X+055354Y-033307X0236Y0000R000S3 39 | 317GND VIA MD0118PA00X+056063Y-021575X0236Y0000R000S3 40 | 317GND VIA MD0118PA00X+058425Y-020787X0236Y0000R000S3 41 | 317GND VIA MD0118PA00X+059606Y-020394X0236Y0000R000S3 42 | 317GND VIA MD0118PA00X+057165Y-024331X0236Y0000R000S3 43 | 317GND VIA MD0118PA00X+051654Y-020472X0236Y0000R000S3 44 | 317GND VIA MD0118PA00X+056535Y-026142X0236Y0000R000S3 45 | 317GND VIA MD0118PA00X+058268Y-039213X0236Y0000R000S3 46 | 317GND VIA MD0118PA00X+052677Y-036850X0236Y0000R000S3 47 | 317GND VIA MD0118PA00X+057717Y-027953X0236Y0000R000S3 48 | 317GND VIA MD0118PA00X+059528Y-038661X0236Y0000R000S3 49 | 317GND VIA MD0118PA00X+057323Y-021575X0236Y0000R000S3 50 | 317GND VIA MD0118PA00X+056929Y-033071X0236Y0000R000S3 51 | 317GND VIA MD0118PA00X+055748Y-035039X0236Y0000R000S3 52 | 317GND VIA MD0118PA00X+053780Y-024173X0236Y0000R000S3 53 | 317GND VIA MD0118PA00X+052362Y-026614X0236Y0000R000S3 54 | 317GND VIA MD0118PA00X+052047Y-040157X0236Y0000R000S3 55 | 317GND VIA MD0118PA00X+055433Y-021575X0236Y0000R000S3 56 | 317GND VIA MD0118PA00X+054882Y-028661X0236Y0000R000S3 57 | 317GND VIA MD0118PA00X+059213Y-031339X0236Y0000R000S3 58 | 317GND VIA MD0118PA00X+056562Y-039344X0236Y0000R000S3 59 | 317GND VIA MD0118PA00X+055827Y-023386X0236Y0000R000S3 60 | 317GND VIA MD0118PA00X+057717Y-027323X0236Y0000R000S3 61 | 317GND VIA MD0118PA00X+051260Y-022441X0236Y0000R000S3 62 | 317GND VIA MD0118PA00X+052913Y-040472X0236Y0000R000S3 63 | 317GND VIA MD0118PA00X+052362Y-027953X0236Y0000R000S3 64 | 317GND VIA MD0118PA00X+051260Y-020472X0236Y0000R000S3 65 | 317GND VIA MD0118PA00X+055906Y-035906X0236Y0000R000S3 66 | 317GND VIA MD0118PA00X+051575Y-028583X0236Y0000R000S3 67 | 317GND VIA MD0118PA00X+054803Y-021575X0236Y0000R000S3 68 | 317GND VIA MD0118PA00X+053858Y-021575X0236Y0000R000S3 69 | 317GND VIA MD0118PA00X+052913Y-040866X0236Y0000R000S3 70 | 317GND VIA MD0118PA00X+053386Y-036850X0236Y0000R000S3 71 | 317GND VIA MD0118PA00X+059370Y-024094X0236Y0000R000S3 72 | 317GND VIA MD0118PA00X+055512Y-034488X0236Y0000R000S3 73 | 317GND VIA MD0118PA00X+055433Y-025906X0236Y0000R000S3 74 | 317GND VIA MD0118PA00X+055748Y-021575X0236Y0000R000S3 75 | 317GND VIA MD0118PA00X+057165Y-023071X0236Y0000R000S3 76 | 317GND VIA MD0118PA00X+057008Y-021575X0236Y0000R000S3 77 | 317GND VIA MD0118PA00X+056772Y-033780X0236Y0000R000S3 78 | 317GND VIA MD0118PA00X+058268Y-026142X0236Y0000R000S3 79 | 317GND VIA MD0118PA00X+058976Y-024094X0236Y0000R000S3 80 | 317GND VIA MD0118PA00X+053543Y-022205X0236Y0000R000S3 81 | 317GND VIA MD0118PA00X+054646Y-026299X0236Y0000R000S3 82 | 317GND VIA MD0118PA00X+053858Y-039843X0236Y0000R000S3 83 | 317GND VIA MD0118PA00X+052520Y-020472X0236Y0000R000S3 84 | 317GND VIA MD0118PA00X+052362Y-028819X0236Y0000R000S3 85 | 317GND VIA MD0118PA00X+059213Y-030709X0236Y0000R000S3 86 | 317GND VIA MD0118PA00X+058504Y-023386X0236Y0000R000S3 87 | 317GND VIA MD0118PA00X+057323Y-032913X0236Y0000R000S3 88 | 317GND VIA MD0118PA00X+053543Y-022520X0236Y0000R000S3 89 | 317GND VIA MD0118PA00X+053937Y-023071X0236Y0000R000S3 90 | 317GND VIA MD0118PA00X+052441Y-024724X0236Y0000R000S3 91 | 317GND VIA MD0118PA00X+056380Y-036301X0236Y0000R000S3 92 | 317GND VIA MD0118PA00X+056693Y-021575X0236Y0000R000S3 93 | 317GND VIA MD0118PA00X+055591Y-033937X0236Y0000R000S3 94 | 317GND VIA MD0118PA00X+054409Y-033937X0236Y0000R000S3 95 | 317GND VIA MD0118PA00X+052913Y-030157X0236Y0000R000S3 96 | 317GND VIA MD0118PA00X+055433Y-028268X0236Y0000R000S3 97 | 317GND VIA MD0118PA00X+058504Y-023780X0236Y0000R000S3 98 | 317GND VIA MD0118PA00X+058425Y-021260X0236Y0000R000S3 99 | 317GND VIA MD0118PA00X+058819Y-020787X0236Y0000R000S3 100 | 317GND VIA MD0118PA00X+056841Y-027079X0236Y0000R000S3 101 | 317GND VIA MD0118PA00X+059213Y-031969X0236Y0000R000S3 102 | 317GND VIA MD0118PA00X+053543Y-021890X0236Y0000R000S3 103 | 317GND VIA MD0118PA00X+052283Y-025748X0236Y0000R000S3 104 | 317GND VIA MD0118PA00X+053465Y-039843X0236Y0000R000S3 105 | 317GND VIA MD0118PA00X+051260Y-022047X0236Y0000R000S3 106 | 317GND VIA MD0118PA00X+057067Y-039843X0236Y0000R000S3 107 | 317GND VIA MD0118PA00X+057874Y-026142X0236Y0000R000S3 108 | 317+3V3 VIA MD0118PA00X+058189Y-028898X0236Y0000R000S3 109 | 317+3V3 VIA MD0118PA00X+052835Y-026614X0236Y0000R000S3 110 | 317+3V3 VIA MD0118PA00X+053386Y-030157X0236Y0000R000S3 111 | 317VBUS VIA MD0118PA00X+056142Y-036693X0236Y0000R000S3 112 | 317VBUS VIA MD0118PA00X+054646Y-038425X0236Y0000R000S3 113 | 317VBUS VIA MD0118PA00X+058189Y-038156X0236Y0000R000S3 114 | 317+BATT VIA MD0118PA00X+057008Y-030079X0236Y0000R000S3 115 | 317+BATT VIA MD0118PA00X+055197Y-038661X0236Y0000R000S3 116 | 317+BATT VIA MD0118PA00X+056063Y-037953X0236Y0000R000S3 117 | 317+BATT VIA MD0118PA00X+053124Y-038722X0236Y0000R000S3 118 | 317+BATT VIA MD0118PA00X+054567Y-026693X0236Y0000R000S3 119 | 317+BATT VIA MD0118PA00X+055942Y-030014X0236Y0000R000S3 120 | 317+BATT VIA MD0118PA00X+056457Y-038819X0236Y0000R000S3 121 | 317+BATT VIA MD0118PA00X+052362Y-037638X0236Y0000R000S3 122 | 317E+ VIA MD0118PA00X+053386Y-028346X0236Y0000R000S3 123 | 317IO9_BOOT VIA MD0118PA00X+057087Y-025984X0236Y0000R000S3 124 | 317IO9_BOOT VIA MD0118PA00X+058031Y-028346X0236Y0000R000S3 125 | 317USB_D- VIA MD0118PA00X+058625Y-028863X0236Y0000R000S3 126 | 317USB_D- VIA MD0118PA00X+057699Y-037927X0236Y0000R000S3 127 | 317USB_D- VIA MD0118PA00X+058654Y-030543X0236Y0000R000S3 128 | 317USB_D- VIA MD0118PA00X+058425Y-028189X0236Y0000R000S3 129 | 317USB_D- VIA MD0118PA00X+056372Y-038012X0236Y0000R000S3 130 | 317USB_D- VIA MD0118PA00X+058583Y-026142X0236Y0000R000S3 131 | 317USB_D- VIA MD0118PA00X+058776Y-034918X0236Y0000R000S3 132 | 317NET-(D8-A) VIA MD0118PA00X+053150Y-039606X0236Y0000R000S3 133 | 317NET-(D8-A) VIA MD0118PA00X+056614Y-039764X0236Y0000R000S3 134 | 317USB_D+ VIA MD0118PA00X+058583Y-035197X0236Y0000R000S3 135 | 317USB_D+ VIA MD0118PA00X+058427Y-030945X0236Y0000R000S3 136 | 317USB_D+ VIA MD0118PA00X+059076Y-029169X0236Y0000R000S3 137 | 317USB_D+ VIA MD0118PA00X+058976Y-038504X0236Y0000R000S3 138 | 317USB_D+ VIA MD0118PA00X+056509Y-038452X0236Y0000R000S3 139 | 317USB_D+ VIA MD0118PA00X+058898Y-028189X0236Y0000R000S3 140 | 317USB_D+ VIA MD0118PA00X+058898Y-026142X0236Y0000R000S3 141 | 317A+ VIA MD0118PA00X+057717Y-028661X0236Y0000R000S3 142 | 317IO1_ADC VIA MD0118PA00X+052441Y-025197X0236Y0000R000S3 143 | 317IO4_DATA VIA MD0118PA00X+054961Y-026850X0236Y0000R000S3 144 | 327NET-(U3-INA-) R8 -1 A01X+058339Y-027638X0213Y0252R000S2 145 | 327A- R8 -2 A01X+058740Y-027638X0213Y0252R000S2 146 | 327USB_D+ D10 -1 A01X+055512Y-039685X0236Y0276R090S2 147 | 327GND D10 -2 A01X+055512Y-039134X0236Y0276R090S2 148 | 327+3V3 C17 -1 A01X+052618Y-034331X0394Y0571R000S2 149 | 327GND C17 -2 A01X+053366Y-034331X0394Y0571R000S2 150 | 327NET-(D1-K) D1 -1 A01X+052913Y-037328X0344Y0374R090S2 151 | 327VBUS D1 -2 A01X+052913Y-037948X0344Y0374R090S2 152 | 327IO0 C7 -1 A01X+052598Y-025937X0220Y0244R270S2 153 | 327GND C7 -2 A01X+052598Y-025559X0220Y0244R270S2 154 | 327NET-(D8-A) D9 -1 A01X+056220Y-039724X0236Y0276R090S2 155 | 327GND D9 -2 A01X+056220Y-039173X0236Y0276R090S2 156 | 327ENABLE U6 -1 A01X+056476Y-034724X0522Y0236R000S2 157 | 327GND U6 -2 A01X+056476Y-035098X0522Y0236R000S2 158 | 327/BUCK_COIL U6 -3 A01X+056476Y-035472X0522Y0236R000S2 159 | 327+5V U6 -4 A01X+057372Y-035472X0522Y0236R000S2 160 | 327NET-(U6-FB) U6 -5 A01X+057372Y-034724X0522Y0236R000S2 161 | 327USB_D- D7 -1 A01X+054803Y-039685X0236Y0276R090S2 162 | 327GND D7 -2 A01X+054803Y-039134X0236Y0276R090S2 163 | 327+3V3 C16 -1 A01X+058130Y-034724X0354Y0374R090S2 164 | 327NET-(U6-FB) C16 -2 A01X+058130Y-035335X0354Y0374R090S2 165 | 327E+ C10 -1 A01X+055797Y-032874X0354Y0374R000S2 166 | 327GND C10 -2 A01X+056407Y-032874X0354Y0374R000S2 167 | 327NET-(U3-VFB) R6 -1 A01X+055783Y-030315X0213Y0252R000S2 168 | 327GND R6 -2 A01X+056185Y-030315X0213Y0252R000S2 169 | 327GND C11 -1 A01X+057165Y-027559X0354Y0374R090S2 170 | 327NET-(U3-VBG) C11 -2 A01X+057165Y-028169X0354Y0374R090S2 171 | 327NET-(J2-CC1) R19 -1 A01X+053071Y-041295X0213Y0252R090S2 172 | 327GND R19 -2 A01X+053071Y-041697X0213Y0252R090S2 173 | 327NET-(U3-INA+) C12 -1 A01X+057165Y-029429X0354Y0374R270S2 174 | 327NET-(U3-INA-) C12 -2 A01X+057165Y-028819X0354Y0374R270S2 175 | 327CHIP_PU C3 -1 A01X+052441Y-023276X0220Y0244R090S2 176 | 327GND C3 -2 A01X+052441Y-023654X0220Y0244R090S2 177 | 327IO1_ADC R11 -1 A01X+055075Y-025512X0213Y0252R000S2 178 | 327GND R11 -2 A01X+055476Y-025512X0213Y0252R000S2 179 | 327VBUS Q2 -1 A01X+057795Y-038686X0581Y0236R090S2 180 | 327+5V Q2 -2 A01X+057047Y-038686X0581Y0236R090S2 181 | 327+BATT Q2 -3 A01X+057421Y-039424X0581Y0236R090S2 182 | 327IO9_BOOT SW2 -1 A01X+057057Y-032313X0413Y0256R270S2 183 | 327IO9_BOOT SW2 -1 A01X+057057Y-030679X0413Y0256R270S2 184 | 327GND SW2 -2 A01X+057904Y-032313X0413Y0256R270S2 185 | 327GND SW2 -2 A01X+057904Y-030679X0413Y0256R270S2 186 | 327+3V3 C1 -1 A01X+052441Y-021417X0220Y0244R270S2 187 | 327GND C1 -2 A01X+052441Y-021039X0220Y0244R270S2 188 | 327+3V3 C4 -1 A01X+051496Y-021417X0220Y0244R270S2 189 | 327GND C4 -2 A01X+051496Y-021039X0220Y0244R270S2 190 | 327+3V3 R15 -1 A01X+058217Y-034173X0213Y0252R180S2 191 | 327NET-(U6-FB) R15 -2 A01X+057815Y-034173X0213Y0252R180S2 192 | 327+5V D2 -1 A01X+057815Y-037323X0354Y0472R180S2 193 | 327VBUS D2 -2 A01X+056516Y-037323X0354Y0472R180S2 194 | 327NET-(U2-STAT) U2 -1 A01X+054843Y-037904X0522Y0236R270S2 195 | 327GND U2 -2 A01X+055217Y-037904X0522Y0236R270S2 196 | 327+BATT U2 -3 A01X+055591Y-037904X0522Y0236R270S2 197 | 327VBUS U2 -4 A01X+055591Y-037008X0522Y0236R270S2 198 | 327NET-(U2-PROG) U2 -5 A01X+054843Y-037008X0522Y0236R270S2 199 | 327VBUS R9 -1 A01X+058504Y-038461X0213Y0252R090S2 200 | 327GND R9 -2 A01X+058504Y-038862X0213Y0252R090S2 201 | 327+3V3 R10 -1 A01X+058626Y-029281X0213Y0252R180S2 202 | 327IO9_BOOT R10 -2 A01X+058224Y-029281X0213Y0252R180S2 203 | 327NET-(J2-CC2) R18 -1 A01X+057717Y-041531X0213Y0252R090S2 204 | 327GND R18 -2 A01X+057717Y-041933X0213Y0252R090S2 205 | 327ELL_GND-PADS1) R17 -1 A01X+053071Y-042528X0213Y0252R270S2 206 | 327GND R17 -2 A01X+053071Y-042126X0213Y0252R270S2 207 | 327GND U1 -1 A01X+053110Y-021417X0157Y0315R270S2 208 | 327GND U1 -2 A01X+053110Y-021732X0157Y0315R270S2 209 | 327+3V3 U1 -3 A01X+053110Y-022047X0157Y0315R270S2 210 | 327D-(U1-NC-PAD4) U1 -4 A01X+053110Y-022362X0157Y0315R270S2 211 | 327ADC1_CH2-PAD5) U1 -5 A01X+053110Y-022677X0157Y0315R270S2 212 | 327ADC1_CH3-PAD6) U1 -6 A01X+053110Y-022992X0157Y0315R270S2 213 | 327D-(U1-NC-PAD7) U1 -7 A01X+053110Y-023307X0157Y0315R270S2 214 | 327CHIP_PU U1 -8 A01X+053110Y-023622X0157Y0315R270S2 215 | 327D-(U1-NC-PAD9) U1 -9 A01X+053110Y-023937X0157Y0315R270S2 216 | 327-(U1-NC-PAD10) U1 -10 A01X+053110Y-024252X0157Y0315R270S2 217 | 327GND U1 -11 A01X+053110Y-024567X0157Y0315R270S2 218 | 327L_32K_P-PAD12) U1 -12 A01X+053543Y-024921X0157Y0315R000S2 219 | 327IO1_ADC U1 -13 A01X+053858Y-024921X0157Y0315R000S2 220 | 327GND U1 -14 A01X+054173Y-024921X0157Y0315R000S2 221 | 327-(U1-NC-PAD15) U1 -15 A01X+054488Y-024921X0157Y0315R000S2 222 | 327-GPIO10-PAD16) U1 -16 A01X+054803Y-024921X0157Y0315R000S2 223 | 327-(U1-NC-PAD17) U1 -17 A01X+055118Y-024921X0157Y0315R000S2 224 | 327IO4_DATA U1 -18 A01X+055433Y-024921X0157Y0315R000S2 225 | 327IO5_SCK U1 -19 A01X+055748Y-024921X0157Y0315R000S2 226 | 3271-GPIO6-PAD20) U1 -20 A01X+056063Y-024921X0157Y0315R000S2 227 | 3271-GPIO7-PAD21) U1 -21 A01X+056378Y-024921X0157Y0315R000S2 228 | 3271-GPIO8-PAD22) U1 -22 A01X+056693Y-024921X0157Y0315R000S2 229 | 327IO9_BOOT U1 -23 A01X+057008Y-024921X0157Y0315R000S2 230 | 327-(U1-NC-PAD24) U1 -24 A01X+057323Y-024921X0157Y0315R000S2 231 | 327-(U1-NC-PAD25) U1 -25 A01X+057756Y-024567X0157Y0315R270S2 232 | 327USB_D- U1 -26 A01X+057756Y-024252X0157Y0315R270S2 233 | 327USB_D+ U1 -27 A01X+057756Y-023937X0157Y0315R270S2 234 | 327-(U1-NC-PAD28) U1 -28 A01X+057756Y-023622X0157Y0315R270S2 235 | 327-(U1-NC-PAD29) U1 -29 A01X+057756Y-023307X0157Y0315R270S2 236 | 327IO20_RX U1 -30 A01X+057756Y-022992X0157Y0315R270S2 237 | 327IO21_TX U1 -31 A01X+057756Y-022677X0157Y0315R270S2 238 | 327-(U1-NC-PAD32) U1 -32 A01X+057756Y-022362X0157Y0315R270S2 239 | 327-(U1-NC-PAD33) U1 -33 A01X+057756Y-022047X0157Y0315R270S2 240 | 327-(U1-NC-PAD34) U1 -34 A01X+057756Y-021732X0157Y0315R270S2 241 | 327-(U1-NC-PAD35) U1 -35 A01X+057756Y-021417X0157Y0315R270S2 242 | 327GND U1 -36 A01X+057323Y-021063X0157Y0315R000S2 243 | 327N/C U1 -37 A01X+057008Y-021063X0157Y0315R000S2 244 | 327N/C U1 -38 A01X+056693Y-021063X0157Y0315R000S2 245 | 327N/C U1 -39 A01X+056378Y-021063X0157Y0315R000S2 246 | 327N/C U1 -40 A01X+056063Y-021063X0157Y0315R000S2 247 | 327N/C U1 -41 A01X+055748Y-021063X0157Y0315R000S2 248 | 327N/C U1 -42 A01X+055433Y-021063X0157Y0315R000S2 249 | 327N/C U1 -43 A01X+055118Y-021063X0157Y0315R000S2 250 | 327N/C U1 -44 A01X+054803Y-021063X0157Y0315R000S2 251 | 327N/C U1 -45 A01X+054488Y-021063X0157Y0315R000S2 252 | 327N/C U1 -46 A01X+054173Y-021063X0157Y0315R000S2 253 | 327N/C U1 -47 A01X+053858Y-021063X0157Y0315R000S2 254 | 327N/C U1 -48 A01X+053543Y-021063X0157Y0315R000S2 255 | 327GND U1 -49 A01X+054656Y-022215X0315Y0315R000S2 256 | 327GND U1 -49 A01X+054656Y-022992X0571Y0571R270S2 257 | 327GND U1 -49 A01X+054656Y-023770X0571Y0571R270S2 258 | 327GND U1 -49 A01X+055433Y-022215X0571Y0571R270S2 259 | 327GND U1 -49 A01X+055433Y-022992X0571Y0571R270S2 260 | 327GND U1 -49 A01X+055433Y-023770X0571Y0571R270S2 261 | 327GND U1 -49 A01X+056211Y-022215X0571Y0571R270S2 262 | 327GND U1 -49 A01X+056211Y-022992X0571Y0571R270S2 263 | 327GND U1 -49 A01X+056211Y-023770X0571Y0571R270S2 264 | 327N/C U1 -50 A01X+057776Y-021043X0276Y0276R270S2 265 | 327N/C U1 -51 A01X+057776Y-024941X0276Y0276R270S2 266 | 327N/C U1 -52 A01X+053091Y-024941X0276Y0276R270S2 267 | 327N/C U1 -53 A01X+053091Y-021043X0276Y0276R270S2 268 | 327NET-(U2-STAT) R3 -1 A01X+054181Y-037480X0213Y0252R180S2 269 | 327NET-(D1-K) R3 -2 A01X+053780Y-037480X0213Y0252R180S2 270 | 327/BUCK_COIL L1 -1 A01X+053907Y-035748X0591Y1417R180S2 271 | 327+3V3 L1 -2 A01X+052707Y-035748X0591Y1417R180S2 272 | 327+3V3 C2 -1 A01X+051969Y-021417X0220Y0244R270S2 273 | 327GND C2 -2 A01X+051969Y-021039X0220Y0244R270S2 274 | 327NET-(U6-FB) R16 -1 A01X+057220Y-034217X0213Y0252R270S2 275 | 327GND R16 -2 A01X+057220Y-033815X0213Y0252R270S2 276 | 317+3V3 Q1 -1 D0295PA00X+054906Y-031693X0413Y0591R000S0 277 | 317NET-(Q1-B) Q1 -2 D0295PA00X+055406Y-031693X0413Y0591R000S0 278 | 317E+ Q1 -3 D0295PA00X+055906Y-031693X0413Y0591R000S0 279 | 327+BATT R12 -1 A01X+055039Y-026343X0213Y0252R270S2 280 | 327IO1_ADC R12 -2 A01X+055039Y-025941X0213Y0252R270S2 281 | 327IO1 C8 -1 A01X+054646Y-025559X0220Y0244R090S2 282 | 327GND C8 -2 A01X+054646Y-025937X0220Y0244R090S2 283 | 327+3V3 R1 -1 A01X+052441Y-022476X0213Y0252R090S2 284 | 327CHIP_PU R1 -2 A01X+052441Y-022878X0213Y0252R090S2 285 | 327+5V R14 -1 A01X+056634Y-034173X0213Y0252R180S2 286 | 327ENABLE R14 -2 A01X+056232Y-034173X0213Y0252R180S2 287 | 327IO0 Y1 -1 A01X+053130Y-025827X0394Y0709R180S2 288 | 327IO1 Y1 -2 A01X+054114Y-025827X0394Y0709R180S2 289 | 327NET-(U3-INA+) R7 -1 A01X+057717Y-029561X0213Y0252R270S2 290 | 327A+ R7 -2 A01X+057717Y-029159X0213Y0252R270S2 291 | 327+3V3 C9 -1 A01X+054508Y-032874X0354Y0374R000S2 292 | 327GND C9 -2 A01X+055118Y-032874X0354Y0374R000S2 293 | 327GND C5 -1 A01X+054813Y-036299X0354Y0374R000S2 294 | 327VBUS C5 -2 A01X+055423Y-036299X0354Y0374R000S2 295 | 327+5V C15 -1 A01X+057480Y-036299X0394Y0571R180S2 296 | 327GND C15 -2 A01X+056732Y-036299X0394Y0571R180S2 297 | 327+BATT C6 -1 A01X+058031Y-040167X0354Y0374R090S2 298 | 327GND C6 -2 A01X+058031Y-040778X0354Y0374R090S2 299 | 327VBUS D8 -1 A01X+053858Y-038012X0354Y0472R090S2 300 | 327NET-(D8-A) D8 -2 A01X+053858Y-039311X0354Y0472R090S2 301 | 327CHIP_PU SW1 -1 A01X+052923Y-032313X0413Y0256R270S2 302 | 327CHIP_PU SW1 -1 A01X+052923Y-030679X0413Y0256R270S2 303 | 327GND SW1 -2 A01X+053770Y-032313X0413Y0256R270S2 304 | 327GND SW1 -2 A01X+053770Y-030679X0413Y0256R270S2 305 | 327GND C14 -1 A01X+058614Y-029754X0220Y0244R180S2 306 | 327IO9_BOOT C14 -2 A01X+058236Y-029754X0220Y0244R180S2 307 | 327GND R2 -1 A01X+053815Y-037008X0213Y0252R000S2 308 | 327NET-(U2-PROG) R2 -2 A01X+054217Y-037008X0213Y0252R000S2 309 | 317+3V3 U4 -1 D0300PA00X+051441Y-023104X0600Y0600R000S0 310 | 317GND U4 -2 D0300PA00X+051638Y-024482X0600Y0600R000S0 311 | 317IO1_ADC U4 -3 D0300PA00X+051441Y-025663X0600Y0000R000S0 312 | 317IO4_DATA U4 -4 D0300PA00X+059315Y-025663X0600Y0000R000S0 313 | 317IO5_SCK U4 -5 D0300PA00X+059315Y-026648X0600Y0000R000S0 314 | 317IO21_TX U4 -6 D0300PA00X+059315Y-022120X0600Y0000R000S0 315 | 317IO20_RX U4 -7 D0300PA00X+059315Y-023104X0600Y0000R000S0 316 | 317USB_D- U4 -8 D0300PA00X+059315Y-036687X0600Y0000R000S0 317 | 317USB_D+ U4 -9 D0300PA00X+059315Y-037671X0600Y0000R000S0 318 | 317VBUS U4 -10 D0300PA00X+059315Y-033931X0600Y0600R000S0 319 | 317+BATT U4 -11 D0300PA00X+059315Y-032947X0600Y0600R000S0 320 | 317A+ U4 -12 D0300PA00X+059315Y-028616X0600Y0000R000S0 321 | 317A- U4 -13 D0300PA00X+059315Y-027632X0600Y0000R000S0 322 | 317GND U4 -14 D0300PA00X+051638Y-027829X0600Y0600R000S0 323 | 317E+ U4 -15 D0300PA00X+051441Y-026844X0600Y0000R000S0 324 | 317GND U4 -16 D0300PA00X+059378Y-040335X0500Y0500R270S0 325 | 317+BATT U4 -17 D0300PA00X+059378Y-039443X0500Y0500R270S0 326 | 327+3V3 D3 -1 A01X+051949Y-022047X0157Y0276R180S2 327 | 327GND D3 -2 A01X+051673Y-022047X0157Y0276R180S2 328 | 327E+ R5 -1 A01X+054717Y-030315X0213Y0252R000S2 329 | 327NET-(U3-VFB) R5 -2 A01X+055118Y-030315X0213Y0252R000S2 330 | 327+3V3 U3 -1 A01X+052896Y-029409X0787Y0236R270S2 331 | 327NET-(Q1-B) U3 -2 A01X+053396Y-029409X0787Y0236R270S2 332 | 327E+ U3 -3 A01X+053896Y-029409X0787Y0236R270S2 333 | 327NET-(U3-VFB) U3 -4 A01X+054396Y-029409X0787Y0236R270S2 334 | 327GND U3 -5 A01X+054896Y-029409X0787Y0236R270S2 335 | 327NET-(U3-VBG) U3 -6 A01X+055396Y-029409X0787Y0236R270S2 336 | 327NET-(U3-INA-) U3 -7 A01X+055896Y-029409X0787Y0236R270S2 337 | 327NET-(U3-INA+) U3 -8 A01X+056396Y-029409X0787Y0236R270S2 338 | 327GND U3 -9 A01X+056396Y-027441X0787Y0236R270S2 339 | 327GND U3 -10 A01X+055896Y-027441X0787Y0236R270S2 340 | 327IO5_SCK U3 -11 A01X+055396Y-027441X0787Y0236R270S2 341 | 327IO4_DATA U3 -12 A01X+054896Y-027441X0787Y0236R270S2 342 | 327-(U3-XO-PAD13) U3 -13 A01X+054396Y-027441X0787Y0236R270S2 343 | 327GND U3 -14 A01X+053896Y-027441X0787Y0236R270S2 344 | 327+3V3 U3 -15 A01X+053396Y-027441X0787Y0236R270S2 345 | 327+3V3 U3 -16 A01X+052896Y-027441X0787Y0236R270S2 346 | 327IO0 R4 -1 A01X+053421Y-026535X0213Y0252R000S2 347 | 327IO1 R4 -2 A01X+053823Y-026535X0213Y0252R000S2 348 | 367N/C J2 D0256UA00X+054264Y-040756X0256Y0000R000S0 349 | 367N/C J2 D0256UA00X+056539Y-040756X0256Y0000R000S0 350 | 327GND J2 -A1_B A01X+054142Y-040333X0236Y0453R000S2 351 | 327NET-(D8-A) J2 -A4_B A01X+054457Y-040333X0236Y0453R000S2 352 | 327NET-(J2-CC1) J2 -A5 A01X+054909Y-040333X0118Y0453R000S2 353 | 327USB_D+ J2 -A6 A01X+055303Y-040333X0118Y0453R000S2 354 | 327USB_D- J2 -A7 A01X+055500Y-040333X0118Y0453R000S2 355 | 327J2-SBU1-PADA8) J2 -A8 A01X+055894Y-040333X0118Y0453R000S2 356 | 327GND J2 -B1_A A01X+056661Y-040333X0236Y0453R000S2 357 | 327NET-(D8-A) J2 -B4_A A01X+056346Y-040333X0236Y0453R000S2 358 | 327NET-(J2-CC2) J2 -B5 A01X+056091Y-040333X0118Y0453R000S2 359 | 327USB_D+ J2 -B6 A01X+055697Y-040333X0118Y0453R000S2 360 | 327USB_D- J2 -B7 A01X+055106Y-040333X0118Y0453R000S2 361 | 327J2-SBU2-PADB8) J2 -B8 A01X+054713Y-040333X0118Y0453R000S2 362 | 317ELL_GND-PADS1) J2 -S1 D0236PA00X+053701Y-040559X0413Y0827R000S0 363 | 317ELL_GND-PADS1) J2 -S2 D0236PA00X+053701Y-042205X0394Y0787R000S0 364 | 317ELL_GND-PADS1) J2 -S3 D0236PA00X+057102Y-042205X0394Y0787R000S0 365 | 317ELL_GND-PADS1) J2 -S4 D0236PA00X+057102Y-040559X0413Y0827R000S0 366 | 999 367 | -------------------------------------------------------------------------------- /hardware/crimpdeq/schematic.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crimpdeq/crimpdeq-firmware/acdc8f839fa5189ffc05e1d28622c75b35d902b0/hardware/crimpdeq/schematic.pdf -------------------------------------------------------------------------------- /hardware/libraries/B5819W/B5819W.kicad_sym: -------------------------------------------------------------------------------- 1 | 2 | (kicad_symbol_lib (version 20211014) (generator kicad_symbol_editor) 3 | (symbol "B5819W" (pin_names (offset 1.016)) (in_bom yes) (on_board yes) 4 | (property "Reference" "D" (id 0) (at 2.54 0.4826 0) 5 | (effects (font (size 1.27 1.27)) (justify bottom left)) 6 | ) 7 | (property "Value" "B5819W" (id 1) (at 2.54 -2.3114 0) 8 | (effects (font (size 1.27 1.27)) (justify bottom left)) 9 | ) 10 | (property "Footprint" "B5819W:SOD-123" (id 2) (at 0 0 0) 11 | (effects (font (size 1.27 1.27)) (justify bottom) hide) 12 | ) 13 | (property "MF" "MDD" (id 4) (at 0 0 0) 14 | (effects (font (size 1.27 1.27)) (justify bottom) hide) 15 | ) 16 | (property "Description" "\n \n Diode Schottky 40 V 1.5A Surface Mount SOD-123FL\n \n" (id 5) (at 0 0 0) 17 | (effects (font (size 1.27 1.27)) (justify bottom) hide) 18 | ) 19 | (property "Package" "None" (id 6) (at 0 0 0) 20 | (effects (font (size 1.27 1.27)) (justify bottom) hide) 21 | ) 22 | (property "Price" "None" (id 7) (at 0 0 0) 23 | (effects (font (size 1.27 1.27)) (justify bottom) hide) 24 | ) 25 | (property "SnapEDA_Link" "https://www.snapeda.com/parts/B5819W/MDD/view-part/?ref=snap" (id 8) (at 0 0 0) 26 | (effects (font (size 1.27 1.27)) (justify bottom) hide) 27 | ) 28 | (property "MP" "B5819W" (id 9) (at 0 0 0) 29 | (effects (font (size 1.27 1.27)) (justify bottom) hide) 30 | ) 31 | (property "Availability" "In Stock" (id 10) (at 0 0 0) 32 | (effects (font (size 1.27 1.27)) (justify bottom) hide) 33 | ) 34 | (property "Check_prices" "https://www.snapeda.com/parts/B5819W/MDD/view-part/?ref=eda" (id 11) (at 0 0 0) 35 | (effects (font (size 1.27 1.27)) (justify bottom) hide) 36 | ) 37 | (symbol "B5819W_0_0" 38 | (polyline 39 | (pts (xy -1.27 -1.27) (xy 1.27 0.0)) (stroke (width 0.254)) 40 | ) 41 | (polyline 42 | (pts (xy 1.27 0.0) (xy -1.27 1.27)) (stroke (width 0.254)) 43 | ) 44 | (polyline 45 | (pts (xy 1.27 1.27) (xy 1.27 0.0)) (stroke (width 0.254)) 46 | ) 47 | (polyline 48 | (pts (xy -1.27 1.27) (xy -1.27 0.0)) (stroke (width 0.254)) 49 | ) 50 | (polyline 51 | (pts (xy -1.27 0.0) (xy -1.27 -1.27)) (stroke (width 0.254)) 52 | ) 53 | (polyline 54 | (pts (xy 1.27 0.0) (xy 1.27 -1.27)) (stroke (width 0.254)) 55 | ) 56 | (polyline 57 | (pts (xy 1.27 1.27) (xy 1.778 1.524)) (stroke (width 0.254)) 58 | ) 59 | (polyline 60 | (pts (xy 1.27 -1.27) (xy 0.762 -1.524)) (stroke (width 0.254)) 61 | ) 62 | (polyline 63 | (pts (xy -2.54 0.0) (xy -1.27 0.0)) (stroke (width 0.1524)) 64 | ) 65 | (polyline 66 | (pts (xy 2.54 0.0) (xy 1.27 0.0)) (stroke (width 0.1524)) 67 | ) 68 | (pin passive line (at -2.54 0.0 0) (length 0) 69 | (name "~" 70 | (effects (font (size 1.016 1.016))) 71 | ) 72 | (number "A" 73 | (effects (font (size 1.016 1.016))) 74 | ) 75 | ) 76 | (pin passive line (at 2.54 0.0 180.0) (length 0) 77 | (name "~" 78 | (effects (font (size 1.016 1.016))) 79 | ) 80 | (number "C" 81 | (effects (font (size 1.016 1.016))) 82 | ) 83 | ) 84 | ) 85 | ) 86 | ) -------------------------------------------------------------------------------- /hardware/libraries/B5819W/SOD-123.kicad_mod: -------------------------------------------------------------------------------- 1 | 2 | (footprint SOD-123 (layer F.Cu) (tedit 679408B2) 3 | (descr "") 4 | (attr smd) 5 | (fp_text reference REF** (at 2.075 -1.635 0) (layer F.SilkS) 6 | (effects (font (size 1.0 1.0) (thickness 0.15))) 7 | ) 8 | (fp_text value SOD-123 (at 3.345 1.665 0) (layer F.Fab) 9 | (effects (font (size 1.0 1.0) (thickness 0.15))) 10 | ) 11 | (pad C smd rect (at -1.9 0.0) (size 1.4 1.4) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102)) 12 | (pad A smd rect (at 1.9 0.0) (size 1.4 1.4) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102)) 13 | (fp_line (start -1.1 -0.7) (end 1.1 -0.7) (layer F.Fab) (width 0.254)) 14 | (fp_line (start 1.1 -0.7) (end 1.1 0.7) (layer F.Fab) (width 0.254)) 15 | (fp_line (start 1.1 0.7) (end -1.1 0.7) (layer F.Fab) (width 0.254)) 16 | (fp_line (start -1.1 0.7) (end -1.1 -0.7) (layer F.Fab) (width 0.254)) 17 | (fp_poly 18 | (pts 19 | (xy -1.95 -0.4) 20 | (xy -1.2 -0.4) 21 | (xy -1.2 0.45) 22 | (xy -1.95 0.45) 23 | ) (layer F.Fab) (width 0.01) 24 | ) 25 | (fp_poly 26 | (pts 27 | (xy 1.2 -0.4) 28 | (xy 1.95 -0.4) 29 | (xy 1.95 0.45) 30 | (xy 1.2 0.45) 31 | ) (layer F.Fab) (width 0.01) 32 | ) 33 | (fp_poly 34 | (pts 35 | (xy -1.05 -0.7) 36 | (xy -0.15 -0.7) 37 | (xy -0.15 0.65) 38 | (xy -1.05 0.65) 39 | ) (layer F.Fab) (width 0.01) 40 | ) 41 | (fp_line (start -0.635 -0.635) (end -0.635 0.635) (layer Dwgs.User) (width 0.3048)) 42 | ) -------------------------------------------------------------------------------- /hardware/libraries/B5819W/how-to-import.htm: -------------------------------------------------------------------------------- 1 | Page Redirection If you are not redirected automatically, follow this link to the import guide. -------------------------------------------------------------------------------- /hardware/libraries/DMG3415U-7/DMG3415U-7.kicad_sym: -------------------------------------------------------------------------------- 1 | 2 | (kicad_symbol_lib (version 20211014) (generator kicad_symbol_editor) 3 | (symbol "DMG3415U-7" (pin_names (offset 1.016)) (in_bom yes) (on_board yes) 4 | (property "Reference" "U" (id 0) (at -5.36565 9.12924 0.0) 5 | (effects (font (size 1.27 1.27)) (justify bottom left)) 6 | ) 7 | (property "Value" "DMG3415U-7" (id 1) (at -4.04139 -15.3268 0.0) 8 | (effects (font (size 1.27 1.27)) (justify bottom left)) 9 | ) 10 | (property "Footprint" "DMG3415U-7:SOT95P240X105-3N" (id 2) (at 0 0 0) 11 | (effects (font (size 1.27 1.27)) (justify bottom) hide) 12 | ) 13 | (property "MF" "Diodes Inc." (id 4) (at 0 0 0) 14 | (effects (font (size 1.27 1.27)) (justify bottom) hide) 15 | ) 16 | (property "Description" "\n \n MOSFET P-Channel 20V 4A SOT23 | Diodes Inc DMG3415U-7\n \n" (id 5) (at 0 0 0) 17 | (effects (font (size 1.27 1.27)) (justify bottom) hide) 18 | ) 19 | (property "PACKAGE" "SOT-23-3" (id 6) (at 0 0 0) 20 | (effects (font (size 1.27 1.27)) (justify bottom) hide) 21 | ) 22 | (property "MPN" "DMG3415U-7" (id 7) (at 0 0 0) 23 | (effects (font (size 1.27 1.27)) (justify bottom) hide) 24 | ) 25 | (property "Price" "None" (id 8) (at 0 0 0) 26 | (effects (font (size 1.27 1.27)) (justify bottom) hide) 27 | ) 28 | (property "Package" "SOT-23 Diodes Inc." (id 9) (at 0 0 0) 29 | (effects (font (size 1.27 1.27)) (justify bottom) hide) 30 | ) 31 | (property "OC_FARNELL" "1843688" (id 10) (at 0 0 0) 32 | (effects (font (size 1.27 1.27)) (justify bottom) hide) 33 | ) 34 | (property "SnapEDA_Link" "https://www.snapeda.com/parts/DMG3415U-7/Diodes+Inc./view-part/?ref=snap" (id 11) (at 0 0 0) 35 | (effects (font (size 1.27 1.27)) (justify bottom) hide) 36 | ) 37 | (property "MP" "DMG3415U-7" (id 12) (at 0 0 0) 38 | (effects (font (size 1.27 1.27)) (justify bottom) hide) 39 | ) 40 | (property "SUPPLIER" "Diodes Inc" (id 13) (at 0 0 0) 41 | (effects (font (size 1.27 1.27)) (justify bottom) hide) 42 | ) 43 | (property "OC_NEWARK" "12T2026" (id 14) (at 0 0 0) 44 | (effects (font (size 1.27 1.27)) (justify bottom) hide) 45 | ) 46 | (property "Availability" "In Stock" (id 15) (at 0 0 0) 47 | (effects (font (size 1.27 1.27)) (justify bottom) hide) 48 | ) 49 | (property "Check_prices" "https://www.snapeda.com/parts/DMG3415U-7/Diodes+Inc./view-part/?ref=eda" (id 16) (at 0 0 0) 50 | (effects (font (size 1.27 1.27)) (justify bottom) hide) 51 | ) 52 | (symbol "DMG3415U-7_0_0" 53 | (rectangle (start -12.7 -10.16) (end 12.7 5.08) 54 | (stroke (width 0.4064)) (fill (type background)) 55 | ) 56 | (pin passive line (at -17.78 0.0 0) (length 5.08) 57 | (name "S" 58 | (effects (font (size 1.016 1.016))) 59 | ) 60 | (number "2" 61 | (effects (font (size 1.016 1.016))) 62 | ) 63 | ) 64 | (pin power_in line (at -17.78 -5.08 0) (length 5.08) 65 | (name "G" 66 | (effects (font (size 1.016 1.016))) 67 | ) 68 | (number "1" 69 | (effects (font (size 1.016 1.016))) 70 | ) 71 | ) 72 | (pin output line (at 17.78 0.0 180.0) (length 5.08) 73 | (name "D" 74 | (effects (font (size 1.016 1.016))) 75 | ) 76 | (number "3" 77 | (effects (font (size 1.016 1.016))) 78 | ) 79 | ) 80 | ) 81 | ) 82 | ) -------------------------------------------------------------------------------- /hardware/libraries/DMG3415U-7/SOT95P240X105-3N.kicad_mod: -------------------------------------------------------------------------------- 1 | 2 | (footprint SOT95P240X105-3N (layer F.Cu) (tedit 67940EAD) 3 | (descr "") 4 | (attr smd) 5 | (fp_text reference REF** (at 1.753325 -3.582895 0) (layer F.SilkS) 6 | (effects (font (size 1.64068503937 1.64068503937) (thickness 0.15))) 7 | ) 8 | (fp_text value SOT95P240X105-3N (at 13.23241 3.409895 0) (layer F.Fab) 9 | (effects (font (size 1.64303149606 1.64303149606) (thickness 0.15))) 10 | ) 11 | (pad 1 smd rect (at -1.016 -0.9652) (size 1.3208 0.5588) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102)) 12 | (pad 2 smd rect (at -1.016 0.9652) (size 1.3208 0.5588) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102)) 13 | (pad 3 smd rect (at 1.016 0.0) (size 1.3208 0.5588) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102)) 14 | (fp_line (start 0.7112 -0.6096) (end 0.7112 -1.4986) (layer F.SilkS) (width 0.1524)) 15 | (fp_line (start -0.1524 1.4986) (end 0.7112 1.4986) (layer F.SilkS) (width 0.1524)) 16 | (fp_line (start 0.7112 1.4986) (end 0.7112 0.6096) (layer F.SilkS) (width 0.1524)) 17 | (fp_line (start 0.7112 -1.4986) (end 0.3048 -1.4986) (layer F.SilkS) (width 0.1524)) 18 | (fp_line (start 0.3048 -1.4986) (end -0.1524 -1.4986) (layer F.SilkS) (width 0.1524)) 19 | (fp_arc (start 5.11290797447e-05 -1.49748627683) (end -0.0254 -1.1938) (angle -95.0) (layer F.SilkS) (width 0.1524)) 20 | (fp_line (start -0.7112 1.4986) (end 0.7112 1.4986) (layer F.Fab) (width 0.0)) 21 | (fp_line (start 0.7112 1.4986) (end 0.7112 0.254) (layer F.Fab) (width 0.0)) 22 | (fp_line (start 0.7112 0.254) (end 0.7112 -0.254) (layer F.Fab) (width 0.0)) 23 | (fp_line (start 0.7112 -0.254) (end 0.7112 -1.4986) (layer F.Fab) (width 0.0)) 24 | (fp_line (start 0.7112 -1.4986) (end 0.3048 -1.4986) (layer F.Fab) (width 0.0)) 25 | (fp_line (start 0.3048 -1.4986) (end -0.3048 -1.4986) (layer F.Fab) (width 0.0)) 26 | (fp_line (start -0.3048 -1.4986) (end -0.7112 -1.4986) (layer F.Fab) (width 0.0)) 27 | (fp_line (start -0.7112 -1.4986) (end -0.7112 -1.2192) (layer F.Fab) (width 0.0)) 28 | (fp_line (start -0.7112 -1.2192) (end -0.7112 -0.7112) (layer F.Fab) (width 0.0)) 29 | (fp_line (start -0.7112 -0.7112) (end -0.7112 0.7112) (layer F.Fab) (width 0.0)) 30 | (fp_line (start -0.7112 -1.2192) (end -1.2446 -1.2192) (layer F.Fab) (width 0.0)) 31 | (fp_line (start -1.2446 -1.2192) (end -1.2446 -0.7112) (layer F.Fab) (width 0.0)) 32 | (fp_line (start -1.2446 -0.7112) (end -0.7112 -0.7112) (layer F.Fab) (width 0.0)) 33 | (fp_line (start -0.7112 1.4986) (end -0.7112 1.2192) (layer F.Fab) (width 0.0)) 34 | (fp_line (start -0.7112 1.2192) (end -0.7112 0.7112) (layer F.Fab) (width 0.0)) 35 | (fp_line (start -0.7112 0.7112) (end -1.2446 0.7112) (layer F.Fab) (width 0.0)) 36 | (fp_line (start -1.2446 0.7112) (end -1.2446 1.2192) (layer F.Fab) (width 0.0)) 37 | (fp_line (start -1.2446 1.2192) (end -0.7112 1.2192) (layer F.Fab) (width 0.0)) 38 | (fp_line (start 0.7112 0.254) (end 1.2446 0.254) (layer F.Fab) (width 0.0)) 39 | (fp_line (start 1.2446 0.254) (end 1.2446 -0.254) (layer F.Fab) (width 0.0)) 40 | (fp_line (start 1.2446 -0.254) (end 0.7112 -0.254) (layer F.Fab) (width 0.0)) 41 | (fp_arc (start 0.0 -1.4986) (end -0.3048 -1.4986) (angle -180.0) (layer F.Fab) (width 0.0)) 42 | ) -------------------------------------------------------------------------------- /hardware/libraries/DMG3415U-7/how-to-import.htm: -------------------------------------------------------------------------------- 1 | Page Redirection If you are not redirected automatically, follow this link to the import guide. -------------------------------------------------------------------------------- /hardware/libraries/LESD5D5.0CT1G/LESD5D5.0CT1G.kicad_sym: -------------------------------------------------------------------------------- 1 | 2 | (kicad_symbol_lib (version 20211014) (generator kicad_symbol_editor) 3 | (symbol "LESD5D5.0CT1G" (pin_names (offset 1.016)) (in_bom yes) (on_board yes) 4 | (property "Reference" "D" (id 0) (at -5.08 2.54 0) 5 | (effects (font (size 1.27 1.27)) (justify bottom left)) 6 | ) 7 | (property "Value" "LESD5D5.0CT1G" (id 1) (at -5.08 -5.08 0) 8 | (effects (font (size 1.27 1.27)) (justify bottom left)) 9 | ) 10 | (property "Footprint" "LESD5D5.0CT1G:TVS_LESD5D5.0CT1G" (id 2) (at 0 0 0) 11 | (effects (font (size 1.27 1.27)) (justify bottom) hide) 12 | ) 13 | (property "MF" "Leshan Radio Co." (id 4) (at 0 0 0) 14 | (effects (font (size 1.27 1.27)) (justify bottom) hide) 15 | ) 16 | (property "MAXIMUM_PACKAGE_HEIGHT" "0.7 mm" (id 5) (at 0 0 0) 17 | (effects (font (size 1.27 1.27)) (justify bottom) hide) 18 | ) 19 | (property "Package" "None" (id 6) (at 0 0 0) 20 | (effects (font (size 1.27 1.27)) (justify bottom) hide) 21 | ) 22 | (property "Price" "None" (id 7) (at 0 0 0) 23 | (effects (font (size 1.27 1.27)) (justify bottom) hide) 24 | ) 25 | (property "Check_prices" "https://www.snapeda.com/parts/LESD5D5.0CT1G/Leshan+Radio/view-part/?ref=eda" (id 8) (at 0 0 0) 26 | (effects (font (size 1.27 1.27)) (justify bottom) hide) 27 | ) 28 | (property "STANDARD" "Manufacturer Recommendations" (id 9) (at 0 0 0) 29 | (effects (font (size 1.27 1.27)) (justify bottom) hide) 30 | ) 31 | (property "PARTREV" "O" (id 10) (at 0 0 0) 32 | (effects (font (size 1.27 1.27)) (justify bottom) hide) 33 | ) 34 | (property "SnapEDA_Link" "https://www.snapeda.com/parts/LESD5D5.0CT1G/Leshan+Radio/view-part/?ref=snap" (id 11) (at 0 0 0) 35 | (effects (font (size 1.27 1.27)) (justify bottom) hide) 36 | ) 37 | (property "MP" "LESD5D5.0CT1G" (id 12) (at 0 0 0) 38 | (effects (font (size 1.27 1.27)) (justify bottom) hide) 39 | ) 40 | (property "Description" "\n \n Transient Voltage Suppressors for ESD Protection\n \n" (id 13) (at 0 0 0) 41 | (effects (font (size 1.27 1.27)) (justify bottom) hide) 42 | ) 43 | (property "Availability" "In Stock" (id 14) (at 0 0 0) 44 | (effects (font (size 1.27 1.27)) (justify bottom) hide) 45 | ) 46 | (property "MANUFACTURER" "LRC" (id 15) (at 0 0 0) 47 | (effects (font (size 1.27 1.27)) (justify bottom) hide) 48 | ) 49 | (symbol "LESD5D5.0CT1G_0_0" 50 | (polyline 51 | (pts 52 | (xy 0.0 0.0) 53 | (xy -1.27 -0.762) 54 | (xy -1.27 0.762) 55 | (xy 0.0 0.0) 56 | ) 57 | (stroke (width 0.1524)) (fill (type outline)) 58 | ) 59 | (polyline 60 | (pts (xy 0.0 -0.762) (xy 0.0 0.762)) (stroke (width 0.1524)) 61 | ) 62 | (polyline 63 | (pts 64 | (xy 0.0 0.0) 65 | (xy 1.27 0.762) 66 | (xy 1.27 -0.762) 67 | (xy 0.0 0.0) 68 | ) 69 | (stroke (width 0.1524)) (fill (type outline)) 70 | ) 71 | (polyline 72 | (pts (xy 0.0 -0.762) (xy -0.254 -1.016)) (stroke (width 0.1524)) 73 | ) 74 | (polyline 75 | (pts (xy 0.0 0.762) (xy 0.254 1.016)) (stroke (width 0.1524)) 76 | ) 77 | (polyline 78 | (pts (xy 1.27 0.0) (xy 2.54 0.0)) (stroke (width 0.1524)) 79 | ) 80 | (polyline 81 | (pts (xy -1.27 0.0) (xy -2.54 0.0)) (stroke (width 0.1524)) 82 | ) 83 | (pin passive line (at -5.08 0.0 0) (length 2.54) 84 | (name "~" 85 | (effects (font (size 1.016 1.016))) 86 | ) 87 | (number "1" 88 | (effects (font (size 1.016 1.016))) 89 | ) 90 | ) 91 | (pin passive line (at 5.08 0.0 180.0) (length 2.54) 92 | (name "~" 93 | (effects (font (size 1.016 1.016))) 94 | ) 95 | (number "2" 96 | (effects (font (size 1.016 1.016))) 97 | ) 98 | ) 99 | ) 100 | ) 101 | ) -------------------------------------------------------------------------------- /hardware/libraries/LESD5D5.0CT1G/TVS_LESD5D5.0CT1G.kicad_mod: -------------------------------------------------------------------------------- 1 | 2 | (footprint TVS_LESD5D5.0CT1G (layer F.Cu) (tedit 67940932) 3 | (descr "") 4 | (attr smd) 5 | (fp_text reference REF** (at -0.134 -0.9532 0) (layer F.SilkS) 6 | (effects (font (size 0.32 0.32) (thickness 0.15))) 7 | ) 8 | (fp_text value TVS_LESD5D5.0CT1G (at 2.3044 1.0532 0) (layer F.Fab) 9 | (effects (font (size 0.32 0.32) (thickness 0.15))) 10 | ) 11 | (pad 1 smd rect (at -0.66 0.0) (size 0.48 0.4) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102)) 12 | (pad 2 smd rect (at 0.66 0.0) (size 0.48 0.4) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102)) 13 | (fp_line (start -0.6 -0.4) (end 0.6 -0.4) (layer F.Fab) (width 0.127)) 14 | (fp_line (start 0.6 -0.4) (end 0.6 0.4) (layer F.Fab) (width 0.127)) 15 | (fp_line (start 0.6 0.4) (end -0.6 0.4) (layer F.Fab) (width 0.127)) 16 | (fp_line (start -0.6 0.4) (end -0.6 -0.4) (layer F.Fab) (width 0.127)) 17 | (fp_line (start -1.15 -0.65) (end -1.15 0.65) (layer F.CrtYd) (width 0.05)) 18 | (fp_line (start -1.15 0.65) (end 1.15 0.65) (layer F.CrtYd) (width 0.05)) 19 | (fp_line (start 1.15 0.65) (end 1.15 -0.65) (layer F.CrtYd) (width 0.05)) 20 | (fp_line (start 1.15 -0.65) (end -1.15 -0.65) (layer F.CrtYd) (width 0.05)) 21 | (fp_circle (center -1.5 0.0) (end -1.4 0.0) (layer F.SilkS) (width 0.2)) 22 | (fp_circle (center -1.5 0.0) (end -1.4 0.0) (layer F.Fab) (width 0.2)) 23 | (fp_line (start -0.6 -0.52) (end 0.6 -0.52) (layer F.SilkS) (width 0.127)) 24 | (fp_line (start 0.6 0.52) (end -0.6 0.52) (layer F.SilkS) (width 0.127)) 25 | ) -------------------------------------------------------------------------------- /hardware/libraries/LESD5D5.0CT1G/how-to-import.htm: -------------------------------------------------------------------------------- 1 | Page Redirection If you are not redirected automatically, follow this link to the import guide. -------------------------------------------------------------------------------- /hardware/libraries/USB4105-GF-A/GCT_USB4105-GF-A.kicad_mod: -------------------------------------------------------------------------------- 1 | 2 | (footprint GCT_USB4105-GF-A (layer F.Cu) (tedit 67940708) 3 | (descr "") 4 | (attr smd) 5 | (fp_text reference REF** (at -1.825 -8.635 0) (layer F.SilkS) 6 | (effects (font (size 1.0 1.0) (thickness 0.15))) 7 | ) 8 | (fp_text value GCT_USB4105-GF-A (at 5.16 -7.135 0) (layer F.Fab) 9 | (effects (font (size 1.0 1.0) (thickness 0.15))) 10 | ) 11 | (pad SH3 thru_hole oval (at -4.32 0.0) (size 1.0 1.8) (drill oval 0.6 1.4) (layers *.Cu *.Mask) (solder_mask_margin 0.102)) 12 | (pad SH4 thru_hole oval (at 4.32 0.0) (size 1.0 1.8) (drill oval 0.6 1.4) (layers *.Cu *.Mask) (solder_mask_margin 0.102)) 13 | (pad SH1 thru_hole oval (at -4.32 -4.18) (size 1.0 2.1) (drill oval 0.6 1.7) (layers *.Cu *.Mask) (solder_mask_margin 0.102)) 14 | (pad SH2 thru_hole oval (at 4.32 -4.18) (size 1.0 2.1) (drill oval 0.6 1.7) (layers *.Cu *.Mask) (solder_mask_margin 0.102)) 15 | (pad None np_thru_hole circle (at 2.89 -3.68) (size 0.65 0.65) (drill 0.65) (layers *.Cu *.Mask)) 16 | (pad None np_thru_hole circle (at -2.89 -3.68) (size 0.65 0.65) (drill 0.65) (layers *.Cu *.Mask)) 17 | (pad A1_B12 smd rect (at -3.2 -4.755) (size 0.6 1.15) (layers F.Cu F.Paste)) 18 | (pad B1_A12 smd rect (at 3.2 -4.755) (size 0.6 1.15) (layers F.Cu F.Paste)) 19 | (pad A4_B9 smd rect (at -2.4 -4.755) (size 0.6 1.15) (layers F.Cu F.Paste)) 20 | (pad B4_A9 smd rect (at 2.4 -4.755) (size 0.6 1.15) (layers F.Cu F.Paste)) 21 | (pad A7 smd rect (at 0.25 -4.755) (size 0.3 1.15) (layers F.Cu F.Paste)) 22 | (pad A6 smd rect (at -0.25 -4.755) (size 0.3 1.15) (layers F.Cu F.Paste)) 23 | (pad B6 smd rect (at 0.75 -4.755) (size 0.3 1.15) (layers F.Cu F.Paste)) 24 | (pad A8 smd rect (at 1.25 -4.755) (size 0.3 1.15) (layers F.Cu F.Paste)) 25 | (pad B5 smd rect (at 1.75 -4.755) (size 0.3 1.15) (layers F.Cu F.Paste)) 26 | (pad B7 smd rect (at -0.75 -4.755) (size 0.3 1.15) (layers F.Cu F.Paste)) 27 | (pad A5 smd rect (at -1.25 -4.755) (size 0.3 1.15) (layers F.Cu F.Paste)) 28 | (pad B8 smd rect (at -1.75 -4.755) (size 0.3 1.15) (layers F.Cu F.Paste)) 29 | (fp_line (start -4.47 -4.75) (end 4.47 -4.75) (layer F.Fab) (width 0.1)) 30 | (fp_line (start 4.47 -4.75) (end 4.47 2.6) (layer F.Fab) (width 0.1)) 31 | (fp_line (start 4.47 2.6) (end -4.47 2.6) (layer F.Fab) (width 0.1)) 32 | (fp_line (start -4.47 2.6) (end -4.47 -4.75) (layer F.Fab) (width 0.1)) 33 | (fp_line (start -4.47 1.32) (end -4.47 2.6) (layer F.SilkS) (width 0.2)) 34 | (fp_line (start 4.47 2.6) (end 4.47 1.32) (layer F.SilkS) (width 0.2)) 35 | (fp_line (start -5.07 -5.58) (end -5.07 2.85) (layer F.CrtYd) (width 0.05)) 36 | (fp_line (start -5.07 2.85) (end 5.07 2.85) (layer F.CrtYd) (width 0.05)) 37 | (fp_line (start 5.07 2.85) (end 5.07 -5.58) (layer F.CrtYd) (width 0.05)) 38 | (fp_line (start 5.07 -5.58) (end -5.07 -5.58) (layer F.CrtYd) (width 0.05)) 39 | (fp_text user "PCB EDGE" (at 5.4 2.5) (layer F.Fab) 40 | (effects (font (size 0.32 0.32) (thickness 0.15))) 41 | ) 42 | (fp_line (start 4.47 2.6) (end 8.4 2.6) (layer F.Fab) (width 0.1)) 43 | (fp_line (start -4.47 -2.65) (end -4.47 -1.4) (layer F.SilkS) (width 0.2)) 44 | (fp_line (start 4.47 -2.65) (end 4.47 -1.4) (layer F.SilkS) (width 0.2)) 45 | (fp_circle (center -3.25 -6.0) (end -3.15 -6.0) (layer F.Fab) (width 0.2)) 46 | (fp_circle (center -3.25 -6.0) (end -3.15 -6.0) (layer F.SilkS) (width 0.2)) 47 | (fp_poly 48 | (pts 49 | (xy -0.45 -5.38) 50 | (xy -0.05 -5.38) 51 | (xy -0.05 -4.13) 52 | (xy -0.45 -4.13) 53 | ) (layer F.Mask) (width 0.01) 54 | ) 55 | (fp_poly 56 | (pts 57 | (xy -0.95 -5.38) 58 | (xy -0.55 -5.38) 59 | (xy -0.55 -4.13) 60 | (xy -0.95 -4.13) 61 | ) (layer F.Mask) (width 0.01) 62 | ) 63 | (fp_poly 64 | (pts 65 | (xy -1.45 -5.38) 66 | (xy -1.05 -5.38) 67 | (xy -1.05 -4.13) 68 | (xy -1.45 -4.13) 69 | ) (layer F.Mask) (width 0.01) 70 | ) 71 | (fp_poly 72 | (pts 73 | (xy -1.95 -5.38) 74 | (xy -1.55 -5.38) 75 | (xy -1.55 -4.13) 76 | (xy -1.95 -4.13) 77 | ) (layer F.Mask) (width 0.01) 78 | ) 79 | (fp_poly 80 | (pts 81 | (xy 0.05 -5.38) 82 | (xy 0.45 -5.38) 83 | (xy 0.45 -4.13) 84 | (xy 0.05 -4.13) 85 | ) (layer F.Mask) (width 0.01) 86 | ) 87 | (fp_poly 88 | (pts 89 | (xy 0.55 -5.38) 90 | (xy 0.95 -5.38) 91 | (xy 0.95 -4.13) 92 | (xy 0.55 -4.13) 93 | ) (layer F.Mask) (width 0.01) 94 | ) 95 | (fp_poly 96 | (pts 97 | (xy 1.05 -5.38) 98 | (xy 1.45 -5.38) 99 | (xy 1.45 -4.13) 100 | (xy 1.05 -4.13) 101 | ) (layer F.Mask) (width 0.01) 102 | ) 103 | (fp_poly 104 | (pts 105 | (xy 1.55 -5.38) 106 | (xy 1.95 -5.38) 107 | (xy 1.95 -4.13) 108 | (xy 1.55 -4.13) 109 | ) (layer F.Mask) (width 0.01) 110 | ) 111 | (fp_poly 112 | (pts 113 | (xy 2.05 -5.38) 114 | (xy 2.75 -5.38) 115 | (xy 2.75 -4.13) 116 | (xy 2.05 -4.13) 117 | ) (layer F.Mask) (width 0.01) 118 | ) 119 | (fp_poly 120 | (pts 121 | (xy -2.75 -5.38) 122 | (xy -2.05 -5.38) 123 | (xy -2.05 -4.13) 124 | (xy -2.75 -4.13) 125 | ) (layer F.Mask) (width 0.01) 126 | ) 127 | (fp_poly 128 | (pts 129 | (xy -3.55 -5.38) 130 | (xy -2.85 -5.38) 131 | (xy -2.85 -4.13) 132 | (xy -3.55 -4.13) 133 | ) (layer F.Mask) (width 0.01) 134 | ) 135 | (fp_poly 136 | (pts 137 | (xy 2.85 -5.38) 138 | (xy 3.55 -5.38) 139 | (xy 3.55 -4.13) 140 | (xy 2.85 -4.13) 141 | ) (layer F.Mask) (width 0.01) 142 | ) 143 | ) -------------------------------------------------------------------------------- /hardware/libraries/USB4105-GF-A/USB4105-GF-A.kicad_sym: -------------------------------------------------------------------------------- 1 | 2 | (kicad_symbol_lib (version 20211014) (generator kicad_symbol_editor) 3 | (symbol "USB4105-GF-A" (pin_names (offset 1.016)) (in_bom yes) (on_board yes) 4 | (property "Reference" "J" (id 0) (at -15.24 13.97 0) 5 | (effects (font (size 1.27 1.27)) (justify bottom left)) 6 | ) 7 | (property "Value" "USB4105-GF-A" (id 1) (at -15.24 -15.24 0) 8 | (effects (font (size 1.27 1.27)) (justify bottom left)) 9 | ) 10 | (property "Footprint" "USB4105-GF-A:GCT_USB4105-GF-A" (id 2) (at 0 0 0) 11 | (effects (font (size 1.27 1.27)) (justify bottom) hide) 12 | ) 13 | (property "MF" "GCT" (id 4) (at 0 0 0) 14 | (effects (font (size 1.27 1.27)) (justify bottom) hide) 15 | ) 16 | (property "MAXIMUM_PACKAGE_HEIGHT" "3.31 mm" (id 5) (at 0 0 0) 17 | (effects (font (size 1.27 1.27)) (justify bottom) hide) 18 | ) 19 | (property "Package" "None" (id 6) (at 0 0 0) 20 | (effects (font (size 1.27 1.27)) (justify bottom) hide) 21 | ) 22 | (property "Price" "None" (id 7) (at 0 0 0) 23 | (effects (font (size 1.27 1.27)) (justify bottom) hide) 24 | ) 25 | (property "Check_prices" "https://www.snapeda.com/parts/USB4105-GF-A/Global+Connector+Technology/view-part/?ref=eda" (id 8) (at 0 0 0) 26 | (effects (font (size 1.27 1.27)) (justify bottom) hide) 27 | ) 28 | (property "STANDARD" "Manufacturer Recommendations" (id 9) (at 0 0 0) 29 | (effects (font (size 1.27 1.27)) (justify bottom) hide) 30 | ) 31 | (property "PARTREV" "B4" (id 10) (at 0 0 0) 32 | (effects (font (size 1.27 1.27)) (justify bottom) hide) 33 | ) 34 | (property "SnapEDA_Link" "https://www.snapeda.com/parts/USB4105-GF-A/Global+Connector+Technology/view-part/?ref=snap" (id 11) (at 0 0 0) 35 | (effects (font (size 1.27 1.27)) (justify bottom) hide) 36 | ) 37 | (property "MP" "USB4105-GF-A" (id 12) (at 0 0 0) 38 | (effects (font (size 1.27 1.27)) (justify bottom) hide) 39 | ) 40 | (property "Description" "\n \n USB-C (USB TYPE-C) USB 2.0 Receptacle Connector 24 (16+8 Dummy) Position Surface Mount, Right Angle; Through Hole\n \n" (id 13) (at 0 0 0) 41 | (effects (font (size 1.27 1.27)) (justify bottom) hide) 42 | ) 43 | (property "Availability" "In Stock" (id 14) (at 0 0 0) 44 | (effects (font (size 1.27 1.27)) (justify bottom) hide) 45 | ) 46 | (property "MANUFACTURER" "GCT" (id 15) (at 0 0 0) 47 | (effects (font (size 1.27 1.27)) (justify bottom) hide) 48 | ) 49 | (symbol "USB4105-GF-A_0_0" 50 | (rectangle (start -15.24 -12.7) (end 15.24 12.7) 51 | (stroke (width 0.254)) (fill (type background)) 52 | ) 53 | (pin bidirectional line (at -20.32 5.08 0) (length 5.08) 54 | (name "CC1" 55 | (effects (font (size 1.016 1.016))) 56 | ) 57 | (number "A5" 58 | (effects (font (size 1.016 1.016))) 59 | ) 60 | ) 61 | (pin bidirectional line (at -20.32 2.54 0) (length 5.08) 62 | (name "DP1" 63 | (effects (font (size 1.016 1.016))) 64 | ) 65 | (number "A6" 66 | (effects (font (size 1.016 1.016))) 67 | ) 68 | ) 69 | (pin bidirectional line (at -20.32 0.0 0) (length 5.08) 70 | (name "DN1" 71 | (effects (font (size 1.016 1.016))) 72 | ) 73 | (number "A7" 74 | (effects (font (size 1.016 1.016))) 75 | ) 76 | ) 77 | (pin bidirectional line (at -20.32 -2.54 0) (length 5.08) 78 | (name "SBU1" 79 | (effects (font (size 1.016 1.016))) 80 | ) 81 | (number "A8" 82 | (effects (font (size 1.016 1.016))) 83 | ) 84 | ) 85 | (pin power_in line (at 20.32 10.16 180.0) (length 5.08) 86 | (name "VBUS" 87 | (effects (font (size 1.016 1.016))) 88 | ) 89 | (number "A4_B9" 90 | (effects (font (size 1.016 1.016))) 91 | ) 92 | ) 93 | (pin power_in line (at 20.32 10.16 180.0) (length 5.08) 94 | (name "VBUS" 95 | (effects (font (size 1.016 1.016))) 96 | ) 97 | (number "B4_A9" 98 | (effects (font (size 1.016 1.016))) 99 | ) 100 | ) 101 | (pin bidirectional line (at 20.32 5.08 180.0) (length 5.08) 102 | (name "CC2" 103 | (effects (font (size 1.016 1.016))) 104 | ) 105 | (number "B5" 106 | (effects (font (size 1.016 1.016))) 107 | ) 108 | ) 109 | (pin bidirectional line (at 20.32 2.54 180.0) (length 5.08) 110 | (name "DP2" 111 | (effects (font (size 1.016 1.016))) 112 | ) 113 | (number "B6" 114 | (effects (font (size 1.016 1.016))) 115 | ) 116 | ) 117 | (pin bidirectional line (at 20.32 0.0 180.0) (length 5.08) 118 | (name "DN2" 119 | (effects (font (size 1.016 1.016))) 120 | ) 121 | (number "B7" 122 | (effects (font (size 1.016 1.016))) 123 | ) 124 | ) 125 | (pin bidirectional line (at 20.32 -2.54 180.0) (length 5.08) 126 | (name "SBU2" 127 | (effects (font (size 1.016 1.016))) 128 | ) 129 | (number "B8" 130 | (effects (font (size 1.016 1.016))) 131 | ) 132 | ) 133 | (pin power_in line (at 20.32 -7.62 180.0) (length 5.08) 134 | (name "GND" 135 | (effects (font (size 1.016 1.016))) 136 | ) 137 | (number "A1_B12" 138 | (effects (font (size 1.016 1.016))) 139 | ) 140 | ) 141 | (pin power_in line (at 20.32 -7.62 180.0) (length 5.08) 142 | (name "GND" 143 | (effects (font (size 1.016 1.016))) 144 | ) 145 | (number "B1_A12" 146 | (effects (font (size 1.016 1.016))) 147 | ) 148 | ) 149 | (pin power_in line (at 20.32 -10.16 180.0) (length 5.08) 150 | (name "SHELL_GND" 151 | (effects (font (size 1.016 1.016))) 152 | ) 153 | (number "SH1" 154 | (effects (font (size 1.016 1.016))) 155 | ) 156 | ) 157 | (pin power_in line (at 20.32 -10.16 180.0) (length 5.08) 158 | (name "SHELL_GND" 159 | (effects (font (size 1.016 1.016))) 160 | ) 161 | (number "SH2" 162 | (effects (font (size 1.016 1.016))) 163 | ) 164 | ) 165 | (pin power_in line (at 20.32 -10.16 180.0) (length 5.08) 166 | (name "SHELL_GND" 167 | (effects (font (size 1.016 1.016))) 168 | ) 169 | (number "SH3" 170 | (effects (font (size 1.016 1.016))) 171 | ) 172 | ) 173 | (pin power_in line (at 20.32 -10.16 180.0) (length 5.08) 174 | (name "SHELL_GND" 175 | (effects (font (size 1.016 1.016))) 176 | ) 177 | (number "SH4" 178 | (effects (font (size 1.016 1.016))) 179 | ) 180 | ) 181 | ) 182 | ) 183 | ) -------------------------------------------------------------------------------- /hardware/libraries/USB4105-GF-A/how-to-import.htm: -------------------------------------------------------------------------------- 1 | Page Redirection If you are not redirected automatically, follow this link to the import guide. -------------------------------------------------------------------------------- /rust-toolchain.toml: -------------------------------------------------------------------------------- 1 | [toolchain] 2 | channel = "stable" 3 | components = ["rust-src"] 4 | targets = ["riscv32imac-unknown-none-elf"] 5 | -------------------------------------------------------------------------------- /rustfmt.toml: -------------------------------------------------------------------------------- 1 | # Imports 2 | group_imports = "StdExternalCrate" 3 | imports_granularity = "Crate" 4 | imports_layout = "HorizontalVertical" 5 | -------------------------------------------------------------------------------- /src/ble.rs: -------------------------------------------------------------------------------- 1 | /// BLE module 2 | /// 3 | /// This module provides the BLE functionality for the Progressor. 4 | /// It includes the BLE advertising data, the GATT server, and the BLE connection. 5 | use arrayvec::ArrayVec; 6 | use defmt::{debug, info}; 7 | use trouble_host::{ 8 | advertise::{AD_FLAG_LE_LIMITED_DISCOVERABLE, SIMUL_LE_BR_HOST}, 9 | prelude::*, 10 | }; 11 | 12 | use crate::progressor::{DataPoint, MAX_PAYLOAD_SIZE}; 13 | 14 | /// Max number of connections 15 | pub const CONNECTIONS_MAX: usize = 1; 16 | /// Max number of L2CAP channels. 17 | pub const L2CAP_CHANNELS_MAX: usize = 2; // Signal + att 18 | /// Size of L2CAP packets 19 | pub const L2CAP_MTU: usize = 255; 20 | 21 | /// Progressor BLE Scanning Response 22 | const SCAN_RESPONSE_DATA: &[u8] = &[ 23 | AD_FLAG_LE_LIMITED_DISCOVERABLE | SIMUL_LE_BR_HOST, 24 | 7_u8, // BLE_GAP_AD_TYPE_128BIT_SERVICE_UUID_COMPLETE 25 | 0x57, 26 | 0xad, 27 | 0xfe, 28 | 0x4f, 29 | 0xd3, 30 | 0x13, 31 | 0xcc, 32 | 0x9d, 33 | 0xc9, 34 | 0x40, 35 | 0xa6, 36 | 0x1e, 37 | 0x01, 38 | 0x17, 39 | 0x4e, 40 | 0x7e, //UUID 41 | ]; 42 | 43 | // GATT Server definition 44 | #[gatt_server] 45 | pub struct Server { 46 | pub progressor: ProgressorService, 47 | } 48 | 49 | /// Tindeq Progressor service 50 | #[gatt_service(uuid = "7e4e1701-1ea6-40c9-9dcc-13d34ffead57")] 51 | pub struct ProgressorService { 52 | /// Data Point - for receiving data from the Progressor 53 | #[characteristic(uuid = "7e4e1702-1ea6-40c9-9dcc-13d34ffead57", notify)] 54 | pub data_point: DataPoint, 55 | 56 | /// Control Point - for sending commands to the Progressor 57 | #[characteristic( 58 | uuid = "7e4e1703-1ea6-40c9-9dcc-13d34ffead57", 59 | write, 60 | write_without_response 61 | )] 62 | pub control_point: [u8; MAX_PAYLOAD_SIZE], // Buffer for command data 63 | } 64 | 65 | /// Create an advertiser to use to connect to a BLE Central, and wait for it to connect. 66 | pub async fn advertise<'values, 'server, C: Controller>( 67 | name: &'values str, 68 | peripheral: &mut Peripheral<'values, C, DefaultPacketPool>, 69 | server: &'server Server<'values>, 70 | ) -> Result, BleHostError> { 71 | let advertising_data = advertising_data(name.as_bytes()).expect("Valid advertising data"); 72 | 73 | debug!("Advertising BLE"); 74 | let advertiser = peripheral 75 | .advertise( 76 | &Default::default(), 77 | Advertisement::ConnectableScannableUndirected { 78 | adv_data: advertising_data.as_slice(), 79 | scan_data: SCAN_RESPONSE_DATA, 80 | }, 81 | ) 82 | .await?; 83 | let conn = advertiser.accept().await?.with_attribute_server(server)?; 84 | info!("BLE connection established"); 85 | Ok(conn) 86 | } 87 | 88 | fn advertising_data(name: &[u8]) -> Result, ()> { 89 | // BLE AD type and flag constants 90 | const AD_TYPE_FLAGS: u8 = 0x01; 91 | const AD_TYPE_COMPLETE_LOCAL_NAME: u8 = 0x09; 92 | const FLAG_LE_GENERAL_DISC_MODE: u8 = 0x02; 93 | const FLAG_BR_EDR_NOT_SUPPORTED: u8 = 0x04; 94 | 95 | // Validate name length 96 | if name.len() > 24 { 97 | // Max allowed (27 - 3 bytes for flags) 98 | return Err(()); 99 | } 100 | 101 | let mut adv_data: ArrayVec = ArrayVec::new(); 102 | 103 | // Add flags (length=2, type, flags) 104 | adv_data.push(2); 105 | adv_data.push(AD_TYPE_FLAGS); 106 | adv_data.push(FLAG_LE_GENERAL_DISC_MODE | FLAG_BR_EDR_NOT_SUPPORTED); 107 | 108 | // Add name (length=name.len()+1, type, name bytes) 109 | adv_data.push(name.len() as u8 + 1); 110 | adv_data.push(AD_TYPE_COMPLETE_LOCAL_NAME); 111 | adv_data.try_extend_from_slice(name).map_err(|_| ())?; 112 | 113 | Ok(adv_data) 114 | } 115 | -------------------------------------------------------------------------------- /src/hx711.rs: -------------------------------------------------------------------------------- 1 | /// HX711 driver 2 | /// 3 | /// A driver for the HX711 24-bit ADC commonly used with load cells. 4 | /// This driver provides functions for reading data, calibration, and taring. 5 | /// 6 | /// Based on [loadcell] crate. 7 | /// 8 | /// [loadcell]: https://crates.io/crates/loadcell 9 | use core::fmt; 10 | 11 | use defmt::{debug, error, info}; 12 | use embedded_hal::delay::DelayNs; 13 | use embedded_storage::{ReadStorage, Storage}; 14 | use esp_hal::{ 15 | delay::Delay, 16 | gpio::{Input, Output}, 17 | }; 18 | use esp_storage::FlashStorage; 19 | 20 | /// The absolute minimum readings. A smaller value should be clamped. 21 | const HX711_MINIMUM: i32 = -(2i32.saturating_pow(24 - 1)); 22 | /// The absolute maximum readings. A greater value should be clamped. 23 | const HX711_MAXIMUM: i32 = 2i32.saturating_pow(24 - 1) - 1; 24 | /// The default delay time in microseconds for the HX711. 25 | const HX711_DELAY_TIME_US: u32 = 1; 26 | /// The number of bits in the HX711 reading 27 | const HX711_DATA_BITS: usize = 24; 28 | /// The sign bit position in the HX711 reading 29 | const HX711_SIGN_BIT: u32 = 0x800000; 30 | 31 | /// The default address of the NVS flash storage. 32 | const NVS_ADDR: u32 = 0x9000; 33 | /// The default number of samples for taring 34 | const DEFAULT_TARING_SAMPLES: usize = 16; 35 | /// The default number of samples for calibration 36 | const DEFAULT_CALIBRATION_SAMPLES: usize = 100; 37 | /// The default calibration value. 38 | const DEFAULT_CALIBRATION_FACTOR: f32 = 0.066; 39 | 40 | /// Custom error type for HX711 operations 41 | #[derive(Debug)] 42 | pub enum Hx711Error { 43 | /// Flash storage error 44 | FlashError, 45 | /// Invalid calibration value 46 | InvalidCalibration, 47 | } 48 | 49 | impl fmt::Display for Hx711Error { 50 | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { 51 | match self { 52 | Hx711Error::FlashError => write!(f, "Flash storage error"), 53 | Hx711Error::InvalidCalibration => write!(f, "Invalid calibration value"), 54 | } 55 | } 56 | } 57 | 58 | /// The HX711 has different amplifier gain settings. 59 | /// The choice of gain settings is controlled by writing a fixed number of 60 | /// extra pulses after a read. 61 | #[repr(u8)] 62 | #[derive(Clone, Copy, Debug)] 63 | pub enum GainMode { 64 | /// Amplification gain of 128 on channel A. 65 | A128 = 1, 66 | /// Amplification gain of 32 on channel B. 67 | B32 = 2, 68 | /// Amplification gain of 64 on channel A. 69 | A64 = 3, 70 | } 71 | 72 | /// HX711 24-bit ADC driver 73 | pub struct Hx711<'d> { 74 | /// Data pin 75 | data: Input<'d>, 76 | /// Clock pin 77 | clock: Output<'d>, 78 | /// Delay instance 79 | delay: Delay, 80 | /// Flash storage 81 | flash: FlashStorage<'d>, 82 | /// Gain mode 83 | gain_mode: GainMode, 84 | /// Tare value 85 | tare_value: i32, 86 | /// Calibration 87 | calibration_factor: f32, 88 | } 89 | 90 | impl<'d> Hx711<'d> { 91 | /// Create a new HX711 driver. 92 | pub fn new( 93 | data: Input<'d>, 94 | mut clock: Output<'d>, 95 | delay: Delay, 96 | flash: FlashStorage<'d>, 97 | ) -> Self { 98 | info!("HX711 initialized"); 99 | clock.set_low(); 100 | 101 | let mut hx711 = Self { 102 | data, 103 | clock, 104 | delay, 105 | flash, 106 | gain_mode: GainMode::A64, 107 | tare_value: 0, 108 | calibration_factor: 0.0, 109 | }; 110 | 111 | hx711.calibration_factor = hx711 112 | .get_calibration_factor() 113 | .unwrap_or(DEFAULT_CALIBRATION_FACTOR); 114 | 115 | hx711 116 | } 117 | 118 | /// Read calibration factor from flash 119 | fn read_from_flash(&mut self) -> Result { 120 | let mut bytes = [0u8; 4]; 121 | 122 | self.flash.read(NVS_ADDR, &mut bytes).map_err(|_| { 123 | error!("Failed to read calibration factor from flash"); 124 | Hx711Error::FlashError 125 | })?; 126 | 127 | let factor = f32::from_le_bytes(bytes[0..4].try_into().unwrap()); 128 | 129 | if !Self::is_valid_calibration_factor(factor) { 130 | info!("Invalid calibration factor read from flash"); 131 | return Err(Hx711Error::InvalidCalibration); 132 | } 133 | 134 | Ok(factor) 135 | } 136 | 137 | /// Check if the calibration factor is valid 138 | pub fn is_valid_calibration_factor(factor: f32) -> bool { 139 | !factor.is_nan() && factor != 0.0 140 | } 141 | 142 | /// Write calibration factor to flash 143 | fn write_to_flash(&mut self, calibration_factor: f32) -> Result<(), Hx711Error> { 144 | if !Self::is_valid_calibration_factor(calibration_factor) { 145 | return Err(Hx711Error::InvalidCalibration); 146 | } 147 | 148 | let mut bytes = [0u8; 4]; 149 | 150 | bytes[0..4].copy_from_slice(&calibration_factor.to_le_bytes()); 151 | 152 | self.flash.write(NVS_ADDR, &bytes).map_err(|_| { 153 | error!("Failed to write calibration factor to flash"); 154 | Hx711Error::FlashError 155 | })?; 156 | 157 | Ok(()) 158 | } 159 | 160 | /// Update the calibration factor in memory and flash. 161 | pub fn update_calibration_factor(&mut self, factor: f32) -> Result<(), Hx711Error> { 162 | if !Self::is_valid_calibration_factor(factor) { 163 | error!("Invalid calibration factor: {}", factor); 164 | return Err(Hx711Error::InvalidCalibration); 165 | } 166 | 167 | debug!("Updating calibration factor: {}", factor); 168 | self.write_to_flash(factor)?; 169 | 170 | self.calibration_factor = factor; 171 | Ok(()) 172 | } 173 | 174 | pub fn get_calibration_factor(&mut self) -> Result { 175 | // Get the calibration factor from the NVS flash storage. 176 | match self.read_from_flash() { 177 | Ok(factor) => { 178 | info!("Read calibration factor: {:?}", factor); 179 | Ok(factor) 180 | } 181 | Err(Hx711Error::InvalidCalibration) => { 182 | info!("Using default calibration factor"); 183 | Ok(DEFAULT_CALIBRATION_FACTOR) 184 | } 185 | Err(e) => Err(e), 186 | } 187 | } 188 | 189 | /// Get the current calibration factor. 190 | pub fn current_calibration_factor(&self) -> f32 { 191 | self.calibration_factor 192 | } 193 | 194 | /// Set the default calibration factor. 195 | pub fn default_calibration_factor(&mut self) -> Result<(), Hx711Error> { 196 | debug!("Restoring default calibration factor"); 197 | self.write_to_flash(DEFAULT_CALIBRATION_FACTOR)?; 198 | self.calibration_factor = DEFAULT_CALIBRATION_FACTOR; 199 | Ok(()) 200 | } 201 | 202 | /// Reads a single bit from the data pin. 203 | #[inline] 204 | fn read_data_bit(&mut self) -> bool { 205 | self.clock.set_high(); 206 | self.delay.delay_us(HX711_DELAY_TIME_US); 207 | 208 | let bit = self.data.is_high(); 209 | 210 | self.clock.set_low(); 211 | self.delay.delay_us(HX711_DELAY_TIME_US); 212 | 213 | bit 214 | } 215 | 216 | /// Toggles the clock pin to prepare for the next gain mode. 217 | fn send_gain_pulses(&mut self) { 218 | critical_section::with(|_| { 219 | let pulses = self.gain_mode as u8; 220 | for _ in 0..pulses { 221 | self.clock.set_high(); 222 | self.delay.delay_us(HX711_DELAY_TIME_US); 223 | self.clock.set_low(); 224 | self.delay.delay_us(HX711_DELAY_TIME_US); 225 | } 226 | }); 227 | } 228 | 229 | /// Sets the gain mode for the next reading. 230 | pub fn set_gain_mode(&mut self, gain_mode: GainMode) { 231 | self.gain_mode = gain_mode; 232 | } 233 | 234 | /// Gets the current gain mode. 235 | pub fn gain_mode(&self) -> GainMode { 236 | self.gain_mode 237 | } 238 | 239 | /// Reads 24 bits from the HX711 within a critical section. 240 | fn read_raw(&mut self) -> i32 { 241 | let value = critical_section::with(|_| { 242 | let mut result: u32 = 0; 243 | for _ in 0..HX711_DATA_BITS { 244 | result = (result << 1) | (self.read_data_bit() as u32); 245 | } 246 | result 247 | }); 248 | 249 | self.send_gain_pulses(); 250 | 251 | // Handle sign extension for 24-bit signed values 252 | let extended_value = if value & HX711_SIGN_BIT != 0 { 253 | value | 0xFF000000 // Negative value, extend the sign bit 254 | } else { 255 | value // Positive value, no change 256 | }; 257 | 258 | // Clamp to valid range and return as signed 32-bit 259 | (extended_value as i32).clamp(HX711_MINIMUM, HX711_MAXIMUM) 260 | } 261 | 262 | /// Waits until the data is ready to be read. 263 | async fn wait_for_ready(&mut self) { 264 | self.data.wait_for_low().await; 265 | } 266 | 267 | /// Takes multiple samples and returns the average 268 | async fn take_samples(&mut self, num_samples: usize) -> f32 { 269 | let mut total: f32 = 0.0; 270 | 271 | for _ in 0..num_samples { 272 | self.wait_for_ready().await; 273 | total += self.read_raw() as f32; 274 | } 275 | 276 | total / num_samples as f32 277 | } 278 | 279 | /// Tares the sensor by measuring the average of several readings. 280 | pub async fn tare(&mut self) { 281 | debug!("Taring the scale"); 282 | if !Self::is_valid_calibration_factor(self.calibration_factor) { 283 | info!("Invalid calibration factor, skipping tare"); 284 | return; 285 | } 286 | 287 | let average = self.take_samples(DEFAULT_TARING_SAMPLES).await; 288 | self.tare_value = average as i32; 289 | debug!("Tare value set to: {}", self.tare_value); 290 | } 291 | 292 | /// Reads a raw value without calibration 293 | pub async fn read_raw_value(&mut self) -> i32 { 294 | self.wait_for_ready().await; 295 | self.read_raw() 296 | } 297 | 298 | /// Reads a tared raw value (raw value minus tare value) 299 | pub async fn read_tared(&mut self) -> i32 { 300 | self.wait_for_ready().await; 301 | self.read_raw() - self.tare_value 302 | } 303 | 304 | /// Reads a calibrated value, in kg. 305 | pub async fn read_calibrated(&mut self) -> f32 { 306 | let raw_tared = self.read_tared().await; 307 | let calibrated_value = (raw_tared as f32) * self.calibration_factor; 308 | // Convert to kg 309 | calibrated_value / 1000.0 310 | } 311 | 312 | /// Perform two-point calibration with a known target weight 313 | /// 314 | /// This method collects raw values for calibration by taking multiple samples 315 | /// and averaging them for stability. 316 | /// 317 | /// Returns the average raw value for the calibration point. 318 | pub async fn perform_calibration(&mut self, _target_weight: f32) -> f32 { 319 | // Reset calibration to raw values first 320 | let _ = self.update_calibration_factor(1.0); 321 | 322 | // Take multiple readings and average them for stability 323 | let average_value = self.take_samples(DEFAULT_CALIBRATION_SAMPLES).await; 324 | debug!("Calibration point collected: {}", average_value); 325 | 326 | average_value 327 | } 328 | 329 | /// Apply two-point calibration using the collected calibration points 330 | /// 331 | /// This method calculates and applies calibration parameters based on 332 | /// two previously measured calibration points and a target weight. 333 | /// 334 | /// Returns true if calibration was successfully applied, false otherwise. 335 | pub fn apply_two_point_calibration( 336 | &mut self, 337 | calibration_points: [f32; 2], 338 | target_weight: f32, 339 | ) -> bool { 340 | debug!("Calibration points: {:?}", calibration_points); 341 | 342 | let (point1, point2) = (calibration_points[0], calibration_points[1]); 343 | 344 | // Check for invalid calibration points 345 | if (point2 - point1).abs() < f32::EPSILON { 346 | error!("Invalid calibration - points are too close together"); 347 | return false; 348 | } 349 | 350 | if target_weight <= 0.0 { 351 | error!("Invalid target weight: {}", target_weight); 352 | return false; 353 | } 354 | 355 | // Calculate calibration factor (scale factor) 356 | let scale_factor = target_weight / (point2 - point1); 357 | 358 | // Apply the calibration factor 359 | match self.update_calibration_factor(scale_factor) { 360 | Ok(_) => { 361 | debug!("Calibration factor successfully applied"); 362 | true 363 | } 364 | Err(e) => { 365 | error!( 366 | "Failed to apply calibration factor: {:?}", 367 | defmt::Debug2Format(&e) 368 | ); 369 | false 370 | } 371 | } 372 | } 373 | } 374 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | #![no_std] 2 | #![no_main] 3 | 4 | use core::cell::RefCell; 5 | 6 | use bt_hci::controller::ExternalController; 7 | use critical_section::Mutex; 8 | use defmt::{debug, error, info, warn}; 9 | use embassy_executor::Spawner; 10 | use embassy_futures::{join::join, select::select}; 11 | use embassy_sync::channel::Channel; 12 | use embassy_time::{Duration, Timer}; 13 | use esp_hal::{ 14 | clock::CpuClock, 15 | delay::Delay, 16 | gpio::{Input, InputConfig, Level, Output, OutputConfig, Pull}, 17 | interrupt::software::SoftwareInterruptControl, 18 | time, 19 | timer::timg::TimerGroup, 20 | Config, 21 | }; 22 | use esp_radio::ble::controller::BleConnector; 23 | use esp_storage::FlashStorage; 24 | use panic_rtt_target as _; 25 | use static_cell::StaticCell; 26 | use trouble_host::prelude::*; 27 | 28 | extern crate alloc; 29 | 30 | use crate::{ 31 | ble::{advertise, Server, CONNECTIONS_MAX, L2CAP_CHANNELS_MAX, L2CAP_MTU}, 32 | hx711::Hx711, 33 | progressor::{ 34 | ControlOpCode, 35 | DataPoint, 36 | DataPointChannel, 37 | DeviceState, 38 | MeasurementTaskStatus, 39 | ResponseCode, 40 | }, 41 | }; 42 | 43 | pub mod ble; 44 | pub mod hx711; 45 | pub mod progressor; 46 | 47 | // Helper macro for static allocation 48 | macro_rules! mk_static { 49 | ($t:ty,$val:expr) => {{ 50 | static STATIC_CELL: static_cell::StaticCell<$t> = static_cell::StaticCell::new(); 51 | #[deny(unused_attributes)] 52 | let x = STATIC_CELL.uninit().write($val); 53 | x 54 | }}; 55 | } 56 | 57 | /// Static tracking the state of the device 58 | static DEVICE_STATE: Mutex> = Mutex::new(RefCell::new(DeviceState { 59 | measurement_status: MeasurementTaskStatus::Disabled, 60 | tared: false, 61 | start_time: 0, 62 | calibration_points: [None, None], 63 | })); 64 | 65 | // ESP-IDF App Descriptor 66 | esp_bootloader_esp_idf::esp_app_desc!(); 67 | 68 | #[esp_rtos::main] 69 | async fn main(spawner: Spawner) -> ! { 70 | // Initialize RTT for defmt logging 71 | rtt_target::rtt_init_defmt!(); 72 | 73 | // System initialization 74 | let config = Config::default().with_cpu_clock(CpuClock::max()); 75 | let peripherals = esp_hal::init(config); 76 | 77 | // Allocate 72KB of heap memory 78 | esp_alloc::heap_allocator!(size: 72 * 1024); 79 | 80 | // Initialize RTOS 81 | let timg0 = TimerGroup::new(peripherals.TIMG0); 82 | let sw_interrupt = SoftwareInterruptControl::new(peripherals.SW_INTERRUPT); 83 | esp_rtos::start(timg0.timer0, sw_interrupt.software_interrupt0); 84 | 85 | // Initialize radio 86 | static RADIO: StaticCell> = StaticCell::new(); 87 | let radio = RADIO.init(esp_radio::init().unwrap()); 88 | 89 | // Initialize BLE 90 | let bluetooth = peripherals.BT; 91 | let connector = BleConnector::new(radio, bluetooth, Default::default()).unwrap(); 92 | let controller: ExternalController<_, 1> = ExternalController::new(connector); 93 | 94 | // Initialize load cell pins 95 | let clock_pin = Output::new(peripherals.GPIO5, Level::Low, OutputConfig::default()); 96 | let data_pin = Input::new( 97 | peripherals.GPIO4, 98 | InputConfig::default().with_pull(Pull::None), 99 | ); 100 | let delay = Delay::new(); 101 | let flash = FlashStorage::new(peripherals.FLASH); 102 | 103 | // Use the last 6 bytes of the DEVICE_NAME for the address 104 | let device_name = env!("DEVICE_NAME"); 105 | let mut buff: [u8; 6] = [0u8; 6]; 106 | buff.copy_from_slice(&device_name.as_bytes()[device_name.len() - 6..]); 107 | buff[5] |= 0xC0; 108 | let address: Address = Address::random(buff); 109 | let mut resources: HostResources< 110 | DefaultPacketPool, 111 | CONNECTIONS_MAX, 112 | L2CAP_CHANNELS_MAX, 113 | L2CAP_MTU, 114 | > = HostResources::new(); 115 | let stack = trouble_host::new(controller, &mut resources).set_random_address(address); 116 | let Host { 117 | mut peripheral, 118 | runner, 119 | .. 120 | } = stack.build(); 121 | 122 | info!("Starting advertising and GATT service"); 123 | let server = Server::new_with_config(GapConfig::Peripheral(PeripheralConfig { 124 | name: device_name, 125 | appearance: &appearance::UNKNOWN, 126 | })) 127 | .unwrap(); 128 | 129 | // Data point channel for communication between tasks 130 | let channel = mk_static!(DataPointChannel, Channel::new()); 131 | 132 | // Spawn tasks 133 | spawner 134 | .spawn(measurement_task(channel, clock_pin, data_pin, delay, flash)) 135 | .unwrap(); 136 | 137 | let _ = join(ble_task(runner), async { 138 | loop { 139 | match advertise(device_name, &mut peripheral, &server).await { 140 | Ok(conn) => { 141 | // run until any task ends (usually because the connection has been closed), 142 | // then return to advertising state. 143 | select( 144 | gatt_events_task(&server, &conn, channel), 145 | data_processing_task(&server, &conn, channel), 146 | ) 147 | .await; 148 | } 149 | Err(e) => { 150 | panic!("BLE error: {:?}", e); 151 | } 152 | } 153 | } 154 | }) 155 | .await; 156 | 157 | // Idle loop 158 | loop { 159 | Timer::after(Duration::from_millis(50)).await; 160 | } 161 | } 162 | 163 | async fn ble_task(mut runner: Runner<'_, C, P>) { 164 | loop { 165 | if let Err(e) = runner.run().await { 166 | panic!("BLE error: {:?}", e); 167 | } 168 | } 169 | } 170 | 171 | #[embassy_executor::task] 172 | async fn measurement_task( 173 | channel: &'static DataPointChannel, 174 | clock_pin: Output<'static>, 175 | data_pin: Input<'static>, 176 | delay: Delay, 177 | flash: FlashStorage<'static>, 178 | ) { 179 | let mut load_cell = Hx711::new(data_pin, clock_pin, delay, flash); 180 | load_cell.tare().await; 181 | 182 | loop { 183 | // Get current device state 184 | let (status, start_time) = critical_section::with(|cs| { 185 | let state = DEVICE_STATE.borrow_ref(cs); 186 | (state.measurement_status, state.start_time) 187 | }); 188 | 189 | match status { 190 | MeasurementTaskStatus::Disabled => { 191 | // Do nothing when disabled 192 | Timer::after(Duration::from_millis(10)).await; 193 | } 194 | MeasurementTaskStatus::Tare => { 195 | // Perform taring operation 196 | load_cell.tare().await; 197 | 198 | critical_section::with(|cs| { 199 | let mut state = DEVICE_STATE.borrow_ref_mut(cs); 200 | state.tared = true; 201 | state.measurement_status = MeasurementTaskStatus::Disabled; 202 | }); 203 | } 204 | MeasurementTaskStatus::Enabled => { 205 | send_weight_measurement(&mut load_cell, start_time, channel).await; 206 | } 207 | MeasurementTaskStatus::Calibration(weight) => { 208 | // Use the load cell's own calibration method to collect a calibration point 209 | let calibration_point = load_cell.perform_calibration(weight).await; 210 | 211 | critical_section::with(|cs| { 212 | let mut state = DEVICE_STATE.borrow_ref_mut(cs); 213 | 214 | // Store calibration point (either first or second) 215 | if state.calibration_points[0].is_none() { 216 | state.calibration_points[0] = Some(calibration_point); 217 | } else { 218 | state.calibration_points[1] = Some(calibration_point); 219 | 220 | // Calculate and apply calibration if we have both points 221 | if let (Some(point1), Some(point2)) = 222 | (state.calibration_points[0], state.calibration_points[1]) 223 | { 224 | if !load_cell.apply_two_point_calibration([point1, point2], weight) { 225 | error!( 226 | "Failed to apply calibration points: {:?}", 227 | state.calibration_points 228 | ); 229 | } 230 | } 231 | } 232 | 233 | // Disable measurement mode after capturing point 234 | state.measurement_status = MeasurementTaskStatus::Disabled; 235 | }); 236 | } 237 | MeasurementTaskStatus::DefaultCalibration => { 238 | // Reset calibration to default values 239 | if let Err(e) = load_cell.default_calibration_factor() { 240 | error!( 241 | "Error applying default calibration: {:?}", 242 | defmt::Debug2Format(&e) 243 | ); 244 | } 245 | critical_section::with(|cs| { 246 | let mut state = DEVICE_STATE.borrow_ref_mut(cs); 247 | state.measurement_status = MeasurementTaskStatus::Disabled; 248 | }); 249 | } 250 | MeasurementTaskStatus::GetCalibration => { 251 | load_cell.get_calibration_factor().unwrap(); 252 | critical_section::with(|cs| { 253 | let mut state = DEVICE_STATE.borrow_ref_mut(cs); 254 | state.measurement_status = MeasurementTaskStatus::Disabled; 255 | }); 256 | } 257 | } 258 | 259 | // Add a short delay to prevent tight loops 260 | if status == MeasurementTaskStatus::Disabled { 261 | Timer::after(Duration::from_millis(10)).await; 262 | } 263 | } 264 | } 265 | 266 | /// Send a weight measurement data point with current timestamp 267 | async fn send_weight_measurement( 268 | load_cell: &mut Hx711<'_>, 269 | start_time: u32, 270 | channel: &'static DataPointChannel, 271 | ) { 272 | let weight = load_cell.read_calibrated().await; 273 | let timestamp = (time::Instant::now().duration_since_epoch()).as_micros() as u32 - start_time; 274 | 275 | debug!( 276 | "Sending measurement: Weight: {}kg, Timestamp: {:?}", 277 | weight, 278 | timestamp as f32 / 1000000.0 279 | ); 280 | 281 | let response = ResponseCode::WeightMeasurement(weight, timestamp); 282 | let data_point = DataPoint::from(response); 283 | data_point.send(channel); 284 | } 285 | 286 | /// Stream Events until the connection closes. 287 | /// 288 | /// This function will handle the GATT events and process them. 289 | /// This is how we interact with read and write requests. 290 | async fn gatt_events_task( 291 | server: &Server<'_>, 292 | conn: &GattConnection<'_, '_, P>, 293 | channel: &'static DataPointChannel, 294 | ) -> Result<(), Error> { 295 | let control_point = server.progressor.control_point; 296 | loop { 297 | match conn.next().await { 298 | GattConnectionEvent::Disconnected { reason } => { 299 | info!("Device disconnected: {:?}", reason); 300 | break; 301 | } 302 | GattConnectionEvent::Gatt { event } => { 303 | // Handle write events to the control point 304 | if let GattEvent::Write(write_event) = &event { 305 | if write_event.handle() == control_point.handle { 306 | let cmd_data = write_event.data(); 307 | let op_code = ControlOpCode::from(cmd_data[0]); 308 | info!("Control Point Received: {:?}", op_code); 309 | 310 | critical_section::with(|cs| { 311 | let mut device_state = DEVICE_STATE.borrow_ref_mut(cs); 312 | op_code.process(cmd_data, channel, &mut device_state); 313 | }); 314 | } 315 | } 316 | 317 | // Ensure reply is sent 318 | if let Ok(reply) = event.accept() { 319 | reply.send().await; 320 | } else { 321 | warn!("Error sending response"); 322 | } 323 | } 324 | _ => {} 325 | } 326 | } 327 | 328 | info!("BLE task finished"); 329 | critical_section::with(|cs| { 330 | let mut device_state = DEVICE_STATE.borrow_ref_mut(cs); 331 | device_state.stop_measurement(); 332 | }); 333 | 334 | Ok(()) 335 | } 336 | 337 | /// Process data and send notifications to the client 338 | async fn data_processing_task( 339 | server: &Server<'_>, 340 | conn: &GattConnection<'_, '_, P>, 341 | channel: &'static DataPointChannel, 342 | ) { 343 | let data_point_handle = server.progressor.data_point; 344 | 345 | loop { 346 | let data_point = channel.receive().await; 347 | debug!("Sending Data Point: {:?}", data_point); 348 | 349 | // Send notification with the data packet 350 | if let Err(e) = data_point_handle.notify(conn, &data_point).await { 351 | info!("Error sending Data Point: {:?}", defmt::Debug2Format(&e)); 352 | break; 353 | } 354 | } 355 | } 356 | -------------------------------------------------------------------------------- /src/progressor.rs: -------------------------------------------------------------------------------- 1 | /// Progressor data types 2 | /// 3 | /// See [Tindeq API documentation] for more information 4 | /// 5 | /// [Tindeq API documentation]: https://tindeq.com/progressor_api/ 6 | use core::cell::UnsafeCell; 7 | 8 | use defmt::{debug, error, info, trace, Format}; 9 | use embassy_sync::{blocking_mutex::raw::NoopRawMutex, channel::Channel}; 10 | use esp_hal::time; 11 | use trouble_host::types::gatt_traits::{AsGatt, FromGatt, FromGattError}; 12 | 13 | /// Size of the channel used to send data points 14 | const DATA_POINT_COMMAND_CHANNEL_SIZE: usize = 80; 15 | /// Channel used to send data points 16 | pub type DataPointChannel = Channel; 17 | 18 | /// Maximum size of the data payload in bytes for any data point 19 | pub const MAX_PAYLOAD_SIZE: usize = 10; 20 | 21 | /// Number of bytes in the device ID 22 | const DEVICE_ID_SIZE: usize = 6; 23 | 24 | /// Status of the weight measurement task 25 | #[derive(Copy, Debug, Clone, PartialEq)] 26 | pub enum MeasurementTaskStatus { 27 | /// Measurements are enabled 28 | Enabled, 29 | /// Measurements are disabled 30 | Disabled, 31 | /// Device is in calibration mode with target weight 32 | Calibration(f32), 33 | /// Taring the scale (used in ClimbHarder App) 34 | Tare, 35 | /// Restores default calibration values 36 | DefaultCalibration, 37 | /// Get the calibration values 38 | GetCalibration, 39 | } 40 | 41 | /// Device state management 42 | #[derive(Copy, Debug, Clone, PartialEq)] 43 | pub struct DeviceState { 44 | /// Measurement status 45 | pub measurement_status: MeasurementTaskStatus, 46 | /// Tared status 47 | pub tared: bool, 48 | /// Start time of the measurement in microseconds 49 | pub start_time: u32, 50 | /// Calibration points [point1, point2] 51 | pub calibration_points: [Option; 2], 52 | } 53 | 54 | impl Default for DeviceState { 55 | fn default() -> Self { 56 | Self { 57 | measurement_status: MeasurementTaskStatus::Disabled, 58 | tared: false, 59 | start_time: 0, 60 | calibration_points: [None, None], 61 | } 62 | } 63 | } 64 | 65 | impl DeviceState { 66 | /// Create a new device state with default values 67 | pub fn new() -> Self { 68 | Self::default() 69 | } 70 | 71 | /// Start a measurement 72 | pub fn start_measurement(&mut self) { 73 | self.start_time = (time::Instant::now().duration_since_epoch()).as_micros() as u32; 74 | self.measurement_status = MeasurementTaskStatus::Enabled; 75 | } 76 | 77 | /// Stop the current measurement 78 | pub fn stop_measurement(&mut self) { 79 | self.measurement_status = MeasurementTaskStatus::Disabled; 80 | } 81 | 82 | /// Start taring process 83 | pub fn tare(&mut self) { 84 | self.measurement_status = MeasurementTaskStatus::Tare; 85 | } 86 | 87 | /// Set calibration mode with the given weight 88 | pub fn calibrate(&mut self, weight: f32) { 89 | self.measurement_status = MeasurementTaskStatus::Calibration(weight); 90 | } 91 | 92 | pub fn get_calibration(&mut self) { 93 | self.measurement_status = MeasurementTaskStatus::GetCalibration; 94 | } 95 | 96 | /// Reset to default calibration 97 | pub fn reset_calibration(&mut self) { 98 | self.measurement_status = MeasurementTaskStatus::DefaultCalibration; 99 | } 100 | } 101 | 102 | /// Progressor Commands 103 | #[derive(Debug, Clone, Copy)] 104 | pub enum ControlOpCode { 105 | /// Command used to zero weight when no load is applied 106 | TareScale = 0x64, 107 | /// Start continuous measurement. Sample rate is 80Hz 108 | StartMeasurement = 0x65, 109 | /// Stop weight measurement. This should be done before sampling the battery voltage 110 | StopMeasurement = 0x66, 111 | /// Turn the Progressor off 112 | Shutdown = 0x6E, 113 | /// Measures the battery voltage in millivolts 114 | SampleBattery = 0x6F, 115 | /// Get the Progressor ID 116 | GetProgressorId = 0x70, 117 | /// Get the application version 118 | GetAppVersion = 0x6B, 119 | /// Get the calibration values 120 | GetCalibration = 0x72, 121 | /// Adds a calibration point 122 | AddCalibrationPoint = 0x73, 123 | /// Default calibration 124 | DefaultCalibration = 0x74, 125 | } 126 | 127 | impl ControlOpCode { 128 | /// Process the control operation 129 | pub fn process( 130 | self, 131 | data: &[u8], 132 | channel: &'static DataPointChannel, 133 | device_state: &mut DeviceState, 134 | ) { 135 | match self { 136 | ControlOpCode::TareScale => { 137 | device_state.tare(); 138 | } 139 | ControlOpCode::StartMeasurement => { 140 | device_state.start_measurement(); 141 | } 142 | ControlOpCode::StopMeasurement => { 143 | device_state.stop_measurement(); 144 | } 145 | ControlOpCode::GetAppVersion => { 146 | let response = ResponseCode::AppVersion(env!("DEVICE_VERSION_NUMBER").as_bytes()); 147 | info!("AppVersion: {:#x}", response); 148 | DataPoint::from(response).send(channel); 149 | } 150 | ControlOpCode::GetProgressorId => { 151 | /// Number of hex characters needed per byte (2 hex chars = 1 byte) 152 | const HEX_CHARS_PER_BYTE: usize = 2; 153 | /// Hex radix for parsing hex strings 154 | const HEX_RADIX: u32 = 16; 155 | 156 | let device_id = env!("DEVICE_ID"); 157 | let mut bytes = [0u8; DEVICE_ID_SIZE]; 158 | for (i, byte) in bytes.iter_mut().enumerate() { 159 | let char_pos = i * HEX_CHARS_PER_BYTE; 160 | let next_char_pos = char_pos + HEX_CHARS_PER_BYTE; 161 | if next_char_pos <= device_id.len() { 162 | if let Ok(parsed_byte) = 163 | u8::from_str_radix(&device_id[char_pos..next_char_pos], HEX_RADIX) 164 | { 165 | *byte = parsed_byte; 166 | } 167 | } 168 | } 169 | let response = ResponseCode::ProgressorId(bytes); 170 | info!("ProgressorId: {:?}", response); 171 | DataPoint::from(response).send(channel); 172 | } 173 | ControlOpCode::GetCalibration => { 174 | info!("GetCalibration requested"); 175 | device_state.get_calibration(); 176 | } 177 | ControlOpCode::AddCalibrationPoint => { 178 | if data.len() < 5 { 179 | error!("AddCalibrationPoint: Invalid data length"); 180 | return; 181 | } 182 | 183 | let weight = match data[1..5].try_into() { 184 | Ok(bytes) => f32::from_be_bytes(bytes), 185 | Err(e) => { 186 | error!("Failed to parse calibration point data: {:?}", e); 187 | return; 188 | } 189 | }; 190 | 191 | device_state.calibrate(weight); 192 | debug!( 193 | "Received AddCalibrationPoint command with measurement: {}", 194 | weight 195 | ); 196 | } 197 | ControlOpCode::DefaultCalibration => { 198 | device_state.reset_calibration(); 199 | } 200 | ControlOpCode::SampleBattery => { 201 | // Hardcoded for now 202 | let voltage = 4300; 203 | let response = ResponseCode::SampleBatteryVoltage(voltage); 204 | info!("SampleBattery: {:?}", response); 205 | DataPoint::from(response).send(channel); 206 | } 207 | // Currently unimplemented operations 208 | ControlOpCode::Shutdown => {} 209 | } 210 | } 211 | } 212 | 213 | impl From for ControlOpCode { 214 | fn from(op_code: u8) -> Self { 215 | match op_code { 216 | 0x64 => ControlOpCode::TareScale, 217 | 0x65 => ControlOpCode::StartMeasurement, 218 | 0x66 => ControlOpCode::StopMeasurement, 219 | 0x6E => ControlOpCode::Shutdown, 220 | 0x6F => ControlOpCode::SampleBattery, 221 | 0x70 => ControlOpCode::GetProgressorId, 222 | 0x6B => ControlOpCode::GetAppVersion, 223 | 0x72 => ControlOpCode::GetCalibration, 224 | 0x73 => ControlOpCode::AddCalibrationPoint, 225 | 0x74 => ControlOpCode::DefaultCalibration, 226 | _ => { 227 | error!("Invalid OpCode received: {:#x}", op_code); 228 | ControlOpCode::StopMeasurement 229 | } 230 | } 231 | } 232 | } 233 | 234 | impl Format for ControlOpCode { 235 | fn format(&self, fmt: defmt::Formatter) { 236 | match self { 237 | ControlOpCode::TareScale => defmt::write!(fmt, "TareScale"), 238 | ControlOpCode::StartMeasurement => defmt::write!(fmt, "StartMeasurement"), 239 | ControlOpCode::StopMeasurement => defmt::write!(fmt, "StopMeasurement"), 240 | ControlOpCode::GetAppVersion => defmt::write!(fmt, "GetAppVersion"), 241 | ControlOpCode::Shutdown => defmt::write!(fmt, "Shutdown"), 242 | ControlOpCode::SampleBattery => defmt::write!(fmt, "SampleBattery"), 243 | ControlOpCode::GetProgressorId => defmt::write!(fmt, "GetProgressorId"), 244 | ControlOpCode::GetCalibration => defmt::write!(fmt, "GetCalibration"), 245 | ControlOpCode::AddCalibrationPoint => defmt::write!(fmt, "AddCalibrationPoint"), 246 | ControlOpCode::DefaultCalibration => defmt::write!(fmt, "DefaultCalibration"), 247 | } 248 | } 249 | } 250 | 251 | /// Data point characteristic is where we receive data from the Progressor 252 | #[derive(Copy, Debug, Clone)] 253 | #[repr(C, packed)] 254 | pub struct DataPoint { 255 | /// Response code 256 | pub(crate) response_code: u8, 257 | /// Length of the data 258 | pub(crate) length: u8, 259 | /// Data 260 | pub(crate) value: [u8; MAX_PAYLOAD_SIZE], 261 | } 262 | 263 | // Thread-local buffer for preparing GATT data 264 | struct SyncUnsafeCell(UnsafeCell); 265 | 266 | unsafe impl Sync for SyncUnsafeCell {} 267 | 268 | static GATT_BUFFER: SyncUnsafeCell<[u8; MAX_PAYLOAD_SIZE + 2]> = 269 | SyncUnsafeCell(UnsafeCell::new([0; MAX_PAYLOAD_SIZE + 2])); 270 | 271 | impl AsGatt for DataPoint { 272 | const MIN_SIZE: usize = 3; 273 | const MAX_SIZE: usize = MAX_PAYLOAD_SIZE + 2; // +2 for response_code and length 274 | 275 | fn as_gatt(&self) -> &[u8] { 276 | let buffer = unsafe { &mut *GATT_BUFFER.0.get() }; 277 | 278 | buffer[0] = self.response_code; 279 | buffer[1] = self.length; 280 | 281 | if self.length > 0 { 282 | buffer[2..2 + self.length as usize] 283 | .copy_from_slice(&self.value[..self.length as usize]); 284 | } 285 | 286 | unsafe { core::slice::from_raw_parts(buffer.as_ptr(), 2 + self.length as usize) } 287 | } 288 | } 289 | 290 | impl FromGatt for DataPoint { 291 | fn from_gatt(data: &[u8]) -> Result { 292 | Ok(DataPoint::new(data[0], data[1], &data[2..])) 293 | } 294 | } 295 | 296 | impl Default for DataPoint { 297 | fn default() -> Self { 298 | Self { 299 | response_code: 0, 300 | length: 0, 301 | value: [0; MAX_PAYLOAD_SIZE], 302 | } 303 | } 304 | } 305 | 306 | impl DataPoint { 307 | /// Create a new data point with specified response code, length and data 308 | pub fn new(response_code: u8, length: u8, data: &[u8]) -> Self { 309 | let mut value = [0; MAX_PAYLOAD_SIZE]; 310 | let len = length.min(MAX_PAYLOAD_SIZE as u8) as usize; 311 | let copy_len = len.min(data.len()); 312 | if copy_len > 0 { 313 | value[..copy_len].copy_from_slice(&data[..copy_len]); 314 | } 315 | 316 | Self { 317 | response_code, 318 | length, 319 | value, 320 | } 321 | } 322 | 323 | /// Send data point to the channel 324 | pub fn send(&self, channel: &'static DataPointChannel) { 325 | if channel.try_send(*self).is_err() { 326 | error!("Failed to send data point: channel full or receiver dropped"); 327 | } else { 328 | trace!("Sent data point successfully"); 329 | } 330 | } 331 | 332 | /// Create a weight measurement data point 333 | pub fn weight_measurement(weight: f32, timestamp: u32) -> Self { 334 | Self::from(ResponseCode::WeightMeasurement(weight, timestamp)) 335 | } 336 | } 337 | 338 | impl Format for DataPoint { 339 | fn format(&self, fmt: defmt::Formatter) { 340 | defmt::write!( 341 | fmt, 342 | "Code: {}, Length: {}, Data: {:x}", 343 | self.response_code, 344 | self.length, 345 | &self.value[0..self.length as usize] 346 | ); 347 | } 348 | } 349 | 350 | impl From for DataPoint { 351 | fn from(response_code: ResponseCode) -> Self { 352 | Self { 353 | response_code: response_code.op_code(), 354 | length: response_code.length(), 355 | value: response_code.value(), 356 | } 357 | } 358 | } 359 | 360 | /// Data point response code 361 | #[derive(Copy, Clone, Debug)] 362 | #[repr(u8)] 363 | pub enum ResponseCode { 364 | /// Response to battery voltage sampling command 365 | SampleBatteryVoltage(u32), 366 | /// Each measurement is sent together with a timestamp where the timestamp is the number of microseconds since the measurement was started 367 | WeightMeasurement(f32, u32), 368 | /// Low power warning indicating that the battery is empty. The Progressor will turn itself off after sending this warning 369 | LowPowerWarning, 370 | /// Response to app version request command 371 | AppVersion(&'static [u8]), 372 | /// Response to progressor ID request command 373 | ProgressorId([u8; DEVICE_ID_SIZE]), 374 | } 375 | 376 | impl Format for ResponseCode { 377 | fn format(&self, fmt: defmt::Formatter) { 378 | match self { 379 | ResponseCode::SampleBatteryVoltage(voltage) => { 380 | defmt::write!(fmt, "SampleBatteryVoltage: {}", voltage) 381 | } 382 | ResponseCode::WeightMeasurement(weight, timestamp) => { 383 | defmt::write!( 384 | fmt, 385 | "WeightMeasurement: Weight: {}, Timestamp: {}", 386 | weight, 387 | timestamp 388 | ) 389 | } 390 | ResponseCode::LowPowerWarning => defmt::write!(fmt, "LowPowerWarning"), 391 | ResponseCode::AppVersion(version) => defmt::write!(fmt, "AppVersion: {:x}", version), 392 | ResponseCode::ProgressorId(id) => defmt::write!(fmt, "ProgressorId: {:x}", id), 393 | } 394 | } 395 | } 396 | 397 | impl ResponseCode { 398 | /// Get the operation code for this response 399 | fn op_code(&self) -> u8 { 400 | match self { 401 | ResponseCode::SampleBatteryVoltage(..) 402 | | ResponseCode::AppVersion(..) 403 | | ResponseCode::ProgressorId(..) => 0x00, 404 | ResponseCode::WeightMeasurement(..) => 0x01, 405 | ResponseCode::LowPowerWarning => 0x04, 406 | } 407 | } 408 | 409 | /// Get the length of the data for this response 410 | fn length(&self) -> u8 { 411 | match self { 412 | ResponseCode::SampleBatteryVoltage(..) => 4, 413 | ResponseCode::WeightMeasurement(..) => 8, 414 | ResponseCode::LowPowerWarning => 0, 415 | ResponseCode::AppVersion(version) => version.len() as u8, 416 | ResponseCode::ProgressorId(..) => DEVICE_ID_SIZE as u8, 417 | } 418 | } 419 | 420 | /// Get the value bytes for this response 421 | fn value(&self) -> [u8; MAX_PAYLOAD_SIZE] { 422 | let mut value = [0; MAX_PAYLOAD_SIZE]; 423 | match self { 424 | ResponseCode::SampleBatteryVoltage(voltage) => { 425 | value[0..4].copy_from_slice(&voltage.to_le_bytes()); 426 | } 427 | ResponseCode::WeightMeasurement(weight, timestamp) => { 428 | value[0..4].copy_from_slice(&weight.to_le_bytes()); 429 | value[4..8].copy_from_slice(×tamp.to_le_bytes()); 430 | } 431 | ResponseCode::LowPowerWarning => (), 432 | ResponseCode::ProgressorId(id) => { 433 | // Reverse the bytes as they are LE 434 | let mut reversed = *id; 435 | reversed.reverse(); 436 | value[..DEVICE_ID_SIZE].copy_from_slice(&reversed); 437 | } 438 | ResponseCode::AppVersion(version) => { 439 | value[0..version.len()].copy_from_slice(version); 440 | } 441 | }; 442 | value 443 | } 444 | } 445 | -------------------------------------------------------------------------------- /taplo.toml: -------------------------------------------------------------------------------- 1 | include = [ 2 | ".cargo/config.toml", 3 | "Cargo.toml", 4 | "rust-toolchain.toml", 5 | "rustfmt.toml", 6 | ] 7 | 8 | [formatting] 9 | align_entries = true 10 | reorder_keys = true 11 | reorder_arrays = true 12 | --------------------------------------------------------------------------------