47 Commits
power ... main

Author SHA1 Message Date
sirlilpanda
99b458e93b auto commited 2026-03-09 10:47:12 +13:00
sirlilpanda
4b48a1a61b auto commited 2026-03-09 10:47:12 +13:00
sirlilpanda
d8f066e072 auto commited 2026-03-09 10:47:12 +13:00
sirlilpanda
21562a28f3 auto commited 2026-03-09 10:47:12 +13:00
sirlilpanda
28aada4ef7 auto commited 2026-03-09 10:47:10 +13:00
sirlilpanda
7e877eacac auto commited 2026-03-09 10:47:10 +13:00
sirlilpanda
ac5d2d9655 auto commited 2026-03-09 10:47:10 +13:00
sirlilpanda
8dbbb4dfea auto commited 2026-03-09 10:47:10 +13:00
sirlilpanda
508ac0c534 auto commited 2026-03-09 10:46:12 +13:00
sirlilpanda
2c89991d23 auto commited 2026-03-09 10:46:12 +13:00
sirlilpanda
b473a78ef1 auto commited 2026-03-09 10:46:12 +13:00
sirlilpanda
f06bf61ee5 auto commited 2026-03-09 10:46:12 +13:00
sirlilpanda
3534683f47 auto commited 2026-03-09 10:46:12 +13:00
sirlilpanda
74a5c90e18 auto commited 2026-03-09 10:46:10 +13:00
sirlilpanda
02f6063051 auto commited 2026-03-09 10:46:10 +13:00
sirlilpanda
6896ed2822 auto commited 2026-03-09 10:46:10 +13:00
sirlilpanda
6c1505d6da auto commited 2026-03-09 10:46:10 +13:00
d3dec943a0 Merge pull request 'keyboard_interface_fix' (#2) from keyboard_interface_fix into main
Reviewed-on: #2
2026-02-19 00:48:14 -08:00
sirlilpanda
45772a7dec moved pull downs to MCU sheet 2026-02-09 10:39:24 +13:00
sirlilpanda
2269c4def1 moved pull downs from keyboard interface to here to avoid duplacates 2026-02-09 10:38:43 +13:00
f80573ab1f Merge pull request 'removing_github_actions' (#3) from removing_github_actions into main
Reviewed-on: #3
2026-01-22 17:44:08 -08:00
f78c7157eb auto commited 2026-01-23 14:42:50 +13:00
a3dda2ce81 auto commited 2026-01-23 14:42:50 +13:00
fe279ea87c auto commited 2026-01-23 14:42:50 +13:00
ad10ed6c61 auto commited 2026-01-23 14:42:50 +13:00
8a9e7c5548 auto commited 2026-01-23 14:42:50 +13:00
3697a2548e auto commited 2026-01-23 14:42:48 +13:00
0b667a4af2 auto commited 2026-01-23 14:42:48 +13:00
2a21b2c892 auto commited 2026-01-23 14:42:48 +13:00
e3d5cd219e auto commited 2026-01-23 14:42:48 +13:00
126f8b2806 auto commited 2026-01-23 14:42:48 +13:00
62907b10c7 get removed egg 2026-01-23 14:42:26 +13:00
903b09e8ca updated readme slightly it still needs work 2026-01-23 14:42:11 +13:00
91e6ed00c2 added a temp dir 2026-01-23 14:41:48 +13:00
56c30b7241 hooks setup script 2026-01-23 14:41:24 +13:00
c4010680b8 kicad cli hook 2026-01-23 14:41:04 +13:00
e42b38e44f keyboard interface now has display interface with uart and perphieral interface with i2c in a multimaster config 2026-01-23 14:34:06 +13:00
29513d59fe interface is now wired up to the micro 2026-01-23 14:33:21 +13:00
179cd7651d added display enable 2026-01-23 14:32:42 +13:00
0243b330dc merged i2c for keyboard and power perfs 2026-01-23 14:30:18 +13:00
8415c5d871 keyboard and power perfs are now on the same i2c bus with the perfs being on another 2026-01-23 14:29:49 +13:00
2f45d73360 merged perpherial and display interfaces in to 1 uart bus 2026-01-23 13:28:26 +13:00
8e0c65e06e added another bus buffer for the perphieral interface
so it can either be on the left or right hand side of the keyboard
2026-01-22 00:00:36 -08:00
d158fddf4c forgot to connect enable label 2026-01-22 00:00:09 -08:00
6dc5400d7b added buffers for keyboard, peripherals and display interfaces 2026-01-21 23:59:56 -08:00
262a80f285 connect MCU to keyboard interface 2026-01-21 23:59:44 -08:00
a67083e82e addded pefault pin configuration and connect mcu to keyboard interface 2026-01-21 23:59:29 -08:00
31 changed files with 21019 additions and 3218 deletions

41
.github/rename.py vendored
View File

@@ -1,41 +0,0 @@
from pathlib import Path
import os
import sys
from ruamel.yaml import YAML
# renames the main project in the template dir and in the project settings
def rename_project(project_name, new_name = "template"):
"""renames the kicad project"""
project_path = str(Path(f"Hardware/{project_name}_PROJECT"))
files = os.listdir(project_path)
for index, file in enumerate(files):
print(file)
os.rename(os.path.join(project_path, file), os.path.join(project_path, file.replace(project_name, new_name)))
os.rename(project_path, project_path.replace(project_name, new_name))
pcb_path = str(Path(f"Hardware/{project_name}_PCB"))
os.rename(pcb_path, pcb_path.replace(project_name, new_name))
doc_path = str(Path(f"Hardware/{project_name}_DOCS"))
os.rename(doc_path, doc_path.replace(project_name, new_name))
def main():
yaml : YAML = YAML()
with open(Path("project_settings.yaml"), "r") as yaml_file:
settings = yaml.load(yaml_file)
print(f"{settings['project_name']=}")
print(f"{settings=}")
rename_project(settings["project_name"], sys.argv[1])
settings["project_name"] = sys.argv[1]
settings["needs_setup"] = False
# have to just print it out a rewrite over .project_settings because this guy
# is dumb and doesnt just let you write these out to string
with open(Path("project_settings.yaml"), "w", encoding=("utf-8")) as file:
yaml.dump(settings, file)
if __name__ == "__main__":
main()

View File

@@ -1,46 +0,0 @@
# look it would be piss easy to just keep it as a CSV but we can post process to add cool things like cost to each of the parts
import csv
import sys
import chevron
import datetime
from pprint import pprint
file_path_delimter = "\\" if sys.platform == "win32" else "/"
def load_bom(filename : str) -> dict:
out_dict = {
"parts" : [],
"time" : str(datetime.datetime.now().time()),
"date" : str(datetime.datetime.now().date().strftime("%d-%m-%Y")),
"total_cost" : 0,
"total_parts" : 0,
"project_name" : filename.strip(".csv").strip("bom").split(file_path_delimter)[-1]
}
with open(filename, "r") as csv_file:
for row in csv.DictReader(csv_file):
part_cost = 0
out_dict["total_parts"] += 1
out_dict["parts"].append(
{
"Reference" : row["Refs"],
"Value" : row["Value"],
"Quantity" : row["Qty"],
"part_number" : row["Footprint"],
"cost" : part_cost, # add some API call somewhere here
}
)
return out_dict
def main():
report_hash = load_bom(sys.argv[1])
# pprint(report_hash)
with open(sys.argv[2], "r") as txt:
out = chevron.render(txt.read(), report_hash)
with open(sys.argv[3], "w") as md:
md.write(out)
if __name__ == "__main__":
main()

View File

@@ -1,57 +0,0 @@
from violation import Violation
import datetime
import json
from pprint import pprint
def process_violation_list(drc_json : dict, list_name : str) -> None:
if list_name in drc_json.keys():
unconnected_items_errors = []
unconnected_items_warns = []
number_of_errors = 0
number_of_warns = 0
for violation in drc_json[list_name]:
v = Violation(violation, "drc")
if (v.violation_type == "error"):
unconnected_items_errors.append(v)
number_of_errors += 1
if (v.violation_type == "warn"):
unconnected_items_warns.append(v)
number_of_warns += 1
drc_json[list_name] = {
"errors" : unconnected_items_errors,
"warns" : unconnected_items_warns,
"number_of_errors" : number_of_errors,
"number_of_warns" : number_of_warns,
}
else:
drc_json.setdefault(list_name, {})
drc_json[list_name].setdefault("number_of_errors", 0)
drc_json[list_name].setdefault("number_of_warns", 0)
def process_report(report : str) -> dict:
out_dict : dict = json.loads(report)
number_of_errors = 0;
number_of_errors = 0;
process_violation_list(out_dict, "unconnected_items")
process_violation_list(out_dict, "violations")
process_violation_list(out_dict, "schematic_parity")
out_dict.setdefault(
"total_errors",
out_dict["unconnected_items"]["number_of_errors"] +
out_dict["violations"]["number_of_errors"] +
out_dict["schematic_parity"]["number_of_errors"]
)
out_dict.setdefault(
"total_warns",
out_dict["unconnected_items"]["number_of_warns"] +
out_dict["violations"]["number_of_warns"] +
out_dict["schematic_parity"]["number_of_warns"]
)
return out_dict

View File

@@ -1,53 +0,0 @@
from violation import Violation
import datetime
import json
class Sheet:
def __init__(self, json_obj : dict) -> None:
self.name : str = json_obj["path"]
self.name_md : str = self.name.replace(" ", "-")
self.number_of_errors : int = 0
self.number_of_warns : int = 0
self.errors : list[Violation] = list()
self.warns : list[Violation] = list()
for violation in json_obj["violations"]:
v = Violation(violation, "erc")
if (v.violation_type == "error"):
self.errors.append(v)
self.number_of_errors += 1
if (v.violation_type == "warn"):
self.warns.append(v)
self.number_of_warns += 1
def to_dict(self) -> dict:
out_dict = self.__dict__
errors_strings = []
warns_strings = []
for error in out_dict["errors"]:
errors_strings.append(error.__dict__)
out_dict["errors"] = errors_strings
for warn in out_dict["warns"]:
warns_strings.append(warn.__dict__)
out_dict["warns"] = warns_strings
return out_dict
def process_report(report : str) -> dict:
out_dict : dict = json.loads(report)
sheets = [Sheet(sheet) for sheet in out_dict["sheets"]]
out_dict["sheets"] = [sheet.to_dict() for sheet in sheets]
out_dict.setdefault(
"total_errors",
sum(sheet.number_of_errors for sheet in sheets)
)
out_dict.setdefault(
"total_warns",
sum(sheet.number_of_warns for sheet in sheets)
)
return out_dict

View File

@@ -1,50 +0,0 @@
# usage: python process_json_reports.py report.json template.mustache outfile.md project_name
import chevron
import sys
import datetime
import json
import process_erc_json
import process_drc_json
from pprint import pprint
def load_report(filename : str, project_name : str) -> dict:
out_dict : dict = {}
with open(filename, "r") as js:
if ("erc" in filename.lower()):
out_dict = process_erc_json.process_report(js.read())
if ("drc" in filename.lower()):
out_dict = process_drc_json.process_report(js.read())
out_dict.setdefault(
"time",
str(datetime.datetime.now().time())
)
out_dict.setdefault(
"date",
str(datetime.datetime.now().date().strftime("%d-%m-%Y"))
)
out_dict.setdefault(
"project_name",
project_name
)
out_dict.setdefault(
"has_violations",
True if out_dict["total_warns"] + out_dict["total_errors"] else None
)
return out_dict
def main():
report_hash = load_report(sys.argv[1], sys.argv[4])
# pprint(report_hash)
with open(sys.argv[2], "r") as txt:
out = chevron.render(txt.read(), report_hash)
with open(sys.argv[3], "w") as md:
md.write(out)
if __name__ == "__main__":
main()

View File

@@ -1,94 +0,0 @@
import chevron
import sys
import datetime
import json
import glob
from pathlib import Path
from pprint import pprint
# erc
# {
# "project_name" : "string",
# "passing_erc" : "bool",
# "erc_summary_link" : "link",
# }
# drc
# {
# "project_name" : "string",
# "passing_drc" : "bool",
# "drc_summary_link" : "link",
# }
# project
# {
# "project_name" : "string",
# "project_link" : "link",
# "schematic_link" : "link",
# "gerber_link" : "link",
# "bom_report_link" : "link",
# "bom_csv_link" : "link"
# }
EXTRAS_FILENAME = "readme_extras.json"
def load_json_file(filename : str) -> dict:
with open(Path(f"{filename}/{filename}"), "r") as js:
return json.loads(js.read())
def create_hash(filenames : list[str]) -> dict:
report_outs = filenames
report_outs.remove("readme_extras.json")
extras = {}
with open("readme_extras.json", "r") as js:
extras = json.loads(js.read())
reports_dicts : list[dict] = []
for report_name in report_outs:
reports_dicts.append(load_json_file(report_name))
readme_hash = {
**extras,
"projects" : [],
"did_error" : False,
"multiple_projects" : None
}
for report in reports_dicts:
for project in readme_hash["projects"]:
if project["project_name"] == report["project_name"]:
for key in report.keys():
project.setdefault(key, report[key])
break
else:
readme_hash["projects"].append(report)
pprint(readme_hash)
for project in readme_hash["projects"]:
readme_hash["did_error"] |= not project["passing_erc"]
readme_hash["did_error"] |= not project["passing_drc"]
project.setdefault("passing_erc_emoji", "" if project["passing_erc"] == "true" else "")
project.setdefault("passing_drc_emoji", "" if project["passing_drc"] == "true" else "")
readme_hash["multiple_projects"] = True if len(readme_hash["projects"]) > 1 else None
pprint(readme_hash)
return readme_hash
def main():
print(sys.argv)
readme_template, *args = sys.argv[1:]
report_hash = create_hash(args)
with open(readme_template, "r") as txt:
out = chevron.render(txt.read(), report_hash)
with open("README.md", "w") as md:
md.write(out)
if __name__ == "__main__":
main()

View File

@@ -1,3 +0,0 @@
chevron
pathlib
ruamel.yaml

View File

@@ -1,18 +0,0 @@
class Violation:
def __init__(self, violation : dict, violation_report_type : str = ["erc", "drc"]) -> None:
self.violation_type : str = \
"warn" if violation["severity"] == "warning" else "error"
self.name : str = violation["description"]
self.content : str = ""
# this violation_report_type purely exists because of a bug
# in kicads json output format where json output on erc reports
# the position in decimeters
for item in violation["items"]:
item_string = item["description"]
x : float = float(item["pos"]["x"]) * (100.0 if (violation_report_type == "erc") else 1.0)
y : float = float(item["pos"]["y"]) * (100.0 if (violation_report_type == "erc") else 1.0)
# print(f"{x=}")
item_string += f" at [x = {x:.4}mm, y = {y:.4}mm]\n"
self.content += item_string

View File

@@ -1,29 +0,0 @@
{{! hash schema }}
{{! {
"project_name" : "the name of the project",
"time" : "the name of the project",
"date" : "the name of the project",
"total_parts" : "number",
"total_cost" : "number",
"parts" : [
{
"Reference" : "part_reference" ,
"Value" : "the value of the part" ,
"Quantity" : "number" ,
"part_number" : "the part number" ,
"cost" : "number"
}
]
} }}
# 📄 BOM for {{project_name}} 📄
report created at {{time}} on {{date}}.
{{project_name}} has a total of {{total_parts}} parts with a cost of ${{total_cost}}.
| Reference | Value | Quantity | part number | cost |
| --------- | ----- | -------- | ----------- | ---- |
{{#parts}}
| {{Reference}} | {{Value}} | {{Quantity}} | {{part_number}} | ${{cost}} |
{{/parts}}
| | total | {{total_parts}} | total | ${{total_cost}} |

View File

@@ -1,133 +0,0 @@
{{! hash schema }}
{{! {
"date" : "the date of creation",
"time" : "the time of creation",
"total_warns" : "number",
"total_errors" : "number",
"has_violations" : "flag to say if the project has a violation",
"violations" : {
"number_of_errors" : "number",
"number_of_warns" : "number",
"warns" : [
{
"name" : "string",
"content" : "string"
}
],
"errors" : [
{
"name" : "string",
"content" : "string"
}
]
},
"unconnected_items" : {
"number_of_errors" : "number",
"number_of_warns" : "number",
"warns" : [
{
"name" : "string",
"content" : "string"
}
],
"errors" : [
{
"name" : "string",
"content" : "string"
}
]
},
"schematic_parity" :{
"number_of_errors" : "number",
"number_of_warns" : "number",
"warns" : [
{
"name" : "string",
"content" : "string"
}
],
"errors" : [
{
"name" : "string",
"content" : "string"
}
]
}
} }}
# 📟 {{project_name}} DRC report 📟
report created at {{time}} 🕧 on {{date}} 🗓️.
the design rule check found:
- {{total_errors}} errors in your design 😱
- {{total_warns}} warns in your design 🫨
{{#has_violations}}
number of errors and warns breakdown per sheet:
| error type | number of errors 🔴 | number of warns 🟠 |
| ----------------------------------------- | -------------------------------------- | ------------------------------------- |
| [violations](#violations) ❌ | {{violations.number_of_errors}} | {{violations.number_of_warns}} |
| [unconnected items](#unconnected-items) ⛓️‍💥| {{unconnected_items.number_of_errors}} | {{unconnected_items.number_of_warns}} |
| [schematic parity](#schematic-parity) 🔗 | {{schematic_parity.number_of_errors}} | {{schematic_parity.number_of_warns}} |
| total | {{total_errors}} | {{total_warns}} |
below is a more in-depth breakdown of the errors and warns per error type.
note you should only use this for quickly checking that the project
you uploaded has no error or warn. YOU SHOULD *NOT* use this to actually
run the drc in kicad so you can see where is erroring.
# violations
## errors : {{violations.number_of_errors}}
{{#violations.errors}}
### {{name}}
{{content}}
{{loction}}
{{/violations.errors}}
## warns : {{violations.number_of_warns}}
{{#violations.warns}}
### {{name}}
{{content}}
{{loction}}
{{/violations.warns}}
# unconnected items
## errors : {{unconnected_items.number_of_errors}}
{{#unconnected_items.errors}}
### {{name}}
{{content}}
{{loction}}
{{/unconnected_items.errors}}
## warns : {{unconnected_items.number_of_warns}}
{{#unconnected_items.warns}}
### {{name}}
{{content}}
{{loction}}
{{/unconnected_items.warns}}
# schematic parity
## errors : {{schematic_parity.number_of_errors}}
{{#schematic_parity.errors}}
### {{name}}
{{content}}
{{loction}}
{{/schematic_parity.errors}}
## warns : {{schematic_parity.number_of_warns}}
{{#schematic_parity.warns}}
### {{name}}
{{content}}
{{loction}}
{{/schematic_parity.warns}}
{{/has_violations}}
{{^has_violations}}
the design had no errors or warns, good job. ✅✅
{{/has_violations}}

View File

@@ -1,73 +0,0 @@
{{! hash schema }}
{{! {
"date" : "the date of creation",
"time" : "the time of creation",
"total_warns" : "number",
"total_errors" : "number",
"has_violations" : "flag to say if the project has a violation",
"sheets" : [
{
"name" : "string",
"name_md" : "just name but i replaced the spaces with hyphens",
"number_of_errors" : "number",
"number_of_warns" : "number",
"warns" : [
{
"name" : "string",
"content" : "string"
}
],
"errors" : [
{
"name" : "string",
"content" : "string"
}
]
}
]
} }}
# ⚡{{project_name}} ERC report ⚡
report created at {{time}} 🕧 on {{date}} 🗓️.
the electronic rules check found:
- {{total_errors}} errors in your design 😱
- {{total_warns}} warns in your design 🫨
{{#has_violations}}
number of errors and warns breakdown per sheet:
| sheet name 📄| number of errors 🔴 | number of warns 🟠 |
| ---------- | ---------------- | --------------- |
{{#sheets}}
| [{{name}}](#{{name_md}}) | {{number_of_errors}} | {{number_of_warns}} |
{{/sheets}}
| total | {{total_errors}}| {{total_warns}}|
below is a more in-depth breakdown of the errors and warn per sheets.
note you should only use this for quickly checking that the project
you uploaded has no error or warn. YOU SHOULD *NOT* use this to actually
run your ERC in kicad so you can see where is erroring.
{{#sheets}}
# {{name}}
## errors : {{number_of_errors}}
{{#errors}}
### {{name}}
{{content}}
{{/errors}}
## warns : {{number_of_warns}}
{{#warns}}
### {{name}}
{{content}}
{{/warns}}
{{/sheets}}
{{/has_violations}}
{{^has_violations}}
the design had no errors or warns, good job. ✅✅
{{/has_violations}}

View File

@@ -1,5 +0,0 @@
# how the templates work
templates work by using a json file to fill in the templating spots. for more information on the templates checkout [mustache templates](https://mustache.github.io/). these templates use a json file format as what they call a "hash" to fill out the templates. the hashs for each of these templates are layout at the top of each of the `.mustache` files in a comment. These are also the hashes outputted by the processing scripts. usages for these scripts are at the top of the file.
if any schema says bool this actually means the value is either something or either doesnt exist/null.

View File

@@ -1,153 +0,0 @@
{{! hash schema }}
{{! {
"badge" : "the ci badge",
"lastest_action_run_link" : "link to the lastest action",
"did_error" : "to check if errors occured in the pipeline",
"title" : "the tiltle of the project, can be set in project_settings or it will use the repo name",
"multiple_projects" : "bool",
"projects" : [
{
"project_name" : "string",
"project_link" : "link",
"passing_erc" : "bool",
"passing_erc_emoji" : "string",
"erc_summary_link" : "link",
"passing_drc" : "bool",
"passing_drc_emoji" : "string",
"drc_summary_link" : "link",
"gerber_link" : "link",
"schematic_link" : "link",
"bom_report_link" : "link",
"bom_csv_link" : "link"
}
]
} }}
# kicad project {{title}}
{{badge}}
{{! [![.github/workflows/main.yaml](https://github.com/sirlilpanda/kicad-project-template/actions/workflows/main.yaml/badge.svg)](https://github.com/sirlilpanda/kicad-project-template/actions/workflows/main.yaml) }}
a cool table showing the workflow of all the kicad projects.
| project_name | DRC | ERC |
| ------------ | --- | --- |
{{#projects}}
| {{project_name}} | [{{passing_erc_emoji}}]({{erc_summary_link}})| [{{passing_drc_emoji}}]({{drc_summary_link}}) |
{{/projects}}
for a quick guide check [project setup](#project-setup)
This is a simple project template for new kicad projects. This template has some basic setup already completed such as workflows for auto creating all the things you forget when creating a kicad project such as:
{{^multiple_projects}}
{{#projects}}
- [gerbers]({{gerber_link}})
- [bom]({{bom_report_link}})
- [schematic pdf]({{schematic_link}})
{{/projects}}
{{/multiple_projects}}
{{#multiple_projects}}
| project_name | schematic | bom | bom report | gerbers |
| ------------ | --------- | --- | ---------- | ------- |
{{#projects}}
| [{{project_name}}]({{project_link}}) | [{{project_name}}_schematic.pdf]({{schematic_link}}) | [{{project_name}}_bill_of_materials.csv]({{bom_csv_link}}) | [{{project_name}}_bom_report.md]({{bom_report_link}}) | [{{project_name}}_grbr.zip]({{gerber_link}}) |
{{/projects}}
{{/multiple_projects}}
This workflow will also run the design rules check on the PCB and schematic to ensure that you upload a working PCB. These reports are uploaded as summaries within the github [actions tab]({{lastest_action_run_link}}). This template has a simple schematic PCB in it (because DRC fails on an empty PCB). Shown below is the example PCB.
![example pcb with battery diode and resistor](res/image.png)
besides from that the project also has:
- common predefined trace widths
- smallest vias size [JLCPBC allows](https://jlcpcb.com/capabilities/Capabilities#Drilling)
- custom net colours in the schematic editor
- `red` for +V
- `blue` for -V
- `grey` for ground
to create a repo from this template follow this [guide](https://docs.github.com/en/repositories/creating-and-managing-repositories/creating-a-repository-from-a-template)
contained in this template are:
---
- `.github/` : all files relating to github actions and other admin see [here](https://docs.github.com/en/communities/setting-up-your-project-for-healthy-contributions) for more example of what can be placed in it
- `report_processing` : where the python scripts are stored for processing the json report data from kicad
- `report_templates` : where the template for said reports are stored
- `workflows/` : this is where the github actions are kept
- `main.yaml` : the main github action that will auto generate all files required and run DRC and ERC
- `rename.py` : the script for renaming the project
- `hardware/` : this is where the kicad projects live note this can be changed
- `docs/` : this is where the generate docs are placed by default
- `BOM/` : where the bill of materials and price breakdown are kept
- `bill_of_materials.csv`: the auto generated bom for the kicad project
- `bom_report.md` : a report for the bill of materials
- `template_schematic.pdf` : the schematic for the kicad project, auto generated by the github action
- `pcbs/` : this is where the auto generated gerbers for the kicad project are stored
- `res/` : where resources are stored for the README
- `.gitignore`: a slightly modified gitignore from the [standard one](https://github.com/github/gitignore/blob/main/KiCad.gitignore)
- `project_settings.yaml` : where the settings for this project is stored
- `README.md` : this file, suggest you change this one creating your project
## project settings
there are currently very few project settings that can be changed (will will be change in the future) these are:
| setting | description |
| --------------------------- | ----------------------------------------------------------------- |
| has_been_set_up | a flag to tell the setup action if the project has been set up |
| project_name | the name of the project, this will be set to the name of the repo |
| production_formats | the output production format for the PCBs |
| dynamic_read_me | allow the readme to be updated using the given template |
| bom_template_path | the template used to write the bom report files |
| erc_report_template_path | the template used to write the erc report files |
| drc_report_template_path | the template used to write the drc report files |
| readme_template_path | the template used to write projects readme |
| schematic_output_name | the name suffix of the generated schematics |
| bom_csv_output_name | the name suffix of the generated bom csv file |
| bom_report_output_name | the name suffix of the generated bom report |
| production_file_output_name | the name suffix of the generated production file |
| schematic_output_path | the output path of the generated schematics files |
| bom_csv_output_path | the output path of the generated bom csv file |
| bom_report_output_path | the output path of the generated bom report |
| production_file_output_path | the output path of the generated production file |
## project setup
### creating a new repo with the template
creating a new template from a repo is simple:
1. click on the button in the top right hand corner called `use this template`
![alt text](res/image-5.png)
2. when the drop down menu appears click on `create a new repository`
![alt text](res/image-6.png)
3. once you click you will be brought to this page, note that the repo name you choose here will be the name that you kicad project is called.
![alt text](res/image-7.png)
after these steps you then need to configure the repo settings to do their magic see [configuring repo settings](#configuring-repo-settings) for what to do next.
### configuring repo settings
once you have created a new repo with the template, you ill have to configure the github action settings. this is because you will get an error that looks something along these lines:
![alt text](res/image-4.png)
where the action can not commit the changes due to not having permissions follow these steps:
1. open the repo setting
![alt text](res/image-1.png)
2. then head in to actions : General
![alt text](res/image-2.png)
3. then scroll down to workflow permissions and ensure that both
`Read and write permissions` and `Allow GitHub Actions to create and approve pull requests` are ticked as seen below
![alt text](res/image-3.png)
this should fix the problem if not, go harass stack overflow they need it
Once all of these steps have been followed the workflow should be passing, however the `README.md` will only update on the next push request.
## editing the readme
As this repo can and will automatically update the repo corresponding to the given readme template. If you dont want to use this you can always disable this by setting the `dynamic_read_me` to `false`. but if you want some very cool features like auto updating tables to show what projects are passing the rules check or simple links to parts of your directory. then have a look at the template readme and learn [mustache](https://mustache.github.io/)
## improvements

View File

@@ -1,539 +0,0 @@
on:
push:
branches: [main, master, workflow_testing]
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
env:
ERC_JOB_NAME : "⚡ERC report⚡"
DRC_JOB_NAME : "📟 DRC report 📟"
jobs:
setup_new_project: # this job only exists for project creation
runs-on: ubuntu-latest
name: set up project
steps:
- name: Checkout
uses: actions/checkout@v4
# reads the project_setting.yaml file allowing you to access it with steps.id.outputs.[key]
- name: read yaml file
uses: juliojimenez/yamler@v1.1.0
id: yaml
with:
yaml-file: ${{ github.workspace }}/project_settings.yaml
- name: check setup
run: |
echo ${{steps.yaml.outputs.needs_setup}}
- name: Setting up Python and chevron to processes failed reports
# workflows really need some more work done on them
if: ${{ !cancelled() && steps.yaml.outputs.needs_setup == 'true' && github.repository != 'sirlilpanda/kicad-project-template'}}
uses: actions/setup-python@v5
with:
python-version: '3.10'
cache: 'pip'
- name: installing requirements
if: ${{ !cancelled() && steps.yaml.outputs.needs_setup == 'true' && github.repository != 'sirlilpanda/kicad-project-template'}}
run: pip install -r ${{ github.workspace }}/.github/report_processing/requirements.txt
- name: rename project if setup has not been completed
if: ${{ !cancelled() && steps.yaml.outputs.needs_setup == 'true' && github.repository != 'sirlilpanda/kicad-project-template'}}
run: python ${{ github.workspace }}/.github/rename.py ${{github.event.repository.name}}
- name: commit production files
if: ${{ !cancelled() && steps.yaml.outputs.needs_setup == 'true' && github.repository != 'sirlilpanda/kicad-project-template'}}
uses: EndBug/add-and-commit@v9
with:
default_author: github_actions
message: 'setup project'
push: true
add: "."
setup_matrixs:
outputs:
projects: ${{ steps.projects.outputs.projects }}
runs-on: ubuntu-latest
name: matrix setup 🗓️
needs: setup_new_project
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setting up Python
# workflows really need some more work done on them
uses: actions/setup-python@v5
with:
python-version: '3.10'
cache: 'pip'
- name: installing requirements
run: pip install pyyaml
- name: creating list start
run:
echo -n "projects=[" >> temp.txt
# this find commad outputs path1,path2,path3 with out the .kicad_pro ext
# .kicad_pro ext is removed because the erc and drc steps want either a
# .kicad_sch or .kicad_pcb file it also makes it easier to name files
# with the project name
# this output will look like
# projects=["path/projet_name", "path/projet_name2", ...]
- name: get kicad project names
run:
find . -type f -name "*.kicad_pro" -exec sh -c 'echo -n "\"${0%.kicad_pro}\","' {} \; | sed 's/.\{1\}$//' >> temp.txt
- name: creating list end
run:
echo "]" >> temp.txt
- name: list output
run:
cat temp.txt
- name: creating list end
id: projects
run:
cat temp.txt >> "$GITHUB_OUTPUT"
# basename is used here to remove the rest of the path from the find
#
DRC:
runs-on: ubuntu-latest
name: "📟 DRC report 📟"
needs: setup_matrixs
strategy:
matrix:
project_path: ${{ fromJSON(needs.setup_matrixs.outputs.projects) }}
steps:
- name: check matrix
run: basename ${{ matrix.project_path }}
- name: setting env
run:
echo "PROJECT_NAME=$(basename ${{ matrix.project_path }})" >> $GITHUB_ENV
- name: Checkout
uses: actions/checkout@v4
- name: read-yaml-file
uses: juliojimenez/yamler@v1.1.0
id: yaml
with:
yaml-file: ${{ github.workspace }}/project_settings.yaml
- name: Setting up Python and chevron to processes reports
# workflows really need some more work done on them
uses: actions/setup-python@v5
with:
python-version: '3.10'
cache: 'pip'
- name: installing requirements
run: pip install -r ${{ github.workspace }}/.github/report_processing/requirements.txt
- name: Run KiCad DRC
id: drc
uses: sparkengineering/kicad-action@v4
with:
kicad_pcb: ${{ matrix.project_path }}.kicad_pcb
pcb_drc: true
report_format: json
pcb_drc_file: drc.json
- name: checking files were created
run:
ls -R
- name: creating DRC report in markdown
if: ${{ always() }}
run: python
${{ github.workspace }}/.github/report_processing/process_json_reports.py
${{ github.workspace }}/$(dirname ${{matrix.project_path}})/drc.json
${{ github.workspace }}/${{steps.yaml.outputs.drc_report_template_path}}
${{ github.workspace }}/${{ env.PROJECT_NAME }}_drc.md
${{ env.PROJECT_NAME }}
- name: upload report summary
if: ${{ always() }}
run: cat ${{ github.workspace }}/${{ env.PROJECT_NAME }}_drc.md >> $GITHUB_STEP_SUMMARY
- name: get summary url
if: ${{always()}}
id: exp
uses: pl-strflt/job-summary-url-action@v1
with:
job: "${{env.DRC_JOB_NAME}} (${{matrix.project_path}})"
- name: create files to upload
if: ${{always()}}
run: |
echo "{\"passing_drc\":\"${{steps.drc.conclusion != 'failure'}}\",\"project_name\":\"${{env.PROJECT_NAME}}\", \"drc_summary_link\":\"${{ steps.exp.outputs.job_summary_url }}\"}" >> ${{env.PROJECT_NAME}}_drc.json
- name: upload data for readme updating
if: ${{always()}}
uses: actions/upload-artifact@v4
with:
name: ${{env.PROJECT_NAME}}_drc.json
path: ${{env.PROJECT_NAME}}_drc.json
ERC:
runs-on: ubuntu-latest
name: "⚡ERC report⚡"
needs: setup_matrixs
strategy:
matrix:
project_path: ${{ fromJSON(needs.setup_matrixs.outputs.projects) }}
steps:
- name: check matrix
run: basename ${{ matrix.project_path }}
- name: setting env
run:
echo "PROJECT_NAME=$(basename ${{ matrix.project_path }})" >> $GITHUB_ENV
- name: setting env
run:
echo "PROJECT_NAME=$(basename ${{ matrix.project_path }})" >> $GITHUB_ENV
- name: Checkout
uses: actions/checkout@v4
- name: read-yaml-file
uses: juliojimenez/yamler@v1.1.0
id: yaml
with:
yaml-file: ${{ github.workspace }}/project_settings.yaml
- name: Setting up Python and chevron to processes reports
# workflows really need some more work done on them
uses: actions/setup-python@v5
with:
python-version: '3.10'
cache: 'pip'
- name: installing requirements
run: pip install -r ${{ github.workspace }}/.github/report_processing/requirements.txt
- name: Run KiCad ERC
id: erc
uses: sparkengineering/kicad-action@v4
with:
kicad_sch: ${{ matrix.project_path }}.kicad_sch
sch_erc: true
report_format: json
sch_erc_file: erc.json
- name: checking files were created
run:
ls -R
- name: creating ERC report in markdown
if: ${{ always() }}
run: python
${{ github.workspace }}/.github/report_processing/process_json_reports.py
${{ github.workspace }}/$(dirname ${{matrix.project_path}})/erc.json
${{ github.workspace }}/${{steps.yaml.outputs.erc_report_template_path}}
${{ github.workspace }}/${{ env.PROJECT_NAME }}_erc.md
${{ env.PROJECT_NAME }}
- name: upload report summary
if: ${{ always() }}
run: cat ${{ github.workspace }}/${{ env.PROJECT_NAME }}_erc.md >> $GITHUB_STEP_SUMMARY
- name: get summary url
if: ${{always()}}
id: exp
uses: pl-strflt/job-summary-url-action@v1
with:
job: "${{env.ERC_JOB_NAME}} (${{matrix.project_path}})"
- name: print summary url
if: ${{always()}}
run: echo '${{ steps.exp.outputs.job_summary_url }}'
shell: bash
- name: create files to upload
if: ${{always()}}
run: |
echo "{\"passing_erc\":\"${{steps.erc.conclusion != 'failure'}}\",\"project_name\":\"${{env.PROJECT_NAME}}\", \"erc_summary_link\":\"${{ steps.exp.outputs.job_summary_url }}\"}" >> ${{env.PROJECT_NAME}}_erc.json
- name: upload data for readme updating
if: ${{always()}}
uses: actions/upload-artifact@v4
with:
name: ${{env.PROJECT_NAME}}_erc.json
path: ${{env.PROJECT_NAME}}_erc.json
production_job:
runs-on: ubuntu-latest
name: creating production files bom sch gerbers 📂
needs: setup_matrixs
strategy:
matrix:
project_path: ${{ fromJSON(needs.setup_matrixs.outputs.projects) }}
steps:
- name: Checkout
uses: actions/checkout@v4
- name: read-yaml-file
uses: juliojimenez/yamler@v1.1.0
id: yaml
with:
yaml-file: ${{ github.workspace }}/project_settings.yaml
- name: setting env
run:
echo "PROJECT_NAME=$(basename ${{ matrix.project_path }})" >> $GITHUB_ENV
- name: setting env
run: | # | the / here is defined in the project settings
echo "schematic_file=${{env.PROJECT_NAME}}${{steps.yaml.outputs.schematic_output_name}}.pdf" >> $GITHUB_ENV
echo "bill_of_materials_file=${{env.PROJECT_NAME}}${{steps.yaml.outputs.bom_csv_output_name}}.csv" >> $GITHUB_ENV
echo "production_format_file=${{env.PROJECT_NAME}}${{steps.yaml.outputs.production_file_output_name}}.zip" >> $GITHUB_ENV
echo "bom_report_file=${{env.PROJECT_NAME}}${{steps.yaml.outputs.bom_report_output_name}}.md" >> $GITHUB_ENV
- name: checking envs
run:
echo "${{env.schematic_file}}"
echo "${{env.bill_of_materials_file}}"
echo "${{env.production_format_file}}"
echo "${{env.bom_report_file}}"
- name: setting env
run:
echo "PROJECT_NAME=$(basename ${{ matrix.project_path }})" >> $GITHUB_ENV
- name: setting env
run: | # | the / here is defined in the project settings
echo "schematic_file=${{env.PROJECT_NAME}}${{steps.yaml.outputs.schematic_output_name}}.pdf" >> $GITHUB_ENV
echo "bill_of_materials_file=${{env.PROJECT_NAME}}${{steps.yaml.outputs.bom_csv_output_name}}.csv" >> $GITHUB_ENV
echo "production_format_file=${{env.PROJECT_NAME}}${{steps.yaml.outputs.production_file_output_name}}.zip" >> $GITHUB_ENV
echo "bom_report_file=${{env.PROJECT_NAME}}${{steps.yaml.outputs.bom_report_output_name}}.md" >> $GITHUB_ENV
- name: checking envs
run:
echo "${{env.schematic_file}}"
echo "${{env.bill_of_materials_file}}"
echo "${{env.production_format_file}}"
echo "${{env.bom_report_file}}"
- name: Setting up Python and chevron to processes reports
# workflows really need some more work done on them
if: ${{ !cancelled() }}
uses: actions/setup-python@v5
with:
python-version: '3.10'
cache: 'pip'
- name: installing requirements
if: ${{ !cancelled() }}
run: pip install -r ${{ github.workspace }}/.github/report_processing/requirements.txt
- name: Export production files
id: production
uses: sparkengineering/kicad-action@v4
if: '!cancelled()'
with:
kicad_sch: ${{ matrix.project_path }}.kicad_sch
sch_pdf: true # Generate PDF
sch_bom: true # Generate BOM
kicad_pcb: ${{ matrix.project_path }}.kicad_pcb
pcb_gerbers: true # Generate Gerbers
- name: Moving production files to correct location
if: ${{ !cancelled() && steps.production.conclusion == 'success' }}
run: |
mv ${{ github.workspace }}/$(dirname ${{matrix.project_path}})/sch.pdf ${{ github.workspace }}/${{env.schematic_file}}
mv ${{ github.workspace }}/$(dirname ${{matrix.project_path}})/bom.csv ${{ github.workspace }}/${{env.bill_of_materials_file}}
mv ${{ github.workspace }}/$(dirname ${{matrix.project_path}})/gbr.zip ${{ github.workspace }}/${{env.production_format_file}}
- name: creating BOM report in markdown
if: ${{ !cancelled() }}
run: python
${{ github.workspace }}/.github/report_processing/process_bom_files.py
${{ github.workspace }}/${{env.bill_of_materials_file}}
${{ github.workspace }}/${{steps.yaml.outputs.bom_template_path}}
${{ github.workspace }}/${{env.bom_report_file}}
- name: upload report'
uses: actions/upload-artifact@v4
with:
name: production-files-${{env.PROJECT_NAME}}.zip
path: |
${{ github.workspace }}/${{env.schematic_file}}
${{ github.workspace }}/${{env.bill_of_materials_file}}
${{ github.workspace }}/${{env.production_format_file}}
${{ github.workspace }}/${{env.bom_report_file}}
- name: data for readme updating
if: ${{always()}}
run: |
echo "{" >> ${{env.PROJECT_NAME}}_project.json
echo "\"schematic_link\":\"https://github.com/${{ github.repository }}/tree/${{ github.ref_name }}/${{env.schematic_file}}\"," >> ${{env.PROJECT_NAME}}_project.json
echo "\"bom_csv_link\":\"https://github.com/${{ github.repository }}/tree/${{ github.ref_name }}/${{env.bill_of_materials_file}}\"," >> ${{env.PROJECT_NAME}}_project.json
echo "\"bom_report_link\":\"https://github.com/${{ github.repository }}/tree/${{ github.ref_name }}/${{env.bom_report_file}}\"," >> ${{env.PROJECT_NAME}}_project.json
echo "\"gerber_link\":\"https://github.com/${{ github.repository }}/tree/${{ github.ref_name }}/${{env.production_format_file}}\"," >> ${{env.PROJECT_NAME}}_project.json
echo "\"project_link\":\"https://github.com/${{ github.repository }}/tree/${{ github.ref_name }}/$(dirname ${{matrix.project_path}})\"," >> ${{env.PROJECT_NAME}}_project.json
echo "\"project_name\":\"${{env.PROJECT_NAME}}\"" >> ${{env.PROJECT_NAME}}_project.json
echo "}" >> ${{env.PROJECT_NAME}}_project.json
- name: upload report
if: ${{always()}}
uses: actions/upload-artifact@v4
with:
name: ${{env.PROJECT_NAME}}_project.json
path: ${{env.PROJECT_NAME}}_project.json
readme_job:
runs-on: ubuntu-latest
name: update readme
if: ${{ always() }}
needs: [DRC, ERC, production_job]
steps:
- name: Checkout
uses: actions/checkout@v4
- name: read-yaml-file
uses: juliojimenez/yamler@v1.1.0
id: yaml
with:
yaml-file: ${{ github.workspace }}/project_settings.yaml
- name: download ercs files
if: ${{ steps.yaml.outputs.dynamic_read_me == 'true' }}
uses: actions/download-artifact@v4
with:
pattern: "*_erc.json"
path: ${{ github.workspace }}
- name: download drcs files
if: ${{ steps.yaml.outputs.dynamic_read_me == 'true' }}
uses: actions/download-artifact@v4
with:
pattern: "*_drc.json"
path: ${{ github.workspace }}
- name: download production json files
if: ${{ steps.yaml.outputs.dynamic_read_me == 'true' }}
uses: actions/download-artifact@v4
with:
pattern: "*_project.json"
path: ${{ github.workspace }}
- name: Setting up Python
if: ${{ steps.yaml.outputs.dynamic_read_me == 'true' }}
uses: actions/setup-python@v5
with:
python-version: '3.10'
cache: 'pip'
- name: installing requirements
if: ${{ !cancelled() && steps.yaml.outputs.dynamic_read_me == 'true' }}
run: pip install -r ${{ github.workspace }}/.github/report_processing/requirements.txt
- name: create extra info for readme hash
if: ${{ steps.yaml.outputs.dynamic_read_me == 'true' }}
run: |
echo "{" >> readme_extras.json
echo "\"badge\" : \"[![.github/workflows/main.yaml](https://github.com/${{github.repository}}/actions/workflows/main.yaml/badge.svg?branch=${{github.ref_name}})](https://github.com/${{github.repository}}/actions/workflows/main.yaml)\"," >> readme_extras.json
echo "\"lastest_action_run_link\" : \"https://github.com/${{github.repository}}/actions/runs/${{ github.run_id }}\"," >> readme_extras.json
echo "\"title\" : \"${{steps.yaml.outputs.project_name}}\"" >> readme_extras.json
echo "}" >> readme_extras.json
- name: show extras
run:
cat readme_extras.json
- name: create new readme
if: ${{ steps.yaml.outputs.dynamic_read_me == 'true' }}
run:
python
${{ github.workspace }}/.github/report_processing/process_output_files.py
${{ github.workspace }}/${{steps.yaml.outputs.readme_template_path}} *.json
- name: upload data for readme updating
if: ${{ steps.yaml.outputs.dynamic_read_me == 'true' }}
uses: actions/upload-artifact@v4
with:
name: README.md
path: README.md
- name: list everything
if: ${{always()}}
run: ls -R
upload_job:
runs-on: ubuntu-latest
name: commit production files
if: ${{ always() }}
needs: [readme_job]
steps:
- name: Checkout
uses: actions/checkout@v4
- name: read-yaml-file
uses: juliojimenez/yamler@v1.1.0
id: yaml
with:
yaml-file: ${{ github.workspace }}/project_settings.yaml
- name: download production files
uses: actions/download-artifact@v4
with:
pattern: production-files-*
path: ${{ github.workspace }}
- name: download readme
uses: actions/download-artifact@v4
with:
name: README.md
path: ${{ github.workspace }}
- name: check downloads
run: ls -R
- name: Moving files to correct location
run: |
mv ${{ github.workspace }}/production-files-*/*${{steps.yaml.outputs.schematic_output_name}}.pdf ${{ github.workspace }}/${{steps.yaml.outputs.schematic_output_path}}
mv ${{ github.workspace }}/production-files-*/*${{steps.yaml.outputs.bom_csv_output_name}}.csv ${{ github.workspace }}/${{steps.yaml.outputs.bom_csv_output_path}}
mv ${{ github.workspace }}/production-files-*/*${{steps.yaml.outputs.bom_report_output_name}}.md ${{ github.workspace }}/${{steps.yaml.outputs.bom_report_output_path}}
mv ${{ github.workspace }}/production-files-*/*${{steps.yaml.outputs.production_file_output_name}}.zip ${{ github.workspace }}/${{steps.yaml.outputs.production_file_output_path}}
- name: commit production files
uses: EndBug/add-and-commit@v9
with:
default_author: github_actions
message: 'production files'
push: true
pull: '--rebase --autostash'
tag_push: '--force' # just makes life easier
tag: 'v1.0.0 --force'
add: |
${{ github.workspace }}/*${{steps.yaml.outputs.schematic_output_name}}.pdf
${{ github.workspace }}/*${{steps.yaml.outputs.bom_csv_output_name}}.csv
${{ github.workspace }}/*${{steps.yaml.outputs.bom_report_output_name}}.md
${{ github.workspace }}/*${{steps.yaml.outputs.production_file_output_name}}.zip
${{ github.workspace }}/README.md
- name: list everything
if: ${{always()}}
run: ls -R

2
.gitignore vendored
View File

@@ -29,3 +29,5 @@ Hardware/*/*.xml
Hardware/*/*.csv
__pycache__/
temp/

216
.hooks/kicad_cli_tools.py Normal file
View File

@@ -0,0 +1,216 @@
# yes we are using json because
# i dont want to install a yaml
# parser on the users computer
import json
import os
import subprocess
import csv
from enum import Enum
from pathlib import Path
from os import listdir
from os.path import isfile, join
KICAD_CLI_PATH = "kicad-cli"
TEMP_FILE_PATH = "docs/"
PCB_IMAGE_OUTPUT_PATH = "res/"
PCB_PDF_OUTPUT_PATH = "docs/"
PCB_PDF_FILE_SUFFIX = "_pcb"
SCHEMATIC_OUTPUT_PATH = "docs/"
SCHEMATIC_FILE_SUFFIX = "_schematic"
BOM_OUTPUT_PATH = "docs/"
BOM_REPORT_NAME = "_bom"
TEMP_DRC_REPORT_NAME = "_drc"
TEMP_ERC_REPORT_NAME = "_erc"
# quiet
KICAD_CLI_STDOUT=subprocess.DEVNULL
# verbose
# KICAD_CLI_STDOUT=subprocess.STDOUT
class OutputReportType(Enum):
JSON = 1
REPORT = 2
def get_file_extension(self) -> str:
if (self == OutputReportType.JSON):
return "json"
if (self == OutputReportType.REPORT):
return "rpt"
return "txt"
# this is a thin vale on the kicad cli tool
class KicadProject:
def __init__(self, path : Path) -> None:
self.project_path = path.parent
self.project_name = path.name.removesuffix(".kicad_pro")
self.created_files : list[Path] = []
print(f"{self.project_path=}")
print(f"{self.project_name=}")
def erc_check(
self,
report_format : OutputReportType = OutputReportType.JSON,
return_report : bool = False
) -> None | dict | str:
format_type = report_format.name.lower()
pcb_file_path = self.project_path / f"{self.project_name}.kicad_sch"
erc_report_path = Path(TEMP_FILE_PATH) / f"{self.project_name}{TEMP_ERC_REPORT_NAME}.{report_format.get_file_extension()}"
retcode = subprocess.call(
f'{KICAD_CLI_PATH} sch erc {pcb_file_path} --output {erc_report_path} --format {format_type}',
shell=True,
stdout=KICAD_CLI_STDOUT
)
if (retcode != 0):
print(f"erc check failed return code {retcode}")
exit(1)
self.created_files.append(erc_report_path)
if (return_report):
with open(erc_report_path, "r") as txt:
if format_type == OutputReportType.JSON:
return json.loads(txt.read())
if format_type == OutputReportType.RPT:
return txt.read()
def drc_check(
self,
report_format : OutputReportType = OutputReportType.JSON,
return_report : bool = False
) -> None | dict | str:
format_type = report_format.name.lower()
pcb_file_path = self.project_path / f"{self.project_name}.kicad_pcb"
drc_report_path = Path(TEMP_FILE_PATH) / f"{self.project_name}{TEMP_DRC_REPORT_NAME}.{report_format.get_file_extension()}"
print(f"{format_type=}, {drc_report_path=}")
retcode = subprocess.call(
f'{KICAD_CLI_PATH} pcb drc {pcb_file_path} --output {drc_report_path} --format {format_type}',
shell=True,
stdout=KICAD_CLI_STDOUT
)
print(f"{retcode=}")
if (retcode != 0):
print(f"drc check failed return code {retcode}")
exit(1)
self.created_files.append(drc_report_path)
if (return_report):
with open(drc_report_path, "r") as txt:
if format_type == OutputReportType.JSON:
return json.loads(txt.read())
if format_type == OutputReportType.RPT:
return txt.read()
def process_bom(
self,
return_csv : bool = False
) -> None | list[list[str]]:
sch_file_path = self.project_path / f"{self.project_name}.kicad_sch"
bom_output_path = Path(BOM_OUTPUT_PATH) / f"{self.project_name}{BOM_REPORT_NAME}.csv"
retcode = subprocess.call(
f'{KICAD_CLI_PATH} sch export bom {sch_file_path} --output {bom_output_path}',
shell=True,
stdout=KICAD_CLI_STDOUT
)
if (retcode != 0):
print(f"process_bom failed return code {retcode}")
exit(1)
self.created_files.append(bom_output_path)
if (return_csv):
with open(bom_output_path, "r") as csvfile:
bom_csv = csv.reader(csvfile, delimiter=',', quotechar='"')
return [row for row in bom_csv]
def get_image(self,
image_type : str = "png",
height : int = 900,
width : int = 1600,
side : str = "top",
background : str = "default",
preset : str = "follow_pcb_editor",
zoom : int = 2,
) -> None:
"""
image_typ = "png" | "jpg"
side = "top" | "bottom" | "left" | "right" | "front" | "back"
background = "default" | "transparent" | "opaque"
"""
pcb_file_path = self.project_path / f"{self.project_name}.kicad_pcb"
render_output_path = Path(PCB_IMAGE_OUTPUT_PATH) / f"{self.project_name}_render.{image_type}"
retcode = subprocess.call(
f'{KICAD_CLI_PATH} pcb render {pcb_file_path} --output {render_output_path} --preset {preset} --zoom {zoom} ',
shell=True,
stdout=KICAD_CLI_STDOUT
)
if (retcode != 0):
print(f"get_image failed return code {retcode}")
exit(1)
self.created_files.append(render_output_path)
# i am not giving you the pdf to output if you want to do that yourself go ahead
def create_schmatic_pdf(self) -> None:
sch_file_path = self.project_path / f"{self.project_name}.kicad_sch"
sch_report_path = Path(SCHEMATIC_OUTPUT_PATH) / f"{self.project_name}{SCHEMATIC_FILE_SUFFIX}.pdf"
retcode = subprocess.call(
f'{KICAD_CLI_PATH} sch export pdf {sch_file_path} --output {sch_report_path}',
shell=True,
stdout=KICAD_CLI_STDOUT
)
if (retcode != 0):
print(f"create_schmatic_pdf failed return code {retcode}")
exit(1)
self.created_files.append(sch_report_path)
def create_pcb_pdf(self, layers : list[str] = ["F.Cu", "B.Cu"]) -> None:
pcb_file_path = self.project_path / f"{self.project_name}.kicad_pcb"
pcb_report_path = Path(PCB_PDF_OUTPUT_PATH) / f"{self.project_name}{PCB_PDF_FILE_SUFFIX}.pdf"
retcode = subprocess.call(
f'{KICAD_CLI_PATH} pcb export pdf {pcb_file_path} --output {pcb_report_path} --layers {",".join(layers)}',
shell=True,
stdout=KICAD_CLI_STDOUT
)
if (retcode != 0):
print(f"create_pcb_pdf failed return code {retcode}")
exit(1)
self.created_files.append(pcb_report_path)
def commit_files(files: list[Path], commit_message : str) -> None:
for file in files:
# add & commit, could use the return code however these should never fail
print(f"adding and commiting {file}")
ret_add = subprocess.call(f"git add {file}", shell=True)
ret_commit = subprocess.call(f"git commit -m \"{commit_message}\"", shell=True)
def main() -> None:
# find all kicad project files to operate on
for path in Path(".").rglob('*.kicad_pro'):
k = KicadProject(path)
k.drc_check(report_format= OutputReportType.REPORT)
k.erc_check(report_format= OutputReportType.REPORT)
k.process_bom()
k.create_schmatic_pdf()
k.get_image()
commit_files(k.created_files, "auto commited")
if __name__ == "__main__":
try:
main()
exit(0)
except Exception as e:
exit(1)

File diff suppressed because it is too large Load Diff

View File

@@ -131,6 +131,23 @@
(embedded_fonts no)
)
)
(text "NOTES:\n\nperipherals share an i2c bus with the usb hub and pd controller since\nsharing the I2C directly with the keyboard could create an security\nproblem with peripherals directly snooping on the keyboard presses"
(exclude_from_sim no)
(at 177.546 171.704 0)
(effects
(font
(size 1.27 1.27)
)
(justify left)
)
(uuid "d3f32ef9-7845-471f-9a2d-347129dd0ced")
)
(junction
(at 119.38 87.63)
(diameter 0)
(color 0 0 0 0)
(uuid "0d62faf3-7ac5-4aa0-a42b-5105bac463e3")
)
(junction
(at 121.92 43.18)
(diameter 0)
@@ -143,6 +160,12 @@
(color 0 0 0 0)
(uuid "b5bb2435-e65f-48e0-968d-ab8aaa4b12c3")
)
(junction
(at 121.92 85.09)
(diameter 0)
(color 0 0 0 0)
(uuid "f394cf1f-1263-412d-a551-a6bb389d818f")
)
(wire
(pts
(xy 116.84 90.17) (xy 124.46 90.17)
@@ -155,7 +178,27 @@
)
(wire
(pts
(xy 158.75 30.48) (xy 171.45 30.48)
(xy 156.21 72.39) (xy 156.21 81.28)
)
(stroke
(width 0)
(type default)
)
(uuid "0d4e4247-2d6c-49a1-aa03-b837619937ff")
)
(wire
(pts
(xy 189.23 72.39) (xy 189.23 95.25)
)
(stroke
(width 0)
(type default)
)
(uuid "0eb7122d-5ebb-4a84-9623-2e2f43e86430")
)
(wire
(pts
(xy 160.02 30.48) (xy 186.69 30.48)
)
(stroke
(width 0)
@@ -163,6 +206,16 @@
)
(uuid "12dfe020-b936-465c-883a-ec0410085d39")
)
(wire
(pts
(xy 152.4 128.27) (xy 152.4 139.7)
)
(stroke
(width 0)
(type default)
)
(uuid "210e8cb2-2d78-4c1b-a19f-13b359de2a8a")
)
(wire
(pts
(xy 124.46 30.48) (xy 120.65 30.48)
@@ -185,7 +238,7 @@
)
(wire
(pts
(xy 158.75 40.64) (xy 171.45 40.64)
(xy 160.02 40.64) (xy 186.69 40.64)
)
(stroke
(width 0)
@@ -205,7 +258,7 @@
)
(wire
(pts
(xy 158.75 43.18) (xy 171.45 43.18)
(xy 160.02 43.18) (xy 186.69 43.18)
)
(stroke
(width 0)
@@ -215,7 +268,7 @@
)
(wire
(pts
(xy 158.75 53.34) (xy 171.45 53.34)
(xy 160.02 53.34) (xy 186.69 53.34)
)
(stroke
(width 0)
@@ -233,6 +286,86 @@
)
(uuid "42478fb0-d963-4a32-9a84-cb8efe8bfe2e")
)
(wire
(pts
(xy 157.48 128.27) (xy 157.48 139.7)
)
(stroke
(width 0)
(type default)
)
(uuid "4b951d1a-bcdc-4c98-af00-cd1a7e1c678d")
)
(wire
(pts
(xy 134.62 128.27) (xy 134.62 139.7)
)
(stroke
(width 0)
(type default)
)
(uuid "54e60b55-b905-48d7-b9d9-f6391da4de8e")
)
(wire
(pts
(xy 175.26 100.33) (xy 194.31 100.33)
)
(stroke
(width 0)
(type default)
)
(uuid "5ce14ed7-0ef0-460d-b339-edbfd7544eb9")
)
(wire
(pts
(xy 137.16 128.27) (xy 137.16 139.7)
)
(stroke
(width 0)
(type default)
)
(uuid "60d3ab8a-95df-46f3-bec6-2dc3a187f51f")
)
(wire
(pts
(xy 165.1 128.27) (xy 165.1 139.7)
)
(stroke
(width 0)
(type default)
)
(uuid "66deb91d-1258-4901-9787-79d919147d24")
)
(wire
(pts
(xy 124.46 162.56) (xy 119.38 162.56)
)
(stroke
(width 0)
(type default)
)
(uuid "709dbd2e-c9e0-4c1a-a827-db18ba893b19")
)
(wire
(pts
(xy 162.56 128.27) (xy 162.56 139.7)
)
(stroke
(width 0)
(type default)
)
(uuid "72d53f33-0421-48ef-a656-5b17938fc538")
)
(wire
(pts
(xy 175.26 97.79) (xy 191.77 97.79)
)
(stroke
(width 0)
(type default)
)
(uuid "74d167ef-beb2-4ab2-b313-7d4f5666b6c9")
)
(wire
(pts
(xy 113.03 33.02) (xy 124.46 33.02)
@@ -253,6 +386,26 @@
)
(uuid "84d5d859-0e0a-41c9-8fe7-670235a0baa5")
)
(wire
(pts
(xy 194.31 72.39) (xy 194.31 100.33)
)
(stroke
(width 0)
(type default)
)
(uuid "89507da5-c109-419e-b04c-867ecec5f8f2")
)
(wire
(pts
(xy 119.38 162.56) (xy 119.38 87.63)
)
(stroke
(width 0)
(type default)
)
(uuid "8f7b1c9c-5456-4f3f-82de-e97ddf30dec7")
)
(wire
(pts
(xy 121.92 43.18) (xy 124.46 43.18)
@@ -265,7 +418,37 @@
)
(wire
(pts
(xy 158.75 35.56) (xy 171.45 35.56)
(xy 175.26 95.25) (xy 189.23 95.25)
)
(stroke
(width 0)
(type default)
)
(uuid "93f472b4-2e62-46ef-9668-d05e2d49379b")
)
(wire
(pts
(xy 132.08 128.27) (xy 132.08 139.7)
)
(stroke
(width 0)
(type default)
)
(uuid "968c2893-9090-463d-a070-dfaaf9a11cbd")
)
(wire
(pts
(xy 121.92 160.02) (xy 124.46 160.02)
)
(stroke
(width 0)
(type default)
)
(uuid "a04c42e6-a89f-4a72-a1cb-e147d35f3486")
)
(wire
(pts
(xy 160.02 35.56) (xy 186.69 35.56)
)
(stroke
(width 0)
@@ -273,6 +456,26 @@
)
(uuid "a082fd9a-da7a-4f37-a009-8d0c237d3f93")
)
(wire
(pts
(xy 139.7 128.27) (xy 139.7 139.7)
)
(stroke
(width 0)
(type default)
)
(uuid "a144d56c-4cb7-4bc7-a782-fcf21e0ebd15")
)
(wire
(pts
(xy 121.92 85.09) (xy 121.92 160.02)
)
(stroke
(width 0)
(type default)
)
(uuid "a2ca66cc-afa5-4acd-96ec-321755f5bbc1")
)
(wire
(pts
(xy 113.03 40.64) (xy 119.38 40.64)
@@ -293,6 +496,26 @@
)
(uuid "a471c19c-9031-47cd-966d-454a9e2d7e07")
)
(wire
(pts
(xy 167.64 128.27) (xy 167.64 139.7)
)
(stroke
(width 0)
(type default)
)
(uuid "b7cb2597-c851-431e-aabe-b90623270d1a")
)
(wire
(pts
(xy 154.94 128.27) (xy 154.94 139.7)
)
(stroke
(width 0)
(type default)
)
(uuid "b850a76c-dee8-4b43-a05a-77e64f535b96")
)
(wire
(pts
(xy 113.03 43.18) (xy 121.92 43.18)
@@ -313,6 +536,16 @@
)
(uuid "c4d4554a-6bbb-4d39-813f-db4960d1911a")
)
(wire
(pts
(xy 129.54 128.27) (xy 129.54 139.7)
)
(stroke
(width 0)
(type default)
)
(uuid "c569b18e-08b0-4bbc-bdf2-46a3091e5bbc")
)
(wire
(pts
(xy 119.38 40.64) (xy 124.46 40.64)
@@ -325,7 +558,7 @@
)
(wire
(pts
(xy 158.75 33.02) (xy 171.45 33.02)
(xy 160.02 33.02) (xy 186.69 33.02)
)
(stroke
(width 0)
@@ -333,6 +566,16 @@
)
(uuid "cca17029-29df-41e8-b8b6-a75c2d3d8dd9")
)
(wire
(pts
(xy 175.26 102.87) (xy 196.85 102.87)
)
(stroke
(width 0)
(type default)
)
(uuid "d2787657-63d6-443c-9b88-bc71feb3e3d7")
)
(wire
(pts
(xy 121.92 43.18) (xy 121.92 85.09)
@@ -345,7 +588,17 @@
)
(wire
(pts
(xy 158.75 46.99) (xy 171.45 46.99)
(xy 153.67 72.39) (xy 153.67 81.28)
)
(stroke
(width 0)
(type default)
)
(uuid "d38ff251-5c54-4427-a365-9edb69009a67")
)
(wire
(pts
(xy 160.02 46.99) (xy 186.69 46.99)
)
(stroke
(width 0)
@@ -355,7 +608,7 @@
)
(wire
(pts
(xy 158.75 49.53) (xy 171.45 49.53)
(xy 160.02 49.53) (xy 186.69 49.53)
)
(stroke
(width 0)
@@ -365,7 +618,7 @@
)
(wire
(pts
(xy 158.75 55.88) (xy 171.45 55.88)
(xy 160.02 55.88) (xy 186.69 55.88)
)
(stroke
(width 0)
@@ -373,6 +626,26 @@
)
(uuid "dbcd2f88-a6e4-43c3-99ba-2e7915809ced")
)
(wire
(pts
(xy 196.85 72.39) (xy 196.85 102.87)
)
(stroke
(width 0)
(type default)
)
(uuid "dbe8b97f-069e-4fd8-a462-005d764e5cd6")
)
(wire
(pts
(xy 191.77 72.39) (xy 191.77 97.79)
)
(stroke
(width 0)
(type default)
)
(uuid "decfcf39-ca20-48cc-b1df-fafbcc7b0af6")
)
(wire
(pts
(xy 113.03 45.72) (xy 116.84 45.72)
@@ -451,7 +724,7 @@
)
(sheet
(at 124.46 27.94)
(size 34.29 44.45)
(size 35.56 44.45)
(exclude_from_sim no)
(in_bom yes)
(on_board yes)
@@ -574,7 +847,7 @@
)
)
(pin "PWR_USBD2" output
(at 158.75 30.48 0)
(at 160.02 30.48 0)
(uuid "022ee30e-d7a7-4e0d-9525-243861daec14")
(effects
(font
@@ -584,7 +857,7 @@
)
)
(pin "PWR_USBD3" output
(at 158.75 33.02 0)
(at 160.02 33.02 0)
(uuid "e0c59a43-4738-4f58-b8fc-a3d415fa2325")
(effects
(font
@@ -594,7 +867,7 @@
)
)
(pin "PWR_USBD4" output
(at 158.75 35.56 0)
(at 160.02 35.56 0)
(uuid "88f9270b-7fa1-46d2-afae-16d86b89617e")
(effects
(font
@@ -604,7 +877,7 @@
)
)
(pin "USBD2_N" input
(at 158.75 43.18 0)
(at 160.02 43.18 0)
(uuid "26cb3814-1921-46cf-8844-12b04cb3c3a6")
(effects
(font
@@ -614,7 +887,7 @@
)
)
(pin "USBD2_P" input
(at 158.75 40.64 0)
(at 160.02 40.64 0)
(uuid "e7d772c5-dc0f-491d-bbe4-b88081353547")
(effects
(font
@@ -624,7 +897,7 @@
)
)
(pin "USBD3_N" input
(at 158.75 49.53 0)
(at 160.02 49.53 0)
(uuid "fc187a48-f260-492a-aa8d-4a05dd5d92c3")
(effects
(font
@@ -634,7 +907,7 @@
)
)
(pin "USBD3_P" input
(at 158.75 46.99 0)
(at 160.02 46.99 0)
(uuid "b122bf8c-a643-45fe-a07c-05de668c6f1d")
(effects
(font
@@ -644,7 +917,7 @@
)
)
(pin "USBD4_N" input
(at 158.75 55.88 0)
(at 160.02 55.88 0)
(uuid "3be6f3e5-0fac-48a6-a8d2-edecabee3143")
(effects
(font
@@ -654,7 +927,7 @@
)
)
(pin "USBD4_P" input
(at 158.75 53.34 0)
(at 160.02 53.34 0)
(uuid "b9d029e2-85c1-4f99-b445-115221ce0e26")
(effects
(font
@@ -673,7 +946,7 @@
)
(sheet
(at 124.46 81.28)
(size 34.29 25.4)
(size 50.8 46.99)
(exclude_from_sim no)
(in_bom yes)
(on_board yes)
@@ -697,7 +970,7 @@
)
)
(property "Sheetfile" "MCU.kicad_sch"
(at 124.46 107.2646 0)
(at 124.46 128.8546 0)
(effects
(font
(size 1.27 1.27)
@@ -713,6 +986,206 @@
)
)
)
(pin "BOOT" input
(at 175.26 95.25 0)
(uuid "5350e495-4d5c-4bbd-a668-6baa0038a59c")
(effects
(font
(size 1.27 1.27)
)
(justify right)
)
)
(pin "EN" input
(at 175.26 97.79 0)
(uuid "01a73818-18a9-45f4-91fb-54ffb37f210e")
(effects
(font
(size 1.27 1.27)
)
(justify right)
)
)
(pin "PROG_RXD" input
(at 175.26 102.87 0)
(uuid "93795dd2-4ad6-4e2b-9d1c-87b07db7516b")
(effects
(font
(size 1.27 1.27)
)
(justify right)
)
)
(pin "PROG_TXD" input
(at 175.26 100.33 0)
(uuid "ceb74c69-2d1c-4ccb-a98b-7013d7afe921")
(effects
(font
(size 1.27 1.27)
)
(justify right)
)
)
(pin "SCL" input
(at 124.46 85.09 180)
(uuid "6b26697c-6991-421d-9cc6-83e1160b8536")
(effects
(font
(size 1.27 1.27)
)
(justify left)
)
)
(pin "SDA" input
(at 124.46 87.63 180)
(uuid "c22bfbe3-dbdb-4fd6-8da5-6abeda230da1")
(effects
(font
(size 1.27 1.27)
)
(justify left)
)
)
(pin "USB_D+" input
(at 156.21 81.28 90)
(uuid "a64b796e-58d3-4d10-8b3b-ea873abd0e09")
(effects
(font
(size 1.27 1.27)
)
(justify right)
)
)
(pin "USB_D-" input
(at 153.67 81.28 90)
(uuid "8cc3d7da-f9fc-44d3-9f6e-56554249f4d0")
(effects
(font
(size 1.27 1.27)
)
(justify right)
)
)
(pin "USB_PD_ALERT" input
(at 124.46 90.17 180)
(uuid "9d3df001-0d47-4cf9-9c86-771119f74161")
(effects
(font
(size 1.27 1.27)
)
(justify left)
)
)
(pin "!INT_L" input
(at 129.54 128.27 270)
(uuid "92002c5d-8457-45b8-8a70-066b0942bd0d")
(effects
(font
(size 1.27 1.27)
)
(justify left)
)
)
(pin "!INT_R" input
(at 132.08 128.27 270)
(uuid "0fb336ad-0201-4fa3-84fc-31b75f995dab")
(effects
(font
(size 1.27 1.27)
)
(justify left)
)
)
(pin "!RESET" input
(at 134.62 128.27 270)
(uuid "f9edb144-f2c8-4f88-bc9d-f6cc4fb6c219")
(effects
(font
(size 1.27 1.27)
)
(justify left)
)
)
(pin "KEYBOARD_EN" input
(at 137.16 128.27 270)
(uuid "7a7ecabe-be46-4135-8bc2-eecbf70df888")
(effects
(font
(size 1.27 1.27)
)
(justify left)
)
)
(pin "LED_DIN" input
(at 139.7 128.27 270)
(uuid "25d5c932-899b-4610-b493-334c0187c483")
(effects
(font
(size 1.27 1.27)
)
(justify left)
)
)
(pin "PERIPHERAL_EN" input
(at 152.4 128.27 270)
(uuid "54309a34-9b5f-462e-a15c-ad27feabbbac")
(effects
(font
(size 1.27 1.27)
)
(justify left)
)
)
(pin "DISPLAY_RX" input
(at 162.56 128.27 270)
(uuid "438a60d7-5143-48eb-8b17-338fce15561b")
(effects
(font
(size 1.27 1.27)
)
(justify left)
)
)
(pin "DISPLAY_TX" input
(at 165.1 128.27 270)
(uuid "6b2c6e9f-4857-4fa1-97cd-4164cba66cfa")
(effects
(font
(size 1.27 1.27)
)
(justify left)
)
)
(pin "PERIPHERAL_SCL" input
(at 154.94 128.27 270)
(uuid "d54b8353-2b82-41cc-847a-a9021734c3f1")
(effects
(font
(size 1.27 1.27)
)
(justify left)
)
)
(pin "PERIPHERAL_SDA" input
(at 157.48 128.27 270)
(uuid "2495c05e-2d4a-415c-9325-1bbca6e908fa")
(effects
(font
(size 1.27 1.27)
)
(justify left)
)
)
(pin "DISPLAY_EN" input
(at 167.64 128.27 270)
(uuid "329e846c-b37e-43b5-80bd-bc9f7a2f9d96")
(effects
(font
(size 1.27 1.27)
)
(justify left)
)
)
(instances
(project "keyboard_controller"
(path "/b230ff6d-d62b-4e9b-b4a9-a03792e35fdd"
@@ -764,8 +1237,8 @@
)
)
(sheet
(at 124.46 114.3)
(size 34.29 17.78)
(at 124.46 139.7)
(size 50.8 35.56)
(exclude_from_sim no)
(in_bom yes)
(on_board yes)
@@ -780,7 +1253,7 @@
)
(uuid "597f86ca-912d-4f96-a6ed-f7d99a92319e")
(property "Sheetname" "keyboard_interface"
(at 124.46 113.5884 0)
(at 124.46 138.9884 0)
(effects
(font
(size 1.27 1.27)
@@ -789,7 +1262,7 @@
)
)
(property "Sheetfile" "keyboard_interface.kicad_sch"
(at 124.46 132.6646 0)
(at 124.46 175.8446 0)
(effects
(font
(size 1.27 1.27)
@@ -797,6 +1270,136 @@
(justify left top)
)
)
(pin "!INT_L" input
(at 129.54 139.7 90)
(uuid "dfddb606-9130-42e7-b976-59022accd5d9")
(effects
(font
(size 1.27 1.27)
)
(justify right)
)
)
(pin "!INT_R" input
(at 132.08 139.7 90)
(uuid "abcaa1e1-6b58-4908-bf10-d555ab18a420")
(effects
(font
(size 1.27 1.27)
)
(justify right)
)
)
(pin "!RESET" input
(at 134.62 139.7 90)
(uuid "7c1e12b8-76c5-44c7-97bb-c4d427c02483")
(effects
(font
(size 1.27 1.27)
)
(justify right)
)
)
(pin "KEYBOARD_EN" input
(at 137.16 139.7 90)
(uuid "2785fa47-f574-4b33-94e9-9073391710de")
(effects
(font
(size 1.27 1.27)
)
(justify right)
)
)
(pin "KEYBOARD_SCL" input
(at 124.46 160.02 180)
(uuid "2747bc29-a3eb-44ec-ab9e-6e941b763207")
(effects
(font
(size 1.27 1.27)
)
(justify left)
)
)
(pin "KEYBOARD_SDA" input
(at 124.46 162.56 180)
(uuid "45851f95-7b92-4d86-9e28-4909e5ae17a1")
(effects
(font
(size 1.27 1.27)
)
(justify left)
)
)
(pin "LED_DIN" input
(at 139.7 139.7 90)
(uuid "4dd614b7-1b13-4ca2-a794-19d36140e307")
(effects
(font
(size 1.27 1.27)
)
(justify right)
)
)
(pin "PERIPHERAL_EN" input
(at 152.4 139.7 90)
(uuid "560cc74d-33bf-414b-a6dc-29a53a2ac606")
(effects
(font
(size 1.27 1.27)
)
(justify right)
)
)
(pin "DISPLAY_EN" input
(at 167.64 139.7 90)
(uuid "16b394d0-a316-4cfd-99ba-588a9be642d4")
(effects
(font
(size 1.27 1.27)
)
(justify right)
)
)
(pin "DISPLAY_RX" input
(at 162.56 139.7 90)
(uuid "7ef42b38-f742-4e5a-b170-3f4713bdf2e7")
(effects
(font
(size 1.27 1.27)
)
(justify right)
)
)
(pin "DISPLAY_TX" input
(at 165.1 139.7 90)
(uuid "1b464f6d-e04c-4a04-9d5c-3d6f6ff8d901")
(effects
(font
(size 1.27 1.27)
)
(justify right)
)
)
(pin "PERIPHERAL_SCL" input
(at 154.94 139.7 90)
(uuid "35391ca1-0923-4799-b45e-2b0af2c4490a")
(effects
(font
(size 1.27 1.27)
)
(justify right)
)
)
(pin "PERIPHERAL_SDA" input
(at 157.48 139.7 90)
(uuid "24ec76d0-0377-4197-af8f-c10c5641e5d8")
(effects
(font
(size 1.27 1.27)
)
(justify right)
)
)
(instances
(project "keyboard_controller"
(path "/b230ff6d-d62b-4e9b-b4a9-a03792e35fdd"
@@ -898,7 +1501,7 @@
)
)
(sheet
(at 171.45 27.94)
(at 186.69 27.94)
(size 26.67 44.45)
(exclude_from_sim no)
(in_bom yes)
@@ -914,7 +1517,7 @@
)
(uuid "f949d847-95e8-43ae-a947-73b7c5fb08a2")
(property "Sheetname" "USB_output_n_prog"
(at 171.45 27.2284 0)
(at 186.69 27.2284 0)
(effects
(font
(size 1.27 1.27)
@@ -923,7 +1526,7 @@
)
)
(property "Sheetfile" "programming_interface.kicad_sch"
(at 171.45 72.9746 0)
(at 186.69 72.9746 0)
(effects
(font
(size 1.27 1.27)
@@ -932,7 +1535,7 @@
)
)
(pin "PROG_BOOT" input
(at 173.99 72.39 270)
(at 189.23 72.39 270)
(uuid "9839852c-0bd9-42f0-9cfb-ef0fca8c4d1e")
(effects
(font
@@ -942,7 +1545,7 @@
)
)
(pin "PROG_EN" input
(at 176.53 72.39 270)
(at 191.77 72.39 270)
(uuid "0bbb709f-867a-4ad9-b27d-c9dd80af824f")
(effects
(font
@@ -952,7 +1555,7 @@
)
)
(pin "PROG_TXD" input
(at 179.07 72.39 270)
(at 194.31 72.39 270)
(uuid "3a0c9a5e-ff7b-4915-93b6-fbc60fed8e8e")
(effects
(font
@@ -962,7 +1565,7 @@
)
)
(pin "USB_1_PWR" input
(at 171.45 30.48 180)
(at 186.69 30.48 180)
(uuid "37260822-24a5-4f7f-840e-b8175a827ddb")
(effects
(font
@@ -972,7 +1575,7 @@
)
)
(pin "USB_2_PWR" input
(at 171.45 33.02 180)
(at 186.69 33.02 180)
(uuid "1ea4aeb2-8f1a-4107-8ac8-3e2f94d5b674")
(effects
(font
@@ -982,7 +1585,7 @@
)
)
(pin "USB_3_PWR" input
(at 171.45 35.56 180)
(at 186.69 35.56 180)
(uuid "6d12db6b-1cef-4759-aa5f-83d5ecdf30d6")
(effects
(font
@@ -992,7 +1595,7 @@
)
)
(pin "USB_OUT_1_DN" input
(at 171.45 43.18 180)
(at 186.69 43.18 180)
(uuid "e8294594-e1c3-4bb6-9df9-e265f76f73a3")
(effects
(font
@@ -1002,7 +1605,7 @@
)
)
(pin "USB_OUT_1_DP" input
(at 171.45 40.64 180)
(at 186.69 40.64 180)
(uuid "9ff0a255-e00b-485a-a4ca-65a4386bc7a2")
(effects
(font
@@ -1012,7 +1615,7 @@
)
)
(pin "USB_OUT_2_DN" input
(at 171.45 49.53 180)
(at 186.69 49.53 180)
(uuid "22bdd00b-ea14-40b2-8286-6008c82f8c40")
(effects
(font
@@ -1022,7 +1625,7 @@
)
)
(pin "USB_OUT_2_DP" input
(at 171.45 46.99 180)
(at 186.69 46.99 180)
(uuid "88a71857-176c-48a2-9da4-7b200715ed3a")
(effects
(font
@@ -1032,7 +1635,7 @@
)
)
(pin "USB_OUT_3_DN" input
(at 171.45 55.88 180)
(at 186.69 55.88 180)
(uuid "75c6d7e3-fd78-4dc9-8845-0a67e7528ffb")
(effects
(font
@@ -1042,7 +1645,7 @@
)
)
(pin "USB_OUT_3_DP" input
(at 171.45 53.34 180)
(at 186.69 53.34 180)
(uuid "f353501a-b5e8-4cc1-ad49-92f908e35673")
(effects
(font
@@ -1052,7 +1655,7 @@
)
)
(pin "PROG_RXD" input
(at 181.61 72.39 270)
(at 196.85 72.39 270)
(uuid "2c32949d-ae8f-49d0-8906-eb61485bf0b0")
(effects
(font

File diff suppressed because it is too large Load Diff

123
README.md
View File

@@ -1,115 +1,18 @@
# kicad project template
[![.github/workflows/main.yaml](https://github.com/sirlilpanda/kicad-project-template/actions/workflows/main.yaml/badge.svg?branch=main)](https://github.com/sirlilpanda/kicad-project-template/actions/workflows/main.yaml)
# How to use this template
a cool table showing the workflow of all the kicad projects.
| project_name | DRC | ERC |
| ------------ | --- | --- |
| template | [](https://github.com/sirlilpanda/kicad-project-template/actions/runs/14507154830/attempts/1#summary-40698563204)| [](https://github.com/sirlilpanda/kicad-project-template/actions/runs/14507154830/attempts/1#summary-40698563199) |
custom keyboard
for a quick guide check [project setup](#project-setup)
![rendered pcb](res/keyboard_render.png)
This is a simple project template for new kicad projects. This template has some basic setup already completed such as workflows for auto creating all the things you forget when creating a kicad project such as:
the code for creating all of this lives in `.hooks/`
- [gerbers](https://github.com/sirlilpanda/kicad-project-template/tree/main/template_gerber.zip)
- [bom](https://github.com/sirlilpanda/kicad-project-template/tree/main/template_bom_report.md)
- [schematic pdf](https://github.com/sirlilpanda/kicad-project-template/tree/main/template_schematic.pdf)
## setup
dependencies:
- python3.9+ (used for crossplatfrom scripting)
- kicad-cli
This workflow will also run the design rules check on the PCB and schematic to ensure that you upload a working PCB. These reports are uploaded as summaries within the github [actions tab](https://github.com/sirlilpanda/kicad-project-template/actions/runs/14507154830). This template has a simple schematic PCB in it (because DRC fails on an empty PCB). Shown below is the example PCB.
![example pcb with battery diode and resistor](res/image.png)
besides from that the project also has:
- common predefined trace widths
- smallest vias size [JLCPBC allows](https://jlcpcb.com/capabilities/Capabilities#Drilling)
- custom net colours in the schematic editor
- `red` for +V
- `blue` for -V
- `grey` for ground
to create a repo from this template follow this [guide](https://docs.github.com/en/repositories/creating-and-managing-repositories/creating-a-repository-from-a-template)
contained in this template are:
---
- `.github/` : all files relating to github actions and other admin see [here](https://docs.github.com/en/communities/setting-up-your-project-for-healthy-contributions) for more example of what can be placed in it
- `report_processing` : where the python scripts are stored for processing the json report data from kicad
- `report_templates` : where the template for said reports are stored
- `workflows/` : this is where the github actions are kept
- `main.yaml` : the main github action that will auto generate all files required and run DRC and ERC
- `rename.py` : the script for renaming the project
- `hardware/` : this is where the kicad projects live note this can be changed
- `docs/` : this is where the generate docs are placed by default
- `BOM/` : where the bill of materials and price breakdown are kept
- `bill_of_materials.csv`: the auto generated bom for the kicad project
- `bom_report.md` : a report for the bill of materials
- `template_schematic.pdf` : the schematic for the kicad project, auto generated by the github action
- `pcbs/` : this is where the auto generated gerbers for the kicad project are stored
- `res/` : where resources are stored for the README
- `.gitignore`: a slightly modified gitignore from the [standard one](https://github.com/github/gitignore/blob/main/KiCad.gitignore)
- `project_settings.yaml` : where the settings for this project is stored
- `README.md` : this file, suggest you change this one creating your project
## project settings
there are currently very few project settings that can be changed (will will be change in the future) these are:
| setting | description |
| --------------------------- | ----------------------------------------------------------------- |
| has_been_set_up | a flag to tell the setup action if the project has been set up |
| project_name | the name of the project, this will be set to the name of the repo |
| production_formats | the output production format for the PCBs |
| dynamic_read_me | allow the readme to be updated using the given template |
| bom_template_path | the template used to write the bom report files |
| erc_report_template_path | the template used to write the erc report files |
| drc_report_template_path | the template used to write the drc report files |
| readme_template_path | the template used to write projects readme |
| schematic_output_name | the name suffix of the generated schematics |
| bom_csv_output_name | the name suffix of the generated bom csv file |
| bom_report_output_name | the name suffix of the generated bom report |
| production_file_output_name | the name suffix of the generated production file |
| schematic_output_path | the output path of the generated schematics files |
| bom_csv_output_path | the output path of the generated bom csv file |
| bom_report_output_path | the output path of the generated bom report |
| production_file_output_path | the output path of the generated production file |
## project setup
### creating a new repo with the template
creating a new template from a repo is simple:
1. click on the button in the top right hand corner called `use this template`
![alt text](res/image-5.png)
2. when the drop down menu appears click on `create a new repository`
![alt text](res/image-6.png)
3. once you click you will be brought to this page, note that the repo name you choose here will be the name that you kicad project is called.
![alt text](res/image-7.png)
after these steps you then need to configure the repo settings to do their magic see [configuring repo settings](#configuring-repo-settings) for what to do next.
### configuring repo settings
once you have created a new repo with the template, you ill have to configure the github action settings. this is because you will get an error that looks something along these lines:
![alt text](res/image-4.png)
where the action can not commit the changes due to not having permissions follow these steps:
1. open the repo setting
![alt text](res/image-1.png)
2. then head in to actions : General
![alt text](res/image-2.png)
3. then scroll down to workflow permissions and ensure that both
`Read and write permissions` and `Allow GitHub Actions to create and approve pull requests` are ticked as seen below
![alt text](res/image-3.png)
this should fix the problem if not, go harass stack overflow they need it
Once all of these steps have been followed the workflow should be passing, however the `README.md` will only update on the next push request.
## editing the readme
As this repo can and will automatically update the repo corresponding to the given readme template. If you dont want to use this you can always disable this by setting the `dynamic_read_me` to `false`. but if you want some very cool features like auto updating tables to show what projects are passing the rules check or simple links to parts of your directory. then have a look at the template readme and learn [mustache](https://mustache.github.io/)
## improvements
to set up the hooks just run
```
python setup.py
```
This script will add a line in the `.git/hooks/pre-push` to auto run `.hooks/kicad_cli_tools.py`

154
docs/keyboard_bom.csv Normal file
View File

@@ -0,0 +1,154 @@
"Refs","Value","Footprint","Qty","DNP"
"C1","100n","Capacitor_SMD:C_0603_1608Metric","1",""
"C2","100n","Capacitor_SMD:C_0603_1608Metric","1",""
"C3","100n","Capacitor_SMD:C_0603_1608Metric","1",""
"C4","100n","Capacitor_SMD:C_0603_1608Metric","1",""
"D1","NeoPixel_THT","key_switches:Untitled","1",""
"D2","NeoPixel_THT","key_switches:Untitled","1",""
"D3","NeoPixel_THT","key_switches:Untitled","1",""
"D4","NeoPixel_THT","key_switches:Untitled","1",""
"D5","NeoPixel_THT","key_switches:Untitled","1",""
"D6","NeoPixel_THT","key_switches:Untitled","1",""
"D7","NeoPixel_THT","key_switches:Untitled","1",""
"D8","NeoPixel_THT","key_switches:Untitled","1",""
"D9","NeoPixel_THT","key_switches:Untitled","1",""
"D10","NeoPixel_THT","key_switches:Untitled","1",""
"D11","NeoPixel_THT","key_switches:Untitled","1",""
"D12","NeoPixel_THT","key_switches:Untitled","1",""
"D13","NeoPixel_THT","key_switches:Untitled","1",""
"D14","NeoPixel_THT","key_switches:Untitled","1",""
"D15","NeoPixel_THT","key_switches:Untitled","1",""
"D16","NeoPixel_THT","key_switches:Untitled","1",""
"D17","NeoPixel_THT","key_switches:Untitled","1",""
"D18","NeoPixel_THT","key_switches:Untitled","1",""
"D19","NeoPixel_THT","key_switches:Untitled","1",""
"D20","NeoPixel_THT","key_switches:Untitled","1",""
"D21","NeoPixel_THT","key_switches:Untitled","1",""
"D22","NeoPixel_THT","key_switches:Untitled","1",""
"D23","NeoPixel_THT","key_switches:Untitled","1",""
"D24","NeoPixel_THT","key_switches:Untitled","1",""
"D25","NeoPixel_THT","key_switches:Untitled","1",""
"D26","NeoPixel_THT","key_switches:Untitled","1",""
"D27","NeoPixel_THT","key_switches:Untitled","1",""
"D28","NeoPixel_THT","key_switches:Untitled","1",""
"D29","NeoPixel_THT","key_switches:Untitled","1",""
"D30","NeoPixel_THT","key_switches:Untitled","1",""
"D31","NeoPixel_THT","key_switches:Untitled","1",""
"D32","NeoPixel_THT","key_switches:Untitled","1",""
"D33","NeoPixel_THT","key_switches:Untitled","1",""
"D34","NeoPixel_THT","key_switches:Untitled","1",""
"D35","NeoPixel_THT","key_switches:Untitled","1",""
"D36","NeoPixel_THT","key_switches:Untitled","1",""
"D37","NeoPixel_THT","key_switches:Untitled","1",""
"D38","NeoPixel_THT","key_switches:Untitled","1",""
"D39","NeoPixel_THT","key_switches:Untitled","1",""
"D40","NeoPixel_THT","key_switches:Untitled","1",""
"D41","NeoPixel_THT","key_switches:Untitled","1",""
"D42","NeoPixel_THT","key_switches:Untitled","1",""
"D43","NeoPixel_THT","key_switches:Untitled","1",""
"D44","NeoPixel_THT","key_switches:Untitled","1",""
"D45","NeoPixel_THT","key_switches:Untitled","1",""
"D46","NeoPixel_THT","key_switches:Untitled","1",""
"D47","NeoPixel_THT","key_switches:Untitled","1",""
"D48","NeoPixel_THT","key_switches:Untitled","1",""
"D49","NeoPixel_THT","key_switches:Untitled","1",""
"D50","NeoPixel_THT","key_switches:Untitled","1",""
"D51","NeoPixel_THT","key_switches:Untitled","1",""
"D52","NeoPixel_THT","key_switches:Untitled","1",""
"D53","NeoPixel_THT","key_switches:Untitled","1",""
"D54","NeoPixel_THT","key_switches:Untitled","1",""
"D55","NeoPixel_THT","key_switches:Untitled","1",""
"D56","NeoPixel_THT","key_switches:Untitled","1",""
"D57","NeoPixel_THT","key_switches:Untitled","1",""
"D58","NeoPixel_THT","key_switches:Untitled","1",""
"D59","NeoPixel_THT","key_switches:Untitled","1",""
"D60","NeoPixel_THT","key_switches:Untitled","1",""
"D61","NeoPixel_THT","key_switches:Untitled","1",""
"D62","NeoPixel_THT","key_switches:Untitled","1",""
"D63","NeoPixel_THT","key_switches:Untitled","1",""
"D64","NeoPixel_THT","key_switches:Untitled","1",""
"D65","NeoPixel_THT","key_switches:Untitled","1",""
"D66","NeoPixel_THT","key_switches:Untitled","1",""
"D67","NeoPixel_THT","key_switches:Untitled","1",""
"D68","NeoPixel_THT","key_switches:Untitled","1",""
"D69","NeoPixel_THT","key_switches:Untitled","1",""
"D70","NeoPixel_THT","key_switches:Untitled","1",""
"J1","AudioJack2","Connector_Audio:Jack_3.5mm_PJ320E_Horizontal","1",""
"J2","AudioJack2","Connector_Audio:Jack_3.5mm_PJ320E_Horizontal","1",""
"J3","Conn_01x10_Socket","Connector_Molex:Molex_CLIK-Mate_502382-1070_1x10-1MP_P1.25mm_Vertical","1",""
"R1","TBD","Resistor_SMD:R_0603_1608Metric","1",""
"R2","TBD","Resistor_SMD:R_0603_1608Metric","1",""
"R3","TBD","Resistor_SMD:R_0603_1608Metric","1",""
"R4","TBD","Resistor_SMD:R_0603_1608Metric","1",""
"SW1","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW2","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW3","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW4","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW5","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW6","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW7","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW8","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW9","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW10","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW11","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW12","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW13","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW14","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW15","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW16","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW17","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW18","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW19","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW20","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW21","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW22","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW23","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW24","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW25","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW26","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW27","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW28","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW29","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW30","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW31","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW32","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW33","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW34","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW35","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW36","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW37","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW38","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW39","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW40","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW41","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW42","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW43","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW44","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW45","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW46","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW47","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW48","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW49","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW50","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW51","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW52","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW53","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW54","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW55","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW56","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW57","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW58","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW59","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW60","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW61","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW62","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW63","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW64","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW65","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW66","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW67","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW68","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW69","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW70","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"UC1","PCA9506BS","Package_DFN_QFN:QFN-56-1EP_8x8mm_P0.5mm_EP4.3x4.3mm","1",""
"UC2","PCA9506BS","Package_DFN_QFN:QFN-56-1EP_8x8mm_P0.5mm_EP4.3x4.3mm","1",""
1 Refs Value Footprint Qty DNP
2 C1 100n Capacitor_SMD:C_0603_1608Metric 1
3 C2 100n Capacitor_SMD:C_0603_1608Metric 1
4 C3 100n Capacitor_SMD:C_0603_1608Metric 1
5 C4 100n Capacitor_SMD:C_0603_1608Metric 1
6 D1 NeoPixel_THT key_switches:Untitled 1
7 D2 NeoPixel_THT key_switches:Untitled 1
8 D3 NeoPixel_THT key_switches:Untitled 1
9 D4 NeoPixel_THT key_switches:Untitled 1
10 D5 NeoPixel_THT key_switches:Untitled 1
11 D6 NeoPixel_THT key_switches:Untitled 1
12 D7 NeoPixel_THT key_switches:Untitled 1
13 D8 NeoPixel_THT key_switches:Untitled 1
14 D9 NeoPixel_THT key_switches:Untitled 1
15 D10 NeoPixel_THT key_switches:Untitled 1
16 D11 NeoPixel_THT key_switches:Untitled 1
17 D12 NeoPixel_THT key_switches:Untitled 1
18 D13 NeoPixel_THT key_switches:Untitled 1
19 D14 NeoPixel_THT key_switches:Untitled 1
20 D15 NeoPixel_THT key_switches:Untitled 1
21 D16 NeoPixel_THT key_switches:Untitled 1
22 D17 NeoPixel_THT key_switches:Untitled 1
23 D18 NeoPixel_THT key_switches:Untitled 1
24 D19 NeoPixel_THT key_switches:Untitled 1
25 D20 NeoPixel_THT key_switches:Untitled 1
26 D21 NeoPixel_THT key_switches:Untitled 1
27 D22 NeoPixel_THT key_switches:Untitled 1
28 D23 NeoPixel_THT key_switches:Untitled 1
29 D24 NeoPixel_THT key_switches:Untitled 1
30 D25 NeoPixel_THT key_switches:Untitled 1
31 D26 NeoPixel_THT key_switches:Untitled 1
32 D27 NeoPixel_THT key_switches:Untitled 1
33 D28 NeoPixel_THT key_switches:Untitled 1
34 D29 NeoPixel_THT key_switches:Untitled 1
35 D30 NeoPixel_THT key_switches:Untitled 1
36 D31 NeoPixel_THT key_switches:Untitled 1
37 D32 NeoPixel_THT key_switches:Untitled 1
38 D33 NeoPixel_THT key_switches:Untitled 1
39 D34 NeoPixel_THT key_switches:Untitled 1
40 D35 NeoPixel_THT key_switches:Untitled 1
41 D36 NeoPixel_THT key_switches:Untitled 1
42 D37 NeoPixel_THT key_switches:Untitled 1
43 D38 NeoPixel_THT key_switches:Untitled 1
44 D39 NeoPixel_THT key_switches:Untitled 1
45 D40 NeoPixel_THT key_switches:Untitled 1
46 D41 NeoPixel_THT key_switches:Untitled 1
47 D42 NeoPixel_THT key_switches:Untitled 1
48 D43 NeoPixel_THT key_switches:Untitled 1
49 D44 NeoPixel_THT key_switches:Untitled 1
50 D45 NeoPixel_THT key_switches:Untitled 1
51 D46 NeoPixel_THT key_switches:Untitled 1
52 D47 NeoPixel_THT key_switches:Untitled 1
53 D48 NeoPixel_THT key_switches:Untitled 1
54 D49 NeoPixel_THT key_switches:Untitled 1
55 D50 NeoPixel_THT key_switches:Untitled 1
56 D51 NeoPixel_THT key_switches:Untitled 1
57 D52 NeoPixel_THT key_switches:Untitled 1
58 D53 NeoPixel_THT key_switches:Untitled 1
59 D54 NeoPixel_THT key_switches:Untitled 1
60 D55 NeoPixel_THT key_switches:Untitled 1
61 D56 NeoPixel_THT key_switches:Untitled 1
62 D57 NeoPixel_THT key_switches:Untitled 1
63 D58 NeoPixel_THT key_switches:Untitled 1
64 D59 NeoPixel_THT key_switches:Untitled 1
65 D60 NeoPixel_THT key_switches:Untitled 1
66 D61 NeoPixel_THT key_switches:Untitled 1
67 D62 NeoPixel_THT key_switches:Untitled 1
68 D63 NeoPixel_THT key_switches:Untitled 1
69 D64 NeoPixel_THT key_switches:Untitled 1
70 D65 NeoPixel_THT key_switches:Untitled 1
71 D66 NeoPixel_THT key_switches:Untitled 1
72 D67 NeoPixel_THT key_switches:Untitled 1
73 D68 NeoPixel_THT key_switches:Untitled 1
74 D69 NeoPixel_THT key_switches:Untitled 1
75 D70 NeoPixel_THT key_switches:Untitled 1
76 J1 AudioJack2 Connector_Audio:Jack_3.5mm_PJ320E_Horizontal 1
77 J2 AudioJack2 Connector_Audio:Jack_3.5mm_PJ320E_Horizontal 1
78 J3 Conn_01x10_Socket Connector_Molex:Molex_CLIK-Mate_502382-1070_1x10-1MP_P1.25mm_Vertical 1
79 R1 TBD Resistor_SMD:R_0603_1608Metric 1
80 R2 TBD Resistor_SMD:R_0603_1608Metric 1
81 R3 TBD Resistor_SMD:R_0603_1608Metric 1
82 R4 TBD Resistor_SMD:R_0603_1608Metric 1
83 SW1 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
84 SW2 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
85 SW3 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
86 SW4 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
87 SW5 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
88 SW6 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
89 SW7 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
90 SW8 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
91 SW9 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
92 SW10 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
93 SW11 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
94 SW12 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
95 SW13 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
96 SW14 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
97 SW15 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
98 SW16 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
99 SW17 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
100 SW18 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
101 SW19 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
102 SW20 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
103 SW21 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
104 SW22 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
105 SW23 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
106 SW24 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
107 SW25 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
108 SW26 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
109 SW27 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
110 SW28 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
111 SW29 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
112 SW30 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
113 SW31 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
114 SW32 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
115 SW33 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
116 SW34 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
117 SW35 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
118 SW36 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
119 SW37 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
120 SW38 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
121 SW39 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
122 SW40 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
123 SW41 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
124 SW42 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
125 SW43 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
126 SW44 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
127 SW45 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
128 SW46 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
129 SW47 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
130 SW48 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
131 SW49 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
132 SW50 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
133 SW51 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
134 SW52 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
135 SW53 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
136 SW54 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
137 SW55 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
138 SW56 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
139 SW57 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
140 SW58 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
141 SW59 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
142 SW60 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
143 SW61 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
144 SW62 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
145 SW63 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
146 SW64 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
147 SW65 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
148 SW66 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
149 SW67 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
150 SW68 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
151 SW69 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
152 SW70 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
153 UC1 PCA9506BS Package_DFN_QFN:QFN-56-1EP_8x8mm_P0.5mm_EP4.3x4.3mm 1
154 UC2 PCA9506BS Package_DFN_QFN:QFN-56-1EP_8x8mm_P0.5mm_EP4.3x4.3mm 1

View File

@@ -0,0 +1,188 @@
"Refs","Value","Footprint","Qty","DNP"
"C1","100n","","1",""
"C2","1u","","1",""
"C3","1u","","1",""
"C4","10u","","1",""
"C5","1u","","1",""
"C6","100n","","1",""
"C7","100n","","1",""
"C8","100n","","1",""
"C9","100n","","1",""
"C10","100n","","1",""
"C11","1u","","1",""
"C12","1u","","1",""
"C13","100n","","1",""
"C14","1u","","1",""
"C15","100n","","1",""
"C16","100n","","1",""
"C17","100n","","1",""
"C18","100n","","1",""
"C19","1u","","1",""
"C20","100n","","1",""
"C21","100n","","1",""
"C22","1u","","1",""
"C23","C","","1",""
"C24","C","","1",""
"C25","22u","Capacitor_SMD:C_0603_1608Metric","1",""
"C26","100n","","1",""
"C27","100n","","1",""
"C28","1u","","1",""
"C29","100n","","1",""
"C30","10u","","1",""
"C31","100n","Capacitor_SMD:C_0603_1608Metric","1",""
"C32","100n","","1",""
"C33","10u","","1",""
"C34","100n","","1",""
"C35","1u","Capacitor_SMD:C_0603_1608Metric","1",""
"C36","10u","","1",""
"C37","100n","","1",""
"C38","100n","","1",""
"C39","1u","Capacitor_SMD:C_0603_1608Metric","1",""
"C40","100n","","1",""
"C41","100n","","1",""
"C42","100n","","1",""
"C43","100n","","1",""
"C44","100n","","1",""
"C45","100n","","1",""
"C46","100n","","1",""
"C47","1u","","1",""
"C48","10u","","1",""
"C49","22u","","1",""
"C50","100n","","1",""
"C51","100n","","1",""
"C52","1u","Capacitor_SMD:C_0603_1608Metric","1",""
"C53","100n","","1",""
"C54","1u","","1",""
"C55","100n","","1",""
"C56","1u","Capacitor_SMD:C_0603_1608Metric","1",""
"C57","100n","","1",""
"C58","100n","","1",""
"C59","1u","","1",""
"C60","100n","","1",""
"C61","100n","","1",""
"C62","1u","","1",""
"C63","100n","","1",""
"C64","1u","","1",""
"C65","100n","","1",""
"C66","100n","","1",""
"D1","NUP2105L","Package_TO_SOT_SMD:SOT-23","1",""
"D2","TSM24A","Package_TO_SOT_SMD:SOT-23","1",""
"D3","LED","","1",""
"D4","LED","","1",""
"D5","LED","","1",""
"D6","SK6812","LED_SMD:LED_SK6812_PLCC4_5.0x5.0mm_P3.2mm","1",""
"D7","SK6812","LED_SMD:LED_SK6812_PLCC4_5.0x5.0mm_P3.2mm","1",""
"D8","SK6812","LED_SMD:LED_SK6812_PLCC4_5.0x5.0mm_P3.2mm","1",""
"J1","USB_C_Receptacle_USB2.0_14P","","1",""
"J2","USB_A","","1",""
"J3","USB_A","","1",""
"J4","USB_A","","1",""
"J5","Conn_01x10_Socket","Connector_Molex:Molex_CLIK-Mate_502382-1070_1x10-1MP_P1.25mm_Vertical","1",""
"J6","Conn_01x04_Pin","","1",""
"J7","Conn_01x04_Pin","","1",""
"J8","Conn_01x04_Pin","","1",""
"J9","Conn_01x04_Pin","","1",""
"JP3","PUEN","","1",""
"JP4","PUEN","","1",""
"JP5","PUEN","","1",""
"JP6","PUEN","","1",""
"JP7","PUEN","","1",""
"JP8","PUEN","","1",""
"JP9","PUEN","","1",""
"JP10","PUEN","","1",""
"JP11","PUEN","","1",""
"JP12","PUEN","","1",""
"Q1","PMOS","","1",""
"Q2","LRC L8050QLT1G","","1",""
"Q3","LRC L8050QLT1G","","1",""
"Q4","BSS138","Package_TO_SOT_SMD:SOT-23","1",""
"R1","0","","1",""
"R2","100k","","1",""
"R3","100k","","1",""
"R4","100k","","1",""
"R5","12k","","1",""
"R6","0R","","1",""
"R7","0R","","1",""
"R8","0R","","1",""
"R9","0R","","1",""
"R10","0R","","1",""
"R11","0R","","1",""
"R12","0R","","1",""
"R13","0R","","1",""
"R14","0R","","1","DNP"
"R15","0R","","1","DNP"
"R16","0R","","1",""
"R17","10k","","1",""
"R18","10k","","1",""
"R19","10k","","1",""
"R20","10k","","1",""
"R21","10k","","1",""
"R22","10k","","1",""
"R23","50k","","1",""
"R24","100k","","1",""
"R25","1k","","1",""
"R26","100k","","1",""
"R27","100","","1",""
"R28","22k","","1",""
"R29","1k","","1",""
"R30","1k","","1",""
"R31","4.7K","","1",""
"R32","1k","","1",""
"R33","1k","","1",""
"R34","10k","","1",""
"R35","10k","","1",""
"R36","0","","1",""
"R37","0","","1",""
"R38","0","","1",""
"R39","10k","","1",""
"R40","10K","","1",""
"R41","10K","","1",""
"R42","4.7K","","1",""
"R43","4.7K","","1",""
"R45","100k","","1",""
"R46","100k","","1",""
"R50","4.7k","","1",""
"R51","4.7K","","1",""
"R63","4.7K","","1",""
"R64","4.7K","","1",""
"R65","10k","Resistor_SMD:R_0603_1608Metric","1",""
"R66","4.7K","","1",""
"R67","0","Resistor_SMD:R_0603_1608Metric","1",""
"R68","10k","Resistor_SMD:R_0603_1608Metric","1",""
"R69","0","Resistor_SMD:R_0603_1608Metric","1",""
"R70","10k","Resistor_SMD:R_0603_1608Metric","1",""
"R72","4.7K","","1",""
"R73","0","Resistor_SMD:R_0603_1608Metric","1",""
"R74","4.7K","","1",""
"R75","4.7K","","1",""
"R79","4.7K","","1",""
"R80","4.7K","","1",""
"R81","4.7K","","1",""
"R82","4.7K","","1",""
"R83","4.7K","","1",""
"R84","100k","","1",""
"R86","4.7K","","1",""
"R87","4.7K","","1",""
"R88","4.7K","","1",""
"SW1","SW_Nidec_CAS-120A1","Button_Switch_SMD:Nidec_Copal_CAS-120A","1",""
"SW8","SW_Push","Button_Switch_SMD:SW_SPST_PTS810","1",""
"SW9","SW_Push","Button_Switch_SMD:SW_SPST_PTS810","1",""
"SW10","SW_Push","Button_Switch_SMD:SW_SPST_PTS810","1",""
"SW11","OS102011MS2QN1","Button_Switch_THT:SW_Slide-03_Wuerth-WS-SLTV_10x2.5x6.4_P2.54mm","1",""
"U1","STUSB4500QTR","Package_DFN_QFN:QFN-24-1EP_4x4mm_P0.5mm_EP2.7x2.7mm","1",""
"U2","USB2534","Package_DFN_QFN:QFN-36-1EP_6x6mm_P0.5mm_EP3.7x3.7mm","1",""
"U3","LM3235-H","Package_SO:SOIC-8_3.9x4.9mm_P1.27mm","1",""
"U4","LM3235-H","Package_SO:SOIC-8_3.9x4.9mm_P1.27mm","1",""
"U5","LM3235-H","Package_SO:SOIC-8_3.9x4.9mm_P1.27mm","1",""
"U6","USBLC6-2SC6","Package_TO_SOT_SMD:SOT-23-6","1",""
"U7","CH340X","Package_SO:MSOP-10_3x3mm_P0.5mm","1",""
"U8","TS3USB30EDGSR","Package_SO:VSSOP-10_3x3mm_P0.5mm","1",""
"U9","TXS0102DCT","Package_SO:SSOP-8_2.95x2.8mm_P0.65mm","1",""
"U13","ESP32-S3-WROOM-2","RF_Module:ESP32-S3-WROOM-2","1",""
"U14","TXS0102DCT","Package_SO:SSOP-8_2.95x2.8mm_P0.65mm","1",""
"U15","TXS0102DCT","Package_SO:SSOP-8_2.95x2.8mm_P0.65mm","1",""
"U16","TXS0102DCT","Package_SO:SSOP-8_2.95x2.8mm_P0.65mm","1",""
"U17","TXS0102DCT","Package_SO:SSOP-8_2.95x2.8mm_P0.65mm","1",""
"U18","TXS0102DCT","Package_SO:SSOP-8_2.95x2.8mm_P0.65mm","1",""
"U20","TXS0102DCT","Package_SO:SSOP-8_2.95x2.8mm_P0.65mm","1",""
"Y1","Crystal","","1",""
1 Refs Value Footprint Qty DNP
2 C1 100n 1
3 C2 1u 1
4 C3 1u 1
5 C4 10u 1
6 C5 1u 1
7 C6 100n 1
8 C7 100n 1
9 C8 100n 1
10 C9 100n 1
11 C10 100n 1
12 C11 1u 1
13 C12 1u 1
14 C13 100n 1
15 C14 1u 1
16 C15 100n 1
17 C16 100n 1
18 C17 100n 1
19 C18 100n 1
20 C19 1u 1
21 C20 100n 1
22 C21 100n 1
23 C22 1u 1
24 C23 C 1
25 C24 C 1
26 C25 22u Capacitor_SMD:C_0603_1608Metric 1
27 C26 100n 1
28 C27 100n 1
29 C28 1u 1
30 C29 100n 1
31 C30 10u 1
32 C31 100n Capacitor_SMD:C_0603_1608Metric 1
33 C32 100n 1
34 C33 10u 1
35 C34 100n 1
36 C35 1u Capacitor_SMD:C_0603_1608Metric 1
37 C36 10u 1
38 C37 100n 1
39 C38 100n 1
40 C39 1u Capacitor_SMD:C_0603_1608Metric 1
41 C40 100n 1
42 C41 100n 1
43 C42 100n 1
44 C43 100n 1
45 C44 100n 1
46 C45 100n 1
47 C46 100n 1
48 C47 1u 1
49 C48 10u 1
50 C49 22u 1
51 C50 100n 1
52 C51 100n 1
53 C52 1u Capacitor_SMD:C_0603_1608Metric 1
54 C53 100n 1
55 C54 1u 1
56 C55 100n 1
57 C56 1u Capacitor_SMD:C_0603_1608Metric 1
58 C57 100n 1
59 C58 100n 1
60 C59 1u 1
61 C60 100n 1
62 C61 100n 1
63 C62 1u 1
64 C63 100n 1
65 C64 1u 1
66 C65 100n 1
67 C66 100n 1
68 D1 NUP2105L Package_TO_SOT_SMD:SOT-23 1
69 D2 TSM24A Package_TO_SOT_SMD:SOT-23 1
70 D3 LED 1
71 D4 LED 1
72 D5 LED 1
73 D6 SK6812 LED_SMD:LED_SK6812_PLCC4_5.0x5.0mm_P3.2mm 1
74 D7 SK6812 LED_SMD:LED_SK6812_PLCC4_5.0x5.0mm_P3.2mm 1
75 D8 SK6812 LED_SMD:LED_SK6812_PLCC4_5.0x5.0mm_P3.2mm 1
76 J1 USB_C_Receptacle_USB2.0_14P 1
77 J2 USB_A 1
78 J3 USB_A 1
79 J4 USB_A 1
80 J5 Conn_01x10_Socket Connector_Molex:Molex_CLIK-Mate_502382-1070_1x10-1MP_P1.25mm_Vertical 1
81 J6 Conn_01x04_Pin 1
82 J7 Conn_01x04_Pin 1
83 J8 Conn_01x04_Pin 1
84 J9 Conn_01x04_Pin 1
85 JP3 PUEN 1
86 JP4 PUEN 1
87 JP5 PUEN 1
88 JP6 PUEN 1
89 JP7 PUEN 1
90 JP8 PUEN 1
91 JP9 PUEN 1
92 JP10 PUEN 1
93 JP11 PUEN 1
94 JP12 PUEN 1
95 Q1 PMOS 1
96 Q2 LRC L8050QLT1G 1
97 Q3 LRC L8050QLT1G 1
98 Q4 BSS138 Package_TO_SOT_SMD:SOT-23 1
99 R1 0 1
100 R2 100k 1
101 R3 100k 1
102 R4 100k 1
103 R5 12k 1
104 R6 0R 1
105 R7 0R 1
106 R8 0R 1
107 R9 0R 1
108 R10 0R 1
109 R11 0R 1
110 R12 0R 1
111 R13 0R 1
112 R14 0R 1 DNP
113 R15 0R 1 DNP
114 R16 0R 1
115 R17 10k 1
116 R18 10k 1
117 R19 10k 1
118 R20 10k 1
119 R21 10k 1
120 R22 10k 1
121 R23 50k 1
122 R24 100k 1
123 R25 1k 1
124 R26 100k 1
125 R27 100 1
126 R28 22k 1
127 R29 1k 1
128 R30 1k 1
129 R31 4.7K 1
130 R32 1k 1
131 R33 1k 1
132 R34 10k 1
133 R35 10k 1
134 R36 0 1
135 R37 0 1
136 R38 0 1
137 R39 10k 1
138 R40 10K 1
139 R41 10K 1
140 R42 4.7K 1
141 R43 4.7K 1
142 R45 100k 1
143 R46 100k 1
144 R50 4.7k 1
145 R51 4.7K 1
146 R63 4.7K 1
147 R64 4.7K 1
148 R65 10k Resistor_SMD:R_0603_1608Metric 1
149 R66 4.7K 1
150 R67 0 Resistor_SMD:R_0603_1608Metric 1
151 R68 10k Resistor_SMD:R_0603_1608Metric 1
152 R69 0 Resistor_SMD:R_0603_1608Metric 1
153 R70 10k Resistor_SMD:R_0603_1608Metric 1
154 R72 4.7K 1
155 R73 0 Resistor_SMD:R_0603_1608Metric 1
156 R74 4.7K 1
157 R75 4.7K 1
158 R79 4.7K 1
159 R80 4.7K 1
160 R81 4.7K 1
161 R82 4.7K 1
162 R83 4.7K 1
163 R84 100k 1
164 R86 4.7K 1
165 R87 4.7K 1
166 R88 4.7K 1
167 SW1 SW_Nidec_CAS-120A1 Button_Switch_SMD:Nidec_Copal_CAS-120A 1
168 SW8 SW_Push Button_Switch_SMD:SW_SPST_PTS810 1
169 SW9 SW_Push Button_Switch_SMD:SW_SPST_PTS810 1
170 SW10 SW_Push Button_Switch_SMD:SW_SPST_PTS810 1
171 SW11 OS102011MS2QN1 Button_Switch_THT:SW_Slide-03_Wuerth-WS-SLTV_10x2.5x6.4_P2.54mm 1
172 U1 STUSB4500QTR Package_DFN_QFN:QFN-24-1EP_4x4mm_P0.5mm_EP2.7x2.7mm 1
173 U2 USB2534 Package_DFN_QFN:QFN-36-1EP_6x6mm_P0.5mm_EP3.7x3.7mm 1
174 U3 LM3235-H Package_SO:SOIC-8_3.9x4.9mm_P1.27mm 1
175 U4 LM3235-H Package_SO:SOIC-8_3.9x4.9mm_P1.27mm 1
176 U5 LM3235-H Package_SO:SOIC-8_3.9x4.9mm_P1.27mm 1
177 U6 USBLC6-2SC6 Package_TO_SOT_SMD:SOT-23-6 1
178 U7 CH340X Package_SO:MSOP-10_3x3mm_P0.5mm 1
179 U8 TS3USB30EDGSR Package_SO:VSSOP-10_3x3mm_P0.5mm 1
180 U9 TXS0102DCT Package_SO:SSOP-8_2.95x2.8mm_P0.65mm 1
181 U13 ESP32-S3-WROOM-2 RF_Module:ESP32-S3-WROOM-2 1
182 U14 TXS0102DCT Package_SO:SSOP-8_2.95x2.8mm_P0.65mm 1
183 U15 TXS0102DCT Package_SO:SSOP-8_2.95x2.8mm_P0.65mm 1
184 U16 TXS0102DCT Package_SO:SSOP-8_2.95x2.8mm_P0.65mm 1
185 U17 TXS0102DCT Package_SO:SSOP-8_2.95x2.8mm_P0.65mm 1
186 U18 TXS0102DCT Package_SO:SSOP-8_2.95x2.8mm_P0.65mm 1
187 U20 TXS0102DCT Package_SO:SSOP-8_2.95x2.8mm_P0.65mm 1
188 Y1 Crystal 1

View File

@@ -0,0 +1,13 @@
** Drc report for keyboard_controller.kicad_pcb **
** Created on 2026-03-09T10:47:10+1300 **
** Found 1 DRC violations **
[invalid_outline]: Board has malformed outline (no edges found on Edge.Cuts layer)
Local override; error
@(0.0000 mm, 0.0000 mm): PCB
** Found 0 unconnected pads **
** Found 0 Footprint errors **
** End of Report **

View File

@@ -0,0 +1,129 @@
ERC report (2026-03-09T10:47:11+1300, Encoding UTF8)
***** Sheet /
[hier_label_mismatch]: Sheet pin PWR_3V3 has no matching hierarchical label inside the sheet
; error
@(124.46 mm, 55.88 mm): Hierarchical Sheet Pin PWR_3V3
[pin_not_connected]: Pin not connected
; error
@(124.46 mm, 55.88 mm): Hierarchical Sheet Pin PWR_3V3
[hier_label_mismatch]: Sheet pin PWR_5V has no matching hierarchical label inside the sheet
; error
@(124.46 mm, 58.42 mm): Hierarchical Sheet Pin PWR_5V
[pin_not_connected]: Pin not connected
; error
@(124.46 mm, 58.42 mm): Hierarchical Sheet Pin PWR_5V
[lib_symbol_mismatch]: Symbol 'USB_C_Receptacle_USB2.0_14P' doesn't match copy in library 'Connector'
; warning
@(58.42 mm, 104.14 mm): Symbol J1 [USB_C_Receptacle_USB2.0_14P]
[lib_symbol_mismatch]: Symbol 'STUSB4500QTR' doesn't match copy in library 'Interface_USB'
; warning
@(158.75 mm, 102.87 mm): Symbol U1 [STUSB4500QTR]
[lib_symbol_issues]: The current configuration does not include the symbol library 'keyboard_core_lib'
; warning
@(95.25 mm, 73.66 mm): Symbol U2 [USB2534]
[lib_symbol_issues]: The current configuration does not include the symbol library 'keyboard_core_lib'
; warning
@(219.71 mm, 39.37 mm): Symbol U3 [LM3525-H]
[lib_symbol_issues]: The current configuration does not include the symbol library 'keyboard_core_lib'
; warning
@(219.71 mm, 78.74 mm): Symbol U4 [LM3525-H]
[lib_symbol_issues]: The current configuration does not include the symbol library 'keyboard_core_lib'
; warning
@(219.71 mm, 118.11 mm): Symbol U5 [LM3525-H]
[lib_symbol_mismatch]: Symbol 'TXS0102DCT' doesn't match copy in library 'Logic_LevelTranslator'
; warning
@(43.18 mm, 49.53 mm): Symbol U20 [TXS0102DCT]
[lib_symbol_mismatch]: Symbol 'TXS0102DCT' doesn't match copy in library 'Logic_LevelTranslator'
; warning
@(43.18 mm, 107.95 mm): Symbol U15 [TXS0102DCT]
[lib_symbol_mismatch]: Symbol 'TXS0102DCT' doesn't match copy in library 'Logic_LevelTranslator'
; warning
@(124.46 mm, 49.53 mm): Symbol U17 [TXS0102DCT]
[lib_symbol_mismatch]: Symbol 'TXS0102DCT' doesn't match copy in library 'Logic_LevelTranslator'
; warning
@(124.46 mm, 110.49 mm): Symbol U18 [TXS0102DCT]
[lib_symbol_mismatch]: Symbol 'TXS0102DCT' doesn't match copy in library 'Logic_LevelTranslator'
; warning
@(43.18 mm, 167.64 mm): Symbol U16 [TXS0102DCT]
[lib_symbol_mismatch]: Symbol 'TXS0102DCT' doesn't match copy in library 'Logic_LevelTranslator'
; warning
@(123.19 mm, 171.45 mm): Symbol U9 [TXS0102DCT]
[lib_symbol_mismatch]: Symbol 'TXS0102DCT' doesn't match copy in library 'Logic_LevelTranslator'
; warning
@(224.79 mm, 52.07 mm): Symbol U14 [TXS0102DCT]
[lib_symbol_mismatch]: Symbol 'USB_A' doesn't match copy in library 'Connector'
; warning
@(114.30 mm, 64.77 mm): Symbol J4 [USB_A]
[lib_symbol_mismatch]: Symbol 'USB_A' doesn't match copy in library 'Connector'
; warning
@(252.73 mm, 60.96 mm): Symbol J2 [USB_A]
[lib_symbol_mismatch]: Symbol 'USB_A' doesn't match copy in library 'Connector'
; warning
@(252.73 mm, 109.22 mm): Symbol J3 [USB_A]
***** Sheet /MCU/
***** Sheet /keyboard_interface/
[multiple_net_names]: Both +5V and KEYBOARD_PWR are attached to the same items; +5V will be used in the netlist
; warning
@(248.92 mm, 24.13 mm): Symbol #PWR091 Pin 1 [Power input, Line]
@(74.93 mm, 113.03 mm): Label 'KEYBOARD_PWR'
***** Sheet /USB_hub/
[power_pin_not_driven]: Input Power pin not driven by any Output Power pins
; error
@(71.12 mm, 99.06 mm): Symbol U2 Pin 14 [VDD_1V2, Power input, Line]
[no_connect_connected]: A pin with a “no connection” flag is connected
; warning
@(99.06 mm, 135.89 mm): Symbol R14 Pin 2 [Passive, Line]
@(119.38 mm, 60.96 mm): No Connect
[power_pin_not_driven]: Input Power pin not driven by any Output Power pins
; error
@(200.66 mm, 20.32 mm): Symbol #PWR050 Pin 1 [Power input, Line]
[pin_to_pin]: Pins of type Power output and Power output are connected
; error
@(233.68 mm, 39.37 mm): Symbol U3 Pin 6 [OUT, Power output, Line]
@(233.68 mm, 36.83 mm): Symbol U3 Pin 8 [OUT, Power output, Line]
[pin_to_pin]: Pins of type Power output and Power output are connected
; error
@(233.68 mm, 78.74 mm): Symbol U4 Pin 6 [OUT, Power output, Line]
@(233.68 mm, 76.20 mm): Symbol U4 Pin 8 [OUT, Power output, Line]
[pin_to_pin]: Pins of type Power output and Power output are connected
; error
@(233.68 mm, 118.11 mm): Symbol U5 Pin 6 [OUT, Power output, Line]
@(233.68 mm, 115.57 mm): Symbol U5 Pin 8 [OUT, Power output, Line]
***** Sheet /USB_output_n_prog/
[power_pin_not_driven]: Input Power pin not driven by any Output Power pins
; error
@(64.77 mm, 46.99 mm): Symbol #PWR031 Pin 1 [Power input, Line]
[pin_to_pin]: Pins of type Open emitter and Output are connected
; error
@(128.27 mm, 123.19 mm): Symbol Q2 Pin 3 [E, Open emitter, Line]
@(109.22 mm, 120.65 mm): Symbol U7 Pin 4 [~{RTS}, Output, Line]
[pin_to_pin]: Pins of type Open emitter and Output are connected
; error
@(128.27 mm, 128.27 mm): Symbol Q3 Pin 3 [E, Open emitter, Line]
@(109.22 mm, 118.11 mm): Symbol U7 Pin 6 [TNOW/~{DTR}, Output, Line]
***** Sheet /USB_input/
[power_pin_not_driven]: Input Power pin not driven by any Output Power pins
; error
@(50.80 mm, 128.27 mm): Symbol #PWR03 Pin 1 [Power input, Line]
[power_pin_not_driven]: Input Power pin not driven by any Output Power pins
; error
@(58.42 mm, 128.27 mm): Symbol #PWR02 Pin 1 [Power input, Line]
[power_pin_not_driven]: Input Power pin not driven by any Output Power pins
; error
@(152.40 mm, 64.77 mm): Symbol U1 Pin 24 [VDD, Power input, Line]
[power_pin_not_driven]: Input Power pin not driven by any Output Power pins
; error
@(162.56 mm, 58.42 mm): Symbol #PWR01 Pin 1 [Power input, Line]
[power_pin_not_driven]: Input Power pin not driven by any Output Power pins
; error
@(219.71 mm, 36.83 mm): Symbol #PWR027 Pin 1 [Power input, Line]
***** Sheet /POWER/
** ERC messages: 35 Errors 17 Warnings 18

Binary file not shown.

1483
docs/keyboard_drc.rpt Normal file

File diff suppressed because it is too large Load Diff

884
docs/keyboard_erc.rpt Normal file
View File

@@ -0,0 +1,884 @@
ERC report (2026-03-09T10:47:07+1300, Encoding UTF8)
***** Sheet /
[footprint_link_issues]: The current configuration does not include the footprint library 'key_switches'.
; warning
@(113.03 mm, 48.26 mm): Symbol D65 [NeoPixel_THT]
[lib_symbol_mismatch]: Symbol 'NeoPixel_THT' doesn't match copy in library 'LED'
; warning
@(113.03 mm, 48.26 mm): Symbol D65 [NeoPixel_THT]
[footprint_link_issues]: The current configuration does not include the footprint library 'key_switches'.
; warning
@(128.27 mm, 48.26 mm): Symbol D66 [NeoPixel_THT]
[lib_symbol_mismatch]: Symbol 'NeoPixel_THT' doesn't match copy in library 'LED'
; warning
@(128.27 mm, 48.26 mm): Symbol D66 [NeoPixel_THT]
[footprint_link_issues]: The current configuration does not include the footprint library 'key_switches'.
; warning
@(143.51 mm, 48.26 mm): Symbol D67 [NeoPixel_THT]
[lib_symbol_mismatch]: Symbol 'NeoPixel_THT' doesn't match copy in library 'LED'
; warning
@(143.51 mm, 48.26 mm): Symbol D67 [NeoPixel_THT]
[footprint_link_issues]: The current configuration does not include the footprint library 'key_switches'.
; warning
@(158.75 mm, 48.26 mm): Symbol D68 [NeoPixel_THT]
[lib_symbol_mismatch]: Symbol 'NeoPixel_THT' doesn't match copy in library 'LED'
; warning
@(158.75 mm, 48.26 mm): Symbol D68 [NeoPixel_THT]
[footprint_link_issues]: The current configuration does not include the footprint library 'key_switches'.
; warning
@(173.99 mm, 48.26 mm): Symbol D69 [NeoPixel_THT]
[lib_symbol_mismatch]: Symbol 'NeoPixel_THT' doesn't match copy in library 'LED'
; warning
@(173.99 mm, 48.26 mm): Symbol D69 [NeoPixel_THT]
[footprint_link_issues]: The current configuration does not include the footprint library 'key_switches'.
; warning
@(189.23 mm, 48.26 mm): Symbol D70 [NeoPixel_THT]
[lib_symbol_mismatch]: Symbol 'NeoPixel_THT' doesn't match copy in library 'LED'
; warning
@(189.23 mm, 48.26 mm): Symbol D70 [NeoPixel_THT]
[footprint_link_issues]: The current configuration does not include the footprint library 'key_switches'.
; warning
@(204.47 mm, 48.26 mm): Symbol D59 [NeoPixel_THT]
[lib_symbol_mismatch]: Symbol 'NeoPixel_THT' doesn't match copy in library 'LED'
; warning
@(204.47 mm, 48.26 mm): Symbol D59 [NeoPixel_THT]
[pin_not_connected]: Pin not connected
; error
@(68.58 mm, 209.55 mm): Symbol #PWR061 Pin 1 [Power input, Line]
[pin_not_connected]: Pin not connected
; error
@(74.93 mm, 209.55 mm): Symbol #PWR0240 Pin 1 [Power input, Line]
[power_pin_not_driven]: Input Power pin not driven by any Output Power pins
; error
@(41.91 mm, 220.98 mm): Symbol #PWR03 Pin 1 [Power input, Line]
[footprint_link_issues]: The current configuration does not include the footprint library 'key_switches'.
; warning
@(219.71 mm, 48.26 mm): Symbol D58 [NeoPixel_THT]
[lib_symbol_mismatch]: Symbol 'NeoPixel_THT' doesn't match copy in library 'LED'
; warning
@(219.71 mm, 48.26 mm): Symbol D58 [NeoPixel_THT]
[power_pin_not_driven]: Input Power pin not driven by any Output Power pins
; error
@(3.81 mm, 236.22 mm): Symbol #PWR01 Pin 1 [Power input, Line]
[footprint_link_issues]: The current configuration does not include the footprint library 'key_switches'.
; warning
@(234.95 mm, 48.26 mm): Symbol D57 [NeoPixel_THT]
[lib_symbol_mismatch]: Symbol 'NeoPixel_THT' doesn't match copy in library 'LED'
; warning
@(234.95 mm, 48.26 mm): Symbol D57 [NeoPixel_THT]
[footprint_link_issues]: The current configuration does not include the footprint library 'key_switches'.
; warning
@(250.19 mm, 48.26 mm): Symbol D56 [NeoPixel_THT]
[lib_symbol_mismatch]: Symbol 'NeoPixel_THT' doesn't match copy in library 'LED'
; warning
@(250.19 mm, 48.26 mm): Symbol D56 [NeoPixel_THT]
[footprint_link_issues]: The current configuration does not include the footprint library 'key_switches'.
; warning
@(265.43 mm, 48.26 mm): Symbol D55 [NeoPixel_THT]
[lib_symbol_mismatch]: Symbol 'NeoPixel_THT' doesn't match copy in library 'LED'
; warning
@(265.43 mm, 48.26 mm): Symbol D55 [NeoPixel_THT]
[label_dangling]: Label not connected to anything
; error
@(71.12 mm, 262.89 mm): Label 'IO1_3_L'
[label_dangling]: Label not connected to anything
; error
@(71.12 mm, 265.43 mm): Label 'IO1_4_L'
[footprint_link_issues]: The current configuration does not include the footprint library 'CherryMX_KailhSocket_LTST-A683CEGBW-Rotated'.
; warning
@(129.54 mm, 243.84 mm): Symbol SW1 [CherryMX]
[lib_symbol_issues]: The current configuration does not include the symbol library 'CherryMX'
; warning
@(129.54 mm, 243.84 mm): Symbol SW1 [CherryMX]
[label_dangling]: Label not connected to anything
; error
@(71.12 mm, 267.97 mm): Label 'IO1_5_L'
[footprint_link_issues]: The current configuration does not include the footprint library 'key_switches'.
; warning
@(280.67 mm, 48.26 mm): Symbol D54 [NeoPixel_THT]
[lib_symbol_mismatch]: Symbol 'NeoPixel_THT' doesn't match copy in library 'LED'
; warning
@(280.67 mm, 48.26 mm): Symbol D54 [NeoPixel_THT]
[footprint_link_issues]: The current configuration does not include the footprint library 'CherryMX_KailhSocket_LTST-A683CEGBW-Rotated'.
; warning
@(156.21 mm, 242.57 mm): Symbol SW2 [CherryMX]
[lib_symbol_issues]: The current configuration does not include the symbol library 'CherryMX'
; warning
@(156.21 mm, 242.57 mm): Symbol SW2 [CherryMX]
[footprint_link_issues]: The current configuration does not include the footprint library 'CherryMX_KailhSocket_LTST-A683CEGBW-Rotated'.
; warning
@(129.54 mm, 266.70 mm): Symbol SW22 [CherryMX]
[lib_symbol_issues]: The current configuration does not include the symbol library 'CherryMX'
; warning
@(129.54 mm, 266.70 mm): Symbol SW22 [CherryMX]
[footprint_link_issues]: The current configuration does not include the footprint library 'key_switches'.
; warning
@(295.91 mm, 48.26 mm): Symbol D53 [NeoPixel_THT]
[lib_symbol_mismatch]: Symbol 'NeoPixel_THT' doesn't match copy in library 'LED'
; warning
@(295.91 mm, 48.26 mm): Symbol D53 [NeoPixel_THT]
[footprint_link_issues]: The current configuration does not include the footprint library 'CherryMX_KailhSocket_LTST-A683CEGBW-Rotated'.
; warning
@(182.88 mm, 241.30 mm): Symbol SW3 [CherryMX]
[lib_symbol_issues]: The current configuration does not include the symbol library 'CherryMX'
; warning
@(182.88 mm, 241.30 mm): Symbol SW3 [CherryMX]
[footprint_link_issues]: The current configuration does not include the footprint library 'key_switches'.
; warning
@(295.91 mm, 80.01 mm): Symbol D44 [NeoPixel_THT]
[lib_symbol_mismatch]: Symbol 'NeoPixel_THT' doesn't match copy in library 'LED'
; warning
@(295.91 mm, 80.01 mm): Symbol D44 [NeoPixel_THT]
[footprint_link_issues]: The current configuration does not include the footprint library 'CherryMX_KailhSocket_LTST-A683CEGBW-Rotated'.
; warning
@(156.21 mm, 265.43 mm): Symbol SW20 [CherryMX]
[lib_symbol_issues]: The current configuration does not include the symbol library 'CherryMX'
; warning
@(156.21 mm, 265.43 mm): Symbol SW20 [CherryMX]
[footprint_link_issues]: The current configuration does not include the footprint library 'key_switches'.
; warning
@(311.15 mm, 48.26 mm): Symbol D52 [NeoPixel_THT]
[lib_symbol_mismatch]: Symbol 'NeoPixel_THT' doesn't match copy in library 'LED'
; warning
@(311.15 mm, 48.26 mm): Symbol D52 [NeoPixel_THT]
[footprint_link_issues]: The current configuration does not include the footprint library 'key_switches'.
; warning
@(295.91 mm, 107.95 mm): Symbol D30 [NeoPixel_THT]
[lib_symbol_mismatch]: Symbol 'NeoPixel_THT' doesn't match copy in library 'LED'
; warning
@(295.91 mm, 107.95 mm): Symbol D30 [NeoPixel_THT]
[footprint_link_issues]: The current configuration does not include the footprint library 'CherryMX_KailhSocket_LTST-A683CEGBW-Rotated'.
; warning
@(209.55 mm, 240.03 mm): Symbol SW4 [CherryMX]
[lib_symbol_issues]: The current configuration does not include the symbol library 'CherryMX'
; warning
@(209.55 mm, 240.03 mm): Symbol SW4 [CherryMX]
[pin_not_connected]: Pin not connected
; error
@(288.29 mm, 138.43 mm): Symbol D15 Pin 3 [DOUT, Output, Line]
[footprint_link_issues]: The current configuration does not include the footprint library 'key_switches'.
; warning
@(311.15 mm, 80.01 mm): Symbol D43 [NeoPixel_THT]
[lib_symbol_mismatch]: Symbol 'NeoPixel_THT' doesn't match copy in library 'LED'
; warning
@(311.15 mm, 80.01 mm): Symbol D43 [NeoPixel_THT]
[footprint_link_issues]: The current configuration does not include the footprint library 'CherryMX_KailhSocket_LTST-A683CEGBW-Rotated'.
; warning
@(182.88 mm, 264.16 mm): Symbol SW18 [CherryMX]
[lib_symbol_issues]: The current configuration does not include the symbol library 'CherryMX'
; warning
@(182.88 mm, 264.16 mm): Symbol SW18 [CherryMX]
[footprint_link_issues]: The current configuration does not include the footprint library 'key_switches'.
; warning
@(295.91 mm, 138.43 mm): Symbol D15 [NeoPixel_THT]
[lib_symbol_mismatch]: Symbol 'NeoPixel_THT' doesn't match copy in library 'LED'
; warning
@(295.91 mm, 138.43 mm): Symbol D15 [NeoPixel_THT]
[footprint_link_issues]: The current configuration does not include the footprint library 'CherryMX_KailhSocket_LTST-A683CEGBW-Rotated'.
; warning
@(156.21 mm, 288.29 mm): Symbol SW37 [CherryMX]
[lib_symbol_issues]: The current configuration does not include the symbol library 'CherryMX'
; warning
@(156.21 mm, 288.29 mm): Symbol SW37 [CherryMX]
[footprint_link_issues]: The current configuration does not include the footprint library 'key_switches'.
; warning
@(311.15 mm, 107.95 mm): Symbol D29 [NeoPixel_THT]
[lib_symbol_mismatch]: Symbol 'NeoPixel_THT' doesn't match copy in library 'LED'
; warning
@(311.15 mm, 107.95 mm): Symbol D29 [NeoPixel_THT]
[footprint_link_issues]: The current configuration does not include the footprint library 'key_switches'.
; warning
@(326.39 mm, 48.26 mm): Symbol D64 [NeoPixel_THT]
[lib_symbol_mismatch]: Symbol 'NeoPixel_THT' doesn't match copy in library 'LED'
; warning
@(326.39 mm, 48.26 mm): Symbol D64 [NeoPixel_THT]
[label_dangling]: Label not connected to anything
; error
@(71.12 mm, 323.85 mm): Label 'IO4_0_L'
[footprint_link_issues]: The current configuration does not include the footprint library 'CherryMX_KailhSocket_LTST-A683CEGBW-Rotated'.
; warning
@(236.22 mm, 238.76 mm): Symbol SW5 [CherryMX]
[lib_symbol_issues]: The current configuration does not include the symbol library 'CherryMX'
; warning
@(236.22 mm, 238.76 mm): Symbol SW5 [CherryMX]
[footprint_link_issues]: The current configuration does not include the footprint library 'key_switches'.
; warning
@(326.39 mm, 80.01 mm): Symbol D42 [NeoPixel_THT]
[lib_symbol_mismatch]: Symbol 'NeoPixel_THT' doesn't match copy in library 'LED'
; warning
@(326.39 mm, 80.01 mm): Symbol D42 [NeoPixel_THT]
[footprint_link_issues]: The current configuration does not include the footprint library 'CherryMX_KailhSocket_LTST-A683CEGBW-Rotated'.
; warning
@(209.55 mm, 262.89 mm): Symbol SW23 [CherryMX]
[lib_symbol_issues]: The current configuration does not include the symbol library 'CherryMX'
; warning
@(209.55 mm, 262.89 mm): Symbol SW23 [CherryMX]
[footprint_link_issues]: The current configuration does not include the footprint library 'CherryMX_KailhSocket_LTST-A683CEGBW-Rotated'.
; warning
@(129.54 mm, 313.69 mm): Symbol SW52 [CherryMX]
[lib_symbol_issues]: The current configuration does not include the symbol library 'CherryMX'
; warning
@(129.54 mm, 313.69 mm): Symbol SW52 [CherryMX]
[footprint_link_issues]: The current configuration does not include the footprint library 'CherryMX_KailhSocket_LTST-A683CEGBW-Rotated'.
; warning
@(182.88 mm, 287.02 mm): Symbol SW35 [CherryMX]
[lib_symbol_issues]: The current configuration does not include the symbol library 'CherryMX'
; warning
@(182.88 mm, 287.02 mm): Symbol SW35 [CherryMX]
[footprint_link_issues]: The current configuration does not include the footprint library 'key_switches'.
; warning
@(311.15 mm, 138.43 mm): Symbol D14 [NeoPixel_THT]
[lib_symbol_mismatch]: Symbol 'NeoPixel_THT' doesn't match copy in library 'LED'
; warning
@(311.15 mm, 138.43 mm): Symbol D14 [NeoPixel_THT]
[footprint_link_issues]: The current configuration does not include the footprint library 'key_switches'.
; warning
@(326.39 mm, 107.95 mm): Symbol D28 [NeoPixel_THT]
[lib_symbol_mismatch]: Symbol 'NeoPixel_THT' doesn't match copy in library 'LED'
; warning
@(326.39 mm, 107.95 mm): Symbol D28 [NeoPixel_THT]
[footprint_link_issues]: The current configuration does not include the footprint library 'key_switches'.
; warning
@(341.63 mm, 48.26 mm): Symbol D51 [NeoPixel_THT]
[lib_symbol_mismatch]: Symbol 'NeoPixel_THT' doesn't match copy in library 'LED'
; warning
@(341.63 mm, 48.26 mm): Symbol D51 [NeoPixel_THT]
[footprint_link_issues]: The current configuration does not include the footprint library 'CherryMX_KailhSocket_LTST-A683CEGBW-Rotated'.
; warning
@(156.21 mm, 311.15 mm): Symbol SW51 [CherryMX]
[lib_symbol_issues]: The current configuration does not include the symbol library 'CherryMX'
; warning
@(156.21 mm, 311.15 mm): Symbol SW51 [CherryMX]
[label_dangling]: Label not connected to anything
; error
@(71.12 mm, 341.63 mm): Label 'IO4_7_L'
[footprint_link_issues]: The current configuration does not include the footprint library 'key_switches'.
; warning
@(341.63 mm, 80.01 mm): Symbol D41 [NeoPixel_THT]
[lib_symbol_mismatch]: Symbol 'NeoPixel_THT' doesn't match copy in library 'LED'
; warning
@(341.63 mm, 80.01 mm): Symbol D41 [NeoPixel_THT]
[footprint_link_issues]: The current configuration does not include the footprint library 'CherryMX_KailhSocket_LTST-A683CEGBW-Rotated'.
; warning
@(236.22 mm, 261.62 mm): Symbol SW21 [CherryMX]
[lib_symbol_issues]: The current configuration does not include the symbol library 'CherryMX'
; warning
@(236.22 mm, 261.62 mm): Symbol SW21 [CherryMX]
[footprint_link_issues]: The current configuration does not include the footprint library 'CherryMX_KailhSocket_LTST-A683CEGBW-Rotated'.
; warning
@(262.89 mm, 237.49 mm): Symbol SW6 [CherryMX]
[lib_symbol_issues]: The current configuration does not include the symbol library 'CherryMX'
; warning
@(262.89 mm, 237.49 mm): Symbol SW6 [CherryMX]
[footprint_link_issues]: The current configuration does not include the footprint library 'CherryMX_KailhSocket_LTST-A683CEGBW-Rotated'.
; warning
@(209.55 mm, 285.75 mm): Symbol SW33 [CherryMX]
[lib_symbol_issues]: The current configuration does not include the symbol library 'CherryMX'
; warning
@(209.55 mm, 285.75 mm): Symbol SW33 [CherryMX]
[footprint_link_issues]: The current configuration does not include the footprint library 'key_switches'.
; warning
@(326.39 mm, 138.43 mm): Symbol D13 [NeoPixel_THT]
[lib_symbol_mismatch]: Symbol 'NeoPixel_THT' doesn't match copy in library 'LED'
; warning
@(326.39 mm, 138.43 mm): Symbol D13 [NeoPixel_THT]
[footprint_link_issues]: The current configuration does not include the footprint library 'key_switches'.
; warning
@(341.63 mm, 107.95 mm): Symbol D27 [NeoPixel_THT]
[lib_symbol_mismatch]: Symbol 'NeoPixel_THT' doesn't match copy in library 'LED'
; warning
@(341.63 mm, 107.95 mm): Symbol D27 [NeoPixel_THT]
[footprint_link_issues]: The current configuration does not include the footprint library 'CherryMX_KailhSocket_LTST-A683CEGBW-Rotated'.
; warning
@(182.88 mm, 309.88 mm): Symbol SW49 [CherryMX]
[lib_symbol_issues]: The current configuration does not include the symbol library 'CherryMX'
; warning
@(182.88 mm, 309.88 mm): Symbol SW49 [CherryMX]
[footprint_link_issues]: The current configuration does not include the footprint library 'key_switches'.
; warning
@(356.87 mm, 48.26 mm): Symbol D50 [NeoPixel_THT]
[lib_symbol_mismatch]: Symbol 'NeoPixel_THT' doesn't match copy in library 'LED'
; warning
@(356.87 mm, 48.26 mm): Symbol D50 [NeoPixel_THT]
[footprint_link_issues]: The current configuration does not include the footprint library 'key_switches'.
; warning
@(356.87 mm, 80.01 mm): Symbol D40 [NeoPixel_THT]
[lib_symbol_mismatch]: Symbol 'NeoPixel_THT' doesn't match copy in library 'LED'
; warning
@(356.87 mm, 80.01 mm): Symbol D40 [NeoPixel_THT]
[footprint_link_issues]: The current configuration does not include the footprint library 'key_switches'.
; warning
@(341.63 mm, 138.43 mm): Symbol D12 [NeoPixel_THT]
[lib_symbol_mismatch]: Symbol 'NeoPixel_THT' doesn't match copy in library 'LED'
; warning
@(341.63 mm, 138.43 mm): Symbol D12 [NeoPixel_THT]
[footprint_link_issues]: The current configuration does not include the footprint library 'CherryMX_KailhSocket_LTST-A683CEGBW-Rotated'.
; warning
@(156.21 mm, 334.01 mm): Symbol SW63 [CherryMX]
[lib_symbol_issues]: The current configuration does not include the symbol library 'CherryMX'
; warning
@(156.21 mm, 334.01 mm): Symbol SW63 [CherryMX]
[footprint_link_issues]: The current configuration does not include the footprint library 'CherryMX_KailhSocket_LTST-A683CEGBW-Rotated'.
; warning
@(236.22 mm, 284.48 mm): Symbol SW36 [CherryMX]
[lib_symbol_issues]: The current configuration does not include the symbol library 'CherryMX'
; warning
@(236.22 mm, 284.48 mm): Symbol SW36 [CherryMX]
[footprint_link_issues]: The current configuration does not include the footprint library 'CherryMX_KailhSocket_LTST-A683CEGBW-Rotated'.
; warning
@(262.89 mm, 260.35 mm): Symbol SW19 [CherryMX]
[lib_symbol_issues]: The current configuration does not include the symbol library 'CherryMX'
; warning
@(262.89 mm, 260.35 mm): Symbol SW19 [CherryMX]
[footprint_link_issues]: The current configuration does not include the footprint library 'key_switches'.
; warning
@(356.87 mm, 107.95 mm): Symbol D26 [NeoPixel_THT]
[lib_symbol_mismatch]: Symbol 'NeoPixel_THT' doesn't match copy in library 'LED'
; warning
@(356.87 mm, 107.95 mm): Symbol D26 [NeoPixel_THT]
[footprint_link_issues]: The current configuration does not include the footprint library 'CherryMX_KailhSocket_LTST-A683CEGBW-Rotated'.
; warning
@(209.55 mm, 308.61 mm): Symbol SW47 [CherryMX]
[lib_symbol_issues]: The current configuration does not include the symbol library 'CherryMX'
; warning
@(209.55 mm, 308.61 mm): Symbol SW47 [CherryMX]
[footprint_link_issues]: The current configuration does not include the footprint library 'CherryMX_KailhSocket_LTST-A683CEGBW-Rotated'.
; warning
@(289.56 mm, 236.22 mm): Symbol SW7 [CherryMX]
[lib_symbol_issues]: The current configuration does not include the symbol library 'CherryMX'
; warning
@(289.56 mm, 236.22 mm): Symbol SW7 [CherryMX]
[footprint_link_issues]: The current configuration does not include the footprint library 'key_switches'.
; warning
@(372.11 mm, 48.26 mm): Symbol D49 [NeoPixel_THT]
[lib_symbol_mismatch]: Symbol 'NeoPixel_THT' doesn't match copy in library 'LED'
; warning
@(372.11 mm, 48.26 mm): Symbol D49 [NeoPixel_THT]
[footprint_link_issues]: The current configuration does not include the footprint library 'CherryMX_KailhSocket_LTST-A683CEGBW-Rotated'.
; warning
@(182.88 mm, 332.74 mm): Symbol SW62 [CherryMX]
[lib_symbol_issues]: The current configuration does not include the symbol library 'CherryMX'
; warning
@(182.88 mm, 332.74 mm): Symbol SW62 [CherryMX]
[footprint_link_issues]: The current configuration does not include the footprint library 'key_switches'.
; warning
@(372.11 mm, 80.01 mm): Symbol D39 [NeoPixel_THT]
[lib_symbol_mismatch]: Symbol 'NeoPixel_THT' doesn't match copy in library 'LED'
; warning
@(372.11 mm, 80.01 mm): Symbol D39 [NeoPixel_THT]
[footprint_link_issues]: The current configuration does not include the footprint library 'key_switches'.
; warning
@(356.87 mm, 138.43 mm): Symbol D11 [NeoPixel_THT]
[lib_symbol_mismatch]: Symbol 'NeoPixel_THT' doesn't match copy in library 'LED'
; warning
@(356.87 mm, 138.43 mm): Symbol D11 [NeoPixel_THT]
[footprint_link_issues]: The current configuration does not include the footprint library 'CherryMX_KailhSocket_LTST-A683CEGBW-Rotated'.
; warning
@(262.89 mm, 283.21 mm): Symbol SW34 [CherryMX]
[lib_symbol_issues]: The current configuration does not include the symbol library 'CherryMX'
; warning
@(262.89 mm, 283.21 mm): Symbol SW34 [CherryMX]
[footprint_link_issues]: The current configuration does not include the footprint library 'key_switches'.
; warning
@(372.11 mm, 107.95 mm): Symbol D25 [NeoPixel_THT]
[lib_symbol_mismatch]: Symbol 'NeoPixel_THT' doesn't match copy in library 'LED'
; warning
@(372.11 mm, 107.95 mm): Symbol D25 [NeoPixel_THT]
[footprint_link_issues]: The current configuration does not include the footprint library 'CherryMX_KailhSocket_LTST-A683CEGBW-Rotated'.
; warning
@(236.22 mm, 307.34 mm): Symbol SW50 [CherryMX]
[lib_symbol_issues]: The current configuration does not include the symbol library 'CherryMX'
; warning
@(236.22 mm, 307.34 mm): Symbol SW50 [CherryMX]
[footprint_link_issues]: The current configuration does not include the footprint library 'CherryMX_KailhSocket_LTST-A683CEGBW-Rotated'.
; warning
@(289.56 mm, 259.08 mm): Symbol SW17 [CherryMX]
[lib_symbol_issues]: The current configuration does not include the symbol library 'CherryMX'
; warning
@(289.56 mm, 259.08 mm): Symbol SW17 [CherryMX]
[footprint_link_issues]: The current configuration does not include the footprint library 'key_switches'.
; warning
@(387.35 mm, 48.26 mm): Symbol D63 [NeoPixel_THT]
[lib_symbol_mismatch]: Symbol 'NeoPixel_THT' doesn't match copy in library 'LED'
; warning
@(387.35 mm, 48.26 mm): Symbol D63 [NeoPixel_THT]
[footprint_link_issues]: The current configuration does not include the footprint library 'CherryMX_KailhSocket_LTST-A683CEGBW-Rotated'.
; warning
@(209.55 mm, 331.47 mm): Symbol SW61 [CherryMX]
[lib_symbol_issues]: The current configuration does not include the symbol library 'CherryMX'
; warning
@(209.55 mm, 331.47 mm): Symbol SW61 [CherryMX]
[footprint_link_issues]: The current configuration does not include the footprint library 'CherryMX_KailhSocket_LTST-A683CEGBW-Rotated'.
; warning
@(316.23 mm, 234.95 mm): Symbol SW8 [CherryMX]
[lib_symbol_issues]: The current configuration does not include the symbol library 'CherryMX'
; warning
@(316.23 mm, 234.95 mm): Symbol SW8 [CherryMX]
[footprint_link_issues]: The current configuration does not include the footprint library 'key_switches'.
; warning
@(387.35 mm, 80.01 mm): Symbol D38 [NeoPixel_THT]
[lib_symbol_mismatch]: Symbol 'NeoPixel_THT' doesn't match copy in library 'LED'
; warning
@(387.35 mm, 80.01 mm): Symbol D38 [NeoPixel_THT]
[footprint_link_issues]: The current configuration does not include the footprint library 'key_switches'.
; warning
@(372.11 mm, 138.43 mm): Symbol D10 [NeoPixel_THT]
[lib_symbol_mismatch]: Symbol 'NeoPixel_THT' doesn't match copy in library 'LED'
; warning
@(372.11 mm, 138.43 mm): Symbol D10 [NeoPixel_THT]
[footprint_link_issues]: The current configuration does not include the footprint library 'key_switches'.
; warning
@(387.35 mm, 107.95 mm): Symbol D24 [NeoPixel_THT]
[lib_symbol_mismatch]: Symbol 'NeoPixel_THT' doesn't match copy in library 'LED'
; warning
@(387.35 mm, 107.95 mm): Symbol D24 [NeoPixel_THT]
[footprint_link_issues]: The current configuration does not include the footprint library 'CherryMX_KailhSocket_LTST-A683CEGBW-Rotated'.
; warning
@(262.89 mm, 306.07 mm): Symbol SW48 [CherryMX]
[lib_symbol_issues]: The current configuration does not include the symbol library 'CherryMX'
; warning
@(262.89 mm, 306.07 mm): Symbol SW48 [CherryMX]
[footprint_link_issues]: The current configuration does not include the footprint library 'CherryMX_KailhSocket_LTST-A683CEGBW-Rotated'.
; warning
@(289.56 mm, 281.94 mm): Symbol SW32 [CherryMX]
[lib_symbol_issues]: The current configuration does not include the symbol library 'CherryMX'
; warning
@(289.56 mm, 281.94 mm): Symbol SW32 [CherryMX]
[footprint_link_issues]: The current configuration does not include the footprint library 'key_switches'.
; warning
@(402.59 mm, 48.26 mm): Symbol D48 [NeoPixel_THT]
[lib_symbol_mismatch]: Symbol 'NeoPixel_THT' doesn't match copy in library 'LED'
; warning
@(402.59 mm, 48.26 mm): Symbol D48 [NeoPixel_THT]
[footprint_link_issues]: The current configuration does not include the footprint library 'CherryMX_KailhSocket_LTST-A683CEGBW-Rotated'.
; warning
@(236.22 mm, 330.20 mm): Symbol SW60 [CherryMX]
[lib_symbol_issues]: The current configuration does not include the symbol library 'CherryMX'
; warning
@(236.22 mm, 330.20 mm): Symbol SW60 [CherryMX]
[footprint_link_issues]: The current configuration does not include the footprint library 'CherryMX_KailhSocket_LTST-A683CEGBW-Rotated'.
; warning
@(316.23 mm, 257.81 mm): Symbol SW16 [CherryMX]
[lib_symbol_issues]: The current configuration does not include the symbol library 'CherryMX'
; warning
@(316.23 mm, 257.81 mm): Symbol SW16 [CherryMX]
[footprint_link_issues]: The current configuration does not include the footprint library 'key_switches'.
; warning
@(402.59 mm, 80.01 mm): Symbol D37 [NeoPixel_THT]
[lib_symbol_mismatch]: Symbol 'NeoPixel_THT' doesn't match copy in library 'LED'
; warning
@(402.59 mm, 80.01 mm): Symbol D37 [NeoPixel_THT]
[footprint_link_issues]: The current configuration does not include the footprint library 'key_switches'.
; warning
@(387.35 mm, 138.43 mm): Symbol D9 [NeoPixel_THT]
[lib_symbol_mismatch]: Symbol 'NeoPixel_THT' doesn't match copy in library 'LED'
; warning
@(387.35 mm, 138.43 mm): Symbol D9 [NeoPixel_THT]
[footprint_link_issues]: The current configuration does not include the footprint library 'CherryMX_KailhSocket_LTST-A683CEGBW-Rotated'.
; warning
@(342.90 mm, 236.22 mm): Symbol SW9 [CherryMX]
[lib_symbol_issues]: The current configuration does not include the symbol library 'CherryMX'
; warning
@(342.90 mm, 236.22 mm): Symbol SW9 [CherryMX]
[footprint_link_issues]: The current configuration does not include the footprint library 'key_switches'.
; warning
@(402.59 mm, 107.95 mm): Symbol D23 [NeoPixel_THT]
[lib_symbol_mismatch]: Symbol 'NeoPixel_THT' doesn't match copy in library 'LED'
; warning
@(402.59 mm, 107.95 mm): Symbol D23 [NeoPixel_THT]
[footprint_link_issues]: The current configuration does not include the footprint library 'CherryMX_KailhSocket_LTST-A683CEGBW-Rotated'.
; warning
@(289.56 mm, 304.80 mm): Symbol SW46 [CherryMX]
[lib_symbol_issues]: The current configuration does not include the symbol library 'CherryMX'
; warning
@(289.56 mm, 304.80 mm): Symbol SW46 [CherryMX]
[footprint_link_issues]: The current configuration does not include the footprint library 'key_switches'.
; warning
@(417.83 mm, 48.26 mm): Symbol D47 [NeoPixel_THT]
[lib_symbol_mismatch]: Symbol 'NeoPixel_THT' doesn't match copy in library 'LED'
; warning
@(417.83 mm, 48.26 mm): Symbol D47 [NeoPixel_THT]
[footprint_link_issues]: The current configuration does not include the footprint library 'CherryMX_KailhSocket_LTST-A683CEGBW-Rotated'.
; warning
@(316.23 mm, 280.67 mm): Symbol SW31 [CherryMX]
[lib_symbol_issues]: The current configuration does not include the symbol library 'CherryMX'
; warning
@(316.23 mm, 280.67 mm): Symbol SW31 [CherryMX]
[footprint_link_issues]: The current configuration does not include the footprint library 'key_switches'.
; warning
@(417.83 mm, 80.01 mm): Symbol D36 [NeoPixel_THT]
[lib_symbol_mismatch]: Symbol 'NeoPixel_THT' doesn't match copy in library 'LED'
; warning
@(417.83 mm, 80.01 mm): Symbol D36 [NeoPixel_THT]
[footprint_link_issues]: The current configuration does not include the footprint library 'key_switches'.
; warning
@(402.59 mm, 138.43 mm): Symbol D8 [NeoPixel_THT]
[lib_symbol_mismatch]: Symbol 'NeoPixel_THT' doesn't match copy in library 'LED'
; warning
@(402.59 mm, 138.43 mm): Symbol D8 [NeoPixel_THT]
[footprint_link_issues]: The current configuration does not include the footprint library 'CherryMX_KailhSocket_LTST-A683CEGBW-Rotated'.
; warning
@(342.90 mm, 259.08 mm): Symbol SW25 [CherryMX]
[lib_symbol_issues]: The current configuration does not include the symbol library 'CherryMX'
; warning
@(342.90 mm, 259.08 mm): Symbol SW25 [CherryMX]
[footprint_link_issues]: The current configuration does not include the footprint library 'key_switches'.
; warning
@(417.83 mm, 107.95 mm): Symbol D22 [NeoPixel_THT]
[lib_symbol_mismatch]: Symbol 'NeoPixel_THT' doesn't match copy in library 'LED'
; warning
@(417.83 mm, 107.95 mm): Symbol D22 [NeoPixel_THT]
[footprint_link_issues]: The current configuration does not include the footprint library 'key_switches'.
; warning
@(433.07 mm, 48.26 mm): Symbol D46 [NeoPixel_THT]
[lib_symbol_mismatch]: Symbol 'NeoPixel_THT' doesn't match copy in library 'LED'
; warning
@(433.07 mm, 48.26 mm): Symbol D46 [NeoPixel_THT]
[footprint_link_issues]: The current configuration does not include the footprint library 'CherryMX_KailhSocket_LTST-A683CEGBW-Rotated'.
; warning
@(316.23 mm, 303.53 mm): Symbol SW45 [CherryMX]
[lib_symbol_issues]: The current configuration does not include the symbol library 'CherryMX'
; warning
@(316.23 mm, 303.53 mm): Symbol SW45 [CherryMX]
[footprint_link_issues]: The current configuration does not include the footprint library 'CherryMX_KailhSocket_LTST-A683CEGBW-Rotated'.
; warning
@(369.57 mm, 237.49 mm): Symbol SW10 [CherryMX]
[lib_symbol_issues]: The current configuration does not include the symbol library 'CherryMX'
; warning
@(369.57 mm, 237.49 mm): Symbol SW10 [CherryMX]
[footprint_link_issues]: The current configuration does not include the footprint library 'key_switches'.
; warning
@(417.83 mm, 138.43 mm): Symbol D7 [NeoPixel_THT]
[lib_symbol_mismatch]: Symbol 'NeoPixel_THT' doesn't match copy in library 'LED'
; warning
@(417.83 mm, 138.43 mm): Symbol D7 [NeoPixel_THT]
[footprint_link_issues]: The current configuration does not include the footprint library 'key_switches'.
; warning
@(433.07 mm, 80.01 mm): Symbol D35 [NeoPixel_THT]
[lib_symbol_mismatch]: Symbol 'NeoPixel_THT' doesn't match copy in library 'LED'
; warning
@(433.07 mm, 80.01 mm): Symbol D35 [NeoPixel_THT]
[footprint_link_issues]: The current configuration does not include the footprint library 'CherryMX_KailhSocket_LTST-A683CEGBW-Rotated'.
; warning
@(342.90 mm, 281.94 mm): Symbol SW40 [CherryMX]
[lib_symbol_issues]: The current configuration does not include the symbol library 'CherryMX'
; warning
@(342.90 mm, 281.94 mm): Symbol SW40 [CherryMX]
[footprint_link_issues]: The current configuration does not include the footprint library 'key_switches'.
; warning
@(433.07 mm, 107.95 mm): Symbol D21 [NeoPixel_THT]
[lib_symbol_mismatch]: Symbol 'NeoPixel_THT' doesn't match copy in library 'LED'
; warning
@(433.07 mm, 107.95 mm): Symbol D21 [NeoPixel_THT]
[footprint_link_issues]: The current configuration does not include the footprint library 'key_switches'.
; warning
@(448.31 mm, 48.26 mm): Symbol D62 [NeoPixel_THT]
[lib_symbol_mismatch]: Symbol 'NeoPixel_THT' doesn't match copy in library 'LED'
; warning
@(448.31 mm, 48.26 mm): Symbol D62 [NeoPixel_THT]
[footprint_link_issues]: The current configuration does not include the footprint library 'CherryMX_KailhSocket_LTST-A683CEGBW-Rotated'.
; warning
@(369.57 mm, 260.35 mm): Symbol SW27 [CherryMX]
[lib_symbol_issues]: The current configuration does not include the symbol library 'CherryMX'
; warning
@(369.57 mm, 260.35 mm): Symbol SW27 [CherryMX]
[footprint_link_issues]: The current configuration does not include the footprint library 'key_switches'.
; warning
@(433.07 mm, 138.43 mm): Symbol D6 [NeoPixel_THT]
[lib_symbol_mismatch]: Symbol 'NeoPixel_THT' doesn't match copy in library 'LED'
; warning
@(433.07 mm, 138.43 mm): Symbol D6 [NeoPixel_THT]
[footprint_link_issues]: The current configuration does not include the footprint library 'key_switches'.
; warning
@(448.31 mm, 80.01 mm): Symbol D34 [NeoPixel_THT]
[lib_symbol_mismatch]: Symbol 'NeoPixel_THT' doesn't match copy in library 'LED'
; warning
@(448.31 mm, 80.01 mm): Symbol D34 [NeoPixel_THT]
[footprint_link_issues]: The current configuration does not include the footprint library 'CherryMX_KailhSocket_LTST-A683CEGBW-Rotated'.
; warning
@(342.90 mm, 304.80 mm): Symbol SW54 [CherryMX]
[lib_symbol_issues]: The current configuration does not include the symbol library 'CherryMX'
; warning
@(342.90 mm, 304.80 mm): Symbol SW54 [CherryMX]
[footprint_link_issues]: The current configuration does not include the footprint library 'key_switches'.
; warning
@(448.31 mm, 107.95 mm): Symbol D20 [NeoPixel_THT]
[lib_symbol_mismatch]: Symbol 'NeoPixel_THT' doesn't match copy in library 'LED'
; warning
@(448.31 mm, 107.95 mm): Symbol D20 [NeoPixel_THT]
[footprint_link_issues]: The current configuration does not include the footprint library 'CherryMX_KailhSocket_LTST-A683CEGBW-Rotated'.
; warning
@(396.24 mm, 238.76 mm): Symbol SW11 [CherryMX]
[lib_symbol_issues]: The current configuration does not include the symbol library 'CherryMX'
; warning
@(396.24 mm, 238.76 mm): Symbol SW11 [CherryMX]
[footprint_link_issues]: The current configuration does not include the footprint library 'CherryMX_KailhSocket_LTST-A683CEGBW-Rotated'.
; warning
@(369.57 mm, 283.21 mm): Symbol SW42 [CherryMX]
[lib_symbol_issues]: The current configuration does not include the symbol library 'CherryMX'
; warning
@(369.57 mm, 283.21 mm): Symbol SW42 [CherryMX]
[footprint_link_issues]: The current configuration does not include the footprint library 'key_switches'.
; warning
@(463.55 mm, 48.26 mm): Symbol D61 [NeoPixel_THT]
[lib_symbol_mismatch]: Symbol 'NeoPixel_THT' doesn't match copy in library 'LED'
; warning
@(463.55 mm, 48.26 mm): Symbol D61 [NeoPixel_THT]
[footprint_link_issues]: The current configuration does not include the footprint library 'key_switches'.
; warning
@(448.31 mm, 138.43 mm): Symbol D5 [NeoPixel_THT]
[lib_symbol_mismatch]: Symbol 'NeoPixel_THT' doesn't match copy in library 'LED'
; warning
@(448.31 mm, 138.43 mm): Symbol D5 [NeoPixel_THT]
[footprint_link_issues]: The current configuration does not include the footprint library 'key_switches'.
; warning
@(463.55 mm, 80.01 mm): Symbol D33 [NeoPixel_THT]
[lib_symbol_mismatch]: Symbol 'NeoPixel_THT' doesn't match copy in library 'LED'
; warning
@(463.55 mm, 80.01 mm): Symbol D33 [NeoPixel_THT]
[footprint_link_issues]: The current configuration does not include the footprint library 'CherryMX_KailhSocket_LTST-A683CEGBW-Rotated'.
; warning
@(342.90 mm, 327.66 mm): Symbol SW65 [CherryMX]
[lib_symbol_issues]: The current configuration does not include the symbol library 'CherryMX'
; warning
@(342.90 mm, 327.66 mm): Symbol SW65 [CherryMX]
[footprint_link_issues]: The current configuration does not include the footprint library 'CherryMX_KailhSocket_LTST-A683CEGBW-Rotated'.
; warning
@(396.24 mm, 261.62 mm): Symbol SW29 [CherryMX]
[lib_symbol_issues]: The current configuration does not include the symbol library 'CherryMX'
; warning
@(396.24 mm, 261.62 mm): Symbol SW29 [CherryMX]
[footprint_link_issues]: The current configuration does not include the footprint library 'key_switches'.
; warning
@(463.55 mm, 107.95 mm): Symbol D19 [NeoPixel_THT]
[lib_symbol_mismatch]: Symbol 'NeoPixel_THT' doesn't match copy in library 'LED'
; warning
@(463.55 mm, 107.95 mm): Symbol D19 [NeoPixel_THT]
[footprint_link_issues]: The current configuration does not include the footprint library 'CherryMX_KailhSocket_LTST-A683CEGBW-Rotated'.
; warning
@(369.57 mm, 306.07 mm): Symbol SW56 [CherryMX]
[lib_symbol_issues]: The current configuration does not include the symbol library 'CherryMX'
; warning
@(369.57 mm, 306.07 mm): Symbol SW56 [CherryMX]
[footprint_link_issues]: The current configuration does not include the footprint library 'key_switches'.
; warning
@(478.79 mm, 48.26 mm): Symbol D60 [NeoPixel_THT]
[lib_symbol_mismatch]: Symbol 'NeoPixel_THT' doesn't match copy in library 'LED'
; warning
@(478.79 mm, 48.26 mm): Symbol D60 [NeoPixel_THT]
[footprint_link_issues]: The current configuration does not include the footprint library 'key_switches'.
; warning
@(463.55 mm, 138.43 mm): Symbol D4 [NeoPixel_THT]
[lib_symbol_mismatch]: Symbol 'NeoPixel_THT' doesn't match copy in library 'LED'
; warning
@(463.55 mm, 138.43 mm): Symbol D4 [NeoPixel_THT]
[footprint_link_issues]: The current configuration does not include the footprint library 'key_switches'.
; warning
@(478.79 mm, 80.01 mm): Symbol D32 [NeoPixel_THT]
[lib_symbol_mismatch]: Symbol 'NeoPixel_THT' doesn't match copy in library 'LED'
; warning
@(478.79 mm, 80.01 mm): Symbol D32 [NeoPixel_THT]
[footprint_link_issues]: The current configuration does not include the footprint library 'CherryMX_KailhSocket_LTST-A683CEGBW-Rotated'.
; warning
@(422.91 mm, 240.03 mm): Symbol SW12 [CherryMX]
[lib_symbol_issues]: The current configuration does not include the symbol library 'CherryMX'
; warning
@(422.91 mm, 240.03 mm): Symbol SW12 [CherryMX]
[footprint_link_issues]: The current configuration does not include the footprint library 'CherryMX_KailhSocket_LTST-A683CEGBW-Rotated'.
; warning
@(396.24 mm, 284.48 mm): Symbol SW44 [CherryMX]
[lib_symbol_issues]: The current configuration does not include the symbol library 'CherryMX'
; warning
@(396.24 mm, 284.48 mm): Symbol SW44 [CherryMX]
[footprint_link_issues]: The current configuration does not include the footprint library 'key_switches'.
; warning
@(478.79 mm, 107.95 mm): Symbol D18 [NeoPixel_THT]
[lib_symbol_mismatch]: Symbol 'NeoPixel_THT' doesn't match copy in library 'LED'
; warning
@(478.79 mm, 107.95 mm): Symbol D18 [NeoPixel_THT]
[footprint_link_issues]: The current configuration does not include the footprint library 'CherryMX_KailhSocket_LTST-A683CEGBW-Rotated'.
; warning
@(369.57 mm, 328.93 mm): Symbol SW66 [CherryMX]
[lib_symbol_issues]: The current configuration does not include the symbol library 'CherryMX'
; warning
@(369.57 mm, 328.93 mm): Symbol SW66 [CherryMX]
[footprint_link_issues]: The current configuration does not include the footprint library 'key_switches'.
; warning
@(494.03 mm, 48.26 mm): Symbol D45 [NeoPixel_THT]
[lib_symbol_mismatch]: Symbol 'NeoPixel_THT' doesn't match copy in library 'LED'
; warning
@(494.03 mm, 48.26 mm): Symbol D45 [NeoPixel_THT]
[footprint_link_issues]: The current configuration does not include the footprint library 'CherryMX_KailhSocket_LTST-A683CEGBW-Rotated'.
; warning
@(422.91 mm, 262.89 mm): Symbol SW24 [CherryMX]
[lib_symbol_issues]: The current configuration does not include the symbol library 'CherryMX'
; warning
@(422.91 mm, 262.89 mm): Symbol SW24 [CherryMX]
[footprint_link_issues]: The current configuration does not include the footprint library 'key_switches'.
; warning
@(478.79 mm, 138.43 mm): Symbol D3 [NeoPixel_THT]
[lib_symbol_mismatch]: Symbol 'NeoPixel_THT' doesn't match copy in library 'LED'
; warning
@(478.79 mm, 138.43 mm): Symbol D3 [NeoPixel_THT]
[footprint_link_issues]: The current configuration does not include the footprint library 'key_switches'.
; warning
@(494.03 mm, 80.01 mm): Symbol D31 [NeoPixel_THT]
[lib_symbol_mismatch]: Symbol 'NeoPixel_THT' doesn't match copy in library 'LED'
; warning
@(494.03 mm, 80.01 mm): Symbol D31 [NeoPixel_THT]
[footprint_link_issues]: The current configuration does not include the footprint library 'CherryMX_KailhSocket_LTST-A683CEGBW-Rotated'.
; warning
@(396.24 mm, 307.34 mm): Symbol SW58 [CherryMX]
[lib_symbol_issues]: The current configuration does not include the symbol library 'CherryMX'
; warning
@(396.24 mm, 307.34 mm): Symbol SW58 [CherryMX]
[footprint_link_issues]: The current configuration does not include the footprint library 'key_switches'.
; warning
@(494.03 mm, 107.95 mm): Symbol D17 [NeoPixel_THT]
[lib_symbol_mismatch]: Symbol 'NeoPixel_THT' doesn't match copy in library 'LED'
; warning
@(494.03 mm, 107.95 mm): Symbol D17 [NeoPixel_THT]
[footprint_link_issues]: The current configuration does not include the footprint library 'CherryMX_KailhSocket_LTST-A683CEGBW-Rotated'.
; warning
@(449.58 mm, 241.30 mm): Symbol SW13 [CherryMX]
[lib_symbol_issues]: The current configuration does not include the symbol library 'CherryMX'
; warning
@(449.58 mm, 241.30 mm): Symbol SW13 [CherryMX]
[footprint_link_issues]: The current configuration does not include the footprint library 'CherryMX_KailhSocket_LTST-A683CEGBW-Rotated'.
; warning
@(422.91 mm, 285.75 mm): Symbol SW39 [CherryMX]
[lib_symbol_issues]: The current configuration does not include the symbol library 'CherryMX'
; warning
@(422.91 mm, 285.75 mm): Symbol SW39 [CherryMX]
[footprint_link_issues]: The current configuration does not include the footprint library 'key_switches'.
; warning
@(494.03 mm, 138.43 mm): Symbol D2 [NeoPixel_THT]
[lib_symbol_mismatch]: Symbol 'NeoPixel_THT' doesn't match copy in library 'LED'
; warning
@(494.03 mm, 138.43 mm): Symbol D2 [NeoPixel_THT]
[footprint_link_issues]: The current configuration does not include the footprint library 'CherryMX_KailhSocket_LTST-A683CEGBW-Rotated'.
; warning
@(396.24 mm, 330.20 mm): Symbol SW67 [CherryMX]
[lib_symbol_issues]: The current configuration does not include the symbol library 'CherryMX'
; warning
@(396.24 mm, 330.20 mm): Symbol SW67 [CherryMX]
[footprint_link_issues]: The current configuration does not include the footprint library 'key_switches'.
; warning
@(509.27 mm, 107.95 mm): Symbol D16 [NeoPixel_THT]
[lib_symbol_mismatch]: Symbol 'NeoPixel_THT' doesn't match copy in library 'LED'
; warning
@(509.27 mm, 107.95 mm): Symbol D16 [NeoPixel_THT]
[footprint_link_issues]: The current configuration does not include the footprint library 'CherryMX_KailhSocket_LTST-A683CEGBW-Rotated'.
; warning
@(449.58 mm, 264.16 mm): Symbol SW26 [CherryMX]
[lib_symbol_issues]: The current configuration does not include the symbol library 'CherryMX'
; warning
@(449.58 mm, 264.16 mm): Symbol SW26 [CherryMX]
[footprint_link_issues]: The current configuration does not include the footprint library 'CherryMX_KailhSocket_LTST-A683CEGBW-Rotated'.
; warning
@(422.91 mm, 308.61 mm): Symbol SW53 [CherryMX]
[lib_symbol_issues]: The current configuration does not include the symbol library 'CherryMX'
; warning
@(422.91 mm, 308.61 mm): Symbol SW53 [CherryMX]
[footprint_link_issues]: The current configuration does not include the footprint library 'key_switches'.
; warning
@(509.27 mm, 138.43 mm): Symbol D1 [NeoPixel_THT]
[lib_symbol_mismatch]: Symbol 'NeoPixel_THT' doesn't match copy in library 'LED'
; warning
@(509.27 mm, 138.43 mm): Symbol D1 [NeoPixel_THT]
[footprint_link_issues]: The current configuration does not include the footprint library 'CherryMX_KailhSocket_LTST-A683CEGBW-Rotated'.
; warning
@(449.58 mm, 287.02 mm): Symbol SW41 [CherryMX]
[lib_symbol_issues]: The current configuration does not include the symbol library 'CherryMX'
; warning
@(449.58 mm, 287.02 mm): Symbol SW41 [CherryMX]
[footprint_link_issues]: The current configuration does not include the footprint library 'CherryMX_KailhSocket_LTST-A683CEGBW-Rotated'.
; warning
@(476.25 mm, 242.57 mm): Symbol SW14 [CherryMX]
[lib_symbol_issues]: The current configuration does not include the symbol library 'CherryMX'
; warning
@(476.25 mm, 242.57 mm): Symbol SW14 [CherryMX]
[footprint_link_issues]: The current configuration does not include the footprint library 'CherryMX_KailhSocket_LTST-A683CEGBW-Rotated'.
; warning
@(422.91 mm, 331.47 mm): Symbol SW68 [CherryMX]
[lib_symbol_issues]: The current configuration does not include the symbol library 'CherryMX'
; warning
@(422.91 mm, 331.47 mm): Symbol SW68 [CherryMX]
[footprint_link_issues]: The current configuration does not include the footprint library 'CherryMX_KailhSocket_LTST-A683CEGBW-Rotated'.
; warning
@(476.25 mm, 265.43 mm): Symbol SW28 [CherryMX]
[lib_symbol_issues]: The current configuration does not include the symbol library 'CherryMX'
; warning
@(476.25 mm, 265.43 mm): Symbol SW28 [CherryMX]
[footprint_link_issues]: The current configuration does not include the footprint library 'CherryMX_KailhSocket_LTST-A683CEGBW-Rotated'.
; warning
@(449.58 mm, 309.88 mm): Symbol SW55 [CherryMX]
[lib_symbol_issues]: The current configuration does not include the symbol library 'CherryMX'
; warning
@(449.58 mm, 309.88 mm): Symbol SW55 [CherryMX]
[footprint_link_issues]: The current configuration does not include the footprint library 'CherryMX_KailhSocket_LTST-A683CEGBW-Rotated'.
; warning
@(476.25 mm, 288.29 mm): Symbol SW43 [CherryMX]
[lib_symbol_issues]: The current configuration does not include the symbol library 'CherryMX'
; warning
@(476.25 mm, 288.29 mm): Symbol SW43 [CherryMX]
[footprint_link_issues]: The current configuration does not include the footprint library 'CherryMX_KailhSocket_LTST-A683CEGBW-Rotated'.
; warning
@(502.92 mm, 243.84 mm): Symbol SW15 [CherryMX]
[lib_symbol_issues]: The current configuration does not include the symbol library 'CherryMX'
; warning
@(502.92 mm, 243.84 mm): Symbol SW15 [CherryMX]
[footprint_link_issues]: The current configuration does not include the footprint library 'CherryMX_KailhSocket_LTST-A683CEGBW-Rotated'.
; warning
@(449.58 mm, 332.74 mm): Symbol SW69 [CherryMX]
[lib_symbol_issues]: The current configuration does not include the symbol library 'CherryMX'
; warning
@(449.58 mm, 332.74 mm): Symbol SW69 [CherryMX]
[footprint_link_issues]: The current configuration does not include the footprint library 'CherryMX_KailhSocket_LTST-A683CEGBW-Rotated'.
; warning
@(476.25 mm, 311.15 mm): Symbol SW57 [CherryMX]
[lib_symbol_issues]: The current configuration does not include the symbol library 'CherryMX'
; warning
@(476.25 mm, 311.15 mm): Symbol SW57 [CherryMX]
[footprint_link_issues]: The current configuration does not include the footprint library 'CherryMX_KailhSocket_LTST-A683CEGBW-Rotated'.
; warning
@(502.92 mm, 266.70 mm): Symbol SW30 [CherryMX]
[lib_symbol_issues]: The current configuration does not include the symbol library 'CherryMX'
; warning
@(502.92 mm, 266.70 mm): Symbol SW30 [CherryMX]
[footprint_link_issues]: The current configuration does not include the footprint library 'CherryMX_KailhSocket_LTST-A683CEGBW-Rotated'.
; warning
@(502.92 mm, 290.83 mm): Symbol SW38 [CherryMX]
[lib_symbol_issues]: The current configuration does not include the symbol library 'CherryMX'
; warning
@(502.92 mm, 290.83 mm): Symbol SW38 [CherryMX]
[footprint_link_issues]: The current configuration does not include the footprint library 'CherryMX_KailhSocket_LTST-A683CEGBW-Rotated'.
; warning
@(476.25 mm, 334.01 mm): Symbol SW70 [CherryMX]
[lib_symbol_issues]: The current configuration does not include the symbol library 'CherryMX'
; warning
@(476.25 mm, 334.01 mm): Symbol SW70 [CherryMX]
[footprint_link_issues]: The current configuration does not include the footprint library 'CherryMX_KailhSocket_LTST-A683CEGBW-Rotated'.
; warning
@(502.92 mm, 312.42 mm): Symbol SW59 [CherryMX]
[lib_symbol_issues]: The current configuration does not include the symbol library 'CherryMX'
; warning
@(502.92 mm, 312.42 mm): Symbol SW59 [CherryMX]
[label_dangling]: Label not connected to anything
; error
@(553.72 mm, 232.41 mm): Label 'IO0_0_R'
[label_dangling]: Label not connected to anything
; error
@(553.72 mm, 234.95 mm): Label 'IO0_1_R'
[label_dangling]: Label not connected to anything
; error
@(553.72 mm, 237.49 mm): Label 'IO0_2_R'
[footprint_link_issues]: The current configuration does not include the footprint library 'CherryMX_KailhSocket_LTST-A683CEGBW-Rotated'.
; warning
@(502.92 mm, 336.55 mm): Symbol SW64 [CherryMX]
[lib_symbol_issues]: The current configuration does not include the symbol library 'CherryMX'
; warning
@(502.92 mm, 336.55 mm): Symbol SW64 [CherryMX]
** ERC messages: 293 Errors 13 Warnings 280

BIN
docs/keyboard_schematic.pdf Normal file

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

BIN
res/keyboard_render.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 192 KiB

28
setup.py Normal file
View File

@@ -0,0 +1,28 @@
import sys
import os
import stat
from pathlib import Path
PYTHON_BIN = sys.executable
HOOK_SCRIPT_PATH = Path(".hooks/kicad_cli_tools.py")
HOOK_TYPE = "pre-push"
HOOK_PATH = Path(f".git/hooks/{HOOK_TYPE}")
# used if the hook path already exists we dont want to over write anything you have in there
# we would append however all of the default hooks have and `exit 0` which means it wont run
OLD_HOOK_PATH = Path(f".git/hooks/{HOOK_TYPE}-old")
if (os.path.exists(HOOK_PATH)):
os.rename(HOOK_PATH, OLD_HOOK_PATH)
with open(HOOK_PATH, "w") as txt:
txt.writelines([
"#!/bin/sh\n", #shebang
f"{PYTHON_BIN} {HOOK_SCRIPT_PATH}\n"
"exit 0\n" #make sure she closes
])
# make sure its executable
st = os.stat(HOOK_PATH)
os.chmod(HOOK_PATH, st.st_mode | stat.S_IEXEC)