@hybridlabor-api/bdb-hardware-pcb 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (192) hide show
  1. package/README.md +116 -0
  2. package/config/mcp/antigravity.json +22 -0
  3. package/config/mcp/claude.json +22 -0
  4. package/config/mcp/codex.toml +25 -0
  5. package/docs/adr/ADR-001-KICAD-OPENSCAD-MCP-STRATEGY.md +334 -0
  6. package/docs/review_documentation.md +121 -0
  7. package/installer.js +358 -0
  8. package/mcp_servers/kicad-mcp-server/.env.example +22 -0
  9. package/mcp_servers/kicad-mcp-server/.github/workflows/ci.yml +36 -0
  10. package/mcp_servers/kicad-mcp-server/CLAUDE.md +487 -0
  11. package/mcp_servers/kicad-mcp-server/README.md +316 -0
  12. package/mcp_servers/kicad-mcp-server/docs/DEVICE_TREE.md +416 -0
  13. package/mcp_servers/kicad-mcp-server/docs/INSTALLATION.md +332 -0
  14. package/mcp_servers/kicad-mcp-server/docs/PIN_ANALYSIS.md +332 -0
  15. package/mcp_servers/kicad-mcp-server/docs/README.md +240 -0
  16. package/mcp_servers/kicad-mcp-server/docs/TESTING.md +613 -0
  17. package/mcp_servers/kicad-mcp-server/docs/VALIDATION.md +268 -0
  18. package/mcp_servers/kicad-mcp-server/pyproject.toml +96 -0
  19. package/mcp_servers/kicad-mcp-server/requirements-dev.txt +16 -0
  20. package/mcp_servers/kicad-mcp-server/requirements-test.txt +24 -0
  21. package/mcp_servers/kicad-mcp-server/requirements.txt +13 -0
  22. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/__init__.py +3 -0
  23. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/__main__.py +17 -0
  24. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/config.py +46 -0
  25. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/models/__init__.py +1 -0
  26. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/models/types.py +87 -0
  27. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/parsers/__init__.py +1 -0
  28. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/parsers/netlist_parser.py +234 -0
  29. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/parsers/pcb_parser.py +375 -0
  30. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/parsers/pcb_parser_kicad.py +327 -0
  31. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/parsers/schematic_parser.py +902 -0
  32. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/server.py +71 -0
  33. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/__init__.py +1 -0
  34. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/arduino/connectivity_test.cpp.j2 +189 -0
  35. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/device_tree/atmega.dts.j2 +77 -0
  36. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/device_tree/esp32.dts.j2 +77 -0
  37. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/device_tree/nrf52.dts.j2 +77 -0
  38. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/device_tree/stm32f4.dts.j2 +89 -0
  39. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/esp_idf/test_suite.c.j2 +340 -0
  40. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/pytest/test_connectivity.py.j2 +147 -0
  41. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/st_hal/hal_test.c.j2 +313 -0
  42. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/pytest_gpio_test.py.j2 +99 -0
  43. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/pytest_i2c_test.py.j2 +117 -0
  44. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/pytest_pinmux_test.py.j2 +43 -0
  45. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/pytest_spi_test.py.j2 +94 -0
  46. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/unity_gpio_test.c.j2 +113 -0
  47. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/unity_i2c_test.c.j2 +101 -0
  48. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/unity_spi_test.c.j2 +94 -0
  49. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/unittest/test_schematic.py.j2 +172 -0
  50. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/__init__.py +36 -0
  51. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/device_tree.py +1187 -0
  52. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/hierarchical_analysis.py +211 -0
  53. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/netlist.py +320 -0
  54. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/parts_registry.py +142 -0
  55. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/pcb.py +955 -0
  56. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/pcb_layout.py +308 -0
  57. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/pin_analysis.py +765 -0
  58. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/project.py +196 -0
  59. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/schematic.py +319 -0
  60. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/schematic_editor.py +674 -0
  61. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/schematic_search.py +158 -0
  62. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/validation.py +866 -0
  63. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/visualization.py +225 -0
  64. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/utils/__init__.py +1 -0
  65. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/utils/file_handlers.py +65 -0
  66. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/utils/kicad_cli.py +103 -0
  67. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/utils/kicad_version.py +103 -0
  68. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/utils/parts_registry.py +197 -0
  69. package/mcp_servers/kicad-mcp-server/tests/__init__.py +1 -0
  70. package/mcp_servers/kicad-mcp-server/tests/examples/ESP32S3_TEST.md +219 -0
  71. package/mcp_servers/kicad-mcp-server/tests/fixtures/README.md +65 -0
  72. package/mcp_servers/kicad-mcp-server/tests/fixtures/__init__.py +1 -0
  73. package/mcp_servers/kicad-mcp-server/tests/fixtures/example_pcb.kicad_pcb +177 -0
  74. package/mcp_servers/kicad-mcp-server/tests/fixtures/example_schematic.kicad_sch +145 -0
  75. package/mcp_servers/kicad-mcp-server/tests/fixtures/hier/child.kicad_sch +24 -0
  76. package/mcp_servers/kicad-mcp-server/tests/fixtures/hier/root.kicad_sch +38 -0
  77. package/mcp_servers/kicad-mcp-server/tests/test_tools/__init__.py +1 -0
  78. package/mcp_servers/kicad-mcp-server/tests/test_tools/test_hierarchical_labels.py +195 -0
  79. package/mcp_servers/kicad-mcp-server/tests/test_tools/test_kicad_cli.py +116 -0
  80. package/mcp_servers/kicad-mcp-server/tests/test_tools/test_netlist_cache_path.py +29 -0
  81. package/mcp_servers/kicad-mcp-server/tests/test_tools/test_schematic.py +189 -0
  82. package/mcp_servers/kicad-mcp-server/tests/test_tools/test_schematic_hierarchy.py +69 -0
  83. package/mcp_servers/kicad-mcp-server/tests/test_tools/test_visualization.py +136 -0
  84. package/mcp_servers/kicad-mcp-server/uv.lock +2873 -0
  85. package/mcp_servers/openscad-mcp-server/.dockerignore +9 -0
  86. package/mcp_servers/openscad-mcp-server/.github/workflows/test.yml +40 -0
  87. package/mcp_servers/openscad-mcp-server/Dockerfile +29 -0
  88. package/mcp_servers/openscad-mcp-server/LICENSE +21 -0
  89. package/mcp_servers/openscad-mcp-server/README.md +154 -0
  90. package/mcp_servers/openscad-mcp-server/docs/audit.md +56 -0
  91. package/mcp_servers/openscad-mcp-server/docs/docker.md +66 -0
  92. package/mcp_servers/openscad-mcp-server/docs/issue-followup.md +19 -0
  93. package/mcp_servers/openscad-mcp-server/docs/jetson.md +17 -0
  94. package/mcp_servers/openscad-mcp-server/glama.json +4 -0
  95. package/mcp_servers/openscad-mcp-server/legacy/README.md +15 -0
  96. package/mcp_servers/openscad-mcp-server/legacy/README.original.md +294 -0
  97. package/mcp_servers/openscad-mcp-server/legacy/implementation_plan.md +100 -0
  98. package/mcp_servers/openscad-mcp-server/legacy/old/download_sam2_checkpoint.py +115 -0
  99. package/mcp_servers/openscad-mcp-server/legacy/old/src/ai/sam_segmentation.py +209 -0
  100. package/mcp_servers/openscad-mcp-server/legacy/old/src/models/threestudio_generator.py +231 -0
  101. package/mcp_servers/openscad-mcp-server/legacy/old/src/workflow/image_to_model_pipeline.py +260 -0
  102. package/mcp_servers/openscad-mcp-server/legacy/old/test_sam2_segmentation.py +96 -0
  103. package/mcp_servers/openscad-mcp-server/legacy/requirements.txt +57 -0
  104. package/mcp_servers/openscad-mcp-server/legacy/rtfmd/README.md +39 -0
  105. package/mcp_servers/openscad-mcp-server/legacy/rtfmd/decisions/ai-driven-code-generation.md +122 -0
  106. package/mcp_servers/openscad-mcp-server/legacy/rtfmd/decisions/export-formats.md +76 -0
  107. package/mcp_servers/openscad-mcp-server/legacy/rtfmd/files/src/ai/ai_service.py.md +51 -0
  108. package/mcp_servers/openscad-mcp-server/legacy/rtfmd/files/src/main.py.md +63 -0
  109. package/mcp_servers/openscad-mcp-server/legacy/rtfmd/files/src/models/code_generator.py.md +63 -0
  110. package/mcp_servers/openscad-mcp-server/legacy/rtfmd/files/src/nlp/parameter_extractor.py.md +63 -0
  111. package/mcp_servers/openscad-mcp-server/legacy/rtfmd/knowledge/ai/natural-language-processing.md +78 -0
  112. package/mcp_servers/openscad-mcp-server/legacy/rtfmd/knowledge/nlp/parameter-extraction.md +173 -0
  113. package/mcp_servers/openscad-mcp-server/legacy/rtfmd/knowledge/openscad/export-formats.md +91 -0
  114. package/mcp_servers/openscad-mcp-server/legacy/rtfmd/knowledge/openscad/openscad-basics.md +66 -0
  115. package/mcp_servers/openscad-mcp-server/legacy/rtfmd/knowledge/openscad/primitive-testing.md +79 -0
  116. package/mcp_servers/openscad-mcp-server/legacy/src/__init__.py +0 -0
  117. package/mcp_servers/openscad-mcp-server/legacy/src/ai/ai_service.py +257 -0
  118. package/mcp_servers/openscad-mcp-server/legacy/src/ai/gemini_api.py +161 -0
  119. package/mcp_servers/openscad-mcp-server/legacy/src/ai/venice_api.py +203 -0
  120. package/mcp_servers/openscad-mcp-server/legacy/src/config.py +121 -0
  121. package/mcp_servers/openscad-mcp-server/legacy/src/main.py +1456 -0
  122. package/mcp_servers/openscad-mcp-server/legacy/src/main.py.new +404 -0
  123. package/mcp_servers/openscad-mcp-server/legacy/src/main_remote.py +401 -0
  124. package/mcp_servers/openscad-mcp-server/legacy/src/models/__init__.py +0 -0
  125. package/mcp_servers/openscad-mcp-server/legacy/src/models/code_generator.py +321 -0
  126. package/mcp_servers/openscad-mcp-server/legacy/src/models/cuda_mvs.py +209 -0
  127. package/mcp_servers/openscad-mcp-server/legacy/src/models/scad_templates/basic_shapes.scad +144 -0
  128. package/mcp_servers/openscad-mcp-server/legacy/src/nlp/__init__.py +0 -0
  129. package/mcp_servers/openscad-mcp-server/legacy/src/nlp/parameter_extractor.py +388 -0
  130. package/mcp_servers/openscad-mcp-server/legacy/src/openscad_wrapper/__init__.py +0 -0
  131. package/mcp_servers/openscad-mcp-server/legacy/src/openscad_wrapper/wrapper.py +418 -0
  132. package/mcp_servers/openscad-mcp-server/legacy/src/printer_discovery/__init__.py +1 -0
  133. package/mcp_servers/openscad-mcp-server/legacy/src/printer_discovery/printer_discovery.py +471 -0
  134. package/mcp_servers/openscad-mcp-server/legacy/src/remote/connection_manager.py +537 -0
  135. package/mcp_servers/openscad-mcp-server/legacy/src/remote/cuda_mvs_client.py +435 -0
  136. package/mcp_servers/openscad-mcp-server/legacy/src/remote/cuda_mvs_server.py +787 -0
  137. package/mcp_servers/openscad-mcp-server/legacy/src/remote/error_handling.py +415 -0
  138. package/mcp_servers/openscad-mcp-server/legacy/src/testing/__init__.py +0 -0
  139. package/mcp_servers/openscad-mcp-server/legacy/src/testing/primitive_tester.py +203 -0
  140. package/mcp_servers/openscad-mcp-server/legacy/src/testing/test_primitives.py +98 -0
  141. package/mcp_servers/openscad-mcp-server/legacy/src/utils/__init__.py +1 -0
  142. package/mcp_servers/openscad-mcp-server/legacy/src/utils/cad_exporter.py +241 -0
  143. package/mcp_servers/openscad-mcp-server/legacy/src/utils/format_validator.py +206 -0
  144. package/mcp_servers/openscad-mcp-server/legacy/src/utils/stl_exporter.py +140 -0
  145. package/mcp_servers/openscad-mcp-server/legacy/src/utils/stl_repair.py +91 -0
  146. package/mcp_servers/openscad-mcp-server/legacy/src/utils/stl_validator.py +123 -0
  147. package/mcp_servers/openscad-mcp-server/legacy/src/visualization/__init__.py +0 -0
  148. package/mcp_servers/openscad-mcp-server/legacy/src/visualization/headless_renderer.py +52 -0
  149. package/mcp_servers/openscad-mcp-server/legacy/src/visualization/renderer.py +177 -0
  150. package/mcp_servers/openscad-mcp-server/legacy/src/visualization/web_interface.py +639 -0
  151. package/mcp_servers/openscad-mcp-server/legacy/src/workflow/image_approval.py +148 -0
  152. package/mcp_servers/openscad-mcp-server/legacy/src/workflow/multi_view_to_model_pipeline.py +338 -0
  153. package/mcp_servers/openscad-mcp-server/legacy/test_complete_workflow.py +374 -0
  154. package/mcp_servers/openscad-mcp-server/legacy/test_cuda_mvs.py +191 -0
  155. package/mcp_servers/openscad-mcp-server/legacy/test_gemini_api.py +168 -0
  156. package/mcp_servers/openscad-mcp-server/legacy/test_image_approval.py +192 -0
  157. package/mcp_servers/openscad-mcp-server/legacy/test_image_approval_workflow.py +251 -0
  158. package/mcp_servers/openscad-mcp-server/legacy/test_image_to_model_pipeline.py +145 -0
  159. package/mcp_servers/openscad-mcp-server/legacy/test_model_selection.py +41 -0
  160. package/mcp_servers/openscad-mcp-server/legacy/test_multi_view_pipeline.py +290 -0
  161. package/mcp_servers/openscad-mcp-server/legacy/test_primitives.sh +13 -0
  162. package/mcp_servers/openscad-mcp-server/legacy/test_rabbit_direct.py +71 -0
  163. package/mcp_servers/openscad-mcp-server/legacy/test_remote_cuda_mvs.py +283 -0
  164. package/mcp_servers/openscad-mcp-server/legacy/test_venice_example.py +69 -0
  165. package/mcp_servers/openscad-mcp-server/pyproject.toml +33 -0
  166. package/mcp_servers/openscad-mcp-server/requirements.txt +2 -0
  167. package/mcp_servers/openscad-mcp-server/scad/simple_cube.scad +2 -0
  168. package/mcp_servers/openscad-mcp-server/scripts/test_docker.py +220 -0
  169. package/mcp_servers/openscad-mcp-server/src/openscad_mcp/__init__.py +3 -0
  170. package/mcp_servers/openscad-mcp-server/src/openscad_mcp/__main__.py +3 -0
  171. package/mcp_servers/openscad-mcp-server/src/openscad_mcp/engine.py +94 -0
  172. package/mcp_servers/openscad-mcp-server/src/openscad_mcp/geometry.py +242 -0
  173. package/mcp_servers/openscad-mcp-server/src/openscad_mcp/server.py +245 -0
  174. package/mcp_servers/openscad-mcp-server/src/openscad_mcp/service.py +190 -0
  175. package/mcp_servers/openscad-mcp-server/tests/conftest.py +17 -0
  176. package/mcp_servers/openscad-mcp-server/tests/test_engine.py +37 -0
  177. package/mcp_servers/openscad-mcp-server/tests/test_geometry.py +106 -0
  178. package/mcp_servers/openscad-mcp-server/tests/test_integration.py +172 -0
  179. package/mcp_servers/openscad-mcp-server/tests/test_transports.py +314 -0
  180. package/mcp_servers/openscad-mcp-server/uv.lock +1123 -0
  181. package/package.json +44 -0
  182. package/scripts/install_mcps.sh +86 -0
  183. package/scripts/openscad_wrapper.sh +62 -0
  184. package/scripts/run_kicad_mcp.sh +25 -0
  185. package/scripts/run_openscad_mcp.sh +41 -0
  186. package/scripts/test_mcp_connection.py +626 -0
  187. package/scripts/test_mcp_connection.sh +168 -0
  188. package/skills/code-first-hardware-design/SKILL.md +260 -0
  189. package/skills/pcb-constraint-definition/SKILL.md +236 -0
  190. package/skills/pcb-layout-routing-automation/SKILL.md +153 -0
  191. package/skills/pcb-validation-dfm-signoff/SKILL.md +194 -0
  192. package/skills/schematic-datasheet-analysis/SKILL.md +202 -0
@@ -0,0 +1,71 @@
1
+ """Main MCP server setup for KiCad integration."""
2
+
3
+ from fastmcp import FastMCP
4
+
5
+ from .config import config
6
+
7
+ # Create MCP server
8
+ mcp = FastMCP(
9
+ name="kicad-mcp-server",
10
+ instructions="""KiCad MCP Server - A server for analyzing KiCad schematics and PCBs,
11
+ and performing design rule checks.
12
+
13
+ Available capabilities:
14
+ - Schematic analysis (components, nets, symbols)
15
+ - PCB analysis (footprints, tracks, statistics)
16
+ - Design rule checking (ERC/DRC)
17
+ - Schematic summarization
18
+ - Hierarchical sheet and net tracing
19
+ - Pin/power/bus extraction and device tree generation
20
+ """,
21
+ )
22
+
23
+
24
+ # Import and register tools
25
+ from .tools import ( # noqa: F401, E402
26
+ device_tree,
27
+ hierarchical_analysis,
28
+ netlist,
29
+ parts_registry,
30
+ pcb,
31
+ pcb_layout,
32
+ pin_analysis,
33
+ project,
34
+ schematic,
35
+ schematic_editor,
36
+ schematic_search,
37
+ validation,
38
+ visualization,
39
+ )
40
+
41
+
42
+ # Resources
43
+ @mcp.resource("kicad://config")
44
+ def get_config() -> dict:
45
+ """Get current server configuration."""
46
+ return {
47
+ "project_paths": config.kicad_project_paths,
48
+ "default_summary_detail_level": config.default_summary_detail_level,
49
+ "include_nets_in_summary": config.include_nets_in_summary,
50
+ "include_power_in_summary": config.include_power_in_summary,
51
+ "default_test_framework": config.default_test_framework,
52
+ "default_test_type": config.default_test_type,
53
+ }
54
+
55
+
56
+ def create_server() -> FastMCP:
57
+ """Create and configure the MCP server instance.
58
+
59
+ Returns:
60
+ Configured FastMCP server instance
61
+ """
62
+ return mcp
63
+
64
+
65
+ def get_server() -> FastMCP:
66
+ """Get the singleton MCP server instance.
67
+
68
+ Returns:
69
+ The FastMCP server instance
70
+ """
71
+ return mcp
@@ -0,0 +1 @@
1
+ """Jinja2 templates for test code generation."""
@@ -0,0 +1,189 @@
1
+ /**
2
+ * Arduino Connectivity Test for {{ project_name }}
3
+ * Generated from {{ schematic_path }}
4
+ *
5
+ * This sketch provides automated connectivity verification for
6
+ * Arduino-based projects based on schematic netlist.
7
+ */
8
+
9
+ #include <Arduino.h>
10
+
11
+ {% if target_mcu and target_mcu.startswith("esp") %}
12
+ // ESP32/ESP8266 specific
13
+ {% if target_mcu == "esp32" %}
14
+ #include <WiFi.h>
15
+ {% else %}
16
+ #include <ESP8266WiFi.h>
17
+ {% endif %}
18
+ {% endif %}
19
+
20
+ // Pin definitions from schematic
21
+ {% for pin in test_pins %}
22
+ #define {{ pin.name }} {{ pin.number }}
23
+ {% endfor %}
24
+
25
+ // Test configuration
26
+ const unsigned long SERIAL_BAUD = 115200;
27
+ const int TEST_DELAY_MS = 100;
28
+
29
+ // Test point structure
30
+ struct TestPoint {
31
+ const char* name;
32
+ int pin;
33
+ bool is_input;
34
+ bool expected_state;
35
+ };
36
+
37
+ // Test points based on schematic
38
+ TestPoint test_points[] = {
39
+ {% for test in tests %}
40
+ { "{{ test.name }}", {{ test.pin }}, {{ test.is_input | lower }}, {{ test.expected | lower }} },
41
+ {% endfor %}
42
+ };
43
+
44
+ const int num_test_points = sizeof(test_points) / sizeof(TestPoint);
45
+
46
+ void setup() {
47
+ // Initialize serial
48
+ Serial.begin(SERIAL_BAUD);
49
+ while (!Serial && millis() < 3000); {% if target_mcu and target_mcu.startswith("esp") %}{% else %} // Wait for serial (Leonardo, Zero){% endif %}
50
+
51
+ delay(1000);
52
+ Serial.println(F("{{ project_name }} - Connectivity Test"));
53
+ Serial.println(F("=" * 50));
54
+
55
+ // Initialize pins
56
+ Serial.println(F("Initializing test pins..."));
57
+ for (int i = 0; i < num_test_points; i++) {
58
+ if (test_points[i].is_input) {
59
+ pinMode(test_points[i].pin, INPUT_PULLUP);
60
+ } else {
61
+ pinMode(test_points[i].pin, OUTPUT);
62
+ digitalWrite(test_points[i].pin, test_points[i].expected_state ? HIGH : LOW);
63
+ }
64
+ }
65
+
66
+ Serial.println(F("Pins initialized"));
67
+ Serial.println();
68
+ }
69
+
70
+ void loop() {
71
+ static int test_count = 0;
72
+
73
+ Serial.println(F("Running connectivity tests..."));
74
+ Serial.println();
75
+
76
+ int passed = 0;
77
+ int failed = 0;
78
+
79
+ // Run tests
80
+ for (int i = 0; i < num_test_points; i++) {
81
+ TestPoint& tp = test_points[i];
82
+
83
+ if (tp.is_input) {
84
+ int reading = digitalRead(tp.pin);
85
+
86
+ Serial.print(F("Test: "));
87
+ Serial.print(tp.name);
88
+ Serial.print(F(" (Pin "));
89
+ Serial.print(tp.pin);
90
+ Serial.print(F(")... "));
91
+
92
+ // For pull-up inputs, expect HIGH unless externally pulled low
93
+ bool test_passed = (reading == tp.expected_state);
94
+
95
+ if (test_passed) {
96
+ Serial.println(F("PASS"));
97
+ passed++;
98
+ } else {
99
+ Serial.print(F("FAIL (expected "));
100
+ Serial.print(tp.expected_state ? F("HIGH") : F("LOW"));
101
+ Serial.print(F(", got "));
102
+ Serial.print(reading ? F("HIGH") : F("LOW"));
103
+ Serial.println(F(")"));
104
+ failed++;
105
+ }
106
+
107
+ delay(TEST_DELAY_MS);
108
+ }
109
+ }
110
+
111
+ // Print summary
112
+ Serial.println();
113
+ Serial.println(F("=" * 50));
114
+ Serial.print(F("Test Summary: "));
115
+ Serial.print(passed);
116
+ Serial.print(F(" passed, "));
117
+ Serial.print(failed);
118
+ Serial.print(F(" failed out of "));
119
+ Serial.print(num_test_points);
120
+ Serial.println(F(" tests"));
121
+
122
+ if (failed == 0) {
123
+ Serial.println(F("All tests PASSED!"));
124
+ } else {
125
+ Serial.println(F("Some tests FAILED!"));
126
+ }
127
+
128
+ Serial.println();
129
+ Serial.println(F("Press any key to run tests again..."));
130
+
131
+ // Wait for user input
132
+ while (!Serial.available()) {
133
+ delay(100);
134
+ }
135
+
136
+ // Clear serial buffer
137
+ while (Serial.available()) {
138
+ Serial.read();
139
+ }
140
+
141
+ test_count++;
142
+ Serial.println();
143
+ delay(1000);
144
+ }
145
+
146
+ {% if test_type == "functional" %}
147
+ /**
148
+ * Additional functional tests
149
+ */
150
+ void test_analog_inputs() {
151
+ Serial.println(F("Testing analog inputs..."));
152
+
153
+ // Read analog pins and report values
154
+ {% for pin in analog_pins %}
155
+ {
156
+ int raw = analogRead({{ pin }});
157
+ float voltage = raw * (3.3 / 4095.0); {% if target_mcu and "esp32" in target_mcu %}
158
+ Serial.print(F("{{ pin }}: "));
159
+ Serial.print(raw);
160
+ Serial.print(F(" ("));
161
+ Serial.print(voltage);
162
+ Serial.println(F("V)"));
163
+ delay(TEST_DELAY_MS);
164
+ }
165
+ {% endif %}
166
+
167
+ Serial.println();
168
+ }
169
+
170
+ void test_i2c_scan() {
171
+ Serial.println(F("Scanning I2C bus..."));
172
+
173
+ Wire.begin();
174
+
175
+ for (byte addr = 1; addr < 127; addr++) {
176
+ Wire.beginTransmission(addr);
177
+ byte error = Wire.endTransmission();
178
+
179
+ if (error == 0) {
180
+ Serial.print(F("I2C device found at 0x"));
181
+ if (addr < 16) Serial.print(F("0"));
182
+ Serial.println(addr, HEX);
183
+ }
184
+ }
185
+
186
+ Serial.println(F("I2C scan complete"));
187
+ Serial.println();
188
+ }
189
+ {% endif %}
@@ -0,0 +1,77 @@
1
+ /* Device Tree for ATmega SOC */
2
+ /* Auto-generated from KiCad schematic */
3
+ /* Generated by: kicad-mcp-server */
4
+
5
+ #include <dt-bindings/gpio/gpio.h>
6
+
7
+ / {
8
+ model = "{{ board_name }}";
9
+ compatible = "atmel,atmega";
10
+
11
+ /* GPIO Configuration */
12
+ pinctrl: pin-controller {
13
+ {% for pin in gpio_pins %}
14
+ gpio_{{ pin.number }}: gpio@{{ pin.number }} {
15
+ gpio-controller;
16
+ #gpio-cells = <2>;
17
+ status = "okay";
18
+ };
19
+ {% endfor %}
20
+ };
21
+
22
+ /* I2C Devices (TWI) */
23
+ {% for bus in i2c_buses %}
24
+ twi{{ bus.number }}: i2c@{{ bus.address }} {
25
+ compatible = "atmel,atmega-twi";
26
+ #address-cells = <1>;
27
+ #size-cells = <0>;
28
+ status = "okay";
29
+ clock-frequency = <100000>;
30
+
31
+ {% for device in bus.devices %}
32
+ {{ device.name }}: {{ device.compatible }}@{{ device.address }} {
33
+ compatible = "{{ device.compatible }}";
34
+ reg = <{{ device.address }}>;
35
+ {% if device.properties %}
36
+ {% for key, value in device.properties.items() %}
37
+ {{ key }} = <{{ value }}>;
38
+ {% endfor %}
39
+ {% endif %}
40
+ };
41
+ {% endfor %}
42
+ };
43
+
44
+ {% endfor %}
45
+
46
+ /* SPI Devices */
47
+ {% for bus in spi_buses %}
48
+ spi{{ bus.number }}: spi@{{ bus.address }} {
49
+ compatible = "atmel,atmega-spi";
50
+ #address-cells = <1>;
51
+ #size-cells = <0>;
52
+ status = "okay";
53
+
54
+ {% for device in bus.devices %}
55
+ {{ device.name }}: {{ device.compatible }}@{{ device.cs }} {
56
+ compatible = "{{ device.compatible }}";
57
+ reg = <{{ device.cs }}>;
58
+ spi-max-frequency = <{{ device.frequency }}>;
59
+ {% if device.properties %}
60
+ {% for key, value in device.properties.items() %}
61
+ {{ key }} = <{{ value }}>;
62
+ {% endfor %}
63
+ {% endif %}
64
+ };
65
+ {% endfor %}
66
+ };
67
+
68
+ {% endfor %}
69
+
70
+ /* UART Devices */
71
+ {% for uart in uarts %}
72
+ usart{{ uart.number }}: serial@{{ uart.address }} {
73
+ compatible = "atmel,atmega-usart";
74
+ status = "okay";
75
+ };
76
+ {% endfor %}
77
+ };
@@ -0,0 +1,77 @@
1
+ /* Device Tree for ESP32 SOC */
2
+ /* Auto-generated from KiCad schematic */
3
+ /* Generated by: kicad-mcp-server */
4
+
5
+ #include <dt-bindings/gpio/gpio.h>
6
+
7
+ / {
8
+ model = "{{ board_name }}";
9
+ compatible = "espressif,esp32";
10
+
11
+ /* GPIO Configuration */
12
+ pinctrl: pin-controller {
13
+ {% for pin in gpio_pins %}
14
+ gpio_{{ pin.number }}: gpio@{{ pin.number }} {
15
+ gpio-controller;
16
+ #gpio-cells = <2>;
17
+ status = "okay";
18
+ };
19
+ {% endfor %}
20
+ };
21
+
22
+ /* I2C Devices */
23
+ {% for bus in i2c_buses %}
24
+ i2c{{ bus.number }}: i2c@{{ bus.address }} {
25
+ compatible = "espressif,esp32-i2c";
26
+ #address-cells = <1>;
27
+ #size-cells = <0>;
28
+ status = "okay";
29
+ clock-frequency = <100000>;
30
+
31
+ {% for device in bus.devices %}
32
+ {{ device.name }}: {{ device.compatible }}@{{ device.address }} {
33
+ compatible = "{{ device.compatible }}";
34
+ reg = <{{ device.address }}>;
35
+ {% if device.properties %}
36
+ {% for key, value in device.properties.items() %}
37
+ {{ key }} = <{{ value }}>;
38
+ {% endfor %}
39
+ {% endif %}
40
+ };
41
+ {% endfor %}
42
+ };
43
+
44
+ {% endfor %}
45
+
46
+ /* SPI Devices */
47
+ {% for bus in spi_buses %}
48
+ spi{{ bus.number }}: spi@{{ bus.address }} {
49
+ compatible = "espressif,esp32-spi";
50
+ #address-cells = <1>;
51
+ #size-cells = <0>;
52
+ status = "okay";
53
+
54
+ {% for device in bus.devices %}
55
+ {{ device.name }}: {{ device.compatible }}@{{ device.cs }} {
56
+ compatible = "{{ device.compatible }}";
57
+ reg = <{{ device.cs }}>;
58
+ spi-max-frequency = <{{ device.frequency }}>;
59
+ {% if device.properties %}
60
+ {% for key, value in device.properties.items() %}
61
+ {{ key }} = <{{ value }}>;
62
+ {% endfor %}
63
+ {% endif %}
64
+ };
65
+ {% endfor %}
66
+ };
67
+
68
+ {% endfor %}
69
+
70
+ /* UART Devices */
71
+ {% for uart in uarts %}
72
+ uart{{ uart.number }}: serial@{{ uart.address }} {
73
+ compatible = "espressif,esp32-uart";
74
+ status = "okay";
75
+ };
76
+ {% endfor %}
77
+ };
@@ -0,0 +1,77 @@
1
+ /* Device Tree for nRF52 SOC */
2
+ /* Auto-generated from KiCad schematic */
3
+ /* Generated by: kicad-mcp-server */
4
+
5
+ #include <dt-bindings/gpio/gpio.h>
6
+
7
+ / {
8
+ model = "{{ board_name }}";
9
+ compatible = "nordic,nrf52";
10
+
11
+ /* GPIO Configuration */
12
+ pinctrl: pin-controller {
13
+ {% for pin in gpio_pins %}
14
+ gpio_{{ pin.number }}: gpio@{{ pin.number }} {
15
+ gpio-controller;
16
+ #gpio-cells = <2>;
17
+ status = "okay";
18
+ };
19
+ {% endfor %}
20
+ };
21
+
22
+ /* I2C Devices (TWI) */
23
+ {% for bus in i2c_buses %}
24
+ twi{{ bus.number }}: i2c@{{ bus.address }} {
25
+ compatible = "nordic,nrf52-twi";
26
+ #address-cells = <1>;
27
+ #size-cells = <0>;
28
+ status = "okay";
29
+ clock-frequency = <100000>;
30
+
31
+ {% for device in bus.devices %}
32
+ {{ device.name }}: {{ device.compatible }}@{{ device.address }} {
33
+ compatible = "{{ device.compatible }}";
34
+ reg = <{{ device.address }}>;
35
+ {% if device.properties %}
36
+ {% for key, value in device.properties.items() %}
37
+ {{ key }} = <{{ value }}>;
38
+ {% endfor %}
39
+ {% endif %}
40
+ };
41
+ {% endfor %}
42
+ };
43
+
44
+ {% endfor %}
45
+
46
+ /* SPI Devices */
47
+ {% for bus in spi_buses %}
48
+ spi{{ bus.number }}: spi@{{ bus.address }} {
49
+ compatible = "nordic,nrf52-spi";
50
+ #address-cells = <1>;
51
+ #size-cells = <0>;
52
+ status = "okay";
53
+
54
+ {% for device in bus.devices %}
55
+ {{ device.name }}: {{ device.compatible }}@{{ device.cs }} {
56
+ compatible = "{{ device.compatible }}";
57
+ reg = <{{ device.cs }}>;
58
+ spi-max-frequency = <{{ device.frequency }}>;
59
+ {% if device.properties %}
60
+ {% for key, value in device.properties.items() %}
61
+ {{ key }} = <{{ value }}>;
62
+ {% endfor %}
63
+ {% endif %}
64
+ };
65
+ {% endfor %}
66
+ };
67
+
68
+ {% endfor %}
69
+
70
+ /* UART Devices */
71
+ {% for uart in uarts %}
72
+ uart{{ uart.number }}: serial@{{ uart.address }} {
73
+ compatible = "nordic,nrf52-uarte";
74
+ status = "okay";
75
+ };
76
+ {% endfor %}
77
+ };
@@ -0,0 +1,89 @@
1
+ /* Device Tree for STM32F4 SOC */
2
+ /* Auto-generated from KiCad schematic */
3
+ /* Generated by: kicad-mcp-server */
4
+
5
+ #include <dt-bindings/gpio/gpio.h>
6
+ #include <dt-bindings/pinctrl/stm32-pinctrl.h>
7
+
8
+ / {
9
+ model = "{{ board_name }}";
10
+ compatible = "st,stm32f4";
11
+
12
+ /* GPIO Configuration */
13
+ pinctrl: pin-controller {
14
+ {% for pin in gpio_pins %}
15
+ gpio_{{ pin.name }}: gpio@{{ pin.number }} {
16
+ gpio-controller;
17
+ #gpio-cells = <2>;
18
+ status = "okay";
19
+ };
20
+ {% endfor %}
21
+ };
22
+
23
+ /* I2C Devices */
24
+ {% for bus in i2c_buses %}
25
+ i2c{{ bus.number }}: i2c@{{ bus.address }} {
26
+ compatible = "st,stm32-i2c";
27
+ #address-cells = <1>;
28
+ #size-cells = <0>;
29
+ status = "okay";
30
+ clock-frequency = <100000>;
31
+
32
+ {% for device in bus.devices %}
33
+ {{ device.name }}: {{ device.compatible }}@{{ device.address }} {
34
+ compatible = "{{ device.compatible }}";
35
+ reg = <{{ device.address }}>;
36
+ {% if device.properties %}
37
+ {% for key, value in device.properties.items() %}
38
+ {{ key }} = <{{ value }}>;
39
+ {% endfor %}
40
+ {% endif %}
41
+ };
42
+ {% endfor %}
43
+ };
44
+
45
+ {% endfor %}
46
+
47
+ /* SPI Devices */
48
+ {% for bus in spi_buses %}
49
+ spi{{ bus.number }}: spi@{{ bus.address }} {
50
+ compatible = "st,stm32-spi";
51
+ #address-cells = <1>;
52
+ #size-cells = <0>;
53
+ status = "okay";
54
+ cs-gpios = <0>;
55
+
56
+ {% for device in bus.devices %}
57
+ {{ device.name }}: {{ device.compatible }}@{{ device.cs }} {
58
+ compatible = "{{ device.compatible }}";
59
+ reg = <{{ device.cs }}>;
60
+ spi-max-frequency = <{{ device.frequency }}>;
61
+ {% if device.properties %}
62
+ {% for key, value in device.properties.items() %}
63
+ {{ key }} = <{{ value }}>;
64
+ {% endfor %}
65
+ {% endif %}
66
+ };
67
+ {% endfor %}
68
+ };
69
+
70
+ {% endfor %}
71
+
72
+ /* UART Devices */
73
+ {% for uart in uarts %}
74
+ usart{{ uart.number }}: serial@{{ uart.address }} {
75
+ compatible = "st,stm32-usart";
76
+ status = "okay";
77
+ };
78
+ {% endfor %}
79
+
80
+ /* Power Domains */
81
+ {% for regulator in regulators %}
82
+ {{ regulator.name }}: regulator@{{ regulator.address }} {
83
+ compatible = "regulator-fixed";
84
+ regulator-name = "{{ regulator.name }}";
85
+ regulator-min-microvolt = <{{ regulator.min_voltage }}>;
86
+ regulator-max-microvolt = <{{ regulator.max_voltage }}>;
87
+ };
88
+ {% endfor %}
89
+ };