Files
SC-F001/README-ISSUES.md
Thaddeus Hughes 20afd3d9ef stashing
2026-06-10 16:40:27 -05:00

195 lines
6.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# README.md Issues
Audit of `README.md` against the actual firmware code. The active board is **V5** (`#define BOARD_V5` in `board_config.h`).
---
## GPIO Map (lines 1328) — Wrong for active board (V5)
The table documents the **V4 pinout**. On V5 the sensor and ADC GPIOs are completely different:
| README says | V4 pin | Actual V5 | Source |
|---|---|---|---|
| GPIO14 = Drive encoder | ISENS2 | **GPIO14 = JACK position sensor** | `sensors.c:26` |
| GPIO16 = Jack position sensor | ISENS3 | **GPIO16 = not used** (V5 uses GPIO14 for JACK) | `sensors.c:26` |
| GPIO19 = Aux sensor 2 (reserved) | BATTERY | **GPIO19 = DRIVE encoder** | `sensors.c:26` |
| GPIO23 = *missing* | — | **GPIO23 = AUX2** (unused, J3 unreliable) | `sensors.c:26` |
| GPIO34 = ADC: jack current sense | ISENS2 | **GPIO34 = V_ISENS_MAIN** (shared ACS) | `power_mgmt.c:49` |
| GPIO35 = ADC: aux current sense | ISENS3 | **GPIO35 = battery voltage** (ADC1_CH7) | `power_mgmt.c:51` |
| GPIO36/VP = ADC: drive current sense | ISENS1 | **GPIO36 = V_VOC** (OC threshold diag) | `power_mgmt.c:50` |
| GPIO39/VN = ADC: battery voltage | BATTERY | **GPIO39 = FAULT** (digital input, ACS37220) | `power_mgmt.c:52` |
The `sensors.h` enum comments (lines 1922) are also stale — they list V4 pins but the V5 pins are assigned at runtime in `sensors.c:26`.
---
## TCA9555 description (line 32) — Wrong
> Port 1 (output): 3× H-bridge relay pairs (DRIVE, JACK, AUX) + LEDs
LEDs are on **Port 0** (P05P07), not Port 1. See `i2c_set_led1()` at `i2c.c:98` writing to `TCA_REG_OUTPUT0`.
---
## ACS chip statement (line 47) — Unqualified
> All power goes through a ACS37220 sense chip (13.2 mV/A)
True for V5 (single shared ACS37220). On V4, JACK and AUX use **ACS37042 (44 mV/A)**`power_mgmt.c:457-458`.
---
## Software Architecture diagram (lines 5366) — Missing steps
The init sequence omits:
- Factory-reset detection loop (`main.c:174-227`)
- `rtc_restore_time()` after `storage_init()` (`main.c:232`)
- `adc_post()` after `log_init()` (`main.c:236`)
- `storage_post()` (`main.c:237`)
- OTA rollback counter check (`main.c:241-278`)
- `send_bat_log()` at boot (`main.c:282`)
---
## Main loop description (lines 6873) — Major omissions
Missing from the described main loop:
- **Soft-idle polling path** (`main.c:340-363`) — handles wake-on-button, wake-on-alarm, solar FSM, and shutdown timer during sleep. This is ~25% of the main loop body.
- Button hold-to-reboot logic (`main.c:388-397`)
- Triple-tap detection (`main.c:411-431`)
- Alarm-triggered `FSM_CMD_START` (`main.c:496-499`)
- Periodic `send_bat_log()` every 120s in IDLE (`main.c:450-452`)
- `esp_task_wdt_reset()` at end of each tick (`main.c:503`)
---
## FreeRTOS Tasks table (lines 7684) — Wrong priorities, missing task
| Task | README says | Actual priority | Source |
|---|---|---|---|
| UART task | "default" | **12** | `uart_comms.c:294` |
| RF 433 task | "default" | **5** | `rf_433.c:223` |
| BT HID task | "default" | **4** | `bt_hid.c:583` |
Missing task: **log_writer** (priority 5, created by `log_init()` at `storage.c:1069-1076`).
---
## Key Files — `hard_ui.c` doesn't exist
`hard_ui.c` listed at line 107 — no such file in `main/`. Either stale or was removed.
---
## FSM state diagram (lines 113129) — Missing state
`STATE_DRIVE_FLUFF_START` is omitted. Actual sequence:
```
START_DELAY → JACK_UP_START → JACK_UP → DRIVE_START_DELAY → DRIVE_FLUFF_START → DRIVE → DRIVE_END_DELAY → JACK_DOWN
```
Cal states listed as `CAL_JACK_DELAY` but actual enum names are `STATE_CALIBRATE_JACK_DELAY`, `STATE_CALIBRATE_JACK_MOVE`, `STATE_CALIBRATE_DRIVE_DELAY`, `STATE_CALIBRATE_DRIVE_MOVE`.
---
## FSM Loop — wrong log size (lines 137143)
> send_fsm_log() — 39-byte timestamped entry
`LOGSIZE = 25` at `control_fsm.c:179`. The actual 25-byte layout is:
```
[0:8] ts_ms (u64)
[8:12] bat_V (f32)
[12:16] current_A (f32) — combined, not per-bridge
[16:18] counter (i16)
[18:19] sensors (u8)
[19:23] heat (f32) — max across bridges
[23:25] i2c_out (u16)
```
---
---
## `/log` HTTP endpoint (line 184) — Wrong method
> `/log` — GET
Registered as `HTTP_ANY` (`webserver.c:870`). Handles both GET and POST (`webserver.c:150-153`).
---
## UART `POST:` example (line 189) — Wrong syntax
> POST: {json}
The UART handler (`uart_comms.c`) receives raw JSON strings, not HTTP-style method prefixes.
---
## Flash partitions (lines 212220) — Wrong offsets and sizes
| Partition | README | Actual (`partitions.csv`) |
|---|---|---|
| post_test | offset 0x310000, 4K | offset **0x3F0000**, 4K |
| params | offset 0x311000, **16K** | offset **0x3F1000**, **32K** |
| log | offset 0x315000, **~4.9MB** | offset **0x400000**, **4096K** |
Missing from table: NVS (0x9000, 16K), otadata (0xD000), phy_init (0xF000), **ota_0 (0x10000, 1984K)**, **ota_1 (0x200000, 1984K)**.
---
## Log entry format (lines 222234) — Describes old 39-byte format
The 39-byte layout with separate per-bridge currents and heats doesn't match `send_fsm_log()` which uses 25 bytes (combined current, single max heat, adds `i2c_out`).
---
## Parameter count — Off by one
> 48-param NVM table (`storage.c/h` description, line 97)
`storage.h:72-121` defines **49** parameters (check `NUM_PARAMS` from the enum).
---
## Key Parameters list (lines 236242) — Missing 30+ params
Missing: `ADC_ALPHA_BATTERY`, `ADC_ALPHA_ISENS`, `ADC_ALPHA_IAZ`, `ADC_DB_IAZ`, `JACK_I_UP`, `JACK_I_DOWN`, `V_SENS_K`, `V_SENS_OFFSET`, `EFUSE_INRUSH_US`, `EFUSE_TAUCOOL`, `FLUFF_PREDRIVE_MS`, `CHG_LOW_V`, `CHG_LOW_S`, `CHG_BULK_S`, `RF_PULSE_LENGTH`, `LOW_PROTECTION_S`, `BUILD_VERSION`, `BOOT_TIME`, `JACK_IS_DOWN`, `WIFI_CHANNEL`, `NET_SSID`, `NET_PASS`.
---
## Deep sleep claim (line 248) — Incorrect
> deep sleep is disabled (soft idle instead)
`hibernate_enter()` at `rtc.c:184` calls `esp_deep_sleep_start()`. Deep sleep is used for hibernate mode (triggered by explicit web/UART command). Soft idle is the inactivity-triggered default, but deep sleep is not disabled.
---
## Factory reset GPIO reference (lines 270, 280, 354) — Wrong pin
> Hold GPIO13 button / power cycle with GPIO13 held
GPIO13 is the **NCA9535 INT line**, not a button. The actual button state is read via I2C (`i2c_button_held_raw(0)` at `main.c:176`). The user holds the physical button on the I2C expander, not GPIO13.
---
## Battery voltage GPIO (line 326) — Wrong for V5
> Battery voltage: GPIO39
On V5, battery voltage is on **GPIO35** (ADC1_CH7). GPIO39 is the **FAULT digital input** (`power_mgmt.c:51-52`). This correctly describes V4 only.
---
## "fluffer motor always running" (line 3) — Overstated
> auxiliary "fluffer" motor always running during operation
The fluffer (AUX) only runs during `STATE_DRIVE_FLUFF_START` and `STATE_DRIVE`. It does not run during jack-up, jack-down, or delay states (`control_fsm.c:716-776`).