@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.
- package/README.md +116 -0
- package/config/mcp/antigravity.json +22 -0
- package/config/mcp/claude.json +22 -0
- package/config/mcp/codex.toml +25 -0
- package/docs/adr/ADR-001-KICAD-OPENSCAD-MCP-STRATEGY.md +334 -0
- package/docs/review_documentation.md +121 -0
- package/installer.js +358 -0
- package/mcp_servers/kicad-mcp-server/.env.example +22 -0
- package/mcp_servers/kicad-mcp-server/.github/workflows/ci.yml +36 -0
- package/mcp_servers/kicad-mcp-server/CLAUDE.md +487 -0
- package/mcp_servers/kicad-mcp-server/README.md +316 -0
- package/mcp_servers/kicad-mcp-server/docs/DEVICE_TREE.md +416 -0
- package/mcp_servers/kicad-mcp-server/docs/INSTALLATION.md +332 -0
- package/mcp_servers/kicad-mcp-server/docs/PIN_ANALYSIS.md +332 -0
- package/mcp_servers/kicad-mcp-server/docs/README.md +240 -0
- package/mcp_servers/kicad-mcp-server/docs/TESTING.md +613 -0
- package/mcp_servers/kicad-mcp-server/docs/VALIDATION.md +268 -0
- package/mcp_servers/kicad-mcp-server/pyproject.toml +96 -0
- package/mcp_servers/kicad-mcp-server/requirements-dev.txt +16 -0
- package/mcp_servers/kicad-mcp-server/requirements-test.txt +24 -0
- package/mcp_servers/kicad-mcp-server/requirements.txt +13 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/__init__.py +3 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/__main__.py +17 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/config.py +46 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/models/__init__.py +1 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/models/types.py +87 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/parsers/__init__.py +1 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/parsers/netlist_parser.py +234 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/parsers/pcb_parser.py +375 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/parsers/pcb_parser_kicad.py +327 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/parsers/schematic_parser.py +902 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/server.py +71 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/__init__.py +1 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/arduino/connectivity_test.cpp.j2 +189 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/device_tree/atmega.dts.j2 +77 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/device_tree/esp32.dts.j2 +77 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/device_tree/nrf52.dts.j2 +77 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/device_tree/stm32f4.dts.j2 +89 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/esp_idf/test_suite.c.j2 +340 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/pytest/test_connectivity.py.j2 +147 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/st_hal/hal_test.c.j2 +313 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/pytest_gpio_test.py.j2 +99 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/pytest_i2c_test.py.j2 +117 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/pytest_pinmux_test.py.j2 +43 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/pytest_spi_test.py.j2 +94 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/unity_gpio_test.c.j2 +113 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/unity_i2c_test.c.j2 +101 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/unity_spi_test.c.j2 +94 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/unittest/test_schematic.py.j2 +172 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/__init__.py +36 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/device_tree.py +1187 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/hierarchical_analysis.py +211 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/netlist.py +320 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/parts_registry.py +142 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/pcb.py +955 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/pcb_layout.py +308 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/pin_analysis.py +765 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/project.py +196 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/schematic.py +319 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/schematic_editor.py +674 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/schematic_search.py +158 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/validation.py +866 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/visualization.py +225 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/utils/__init__.py +1 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/utils/file_handlers.py +65 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/utils/kicad_cli.py +103 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/utils/kicad_version.py +103 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/utils/parts_registry.py +197 -0
- package/mcp_servers/kicad-mcp-server/tests/__init__.py +1 -0
- package/mcp_servers/kicad-mcp-server/tests/examples/ESP32S3_TEST.md +219 -0
- package/mcp_servers/kicad-mcp-server/tests/fixtures/README.md +65 -0
- package/mcp_servers/kicad-mcp-server/tests/fixtures/__init__.py +1 -0
- package/mcp_servers/kicad-mcp-server/tests/fixtures/example_pcb.kicad_pcb +177 -0
- package/mcp_servers/kicad-mcp-server/tests/fixtures/example_schematic.kicad_sch +145 -0
- package/mcp_servers/kicad-mcp-server/tests/fixtures/hier/child.kicad_sch +24 -0
- package/mcp_servers/kicad-mcp-server/tests/fixtures/hier/root.kicad_sch +38 -0
- package/mcp_servers/kicad-mcp-server/tests/test_tools/__init__.py +1 -0
- package/mcp_servers/kicad-mcp-server/tests/test_tools/test_hierarchical_labels.py +195 -0
- package/mcp_servers/kicad-mcp-server/tests/test_tools/test_kicad_cli.py +116 -0
- package/mcp_servers/kicad-mcp-server/tests/test_tools/test_netlist_cache_path.py +29 -0
- package/mcp_servers/kicad-mcp-server/tests/test_tools/test_schematic.py +189 -0
- package/mcp_servers/kicad-mcp-server/tests/test_tools/test_schematic_hierarchy.py +69 -0
- package/mcp_servers/kicad-mcp-server/tests/test_tools/test_visualization.py +136 -0
- package/mcp_servers/kicad-mcp-server/uv.lock +2873 -0
- package/mcp_servers/openscad-mcp-server/.dockerignore +9 -0
- package/mcp_servers/openscad-mcp-server/.github/workflows/test.yml +40 -0
- package/mcp_servers/openscad-mcp-server/Dockerfile +29 -0
- package/mcp_servers/openscad-mcp-server/LICENSE +21 -0
- package/mcp_servers/openscad-mcp-server/README.md +154 -0
- package/mcp_servers/openscad-mcp-server/docs/audit.md +56 -0
- package/mcp_servers/openscad-mcp-server/docs/docker.md +66 -0
- package/mcp_servers/openscad-mcp-server/docs/issue-followup.md +19 -0
- package/mcp_servers/openscad-mcp-server/docs/jetson.md +17 -0
- package/mcp_servers/openscad-mcp-server/glama.json +4 -0
- package/mcp_servers/openscad-mcp-server/legacy/README.md +15 -0
- package/mcp_servers/openscad-mcp-server/legacy/README.original.md +294 -0
- package/mcp_servers/openscad-mcp-server/legacy/implementation_plan.md +100 -0
- package/mcp_servers/openscad-mcp-server/legacy/old/download_sam2_checkpoint.py +115 -0
- package/mcp_servers/openscad-mcp-server/legacy/old/src/ai/sam_segmentation.py +209 -0
- package/mcp_servers/openscad-mcp-server/legacy/old/src/models/threestudio_generator.py +231 -0
- package/mcp_servers/openscad-mcp-server/legacy/old/src/workflow/image_to_model_pipeline.py +260 -0
- package/mcp_servers/openscad-mcp-server/legacy/old/test_sam2_segmentation.py +96 -0
- package/mcp_servers/openscad-mcp-server/legacy/requirements.txt +57 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/README.md +39 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/decisions/ai-driven-code-generation.md +122 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/decisions/export-formats.md +76 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/files/src/ai/ai_service.py.md +51 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/files/src/main.py.md +63 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/files/src/models/code_generator.py.md +63 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/files/src/nlp/parameter_extractor.py.md +63 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/knowledge/ai/natural-language-processing.md +78 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/knowledge/nlp/parameter-extraction.md +173 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/knowledge/openscad/export-formats.md +91 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/knowledge/openscad/openscad-basics.md +66 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/knowledge/openscad/primitive-testing.md +79 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/__init__.py +0 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/ai/ai_service.py +257 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/ai/gemini_api.py +161 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/ai/venice_api.py +203 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/config.py +121 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/main.py +1456 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/main.py.new +404 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/main_remote.py +401 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/models/__init__.py +0 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/models/code_generator.py +321 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/models/cuda_mvs.py +209 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/models/scad_templates/basic_shapes.scad +144 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/nlp/__init__.py +0 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/nlp/parameter_extractor.py +388 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/openscad_wrapper/__init__.py +0 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/openscad_wrapper/wrapper.py +418 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/printer_discovery/__init__.py +1 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/printer_discovery/printer_discovery.py +471 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/remote/connection_manager.py +537 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/remote/cuda_mvs_client.py +435 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/remote/cuda_mvs_server.py +787 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/remote/error_handling.py +415 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/testing/__init__.py +0 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/testing/primitive_tester.py +203 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/testing/test_primitives.py +98 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/utils/__init__.py +1 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/utils/cad_exporter.py +241 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/utils/format_validator.py +206 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/utils/stl_exporter.py +140 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/utils/stl_repair.py +91 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/utils/stl_validator.py +123 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/visualization/__init__.py +0 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/visualization/headless_renderer.py +52 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/visualization/renderer.py +177 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/visualization/web_interface.py +639 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/workflow/image_approval.py +148 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/workflow/multi_view_to_model_pipeline.py +338 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_complete_workflow.py +374 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_cuda_mvs.py +191 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_gemini_api.py +168 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_image_approval.py +192 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_image_approval_workflow.py +251 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_image_to_model_pipeline.py +145 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_model_selection.py +41 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_multi_view_pipeline.py +290 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_primitives.sh +13 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_rabbit_direct.py +71 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_remote_cuda_mvs.py +283 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_venice_example.py +69 -0
- package/mcp_servers/openscad-mcp-server/pyproject.toml +33 -0
- package/mcp_servers/openscad-mcp-server/requirements.txt +2 -0
- package/mcp_servers/openscad-mcp-server/scad/simple_cube.scad +2 -0
- package/mcp_servers/openscad-mcp-server/scripts/test_docker.py +220 -0
- package/mcp_servers/openscad-mcp-server/src/openscad_mcp/__init__.py +3 -0
- package/mcp_servers/openscad-mcp-server/src/openscad_mcp/__main__.py +3 -0
- package/mcp_servers/openscad-mcp-server/src/openscad_mcp/engine.py +94 -0
- package/mcp_servers/openscad-mcp-server/src/openscad_mcp/geometry.py +242 -0
- package/mcp_servers/openscad-mcp-server/src/openscad_mcp/server.py +245 -0
- package/mcp_servers/openscad-mcp-server/src/openscad_mcp/service.py +190 -0
- package/mcp_servers/openscad-mcp-server/tests/conftest.py +17 -0
- package/mcp_servers/openscad-mcp-server/tests/test_engine.py +37 -0
- package/mcp_servers/openscad-mcp-server/tests/test_geometry.py +106 -0
- package/mcp_servers/openscad-mcp-server/tests/test_integration.py +172 -0
- package/mcp_servers/openscad-mcp-server/tests/test_transports.py +314 -0
- package/mcp_servers/openscad-mcp-server/uv.lock +1123 -0
- package/package.json +44 -0
- package/scripts/install_mcps.sh +86 -0
- package/scripts/openscad_wrapper.sh +62 -0
- package/scripts/run_kicad_mcp.sh +25 -0
- package/scripts/run_openscad_mcp.sh +41 -0
- package/scripts/test_mcp_connection.py +626 -0
- package/scripts/test_mcp_connection.sh +168 -0
- package/skills/code-first-hardware-design/SKILL.md +260 -0
- package/skills/pcb-constraint-definition/SKILL.md +236 -0
- package/skills/pcb-layout-routing-automation/SKILL.md +153 -0
- package/skills/pcb-validation-dfm-signoff/SKILL.md +194 -0
- 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
|
+
}
|
package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/pytest_gpio_test.py.j2
ADDED
|
@@ -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"])
|
package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/pytest_i2c_test.py.j2
ADDED
|
@@ -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"])
|
package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/pytest_pinmux_test.py.j2
ADDED
|
@@ -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"])
|
package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/pytest_spi_test.py.j2
ADDED
|
@@ -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"])
|