Skip to content

Commit 6ed497a

Browse files
committed
Refine CMTS OFDMA pre equalization visual labels and echo detail sections
- rename window label from Bandwidth to Estimated Frequency Response with frequency span - add per modem echo information table with bin time amplitude and distance fields - keep combined channel graph aligned to channel estimate frequency response series - sync updated upstream OFDMA PreEqualization visualizer into PyPNM-CMTS collection and regenerate MkDocs preview artifacts - 2026-02-28 18:59:28
1 parent d84592a commit 6ed497a

4 files changed

Lines changed: 70 additions & 7 deletions

File tree

docs/visual-previews/PyPNM-CMTS/ServingGroup/Upstream/OFDMA/PreEqualization/Results/basic.html

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

docs/visual/PyPNM-CMTS/ServingGroup/Upstream/OFDMA/PreEqualization/Results/basic.md

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ Preview is best-effort. Some templates may rely on Postman-specific APIs that ar
1616

1717
````html
1818
// Postman Visualizer: PyPNM-CMTS/ServingGroup/Upstream/OFDMA/PreEqualization/Results/basic
19-
// Last Update: 2026-02-28 13:44:00 MST
19+
// Last Update: 2026-02-28 14:02:00 MST
2020

2121
const response = pm.response.json();
2222

@@ -173,6 +173,12 @@ function buildPayload(r) {
173173
const echo = (analysis.echo && analysis.echo.report) || {};
174174
const echoes = Array.isArray(echo.echoes) ? echo.echoes : [];
175175
const firstEcho = echoes.length ? echoes[0] : null;
176+
const echoRows = echoes.slice(0, 3).map((e) => ({
177+
bin: e && e.bin_index != null ? String(e.bin_index) : 'N/A',
178+
time_us: (e && n(e.time_s) != null) ? fmtn(n(e.time_s) * 1e6, 4) : 'N/A',
179+
amplitude: (e && n(e.amplitude) != null) ? fmtn(n(e.amplitude), 6) : 'N/A',
180+
dist_ft: (e && n(e.distance_ft) != null) ? fmtn(n(e.distance_ft), 2) : 'N/A',
181+
}));
176182

177183
const row = {
178184
channel_id: chanId,
@@ -194,7 +200,7 @@ function buildPayload(r) {
194200
stats_peak_to_peak: fmtn(rawStats.peak_to_peak, 3),
195201
stats_crest_factor: fmtn(rawStats.crest_factor, 3),
196202
range_label: fmtInt(startMHz) + ' - ' + fmtInt(endMHz) + ' MHz',
197-
window_label: 'Bandwidth (' + fmtInt(startMHz) + ' - ' + fmtInt(endMHz) + ' MHz)',
203+
window_label: 'Estimated Frequency Response (' + fmtInt(startMHz) + ' - ' + fmtInt(endMHz) + ' MHz)',
198204
chart_id: 'ce-mag-' + chIndex + '-' + mIndex,
199205
points: preeqPoints,
200206
est_chart_id: 'ce-est-' + chIndex + '-' + mIndex,
@@ -205,6 +211,7 @@ function buildPayload(r) {
205211
gd_p2p: gdStats && gdStats.min != null && gdStats.max != null ? fmtn(gdStats.max - gdStats.min, 4) : 'N/A',
206212
echo_count: echoes.length,
207213
echo_ft: firstEcho && n(firstEcho.distance_ft) != null ? fmtn(firstEcho.distance_ft, 1) : 'N/A',
214+
echoes: echoRows,
208215
};
209216

210217
let sg = sgMap.get(String(sgId));
@@ -319,6 +326,10 @@ const template = `
319326
.chart-label{font-size:12px;color:var(--muted);font-weight:700;text-align:left}
320327
.est-toggle{display:flex;gap:8px;flex-wrap:wrap}
321328
.est-toggle label{display:flex;align-items:center;gap:6px;border:1px solid var(--line);border-radius:8px;padding:4px 8px;font-size:11px;color:var(--muted)}
329+
.echo-table{width:100%;border-collapse:collapse;border:1px solid var(--line);border-radius:8px;overflow:hidden;background:var(--panel2)}
330+
.echo-table th,.echo-table td{padding:6px 8px;border-bottom:1px solid var(--line);font-size:11px;text-align:left}
331+
.echo-table th{color:var(--muted);font-weight:700}
332+
.echo-table tr:last-child td{border-bottom:none}
322333
@media (max-width:1280px){.trace-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.cm-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}
323334
@media (max-width:980px){.trace-grid,.cm-grid{grid-template-columns:1fr}}
324335
</style>
@@ -389,6 +400,16 @@ const template = `
389400
} else {
390401
const gdEmpty=document.createElement('div'); gdEmpty.className='chart-box small'; gdEmpty.style.display='grid'; gdEmpty.style.placeItems='center'; gdEmpty.style.color='var(--muted)'; gdEmpty.textContent='No Group Delay'; card.appendChild(gdEmpty);
391402
}
403+
const echoLabel=document.createElement('div'); echoLabel.className='chart-label'; echoLabel.textContent='Echo Information'; card.appendChild(echoLabel);
404+
if (row.echoes && row.echoes.length) {
405+
const tbl=document.createElement('table'); tbl.className='echo-table';
406+
tbl.innerHTML='<thead><tr><th>Bin</th><th>Time us</th><th>Amplitude</th><th>Distance ft</th></tr></thead><tbody>'+
407+
row.echoes.map((e)=>'<tr><td>'+e.bin+'</td><td>'+e.time_us+'</td><td>'+e.amplitude+'</td><td>'+e.dist_ft+'</td></tr>').join('')+
408+
'</tbody>';
409+
card.appendChild(tbl);
410+
} else {
411+
const echoEmpty=document.createElement('div'); echoEmpty.className='chart-box small'; echoEmpty.style.height='52px'; echoEmpty.style.display='grid'; echoEmpty.style.placeItems='center'; echoEmpty.style.color='var(--muted)'; echoEmpty.textContent='No Echo Information'; card.appendChild(echoEmpty);
412+
}
392413
grid.appendChild(card);
393414
});
394415
wCard.appendChild(grid);

postman/collections/PyPNM-CMTS.postman_collection.json

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3893,7 +3893,7 @@
38933893
"script": {
38943894
"exec": [
38953895
"// Postman Visualizer: PyPNM-CMTS/ServingGroup/Upstream/OFDMA/PreEqualization/Results/basic",
3896-
"// Last Update: 2026-02-28 13:44:00 MST",
3896+
"// Last Update: 2026-02-28 14:02:00 MST",
38973897
"",
38983898
"const response = pm.response.json();",
38993899
"",
@@ -4050,6 +4050,12 @@
40504050
" const echo = (analysis.echo && analysis.echo.report) || {};",
40514051
" const echoes = Array.isArray(echo.echoes) ? echo.echoes : [];",
40524052
" const firstEcho = echoes.length ? echoes[0] : null;",
4053+
" const echoRows = echoes.slice(0, 3).map((e) => ({",
4054+
" bin: e && e.bin_index != null ? String(e.bin_index) : 'N/A',",
4055+
" time_us: (e && n(e.time_s) != null) ? fmtn(n(e.time_s) * 1e6, 4) : 'N/A',",
4056+
" amplitude: (e && n(e.amplitude) != null) ? fmtn(n(e.amplitude), 6) : 'N/A',",
4057+
" dist_ft: (e && n(e.distance_ft) != null) ? fmtn(n(e.distance_ft), 2) : 'N/A',",
4058+
" }));",
40534059
"",
40544060
" const row = {",
40554061
" channel_id: chanId,",
@@ -4071,7 +4077,7 @@
40714077
" stats_peak_to_peak: fmtn(rawStats.peak_to_peak, 3),",
40724078
" stats_crest_factor: fmtn(rawStats.crest_factor, 3),",
40734079
" range_label: fmtInt(startMHz) + ' - ' + fmtInt(endMHz) + ' MHz',",
4074-
" window_label: 'Bandwidth (' + fmtInt(startMHz) + ' - ' + fmtInt(endMHz) + ' MHz)',",
4080+
" window_label: 'Estimated Frequency Response (' + fmtInt(startMHz) + ' - ' + fmtInt(endMHz) + ' MHz)',",
40754081
" chart_id: 'ce-mag-' + chIndex + '-' + mIndex,",
40764082
" points: preeqPoints,",
40774083
" est_chart_id: 'ce-est-' + chIndex + '-' + mIndex,",
@@ -4082,6 +4088,7 @@
40824088
" gd_p2p: gdStats && gdStats.min != null && gdStats.max != null ? fmtn(gdStats.max - gdStats.min, 4) : 'N/A',",
40834089
" echo_count: echoes.length,",
40844090
" echo_ft: firstEcho && n(firstEcho.distance_ft) != null ? fmtn(firstEcho.distance_ft, 1) : 'N/A',",
4091+
" echoes: echoRows,",
40854092
" };",
40864093
"",
40874094
" let sg = sgMap.get(String(sgId));",
@@ -4196,6 +4203,10 @@
41964203
" .chart-label{font-size:12px;color:var(--muted);font-weight:700;text-align:left}",
41974204
" .est-toggle{display:flex;gap:8px;flex-wrap:wrap}",
41984205
" .est-toggle label{display:flex;align-items:center;gap:6px;border:1px solid var(--line);border-radius:8px;padding:4px 8px;font-size:11px;color:var(--muted)}",
4206+
" .echo-table{width:100%;border-collapse:collapse;border:1px solid var(--line);border-radius:8px;overflow:hidden;background:var(--panel2)}",
4207+
" .echo-table th,.echo-table td{padding:6px 8px;border-bottom:1px solid var(--line);font-size:11px;text-align:left}",
4208+
" .echo-table th{color:var(--muted);font-weight:700}",
4209+
" .echo-table tr:last-child td{border-bottom:none}",
41994210
" @media (max-width:1280px){.trace-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.cm-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}",
42004211
" @media (max-width:980px){.trace-grid,.cm-grid{grid-template-columns:1fr}}",
42014212
"</style>",
@@ -4266,6 +4277,16 @@
42664277
" } else {",
42674278
" const gdEmpty=document.createElement('div'); gdEmpty.className='chart-box small'; gdEmpty.style.display='grid'; gdEmpty.style.placeItems='center'; gdEmpty.style.color='var(--muted)'; gdEmpty.textContent='No Group Delay'; card.appendChild(gdEmpty);",
42684279
" }",
4280+
" const echoLabel=document.createElement('div'); echoLabel.className='chart-label'; echoLabel.textContent='Echo Information'; card.appendChild(echoLabel);",
4281+
" if (row.echoes && row.echoes.length) {",
4282+
" const tbl=document.createElement('table'); tbl.className='echo-table';",
4283+
" tbl.innerHTML='<thead><tr><th>Bin</th><th>Time us</th><th>Amplitude</th><th>Distance ft</th></tr></thead><tbody>'+",
4284+
" row.echoes.map((e)=>'<tr><td>'+e.bin+'</td><td>'+e.time_us+'</td><td>'+e.amplitude+'</td><td>'+e.dist_ft+'</td></tr>').join('')+",
4285+
" '</tbody>';",
4286+
" card.appendChild(tbl);",
4287+
" } else {",
4288+
" const echoEmpty=document.createElement('div'); echoEmpty.className='chart-box small'; echoEmpty.style.height='52px'; echoEmpty.style.display='grid'; echoEmpty.style.placeItems='center'; echoEmpty.style.color='var(--muted)'; echoEmpty.textContent='No Echo Information'; card.appendChild(echoEmpty);",
4289+
" }",
42694290
" grid.appendChild(card);",
42704291
" });",
42714292
" wCard.appendChild(grid);",

visual/PyPNM-CMTS/ServingGroup/Upstream/OFDMA/PreEqualization/Results/basic.html

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// Postman Visualizer: PyPNM-CMTS/ServingGroup/Upstream/OFDMA/PreEqualization/Results/basic
2-
// Last Update: 2026-02-28 13:44:00 MST
2+
// Last Update: 2026-02-28 14:02:00 MST
33

44
const response = pm.response.json();
55

@@ -156,6 +156,12 @@
156156
const echo = (analysis.echo && analysis.echo.report) || {};
157157
const echoes = Array.isArray(echo.echoes) ? echo.echoes : [];
158158
const firstEcho = echoes.length ? echoes[0] : null;
159+
const echoRows = echoes.slice(0, 3).map((e) => ({
160+
bin: e && e.bin_index != null ? String(e.bin_index) : 'N/A',
161+
time_us: (e && n(e.time_s) != null) ? fmtn(n(e.time_s) * 1e6, 4) : 'N/A',
162+
amplitude: (e && n(e.amplitude) != null) ? fmtn(n(e.amplitude), 6) : 'N/A',
163+
dist_ft: (e && n(e.distance_ft) != null) ? fmtn(n(e.distance_ft), 2) : 'N/A',
164+
}));
159165

160166
const row = {
161167
channel_id: chanId,
@@ -177,7 +183,7 @@
177183
stats_peak_to_peak: fmtn(rawStats.peak_to_peak, 3),
178184
stats_crest_factor: fmtn(rawStats.crest_factor, 3),
179185
range_label: fmtInt(startMHz) + ' - ' + fmtInt(endMHz) + ' MHz',
180-
window_label: 'Bandwidth (' + fmtInt(startMHz) + ' - ' + fmtInt(endMHz) + ' MHz)',
186+
window_label: 'Estimated Frequency Response (' + fmtInt(startMHz) + ' - ' + fmtInt(endMHz) + ' MHz)',
181187
chart_id: 'ce-mag-' + chIndex + '-' + mIndex,
182188
points: preeqPoints,
183189
est_chart_id: 'ce-est-' + chIndex + '-' + mIndex,
@@ -188,6 +194,7 @@
188194
gd_p2p: gdStats && gdStats.min != null && gdStats.max != null ? fmtn(gdStats.max - gdStats.min, 4) : 'N/A',
189195
echo_count: echoes.length,
190196
echo_ft: firstEcho && n(firstEcho.distance_ft) != null ? fmtn(firstEcho.distance_ft, 1) : 'N/A',
197+
echoes: echoRows,
191198
};
192199

193200
let sg = sgMap.get(String(sgId));
@@ -302,6 +309,10 @@
302309
.chart-label{font-size:12px;color:var(--muted);font-weight:700;text-align:left}
303310
.est-toggle{display:flex;gap:8px;flex-wrap:wrap}
304311
.est-toggle label{display:flex;align-items:center;gap:6px;border:1px solid var(--line);border-radius:8px;padding:4px 8px;font-size:11px;color:var(--muted)}
312+
.echo-table{width:100%;border-collapse:collapse;border:1px solid var(--line);border-radius:8px;overflow:hidden;background:var(--panel2)}
313+
.echo-table th,.echo-table td{padding:6px 8px;border-bottom:1px solid var(--line);font-size:11px;text-align:left}
314+
.echo-table th{color:var(--muted);font-weight:700}
315+
.echo-table tr:last-child td{border-bottom:none}
305316
@media (max-width:1280px){.trace-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.cm-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}
306317
@media (max-width:980px){.trace-grid,.cm-grid{grid-template-columns:1fr}}
307318
</style>
@@ -372,6 +383,16 @@ <h1 class="title">{{title}}</h1>
372383
} else {
373384
const gdEmpty=document.createElement('div'); gdEmpty.className='chart-box small'; gdEmpty.style.display='grid'; gdEmpty.style.placeItems='center'; gdEmpty.style.color='var(--muted)'; gdEmpty.textContent='No Group Delay'; card.appendChild(gdEmpty);
374385
}
386+
const echoLabel=document.createElement('div'); echoLabel.className='chart-label'; echoLabel.textContent='Echo Information'; card.appendChild(echoLabel);
387+
if (row.echoes && row.echoes.length) {
388+
const tbl=document.createElement('table'); tbl.className='echo-table';
389+
tbl.innerHTML='<thead><tr><th>Bin</th><th>Time us</th><th>Amplitude</th><th>Distance ft</th></tr></thead><tbody>'+
390+
row.echoes.map((e)=>'<tr><td>'+e.bin+'</td><td>'+e.time_us+'</td><td>'+e.amplitude+'</td><td>'+e.dist_ft+'</td></tr>').join('')+
391+
'</tbody>';
392+
card.appendChild(tbl);
393+
} else {
394+
const echoEmpty=document.createElement('div'); echoEmpty.className='chart-box small'; echoEmpty.style.height='52px'; echoEmpty.style.display='grid'; echoEmpty.style.placeItems='center'; echoEmpty.style.color='var(--muted)'; echoEmpty.textContent='No Echo Information'; card.appendChild(echoEmpty);
395+
}
375396
grid.appendChild(card);
376397
});
377398
wCard.appendChild(grid);

0 commit comments

Comments
 (0)