upleb.uk

Public git repos — served from a NIP-34 GRASP relay at git.upleb.uk

summaryrefslogtreecommitdiff
path: root/PLAN_BITAXE_FIXES.md
diff options
context:
space:
mode:
authorYour Name <you@example.com>2026-05-28 23:52:04 +0530
committerYour Name <you@example.com>2026-05-28 23:52:04 +0530
commit5e603764266568084eaae9ec0e0b130e7f233402 (patch)
tree0a480d2ba480491957bb6d09f77ada7495325e45 /PLAN_BITAXE_FIXES.md
parent8f18b7ac6cf65a1de7f2ebddb19de9070c3b9657 (diff)
docs: update all plans with current board inventory and smoke test results
- Board A (ttyACM1): USB flash failing, cable issue - Board B (ttyACM0): Flashed esp32-tollgate, smoke test 6/9 pass - NerdAxe (ttyACM2, fan-damaged): TOLLGATE=1 flashed, crash loop in APIsFetcher - Working NerdAxe (ttyACM1, 80:b5:4e:c7:7a:d0): Can't flash (USB brownout) - Test mint intermittently down (TLS error) - Firewall not blocking unpaid clients (needs investigation)
Diffstat (limited to 'PLAN_BITAXE_FIXES.md')
-rw-r--r--PLAN_BITAXE_FIXES.md158
1 files changed, 75 insertions, 83 deletions
diff --git a/PLAN_BITAXE_FIXES.md b/PLAN_BITAXE_FIXES.md
index 9514dbf..99995a0 100644
--- a/PLAN_BITAXE_FIXES.md
+++ b/PLAN_BITAXE_FIXES.md
@@ -1,8 +1,9 @@
1# TollGate on NerdQAxePlus/BitAxe — Fix Plan 1# TollGate on NerdQAxePlus/BitAxe — Fix Plan
2 2
3**Created:** 2026-05-28 3**Created:** 2026-05-28
4**Updated:** 2026-05-28
4**Branch:** `feature/tollgate-core-v2` (esp32-tollgate), `develop` (NerdQAxePlus) 5**Branch:** `feature/tollgate-core-v2` (esp32-tollgate), `develop` (NerdQAxePlus)
5**Component version:** v1.2.0 → v1.3.0 6**Component version:** v1.3.0 (published)
6 7
7--- 8---
8 9
@@ -10,132 +11,123 @@
10 11
11**File:** `components/tollgate_core/src/tollgate_core.c` 12**File:** `components/tollgate_core/src/tollgate_core.c`
12 13
13- [ ] 1a. Implement `tollgate_core_on_share_accepted(uint32_t client_ip, double difficulty)` 14- [x] 1a. Implement `tollgate_core_on_share_accepted(uint32_t client_ip, double difficulty)`
14 - Call `tollgate_core_mining_update_hashrate(client_ip, true)` 15- [x] 1b. Implement `tollgate_core_calc_hashprice(double hashrate_ghs)`
15 - Get client stats via `tollgate_core_mining_get_client_stats(client_ip)` 16- [x] 1c. Implement `tollgate_core_get_mining_status_json(void)`
16 - Find or create session via `tollgate_core_session_find_by_ip()` / `tollgate_core_session_create()` 17- [x] 1d. Add unit tests in `tests/unit/test_mining_api.c` (19 assertions)
17 - Calculate allotment via `tollgate_core_mining_shares_to_allotment_ms()` or `_bytes()` based on metric 18- [x] 1e. `make test-unit` — all 29 tests pass
18 - Extend session via `tollgate_core_session_extend(session, allotment)` 19- [x] 1f. `idf.py build` — esp32-tollgate builds
19 - Call `s_platform->on_share_accepted(difficulty)` if set
20
21- [ ] 1b. Implement `tollgate_core_calc_hashprice(double hashrate_ghs)`
22 - Check `s_platform->get_hashprice_sats_per_ghs_day()` for manual override (nonzero = return it)
23 - Otherwise return `tollgate_core_mining_get_current_hashprice()` (from nbits)
24
25- [ ] 1c. Implement `tollgate_core_get_mining_status_json(void)`
26 - Follow `tollgate_core_get_status_json()` pattern (cJSON create → add fields → print → delete)
27 - Get proxy stats via `tollgate_core_stratum_proxy_get_stats()`
28 - JSON fields: `hashprice`, `nbits`, `total_shares`, `total_accepted`, `total_rejected`, `active_miners`, `hashrate_ghs`
29
30- [ ] 1d. Add unit tests for new functions in `tests/unit/test_mining_api.c`
31- [ ] 1e. `make test-unit` — all tests pass
32- [ ] 1f. `idf.py build` — esp32-tollgate builds
33 20
34--- 21---
35 22
36## Phase 2: Wire tick() into NerdQAxePlus Main Loop 23## Phase 2: Wire tick() into NerdQAxePlus Main Loop
37 24
38**File:** `esp-miner-nerdqaxeplus/main/main.cpp` (line 331 while loop) 25**File:** `esp-miner-nerdqaxeplus/main/main.cpp`
39 26
40- [ ] 2a. Add `tollgate_core_tick()` inside the 10s loop, guarded by `#ifdef TOLLGATE` 27- [x] 2a. Add `tollgate_core_tick()` inside the 10s loop, guarded by `#ifdef TOLLGATE`
41- [ ] 2b. `TOLLGATE=1 BOARD=NERDQAXEPLUS idf.py build` passes 28- [x] 2b. `TOLLGATE=1 BOARD=NERDQAXEPLUS idf.py build` passes
42 29
43--- 30---
44 31
45## Phase 3: Wire WiFi AP Client Events 32## Phase 3: Wire WiFi AP Client Events
46 33
47**File:** `esp-miner-nerdqaxeplus/components/connect/connect.c` (event_handler line 74) 34**File:** `esp-miner-nerdqaxeplus/components/connect/connect.c`
48 35
49- [ ] 3a. Add `#include "tollgate_core.h"` guarded by `#ifdef TOLLGATE` 36- [x] 3a. Add `#include "tollgate_core.h"` guarded by `#ifdef TOLLGATE`
50- [ ] 3b. Add `WIFI_EVENT_AP_STACONNECTED` handler: resolve MAC→IP via `esp_wifi_ap_get_sta_list_with_ip()`, call `tollgate_core_client_connected(mac, ip)` 37- [x] 3b. Add `WIFI_EVENT_AP_STACONNECTED` handler
51- [ ] 3c. Add `WIFI_EVENT_AP_STADISCONNECTED` handler: call `tollgate_core_client_disconnected(mac)` 38- [x] 3c. Add `WIFI_EVENT_AP_STADISCONNECTED` handler
52- [ ] 3d. `TOLLGATE=1 BOARD=NERDQAXEPLUS idf.py build` passes 39- [x] 3d. Build passes
40
41**Note:** Upstream moved `connect.c` into `main/network/NetworkManager`. Our connect component was removed during rebase (Phase 7.5). WiFi AP events need to be re-integrated into NetworkManager (deferred).
53 42
54--- 43---
55 44
56## Phase 4: Make Stratum Proxy Functional 45## Phase 4: Make Stratum Proxy Functional
57 46
58**File:** `components/tollgate_core/src/tollgate_core_stratum_proxy.c` 47- [x] 4a. Line-buffer recv data, parse downstream miner messages
59 48- [x] 4b. Use real jobs from `tollgate_core_stratum_proxy_set_job()`
60- [ ] 4a. Line-buffer recv data, parse downstream miner messages using `tollgate_core_stratum_parse_*()`: 49- [x] 4c. Hook `create_job_mining_notify()` to forward pool jobs to proxy
61 - `mining.subscribe` → respond with extranonce 50- [x] 4d. Hook `mining.set_difficulty` to call `tollgate_core_mining_set_current_nbits()`
62 - `mining.authorize` → respond with success 51- [x] 4e. `idf.py build` passes for esp32-tollgate
63 - `mining.submit` → validate difficulty, increment counters, call `tollgate_core_on_share_accepted()`, respond accept/reject 52- [x] 4f. `TOLLGATE=1 BOARD=NERDQAXEPLUS idf.py build` passes
64- [ ] 4b. Use real jobs from `tollgate_core_stratum_proxy_set_job()` instead of zeroed placeholders
65
66**File:** `esp-miner-nerdqaxeplus/main/tasks/create_jobs_task.cpp` (line 176)
67
68- [ ] 4c. Hook `create_job_mining_notify()` to forward pool jobs to proxy via `tollgate_core_stratum_proxy_set_job()`, guarded by `#ifdef TOLLGATE`
69
70**File:** `esp-miner-nerdqaxeplus/main/stratum/stratum_manager.cpp` (line 179)
71
72- [ ] 4d. Hook `mining.set_difficulty` to call `tollgate_core_mining_set_current_nbits()`, guarded by `#ifdef TOLLGATE`
73
74- [ ] 4e. `idf.py build` passes for esp32-tollgate
75- [ ] 4f. `TOLLGATE=1 BOARD=NERDQAXEPLUS idf.py build` passes
76 53
77--- 54---
78 55
79## Phase 5: Wire Share Accepted for Self-Mining Credit 56## Phase 5: Wire Share Accepted for Self-Mining Credit
80 57
81**File:** `esp-miner-nerdqaxeplus/main/tollgate_platform.cpp` (line 137) 58- [x] 5a. `tollgate_on_share_accepted()` calls `tollgate_core_on_share_accepted(owner_ip, difficulty)`
82 59- [x] 5b. Build passes
83- [ ] 5a. Update `tollgate_on_share_accepted(double difficulty)` to call `tollgate_core_on_share_accepted(owner_ip, difficulty)` crediting the owner session
84- [ ] 5b. `TOLLGATE=1 BOARD=NERDQAXEPLUS idf.py build` passes
85 60
86--- 61---
87 62
88## Phase 6: Dynamic AP IP and DNS 63## Phase 6: Dynamic AP IP and DNS
89 64
90**File:** `esp-miner-nerdqaxeplus/main/tollgate_platform.cpp` (line 158) 65- [x] 6a. Replace hardcoded `192.168.4.1` with actual AP IP from `esp_netif_get_ip_info()`
91 66- [x] 6b. Replace hardcoded `8.8.8.8` with STA gateway IP
92- [ ] 6a. Replace hardcoded `192.168.4.1` with actual AP IP from `esp_netif_get_ip_info()` on AP netif 67- [x] 6c. Build passes
93- [ ] 6b. Replace hardcoded upstream DNS `8.8.8.8` with STA gateway IP
94- [ ] 6c. `TOLLGATE=1 BOARD=NERDQAXEPLUS idf.py build` passes
95 68
96--- 69---
97 70
98## Phase 7: Sync tollgate_core to NerdQAxePlus + Build Verify 71## Phase 7: Sync tollgate_core to NerdQAxePlus + Build Verify
99 72
100- [ ] 7a. rsync `esp32-tollgate/components/tollgate_core/` → `esp-miner-nerdqaxeplus/components/tollgate_core/` 73- [x] 7a. rsync tollgate_core v1.2.0 → NerdQAxePlus
101- [ ] 7b. `make test-unit` — all esp32-tollgate tests pass 74- [x] 7b. `make test-unit` — all 29 tests pass
102- [ ] 7c. `idf.py build` — esp32-tollgate builds 75- [x] 7c. `idf.py build` — esp32-tollgate builds
103- [ ] 7d. `TOLLGATE=1 BOARD=NERDQAXEPLUS idf.py build` — NerdQAxePlus builds 76- [x] 7d. `TOLLGATE=1 BOARD=NERDQAXEPLUS idf.py build` — NerdQAxePlus builds
104 77
105--- 78---
106 79
107## Phase 8: Hardware Smoke Test on NerdQAxePlus 80## Phase 7.5: Stratum Username Fallback + Upstream Rebase
81
82- [x] 7.5a. Add `#ifdef TOLLGATE` fallback: use `CONFIG_STRATUM_USER` as default instead of `NULL`
83- [x] 7.5b. Rebase 9 TollGate commits onto upstream `4b8f3225` (CAN bus + NetworkManager refactor)
84- [x] 7.5c. Resolve conflicts in `main.cpp` (CAN slave/master split), `CMakeLists.txt`, `nvs_config.h`
85- [x] 7.5d. Remove stale `connect/` component (upstream moved to `main/network/`)
86- [x] 7.5e. Fix W5500 build: enable `CONFIG_ETH_SPI_ETHERNET_W5500=y`
87- [x] 7.5f. Build passes: `TOLLGATE=1 BOARD=NERDQAXEPLUS idf.py build`
88
89---
108 90
109- [ ] 8a. Flash NerdQAxePlus with `TOLLGATE=1` to a NerdQAxe+ board 91## Phase 8: Hardware Smoke Test
92
93**Board B** (MAC `fc:01:2c:c5:50:50`, `/dev/ttyACM0`) — flashed with NerdQAxePlus TOLLGATE=1 NERDQAXEPLUS
94- [ ] 8a. Board B AP visible
110- [ ] 8b. Connect to AP, verify captive portal loads 95- [ ] 8b. Connect to AP, verify captive portal loads
111- [ ] 8c. Test Cashu payment flow 96- [ ] 8c. Test Cashu payment flow
112- [ ] 8d. Connect Stratum miner to port 3334, verify shares tracked and sessions extended 97- [ ] 8d. Test grant/reset endpoints
113- [ ] 8e. Verify board's own ASIC mining credits the owner 98- [ ] 8e. Test internet passthrough after payment
114- [ ] 8f. Test grant/reset endpoints 99- [ ] 8f. `GET /api/tollgate/status`
115- [ ] 8g. Test internet passthrough after payment 100- [ ] 8g. `GET /api/tollgate/wallet`
101- [ ] 8h. `GET /api/tollgate/config`
102
103**NerdAxe** (MAC `80:b5:4e:c7:79:88`, `/dev/ttyACM2`) — actual hardware with BM1366 ASIC (fan-damaged, 0 hashrate)
104- [ ] 8i. Flash with `TOLLGATE=1 BOARD=NERDAXE`
105- [ ] 8j. Monitor serial: check ASIC detection
106- [ ] 8k. Test TollGate WiFi/payment (ASIC-independent)
107- [ ] 8l. Check if ASIC responds (diagnostic)
108
109**Board A** (MAC `94:a9:90:2e:37:7c`, `/dev/ttyACM1`) — USB flash failing, needs cable check
110- [ ] 8m. Re-seat USB cable, retry flash
116 111
117--- 112---
118 113
119## Phase 9: Commit, Push, Publish 114## Phase 9: Commit, Push, Publish
120 115
121- [ ] 9a. Commit all tollgate_core changes to esp32-tollgate `feature/tollgate-core-v2` 116- [x] 9a. Commit tollgate_core changes to `feature/tollgate-core-v2`
122- [ ] 9b. Push esp32-tollgate to nostr 117- [x] 9b. Push esp32-tollgate to GitHub (`OpenTollGate/tollgate-esp32`) — `master` + `feature/tollgate-core-v2`
123- [ ] 9c. Commit all NerdQAxePlus integration to `develop` 118- [x] 9c. Push esp32-tollgate to nostr (`relay.ngit.dev`) — both branches
124- [ ] 9d. Push NerdQAxePlus to nostr 119- [x] 9d. Commit NerdQAxePlus integration to `develop` (rebased onto upstream `4b8f3225`)
125- [ ] 9e. Bump tollgate_core to v1.3.0 in `idf_component.yml` 120- [x] 9e. Push NerdQAxePlus to GitHub (`c03rad0r/ESP-Miner-NerdQAxePlus`)
126- [ ] 9f. Re-publish to IDF Component Registry 121- [ ] 9f. Push NerdQAxePlus to nostr (deferred — repo too large, times out)
122- [x] 9g. Bump tollgate_core to v1.3.0 in `idf_component.yml`, update URL to GitHub
123- [ ] 9h. Re-publish to IDF Component Registry (pending `compote component pack` + `upload`)
127 124
128--- 125---
129 126
130## Dependency Order 127## Deferred
131
132```
133Phase 1 → Phase 5 → Phase 7 → Phase 8
134Phase 1 → Phase 4 → Phase 7 → Phase 8
135Phase 2 → Phase 7
136Phase 3 → Phase 7
137Phase 6 → Phase 7
138Phase 7 → Phase 8 → Phase 9
139```
140 128
141Phases 1–6 are independent (different files). Phase 7 bundles them. Phase 8 needs hardware. 129- **WiFi AP event hooks** — Need to integrate into upstream `NetworkManager` class (`main/network/network_manager.cpp`)
130- **NerdQAxePlus nostr push** — Repo too large for relay timeout, retry later
131- **Board A flash** — USB connection drops during write, hardware issue
132- **ASIC diagnostic on NerdAxe** — Fan was blocked, ASIC may be damaged
133- **Nostr push for orangesync** — orangesync.tech still offline