@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,313 @@
1
+ /**
2
+ * STM32 HAL Test Suite for {{ project_name }}
3
+ * Generated from {{ schematic_path }}
4
+ *
5
+ * Connectivity and functional tests using STM32 HAL library.
6
+ */
7
+
8
+ {% if target_mcu %}
9
+ #ifdef {{ target_mcu.upper().replace('-', '_') }
10
+ #include "stm32{{ target_mcu.lower().replace('stm32', '').replace('x', '') }}xx_hal.h"
11
+ #else
12
+ #include "stm32xxxx_hal.h"
13
+ #endif
14
+ {% endif %}
15
+
16
+ #include <stdio.h>
17
+ #include <stdint.h>
18
+
19
+ /* Private defines */
20
+ #define TEST_PASS 1
21
+ #define TEST_FAIL 0
22
+
23
+ /* Test statistics */
24
+ static uint32_t g_tests_passed = 0;
25
+ static uint32_t g_tests_failed = 0;
26
+
27
+ /* UART handle for debug output */
28
+ extern UART_HandleTypeDef huart2; /* Adjust to your UART */
29
+
30
+ /* Private function prototypes */
31
+ static void test_init(void);
32
+ static void test_power_supply(void);
33
+ static void test_gpio_connectivity(void);
34
+ {% if test_type == "functional" %}
35
+ static void test_i2c_scan(void);
36
+ static void test_spi_loopback(void);
37
+ {% endif %}
38
+ static void print_summary(void);
39
+
40
+ /* Helper functions */
41
+ static void test_log(const char* message) {
42
+ HAL_UART_Transmit(&huart2, (uint8_t*)message, strlen(message), HAL_MAX_DELAY);
43
+ }
44
+
45
+ static void test_log_num(const char* prefix, int32_t num) {
46
+ char buffer[64];
47
+ snprintf(buffer, sizeof(buffer), "%s%ld\n", prefix, num);
48
+ test_log(buffer);
49
+ }
50
+
51
+ /**
52
+ * @brief Initialize test suite
53
+ */
54
+ static void test_init(void) {
55
+ test_log("\r\n========================================\r\n");
56
+ test_log("{{ project_name }} - STM32 HAL Test Suite\r\n");
57
+ test_log("========================================\r\n\r\n");
58
+
59
+ /* Initialize HAL */
60
+ HAL_Init();
61
+
62
+ /* Configure system clock */
63
+ SystemClock_Config();
64
+
65
+ /* Initialize peripherals */
66
+ MX_GPIO_Init();
67
+ MX_USART2_UART_Init();
68
+ {% if test_type == "functional" %}
69
+ MX_I2C1_Init();
70
+ MX_SPI1_Init();
71
+ {% endif %}
72
+
73
+ test_log("Test initialization complete\r\n\r\n");
74
+ }
75
+
76
+ /**
77
+ * @brief Test power supply presence
78
+ */
79
+ static void test_power_supply(void) {
80
+ test_log("[TEST] Power Supply Check\r\n");
81
+
82
+ {% if target_mcu and "stm32" in target_mcu %}
83
+ /* Use internal reference and ADC to check VDD */
84
+ ADC_HandleTypeDef hadc1;
85
+ ADC_ChannelConfTypeDef sConfig = {0};
86
+
87
+ /* Enable ADC clock */
88
+ __HAL_RCC_ADC1_CLK_ENABLE();
89
+
90
+ hadc1.Instance = ADC1;
91
+ hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
92
+ hadc1.Init.ContinuousConvMode = DISABLE;
93
+ hadc1.Init.DiscontinuousConvMode = DISABLE;
94
+ hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
95
+ hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
96
+ hadc1.Init.NbrOfConversion = 1;
97
+ HAL_ADC_Init(&hadc1);
98
+
99
+ /* Configure VREFINT channel */
100
+ sConfig.Channel = ADC_CHANNEL_VREFINT;
101
+ sConfig.Rank = ADC_REGULAR_RANK_1;
102
+ sConfig.SamplingTime = ADC_SAMPLETIME_239CYCLES_5;
103
+ HAL_ADC_ConfigChannel(&hadc1, &sConfig);
104
+
105
+ /* Start conversion */
106
+ HAL_ADC_Start(&hadc1);
107
+ HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);
108
+ uint32_t adc_value = HAL_ADC_GetValue(&hadc1);
109
+ HAL_ADC_Stop(&hadc1);
110
+
111
+ /* Calculate VDD (simplified) */
112
+ float vdd = 1.2f * 4096.0f / adc_value;
113
+
114
+ test_log("VDD: ");
115
+ test_log_num("VDD = ", (int32_t)(vdd * 1000));
116
+ test_log(" mV\r\n");
117
+
118
+ if (vdd > 2.7f && vdd < 3.6f) {
119
+ test_log("[PASS] Power supply OK\r\n\r\n");
120
+ g_tests_passed++;
121
+ } else {
122
+ test_log("[FAIL] Power supply out of range\r\n\r\n");
123
+ g_tests_failed++;
124
+ }
125
+ {% else %}
126
+ test_log("[SKIP] Power test requires MCU-specific ADC\r\n\r\n");
127
+ {% endif %}
128
+ }
129
+
130
+ /**
131
+ * @brief Test GPIO connectivity
132
+ */
133
+ static void test_gpio_connectivity(void) {
134
+ test_log("[TEST] GPIO Connectivity\r\n");
135
+
136
+ /* Test input pins */
137
+ GPIO_TypeDef* ports[] = {
138
+ {% for pin in test_pins %}
139
+ GPIO{{ pin.port }}, /* {{ pin.name }} */
140
+ {% endfor %}
141
+ };
142
+
143
+ const uint16_t pins[] = {
144
+ {% for pin in test_pins %}
145
+ GPIO_PIN_{{ pin.pin_number }}, /* {{ pin.name }} */
146
+ {% endfor %}
147
+ };
148
+
149
+ const char* pin_names[] = {
150
+ {% for pin in test_pins %}
151
+ "{{ pin.name }}",
152
+ {% endfor %}
153
+ };
154
+
155
+ for (size_t i = 0; i < sizeof(pins)/sizeof(pins[0]); i++) {
156
+ GPIO_PinState state = HAL_GPIO_ReadPin(ports[i], pins[i]);
157
+
158
+ test_log(pin_names[i]);
159
+ test_log(": ");
160
+ test_log(state == GPIO_PIN_SET ? "HIGH\r\n" : "LOW\r\n");
161
+ }
162
+
163
+ test_log("[PASS] GPIO connectivity test complete\r\n\r\n");
164
+ g_tests_passed++;
165
+ }
166
+
167
+ {% if test_type == "functional" %}
168
+ /**
169
+ * @brief Scan I2C bus for devices
170
+ */
171
+ static void test_i2c_scan(void) {
172
+ test_log("[TEST] I2C Device Scan\r\n");
173
+
174
+ /* I2C handle - adjust to your configuration */
175
+ I2C_HandleTypeDef hi2c1;
176
+
177
+ HAL_StatusTypeDef status;
178
+ uint8_t devices_found = 0;
179
+
180
+ for (uint8_t addr = 1; addr < 128; addr++) {
181
+ status = HAL_I2C_IsDeviceReady(&hi2c1, addr << 1, 1, 10);
182
+
183
+ if (status == HAL_OK) {
184
+ char buffer[64];
185
+ snprintf(buffer, sizeof(buffer), "Device found at 0x%02X\r\n", addr);
186
+ test_log(buffer);
187
+ devices_found++;
188
+ }
189
+ }
190
+
191
+ test_log_num("Total I2C devices: ", devices_found);
192
+ test_log("\r\n[PASS] I2C scan complete\r\n\r\n");
193
+ g_tests_passed++;
194
+ }
195
+
196
+ /**
197
+ * @brief SPI loopback test
198
+ */
199
+ static void test_spi_loopback(void) {
200
+ test_log("[TEST] SPI Loopback Test\r\n");
201
+
202
+ /* SPI handle - adjust to your configuration */
203
+ SPI_HandleTypeDef hspi1;
204
+
205
+ uint8_t tx_data = 0xAA;
206
+ uint8_t rx_data = 0x00;
207
+
208
+ HAL_SPI_TransmitReceive(&hspi1, &tx_data, &rx_data, 1, 100);
209
+
210
+ test_log("TX: 0xAA, RX: ");
211
+ char buffer[32];
212
+ snprintf(buffer, sizeof(buffer), "0x%02X\r\n", rx_data);
213
+ test_log(buffer);
214
+
215
+ /* Note: Loopback requires hardware connection */
216
+ test_log("[PASS] SPI test complete\r\n\r\n");
217
+ g_tests_passed++;
218
+ }
219
+ {% endif %}
220
+
221
+ /**
222
+ * @brief Print test summary
223
+ */
224
+ static void print_summary(void) {
225
+ test_log("\r\n========================================\r\n");
226
+ test_log("Test Summary\r\n");
227
+ test_log("========================================\r\n");
228
+
229
+ test_log("Passed: ");
230
+ test_log_num("", g_tests_passed);
231
+ test_log("Failed: ");
232
+ test_log_num("", g_tests_failed);
233
+ test_log("Total: ");
234
+ test_log_num("", g_tests_passed + g_tests_failed);
235
+
236
+ test_log("\r\n========================================\r\n");
237
+ }
238
+
239
+ /**
240
+ * @brief Main test runner
241
+ */
242
+ int main(void) {
243
+ /* Initialize test suite */
244
+ test_init();
245
+
246
+ /* Run tests */
247
+ test_power_supply();
248
+ test_gpio_connectivity();
249
+ {% if test_type == "functional" %}
250
+ test_i2c_scan();
251
+ test_spi_loopback();
252
+ {% endif %}
253
+
254
+ /* Print summary */
255
+ print_summary();
256
+
257
+ /* Loop forever */
258
+ while (1) {
259
+ HAL_Delay(1000);
260
+ }
261
+ }
262
+
263
+ /**
264
+ * @brief System Clock Configuration (stub)
265
+ */
266
+ void SystemClock_Config(void) {
267
+ /* Implement based on your MCU and clock requirements */
268
+ }
269
+
270
+ /**
271
+ * @brief GPIO Initialization (stub)
272
+ */
273
+ void MX_GPIO_Init(void) {
274
+ /* Enable GPIO clocks */
275
+ __HAL_RCC_GPIOA_CLK_ENABLE();
276
+ __HAL_RCC_GPIOB_CLK_ENABLE();
277
+ __HAL_RCC_GPIOC_CLK_ENABLE();
278
+
279
+ /* Configure GPIO pins based on schematic */
280
+ {% for pin in test_pins %}
281
+ /* {{ pin.name }}: PA{{ pin.pin_number }} */
282
+ {% endfor %}
283
+ }
284
+
285
+ /**
286
+ * @brief UART Initialization (stub)
287
+ */
288
+ void MX_USART2_UART_Init(void) {
289
+ /* Implement UART initialization for debug output */
290
+ }
291
+
292
+ {% if test_type == "functional" %}
293
+ /**
294
+ * @brief I2C Initialization (stub)
295
+ */
296
+ void MX_I2C1_Init(void) {
297
+ /* Implement I2C initialization */
298
+ }
299
+
300
+ /**
301
+ * @brief SPI Initialization (stub)
302
+ */
303
+ void MX_SPI1_Init(void) {
304
+ /* Implement SPI initialization */
305
+ }
306
+ {% endif %}
307
+
308
+ /**
309
+ * @brief SysTick Handler
310
+ */
311
+ void SysTick_Handler(void) {
312
+ HAL_IncTick();
313
+ }
@@ -0,0 +1,99 @@
1
+ """GPIO Pin Tests - Auto-generated from KiCad schematic
2
+ Generated by: kicad-mcp-server
3
+ """
4
+
5
+ import pytest
6
+ from unittest.mock import Mock
7
+ {% if hardware_interaction %}
8
+ import RPi.GPIO as GPIO # Raspberry Pi
9
+ {% endif %}
10
+
11
+
12
+ {% for pin in gpio_pins %}
13
+ class TestGPIO{{ pin.number }}:
14
+ """Test GPIO pin {{ pin.number }} - {{ pin.net }}"""
15
+
16
+ {% if pin.direction == 'output' %}
17
+ def test_gpio_output(self):
18
+ """Test GPIO {{ pin.number }} output functionality"""
19
+ # Setup pin as output
20
+ {% if hardware_interaction %}
21
+ GPIO.setup({{ pin.number }}, GPIO.OUT)
22
+ {% endif %}
23
+
24
+ # Test high state
25
+ {% if hardware_interaction %}
26
+ GPIO.output({{ pin.number }}, GPIO.HIGH)
27
+ assert GPIO.input({{ pin.number }}) == GPIO.HIGH
28
+ {% endif %}
29
+
30
+ # Test low state
31
+ {% if hardware_interaction %}
32
+ GPIO.output({{ pin.number }}, GPIO.LOW)
33
+ assert GPIO.input({{ pin.number }}) == GPIO.LOW
34
+ {% endif %}
35
+
36
+ {% elif pin.direction == 'input' %}
37
+ def test_gpio_input(self):
38
+ """Test GPIO {{ pin.number }} input functionality"""
39
+ # Setup pin as input
40
+ {% if hardware_interaction %}
41
+ GPIO.setup({{ pin.number }}, GPIO.IN)
42
+ initial_state = GPIO.input({{ pin.number }})
43
+ {% endif %}
44
+
45
+ # Pin should be readable
46
+ {% if hardware_interaction %}
47
+ state = GPIO.input({{ pin.number }})
48
+ assert state in [GPIO.LOW, GPIO.HIGH]
49
+ {% endif %}
50
+
51
+ {% endif %}
52
+ def test_gpio_{{ pin.number }}_continuity(self):
53
+ """Test continuity for GPIO pin {{ pin.number }}"""
54
+ # This test verifies the connection exists
55
+ # Expected net: {{ pin.net }}
56
+ # Pin: {{ pin.number }}
57
+
58
+ # TODO: Add continuity test logic
59
+ # For multimeter-based testing, verify resistance is low
60
+ assert True, "Continuity test not implemented"
61
+
62
+ {% endfor %}
63
+
64
+
65
+ class TestGPIOInteractions:
66
+ """Test interactions between multiple GPIO pins"""
67
+
68
+ {% if gpio_pins|length > 1 %}
69
+ def test_multiple_gpio_outputs(self):
70
+ """Test multiple GPIO output pins simultaneously"""
71
+ {% for pin in gpio_pins[:4] %}
72
+ {% if pin.direction == 'output' %}
73
+ # GPIO {{ pin.number }} configuration
74
+ {% if hardware_interaction %}
75
+ GPIO.setup({{ pin.number }}, GPIO.OUT)
76
+ GPIO.output({{ pin.number }}, GPIO.HIGH)
77
+ {% endif %}
78
+ {% endfor %}
79
+ {% endfor %}
80
+
81
+ # Verify all outputs are set correctly
82
+ {% if hardware_interaction %}
83
+ {% for pin in gpio_pins[:4] %}
84
+ {% if pin.direction == 'output' %}
85
+ assert GPIO.input({{ pin.number }}) == GPIO.HIGH
86
+ {% endif %}
87
+ {% endfor %}
88
+ {% endif %}
89
+
90
+ {% endif %}
91
+ def test_gpio_pin_conflicts(self):
92
+ """Test for GPIO pin conflicts"""
93
+ # Verify no pins are configured with conflicting functions
94
+ pins_tested = {{ gpio_pins|length }}
95
+ assert pins_tested > 0, "No GPIO pins found to test"
96
+
97
+
98
+ if __name__ == "__main__":
99
+ pytest.main([__file__, "-v"])
@@ -0,0 +1,117 @@
1
+ """I2C Device Tests - Auto-generated from KiCad schematic
2
+ Generated by: kicad-mcp-server
3
+ """
4
+
5
+ import pytest
6
+ {% if hardware_interaction %}
7
+ from smbus2 import SMBus, i2c_msg
8
+ {% endif %}
9
+
10
+
11
+ {% for device in i2c_devices %}
12
+ class TestI2CDevice{{ loop.index }}:
13
+ """Test I2C device {{ device.reference }} - {{ device.value }}"""
14
+
15
+ def test_i2c_device_detection(self):
16
+ """Test I2C device detection at address 0x{{ "%02X"|format(device.address) }}"""
17
+ expected_address = 0x{{ "%02X"|format(device.address) }}
18
+ device_name = "{{ device.value }}"
19
+
20
+ {% if hardware_interaction %}
21
+ # Scan I2C bus
22
+ found_devices = []
23
+ for address in range(0x03, 0x78):
24
+ try:
25
+ with SMBus(1) as bus:
26
+ bus.read_byte(address)
27
+ found_devices.append(address)
28
+ except:
29
+ pass
30
+
31
+ # Verify device is present
32
+ assert expected_address in found_devices, f"{device_name} not found at 0x{expected_address:02X}"
33
+ {% else %}
34
+ # Mock test - verify address is valid
35
+ assert 0x03 <= expected_address <= 0x77, "Invalid I2C address"
36
+ {% endif %}
37
+
38
+ def test_i2c_device_communication(self):
39
+ """Test I2C communication with {{ device.reference }}"""
40
+ expected_address = 0x{{ "%02X"|format(device.address) }}
41
+
42
+ {% if hardware_interaction %}
43
+ try:
44
+ with SMBus(1) as bus:
45
+ # Test basic read operation
46
+ data = bus.read_byte_data(expected_address, 0x00)
47
+ assert isinstance(data, int), "Failed to read from device"
48
+ except Exception as e:
49
+ pytest.skip(f"I2C communication failed: {e}")
50
+ {% else %}
51
+ # Mock test - verify device can be addressed
52
+ assert expected_address != 0x00, "I2C address cannot be 0x00"
53
+ {% endif %}
54
+
55
+ def test_i2c_device_{{ device.compatible.split(',')[1] if ',' in device.compatible else device.compatible }}_specific(self):
56
+ """Test {{ device.value }} specific functionality"""
57
+ # Device-specific tests for {{ device.value }}
58
+ # Compatible: {{ device.compatible }}
59
+
60
+ # TODO: Add device-specific test cases
61
+ # Examples:
62
+ # - Read chip ID register
63
+ # - Verify sensor readings
64
+ # - Test configuration registers
65
+ assert True, "Device-specific tests not implemented"
66
+
67
+ {% endfor %}
68
+
69
+
70
+ class TestI2CBus:
71
+ """Test I2C bus functionality"""
72
+
73
+ def test_i2c_bus_scan(self):
74
+ """Test I2C bus scan"""
75
+ expected_devices = {
76
+ {% for device in i2c_devices %}
77
+ 0x{{ "%02X"|format(device.address) }}: "{{ device.value }}",
78
+ {% endfor %}
79
+ }
80
+
81
+ {% if hardware_interaction %}
82
+ # Scan I2C bus
83
+ found_devices = []
84
+ for address in range(0x03, 0x78):
85
+ try:
86
+ with SMBus(1) as bus:
87
+ bus.read_byte(address)
88
+ found_devices.append(address)
89
+ except:
90
+ pass
91
+
92
+ # Verify expected devices are present
93
+ for address, device_name in expected_devices.items():
94
+ if address in found_devices:
95
+ print(f"✓ Found {device_name} at 0x{address:02X}")
96
+ else:
97
+ pytest.fail(f"✗ {device_name} not found at 0x{address:02X}")
98
+ {% else %}
99
+ # Mock test - verify expected device configuration
100
+ assert len(expected_devices) > 0, "No I2C devices configured"
101
+ {% endif %}
102
+
103
+ def test_i2c_bus_voltage_levels(self):
104
+ """Test I2C bus voltage levels"""
105
+ # I2C buses typically operate at:
106
+ # - 3.3V for modern MCUs
107
+ # - 5.0V for legacy systems
108
+
109
+ # TODO: Add voltage level testing
110
+ # - Verify pull-up resistors are present
111
+ # - Check bus idle state (high)
112
+ # - Measure voltage levels
113
+ assert True, "Voltage level test not implemented"
114
+
115
+
116
+ if __name__ == "__main__":
117
+ pytest.main([__file__, "-v"])
@@ -0,0 +1,43 @@
1
+ """Pin Multiplexing Tests - Auto-generated from KiCad schematic
2
+ Generated by: kicad-mcp-server
3
+ """
4
+
5
+ import pytest
6
+
7
+
8
+ class TestPinMultiplexing:
9
+ """Test pin multiplexing configuration"""
10
+
11
+ def test_no_pin_conflicts(self):
12
+ """Test that there are no pin conflicts"""
13
+ # This test verifies that no pins are configured
14
+ # with conflicting functions
15
+
16
+ # TODO: Add pin conflict detection logic
17
+ # - Multiple functions on same pin
18
+ # - Incompatible peripheral assignments
19
+ assert True, "Pin conflict test not implemented"
20
+
21
+ def test_gpio_alternate_functions(self):
22
+ """Test GPIO alternate function assignments"""
23
+ # Verify that GPIO pins are correctly assigned
24
+ # to their alternate functions
25
+
26
+ # TODO: Add alternate function verification
27
+ # - Check peripheral assignments
28
+ # - Verify function compatibility
29
+ assert True, "Alternate function test not implemented"
30
+
31
+ def test_peripheral_pin_mapping(self):
32
+ """Test peripheral-to-pin mappings"""
33
+ # Verify that peripherals are mapped to correct pins
34
+
35
+ # TODO: Add peripheral mapping tests
36
+ # - I2C SDA/SCL pin assignments
37
+ # - SPI MOSI/MISO/SCK/CS pin assignments
38
+ # - UART TX/RX pin assignments
39
+ assert True, "Peripheral mapping test not implemented"
40
+
41
+
42
+ if __name__ == "__main__":
43
+ pytest.main([__file__, "-v"])
@@ -0,0 +1,94 @@
1
+ """SPI Device Tests - Auto-generated from KiCad schematic
2
+ Generated by: kicad-mcp-server
3
+ """
4
+
5
+ import pytest
6
+ {% if hardware_interaction %}
7
+ import spidev
8
+ {% endif %}
9
+
10
+
11
+ {% for device in spi_devices %}
12
+ class TestSPIDevice{{ loop.index }}:
13
+ """Test SPI device {{ device.reference }} - {{ device.value }}"""
14
+
15
+ def test_spi_device_detection(self):
16
+ """Test SPI device detection on CS {{ device.cs }}"""
17
+ cs_pin = {{ device.cs }}
18
+ device_name = "{{ device.value }}"
19
+ frequency = {{ device.frequency }}
20
+
21
+ {% if hardware_interaction %}
22
+ try:
23
+ # Open SPI bus
24
+ spi = spidev.SpiDev()
25
+ spi.open(0, cs_pin)
26
+ spi.max_speed_hz = frequency
27
+
28
+ # Test basic communication
29
+ response = spi.xfer2([0x9F]) # Common JEDEC ID command
30
+ spi.close()
31
+
32
+ assert len(response) > 0, f"No response from {device_name}"
33
+ except Exception as e:
34
+ pytest.skip(f"SPI communication failed: {e}")
35
+ {% else %}
36
+ # Mock test - verify device can be addressed
37
+ assert 0 <= cs_pin <= 2, "Invalid CS pin"
38
+ assert frequency > 0, "Invalid SPI frequency"
39
+ {% endif %}
40
+
41
+ def test_spi_device_{{ device.compatible.split(',')[1] if ',' in device.compatible else device.compatible }}_specific(self):
42
+ """Test {{ device.value }} specific functionality"""
43
+ # Device-specific tests for {{ device.value }}
44
+ # Compatible: {{ device.compatible }}
45
+
46
+ # TODO: Add device-specific test cases
47
+ # Examples:
48
+ # - Read JEDEC ID
49
+ # - Verify register access
50
+ # - Test data transfer
51
+ assert True, "Device-specific tests not implemented"
52
+
53
+ {% endfor %}
54
+
55
+
56
+ class TestSPIBus:
57
+ """Test SPI bus functionality"""
58
+
59
+ def test_spi_bus_configuration(self):
60
+ """Test SPI bus configuration"""
61
+ # SPI bus should be configured with:
62
+ # - Correct clock polarity and phase
63
+ # - Appropriate clock frequency
64
+ # - Proper chip select handling
65
+
66
+ # TODO: Add bus configuration tests
67
+ assert True, "SPI bus configuration test not implemented"
68
+
69
+ def test_spi_data_transfer(self):
70
+ """Test SPI data transfer"""
71
+ # Test basic SPI data transfer
72
+
73
+ {% if hardware_interaction %}
74
+ try:
75
+ spi = spidev.SpiDev()
76
+ spi.open(0, 0)
77
+ spi.max_speed_hz = 1000000
78
+
79
+ # Test write and read
80
+ test_data = [0xAA, 0x55, 0xFF, 0x00]
81
+ response = spi.xfer2(test_data)
82
+ spi.close()
83
+
84
+ assert len(response) == len(test_data), "Data length mismatch"
85
+ except Exception as e:
86
+ pytest.skip(f"SPI data transfer failed: {e}")
87
+ {% else %}
88
+ # Mock test
89
+ assert True, "SPI data transfer test not implemented"
90
+ {% endif %}
91
+
92
+
93
+ if __name__ == "__main__":
94
+ pytest.main([__file__, "-v"])