From 76c4b010bf0961bef9d024d0655395bf289f3789 Mon Sep 17 00:00:00 2001 From: John Poole Date: Wed, 1 Apr 2026 15:41:24 -0700 Subject: [PATCH] No difference between AMY vs. BOB, going to revise and dig deeper into SD card states --- notes_Feb_18_2026.txt | 95 ++++ tools/constantTFCard/hw_debug/1st_run.log | 190 ++++++++ .../hw_debug/amy_vs_bob_identifications.txt | 44 ++ tools/constantTFCard/hw_debug/platformio.ini | 31 ++ tools/constantTFCard/hw_debug/src/main.cpp | 443 ++++++++++++++++++ tools/constantTFCard/platformio.ini | 31 ++ tools/constantTFCard/src/main.cpp | 257 ++++++++++ 7 files changed, 1091 insertions(+) create mode 100644 notes_Feb_18_2026.txt create mode 100644 tools/constantTFCard/hw_debug/1st_run.log create mode 100644 tools/constantTFCard/hw_debug/amy_vs_bob_identifications.txt create mode 100644 tools/constantTFCard/hw_debug/platformio.ini create mode 100644 tools/constantTFCard/hw_debug/src/main.cpp create mode 100644 tools/constantTFCard/platformio.ini create mode 100644 tools/constantTFCard/src/main.cpp diff --git a/notes_Feb_18_2026.txt b/notes_Feb_18_2026.txt new file mode 100644 index 0000000..dc1119c --- /dev/null +++ b/notes_Feb_18_2026.txt @@ -0,0 +1,95 @@ + + + + +A: + pio run -e node_a -t upload --upload-port /dev/ttyACM0 +then: + date; screen /dev/ttyACM0 115200 + +B: + pio run -e node_b -t upload --upload-port /dev/ttyACM1 +then: + date; screen /dev/ttyACM1 115200 + + + +tbeam: +Console 1: + cd /usr/local/src/sx1302_hal/packet_forwarder + sudo ./lora_pkt_fwd -c global_conf.reticulum_915000000_sf8_bw125.json + +Console 2: + cd /usr/local/src/sx1302_hal/util_net_downlink + ./net_downlink -P 1730 -l uplinks_$(date +%Y%m%d_%H%M%S).csv + + +Example capture: + INFO: Received pkt from mote: 65732042 (fcnt=29540) + + JSON up: {"rxpk":[{"jver":1,"tmst":413765588,"chan":8,"rfch":0,"freq":915.000000,"mid":16,"stat":1,"modu":"LORA","datr":"SF7BW125","codr":"4/5","rssis":-16,"lsnr":10.8,"foff":-45,"rssi":-15,"size":29,"data":"IEIgc2VuZHMgZ3JlZXRpbmdzLiBpdGVyPTE1MDQ="}]} + INFO: [up] PUSH_ACK received in 31 ms + + INFO: Received pkt from mote: 65732041 (fcnt=29540) + + JSON up: {"rxpk":[{"jver":1,"tmst":414742074,"chan":8,"rfch":0,"freq":915.000000,"mid":16,"stat":1,"modu":"LORA","datr":"SF7BW125","codr":"4/5","rssis":-16,"lsnr":10.2,"foff":-297,"rssi":-15,"size":29,"data":"IEEgc2VuZHMgZ3JlZXRpbmdzLiBpdGVyPTE0OTg="}]} + INFO: [up] PUSH_ACK received in 31 ms + + INFO: Received pkt from mote: 65732042 (fcnt=29540) + + JSON up: {"rxpk":[{"jver":1,"tmst":415766626,"chan":8,"rfch":0,"freq":915.000000,"mid":16,"stat":1,"modu":"LORA","datr":"SF7BW125","codr":"4/5","rssis":-16,"lsnr":11.0,"foff":-53,"rssi":-15,"size":29,"data":"IEIgc2VuZHMgZ3JlZXRpbmdzLiBpdGVyPTE1MDU="}]} + INFO: [up] PUSH_ACK received in 31 ms + + INFO: Received pkt from mote: 65732041 (fcnt=29540) + + JSON up: {"rxpk":[{"jver":1,"tmst":416744088,"chan":8,"rfch":0,"freq":915.000000,"mid":16,"stat":1,"modu":"LORA","datr":"SF7BW125","codr":"4/5","rssis":-16,"lsnr":10.2,"foff":-289,"rssi":-15,"size":29,"data":"IEEgc2VuZHMgZ3JlZXRpbmdzLiBpdGVyPTE0OTk="}]} + INFO: [up] PUSH_ACK received in 31 ms + INFO: [down] PULL_ACK received in 31 ms + +tbeam /usr/local/src/sx1302_hal/util_net_downlink # tail uplinks_20260218_155659.csv +445782393,,8,0,915.000000,16,1,LORA,7,125,4/5,-15.0,-16.0,10.8,29,20422073656e6473206772656574696e67732e20697465723d31353230 +446764659,,8,0,915.000000,16,1,LORA,7,125,4/5,-15.0,-16.0,10.5,29,20412073656e6473206772656574696e67732e20697465723d31353134 + + +==== With all 5 units ====== +Amy: +set the tab: + echo -ne "\033]30;Amy\007" + pio run -e amy -t upload --upload-port /dev/ttyACM0 + + date; screen /dev/ttyACM0 115200 + +Bob: + echo -ne "\033]30;Bob\007" + pio run -e bob -t upload --upload-port /dev/ttyACM1 + + date; screen /dev/ttyACM1 115200 + +Cy: + source ~/rnsenv/bin/activate + echo -ne "\033]30;Cy\007" + pio run -e cy -t upload --upload-port /dev/ttyACM2 + + date; screen /dev/ttyACM2 115200 + +Dan: + source ~/rnsenv/bin/activate + echo -ne "\033]30;Dan\007" + pio run -e cy -t upload --upload-port /dev/ttyACM3 + + date; screen /dev/ttyACM3 115200 + +Ed: + source ~/rnsenv/bin/activate + echo -ne "\033]30;Ed\007" + pio run -e cy -t upload --upload-port /dev/ttyACM4 + date; screen /dev/ttyACM4 115200 + + +Logging: + + cd /usr/local/src/sx1302_hal/util_net_downlink + ./net_downlink -P 1730 -l uplinks_$(date +%Y%m%d_%H%M%S).csv + + ls -lath /usr/local/src/sx1302_hal/util_net_downlink |head -n 3 + \ No newline at end of file diff --git a/tools/constantTFCard/hw_debug/1st_run.log b/tools/constantTFCard/hw_debug/1st_run.log new file mode 100644 index 0000000..6e01b1f --- /dev/null +++ b/tools/constantTFCard/hw_debug/1st_run.log @@ -0,0 +1,190 @@ +John's interaction with the events below: + + 14149 Pressed down + [ 17543] let up + [ 30325] Pressed down + 35143 let up + 39993 killed. + +Compiled and uploaded: Wed Apr 1 15:07:20 PDT 2026 + +[ 12793][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29 +[ 12799][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work +sample=3 state=BEGIN_FAIL rail=ON vbus=5.18 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=none@0 type=NONE size=0MB root=FAIL +[ 13265][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37 +[ 13271][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29 +[ 13277][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work +[ 13701][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37 +[ 13707][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29 +[ 13713][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work +[ 14137][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37 +[ 14143][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29 +[ 14149][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work +sample=4 state=MOUNT_OK rail=ON vbus=5.19 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=HSPI@10000000 type=SDHC size=14910MB root=OK +sample=5 state=MOUNT_OK rail=ON vbus=5.18 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=HSPI@400000 type=SDHC size=14910MB root=OK +sample=6 state=MOUNT_OK rail=ON vbus=5.18 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=HSPI@400000 type=SDHC size=14910MB root=OK +sample=7 state=MOUNT_OK rail=ON vbus=5.18 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=HSPI@400000 type=SDHC size=14910MB root=OK +sample=8 state=MOUNT_OK rail=ON vbus=5.18 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=HSPI@400000 type=SDHC size=14910MB root=OK +sample=9 state=MOUNT_OK rail=ON vbus=5.18 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=HSPI@400000 type=SDHC size=14910MB root=OK +sample=10 state=MOUNT_OK rail=ON vbus=5.18 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=HSPI@400000 type=SDHC size=14910MB root=OK +sample=11 state=MOUNT_OK rail=ON vbus=5.18 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=HSPI@400000 type=SDHC size=14910MB root=OK +sample=12 state=MOUNT_OK rail=ON vbus=5.18 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=HSPI@400000 type=SDHC size=14910MB root=OK +sample=13 state=MOUNT_OK rail=ON vbus=5.18 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=HSPI@400000 type=SDHC size=14910MB root=OK +sample=14 state=MOUNT_OK rail=ON vbus=5.18 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=HSPI@400000 type=SDHC size=14910MB root=OK +sample=15 state=MOUNT_OK rail=ON vbus=5.18 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=HSPI@400000 type=SDHC size=14910MB root=OK +sample=16 state=MOUNT_OK rail=ON vbus=5.18 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=HSPI@400000 type=SDHC size=14910MB root=OK +[ 17543][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0xsample=17 state=MOUNT_OK rail=ON vbus=5.18 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=HSPI@400000 type=SDHC size=14910MB root=OK +37 +[ 17549][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29 +[ 17555][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work +[ 17979][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37 +[ 17985][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29 +[ 17991][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work +[ 18415][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37 +[ 18421][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29 +[ 18427][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work +[ 18851][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37 +[ 18857][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29 +[ 18863][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work +[ 19287][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37 +[ 19293][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29 +[ 19299][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work +[ 19723][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37 +[ 19729][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29 +[ 19735][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work +[ 20159][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37 +[ 20165][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29 +[ 20171][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work +[ 20595][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37 +[ 20601][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29 +[ 20607][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work +sample=18 state=BEGIN_FAIL rail=ON vbus=5.18 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=none@0 type=NONE size=0MB root=FAIL +[ 21073][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37 +[ 21079][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29 +[ 21085][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work +[ 21509][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37 +[ 21515][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29 +[ 21521][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work +[ 21945][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37 +[ 21951][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29 +[ 21957][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work +[ 22381][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37 +[ 22387][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29 +[ 22393][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work +[ 22817][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37 +[ 22823][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29 +[ 22829][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work +[ 23253][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37 +[ 23259][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29 +[ 23265][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work +[ 23689][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37 +[ 23695][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29 +[ 23701][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work +[ 24125][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37 +[ 24131][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29 +[ 24137][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work +[ 24603][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0xsample=19 state=BEGIN_FAIL rail=ON vbus=5.19 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=none@0 type=NONE size=0MB root=FAIL +37 +[ 24609][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29 +[ 24615][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work +[ 25039][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37 +[ 25045][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29 +[ 25051][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work +[ 25475][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37 +[ 25481][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29 +[ 25487][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work +[ 25911][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37 +[ 25917][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29 +[ 25923][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work +[ 26347][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37 +[ 26353][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29 +[ 26359][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work +[ 26783][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37 +[ 26789][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29 +[ 26795][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work +[ 27219][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37 +[ 27225][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29 +[ 27231][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work +[ 27655][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37 +[ 27661][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29 +[ 27667][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work +sample=20 state=BEGIN_FAIL rail=ON vbus=5.19 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=none@0 type=NONE size=0MB root=FAIL +[ 28133][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37 +[ 28139][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29 +[ 28145][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work +[ 28569][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37 +[ 28575][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29 +[ 28581][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work +[ 29005][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37 +[ 29011][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29 +[ 29017][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work +[ 29441][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37 +[ 29447][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29 +[ 29453][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work +[ 29877][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37 +[ 29883][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29 +[ 29889][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work +[ 30313][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37 +[ 30319][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29 +[ 30325][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work +sample=21 state=MOUNT_OK rail=ON vbus=5.19 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=FSPI@4000000 type=SDHC size=14910MB root=OK +sample=22 state=MOUNT_OK rail=ON vbus=5.18 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=HSPI@400000 type=SDHC size=14910MB root=OK +sample=23 state=MOUNT_OK rail=ON vbus=5.18 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=HSPI@400000 type=SDHC size=14910MB root=OK +sample=24 state=MOUNT_OK rail=ON vbus=5.18 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=HSPI@400000 type=SDHC size=14910MB root=OK +sample=25 state=MOUNT_OK rail=ON vbus=5.18 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=HSPI@400000 type=SDHC size=14910MB root=OK +sample=26 state=MOUNT_OK rail=ON vbus=5.18 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=HSPI@400000 type=SDHC size=14910MB root=OK +sample=27 state=MOUNT_OK rail=ON vbus=5.18 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=HSPI@400000 type=SDHC size=14910MB root=OK +sample=28 state=MOUNT_OK rail=ON vbus=5.18 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=HSPI@400000 type=SDHC size=14910MB root=OK +sample=29 state=MOUNT_OK rail=ON vbus=5.18 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=HSPI@400000 type=SDHC size=14910MB root=OK +sample=30 state=MOUNT_OK rail=ON vbus=5.18 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=HSPI@400000 type=SDHC size=14910MB root=OK +sample=31 state=MOUNT_OK rail=ON vbus=5.18 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=HSPI@400000 type=SDHC size=14910MB root=OK +sample=32 state=MOUNT_OK rail=ON vbus=5.18 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=HSPI@400000 type=SDHC size=14910MB root=OK +sample=33 state=MOUNT_OK rail=ON vbus=5.18 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=HSPI@400000 type=SDHC size=14910MB root=OK +sample=34 state=MOUNT_OK rail=ON vbus=5.18 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=HSPI@400000 type=SDHC size=14910MB root=OK +sample=35 state=MOUNT_OK rail=ON vbus=5.18 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=HSPI@400000 type=SDHC size=14910MB root=OK +sample=36 state=MOUNT_OK rail=ON vbus=5.18 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=HSPI@400000 type=SDHC size=14910MB root=OK +sample=37 state=MOUNT_OK rail=ON vbus=5.18 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=HSPI@400000 type=SDHC size=14910MB root=OK +sample=38 state=MOUNT_OK rail=ON vbus=5.18 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=HSPI@400000 type=SDHC size=14910MB root=OK +sample=39 state=MOUNT_OK rail=ON vbus=5.18 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=HSPI@400000 type=SDHC size=14910MB root=OK +sample=40 state=MOUNT_OK rail=ON vbus=5.18 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=HSPI@400000 type=SDHC size=14910MB root=OK +[ 35143][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0xsample=41 state=MOUNT_OK rail=ON vbus=5.18 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=HSPI@400000 type=SDHC size=14910MB root=OK +37 +[ 35149][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29 +[ 35155][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work +[ 35579][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37 +[ 35585][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29 +[ 35591][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work +[ 36015][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37 +[ 36021][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29 +[ 36027][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work +[ 36451][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37 +[ 36457][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29 +[ 36463][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work +[ 36887][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37 +[ 36893][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29 +[ 36899][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work +[ 37323][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37 +[ 37329][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29 +[ 37335][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work +[ 37759][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37 +[ 37765][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29 +[ 37771][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work +[ 38195][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37 +[ 38201][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29 +[ 38207][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work +sample=42 state=BEGIN_FAIL rail=ON vbus=5.18 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=none@0 type=NONE size=0MB root=FAIL +[ 38673][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37 +[ 38679][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29 +[ 38685][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work +[ 39109][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37 +[ 39115][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29 +[ 39121][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work +[ 39545][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37 +[ 39551][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29 +[ 39557][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work +[ 39981][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37 +[ 39987][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29 +[ 39993][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work +(rnsenv) jlpoole@jp /usr/local/src/microreticulum/microReticulumTbeam $ date +Wed Apr 1 15:08:35 PDT 2026 +(rnsenv) jlpoole@jp /usr/local/src/microreticulum/microReticulumTbeam $ \ No newline at end of file diff --git a/tools/constantTFCard/hw_debug/amy_vs_bob_identifications.txt b/tools/constantTFCard/hw_debug/amy_vs_bob_identifications.txt new file mode 100644 index 0000000..8fd2999 --- /dev/null +++ b/tools/constantTFCard/hw_debug/amy_vs_bob_identifications.txt @@ -0,0 +1,44 @@ +April 1, 2026 ~ 15:34 + +From AMY (broken SD Card): + + [ 15549][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (13) There is no valid FAT volume + + STARTUP REPLAY + uptime_ms=15438 + BOARD IDENTITY + chip_model=ESP32-S3 + chip_revision=0 + chip_cores=2 + sdk_version=v4.4.7-dirty + cpu_mhz=240 + flash_size=8388608 + flash_speed=80000000 + flash_mode=QIO + efuse_mac=68BF5B43CA48 + chip_id=5BBF68 + reset_reason=UNKNOWN + arduino_board=Espressif ESP32-S3-DevKitC-1-N8 (8 MB QD, No PSRAM) + sample=34 state=BEGIN_FAIL rail=ON vbus=5.18 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=none@0 type=NONE size=0MB root=FAIL + [ 15618][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (13) There is no valid FAT volume + +from BOB: + + sample=30 state=MOUNT_OK rail=ON vbus=5.03 batt=3.86 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=HSPI@400000 type=SDHC size=14910MB root=OK + + STARTUP REPLAY + uptime_ms=13167 + BOARD IDENTITY + chip_model=ESP32-S3 + chip_revision=0 + chip_cores=2 + sdk_version=v4.4.7-dirty + cpu_mhz=240 + flash_size=8388608 + flash_speed=80000000 + flash_mode=QIO + efuse_mac=DC935A43CA48 + chip_id=5A93DC + reset_reason=UNKNOWN + arduino_board=Espressif ESP32-S3-DevKitC-1-N8 (8 MB QD, No PSRAM) + sample=31 state=MOUNT_OK rail=ON vbus=5.03 batt=3.86 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=HSPI@400000 type=SDHC size=14910MB root=OK diff --git a/tools/constantTFCard/hw_debug/platformio.ini b/tools/constantTFCard/hw_debug/platformio.ini new file mode 100644 index 0000000..de55c86 --- /dev/null +++ b/tools/constantTFCard/hw_debug/platformio.ini @@ -0,0 +1,31 @@ +; 20260401 Codex +; constantTFCard hardware debug monitor + +[platformio] +default_envs = amy + +[env] +platform = espressif32 +framework = arduino +board = esp32-s3-devkitc-1 +monitor_speed = 115200 +lib_deps = + lewisxhe/XPowersLib@0.3.3 + Wire + olikraus/U8g2@^2.36.4 + +build_flags = + -I ../../../shared/boards + -I ../../../external/microReticulum_Firmware + -D BOARD_MODEL=BOARD_TBEAM_S_V1 + -D OLED_SDA=17 + -D OLED_SCL=18 + -D OLED_ADDR=0x3C + -D ARDUINO_USB_MODE=1 + -D ARDUINO_USB_CDC_ON_BOOT=1 + +[env:amy] +extends = env +build_flags = + ${env.build_flags} + -D NODE_LABEL=\"AMY\" diff --git a/tools/constantTFCard/hw_debug/src/main.cpp b/tools/constantTFCard/hw_debug/src/main.cpp new file mode 100644 index 0000000..23a7e0e --- /dev/null +++ b/tools/constantTFCard/hw_debug/src/main.cpp @@ -0,0 +1,443 @@ +// 20260401 Codex + +#include +#include +#include +#include +#include +#include +#include + +#include "tbeam_supreme_adapter.h" + +#ifndef NODE_LABEL +#define NODE_LABEL "NODE" +#endif + +#ifndef OLED_SDA +#define OLED_SDA 17 +#endif + +#ifndef OLED_SCL +#define OLED_SCL 18 +#endif + +static const uint32_t kSerialDelayMs = 1500; +static const uint32_t kPollIntervalMs = 200; +static const uint32_t kStartupQuietMs = 5000; +static const uint32_t kStartupReplayWindowMs = 20000; +static const uint32_t kStartupReplayPeriodMs = 2000; + +static const uint32_t kFreqs[] = { + 400000, + 1000000, + 4000000, + 10000000 +}; + +struct PinSnapshot { + int cs = -1; + int sck = -1; + int miso = -1; + int mosi = -1; +}; + +struct ProbeSummary { + uint8_t ffCount = 0; + uint8_t zeroCount = 0; + uint8_t otherCount = 0; + uint8_t firstBytes[8] = {0}; +}; + +enum class DebugState : uint8_t { + PMU_FAIL = 0, + RAIL_OFF, + BUS_FLOAT, + BUS_LOW, + BUS_CHATTER, + SD_BEGIN_FAIL, + CARD_NONE, + FS_FAIL, + MOUNT_OK +}; + +struct DebugSnapshot { + DebugState state = DebugState::PMU_FAIL; + bool pmuOk = false; + bool railOn = false; + float vbusV = -1.0f; + float battV = -1.0f; + PinSnapshot pins{}; + ProbeSummary probeH{}; + ProbeSummary probeF{}; + const char* mountBus = "none"; + uint32_t mountHz = 0; + uint8_t cardType = CARD_NONE; + uint64_t cardSizeMB = 0; + bool rootOk = false; +}; + +static XPowersLibInterface* g_pmu = nullptr; +static U8G2_SH1106_128X64_NONAME_F_HW_I2C g_oled(U8G2_R0, U8X8_PIN_NONE); +static SPIClass g_spiH(HSPI); +static SPIClass g_spiF(FSPI); +static uint32_t g_sampleCount = 0; +static uint32_t g_bootMs = 0; +static uint32_t g_lastStartupReplayMs = 0; + +static const char* resetReasonToString(esp_reset_reason_t reason) { + switch (reason) { + case ESP_RST_UNKNOWN: return "UNKNOWN"; + case ESP_RST_POWERON: return "POWERON"; + case ESP_RST_EXT: return "EXT"; + case ESP_RST_SW: return "SW"; + case ESP_RST_PANIC: return "PANIC"; + case ESP_RST_INT_WDT: return "INT_WDT"; + case ESP_RST_TASK_WDT: return "TASK_WDT"; + case ESP_RST_WDT: return "WDT"; + case ESP_RST_DEEPSLEEP: return "DEEPSLEEP"; + case ESP_RST_BROWNOUT: return "BROWNOUT"; + case ESP_RST_SDIO: return "SDIO"; + default: return "OTHER"; + } +} + +static const char* flashModeToString(FlashMode_t mode) { + switch (mode) { + case FM_QIO: return "QIO"; + case FM_QOUT: return "QOUT"; + case FM_DIO: return "DIO"; + case FM_DOUT: return "DOUT"; + case FM_FAST_READ: return "FAST"; + case FM_SLOW_READ: return "SLOW"; + default: return "UNKNOWN"; + } +} + +static void printBoardIdentity() { + uint64_t mac = ESP.getEfuseMac(); + uint32_t chipId = 0; + for (int i = 0; i < 17; i += 8) { + chipId |= ((mac >> (40 - i)) & 0xFF) << i; + } + + Serial.println("BOARD IDENTITY"); + Serial.printf("chip_model=%s\r\n", ESP.getChipModel()); + Serial.printf("chip_revision=%u\r\n", (unsigned)ESP.getChipRevision()); + Serial.printf("chip_cores=%u\r\n", (unsigned)ESP.getChipCores()); + Serial.printf("sdk_version=%s\r\n", ESP.getSdkVersion()); + Serial.printf("cpu_mhz=%u\r\n", (unsigned)ESP.getCpuFreqMHz()); + Serial.printf("flash_size=%u\r\n", (unsigned)ESP.getFlashChipSize()); + Serial.printf("flash_speed=%u\r\n", (unsigned)ESP.getFlashChipSpeed()); + Serial.printf("flash_mode=%s\r\n", flashModeToString(ESP.getFlashChipMode())); + Serial.printf("efuse_mac=%012llX\r\n", mac); + Serial.printf("chip_id=%06lX\r\n", (unsigned long)chipId); + Serial.printf("reset_reason=%s\r\n", resetReasonToString(esp_reset_reason())); + Serial.printf("arduino_board=%s\r\n", ARDUINO_BOARD); +} + +static void printStartupBanner() { + Serial.println(); + Serial.println("STARTUP REPLAY"); + Serial.printf("uptime_ms=%lu\r\n", (unsigned long)(millis() - g_bootMs)); + printBoardIdentity(); +} + +static void forceSpiDeselected() { + pinMode(tbeam_supreme::sdCs(), OUTPUT); + digitalWrite(tbeam_supreme::sdCs(), HIGH); + pinMode(tbeam_supreme::imuCs(), OUTPUT); + digitalWrite(tbeam_supreme::imuCs(), HIGH); +} + +static PinSnapshot readPins() { + PinSnapshot s; + s.cs = gpio_get_level((gpio_num_t)tbeam_supreme::sdCs()); + s.sck = gpio_get_level((gpio_num_t)tbeam_supreme::sdSck()); + s.miso = gpio_get_level((gpio_num_t)tbeam_supreme::sdMiso()); + s.mosi = gpio_get_level((gpio_num_t)tbeam_supreme::sdMosi()); + return s; +} + +static void readPmu(DebugSnapshot& snap) { + snap.pmuOk = (g_pmu != nullptr); + if (!g_pmu) { + return; + } + + snap.railOn = g_pmu->isPowerChannelEnable(XPOWERS_BLDO1); + snap.vbusV = g_pmu->getVbusVoltage() / 1000.0f; + snap.battV = g_pmu->getBattVoltage() / 1000.0f; +} + +static ProbeSummary runIdleProbe(SPIClass& bus) { + ProbeSummary out; + + SD.end(); + bus.end(); + delay(2); + forceSpiDeselected(); + + bus.begin( + tbeam_supreme::sdSck(), + tbeam_supreme::sdMiso(), + tbeam_supreme::sdMosi(), + tbeam_supreme::sdCs() + ); + + digitalWrite(tbeam_supreme::sdCs(), HIGH); + delay(1); + for (int i = 0; i < 8; ++i) { + uint8_t b = bus.transfer(0xFF); + out.firstBytes[i] = b; + if (b == 0xFF) out.ffCount++; + else if (b == 0x00) out.zeroCount++; + else out.otherCount++; + } + + return out; +} + +static const char* cardTypeToString(uint8_t type) { + switch (type) { + case CARD_MMC: return "MMC"; + case CARD_SD: return "SDSC"; + case CARD_SDHC: return "SDHC"; + default: return "NONE"; + } +} + +static bool tryMount(SPIClass& bus, + const char* busName, + uint32_t hz, + DebugSnapshot& snap) { + SD.end(); + bus.end(); + delay(2); + forceSpiDeselected(); + + bus.begin( + tbeam_supreme::sdSck(), + tbeam_supreme::sdMiso(), + tbeam_supreme::sdMosi(), + tbeam_supreme::sdCs() + ); + + digitalWrite(tbeam_supreme::sdCs(), HIGH); + delay(1); + for (int i = 0; i < 10; ++i) { + bus.transfer(0xFF); + } + + if (!SD.begin(tbeam_supreme::sdCs(), bus, hz)) { + snap.state = DebugState::SD_BEGIN_FAIL; + return false; + } + + snap.cardType = SD.cardType(); + snap.mountBus = busName; + snap.mountHz = hz; + if (snap.cardType == CARD_NONE) { + SD.end(); + snap.state = DebugState::CARD_NONE; + return false; + } + + snap.cardSizeMB = SD.cardSize() / (1024ULL * 1024ULL); + + File root = SD.open("/", FILE_READ); + snap.rootOk = (bool)root; + if (root) { + root.close(); + } + SD.end(); + + snap.state = snap.rootOk ? DebugState::MOUNT_OK : DebugState::FS_FAIL; + return snap.rootOk; +} + +static DebugState classifyProbe(const ProbeSummary& probe) { + if (probe.ffCount == 8) return DebugState::BUS_FLOAT; + if (probe.zeroCount == 8) return DebugState::BUS_LOW; + return DebugState::BUS_CHATTER; +} + +static DebugSnapshot captureSnapshot() { + DebugSnapshot snap; + readPmu(snap); + snap.pins = readPins(); + + if (!snap.pmuOk) { + snap.state = DebugState::PMU_FAIL; + return snap; + } + + if (!snap.railOn) { + snap.state = DebugState::RAIL_OFF; + return snap; + } + + snap.probeH = runIdleProbe(g_spiH); + snap.probeF = runIdleProbe(g_spiF); + snap.state = classifyProbe(snap.probeH); + + for (size_t i = 0; i < (sizeof(kFreqs) / sizeof(kFreqs[0])); ++i) { + if (tryMount(g_spiH, "HSPI", kFreqs[i], snap)) { + return snap; + } + } + + for (size_t i = 0; i < (sizeof(kFreqs) / sizeof(kFreqs[0])); ++i) { + if (tryMount(g_spiF, "FSPI", kFreqs[i], snap)) { + return snap; + } + } + + return snap; +} + +static const char* stateToString(DebugState state) { + switch (state) { + case DebugState::PMU_FAIL: return "PMU_FAIL"; + case DebugState::RAIL_OFF: return "RAIL_OFF"; + case DebugState::BUS_FLOAT: return "NO_RESP"; + case DebugState::BUS_LOW: return "BUS_LOW"; + case DebugState::BUS_CHATTER: return "BUS_CHAT"; + case DebugState::SD_BEGIN_FAIL: return "BEGIN_FAIL"; + case DebugState::CARD_NONE: return "CARD_NONE"; + case DebugState::FS_FAIL: return "FS_FAIL"; + case DebugState::MOUNT_OK: return "MOUNT_OK"; + default: return "UNKNOWN"; + } +} + +static void printSnapshot(const DebugSnapshot& snap) { + Serial.printf( + "sample=%lu state=%s rail=%s vbus=%.2f batt=%.2f pins=%d/%d/%d/%d " + "probeH(ff=%u z=%u o=%u %02X %02X %02X %02X) " + "probeF(ff=%u z=%u o=%u %02X %02X %02X %02X) " + "mount=%s@%lu type=%s size=%lluMB root=%s\r\n", + (unsigned long)g_sampleCount, + stateToString(snap.state), + snap.railOn ? "ON" : "OFF", + snap.vbusV, + snap.battV, + snap.pins.cs, + snap.pins.sck, + snap.pins.miso, + snap.pins.mosi, + (unsigned)snap.probeH.ffCount, + (unsigned)snap.probeH.zeroCount, + (unsigned)snap.probeH.otherCount, + snap.probeH.firstBytes[0], + snap.probeH.firstBytes[1], + snap.probeH.firstBytes[2], + snap.probeH.firstBytes[3], + (unsigned)snap.probeF.ffCount, + (unsigned)snap.probeF.zeroCount, + (unsigned)snap.probeF.otherCount, + snap.probeF.firstBytes[0], + snap.probeF.firstBytes[1], + snap.probeF.firstBytes[2], + snap.probeF.firstBytes[3], + snap.mountBus, + (unsigned long)snap.mountHz, + cardTypeToString(snap.cardType), + snap.cardSizeMB, + snap.rootOk ? "OK" : "FAIL" + ); +} + +static void showSnapshot(const DebugSnapshot& snap) { + char line1[24]; + char line2[24]; + char line3[24]; + char line4[24]; + char line5[24]; + + snprintf(line1, sizeof(line1), "%s TF HWDBG", NODE_LABEL); + snprintf(line2, sizeof(line2), "STATE %s", stateToString(snap.state)); + snprintf(line3, sizeof(line3), "H %u/%u/%u F %u/%u/%u", + (unsigned)snap.probeH.ffCount, + (unsigned)snap.probeH.zeroCount, + (unsigned)snap.probeH.otherCount, + (unsigned)snap.probeF.ffCount, + (unsigned)snap.probeF.zeroCount, + (unsigned)snap.probeF.otherCount); + snprintf(line4, sizeof(line4), "%s %luk %s", + snap.mountBus, + (unsigned long)(snap.mountHz / 1000UL), + cardTypeToString(snap.cardType)); + snprintf(line5, sizeof(line5), "P %d%d%d%d R%s %lu", + snap.pins.cs, + snap.pins.sck, + snap.pins.miso, + snap.pins.mosi, + snap.railOn ? "1" : "0", + (unsigned long)g_sampleCount); + + g_oled.clearBuffer(); + g_oled.setFont(u8g2_font_5x8_tf); + g_oled.drawUTF8(0, 12, line1); + g_oled.drawUTF8(0, 24, line2); + g_oled.drawUTF8(0, 36, line3); + g_oled.drawUTF8(0, 48, line4); + g_oled.drawUTF8(0, 60, line5); + g_oled.sendBuffer(); +} + +void setup() { + Serial.begin(115200); + g_bootMs = millis(); + delay(kSerialDelayMs); + + Wire.begin(OLED_SDA, OLED_SCL); + g_oled.begin(); + g_oled.clearDisplay(); + + tbeam_supreme::initPmuForPeripherals(g_pmu, &Serial); + forceSpiDeselected(); + + Serial.println(); + Serial.println("constantTFCard hardware debug"); + Serial.printf("Node: %s\r\n", NODE_LABEL); + Serial.printf("Poll interval: %lu ms\r\n", (unsigned long)kPollIntervalMs); + Serial.println("States: PMU_FAIL RAIL_OFF NO_RESP BUS_LOW BUS_CHAT BEGIN_FAIL CARD_NONE FS_FAIL MOUNT_OK"); + Serial.printf("Startup quiet delay: %lu ms\r\n", (unsigned long)kStartupQuietMs); + Serial.printf("Startup replay window: %lu ms\r\n", (unsigned long)kStartupReplayWindowMs); + + g_oled.clearBuffer(); + g_oled.setFont(u8g2_font_5x8_tf); + g_oled.drawUTF8(0, 12, "TF HWDBG"); + g_oled.drawUTF8(0, 24, "startup hold"); + g_oled.drawUTF8(0, 36, "attach monitor"); + g_oled.drawUTF8(0, 48, "waiting..."); + g_oled.sendBuffer(); + + delay(kStartupQuietMs); + printStartupBanner(); +} + +void loop() { + static uint32_t lastPollMs = 0; + + uint32_t now = millis(); + if (now - lastPollMs < kPollIntervalMs) { + delay(5); + return; + } + + lastPollMs = now; + g_sampleCount++; + + DebugSnapshot snap = captureSnapshot(); + + if (now - g_bootMs <= kStartupReplayWindowMs && + now - g_lastStartupReplayMs >= kStartupReplayPeriodMs) { + g_lastStartupReplayMs = now; + printStartupBanner(); + } + + printSnapshot(snap); + showSnapshot(snap); +} diff --git a/tools/constantTFCard/platformio.ini b/tools/constantTFCard/platformio.ini new file mode 100644 index 0000000..705281e --- /dev/null +++ b/tools/constantTFCard/platformio.ini @@ -0,0 +1,31 @@ +; 20260401 Codex +; constantTFCard + +[platformio] +default_envs = amy + +[env] +platform = espressif32 +framework = arduino +board = esp32-s3-devkitc-1 +monitor_speed = 115200 +lib_deps = + lewisxhe/XPowersLib@0.3.3 + Wire + olikraus/U8g2@^2.36.4 + +build_flags = + -I ../../shared/boards + -I ../../external/microReticulum_Firmware + -D BOARD_MODEL=BOARD_TBEAM_S_V1 + -D OLED_SDA=17 + -D OLED_SCL=18 + -D OLED_ADDR=0x3C + -D ARDUINO_USB_MODE=1 + -D ARDUINO_USB_CDC_ON_BOOT=1 + +[env:amy] +extends = env +build_flags = + ${env.build_flags} + -D NODE_LABEL=\"AMY\" diff --git a/tools/constantTFCard/src/main.cpp b/tools/constantTFCard/src/main.cpp new file mode 100644 index 0000000..3b172d9 --- /dev/null +++ b/tools/constantTFCard/src/main.cpp @@ -0,0 +1,257 @@ +// 20260401 Codex + +#include +#include +#include +#include +#include +#include + +#include "tbeam_supreme_adapter.h" + +#ifndef NODE_LABEL +#define NODE_LABEL "NODE" +#endif + +#ifndef OLED_SDA +#define OLED_SDA 17 +#endif + +#ifndef OLED_SCL +#define OLED_SCL 18 +#endif + +static const uint32_t kSerialDelayMs = 1500; +static const uint32_t kPollIntervalMs = 200; +static const uint32_t kSdFreqHz = 400000; +static const uint32_t kBootSettleMs = 2000; +static const uint32_t kSdRailOffMs = 300; +static const uint32_t kSdRailOnSettleMs = 1200; +static const uint8_t kOutVotesBeforeRailCycle = 10; +static const uint32_t kMinRailCycleGapMs = 5000; + +static const uint32_t kDelayedRetryOffsetsMs[] = { + 1000, + 3000, + 7000, + 15000 +}; + +static XPowersLibInterface* g_pmu = nullptr; +static U8G2_SH1106_128X64_NONAME_F_HW_I2C g_oled(U8G2_R0, U8X8_PIN_NONE); +static SPIClass g_sdSpi(HSPI); +static uint32_t g_bootMs = 0; +static size_t g_nextDelayedRetry = 0; +static uint32_t g_lastRailCycleMs = 0; +static uint8_t g_consecutiveOut = 0; + +static void forceSpiDeselected() { + pinMode(tbeam_supreme::sdCs(), OUTPUT); + digitalWrite(tbeam_supreme::sdCs(), HIGH); + pinMode(tbeam_supreme::imuCs(), OUTPUT); + digitalWrite(tbeam_supreme::imuCs(), HIGH); +} + +static void oledShowStatus(const char* status, uint32_t sampleCount) { + char line1[24]; + char line2[24]; + char line3[24]; + + snprintf(line1, sizeof(line1), "%s TF CARD", NODE_LABEL); + snprintf(line2, sizeof(line2), "%s", status); + snprintf(line3, sizeof(line3), "sample %lu", (unsigned long)sampleCount); + + g_oled.clearBuffer(); + g_oled.setFont(u8g2_font_6x12_tf); + g_oled.drawUTF8(0, 14, line1); + g_oled.setFont(u8g2_font_logisoso20_tf); + g_oled.drawUTF8(0, 42, status); + g_oled.setFont(u8g2_font_6x12_tf); + g_oled.drawUTF8(0, 62, line3); + g_oled.sendBuffer(); +} + +static void oledShowBootPhase(const char* line2, const char* line3) { + char line1[24]; + + snprintf(line1, sizeof(line1), "%s TF CARD", NODE_LABEL); + + g_oled.clearBuffer(); + g_oled.setFont(u8g2_font_6x12_tf); + g_oled.drawUTF8(0, 14, line1); + if (line2) g_oled.drawUTF8(0, 32, line2); + if (line3) g_oled.drawUTF8(0, 50, line3); + g_oled.sendBuffer(); +} + +static bool cardReadable() { + SD.end(); + g_sdSpi.end(); + delay(2); + + forceSpiDeselected(); + g_sdSpi.begin( + tbeam_supreme::sdSck(), + tbeam_supreme::sdMiso(), + tbeam_supreme::sdMosi(), + tbeam_supreme::sdCs() + ); + + digitalWrite(tbeam_supreme::sdCs(), HIGH); + delay(1); + for (int i = 0; i < 10; ++i) { + g_sdSpi.transfer(0xFF); + } + + if (!SD.begin(tbeam_supreme::sdCs(), g_sdSpi, kSdFreqHz)) { + return false; + } + + if (SD.cardType() == CARD_NONE) { + SD.end(); + return false; + } + + File root = SD.open("/", FILE_READ); + bool ok = (bool)root; + if (root) { + root.close(); + } + + SD.end(); + return ok; +} + +static bool cycleSdRail() { + if (!g_pmu) { + Serial.println("rail cycle skipped: no PMU"); + return false; + } + + SD.end(); + g_sdSpi.end(); + forceSpiDeselected(); + + g_pmu->disablePowerOutput(XPOWERS_BLDO1); + delay(kSdRailOffMs); + g_pmu->setPowerChannelVoltage(XPOWERS_BLDO1, 3300); + g_pmu->enablePowerOutput(XPOWERS_BLDO1); + delay(kSdRailOnSettleMs); + forceSpiDeselected(); + + g_lastRailCycleMs = millis(); + Serial.printf("rail cycle: off=%lu on_settle=%lu\r\n", + (unsigned long)kSdRailOffMs, + (unsigned long)kSdRailOnSettleMs); + return true; +} + +static void runDelayedRetry(const char* label) { + bool readable = cardReadable(); + const char* status = readable ? "card IN" : "card OUT"; + Serial.printf("delayed retry %s -> %s\r\n", label, status); + oledShowStatus(status, 0); +} + +static void handleSerialCommands() { + while (Serial.available() > 0) { + int ch = Serial.read(); + if (ch == 'r' || ch == 'R') { + Serial.println("manual command: SD rail reset"); + oledShowBootPhase("manual SD reset", "re-probing"); + if (cycleSdRail()) { + bool readable = cardReadable(); + Serial.printf("manual SD reset -> %s\r\n", readable ? "card IN" : "card OUT"); + oledShowStatus(readable ? "card IN" : "card OUT", 0); + } + } else if (ch == 'b' || ch == 'B') { + Serial.println("manual command: full reboot"); + Serial.println("restarting now..."); + oledShowBootPhase("manual reboot", "restarting"); + delay(250); + ESP.restart(); + } else if (ch == '\r' || ch == '\n') { + continue; + } else { + Serial.printf("commands: r=sd reset, b=reboot (got '%c')\r\n", (char)ch); + } + } +} + +void setup() { + Serial.begin(115200); + delay(kSerialDelayMs); + + Wire.begin(OLED_SDA, OLED_SCL); + g_oled.begin(); + g_oled.clearDisplay(); + oledShowBootPhase("BOOT", "init"); + + tbeam_supreme::initPmuForPeripherals(g_pmu, &Serial); + forceSpiDeselected(); + g_bootMs = millis(); + + Serial.println(); + Serial.println("constantTFCard"); + Serial.printf("Node: %s\r\n", NODE_LABEL); + Serial.printf("Polling every %lu ms\r\n", (unsigned long)kPollIntervalMs); + Serial.printf("Initial settle delay %lu ms\r\n", (unsigned long)kBootSettleMs); + Serial.println("Commands: r=SD rail reset, b=full reboot"); + + oledShowBootPhase("BOOT", "settling SD rail"); + delay(kBootSettleMs); + + runDelayedRetry("after_settle"); +} + +void loop() { + static uint32_t lastPollMs = 0; + static uint32_t sampleCount = 0; + + handleSerialCommands(); + + uint32_t now = millis(); + + if (g_nextDelayedRetry < (sizeof(kDelayedRetryOffsetsMs) / sizeof(kDelayedRetryOffsetsMs[0])) && + now - g_bootMs >= kDelayedRetryOffsetsMs[g_nextDelayedRetry]) { + char label[20]; + snprintf(label, sizeof(label), "t+%lus", (unsigned long)(kDelayedRetryOffsetsMs[g_nextDelayedRetry] / 1000)); + runDelayedRetry(label); + g_nextDelayedRetry++; + } + + if (now - lastPollMs < kPollIntervalMs) { + delay(5); + return; + } + + lastPollMs = now; + sampleCount++; + + bool readable = cardReadable(); + if (readable) { + g_consecutiveOut = 0; + } else if (g_consecutiveOut < 255) { + g_consecutiveOut++; + } + + if (!readable && + g_consecutiveOut >= kOutVotesBeforeRailCycle && + now - g_lastRailCycleMs >= kMinRailCycleGapMs) { + Serial.printf("persistent OUT: %u polls, forcing SD rail cycle\r\n", + (unsigned)g_consecutiveOut); + oledShowBootPhase("OUT -> rail reset", "re-probing SD"); + + if (cycleSdRail()) { + bool retryReadable = cardReadable(); + readable = retryReadable; + g_consecutiveOut = retryReadable ? 0 : kOutVotesBeforeRailCycle; + Serial.printf("after rail cycle -> %s\r\n", retryReadable ? "card IN" : "card OUT"); + } + } + + const char* status = readable ? "card IN" : "card OUT"; + + Serial.println(status); + oledShowStatus(status, sampleCount); +}