From d21963fec66e7edb9ebb3b456cf4f70e1441ba00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Leopoldo=20Rodr=C3=ADguez?= Date: Fri, 18 Sep 2026 18:00:13 -0600 Subject: [PATCH] auto-sync 2026-09-18 18:00 --- backend/app.py | 95 ++++++++- docs/descargas/SHA256SUMS.txt | 1 + docs/descargas/hbox-v5-bringup_0.4.0.bin | Bin 0 -> 75524 bytes docs/descargas/index.md | 82 +++++++- docs/diagnostico/tablero-campo.html | 6 +- docs/formularios/reflasheo.html | 149 ++++++++++++++ docs/index.md | 9 + docs/procedimientos/diagnostico-banco.md | 6 + docs/procedimientos/reflasheo-unidades.md | 42 +++- docs/unidad.html | 240 ++++++++++++++++++++++ mkdocs.yml | 2 + scripts/sync-docs.sh | 1 + 12 files changed, 614 insertions(+), 19 deletions(-) create mode 100644 docs/descargas/hbox-v5-bringup_0.4.0.bin create mode 100644 docs/formularios/reflasheo.html create mode 100644 docs/unidad.html diff --git a/backend/app.py b/backend/app.py index 44a1f53..9483fa4 100644 --- a/backend/app.py +++ b/backend/app.py @@ -36,7 +36,7 @@ ADMINS = {u.strip().lower() for u in os.environ.get("ACTAS_ADMINS", "leo").split TIPOS_UNICOS = {"ensamble"} # tipos en los que un componente solo puede usarse en un acta real # Tipos REPETIBLES: una misma serie puede tener varias actas (cada visita a campo es un evento nuevo). TIPOS_REPETIBLES = {t.strip() for t in os.environ.get( - "ACTAS_REPETIBLES", "diagnostico-campo,instalacion-campo").split(",") if t.strip()} + "ACTAS_REPETIBLES", "diagnostico-campo,diagnostico-banco,instalacion-campo,reflasheo").split(",") if t.strip()} # Subida de fotos MAX_MB = int(os.environ.get("ADJUNTO_MAX_MB", "8")) @@ -561,5 +561,98 @@ def cambiar_password(): return jsonify(ok=True, usuario=destino, reset=es_reset) +# ------------------------------------------------- expediente de una unidad +def _listar_adjuntos(serie): + """Todas las fotos y logs subidos para esa serie, de cualquier tipo de acta.""" + fotos, logs = [], [] + if not os.path.isdir(ADJ): + return fotos, logs + for tipo in sorted(os.listdir(ADJ)): + base = os.path.join(ADJ, tipo, serie) + if not os.path.isdir(base): + continue + for fn in sorted(os.listdir(base)): + fp = os.path.join(base, fn) + if os.path.isfile(fp): + fotos.append({"tipo": tipo, "ruta": f"{tipo}/{serie}/{fn}", + "bytes": os.path.getsize(fp), "ts": int(os.path.getmtime(fp))}) + dlogs = os.path.join(base, "logs") + if os.path.isdir(dlogs): + for fn in sorted(os.listdir(dlogs)): + fp = os.path.join(dlogs, fn) + if os.path.isfile(fp): + logs.append({"tipo": tipo, "ruta": f"{tipo}/{serie}/logs/{fn}", + "nombre": fn[16:] if len(fn) > 16 else fn, + "bytes": os.path.getsize(fp), "ts": int(os.path.getmtime(fp))}) + return fotos, logs + + +@app.get("/api/unidad") +def expediente(): + """Todo lo que existe en el servidor sobre una serie: actas de cualquier tipo, + fotos, archivos de log, y las actas de otras unidades que la mencionan como componente.""" + serie = slug(request.args.get("serie"), 24) + if not serie: + return jsonify(ok=False, error="falta serie"), 400 + + actas, relacionadas = [], [] + if os.path.isdir(BASE): + for tipo in sorted(os.listdir(BASE)): + carpeta = os.path.join(BASE, tipo) + if not os.path.isdir(carpeta): + continue + for fn in sorted(os.listdir(carpeta)): + if not fn.endswith(".json"): + continue + try: + with open(os.path.join(carpeta, fn), encoding="utf-8") as f: + d = json.load(f) + except Exception: + continue + fila = {"tipo": tipo, "archivo": fn, "serie": d.get("serie"), + "recibido": d.get("_recibido"), "fecha": d.get("fecha"), + "tecnico": d.get("tecnico"), "resultado": d.get("resultado"), + "clasificacion": d.get("clasificacion"), "accion": d.get("accion"), + "motivo": d.get("motivo"), "maquina": d.get("maquina_id") or d.get("maquina"), + "fotos": [f2.get("ruta") for f2 in (d.get("fotos") or []) if f2.get("ruta")], + "archivos": [{"ruta": a.get("ruta"), "nombre": a.get("nombre")} + for a in (d.get("archivos") or []) if a.get("ruta")]} + if d.get("serie") == serie: + actas.append(fila) + elif isinstance(d.get("componentes"), dict) and serie in d["componentes"].values(): + fila["componentes"] = d["componentes"] + relacionadas.append(fila) + + # Orden del expediente: manda la FECHA que anotó el técnico (la de la visita); + # la hora de recepción solo desempata. Un acta capturada días después no debe + # aparecer como si el trabajo se hubiera hecho ese día. + def _clave(r): + return ((r.get("fecha") or (r.get("recibido") or "")[:10]), r.get("recibido") or "") + actas.sort(key=_clave, reverse=True) + relacionadas.sort(key=_clave, reverse=True) + fotos, logs = _listar_adjuntos(serie) + return jsonify(ok=True, serie=serie, actas=actas, relacionadas=relacionadas, + fotos=fotos, logs=logs, + total=len(actas), total_fotos=len(fotos), total_logs=len(logs)) + + +@app.get("/api/series") +def series(): + """Todas las series que tienen algo guardado — para el buscador del expediente.""" + vistas = {} + if os.path.isdir(BASE): + for tipo in sorted(os.listdir(BASE)): + carpeta = os.path.join(BASE, tipo) + if not os.path.isdir(carpeta): + continue + for fn in os.listdir(carpeta): + if fn.endswith(".json"): + ser = fn.rsplit("_", 1)[0] if "_" in fn else fn[:-5] + ser = fn.split("_2")[0] if "_2" in fn else ser + vistas.setdefault(ser, set()).add(tipo) + return jsonify(ok=True, series=[{"serie": k, "tipos": sorted(v)} + for k, v in sorted(vistas.items())]) + + if __name__ == "__main__": app.run(host="127.0.0.1", port=int(os.environ.get("PORT", "8081"))) diff --git a/docs/descargas/SHA256SUMS.txt b/docs/descargas/SHA256SUMS.txt index bd241b4..3a2434f 100644 --- a/docs/descargas/SHA256SUMS.txt +++ b/docs/descargas/SHA256SUMS.txt @@ -1 +1,2 @@ e1f351084e803306c376989b284ca0f9f9f1a3445e59494f8a5ff7a9652ad44c hbox-v5-bringup_0.5.1.bin +a8de74b3d7768e9d5656ae0bff05475445c0cd2599ecfdc4ab081e517ed3d6ef hbox-v5-bringup_0.4.0.bin diff --git a/docs/descargas/hbox-v5-bringup_0.4.0.bin b/docs/descargas/hbox-v5-bringup_0.4.0.bin new file mode 100644 index 0000000000000000000000000000000000000000..7939648ece7287ee885cf1d3dc98387ac003a02e GIT binary patch literal 75524 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 z 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 + + + + +Acta de reflasheo y configuración — HBOX + + + +
+ + + + + diff --git a/docs/index.md b/docs/index.md index 1f0691b..7347c7d 100644 --- a/docs/index.md +++ b/docs/index.md @@ -41,6 +41,15 @@ Sitio interno de Helgen Technologies. **Busca abajo lo que vas a hacer hoy.** [Procedimiento de reflasheo](procedimientos/reflasheo-unidades.md) +- ### 🗂 Todo sobre una unidad + + --- + + El expediente completo de un número de serie: cada acta, cada foto y cada archivo de log + que se ha subido, en una sola línea de tiempo. + + [**▶ Abrir expediente**](unidad.html){ .md-button } + - ### 📊 ¿Qué se ha revisado? --- diff --git a/docs/procedimientos/diagnostico-banco.md b/docs/procedimientos/diagnostico-banco.md index 4a11bed..6124900 100644 --- a/docs/procedimientos/diagnostico-banco.md +++ b/docs/procedimientos/diagnostico-banco.md @@ -27,6 +27,12 @@ batería, y si el problema sigue después de reflashear. > De ahí la regla que aplica a la unidad del montacargas (**RTK-014**, todavía instalada): > primero la captura por USB en sitio, y hasta después se desmonta. +!!! info "Qué tarjeta traen estas unidades" + Las tres unidades desplegadas son **EinarBoard 1.0** corriendo firmware **v2/v3** (así lo + documenta `V4-PLAN.md` del repositorio de firmware). Eso importa para dos cosas: el binario que + les toca es el de generación **V3** —nunca el de bring-up del v5—, y el control de carga usa la + polaridad de producción (`CHRG_EN` en alto = carga **apagada**). + ## 2. Equipo necesario | Equipo | Para qué | diff --git a/docs/procedimientos/reflasheo-unidades.md b/docs/procedimientos/reflasheo-unidades.md index 862951e..862a892 100644 --- a/docs/procedimientos/reflasheo-unidades.md +++ b/docs/procedimientos/reflasheo-unidades.md @@ -107,26 +107,52 @@ descárgalo otra vez; si sigue sin coincidir, no lo uses y avisa. *(Esta sección no es para el técnico: es para quien publica el `.bin`.)* -Hoy el repositorio **no contiene binarios compilados de V3 ni de V4** — solo el de bring-up del V5, -que sí está publicado y versionado. Los `.bin` de firmware están en `.gitignore` a propósito. Para -que el procedimiento de arriba funcione, cada generación necesita un binario **compilado, probado en -banco y publicado con su SHA256**. +Hoy el repositorio **no contiene binarios compilados de V3 ni de V4**. Los `.bin` están en +`.gitignore` a propósito. Y hay una diferencia importante entre las dos generaciones: -Fuentes: `04-Source-Code/firmware/blackpillrtkcode_v3/` y `…_v4/`. +| Generación | Código fuente | Qué falta | +|---|---|---| +| **V3** | ✅ Existe: `04-Source-Code/firmware/blackpillrtkcode_v3/` (v3.0.3, 1361 líneas) | Compilarlo y probarlo en banco | +| **V4** | ✅ Existe: `blackpillrtkcode_v4/` (v4.0.0, 1536 líneas) — deriva de v3 y agrega la telemetría en banda | Compilarlo y probarlo en banco | + +Las dos se compilan igual. La diferencia práctica: **V3 deja la unidad como está hoy**; **V4 además hace que la unidad reporte su salud al servidor por el módem**, sin cables nuevos (K1 y `BYP_CTRL` ya están en la EinarBoard 1.0). + +El buen dato es que V3 no depende de ninguna librería externa — solo `` y `` — +así que basta el core de STM32. Compilación reproducible con `arduino-cli` (verifica el FQBN contra tu instalación del core STM32duino antes de darlo por bueno): ```bash +# 1. toolchain (una sola vez) +brew install arduino-cli # o descárgalo de arduino.cc +arduino-cli config init +arduino-cli config add board_manager.additional_urls \ + https://github.com/stm32duino/BoardManagerFiles/raw/main/package_stmicroelectronics_index.json +arduino-cli core update-index arduino-cli core install STMicroelectronics:stm32 + +# 2. confirma el identificador exacto de la tarjeta ANTES de compilar +arduino-cli board listall | grep -i blackpill + +# 3. compila (ajusta el FQBN a lo que haya salido en el paso 2) +cd ~/Documents/Claude/Projects/Drogheda/04-Source-Code/firmware arduino-cli compile \ --fqbn STMicroelectronics:stm32:GenF4:pnum=BLACKPILL_F411CE \ - --build-property "compiler.cpp.extra_flags=-DTARGET_EINARBOARD=1" \ --output-dir release/ \ - blackpillrtkcode_v3/ -shasum -a 256 release/*.bin >> release/SHA256SUMS + blackpillrtkcode_v3/ # o blackpillrtkcode_v4/ para la version con telemetria + +# 4. nómbralo por su versión y saca su huella +mv release/blackpillrtkcode_v3.ino.bin release/hbox-fw-v3_3.0.3.bin +shasum -a 256 release/hbox-fw-v3_3.0.3.bin | tee -a release/SHA256SUMS ``` +**El destino de tarjeta ya viene bien por omisión:** el propio `.ino` trae `TARGET_EINARBOARD 1` y +`TARGET_PROTO 0`, que es lo correcto para la flota desplegada — las unidades de campo son +**EinarBoard 1.0** corriendo v2/v3 (así lo dice el `V4-PLAN.md`). Solo habría que tocarlo si vas a +flashear una tarjeta de protoboard, y en ese caso se edita el `.ino`, no se pasa por la línea de +comandos. + !!! warning "El flag de destino de tarjeta no es cosmético" `TARGET_EINARBOARD` y `TARGET_PROTO` **invierten la polaridad del control de carga** (en producción `CHRG_EN` en alto = carga **apagada**; en protoboard `CHRG_RUN` en alto = carga diff --git a/docs/unidad.html b/docs/unidad.html new file mode 100644 index 0000000..8999c24 --- /dev/null +++ b/docs/unidad.html @@ -0,0 +1,240 @@ + + + + + +Expediente de la unidad — HBOX + + + +
+
+ +

Expediente de la unidad

+
Elige una unidad para ver todo su historial.
+
+ +
+ + + +
+ +
+
+ + + + + diff --git a/mkdocs.yml b/mkdocs.yml index bd0407b..268a0cf 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -51,6 +51,7 @@ nav: - "Cómo se diagnostica en banco": procedimientos/diagnostico-banco.md - "▶ Acta de diagnóstico en banco": formularios/banco.html - "⚡ Reflasheo de unidades": procedimientos/reflasheo-unidades.md + - "▶ Acta de reflasheo y configuración": formularios/reflasheo.html - "🏭 Producción — lote v5": - "1 · Prueba y flasheo de tarjetas": procedimientos/v5-prueba-y-flasheo.md @@ -74,6 +75,7 @@ nav: - "Firmware, parámetros 4G y ZED-F9P": descargas/index.md - "README firmware bring-up v5": descargas/hbox-v5-bringup-README.md + - "🗂 Expediente de una unidad": unidad.html - "📋 Actas — índice y cómo se usan": actas/index.md - "🌿 Git y archivos de diseño": diff --git a/scripts/sync-docs.sh b/scripts/sync-docs.sh index b9c6ca9..cbefcac 100644 --- a/scripts/sync-docs.sh +++ b/scripts/sync-docs.sh @@ -23,6 +23,7 @@ declare -a MAP=( "03-Architecture-Hardware/kicad/docs/GIT-GUIDE_External-Collaborators_EN.md|docs/git/git-guide-en.md" # Descargas para técnicos (firmware de bring-up v5) "04-Source-Code/firmware/hbox_v5_bringup/release/hbox-v5-bringup_0.5.1.bin|docs/descargas/hbox-v5-bringup_0.5.1.bin" + "04-Source-Code/firmware/hbox_v5_bringup/release/superseded/hbox-v5-bringup_0.4.0.bin|docs/descargas/hbox-v5-bringup_0.4.0.bin" "04-Source-Code/firmware/hbox_v5_bringup/release/SHA256SUMS|docs/descargas/SHA256SUMS.txt" "04-Source-Code/firmware/hbox_v5_bringup/README.md|docs/descargas/hbox-v5-bringup-README.md" )