Skip to content

Commit 93cc933

Browse files
authored
Parallel rtt (#11)
Closed #1
1 parent 4b6051a commit 93cc933

File tree

12 files changed

+580
-316
lines changed

12 files changed

+580
-316
lines changed

.github/workflows/test-erase.yml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,25 @@ name: Test Erase
33
on:
44
push:
55
branches: [main]
6+
paths:
7+
- 'src/bmlab_toolkit/erase_cli.py'
8+
- 'src/bmlab_toolkit/jlink_programmer.py'
9+
- 'src/bmlab_toolkit/programmer.py'
10+
- 'src/bmlab_toolkit/constants.py'
11+
- 'pyproject.toml'
12+
- '.github/actions/setup-jlink-network/**'
13+
- '.github/workflows/test-erase.yml'
14+
- '.github/workflows/fw.*'
615
pull_request:
16+
paths:
17+
- 'src/bmlab_toolkit/erase_cli.py'
18+
- 'src/bmlab_toolkit/jlink_programmer.py'
19+
- 'src/bmlab_toolkit/programmer.py'
20+
- 'src/bmlab_toolkit/constants.py'
21+
- 'pyproject.toml'
22+
- '.github/actions/setup-jlink-network/**'
23+
- '.github/workflows/test-erase.yml'
24+
- '.github/workflows/fw.*'
725
workflow_dispatch:
826

927
env:

.github/workflows/test-flash.yml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,25 @@ name: Test Flash
33
on:
44
push:
55
branches: [main]
6+
paths:
7+
- 'src/bmlab_toolkit/flashing.py'
8+
- 'src/bmlab_toolkit/jlink_programmer.py'
9+
- 'src/bmlab_toolkit/programmer.py'
10+
- 'src/bmlab_toolkit/constants.py'
11+
- 'pyproject.toml'
12+
- '.github/actions/setup-jlink-network/**'
13+
- '.github/workflows/test-flash.yml'
14+
- '.github/workflows/fw.*'
615
pull_request:
16+
paths:
17+
- 'src/bmlab_toolkit/flashing.py'
18+
- 'src/bmlab_toolkit/jlink_programmer.py'
19+
- 'src/bmlab_toolkit/programmer.py'
20+
- 'src/bmlab_toolkit/constants.py'
21+
- 'pyproject.toml'
22+
- '.github/actions/setup-jlink-network/**'
23+
- '.github/workflows/test-flash.yml'
24+
- '.github/workflows/fw.*'
725
workflow_dispatch:
826

927
env:

.github/workflows/test-rtt.yml

Lines changed: 180 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,180 @@
1+
name: Test RTT
2+
3+
on:
4+
push:
5+
branches: [main]
6+
paths:
7+
- 'src/bmlab_toolkit/rtt_cli.py'
8+
- 'src/bmlab_toolkit/jlink_programmer.py'
9+
- 'src/bmlab_toolkit/programmer.py'
10+
- 'src/bmlab_toolkit/constants.py'
11+
- 'pyproject.toml'
12+
- '.github/actions/setup-jlink-network/**'
13+
- '.github/workflows/test-rtt.yml'
14+
- '.github/workflows/fw.*'
15+
pull_request:
16+
paths:
17+
- 'src/bmlab_toolkit/rtt_cli.py'
18+
- 'src/bmlab_toolkit/jlink_programmer.py'
19+
- 'src/bmlab_toolkit/programmer.py'
20+
- 'src/bmlab_toolkit/constants.py'
21+
- 'pyproject.toml'
22+
- '.github/actions/setup-jlink-network/**'
23+
- '.github/workflows/test-rtt.yml'
24+
- '.github/workflows/fw.*'
25+
workflow_dispatch:
26+
27+
env:
28+
VNET_BASE: 192.168.3
29+
VNET_MASK: 24
30+
31+
jobs:
32+
test-rtt:
33+
runs-on: self-hosted
34+
35+
steps:
36+
- name: Cleanup before start
37+
if: always()
38+
run: |
39+
pkill -9 -f JLinkRemoteServer || true
40+
docker rm -f jlink100 jlink101 jlink102 2>/dev/null || true
41+
docker network rm jlink-net 2>/dev/null || true
42+
sleep 2
43+
44+
- uses: actions/checkout@v4
45+
46+
- name: Install package
47+
run: |
48+
python3 -m venv .venv
49+
. .venv/bin/activate
50+
pip install -e ".[dev]"
51+
52+
- name: Detect devices and save serials
53+
run: |
54+
. .venv/bin/activate
55+
bmlab-scan | tee scan.txt
56+
count=$(grep -c "Target: *STM32F103RE" scan.txt)
57+
awk '/JLink Programmer/ {serial=""} /Serial:/ {serial=$2} /Target: *STM32F103RE/ && serial {print serial}' scan.txt | sort | uniq > serials.txt
58+
59+
if [ "$count" -ne 3 ]; then
60+
echo "Test failed: expected 3 STM32F103RE, found $count"
61+
cat scan.txt
62+
exit 1
63+
fi
64+
65+
- name: Flash firmware to all devices
66+
run: |
67+
. .venv/bin/activate
68+
serial1=$(sed -n '1p' serials.txt)
69+
serial2=$(sed -n '2p' serials.txt)
70+
serial3=$(sed -n '3p' serials.txt)
71+
72+
bmlab-flash .github/workflows/fw.bin --serial $serial1 $serial2 $serial3 --mcu STM32F103RE
73+
74+
- name: Test 1 — RTT single device by serial
75+
run: |
76+
. .venv/bin/activate
77+
serial=$(sed -n '1p' serials.txt)
78+
timeout 5 bmlab-rtt --serial $serial --mcu STM32F103RE --timeout 3 | tee rtt-serial1.txt || true
79+
80+
if [ ! -s rtt-serial1.txt ]; then
81+
echo "Test 1 failed: no RTT output"
82+
exit 1
83+
fi
84+
85+
- name: Test 2 — RTT auto-detect device
86+
run: |
87+
. .venv/bin/activate
88+
serial=$(sed -n '1p' serials.txt)
89+
timeout 5 bmlab-rtt --serial $serial --timeout 3 | tee rtt-auto.txt || true
90+
91+
if [ ! -s rtt-auto.txt ]; then
92+
echo "Test 2 failed: no RTT output"
93+
exit 1
94+
fi
95+
96+
- name: Test 3 — RTT multiple devices by serial (sequential)
97+
run: |
98+
. .venv/bin/activate
99+
serial1=$(sed -n '1p' serials.txt)
100+
serial2=$(sed -n '2p' serials.txt)
101+
serial3=$(sed -n '3p' serials.txt)
102+
103+
echo "Testing serials: $serial1 $serial2 $serial3"
104+
105+
mkdir -p rtt_logs_serial
106+
# Serial devices are processed sequentially (USB driver limitation)
107+
# Each device: ~3s RTT + ~2s connect/disconnect = ~5s
108+
# Total: 3 devices * 5s = 15s + 10s buffer = 25s
109+
timeout 25 bmlab-rtt --serial $serial1 $serial2 $serial3 --mcu STM32F103RE --output-dir rtt_logs_serial --timeout 3 || true
110+
111+
echo "Checking log files..."
112+
ls -lh rtt_logs_serial/
113+
114+
# Check that log files were created
115+
for s in $serial1 $serial2 $serial3; do
116+
logfile="rtt_logs_serial/rtt_serial_${s}.log"
117+
if [ ! -f "$logfile" ]; then
118+
echo "Test 3 failed: log file not found: $logfile"
119+
ls -la rtt_logs_serial/
120+
exit 1
121+
fi
122+
done
123+
124+
- name: Setup JLink network containers
125+
uses: ./.github/actions/setup-jlink-network
126+
with:
127+
serials-file: serials.txt
128+
vnet-base: ${{ env.VNET_BASE }}
129+
vnet-mask: ${{ env.VNET_MASK }}
130+
131+
- name: Flash firmware to network devices
132+
run: |
133+
. .venv/bin/activate
134+
bmlab-flash .github/workflows/fw.bin --ip $VNET_BASE.100 $VNET_BASE.101 $VNET_BASE.102 --mcu STM32F103RE
135+
136+
- name: Test 4 — RTT single device by IP
137+
run: |
138+
. .venv/bin/activate
139+
timeout 15 bmlab-rtt --ip $VNET_BASE.100 --timeout 3 | tee rtt-ip1.txt || true
140+
141+
if [ ! -s rtt-ip1.txt ]; then
142+
echo "Test 4 failed: no RTT output"
143+
cat rtt-ip1.txt
144+
exit 1
145+
fi
146+
147+
- name: Test 5 — RTT multiple devices by IP (parallel)
148+
run: |
149+
. .venv/bin/activate
150+
mkdir -p rtt_logs_ip
151+
timeout 15 bmlab-rtt --ip $VNET_BASE.100 $VNET_BASE.101 $VNET_BASE.102 --output-dir rtt_logs_ip --timeout 3 || true
152+
153+
echo "Checking log files..."
154+
ls -lh rtt_logs_ip/
155+
156+
# Check that log files were created for each IP
157+
# Note: dots in IP are replaced with underscores in filename
158+
for ip in 100 101 102; do
159+
logfile="rtt_logs_ip/rtt_${VNET_BASE//./_}_${ip}.log"
160+
if [ ! -f "$logfile" ]; then
161+
echo "Test 5 failed: log file not found: $logfile"
162+
ls -la rtt_logs_ip/
163+
exit 1
164+
fi
165+
166+
# Check that file has content
167+
if [ ! -s "$logfile" ]; then
168+
echo "Test 5 warning: log file is empty: $logfile"
169+
fi
170+
done
171+
172+
echo "Test 5 passed: all log files created"
173+
174+
- name: Cleanup after tests
175+
if: always()
176+
run: |
177+
docker rm -f jlink100 jlink101 jlink102 || true
178+
docker network rm jlink-net || true
179+
pkill -9 -f JLinkRemoteServer || true
180+
sleep 2

.github/workflows/test-scan.yml

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,23 @@ name: Test Scan
33
on:
44
push:
55
branches: [main]
6+
paths:
7+
- 'src/bmlab_toolkit/scan_cli.py'
8+
- 'src/bmlab_toolkit/jlink_programmer.py'
9+
- 'src/bmlab_toolkit/programmer.py'
10+
- 'src/bmlab_toolkit/constants.py'
11+
- 'pyproject.toml'
12+
- '.github/actions/setup-jlink-network/**'
13+
- '.github/workflows/test-scan.yml'
614
pull_request:
15+
paths:
16+
- 'src/bmlab_toolkit/scan_cli.py'
17+
- 'src/bmlab_toolkit/jlink_programmer.py'
18+
- 'src/bmlab_toolkit/programmer.py'
19+
- 'src/bmlab_toolkit/constants.py'
20+
- 'pyproject.toml'
21+
- '.github/actions/setup-jlink-network/**'
22+
- '.github/workflows/test-scan.yml'
723
workflow_dispatch:
824

925
env:

QUICKSTART.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,6 @@ prog = JLinkProgrammer(serial=123456789)
9999

100100
try:
101101
# Connect and start RTT
102-
prog._connect_target(mcu="STM32F765ZG")
103102
prog.start_rtt(delay=1.0)
104103

105104
# Send data

0 commit comments

Comments
 (0)