Update project files

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
ANDREW HOSFORD
2026-04-07 11:59:48 -05:00
parent dd227be9b0
commit 0e8978f48c
50 changed files with 5878 additions and 241 deletions

126
update_esp32.py Normal file
View File

@@ -0,0 +1,126 @@
"""Update NPC-DATA-HW-ESP32 with sourced specs, test spec, impl code, and test code."""
import json
import urllib.request
API = "http://localhost:8100/api"
# Auth
login = urllib.request.Request(f"{API}/auth/login",
data=json.dumps({"password": "what_is_this_2"}).encode(),
headers={"Content-Type": "application/json"})
TOKEN = json.loads(urllib.request.urlopen(login).read())["token"]
data = {
"acceptance_criteria": """- 8 RMT channels (0-7), each independently configurable as TX or RX
- RMT RAM: 512 x 32-bit words shared across all 8 channels
- Default: 1 memory block (64 x 32-bit words = 256 bytes) per channel
- Channel N can use up to (8-N) blocks (borrows from adjacent higher channels)
- NO DMA for RMT on original ESP32 — uses interrupt-driven successive copying
- 3 SPI peripherals: SPI (flash-only), HSPI (general), VSPI (general)
- HSPI default pins: MOSI=GPIO13, MISO=GPIO12, CLK=GPIO14, CS=GPIO15
- VSPI default pins: MOSI=GPIO23, MISO=GPIO19, CLK=GPIO18, CS=GPIO5
- GPIO 6-11: connected to internal flash, NOT usable
- GPIO 34-39: input-only, no pull-up/pull-down resistors
- Strapping pins: GPIO 0, 2, 4, 5, 12, 15 (affect boot mode)
- Safe output GPIOs for LED data: 2, 4, 5, 13, 14, 16-19, 21-23, 25-27, 32-33
- CPU frequency: 240 MHz (default), dual-core Xtensa LX6
- Flash: 4MB (WROOM-32D standard)
- SRAM: 520 KB""",
"test_spec": """GIVEN the ESP32-WROOM-32D hardware profile defined in code
WHEN each field is compared against the official Espressif documentation
THEN the following must match:
RMT Channels (source: ESP-IDF v4.4.1 RMT docs):
- channelCount equals 8
- each channel type is "rmt"
- each channel supportedSignalTypes includes "one-wire"
- no channel has dmaSupported set to true
SPI Buses (source: ESP32 TRM + GPIO reference):
- exactly 2 general-purpose SPI buses (HSPI, VSPI)
- HSPI defaultGpio is 13 (MOSI)
- VSPI defaultGpio is 23 (MOSI)
- each SPI channel supportedSignalTypes includes "spi"
GPIO Safety (source: ESP32-WROOM-32D datasheet):
- no channel defaultGpio is in [6,7,8,9,10,11] (flash pins)
- no channel defaultGpio is in [34,35,36,39] (input-only)
- all defaultGpio values are in the safe-output set
CPU/Memory (source: ESP32-WROOM-32D datasheet):
- cpuFreqMhz equals 240""",
"test_code": """/**
* Verification sources (datasheets/docs to compare against):
*
* 1. ESP-IDF v4.4.1 RMT Reference
* https://docs.espressif.com/projects/esp-idf/en/v4.4.1/esp32/api-reference/peripherals/rmt.html
* - 8 channels, 512x32-bit shared RAM, 64-word blocks
* - No DMA: "interrupt to successively copy new data chunks"
*
* 2. ESP32-WROOM-32D Datasheet
* https://www.espressif.com/sites/default/files/documentation/esp32-wroom-32d_esp32-wroom-32u_datasheet_en.pdf
* - 240MHz dual-core, 4MB flash, 520KB SRAM
* - GPIO 6-11 flash, GPIO 34-39 input-only
*
* 3. ESP32 GPIO Reference (RandomNerdTutorials)
* https://randomnerdtutorials.com/esp32-pinout-reference-gpios/
* - Strapping pins: 0, 2, 4, 5, 12, 15
* - VSPI: MOSI=23, MISO=19, CLK=18, CS=5
* - HSPI: MOSI=13, MISO=12, CLK=14, CS=15
* - Safe outputs: 2,4,5,13,14,16-19,21-23,25-27,32-33
*/""",
"impl_code": """// src/data/hardware-profiles.ts
const SAFE_OUTPUT_GPIOS = [2,4,5,13,14,16,17,18,19,21,22,23,25,26,27,32,33];
const FLASH_GPIOS = [6,7,8,9,10,11];
const INPUT_ONLY_GPIOS = [34,35,36,39];
const STRAPPING_GPIOS = [0,2,4,5,12,15];
export const ESP32_WROOM_32D: HardwareProfile = {
id: "esp32-wroom-32d",
name: "ESP32-WROOM-32D",
cpuFreqMhz: 240,
dmaBufferBytes: 0, // No DMA for RMT on original ESP32
rmtMemoryBlocks: 8, // 8 blocks x 64 words = 512 x 32-bit
rmtWordsPerBlock: 64,
channels: [
// 8 RMT channels for one-wire protocols
{ id: "RMT0", type: "rmt", supportedSignalTypes: ["one-wire"], defaultGpio: 16, maxMemoryBlocks: 8 },
{ id: "RMT1", type: "rmt", supportedSignalTypes: ["one-wire"], defaultGpio: 17, maxMemoryBlocks: 7 },
{ id: "RMT2", type: "rmt", supportedSignalTypes: ["one-wire"], defaultGpio: 18, maxMemoryBlocks: 6 },
{ id: "RMT3", type: "rmt", supportedSignalTypes: ["one-wire"], defaultGpio: 19, maxMemoryBlocks: 5 },
{ id: "RMT4", type: "rmt", supportedSignalTypes: ["one-wire"], defaultGpio: 21, maxMemoryBlocks: 4 },
{ id: "RMT5", type: "rmt", supportedSignalTypes: ["one-wire"], defaultGpio: 22, maxMemoryBlocks: 3 },
{ id: "RMT6", type: "rmt", supportedSignalTypes: ["one-wire"], defaultGpio: 23, maxMemoryBlocks: 2 },
{ id: "RMT7", type: "rmt", supportedSignalTypes: ["one-wire"], defaultGpio: 25, maxMemoryBlocks: 1 },
// 2 SPI buses for clock-based protocols (APA102)
{ id: "HSPI", type: "spi", supportedSignalTypes: ["spi"], defaultGpio: 13 },
{ id: "VSPI", type: "spi", supportedSignalTypes: ["spi"], defaultGpio: 23 },
],
notes: "RMT uses interrupt-driven successive copying (no DMA). GPIO 6-11 reserved for flash. GPIO 34-39 input-only.",
};""",
"code_language": "typescript",
"target_impl_file": "src/data/hardware-profiles.ts",
"target_test_file": "test/data/hardware-profiles.test.ts",
}
body = json.dumps(data).encode()
req = urllib.request.Request(
f"{API}/requirements/NPC-DATA-HW-ESP32",
data=body,
method="PUT",
headers={
"Content-Type": "application/json",
"Authorization": f"Bearer {TOKEN}",
},
)
resp = urllib.request.urlopen(req)
result = json.loads(resp.read())
print(f"Updated: {result['id']} - {result['title']}")
print(f"Has test_spec: {bool(result.get('test_spec'))}")
print(f"Has impl_code: {bool(result.get('impl_code'))}")
print(f"Has test_code: {bool(result.get('test_code'))}")