| from pathlib import Path |
|
|
| import pandas as pd |
| import streamlit as st |
|
|
| from queries.process_ue_capability import SHEET_ORDER, parse_uecap_files, to_excel_bytes |
|
|
| st.title(":material/memory: UE Capability Parser") |
| st.markdown( |
| """ |
| Parse UE Capability text exports (`.txt`) from drive-test/log tools (Actix/TEMS-like decoded RRC trees) |
| and extract useful 3GPP info: |
| - Bands by RAT (LTE, WCDMA/UTRA, GSM/GERAN, NR when present) |
| - Features and category fields |
| - CA / combination structures |
| - Release explicit + inferred (rules-based) |
| """ |
| ) |
|
|
|
|
| samples_dir = Path(__file__).resolve().parents[1] / "samples" |
| sample_uecap = samples_dir / "ue_capability.txt" |
|
|
| if sample_uecap.exists(): |
| st.download_button( |
| label="Download UE capability sample", |
| data=sample_uecap.read_bytes(), |
| file_name=sample_uecap.name, |
| mime="text/plain", |
| ) |
|
|
| uploaded_files = st.file_uploader( |
| "Upload one or multiple UE capability text files", |
| type=["txt"], |
| accept_multiple_files=True, |
| ) |
|
|
| enable_volte_assessment = st.checkbox( |
| "Enable VoLTE assessment", |
| value=True, |
| help="Compute VoLTE confidence score and supporting evidence.", |
| ) |
|
|
| if st.button("Process", type="primary", disabled=not uploaded_files): |
| try: |
| payload = [(f.name, f.read()) for f in uploaded_files] |
| with st.spinner("Parsing UE capability exports..."): |
| sheets = parse_uecap_files( |
| payload, |
| enable_volte_assessment=enable_volte_assessment, |
| ) |
| excel_bytes = to_excel_bytes(sheets) |
| st.session_state["uecap_sheets"] = sheets |
| st.session_state["uecap_excel"] = excel_bytes |
| st.success(f"Processed {len(uploaded_files)} file(s).") |
| except Exception as error: |
| st.error(f"Parsing failed: {error}") |
|
|
| sheets: dict[str, pd.DataFrame] | None = st.session_state.get("uecap_sheets") |
| excel_bytes: bytes | None = st.session_state.get("uecap_excel") |
|
|
| if sheets: |
| visible_sheets = [name for name in SHEET_ORDER if name != "Benchmark_CA_Diff"] |
| tabs = st.tabs(visible_sheets) |
| for tab, sheet_name in zip(tabs, visible_sheets): |
| with tab: |
| df = sheets.get(sheet_name, pd.DataFrame()) |
| if df is None or df.empty: |
| st.info("No data extracted for this sheet.") |
| else: |
| st.dataframe(df, use_container_width=True) |
|
|
| if excel_bytes: |
| st.download_button( |
| label="Download UE capability Excel", |
| data=excel_bytes, |
| file_name="UE_Capability_Parsed.xlsx", |
| mime="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", |
| type="primary", |
| ) |
|
|