No difference between AMY vs. BOB, going to revise and dig deeper into SD card states

This commit is contained in:
John Poole 2026-04-01 15:41:24 -07:00
commit 76c4b010bf
7 changed files with 1091 additions and 0 deletions

95
notes_Feb_18_2026.txt Normal file
View file

@ -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

View file

@ -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 $

View file

@ -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

View file

@ -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\"

View file

@ -0,0 +1,443 @@
// 20260401 Codex
#include <Arduino.h>
#include <esp_system.h>
#include <SPI.h>
#include <SD.h>
#include <Wire.h>
#include <U8g2lib.h>
#include <driver/gpio.h>
#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);
}

View file

@ -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\"

View file

@ -0,0 +1,257 @@
// 20260401 Codex
#include <Arduino.h>
#include <esp_system.h>
#include <SPI.h>
#include <SD.h>
#include <Wire.h>
#include <U8g2lib.h>
#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);
}