From 2ce1d650b59ff9610781b7f2cd322a9fa29b6522 Mon Sep 17 00:00:00 2001 From: Labstream Date: Sat, 10 Oct 2026 10:54:09 -0500 Subject: [PATCH] Labmagic 1.0: control de la Blackmagic Pocket 4K por Bluetooth, panel para OBS y licencia MIT Co-Authored-By: Claude Fable 5.1 --- .gitignore | 10 + Compilar exe.bat | 18 + Iniciar Labmagic.bat | 8 + LICENCIA-ES.md | 53 + LICENSE | 21 + README.md | 138 +++ TERCEROS.md | 17 + app.py | 2457 ++++++++++++++++++++++++++++++++++++++++++ bmpcc_ble.py | 876 +++++++++++++++ dock.html | 370 +++++++ icono.ico | Bin 0 -> 35946 bytes icono.png | Bin 0 -> 3444 bytes iconos/opcion-1.ico | Bin 0 -> 33994 bytes iconos/opcion-1.png | Bin 0 -> 3034 bytes iconos/opcion-2.ico | Bin 0 -> 35946 bytes iconos/opcion-2.png | Bin 0 -> 3444 bytes iconos/opcion-3.ico | Bin 0 -> 32398 bytes iconos/opcion-3.png | Bin 0 -> 3215 bytes iconos/opcion-4.ico | Bin 0 -> 41953 bytes iconos/opcion-4.png | Bin 0 -> 4229 bytes iconos/opciones.png | Bin 0 -> 94135 bytes make_icon.py | 140 +++ obs_dock.py | 247 +++++ requirements.txt | 1 + 24 files changed, 4356 insertions(+) create mode 100644 .gitignore create mode 100644 Compilar exe.bat create mode 100644 Iniciar Labmagic.bat create mode 100644 LICENCIA-ES.md create mode 100644 LICENSE create mode 100644 README.md create mode 100644 TERCEROS.md create mode 100644 app.py create mode 100644 bmpcc_ble.py create mode 100644 dock.html create mode 100644 icono.ico create mode 100644 icono.png create mode 100644 iconos/opcion-1.ico create mode 100644 iconos/opcion-1.png create mode 100644 iconos/opcion-2.ico create mode 100644 iconos/opcion-2.png create mode 100644 iconos/opcion-3.ico create mode 100644 iconos/opcion-3.png create mode 100644 iconos/opcion-4.ico create mode 100644 iconos/opcion-4.png create mode 100644 iconos/opciones.png create mode 100644 make_icon.py create mode 100644 obs_dock.py create mode 100644 requirements.txt diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..14456c5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +# Estado local de la app +config.json +labmagic.log + +# Compilación +__pycache__/ +*.pyc +build/ +dist/ +*.spec diff --git a/Compilar exe.bat b/Compilar exe.bat new file mode 100644 index 0000000..207b693 --- /dev/null +++ b/Compilar exe.bat @@ -0,0 +1,18 @@ +@echo off +rem Genera dist\Labmagic.exe (un solo archivo, sin consola) con PyInstaller. +cd /d "%~dp0" +py -3.12 -m pip install --quiet pyinstaller bleak pillow +py -3.12 make_icon.py +py -3.12 -m PyInstaller --noconfirm --clean --onefile --windowed --name "Labmagic" ^ + --icon "%~dp0icono.ico" --add-data "%~dp0icono.png;." --add-data "%~dp0dock.html;." ^ + --collect-submodules winrt --collect-submodules bleak --copy-metadata bleak ^ + --workpath "%TEMP%\labmagic-build" --specpath "%TEMP%\labmagic-build" --distpath "%~dp0dist" app.py +if errorlevel 1 ( + echo. + echo Error al compilar. + pause +) else ( + echo. + echo Listo: "%~dp0dist\Labmagic.exe" + pause +) diff --git a/Iniciar Labmagic.bat b/Iniciar Labmagic.bat new file mode 100644 index 0000000..ec6b0e6 --- /dev/null +++ b/Iniciar Labmagic.bat @@ -0,0 +1,8 @@ +@echo off +cd /d "%~dp0" +py -3.12 app.py +if errorlevel 1 ( + echo. + echo La aplicacion ha terminado con error. Revisa el mensaje de arriba. + pause +) diff --git a/LICENCIA-ES.md b/LICENCIA-ES.md new file mode 100644 index 0000000..c3ca0b5 --- /dev/null +++ b/LICENCIA-ES.md @@ -0,0 +1,53 @@ +# Licencia y condiciones de uso (resumen en español) + +Labmagic es software de **Labstream S.A.S.** (NIT 900.665.024-5, Bogotá, Colombia) y se +distribuye bajo la **Licencia MIT**. El texto legal que vale es el del archivo `LICENSE` +(en inglés, como es habitual en esta licencia); esto es una explicación. + +## Qué puedes hacer + +- **Descargarlo, instalarlo y usarlo** gratis, para lo que quieras, también en trabajos + comerciales. +- **Copiarlo, modificarlo y redistribuirlo**, entero o en parte, con o sin cambios. +- Incluirlo en otros programas, incluso de pago. + +## Única condición + +- Conservar el aviso de copyright y el texto de la licencia (`LICENSE`) en cualquier copia o + parte sustancial del programa. + +## Sin garantía + +El programa se entrega **tal cual**, sin garantía de ningún tipo. Labstream no responde por +daños derivados de su uso. En concreto, Labmagic envía órdenes a una cámara real: cambia +ajustes, mueve el objetivo, inicia y detiene grabaciones y puede apagar la cámara. Úsalo con +criterio y comprueba la configuración antes de un rodaje. + +## Marcas y protocolo + +- **Blackmagic**, **Blackmagic Design**, **Pocket Cinema Camera** y **Blackmagic RAW** son + marcas de Blackmagic Design Pty. Ltd. Labmagic no es un producto de Blackmagic Design ni + está respaldado por ella. Usa el *Blackmagic Camera Control Protocol*, que Blackmagic + publica en el manual de sus cámaras para que terceros lo implementen. +- **Metabones** es marca de Metabones Inc. +- **OBS Studio** es un proyecto de la OBS Project, licencia GPL v2; Labmagic no lo modifica ni + lo incluye, solo se acopla a él como panel de navegador. +- **Labstream** y su logotipo son de Labstream S.A.S.: la licencia MIT cubre el código, no + autoriza a usar la marca ni el logotipo para presentar otro producto como de Labstream. + +## Datos personales + +Labmagic no envía datos a internet ni a Labstream. Guarda en este PC un `config.json` con la +dirección Bluetooth de la cámara y tus preferencias, y un `labmagic.log` con el registro de +la sesión. El panel para OBS escucha solo en `127.0.0.1` (este equipo). + +## Componentes de terceros + +Ver `TERCEROS.md`: Python, Tcl/Tk, bleak, pywinrt y PyInstaller, con sus licencias. + +## Aviso de Windows al descargar + +El ejecutable no lleva firma digital de pago. Windows puede mostrar «Windows protegió tu PC» +(SmartScreen): pulsa «Más información» y «Ejecutar de todas formas». En equipos con **Smart +App Control** activado el .exe no abre; ahí se usa el acceso directo con Python +(`README.md`, «Por qué el .exe no abre en este PC»). diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..7203e7f --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 Labstream S.A.S. (NIT 900.665.024-5), Bogotá, Colombia + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..3edae0f --- /dev/null +++ b/README.md @@ -0,0 +1,138 @@ +# Labmagic + +Aplicación sencilla de Windows para controlar una Blackmagic Pocket Cinema Camera por +Bluetooth LE: ver si está conectada, disparar el autofoco, mover foco y diafragma, grabar, +y ajustar ISO, obturador, balance de blancos, LUT y otras funciones. + +Probada el 8 de octubre de 2026 con la cámara `A:4A5A3B39` (dirección `90:FD:9F:C4:AD:B2`), +protocolo Blackmagic 0.1.0, Windows 11 y Python 3.12. + +## Cómo arrancarla + +- **En este PC**: icono «Labmagic» en el escritorio y en el menú Inicio. Abre la app sin + consola (usa el `pythonw.exe` firmado de Python 3.12, que Windows sí deja ejecutar). +- **En otro PC**: `dist\Labmagic.exe` (un solo archivo, sin consola, no necesita Python). + Tarda 2 o 3 segundos en abrir: no hace falta pulsar dos veces. +- **Desde el código**: doble clic en `Iniciar Labmagic.bat` (o `py -3.12 app.py`). + Requiere Python 3.12 y `bleak` 3.x (`py -3.12 -m pip install -r requirements.txt`). +- **Recompilar el .exe** tras cambiar el código: doble clic en `Compilar exe.bat`. + +### Por qué el .exe no abre en este PC + +Este equipo tiene activado **Smart App Control** de Windows 11. Bloquea cualquier .exe sin firma +digital con reputación, y cada compilación de PyInstaller es un archivo nuevo sin firma, así +que lo bloquea («Una directiva de Control de aplicaciones bloqueó este archivo», evento 3118 +de CodeIntegrity). Por eso aquí la app se lanza con los accesos directos a `pythonw.exe`. +Opciones para que el .exe funcione en este PC: firmarlo con un certificado de firma de código +reconocido, o desactivar Smart App Control (Seguridad de Windows > Control de aplicaciones y +navegador; una vez apagado no se puede volver a encender sin reinstalar Windows). En un PC sin +Smart App Control el .exe abre sin más. + +Probado el 8 de octubre de 2026 con el .exe y la cámara real: conexión, autofoco, barras de +color, grabar y parar (la cámara confirma cada orden y el timecode corre durante la grabación). + +## Panel dentro de OBS + +Labmagic sirve una versión web de su panel mini en `http://127.0.0.1:8790/` (archivos +`obs_dock.py` y `dock.html`). OBS Studio 28 o superior la puede acoplar como un dock más con +**Docks → Custom Browser Docks** (nombre `Labmagic`, esa URL). El panel habla con la app, que es +quien tiene la conexión Bluetooth (la cámara solo admite un proceso a la vez): si Labmagic no está +abierta, el dock lo avisa y se conecta solo en cuanto la abres. + +- Tiene lo mismo que la vista mini: HUD con timecode y celdas FPS · SHUTTER · IRIS · ISO · WB · + TINT (pulsables, abren una hoja inferior estilo cámara), AF, PEAK (clic derecho: color), zebra, + falso color, AF auto, foco e iris con pasos, REC, línea de formato y «abrir Labmagic». +- Teclado con el dock enfocado: espacio = AF, ← → = foco (Mayús = pasos grandes). +- En **AJUSTES → Panel para OBS** se apaga o enciende, se copia la URL y el botón **Añadir a OBS** + lo registra en OBS (con OBS cerrado; guarda copia `user.ini.labmagic.bak`). Si el puerto 8790 + está ocupado la app prueba los siguientes y guarda el elegido en `config.json` (`obs_port`). + +## Uso + +1. **Emparejar la cámara** con el botón **Emparejar (PIN)** de la app: quita el emparejamiento + viejo de Windows, pide uno nuevo y abre una ventana para escribir el PIN de 6 cifras que la + cámara muestra en pantalla (en la cámara, Bluetooth activado en Ajustes > Setup). Hay que + repetirlo si la cámara olvida el PC (la app lo avisa: «acceso denegado al servicio de control» + y el estado dice «Hace falta emparejar»). También vale emparejar desde Configuración de + Windows > Bluetooth y dispositivos. +2. Abrir la app. Busca sola las cámaras emparejadas y las que se anuncian y, con **Conectar al + abrir** activado (por defecto), conecta sola con la cámara de la última vez. Si no, elige la de + la lista y pulsa **Conectar**. El punto verde y la línea de estado indican conexión, cámara + encendida, versión de protocolo y alimentación. +3. **HUD superior, como la pantalla de la Pocket**: timecode en grande (se pone rojo y parpadea + un punto al grabar) y las celdas FPS · SHUTTER · IRIS · ISO · WB · TINT con los valores actuales. + Pulsar una celda abre un menú rápido: ángulos y velocidades de obturador, f/ del diafragma + (y Auto iris), ISO, Kelvin (y Auto WB) y tinte. +4. **Organización como la cámara, en pestañas**: PRINCIPAL (enfoque, diafragma y zoom, ISO / + obturador / balance de blancos, REC), GRABACIÓN (formato, códec, rango dinámico, + autoexposición), MONITOR (ayudas y overlays por salida, LUT, barras, reset de color) y AJUSTES + (cámara, emparejar, conectar al abrir, apagar, registro). El HUD queda siempre arriba. +5. Controles: + - **Enfoque**: botón grande de autofoco (también con la **barra espaciadora**); junto a él el + conmutador **PEAKING** (focus assist con líneas de color, color elegible: rojo, verde, azul, + blanco o negro) para ver dónde está enfocando; **AF automático cada N segundos** para mantener + enfocado a alguien sin tocar nada; deslizador de foco manual y pasos ◀ ▶. + **Con objetivos EF por adaptador (24-105 con el Metabones 0.64x) hace falta el firmware del + adaptador al día** (Metabones App, V5.10 en oct-2026): con el firmware viejo la cámara ignoraba + AF y foco manual; con el nuevo, medido el 9-oct-2026 sobre el HDMI, el AF, las posiciones + absolutas (0,05 / 0,5 / 0,95) y los pasos relativos (±0,2) mueven el objetivo. El objetivo EF + sigue sin informar de su posición: la app muestra la última posición enviada y tras un AF la + da por desconocida («—») hasta que se mueve el deslizador. Flechas ← → = pasos de 0,01, + con Mayús = 0,05; barra espaciadora = AF. + **Verificación del AF (9-oct-2026)**: el paquete que envía la app es byte a byte el del ejemplo + oficial del manual (`ff 04 00 00 00 01 00 00`). Midiendo la nitidez del HDMI en OBS a 10 + muestras/s, las barras de color y el auto iris cambian la imagen al instante, pero tras el AF + el objetivo no se mueve nada (ni barrido ni cambio). Es decir, la cámara recibe la orden y el + objetivo no la ejecuta. Lista de comprobación: (1) interruptor del objetivo en **AF**; + (2) pulsar el botón **Focus** físico de la cámara: si tampoco enfoca, el adaptador no da AF con + ese objetivo (Metabones XL 0.64x necesita firmware 3.x actualizado con la app de Metabones por + USB; Viltrox EF-M2 igual); (3) si el botón físico enfoca y la app no, avisar para investigar. + - **Diafragma**: auto iris, deslizador 0 (abierto) a 1 (cerrado) y pasos; se muestra el f/ real + que informa la cámara. + - **Zoom**: deslizador para objetivos motorizados; la focal en mm se muestra siempre. + - **Grabación**: botón GRABAR / PARAR, estado de transporte, formato y códec. Debajo, el panel + **Formato de grabación**: códec (BRAW Q0/Q1/Q3/Q5/3:1/5:1/8:1/12:1, ProRes HQ/422/LT/Proxy), + resolución (DCI 4K, 4096×1720, UHD, 2.6K, HD), fotogramas (23.98 a 60), fotogramas del sensor + para off-speed y ventana del sensor; **Aplicar formato** envía códec (10.0) y formato (1.9). La + cámara responde con el formato real que ha aceptado y el panel se actualiza con él. + - **Monitor y utilidades**: selector **Aplicar en** (HDMI, pantalla LCD o ambas; por defecto HDMI + porque la cámara va remota). Las ayudas (zebra, peaking, falso color) y los overlays (texto de + estado, guías de encuadre, señal limpia) se envían con el campo «pantallas destino» del + protocolo (4.1 y 3.0), así que afectan solo a la salida elegida. + - **Exposición y color**: ISO, ángulo o velocidad de obturador, balance de blancos (Kelvin y + tinte, presets y Auto WB), modo de autoexposición, rango dinámico y LUT de monitor. + - **Monitor y utilidades**: zebra, peaking, falso color, barras de color, reset de corrección + de color y apagar la cámara (con confirmación). + - **Registro**: todo lo que se envía y lo que la cámara responde, con nombres legibles. + +## Detalles que conviene saber + +- **Al conectar, la app pide a la cámara toda su configuración.** La cámara solo la envía sola + cuando el enlace Bluetooth es nuevo, pero escribir el valor 0x21 (Camera Ready sin «Initial + Payload Received») en la característica Camera Status hace que la reenvíe siempre. Así el HUD + (FPS, obturador, iris, ISO, WB, tinte), el formato, el códec y el objetivo se rellenan en unos + 6 segundos tras cada conexión, aunque Windows reutilice un enlace ya abierto. +- En este firmware la operación «offset» del protocolo se comporta como asignación absoluta, + por eso los pasos ◀ ▶ del diafragma solo se activan cuando se conoce el valor actual. +- Las ayudas de monitor (zebra, peaking, falso color) y el apagado por Bluetooth dependen del + firmware; si no cambian nada en la cámara es que no las acepta por este canal. +- Los nombres de las variantes de códec (BRAW 5:1, ProRes HQ, etc.) siguen la tabla del + Blackmagic Camera Control Developer Guide; si alguno no coincide con la cámara, es solo etiqueta. +- `config.json` guarda la última cámara usada y el tamaño de la ventana. +- Solo puede haber una copia abierta: si se vuelve a lanzar, trae al frente la que ya está. +- Estética: negro y gris oscuro como la pantalla de la cámara, barra de título oscura. Icono: + cuadrado rojo con bordes redondeados, borde blanco y el «lab» del wordmark real de Labstream + más un punto blanco (opción 2 de `iconos/opciones.png`; `make_icon.py` genera las cuatro + opciones a partir de `0_Modelo Propuestas/Logos/Logo Blanco.png`; para cambiarla, ajusta + `OPCION_POR_DEFECTO` y vuelve a ejecutarlo). +- El «acceso denegado al servicio de control» al conectar casi siempre significa que otra + aplicación de este PC ya está conectada a la cámara (otra copia de Labmagic, un script o la + ventana de Configuración > Bluetooth); solo si no es eso hay que volver a emparejar. + +## Archivos + +- `app.py`: ventana (Tkinter). +- `bmpcc_ble.py`: protocolo Blackmagic Camera Control sobre BLE (bleak), búsqueda de cámaras + emparejadas y anunciadas, envío y decodificación de parámetros. +- `Iniciar Labmagic.bat`: lanzador. +- `requirements.txt`: dependencias de Python. diff --git a/TERCEROS.md b/TERCEROS.md new file mode 100644 index 0000000..f1e07b1 --- /dev/null +++ b/TERCEROS.md @@ -0,0 +1,17 @@ +# Componentes de terceros incluidos o usados por Labmagic + +| Componente | Para qué | Licencia | Dónde | +|---|---|---|---| +| Python 3.12 | lenguaje y biblioteca estándar | PSF License (compatible con MIT, permite redistribuir) | https://www.python.org/ | +| Tcl/Tk (tkinter) | ventanas y controles | Tcl/Tk License (tipo BSD) | https://www.tcl.tk/ | +| bleak 3.x | Bluetooth LE en Windows | MIT | https://github.com/hbldh/bleak | +| pywinrt (winrt-*) | acceso a la API de Windows para emparejar | MIT | https://github.com/pywinrt/pywinrt | +| PyInstaller | empaqueta `Labmagic.exe` | GPL 2.0 con excepción del *bootloader*: el ejecutable resultante puede distribuirse bajo la licencia del programa (MIT) | https://pyinstaller.org/ | +| Fuentes Segoe UI y Consolas | tipografía de la interfaz | vienen con Windows; no se redistribuyen | Microsoft | +| Blackmagic Camera Control Protocol | órdenes a la cámara por Bluetooth | protocolo publicado por Blackmagic Design en el manual de sus cámaras para implementaciones de terceros; no incluye código de Blackmagic | https://www.blackmagicdesign.com/ | + +Ninguno de estos componentes obliga a publicar el código de Labmagic; aun así, se publica +entero bajo MIT en https://git.labstreamsas.com/Labstream/labmagic. + +Los textos completos de PSF, Tcl/Tk, MIT y GPL 2.0 con excepción se encuentran en los enlaces +indicados y dentro del paquete de cada componente (`py -3.12 -m pip show -f bleak`, etc.). diff --git a/app.py b/app.py new file mode 100644 index 0000000..a1c25a3 --- /dev/null +++ b/app.py @@ -0,0 +1,2457 @@ +""" +BMPCC Control: ventana para controlar una Blackmagic Pocket Cinema Camera por +Bluetooth LE desde Windows, con estética de la propia cámara (negro, HUD superior). + +Ejecutar: py -3.12 app.py (o "dist\\BMPCC Control.exe") +""" +import ctypes +import json +import os +import queue +import sys +import time +import tkinter as tk +import tkinter.font as tkfont +from tkinter import messagebox, simpledialog, ttk + +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) +from bmpcc_ble import PARAM_NAMES, BleWorker, Camera, decode_data # noqa: E402 +from obs_dock import DEFAULT_PORT, DockServer, obs_add_browser_dock # noqa: E402 + +APP_TITLE = "Labmagic · control Blackmagic Pocket por Bluetooth" +APP_DIR = os.path.dirname(os.path.abspath(sys.executable if getattr(sys, "frozen", False) else __file__)) +CONFIG_PATH = os.path.join(APP_DIR, "config.json") +LOG_PATH = os.path.join(APP_DIR, "labmagic.log") + +# ----------------------------------------------------------------- paleta +BG = "#0d0d0d" # fondo de la ventana +HUD = "#000000" # franja superior +BAR = "#141414" # barra de conexión +CARD = "#181818" # paneles +BORDER = "#2a2a2a" +FIELD = "#242424" # cajas de texto / combos +BTN = "#2b2b2b" +BTN_HOVER = "#3c3c3c" +BTN_PRESS = "#555555" +TROUGH = "#303030" +KNOB = "#ececec" +FG = "#f3f3f3" +MUTED = "#9b9b9b" +DIM = "#555555" +REC = "#e3262c" +LED_ON = "#3ad66c" +LED_BUSY = "#f0a500" +LED_OFF = "#4a4a4a" + +ISO_VALUES = [100, 125, 160, 200, 250, 320, 400, 500, 640, 800, 1000, 1250, 1600, 2000, 2500, + 3200, 4000, 5000, 6400, 8000, 10000, 12800, 16000, 20000, 25600] +SHUTTER_ANGLES = [11.2, 15, 22.5, 30, 37.5, 45, 60, 72, 90, 108, 120, 144, 150, 172.8, 180, 216, 270, 360] +SHUTTER_SPEEDS = [24, 25, 30, 48, 50, 60, 100, 120, 125, 200, 250, 500, 1000, 2000] +FSTOPS = [1.4, 1.8, 2.0, 2.8, 3.5, 4.0, 4.5, 5.6, 6.3, 8.0, 11, 16, 22] +WB_PRESETS = [ + ("Tungsteno 3200 K", 3200, 0), + ("Fluorescente 4000 K", 4000, 15), + ("Luz día 5600 K", 5600, 10), + ("Nublado 6500 K", 6500, 10), + ("Sombra 7500 K", 7500, 10), +] +WB_QUICK = [2500, 3200, 4000, 4500, 5000, 5600, 6500, 7500, 8000, 10000] +AE_MODES = ["Manual", "Iris", "Obturador", "Iris + Obturador", "Obturador + Iris"] +DR_MODES = ["Film", "Video", "Extended Video"] +LUTS = ["Ninguna", "Personalizada", "Film a Video", "Film a Extended Video"] +CODECS = {0: "CinemaDNG", 1: "DNxHD", 2: "ProRes", 3: "Blackmagic RAW"} +CODEC_VARIANTS = { + 0: {0: "sin comprimir", 1: "3:1", 2: "4:1"}, + 2: {0: "HQ", 1: "422", 2: "LT", 3: "Proxy", 4: "444", 5: "444 XQ"}, + 3: {0: "Q0", 7: "Q1", 8: "Q3", 1: "Q5", 2: "3:1", 3: "5:1", 4: "8:1", 5: "12:1"}, +} +# Opciones del panel de formato (etiqueta, códec básico, variante) +CODEC_CHOICES = [ + ("BRAW Q0", 3, 0), ("BRAW Q1", 3, 7), ("BRAW Q3", 3, 8), ("BRAW Q5", 3, 1), + ("BRAW 3:1", 3, 2), ("BRAW 5:1", 3, 3), ("BRAW 8:1", 3, 4), ("BRAW 12:1", 3, 5), + ("ProRes HQ", 2, 0), ("ProRes 422", 2, 1), ("ProRes LT", 2, 2), ("ProRes Proxy", 2, 3), +] +RESOLUTIONS = [ + ("4096×2160 DCI 4K", 4096, 2160), + ("4096×1720 2.4:1", 4096, 1720), + ("3840×2160 UHD", 3840, 2160), + ("2688×1512 2.6K", 2688, 1512), + ("1920×1080 HD", 1920, 1080), +] +FPS_CHOICES = ["23.98", "24", "25", "29.97", "30", "50", "59.94", "60"] +SENSOR_FPS_CHOICES = ["23.98", "24", "25", "29.97", "30", "48", "50", "59.94", "60", "100", "120"] +M_RATE = {"23.98": 24, "29.97": 30, "59.94": 60} +SHARPEN = ["Off", "Baja", "Media", "Alta"] +AUDIO_INPUTS = ["Micro interno", "Línea", "Micro nivel bajo", "Micro nivel alto"] +GUIDE_STYLES = ["Off", "2.4:1", "2.39:1", "2.35:1", "1.85:1", "16:9", "14:9", "4:3", "2:1", "4:5", "1:1"] +SHOT_TAGS = ["—", "WS", "CU", "MS", "BCU", "MCU", "ECU"] # índice - 1 = valor del protocolo (-1 = ninguna) +TAKE_TAGS = ["—", "PU", "VFX", "SER"] # índice - 1 = valor del protocolo +WB_PRESET_CHIPS = [("☀ Día", 5600, 10), ("💡 Tungst.", 3200, 0), ("▭ Fluor.", 4000, 15), ("☁ Nublado", 6500, 10), ("⌂ Sombra", 7500, 10)] + + +def fps_label(fps: int, m_rate: bool) -> str: + if m_rate: + for label, base in M_RATE.items(): + if base == fps: + return label + return f"{fps * 1000 / 1001:.2f}" + return str(fps) + + +def fps_parse(label: str): + """Devuelve (fps entero, M-rate) a partir de la etiqueta del combo.""" + if label in M_RATE: + return M_RATE[label], True + try: + return int(float(label)), False + except ValueError: + return 0, False + + +def load_config(): + try: + with open(CONFIG_PATH, "r", encoding="utf-8") as f: + return json.load(f) + except Exception: # noqa: BLE001 + return {} + + +def save_config(cfg): + try: + with open(CONFIG_PATH, "w", encoding="utf-8") as f: + json.dump(cfg, f, indent=2, ensure_ascii=False) + except Exception: # noqa: BLE001 + pass + + +def single_instance_or_focus() -> bool: + """Devuelve False si ya hay otra copia abierta (y la trae al frente).""" + try: + k32 = ctypes.windll.kernel32 + handle = k32.CreateMutexW(None, True, "Local\\Labmagic.SingleInstance") + if k32.GetLastError() == 183: # ERROR_ALREADY_EXISTS + u32 = ctypes.windll.user32 + hwnd = u32.FindWindowW(None, APP_TITLE) + if hwnd: + u32.ShowWindow(hwnd, 9) + u32.SetForegroundWindow(hwnd) + return False + globals()["_mutex_handle"] = handle + except Exception: # noqa: BLE001 + pass + return True + + +def make_icon(size=64) -> tk.PhotoImage: + """Icono dibujado a mano: aro gris y punto rojo sobre negro (como el REC de la cámara).""" + img = tk.PhotoImage(width=size, height=size) + c = size / 2 + rows = [] + for y in range(size): + row = [] + for x in range(size): + d = ((x + 0.5 - c) ** 2 + (y + 0.5 - c) ** 2) ** 0.5 + if d <= size * 0.30: + row.append(REC) + elif size * 0.40 <= d <= size * 0.47: + row.append("#d0d0d0") + else: + row.append("#101010") + rows.append("{" + " ".join(row) + "}") + img.put(" ".join(rows)) + return img + + +# ------------------------------------------------------------ widgets +class DarkSlider(tk.Canvas): + """Deslizador plano al estilo de la cámara: pista gris, tramo blanco y mando redondo.""" + + def __init__(self, parent, command=None, height=28, bg=CARD, **kw): + kw.setdefault("width", 120) # el Canvas de Tk pide 378 px por defecto y dispara el ancho de la ventana + super().__init__(parent, height=height, bg=bg, highlightthickness=0, **kw) + self._bg = bg + self.command = command + self.value = 0.0 + self.enabled = False + self._drag = False + self.bind("", lambda e: self._draw()) + self.bind("", self._press) + self.bind("", self._motion) + self.bind("", self._release) + + def _geom(self): + w = self.winfo_width() + pad = 12 + return pad, max(w - pad, pad + 1) + + def _draw(self): + self.delete("all") + x0, x1 = self._geom() + y = max(self.winfo_height() // 2, 1) + track = TROUGH if self.enabled else "#1f1f1f" + fill = KNOB if self.enabled else "#3a3a3a" + self.create_line(x0, y, x1, y, fill=track, width=4, capstyle="round") + xv = x0 + (x1 - x0) * self.value + if xv > x0: + self.create_line(x0, y, xv, y, fill=fill, width=4, capstyle="round") + r = 9 + self.create_oval(xv - r, y - r, xv + r, y + r, fill=fill, outline=self._bg, width=2) + + def set(self, v): + self.value = max(0.0, min(1.0, float(v))) + self._draw() + + def get(self): + return self.value + + def set_enabled(self, on): + self.enabled = bool(on) + self.configure(cursor="hand2" if on else "") + self._draw() + + def _press(self, e): + if not self.enabled: + return + self._drag = True + self._update(e.x) + + def _motion(self, e): + if self._drag: + self._update(e.x) + + def _release(self, _e): + self._drag = False + + def _update(self, x): + x0, x1 = self._geom() + self.set((x - x0) / (x1 - x0)) + if self.command: + self.command(self.value) + + +class HudCell(tk.Frame): + """Celda del HUD: etiqueta pequeña arriba y valor grande debajo (FPS, SHUTTER, IRIS...).""" + + def __init__(self, parent, label, font_value, on_click=None): + super().__init__(parent, bg=HUD, padx=18, pady=6) + self.on_click = on_click + self.lbl = tk.Label(self, text=label, bg=HUD, fg=MUTED, font=("Segoe UI", 7)) + self.val = tk.Label(self, text="—", bg=HUD, fg=FG, font=font_value) + self.lbl.pack() + self.val.pack() + # Señal de pulsable: línea fina bajo el valor en las celdas que abren un selector + self.under = tk.Frame(self, bg="#555555" if on_click else HUD, height=2) + self.under.pack(fill="x", padx=6, pady=(1, 0)) + self.configure(padx=6, pady=3) + for w in (self, self.lbl, self.val): + w.bind("", lambda e: self._hover(True)) + w.bind("", lambda e: self._hover(False)) + w.bind("", self._click) + if on_click: + self.configure(cursor="hand2") + + def _hover(self, on): + color = "#1a1a1a" if (on and self.on_click) else HUD + for w in (self, self.lbl, self.val): + w.configure(bg=color) + if self.on_click: + self.under.configure(bg=FG if on else "#555555") + + def _click(self, e): + if self.on_click: + self.on_click(e) + + def set(self, text, color=FG): + self.val.configure(text=text, fg=color) + + +# ---------------------------------------------------------------- app +class Tooltip: + """Globo de ayuda oscuro al pasar el ratón (sustituye a las notas largas en los paneles).""" + + def __init__(self, widget, text, delay=600): + self.widget, self.text, self.delay = widget, text, delay + self._id = None + self._win = None + widget.bind("", self._schedule, add="+") + widget.bind("", self._hide, add="+") + widget.bind("", self._hide, add="+") + + def _schedule(self, _e=None): + self._cancel() + self._id = self.widget.after(self.delay, self._show) + + def _cancel(self): + if self._id: + try: + self.widget.after_cancel(self._id) + except tk.TclError: + pass + self._id = None + + def _show(self): + if self._win or not self.text: + return + x = self.widget.winfo_rootx() + 10 + y = self.widget.winfo_rooty() + self.widget.winfo_height() + 6 + self._win = tk.Toplevel(self.widget) + self._win.overrideredirect(True) + self._win.attributes("-topmost", True) + lbl = tk.Label(self._win, text=self.text, bg="#2a2a2a", fg=FG, font=("Segoe UI", 9), justify="left", + wraplength=320, padx=8, pady=5, highlightthickness=1, highlightbackground="#555") + lbl.pack() + self._win.geometry(f"+{x}+{y}") + + def _hide(self, _e=None): + self._cancel() + if self._win: + try: + self._win.destroy() + except tk.TclError: + pass + self._win = None + + +class Picker(tk.Toplevel): + """Panel desplegable oscuro al estilo de la cámara: título, valor en grande y cuerpo a medida.""" + + def __init__(self, app, anchor, title, width=330): + super().__init__(app) + self.app = app + self.overrideredirect(True) + self.attributes("-topmost", True) + self.configure(bg="#161616", highlightthickness=1, highlightbackground="#4a4a4a") + head = tk.Frame(self, bg="#161616") + head.pack(fill="x", padx=12, pady=(10, 4)) + tk.Label(head, text=title.upper(), bg="#161616", fg=MUTED, font=("Segoe UI", 8)).pack(side="left") + self.value_lbl = tk.Label(head, text="", bg="#161616", fg=FG, font=app.F_TC_SMALL) + self.value_lbl.pack(side="right") + self.body = tk.Frame(self, bg="#161616") + self.body.pack(fill="both", expand=True, padx=12, pady=(0, 10)) + self._width = width + x = anchor.winfo_rootx() + anchor.winfo_width() // 2 - width // 2 + y = anchor.winfo_rooty() + anchor.winfo_height() + 4 + # Dentro del ancho de la ventana principal (y de la pantalla) + left, right = app.winfo_rootx(), app.winfo_rootx() + app.winfo_width() + x = max(left, min(x, right - width)) + x = max(8, min(x, self.winfo_screenwidth() - width - 8)) + self.geometry(f"+{x}+{y}") + self.bind("", lambda e: self.close()) + self.after(50, self._arm) + + def _arm(self): + try: + self.focus_force() + self.grab_set() + except tk.TclError: + pass + self.bind("", self._click, add="+") + + def _click(self, e): + # Con grab_set, los clics fuera del panel llegan aquí con coordenadas fuera de la ventana + if not (0 <= e.x_root - self.winfo_rootx() <= self.winfo_width() + and 0 <= e.y_root - self.winfo_rooty() <= self.winfo_height()): + self.close() + + def set_value(self, text): + self.value_lbl.configure(text=text) + + def chip(self, parent, text, on, cmd, dim=False, width=None): + bg = FG if on else ("#1e1e1e" if dim else "#2b2b2b") + fg = "#000000" if on else ("#8a8a8a" if dim else FG) + lbl = tk.Label(parent, text=text, bg=bg, fg=fg, font=self.app.F_UI, padx=8, pady=3, cursor="hand2", + width=width) + lbl.bind("", lambda e: cmd()) + if not on: + lbl.bind("", lambda e: lbl.configure(bg="#3c3c3c")) + lbl.bind("", lambda e: lbl.configure(bg="#1e1e1e" if dim else "#2b2b2b")) + return lbl + + def chips(self, items, current, cmd, per_row=6, dim_set=()): + """items: lista de (texto, valor). Dibuja filas de chips; el actual en blanco; dim_set en gris.""" + rowf = None + for i, (text, value) in enumerate(items): + if i % per_row == 0: + rowf = tk.Frame(self.body, bg="#161616") + rowf.pack(fill="x", pady=2) + c = self.chip(rowf, text, value == current, lambda v=value: cmd(v), dim=value in dim_set) + c.pack(side="left", padx=(0, 4), fill="x", expand=True) + + def close(self): + try: + self.grab_release() + except tk.TclError: + pass + try: + self.destroy() + except tk.TclError: + pass + if self.app._picker is self: + self.app._picker = None + + +class App(tk.Tk): + def __init__(self): + super().__init__() + self.title(APP_TITLE) + self.configure(bg=BG) + self.minsize(380, 300) + self.cfg = load_config() + + # Icono: PNG generado por make_icon.py (wordmark Labstream sobre rojo); si falta, uno dibujado + self._icon = None + for folder in (APP_DIR, getattr(sys, "_MEIPASS", None)): + if folder and os.path.exists(os.path.join(folder, "icono.png")): + try: + self._icon = tk.PhotoImage(file=os.path.join(folder, "icono.png")) + break + except Exception: # noqa: BLE001 + self._icon = None + if self._icon is None: + self._icon = make_icon() + try: + self.iconphoto(True, self._icon) + except Exception: # noqa: BLE001 + pass + + self.events = queue.Queue() + self.worker = BleWorker() + self.cam = Camera(self.events) + + self.devices = [] + self.connected = False + self.recording = False + self._pending = {} + self._flush_scheduled = False + self.focus_value = None + self.aperture_value = None + self.zoom_value = None + self.wb_kelvin = None + self.wb_tint = 0 + self._payload_count = 0 + self._connect_time = None + self._payload_warned = False + self._blink = False + self._lens_iris_text = None + self._link_held = False + self._autoconnected = False + self._lens_type = None + self._focus_reported = False + self._af_hint_shown = False + + self._notice = None + self.web_cmds = queue.Queue() + self.dock = DockServer(self.web_cmds, int(self.cfg.get("obs_port", DEFAULT_PORT))) + self.dock_running = False + if self.cfg.get("obs_dock", True): + self.dock_running = self.dock.start() + if self.dock_running and self.cfg.get("obs_port") != self.dock.port: + self.cfg["obs_port"] = self.dock.port + save_config(self.cfg) + + self._setup_fonts() + self._setup_styles() + self._build_ui() + if self.cfg.get("obs_dock", True) and not self.dock_running: + self.after(800, lambda: self.notify(self.dock.error or "No se pudo abrir el panel para OBS", "warn", 8)) + self.protocol("WM_DELETE_WINDOW", self.on_close) + self._poll_id = self.after(50, self._poll_events) + self.after(100, self._dark_title_bar) + self.after(300, self.scan) + self.after(600, self._blink_tick) + self.after(5000, self._af_tick) + self.bind_all("", self._space_af) + self.bind_all("", lambda e: self._arrow_focus(e, -0.01)) + self.bind_all("", lambda e: self._arrow_focus(e, 0.01)) + self.bind_all("", lambda e: self._arrow_focus(e, -0.05)) + self.bind_all("", lambda e: self._arrow_focus(e, 0.05)) + + # ------------------------------------------------------------ estilo + def _setup_fonts(self): + fams = set(tkfont.families()) + + def pick(*cands): + for c in cands: + if c in fams: + return c + return "Segoe UI" + + display = pick("Bahnschrift SemiBold", "Bahnschrift", "Segoe UI Semibold") + self.F_UI = ("Segoe UI", 10) + self.F_SMALL = ("Segoe UI", 8) + self.F_TITLE = (pick("Segoe UI Semibold", "Segoe UI"), 9) + self.F_VALUE = (display, 15) + self.F_TC = (display, 24) + self.F_TC_SMALL = (display, 20) + self.F_BIG = (pick("Segoe UI Semibold", "Segoe UI"), 13) + self.F_MONO = (pick("Cascadia Mono", "Consolas"), 9) + + def _setup_styles(self): + style = ttk.Style(self) + style.theme_use("clam") + style.configure(".", background=CARD, foreground=FG, fieldbackground=FIELD, bordercolor=BORDER, + lightcolor=CARD, darkcolor=CARD, troughcolor=TROUGH, font=self.F_UI, + focuscolor=CARD, selectbackground=FIELD, selectforeground=FG) + style.configure("TFrame", background=CARD) + style.configure("TLabel", background=CARD, foreground=FG) + style.configure("TButton", background=BTN, foreground=FG, bordercolor=BORDER, lightcolor=BTN, + darkcolor=BTN, padding=(12, 6), relief="flat", focuscolor=BTN) + style.map("TButton", + background=[("disabled", "#1e1e1e"), ("pressed", BTN_PRESS), ("active", BTN_HOVER)], + foreground=[("disabled", DIM)], + lightcolor=[("pressed", BTN_PRESS), ("active", BTN_HOVER)], + darkcolor=[("pressed", BTN_PRESS), ("active", BTN_HOVER)]) + style.configure("Big.TButton", font=self.F_BIG, padding=(12, 12)) + style.configure("Danger.TButton", foreground="#ff8a8a") + # Conmutadores: botón que se enciende en blanco cuando está activo (como la cámara) + style.configure("Toolbutton", background=BTN, foreground=FG, bordercolor=BORDER, lightcolor=BTN, + darkcolor=BTN, padding=(12, 6), relief="flat", focuscolor=BTN, anchor="center") + # Conmutador encendido: gris claro con borde rojo (distinto de las pestañas, que van subrayadas) + style.map("Toolbutton", + background=[("disabled", "#1e1e1e"), ("selected", "#3d3d3d"), ("active", BTN_HOVER)], + foreground=[("disabled", DIM), ("selected", FG)], + bordercolor=[("selected", REC)], + lightcolor=[("selected", REC)], darkcolor=[("selected", REC)]) + style.configure("Toolbutton", padding=(8, 4)) + style.configure("TButton", padding=(8, 4)) + style.configure("Big.TButton", padding=(8, 7)) + style.configure("TCombobox", fieldbackground=FIELD, background=BTN, foreground=FG, arrowcolor=FG, + bordercolor=BORDER, lightcolor=FIELD, darkcolor=FIELD, padding=(6, 4), arrowsize=14) + style.map("TCombobox", + fieldbackground=[("disabled", "#1c1c1c"), ("readonly", FIELD)], + foreground=[("disabled", DIM)], + selectbackground=[("readonly", FIELD)], selectforeground=[("readonly", FG)], + arrowcolor=[("disabled", DIM)]) + style.configure("TSpinbox", fieldbackground=FIELD, background=BTN, foreground=FG, arrowcolor=FG, + bordercolor=BORDER, lightcolor=FIELD, darkcolor=FIELD, insertcolor=FG, padding=(6, 4), + arrowsize=14) + style.map("TSpinbox", fieldbackground=[("disabled", "#1c1c1c")], foreground=[("disabled", DIM)], + arrowcolor=[("disabled", DIM)]) + style.configure("Vertical.TScrollbar", background=BTN, troughcolor=BG, bordercolor=BG, + arrowcolor=MUTED, lightcolor=BTN, darkcolor=BTN) + style.map("Vertical.TScrollbar", background=[("active", BTN_HOVER)]) + # Lista desplegable de los combos + self.option_add("*TCombobox*Listbox.background", FIELD) + self.option_add("*TCombobox*Listbox.foreground", FG) + self.option_add("*TCombobox*Listbox.selectBackground", FG) + self.option_add("*TCombobox*Listbox.selectForeground", "#000000") + self.option_add("*TCombobox*Listbox.font", self.F_UI) + self.option_add("*TCombobox*Listbox.borderWidth", 0) + + def _dark_title_bar(self): + """Barra de título oscura (Windows 10 20H1+ / 11) mediante DWM.""" + try: + self.update_idletasks() + hwnd = ctypes.windll.user32.GetParent(self.winfo_id()) + value = ctypes.c_int(1) + for attr in (20, 19): + if ctypes.windll.dwmapi.DwmSetWindowAttribute(hwnd, attr, ctypes.byref(value), 4) == 0: + break + # Forzar el repintado del marco + g = self.geometry() + w, h, rest = g.split("x")[0], g.split("x")[1].split("+")[0], g.split("+", 1)[1] + self.geometry(f"{int(w) + 1}x{h}+{rest}") + self.after(30, lambda: self.geometry(g)) + except Exception: # noqa: BLE001 + pass + + # ---------------------------------------------------------------- UI + def _card(self, parent, title): + outer = tk.Frame(parent, bg=CARD, highlightbackground=BORDER, highlightthickness=1) + tk.Label(outer, text=title.upper(), bg=CARD, fg=MUTED, font=self.F_TITLE).pack( + anchor="w", padx=12, pady=(8, 2) + ) + inner = tk.Frame(outer, bg=CARD) + inner.pack(fill="both", expand=True, padx=12, pady=(0, 10)) + return outer, inner + + def _lbl(self, parent, text, muted=False, font=None, **kw): + kw.setdefault("bg", CARD) + return tk.Label(parent, text=text, fg=MUTED if muted else FG, font=font or self.F_UI, **kw) + + # ================================================================= interfaz + def _build_ui(self): + self._picker = None + self._pslider = {} + self._colour = {0: [0.0, 0.0, 0.0, 0.0], 1: [0.0, 0.0, 0.0, 0.0], 2: [1.0, 1.0, 1.0, 1.0], 3: [0.0, 0.0, 0.0, 0.0]} + self._contrast = [0.5, 1.0] + self._huesat = [0.0, 1.0] + self._guides = [0, 50, 90, 0] + self._audio_in = [0.5, 0.5] + self.expanded = bool(self.cfg.get("expanded", False)) + # Valores de exposición: ya no hay combos, los selectores del HUD y los presets usan estas variables + self.iso_var = tk.StringVar() + self.angle_var = tk.StringVar() + self.speed_var = tk.StringVar() + self.wb_var = tk.IntVar(value=5600) + self.tint_var = tk.IntVar(value=0) + self.wb_preset_var = tk.StringVar() + + # ------------------------------------------------ HUD mini (siempre visible) + hud = tk.Frame(self, bg=HUD) + hud.pack(fill="x") + top = tk.Frame(hud, bg=HUD) + top.pack(fill="x", padx=10, pady=(6, 0)) + top.columnconfigure(1, weight=1) + self.led = tk.Canvas(top, width=12, height=12, bg=HUD, highlightthickness=0) + self.led_item = self.led.create_oval(1, 1, 11, 11, fill=LED_OFF, outline="") + self.led.grid(row=0, column=0, padx=(0, 6)) + self.name_var = tk.StringVar(value="Sin cámara") + nl = tk.Label(top, textvariable=self.name_var, bg=HUD, fg=FG, font=self.F_TITLE, cursor="hand2") + nl.grid(row=0, column=1, sticky="w") + nl.bind("", lambda e: self.toggle_connect()) + Tooltip(nl, "Pulsa para conectar o desconectar") + self.tc_var = tk.StringVar(value="00:00:00:00") + self.tc_label = tk.Label(top, textvariable=self.tc_var, bg=HUD, fg=FG, font=self.F_TC) + self.tc_label.grid(row=0, column=2, rowspan=2, padx=8) + self.rec_dot = tk.Label(top, text="●", bg=HUD, fg=HUD, font=("Segoe UI", 11)) + self.rec_dot.grid(row=0, column=3, rowspan=2) + tools = tk.Frame(top, bg=HUD) + tools.grid(row=0, column=4, rowspan=2, sticky="e") + self.topmost_var = tk.BooleanVar(value=bool(self.cfg.get("topmost", True))) + b = ttk.Checkbutton(tools, text="📌", variable=self.topmost_var, style="Toolbutton", width=3, + command=self._apply_topmost) + b.pack(side="left") + Tooltip(b, "Siempre encima de OBS y del resto de ventanas") + self.expand_btn = ttk.Button(tools, text="⇱", width=3, command=self.toggle_expand) + self.expand_btn.pack(side="left", padx=(4, 0)) + Tooltip(self.expand_btn, "Ampliar o plegar: muestra las pestañas con el resto de ajustes") + self.status_var = tk.StringVar(value="Desconectada") + tk.Label(top, textvariable=self.status_var, bg=HUD, fg=MUTED, font=self.F_SMALL).grid( + row=1, column=0, columnspan=2, sticky="w") + self.lens_var = tk.StringVar(value="") + self.power_var = tk.StringVar(value="—") + info = tk.Frame(hud, bg=HUD) + info.pack(fill="x", padx=10) + tk.Label(info, textvariable=self.lens_var, bg=HUD, fg=MUTED, font=self.F_SMALL).pack(side="left") + tk.Label(info, textvariable=self.power_var, bg=HUD, fg=MUTED, font=self.F_SMALL).pack(side="right") + + cells = tk.Frame(hud, bg=HUD) + cells.pack(fill="x", padx=6, pady=(4, 6)) + self.cell_fps = HudCell(cells, "FPS", self.F_VALUE) + self.cell_shutter = HudCell(cells, "SHUTTER", self.F_VALUE, lambda e: self._pick_shutter(self.cell_shutter)) + self.cell_iris = HudCell(cells, "IRIS", self.F_VALUE, lambda e: self._pick_iris(self.cell_iris)) + self.cell_iso = HudCell(cells, "ISO", self.F_VALUE, lambda e: self._pick_iso(self.cell_iso)) + self.cell_wb = HudCell(cells, "WB", self.F_VALUE, lambda e: self._pick_wb(self.cell_wb)) + self.cell_tint = HudCell(cells, "TINT", self.F_VALUE, lambda e: self._pick_wb(self.cell_tint)) + for i, c in enumerate((self.cell_fps, self.cell_shutter, self.cell_iris, self.cell_iso, + self.cell_wb, self.cell_tint)): + if i: + tk.Frame(cells, bg="#2a2a2a", width=1).pack(side="left", fill="y", pady=4) + c.pack(side="left", fill="x", expand=True) + tk.Frame(hud, bg=BORDER, height=1).pack(fill="x") + + # Franja de avisos (oculta hasta que haga falta) + self.banner = tk.Label(self, text="", bg=REC, fg="#fff", font=self.F_UI, anchor="w", padx=10, pady=4) + self._banner_id = None + + # ------------------------------------------------ bloque mini: lo que se toca en una toma + mini = tk.Frame(self, bg=BG) + mini.pack(fill="x", padx=8, pady=(6, 4)) + mini.columnconfigure(1, weight=1) + row0 = tk.Frame(mini, bg=BG) + row0.grid(row=0, column=0, columnspan=3, sticky="ew") + row0.columnconfigure(0, weight=1) + self.btn_af = ttk.Button(row0, text="AUTOFOCO (AF)", style="Big.TButton", command=self.autofocus) + self.btn_af.grid(row=0, column=0, sticky="ew") + Tooltip(self.btn_af, "Autofoco de un disparo (también con la barra espaciadora)") + self.peak_var = tk.BooleanVar() + self.peak_colour = int(self.cfg.get("peak_colour", 0)) + self.peak_toggle = ttk.Checkbutton(row0, text="PEAK", variable=self.peak_var, style="Toolbutton", + command=self.apply_peaking) + self.peak_toggle.grid(row=0, column=1, sticky="ns", padx=(6, 0)) + Tooltip(self.peak_toggle, "Focus assist con líneas de color en la salida elegida (Monitor)") + self.peak_colour_btn = ttk.Button(row0, text=self._peak_colour_text(), width=7, command=self._menu_peak_colour) + self.peak_colour_btn.grid(row=0, column=2, sticky="ns", padx=(4, 0)) + self.af_auto_var = tk.BooleanVar(value=False) + afa = ttk.Checkbutton(row0, text="AF auto", variable=self.af_auto_var, style="Toolbutton") + afa.grid(row=0, column=3, sticky="ns", padx=(6, 0)) + self.af_every_var = tk.IntVar(value=int(self.cfg.get("af_every", 5))) + Tooltip(afa, "Repite el autofoco cada N segundos (ajusta N en Ajustes)") + self.rec_canvas = tk.Canvas(row0, width=48, height=48, bg=BG, highlightthickness=0, cursor="hand2") + self.rec_canvas.grid(row=0, column=4, padx=(10, 0)) + self.rec_canvas.bind("", lambda e: self.toggle_record()) + self.rec_canvas.bind("", lambda e: self._draw_rec(hover=True)) + self.rec_canvas.bind("", lambda e: self._draw_rec(hover=False)) + Tooltip(self.rec_canvas, "Grabar / parar") + + self._lbl(mini, "Foco", bg=BG).grid(row=1, column=0, sticky="w", pady=(6, 0)) + self.focus_slider = DarkSlider(mini, bg=BG, command=lambda v: self._on_slider("focus", v)) + self.focus_slider.grid(row=1, column=1, sticky="ew", padx=6, pady=(6, 0)) + fr = tk.Frame(mini, bg=BG) + fr.grid(row=1, column=2, pady=(6, 0)) + self.focus_lbl = self._lbl(fr, "—", width=10, anchor="e", bg=BG) + self.focus_lbl.pack(side="left") + self.focus_nudge_btns = [] + for txt, d in (("◀", -0.02), ("▶", 0.02)): + b = ttk.Button(fr, text=txt, width=2, command=lambda d=d: self.nudge_focus(d)) + b.pack(side="left", padx=(3, 0)) + self.focus_nudge_btns.append(b) + + self._lbl(mini, "Iris", bg=BG).grid(row=2, column=0, sticky="w", pady=(4, 0)) + self.aperture_slider = DarkSlider(mini, bg=BG, command=lambda v: self._on_slider("aperture", v)) + self.aperture_slider.grid(row=2, column=1, sticky="ew", padx=6, pady=(4, 0)) + ir = tk.Frame(mini, bg=BG) + ir.grid(row=2, column=2, pady=(4, 0)) + self.aperture_lbl = self._lbl(ir, "—", width=10, anchor="e", bg=BG) + self.aperture_lbl.pack(side="left") + self.aperture_nudge_btns = [] + for txt, d in (("◀", -0.05), ("▶", 0.05)): + b = ttk.Button(ir, text=txt, width=2, command=lambda d=d: self.nudge_aperture(d)) + b.pack(side="left", padx=(3, 0)) + self.aperture_nudge_btns.append(b) + + statusrow = tk.Frame(mini, bg=BG) + statusrow.grid(row=3, column=0, columnspan=3, sticky="ew", pady=(6, 0)) + self.rec_state_var = tk.StringVar(value="GRABAR") + self.rec_state_lbl = tk.Label(statusrow, textvariable=self.rec_state_var, bg=BG, fg=FG, font=self.F_TITLE) + self.rec_state_lbl.pack(side="left") + self.transport_var = tk.StringVar(value="—") + self.format_var = tk.StringVar(value="") + self.codec_var = tk.StringVar(value="") + self.rec_info_var = tk.StringVar(value="") + tk.Label(statusrow, textvariable=self.rec_info_var, bg=BG, fg=MUTED, font=self.F_SMALL).pack(side="left", padx=(8, 0)) + self.focus_note_var = tk.StringVar(value="espacio = AF · ← → foco · Mayús = pasos grandes") + tk.Label(mini, textvariable=self.focus_note_var, bg=BG, fg=DIM, font=self.F_SMALL, anchor="w").grid( + row=4, column=0, columnspan=3, sticky="w", pady=(2, 0)) + self._draw_rec() + + # ------------------------------------------------ bloque ampliado: pestañas subrayadas y páginas + self.expand_frame = tk.Frame(self, bg=BG) + tabs = tk.Frame(self.expand_frame, bg=BAR) + tabs.pack(fill="x") + self.tab_var = tk.StringVar(value=self.cfg.get("tab", "rec")) + self._tab_widgets = {} + for text, key in (("GRABAR", "rec"), ("MONITOR", "mon"), ("AUDIO", "aud"), ("COLOR", "col"), ("AJUSTES", "set")): + cell = tk.Frame(tabs, bg=BAR, cursor="hand2") + cell.pack(side="left", padx=(10 if key == "rec" else 6, 0)) + lab = tk.Label(cell, text=text, bg=BAR, fg=MUTED, font=self.F_TITLE, pady=5) + lab.pack() + line = tk.Frame(cell, bg=BAR, height=2) + line.pack(fill="x") + for w in (cell, lab): + w.bind("", lambda e, k=key: self._select_tab(k)) + self._tab_widgets[key] = (lab, line) + container = tk.Frame(self.expand_frame, bg=BG) + container.pack(fill="both", expand=True) + container.rowconfigure(0, weight=1) + container.columnconfigure(0, weight=1) + self.pages = {} + for key in ("set", "col", "aud", "mon", "rec"): + page = tk.Frame(container, bg=BG) + page.grid(row=0, column=0, sticky="nsew") + page.columnconfigure(0, weight=1) + self.pages[key] = page + + self._build_page_rec(self.pages["rec"]) + self._build_page_mon(self.pages["mon"]) + self._build_page_aud(self.pages["aud"]) + self._build_page_col(self.pages["col"]) + self._build_page_set(self.pages["set"]) + + self._select_tab(self.tab_var.get() if self.tab_var.get() in self.pages else "rec") + self._apply_expand(initial=True) + self._apply_topmost() + self._set_controls_enabled(False) + + # ---------------------------------------------------------------- páginas + def _build_page_rec(self, p): + card, f = self._card(p, "Formato de grabación") + card.grid(row=0, column=0, sticky="ew", padx=8, pady=(6, 3)) + f.columnconfigure(1, weight=1) + f.columnconfigure(3, weight=1) + self._lbl(f, "Códec").grid(row=0, column=0, sticky="w", pady=2) + self.codec_sel_var = tk.StringVar() + self.codec_combo = ttk.Combobox(f, textvariable=self.codec_sel_var, values=[c[0] for c in CODEC_CHOICES], + state="readonly", width=12) + self.codec_combo.grid(row=0, column=1, sticky="w", padx=4) + self._lbl(f, "Resolución").grid(row=0, column=2, sticky="w", padx=(8, 0)) + self.res_var = tk.StringVar() + self.res_combo = ttk.Combobox(f, textvariable=self.res_var, values=[r[0] for r in RESOLUTIONS], + state="readonly", width=16) + self.res_combo.grid(row=0, column=3, sticky="w", padx=4) + self._lbl(f, "Fotogramas").grid(row=1, column=0, sticky="w", pady=2) + self.fps_var = tk.StringVar() + self.fps_combo = ttk.Combobox(f, textvariable=self.fps_var, values=FPS_CHOICES, state="readonly", width=7) + self.fps_combo.grid(row=1, column=1, sticky="w", padx=4) + self._lbl(f, "Sensor").grid(row=1, column=2, sticky="w", padx=(8, 0)) + self.sfps_var = tk.StringVar(value="igual") + self.sfps_combo = ttk.Combobox(f, textvariable=self.sfps_var, values=["igual"] + SENSOR_FPS_CHOICES, + state="readonly", width=7) + self.sfps_combo.grid(row=1, column=3, sticky="w", padx=4) + Tooltip(self.sfps_combo, "Fotogramas del sensor para off-speed (cámara lenta); «igual» = sin off-speed") + self.window_var = tk.BooleanVar() + self.window_toggle = ttk.Checkbutton(f, text="Ventana del sensor", variable=self.window_var, style="Toolbutton") + self.window_toggle.grid(row=2, column=0, columnspan=2, sticky="w", pady=(6, 0)) + self.btn_format = ttk.Button(f, text="Aplicar formato", command=self.apply_format) + self.btn_format.grid(row=2, column=2, columnspan=2, sticky="e", pady=(6, 0)) + + card, f = self._card(p, "Imagen") + card.grid(row=1, column=0, sticky="ew", padx=8, pady=3) + f.columnconfigure(1, weight=1) + f.columnconfigure(3, weight=1) + self._lbl(f, "Rango din.").grid(row=0, column=0, sticky="w", pady=2) + self.dr_var = tk.StringVar() + self.dr_combo = ttk.Combobox(f, textvariable=self.dr_var, values=DR_MODES, state="readonly", width=13) + self.dr_combo.grid(row=0, column=1, sticky="w", padx=4) + self.dr_combo.bind("<>", + lambda e: self._send(self.cam.set_dynamic_range(DR_MODES.index(self.dr_var.get())), "Rango dinámico")) + self._lbl(f, "Autoexp.").grid(row=0, column=2, sticky="w", padx=(8, 0)) + self.ae_var = tk.StringVar() + self.ae_combo = ttk.Combobox(f, textvariable=self.ae_var, values=AE_MODES, state="readonly", width=14) + self.ae_combo.grid(row=0, column=3, sticky="w", padx=4) + self.ae_combo.bind("<>", + lambda e: self._send(self.cam.set_auto_exposure_mode(AE_MODES.index(self.ae_var.get())), "Autoexposición")) + self._lbl(f, "Nitidez").grid(row=1, column=0, sticky="w", pady=2) + self.sharp_var = tk.StringVar() + cb = ttk.Combobox(f, textvariable=self.sharp_var, values=SHARPEN, state="readonly", width=13) + cb.grid(row=1, column=1, sticky="w", padx=4) + cb.bind("<>", lambda e: self._send(self.cam.set_sharpening(SHARPEN.index(self.sharp_var.get())), "Nitidez")) + self.sharp_combo = cb + self._lbl(f, "Ganancia dB").grid(row=1, column=2, sticky="w", padx=(8, 0)) + self.gain_var = tk.IntVar(value=0) + sp = ttk.Spinbox(f, from_=-12, to=36, increment=2, textvariable=self.gain_var, width=5, + command=lambda: self._send(self.cam.set_gain_db(self.gain_var.get()), "Ganancia")) + sp.grid(row=1, column=3, sticky="w", padx=4) + sp.bind("", lambda e: self._send(self.cam.set_gain_db(self.gain_var.get()), "Ganancia")) + self.gain_spin = sp + ttk.Button(f, text="Último auto WB", command=lambda: self._send(self.cam.send(1, 4, 0, 0), "Restaurar auto WB")).grid( + row=2, column=0, columnspan=2, sticky="w", pady=(6, 0)) + self.ois_var = tk.BooleanVar() + self.ois_toggle = ttk.Checkbutton(f, text="Estabilización (OIS)", variable=self.ois_var, style="Toolbutton", + command=lambda: self._send(self.cam.set_ois(self.ois_var.get()), "OIS")) + self.ois_toggle.grid(row=2, column=2, columnspan=2, sticky="e", pady=(6, 0)) + + card, f = self._card(p, "Reproducción") + card.grid(row=2, column=0, sticky="ew", padx=8, pady=3) + row = tk.Frame(f, bg=CARD) + row.pack(fill="x") + for text, cmd, tip in (("◼ Preview", lambda: self._send(self.cam.set_transport(0), "Preview"), "Volver a la vista en directo"), + ("▶ Play", lambda: self._send(self.cam.set_transport(1, 1, self.loop_var.get(), self.playall_var.get()), "Play"), "Reproducir el clip actual"), + ("❚❚ Pausa", lambda: self._send(self.cam.set_transport(1, 0, self.loop_var.get(), self.playall_var.get()), "Pausa"), "Pausar la reproducción"), + ("⏮", lambda: self._send(self.cam.playback_clip(False), "Clip anterior"), "Clip anterior"), + ("⏭", lambda: self._send(self.cam.playback_clip(True), "Clip siguiente"), "Clip siguiente")): + b = ttk.Button(row, text=text, command=cmd) + b.pack(side="left", padx=(0, 4)) + Tooltip(b, tip) + self.loop_var = tk.BooleanVar() + self.playall_var = tk.BooleanVar() + ttk.Checkbutton(row, text="Bucle", variable=self.loop_var, style="Toolbutton").pack(side="left", padx=(6, 4)) + ttk.Checkbutton(row, text="Todos", variable=self.playall_var, style="Toolbutton").pack(side="left") + + card, f = self._card(p, "Pizarra") + card.grid(row=3, column=0, sticky="ew", padx=8, pady=(3, 6)) + for c in (1, 3, 5): + f.columnconfigure(c, weight=1) + self.reel_var = tk.IntVar(value=1) + self.scene_var = tk.StringVar() + self.take_var = tk.IntVar(value=1) + self.shot_var = tk.StringVar(value=SHOT_TAGS[0]) + self.intext_var = tk.StringVar(value="Interior") + self.daynight_var = tk.StringVar(value="Día") + self.taketag_var = tk.StringVar(value=TAKE_TAGS[0]) + self.goodtake_var = tk.BooleanVar() + self.camid_var = tk.StringVar() + self.operator_var = tk.StringVar() + self.director_var = tk.StringVar() + self.project_var = tk.StringVar() + + def spin(parent, var, lo, hi, cmd, w=4): + s = ttk.Spinbox(parent, from_=lo, to=hi, textvariable=var, width=w, command=cmd) + s.bind("", lambda e: cmd()) + return s + + def entry(parent, var, cmd, w=12): + e = tk.Entry(parent, textvariable=var, width=w, bg=FIELD, fg=FG, insertbackground=FG, relief="flat", + highlightthickness=1, highlightbackground=BORDER, highlightcolor=FG, font=self.F_UI) + e.bind("", lambda ev: cmd()) + e.bind("", lambda ev: cmd()) + return e + + self._lbl(f, "Reel").grid(row=0, column=0, sticky="w", pady=2) + spin(f, self.reel_var, 1, 999, lambda: self._send(self.cam.set_reel(self.reel_var.get()), "Reel")).grid(row=0, column=1, sticky="w", padx=4) + self._lbl(f, "Escena").grid(row=0, column=2, sticky="w", padx=(8, 0)) + entry(f, self.scene_var, lambda: self._send(self.cam.set_scene(self.scene_var.get()), "Escena"), 6).grid(row=0, column=3, sticky="w", padx=4) + self._lbl(f, "Toma").grid(row=0, column=4, sticky="w", padx=(8, 0)) + spin(f, self.take_var, 1, 99, self._send_take).grid(row=0, column=5, sticky="w", padx=4) + self._lbl(f, "Plano").grid(row=1, column=0, sticky="w", pady=2) + cb = ttk.Combobox(f, textvariable=self.shot_var, values=SHOT_TAGS, state="readonly", width=6) + cb.grid(row=1, column=1, sticky="w", padx=4) + cb.bind("<>", lambda e: self._send_scene_tags()) + cb = ttk.Combobox(f, textvariable=self.intext_var, values=["Interior", "Exterior"], state="readonly", width=8) + cb.grid(row=1, column=2, columnspan=2, sticky="w", padx=4) + cb.bind("<>", lambda e: self._send_scene_tags()) + cb = ttk.Combobox(f, textvariable=self.daynight_var, values=["Día", "Noche"], state="readonly", width=6) + cb.grid(row=1, column=4, columnspan=2, sticky="w", padx=4) + cb.bind("<>", lambda e: self._send_scene_tags()) + self._lbl(f, "Etiq. toma").grid(row=2, column=0, sticky="w", pady=2) + cb = ttk.Combobox(f, textvariable=self.taketag_var, values=TAKE_TAGS, state="readonly", width=6) + cb.grid(row=2, column=1, sticky="w", padx=4) + cb.bind("<>", lambda e: self._send_take()) + ttk.Checkbutton(f, text="Buena toma", variable=self.goodtake_var, style="Toolbutton", + command=lambda: self._send(self.cam.set_good_take(self.goodtake_var.get()), "Buena toma")).grid( + row=2, column=2, columnspan=2, sticky="w", padx=4) + self._lbl(f, "Id cámara").grid(row=2, column=4, sticky="w", padx=(8, 0)) + entry(f, self.camid_var, lambda: self._send(self.cam.set_metadata_text(5, self.camid_var.get()), "Id cámara"), 4).grid(row=2, column=5, sticky="w", padx=4) + self._lbl(f, "Operador").grid(row=3, column=0, sticky="w", pady=2) + entry(f, self.operator_var, lambda: self._send(self.cam.set_metadata_text(6, self.operator_var.get()), "Operador"), 14).grid(row=3, column=1, columnspan=2, sticky="ew", padx=4) + self._lbl(f, "Director").grid(row=3, column=3, sticky="e") + entry(f, self.director_var, lambda: self._send(self.cam.set_metadata_text(7, self.director_var.get()), "Director"), 14).grid(row=3, column=4, columnspan=2, sticky="ew", padx=4) + self._lbl(f, "Proyecto").grid(row=4, column=0, sticky="w", pady=2) + entry(f, self.project_var, lambda: self._send(self.cam.set_metadata_text(8, self.project_var.get()), "Proyecto"), 14).grid(row=4, column=1, columnspan=5, sticky="ew", padx=4) + + def _build_page_mon(self, p): + card, f = self._card(p, "Ayudas y overlays") + card.grid(row=0, column=0, sticky="ew", padx=8, pady=(6, 3)) + self.target_var = tk.StringVar(value=self.cfg.get("monitor_target", "hdmi")) + trow = tk.Frame(f, bg=CARD) + trow.pack(fill="x") + self._lbl(trow, "Aplicar en", muted=True).pack(side="left", padx=(0, 6)) + for text, val in (("HDMI", "hdmi"), ("LCD", "lcd"), ("Ambas", "both")): + ttk.Radiobutton(trow, text=text, value=val, variable=self.target_var, style="Toolbutton", + command=self._on_target_change).pack(side="left", padx=(0, 4)) + self.zebra_var = tk.BooleanVar() + self.false_var = tk.BooleanVar() + toggles = tk.Frame(f, bg=CARD) + toggles.pack(fill="x", pady=(6, 0)) + for text, var, cmd in (("Zebra", self.zebra_var, self.apply_tools), ("Peaking", self.peak_var, self.apply_peaking), + ("Falso color", self.false_var, self.apply_tools)): + ttk.Checkbutton(toggles, text=text, variable=var, style="Toolbutton", command=cmd).pack(side="left", padx=(0, 4), fill="x", expand=True) + self.status_ov_var = tk.BooleanVar(value=True) + self.guides_ov_var = tk.BooleanVar() + self.clean_ov_var = tk.BooleanVar() + ovrow = tk.Frame(f, bg=CARD) + ovrow.pack(fill="x", pady=(4, 0)) + for text, var in (("Texto estado", self.status_ov_var), ("Guías", self.guides_ov_var), ("Señal limpia", self.clean_ov_var)): + ttk.Checkbutton(ovrow, text=text, variable=var, style="Toolbutton", command=self.apply_overlays).pack(side="left", padx=(0, 4), fill="x", expand=True) + lrow = tk.Frame(f, bg=CARD) + lrow.pack(fill="x", pady=(6, 0)) + self._lbl(lrow, "LUT").pack(side="left") + self.lut_var = tk.StringVar() + self.lut_combo = ttk.Combobox(lrow, textvariable=self.lut_var, values=LUTS, state="readonly", width=18) + self.lut_combo.pack(side="left", padx=4) + self.lut_combo.bind("<>", lambda e: self.apply_lut()) + self.lut_on_var = tk.BooleanVar(value=False) + self.lut_toggle = ttk.Checkbutton(lrow, text="Mostrar LUT", variable=self.lut_on_var, style="Toolbutton", command=self.apply_lut) + self.lut_toggle.pack(side="left") + ttk.Button(lrow, text="Barras 5 s", command=lambda: self._send(self.cam.show_colour_bars(5), "Barras")).pack(side="right") + + card, f = self._card(p, "Guías y rejilla") + card.grid(row=1, column=0, sticky="ew", padx=8, pady=3) + f.columnconfigure(1, weight=1) + grow = tk.Frame(f, bg=CARD) + grow.grid(row=0, column=0, columnspan=3, sticky="ew") + self._lbl(grow, "Estilo").pack(side="left") + self.guide_style_var = tk.StringVar(value=GUIDE_STYLES[0]) + cb = ttk.Combobox(grow, textvariable=self.guide_style_var, values=GUIDE_STYLES, state="readonly", width=8) + cb.pack(side="left", padx=4) + cb.bind("<>", lambda e: self._send_guides()) + self.grid_vars = {} + for text, bit in (("Tercios", 1), ("Cruz", 2), ("Punto", 4), ("Horizonte", 8)): + v = tk.BooleanVar() + self.grid_vars[bit] = v + ttk.Checkbutton(grow, text=text, variable=v, style="Toolbutton", command=self._send_guides).pack(side="left", padx=(4, 0)) + self._row_slider(f, 1, "Opacidad", 0, 100, lambda v: self._send_guides(opacity=v), "{:.0f} %", key="guide_op") + self._row_slider(f, 2, "Área segura", 0, 100, lambda v: self._send_guides(safe=v), "{:.0f} %", key="guide_safe") + + card, f = self._card(p, "Pantalla") + card.grid(row=2, column=0, sticky="ew", padx=8, pady=(3, 6)) + f.columnconfigure(1, weight=1) + self._row_slider(f, 0, "Brillo LCD", 0, 1, self.cam.set_display_brightness, "{:.0%}", key="4.0") + self._row_slider(f, 1, "Nivel zebra", 0, 1, self.cam.set_zebra_level, "{:.0%}", key="4.2") + self._row_slider(f, 2, "Nivel peaking", 0, 1, self.cam.set_peaking_level, "{:.0%}", key="4.3") + trow = tk.Frame(f, bg=CARD) + trow.grid(row=3, column=0, columnspan=3, sticky="ew", pady=(4, 0)) + self._lbl(trow, "Timecode").pack(side="left") + self.tcsrc_var = tk.StringVar(value="Clip") + cb = ttk.Combobox(trow, textvariable=self.tcsrc_var, values=["Clip", "Timecode"], state="readonly", width=9) + cb.pack(side="left", padx=4) + cb.bind("<>", lambda e: self._send(self.cam.set_timecode_source(self.tcsrc_var.get() == "Timecode"), "Fuente de timecode")) + + def _build_page_aud(self, p): + card, f = self._card(p, "Niveles") + card.grid(row=0, column=0, sticky="ew", padx=8, pady=(6, 3)) + f.columnconfigure(1, weight=1) + self._row_slider(f, 0, "Micrófono", 0, 1, self.cam.set_mic_level, "{:.0%}", key="2.0") + self._row_slider(f, 1, "Canal 1", 0, 1, lambda v: self._audio_in_send(0, v), "{:.0%}", key="2.5.0") + self._row_slider(f, 2, "Canal 2", 0, 1, lambda v: self._audio_in_send(1, v), "{:.0%}", key="2.5.1") + self._row_slider(f, 3, "Auriculares", 0, 1, self.cam.set_headphone_level, "{:.0%}", key="2.1") + self._row_slider(f, 4, "Mezcla prog.", 0, 1, self.cam.set_headphone_mix, "{:.0%}", key="2.2") + self._row_slider(f, 5, "Altavoz", 0, 1, self.cam.set_speaker_level, "{:.0%}", key="2.3") + card, f = self._card(p, "Entrada") + card.grid(row=1, column=0, sticky="ew", padx=8, pady=(3, 6)) + row = tk.Frame(f, bg=CARD) + row.pack(fill="x") + self._lbl(row, "Tipo").pack(side="left") + self.audio_in_var = tk.StringVar(value=AUDIO_INPUTS[0]) + cb = ttk.Combobox(row, textvariable=self.audio_in_var, values=AUDIO_INPUTS, state="readonly", width=16) + cb.pack(side="left", padx=4) + cb.bind("<>", lambda e: self._send(self.cam.set_audio_input_type(AUDIO_INPUTS.index(self.audio_in_var.get())), "Entrada de audio")) + self.phantom_var = tk.BooleanVar() + ttk.Checkbutton(row, text="Phantom 48 V", variable=self.phantom_var, style="Toolbutton", + command=lambda: self._send(self.cam.set_phantom_power(self.phantom_var.get()), "Phantom")).pack(side="left", padx=(8, 0)) + + def _build_page_col(self, p): + card, f = self._card(p, "Corrección de color") + card.grid(row=0, column=0, sticky="ew", padx=8, pady=(6, 3)) + f.columnconfigure(0, weight=1) + hdr = tk.Frame(f, bg=CARD) + hdr.grid(row=0, column=0, columnspan=5, sticky="ew") + hdr.columnconfigure(0, minsize=52) + for i, (t, c) in enumerate((("R", "#ff6b6b"), ("G", "#6bff8a"), ("B", "#6bb3ff"), ("Y", FG))): + hdr.columnconfigure(i + 1, weight=1) + tk.Label(hdr, text=t, bg=CARD, fg=c, font=self.F_TITLE).grid(row=0, column=i + 1) + self._colour_sliders = {} + ranges = {0: ("Lift", -1.0, 1.0), 1: ("Gamma", -1.0, 1.0), 2: ("Gain", 0.0, 4.0), 3: ("Offset", -1.0, 1.0)} + for r, (par, (name, lo, hi)) in enumerate(ranges.items(), start=1): + rowf = tk.Frame(f, bg=CARD) + rowf.grid(row=r, column=0, columnspan=5, sticky="ew", pady=1) + rowf.columnconfigure(0, minsize=52) + self._lbl(rowf, name).grid(row=0, column=0, sticky="w") + for i in range(4): + rowf.columnconfigure(i + 1, weight=1) + s = DarkSlider(rowf, height=20, command=lambda v, p=par, i=i, lo=lo, hi=hi: self._colour_send(p, i, lo + v * (hi - lo))) + s.grid(row=0, column=i + 1, sticky="ew", padx=2) + s.set_enabled(True) + s.set((self._colour[par][i] - lo) / (hi - lo)) + self._colour_sliders[(par, i)] = (s, lo, hi) + Tooltip(rowf, f"{name}: arrastra cada canal; doble clic en Reset para volver a valores de fábrica") + f2 = tk.Frame(f, bg=CARD) + f2.grid(row=5, column=0, columnspan=5, sticky="ew", pady=(6, 0)) + f2.columnconfigure(1, weight=1) + self._row_slider(f2, 0, "Contraste", 0, 2, lambda v: self._contrast_send(1, v), "{:.2f}", key="8.4.1") + self._row_slider(f2, 1, "Pivote", 0, 1, lambda v: self._contrast_send(0, v), "{:.2f}", key="8.4.0") + self._row_slider(f2, 2, "Luma mix", 0, 1, self.cam.set_luma_mix, "{:.2f}", key="8.5") + self._row_slider(f2, 3, "Tono", -1, 1, lambda v: self._huesat_send(0, v), "{:+.2f}", key="8.6.0") + self._row_slider(f2, 4, "Saturación", 0, 2, lambda v: self._huesat_send(1, v), "{:.2f}", key="8.6.1") + ttk.Button(f, text="Reset a valores de fábrica", command=self._colour_reset).grid(row=6, column=0, columnspan=5, sticky="e", pady=(6, 0)) + for k, v in (("8.4.0", 0.5), ("8.4.1", 1.0), ("8.5", 1.0), ("8.6.0", 0.0), ("8.6.1", 1.0)): + self._sync_slider(k, v) + + def _build_page_set(self, p): + p.rowconfigure(4, weight=1) + card, f = self._card(p, "Cámara") + card.grid(row=0, column=0, sticky="ew", padx=8, pady=(6, 3)) + f.columnconfigure(0, weight=1) + self.device_var = tk.StringVar() + self.device_combo = ttk.Combobox(f, textvariable=self.device_var, state="readonly") + self.device_combo.grid(row=0, column=0, columnspan=4, sticky="ew") + self.btn_scan = ttk.Button(f, text="Buscar", command=self.scan) + self.btn_scan.grid(row=1, column=0, sticky="w", pady=(5, 0)) + self.btn_connect = ttk.Button(f, text="Conectar", command=self.toggle_connect) + self.btn_connect.grid(row=1, column=1, sticky="w", padx=(4, 0), pady=(5, 0)) + self.btn_pair = ttk.Button(f, text="Emparejar (PIN)", command=self.pair_camera) + self.btn_pair.grid(row=1, column=2, sticky="w", padx=(4, 0), pady=(5, 0)) + self.autoconnect_var = tk.BooleanVar(value=bool(self.cfg.get("autoconnect", True))) + ttk.Checkbutton(f, text="Al abrir", variable=self.autoconnect_var, style="Toolbutton", + command=lambda: (self.cfg.__setitem__("autoconnect", self.autoconnect_var.get()), save_config(self.cfg))).grid( + row=1, column=3, sticky="e", padx=(4, 0), pady=(5, 0)) + row = tk.Frame(f, bg=CARD) + row.grid(row=2, column=0, columnspan=4, sticky="ew", pady=(6, 0)) + b = ttk.Button(row, text="Sincronizar reloj", command=lambda: self._send(self.cam.sync_clock(), "Reloj")) + b.pack(side="left") + Tooltip(b, "Pone en la cámara la hora, fecha y zona horaria de este PC") + self._lbl(row, "AF auto cada").pack(side="left", padx=(10, 4)) + sp = ttk.Spinbox(row, from_=1, to=120, textvariable=self.af_every_var, width=4, + command=lambda: (self.cfg.__setitem__("af_every", self.af_every_var.get()), save_config(self.cfg))) + sp.pack(side="left") + self._lbl(row, "s", muted=True).pack(side="left", padx=(3, 0)) + ttk.Button(row, text="Apagar cámara", style="Danger.TButton", command=self.power_off).pack(side="right") + + card, f = self._card(p, "Presets propios") + card.grid(row=1, column=0, sticky="ew", padx=8, pady=3) + f.columnconfigure(0, weight=1) + self.preset_var = tk.StringVar() + self.preset_combo = ttk.Combobox(f, textvariable=self.preset_var, values=sorted(self.cfg.get("presets", {}).keys()), state="readonly") + self.preset_combo.grid(row=0, column=0, sticky="ew") + b = ttk.Button(f, text="Aplicar", command=self.preset_apply) + b.grid(row=0, column=1, padx=(4, 0)) + Tooltip(b, "Envía a la cámara ISO, obturador, WB, rango dinámico, LUT, peaking y formato guardados") + ttk.Button(f, text="Guardar actual…", command=self.preset_save).grid(row=0, column=2, padx=(4, 0)) + ttk.Button(f, text="Borrar", command=self.preset_delete).grid(row=0, column=3, padx=(4, 0)) + + card, f = self._card(p, "Panel para OBS (Docks → Custom Browser Docks)") + card.grid(row=2, column=0, sticky="ew", padx=8, pady=3) + f.columnconfigure(1, weight=1) + self.obs_dock_var = tk.BooleanVar(value=bool(self.cfg.get("obs_dock", True)) and self.dock_running) + b = ttk.Checkbutton(f, text="Activo", variable=self.obs_dock_var, style="Toolbutton", command=self.toggle_dock) + b.grid(row=0, column=0, sticky="w") + Tooltip(b, "Sirve una versión web del panel mini en este PC para acoplarla dentro de OBS") + self.dock_url_var = tk.StringVar() + tk.Entry(f, textvariable=self.dock_url_var, state="readonly", readonlybackground=FIELD, fg=FG, relief="flat", + font=self.F_MONO, highlightthickness=0).grid(row=0, column=1, sticky="ew", padx=(6, 0), ipady=3) + b = ttk.Button(f, text="Copiar URL", command=self.copy_dock_url) + b.grid(row=0, column=2, padx=(4, 0)) + b = ttk.Button(f, text="Añadir a OBS", command=self.add_dock_to_obs) + b.grid(row=0, column=3, padx=(4, 0)) + Tooltip(b, "Con OBS cerrado: registra el panel en OBS; al abrirlo aparece en Docks → Labmagic") + self._update_dock_line() + + card, f = self._card(p, "Tally") + card.grid(row=3, column=0, sticky="ew", padx=8, pady=3) + f.columnconfigure(1, weight=1) + self._row_slider(f, 0, "Frontal", 0, 1, lambda v: self.cam.set_tally(v, 1), "{:.0%}", key="5.1") + self._row_slider(f, 1, "Trasero", 0, 1, lambda v: self.cam.set_tally(v, 2), "{:.0%}", key="5.2") + + card, f = self._card(p, "Registro") + card.grid(row=4, column=0, sticky="nsew", padx=8, pady=(3, 6)) + f.columnconfigure(0, weight=1) + f.rowconfigure(0, weight=1) + self.log_text = tk.Text(f, height=5, wrap="word", font=self.F_MONO, state="disabled", bg="#0a0a0a", fg="#cfcfcf", + insertbackground=FG, relief="flat", highlightthickness=0, selectbackground="#3a3a3a", padx=6, pady=4) + self.log_text.grid(row=0, column=0, sticky="nsew") + sb = ttk.Scrollbar(f, orient="vertical", command=self.log_text.yview) + sb.grid(row=0, column=1, sticky="ns") + self.log_text.configure(yscrollcommand=sb.set) + barlog = tk.Frame(f, bg=CARD) + barlog.grid(row=1, column=0, columnspan=2, sticky="ew", pady=(4, 0)) + self.show_all_var = tk.BooleanVar(value=False) + ttk.Checkbutton(barlog, text="No documentados", variable=self.show_all_var, style="Toolbutton").pack(side="left") + ttk.Button(barlog, text="Limpiar", command=self.clear_log).pack(side="right") + + # ---------------------------------------------------------- pestañas, plegado, encima + def _select_tab(self, key): + self.tab_var.set(key) + for k, (lab, line) in self._tab_widgets.items(): + lab.configure(fg=FG if k == key else MUTED) + line.configure(bg=FG if k == key else BAR) + self.pages[key].tkraise() + self.cfg["tab"] = key + save_config(self.cfg) + + def toggle_expand(self): + self.expanded = not self.expanded + self.cfg["expanded"] = self.expanded + save_config(self.cfg) + self._apply_expand() + + def _apply_expand(self, initial=False): + if self.expanded: + self.expand_frame.pack(fill="both", expand=True) + self.expand_btn.configure(text="⇲") + else: + self.expand_frame.pack_forget() + self.expand_btn.configure(text="⇱") + self.update_idletasks() + w = max(self.winfo_reqwidth(), 380) + h = self.winfo_reqheight() + self.minsize(w, h) + if initial: + pos = self.cfg.get("pos") + self.geometry(f"{w}x{h}" + (f"+{pos[0]}+{pos[1]}" if pos else "")) + else: + self.geometry(f"{w}x{h}") + + def _apply_topmost(self): + on = bool(self.topmost_var.get()) + self.cfg["topmost"] = on + save_config(self.cfg) + try: + self.attributes("-topmost", on) + except tk.TclError: + pass + + # ---------------------------------------------------------- franja de avisos + def notify(self, text, level="error", seconds=6): + self._notice = {"text": text, "level": level, "secs": seconds, "t": round(time.time(), 3)} + self.banner.configure(text=text, bg=REC if level == "error" else ("#8a5a00" if level == "warn" else "#1f4d2b")) + self.banner.pack(fill="x", after=self.banner.master.winfo_children()[0]) + if self._banner_id: + try: + self.after_cancel(self._banner_id) + except tk.TclError: + pass + self._banner_id = self.after(seconds * 1000, self.banner.pack_forget) + + # ---------------------------------------------------------- selectores estilo cámara + def _open_picker(self, anchor, title, width=330): + if self._picker is not None: + self._picker.close() + if not self.connected: + self.notify("Conecta la cámara para cambiar valores", "warn", 3) + return None + self._picker = Picker(self, anchor, title, width) + return self._picker + + def _pick_iso(self, anchor): + pk = self._open_picker(anchor, "ISO") + if not pk: + return + cur = int(self.iso_var.get() or 0) if self.iso_var.get().isdigit() else None + pk.set_value(str(cur) if cur else "—") + full = [100, 200, 400, 800, 1600, 3200, 6400, 12800, 25600] + thirds = [v for v in ISO_VALUES if v not in full] + + def choose(v): + self._send(self.cam.set_iso(v), "ISO") + pk.close() + + pk.chips([(str(v), v) for v in full], cur, choose, per_row=5) + tk.Frame(pk.body, bg="#2a2a2a", height=1).pack(fill="x", pady=4) + pk.chips([(str(v), v) for v in thirds], cur, choose, per_row=6, dim_set=set(thirds)) + tk.Label(pk.body, text="Nativos de la Pocket 4K: 400 y 3200 · tercios en gris", bg="#161616", fg=MUTED, + font=self.F_SMALL).pack(anchor="w", pady=(4, 0)) + + def _pick_shutter(self, anchor): + pk = self._open_picker(anchor, "Obturador") + if not pk: + return + try: + cur_a = float(self.angle_var.get()) + except ValueError: + cur_a = None + pk.set_value(f"{cur_a:g}°" if cur_a else (f"1/{self.speed_var.get()}" if self.speed_var.get() else "—")) + + def choose_a(a): + self._send(self.cam.set_shutter_angle(a), "Obturador") + pk.close() + + def choose_s(s): + self._send(self.cam.set_shutter_speed(s), "Obturador") + pk.close() + + tk.Label(pk.body, text="ÁNGULO", bg="#161616", fg=MUTED, font=self.F_SMALL).pack(anchor="w") + main = [45, 90, 172.8, 180, 270, 360] + pk.chips([(f"{a:g}°", a) for a in main], cur_a, choose_a, per_row=6) + pk.chips([(f"{a:g}°", a) for a in SHUTTER_ANGLES if a not in main], cur_a, choose_a, per_row=6, + dim_set={a for a in SHUTTER_ANGLES if a not in main}) + tk.Label(pk.body, text="VELOCIDAD 1/x", bg="#161616", fg=MUTED, font=self.F_SMALL).pack(anchor="w", pady=(6, 0)) + cur_s = int(self.speed_var.get()) if self.speed_var.get().isdigit() else None + pk.chips([(f"1/{s}", s) for s in SHUTTER_SPEEDS], cur_s, choose_s, per_row=7) + + def _pick_iris(self, anchor): + pk = self._open_picker(anchor, "Iris") + if not pk: + return + pk.set_value(self.aperture_lbl.cget("text")) + + def choose(f): + self._send(self.cam.set_aperture_fstop(f), "Apertura") + pk.close() + + pk.chips([(f"f/{f:g}", f) for f in FSTOPS], None, choose, per_row=7) + row = tk.Frame(pk.body, bg="#161616") + row.pack(fill="x", pady=(8, 0)) + tk.Label(row, text="abierto", bg="#161616", fg=MUTED, font=self.F_SMALL).pack(side="left") + s = DarkSlider(row, bg="#161616", command=lambda v: self._on_slider("aperture", v)) + s.pack(side="left", fill="x", expand=True, padx=6) + s.set_enabled(True) + s.set(self.aperture_value or 0.0) + tk.Label(row, text="cerrado", bg="#161616", fg=MUTED, font=self.F_SMALL).pack(side="left") + pk.chip(pk.body, "AUTO IRIS", False, lambda: (self._send(self.cam.auto_iris(), "Auto iris"), pk.close())).pack(anchor="e", pady=(8, 0)) + + def _pick_wb(self, anchor): + pk = self._open_picker(anchor, "Balance de blancos", 360) + if not pk: + return + k0 = self.wb_kelvin or int(self.wb_var.get() or 5600) + t0 = self.wb_tint if self.wb_tint is not None else int(self.tint_var.get() or 0) + state = {"k": k0, "t": t0} + + def refresh(): + pk.set_value(f"{state['k']}K {state['t']:+d}") + + def send(): + self.wb_var.set(state["k"]) + self.tint_var.set(state["t"]) + self._throttle("wb", lambda: self._send(self.cam.set_white_balance(state["k"], state["t"]), "Balance de blancos")) + + refresh() + row = tk.Frame(pk.body, bg="#161616") + row.pack(fill="x") + tk.Label(row, text="2500", bg="#161616", fg=MUTED, font=self.F_SMALL).pack(side="left") + ks = DarkSlider(row, bg="#161616", command=lambda v: (state.__setitem__("k", int(round((2500 + v * 7500) / 50) * 50)), refresh(), send())) + ks.pack(side="left", fill="x", expand=True, padx=6) + ks.set_enabled(True) + ks.set((k0 - 2500) / 7500) + tk.Label(row, text="10000", bg="#161616", fg=MUTED, font=self.F_SMALL).pack(side="left") + ticks = tk.Frame(pk.body, bg="#161616") + ticks.pack(fill="x", padx=36) + for k in (3200, 4000, 5600, 6500, 7500): + tk.Label(ticks, text=str(k), bg="#161616", fg=DIM, font=("Segoe UI", 7)).pack(side="left", expand=True) + prow = tk.Frame(pk.body, bg="#161616") + prow.pack(fill="x", pady=(6, 0)) + for c in range(3): + prow.columnconfigure(c, weight=1, uniform="wb") + for i, (text, k, t) in enumerate(WB_PRESET_CHIPS): + def go(k=k, t=t): + state["k"], state["t"] = k, t + ks.set((k - 2500) / 7500) + ts.set((t + 50) / 100) + refresh() + send() + pk.chip(prow, text, state["k"] == k, go).grid(row=i // 3, column=i % 3, sticky="ew", padx=2, pady=2) + pk.chip(prow, "AUTO WB", False, lambda: (self._send(self.cam.auto_white_balance(), "Auto WB"), pk.close())).grid( + row=1, column=2, sticky="ew", padx=2, pady=2) + trow = tk.Frame(pk.body, bg="#161616") + trow.pack(fill="x", pady=(8, 0)) + tk.Label(trow, text="Tinte", bg="#161616", fg=FG, font=self.F_UI).pack(side="left") + ts = DarkSlider(trow, bg="#161616", command=lambda v: (state.__setitem__("t", int(round(v * 100 - 50))), refresh(), send())) + ts.pack(side="left", fill="x", expand=True, padx=6) + ts.set_enabled(True) + ts.set((t0 + 50) / 100) + for txt, d in (("−", -1), ("+", 1)): + pk.chip(trow, txt, False, lambda d=d: (state.__setitem__("t", max(-50, min(50, state["t"] + d))), ts.set((state["t"] + 50) / 100), refresh(), send()), width=2).pack(side="left", padx=(3, 0)) + + # ---------------------------------------------------------- deslizadores genéricos y sincronía + def _row_slider(self, parent, row, label, lo, hi, sender, fmt="{:.2f}", key=None): + self._lbl(parent, label).grid(row=row, column=0, sticky="w", pady=1) + s = DarkSlider(parent, height=22, command=lambda v: self._slider_send(key, lo + v * (hi - lo), sender, fmt)) + s.grid(row=row, column=1, sticky="ew", padx=4, pady=1) + s.set_enabled(True) + val = self._lbl(parent, "—", width=6, anchor="e") + val.grid(row=row, column=2, sticky="e") + if key: + self._pslider[key] = (s, val, lo, hi, fmt) + return s, val + + def _slider_send(self, key, real, sender, fmt): + if key in self._pslider: + self._pslider[key][1].configure(text=fmt.format(real)) + self._throttle(key or str(id(sender)), lambda r=real: self._send(sender(r), key or "ajuste")) + + def _sync_slider(self, key, real): + if key in self._pslider: + s, val, lo, hi, fmt = self._pslider[key] + s.set((real - lo) / (hi - lo) if hi != lo else 0) + val.configure(text=fmt.format(real)) + + def _colour_send(self, par, idx, real): + self._colour[par][idx] = real + self._throttle(f"col{par}", lambda p=par: self._send(self.cam.set_colour_rgby(p, self._colour[p]), "Color")) + + def _contrast_send(self, idx, real): + self._contrast[idx] = real + self._throttle("contrast", lambda: self._send(self.cam.set_contrast(*self._contrast), "Contraste")) + + def _huesat_send(self, idx, real): + self._huesat[idx] = real + self._throttle("huesat", lambda: self._send(self.cam.set_hue_sat(*self._huesat), "Tono/saturación")) + + def _colour_reset(self): + self._send(self.cam.reset_colour_correction(), "Reset color") + self._colour = {0: [0.0] * 4, 1: [0.0] * 4, 2: [1.0] * 4, 3: [0.0] * 4} + for (par, i), (s, lo, hi) in self._colour_sliders.items(): + s.set((self._colour[par][i] - lo) / (hi - lo)) + self._contrast, self._huesat = [0.5, 1.0], [0.0, 1.0] + for k, v in (("8.4.0", 0.5), ("8.4.1", 1.0), ("8.5", 1.0), ("8.6.0", 0.0), ("8.6.1", 1.0)): + self._sync_slider(k, v) + + def _audio_in_send(self, idx, real): + self._audio_in[idx] = real + self._throttle("audioin", lambda: self._send(self.cam.set_input_levels(*self._audio_in), "Niveles de entrada")) + + def _send_guides(self, opacity=None, safe=None): + if opacity is not None: + self._guides[1] = int(opacity) + if safe is not None: + self._guides[2] = int(safe) + self._guides[0] = GUIDE_STYLES.index(self.guide_style_var.get()) if self.guide_style_var.get() in GUIDE_STYLES else 0 + self._guides[3] = sum(bit for bit, v in self.grid_vars.items() if v.get()) + self._throttle("guides", lambda: self._send(self.cam.set_frame_guides(*self._guides), "Guías")) + + def _send_scene_tags(self): + tag = SHOT_TAGS.index(self.shot_var.get()) - 1 + self._send(self.cam.set_scene_tags(tag, 1 if self.intext_var.get() == "Exterior" else 0, + 1 if self.daynight_var.get() == "Día" else 0), "Etiquetas de escena") + + def _send_take(self): + try: + n = int(self.take_var.get()) + except (tk.TclError, ValueError): + return + self._send(self.cam.set_take(n, TAKE_TAGS.index(self.taketag_var.get()) - 1), "Toma") + + # ---------------------------------------------------------- presets propios + def _preset_snapshot(self): + return { + "iso": self.iso_var.get(), "angle": self.angle_var.get(), "speed": self.speed_var.get(), + "wb": self.wb_var.get(), "tint": self.tint_var.get(), "dr": self.dr_var.get(), + "lut": self.lut_var.get(), "lut_on": self.lut_on_var.get(), "peak": self.peak_var.get(), + "peak_colour": self.peak_colour, "codec": self.codec_sel_var.get(), "res": self.res_var.get(), + "fps": self.fps_var.get(), "sfps": self.sfps_var.get(), "window": self.window_var.get(), + } + + def preset_save(self): + name = simpledialog.askstring("Guardar preset", "Nombre del preset (p. ej. Entrevista, Producto):", parent=self) + if not name: + return + presets = self.cfg.setdefault("presets", {}) + presets[name.strip()] = self._preset_snapshot() + save_config(self.cfg) + self.preset_combo.configure(values=sorted(presets.keys())) + self.preset_var.set(name.strip()) + self.notify(f"Preset «{name.strip()}» guardado", "ok", 3) + + def preset_delete(self): + name = self.preset_var.get() + presets = self.cfg.get("presets", {}) + if name in presets: + del presets[name] + save_config(self.cfg) + self.preset_combo.configure(values=sorted(presets.keys())) + self.preset_var.set("") + + def preset_apply(self): + name = self.preset_var.get() + pr = self.cfg.get("presets", {}).get(name) + if not pr or not self.connected: + self.notify("Elige un preset y conecta la cámara", "warn", 3) + return + + async def go(): + if pr.get("iso", "").isdigit(): + await self.cam.set_iso(int(pr["iso"])) + if pr.get("angle"): + await self.cam.set_shutter_angle(float(pr["angle"])) + elif str(pr.get("speed", "")).isdigit(): + await self.cam.set_shutter_speed(int(pr["speed"])) + await self.cam.set_white_balance(int(pr.get("wb", 5600)), int(pr.get("tint", 0))) + if pr.get("dr") in DR_MODES: + await self.cam.set_dynamic_range(DR_MODES.index(pr["dr"])) + if pr.get("lut") in LUTS: + await self.cam.set_display_lut(LUTS.index(pr["lut"]), bool(pr.get("lut_on"))) + await self.cam.set_peaking(bool(pr.get("peak")), int(pr.get("peak_colour", 0)), self.zebra_var.get(), + self.false_var.get(), self._targets()) + codec = next((c for c in CODEC_CHOICES if c[0] == pr.get("codec")), None) + res = next((r for r in RESOLUTIONS if r[0] == pr.get("res")), None) + fps, m = fps_parse(pr.get("fps", "")) + if codec and res and fps: + await self.cam.set_codec(codec[1], codec[2]) + sf, sm = (fps_parse(pr["sfps"]) if pr.get("sfps") not in (None, "", "igual") else (0, False)) + await self.cam.set_recording_format(fps, sf, res[1], res[2], m_rate=m, sensor_m_rate=sm, + off_speed=bool(sf), windowed=bool(pr.get("window"))) + + self._send(go(), f"Preset {name}") + self.notify(f"Aplicando preset «{name}»", "ok", 3) + + # ---------------------------------------------------------- estado de controles y REC + def _update_rec_info(self): + bits = [t for t in (self.format_var.get(), self.codec_var.get()) if t] + self.rec_info_var.set(" · ".join(bits)) + + # ---------------------------------------------------------- sincronía de parámetros nuevos + def _sync_extra(self, cat, par, values): + key = (cat, par) + if cat == 2 and values: + if par in (0, 1, 2, 3): + self._sync_slider(f"2.{par}", float(values[0])) + elif par == 4 and 0 <= values[0] < len(AUDIO_INPUTS): + self.audio_in_var.set(AUDIO_INPUTS[values[0]]) + elif par == 5 and len(values) >= 2: + self._audio_in = [float(values[0]), float(values[1])] + self._sync_slider("2.5.0", self._audio_in[0]) + self._sync_slider("2.5.1", self._audio_in[1]) + elif par == 6: + self.phantom_var.set(bool(values[0])) + elif key == (3, 3) and len(values) >= 4: + self._guides = [int(v) for v in values[:4]] + if 0 <= self._guides[0] < len(GUIDE_STYLES): + self.guide_style_var.set(GUIDE_STYLES[self._guides[0]]) + self._sync_slider("guide_op", self._guides[1]) + self._sync_slider("guide_safe", self._guides[2]) + for bit, v in self.grid_vars.items(): + v.set(bool(self._guides[3] & bit)) + elif cat == 4 and values: + if par in (0, 2, 3): + self._sync_slider(f"4.{par}", float(values[0])) + elif par == 7: + self.tcsrc_var.set("Timecode" if values[0] else "Clip") + elif cat == 5 and values: + if par == 0: + self._sync_slider("5.1", float(values[0])) + self._sync_slider("5.2", float(values[0])) + elif par in (1, 2): + self._sync_slider(f"5.{par}", float(values[0])) + elif cat == 8 and values: + if par in (0, 1, 2, 3) and len(values) >= 4: + self._colour[par] = [float(v) for v in values[:4]] + for i in range(4): + s, lo, hi = self._colour_sliders[(par, i)] + s.set((self._colour[par][i] - lo) / (hi - lo)) + elif par == 4 and len(values) >= 2: + self._contrast = [float(values[0]), float(values[1])] + self._sync_slider("8.4.0", self._contrast[0]) + self._sync_slider("8.4.1", self._contrast[1]) + elif par == 5: + self._sync_slider("8.5", float(values[0])) + elif par == 6 and len(values) >= 2: + self._huesat = [float(values[0]), float(values[1])] + self._sync_slider("8.6.0", self._huesat[0]) + self._sync_slider("8.6.1", self._huesat[1]) + elif key == (1, 8) and values and 0 <= values[0] < len(SHARPEN): + self.sharp_var.set(SHARPEN[values[0]]) + elif key == (1, 13) and values: + self.gain_var.set(int(values[0])) + elif key == (0, 6) and values: + self.ois_var.set(bool(values[0])) + elif key == (10, 1) and len(values) >= 3: + self.loop_var.set(bool(values[2] & 1)) + self.playall_var.set(bool(values[2] & 2)) + elif cat == 12: + if par == 0 and values: + self.reel_var.set(int(values[0])) + elif par == 1 and len(values) >= 3: + if -1 <= values[0] <= 5: + self.shot_var.set(SHOT_TAGS[values[0] + 1]) + self.intext_var.set("Exterior" if values[1] else "Interior") + self.daynight_var.set("Día" if values[2] else "Noche") + elif par == 2 and values and isinstance(values[0], str): + self.scene_var.set(values[0]) + elif par == 3 and len(values) >= 2: + self.take_var.set(int(values[0])) + if -1 <= values[1] <= 2: + self.taketag_var.set(TAKE_TAGS[values[1] + 1]) + elif par == 4 and values: + self.goodtake_var.set(bool(values[0])) + elif par in (5, 6, 7, 8) and values and isinstance(values[0], str): + {5: self.camid_var, 6: self.operator_var, 7: self.director_var, 8: self.project_var}[par].set(values[0]) + + # ------------------------------------------------------------ helpers + def log(self, text): + stamp = time.strftime("%H:%M:%S") + # Copia en labmagic.log (se reinicia al arrancar) para diagnosticar sin la ventana + try: + with open(LOG_PATH, "a", encoding="utf-8") as fh: + fh.write(f"{stamp} {text}\n") + except OSError: + pass + self.log_text.configure(state="normal") + self.log_text.insert("end", f"{stamp} {text}\n") + self.log_text.see("end") + lines = int(self.log_text.index("end-1c").split(".")[0]) + if lines > 500: + self.log_text.delete("1.0", f"{lines - 500}.0") + self.log_text.configure(state="disabled") + + def clear_log(self): + self.log_text.configure(state="normal") + self.log_text.delete("1.0", "end") + self.log_text.configure(state="disabled") + + def _set_led(self, color): + self.led.itemconfigure(self.led_item, fill=color) + + def _draw_rec(self, hover=False): + c = self.rec_canvas + c.delete("all") + ring = "#5a5a5a" if (hover and self.connected) else "#333333" + c.create_oval(3, 3, 45, 45, outline=ring, width=2) + color = REC if self.connected else "#5a2022" + if self.recording: + c.create_rectangle(15, 15, 33, 33, fill=color, outline=color) + else: + c.create_oval(9, 9, 39, 39, fill=color, outline=color) + + def _blink_tick(self): + self._blink = not self._blink + if self.recording: + self.rec_dot.configure(fg=REC if self._blink else HUD) + else: + self.rec_dot.configure(fg=HUD) + self.after(600, self._blink_tick) + + def _set_controls_enabled(self, enabled): + state = "normal" if enabled else "disabled" + if not enabled: + self.aperture_value = None + self.focus_value = None + self._lens_type = None + self._focus_reported = False + for b in self.aperture_nudge_btns: + b.configure(state="disabled") + for s in (self.focus_slider, self.aperture_slider): + s.set_enabled(enabled) + for w in (self.btn_af, self.dr_combo, self.ae_combo, self.lut_combo, self.lut_toggle, self.codec_combo, + self.res_combo, self.fps_combo, self.sfps_combo, self.window_toggle, self.btn_format, + self.sharp_combo, self.gain_spin, self.ois_toggle): + try: + if isinstance(w, ttk.Combobox): + w.configure(state="readonly" if enabled else "disabled") + else: + w.configure(state=state) + except tk.TclError: + pass + self._update_focus_mode() + self._draw_rec() + + def _send(self, coro, what="", popup=False): + fut = self.worker.submit(coro) + + def done(f): + try: + f.result() + except Exception as e: # noqa: BLE001 + msg = str(e).strip() + if not msg: + # bleak lanza TimeoutError sin texto cuando la cámara no responde (apagada, dormida o lejos) + msg = ("la cámara no responde: comprueba que esté encendida, con Bluetooth activado " + "(Ajustes > Setup) y cerca del PC" if isinstance(e, TimeoutError) else type(e).__name__) + self.events.put({"kind": "error", "text": f"{what}: {msg}", "popup": popup, "t": time.time()}) + + fut.add_done_callback(done) + return fut + + def _on_slider(self, key, value): + if key == "focus": + self.focus_value = value + self.focus_lbl.configure(text=f"{value:.2f}") + self._throttle(key, lambda v=value: self._send(self.cam.set_focus(v), "Foco")) + elif key == "aperture": + self.aperture_value = value + self._throttle(key, lambda v=value: self._send(self.cam.set_aperture_norm(v), "Apertura")) + elif key == "zoom": + self.zoom_value = value + self._throttle(key, lambda v=value: self._send(self.cam.set_zoom_norm(v), "Zoom")) + + def _throttle(self, key, fn): + self._pending[key] = fn + if not self._flush_scheduled: + self._flush_scheduled = True + self.after(120, self._flush) + + def _flush(self): + self._flush_scheduled = False + pending, self._pending = self._pending, {} + for fn in pending.values(): + fn() + + # ------------------------------------------------ menús del HUD + def _set_wb(self, kelvin, tint): + k = kelvin if kelvin is not None else (self.wb_kelvin or int(self.wb_var.get() or 5600)) + t = tint if tint is not None else (self.wb_tint if self.wb_tint is not None else 0) + self.wb_var.set(k) + self.tint_var.set(t) + self._send(self.cam.set_white_balance(k, t), "Balance de blancos") + + # ------------------------------------------------ emparejamiento y peaking + PEAK_COLOURS = [("Rojo", 0), ("Verde", 1), ("Azul", 2), ("Blanco", 3), ("Negro", 4)] + + def _peak_colour_text(self): + for name, idx in self.PEAK_COLOURS: + if idx == self.peak_colour: + return f"{name} ▾" + return "Color ▾" + + def _menu_peak_colour(self): + m = tk.Menu(self, tearoff=0, bg="#1e1e1e", fg=FG, activebackground=FG, activeforeground="#000000", + bd=0, relief="flat", font=self.F_UI, activeborderwidth=0) + for name, idx in self.PEAK_COLOURS: + m.add_command(label=name, command=lambda idx=idx: self._set_peak_colour(idx)) + x = self.peak_colour_btn.winfo_rootx() + y = self.peak_colour_btn.winfo_rooty() + self.peak_colour_btn.winfo_height() + try: + m.tk_popup(x, y) + finally: + m.grab_release() + + def _set_peak_colour(self, idx): + self.peak_colour = idx + self.cfg["peak_colour"] = idx + save_config(self.cfg) + self.peak_colour_btn.configure(text=self._peak_colour_text()) + if self.connected and self.peak_var.get(): + self.apply_peaking() + + def apply_peaking(self): + """Enciende o apaga el focus assist con líneas de color (misma variable en ambos conmutadores).""" + if not self.connected: + self.peak_var.set(False) + self.log("Conecta la cámara para activar el peaking.") + return + self._send(self.cam.set_peaking(self.peak_var.get(), self.peak_colour, self.zebra_var.get(), + self.false_var.get(), self._targets()), "Peaking") + + def _offer_close_settings(self): + """Windows no soltó el enlace: ofrecer cerrar la ventana de Configuración y reconectar.""" + if not self.connected: + return + if messagebox.askyesno( + "Leer la configuración de la cámara", + "La cámara solo envía todos sus valores (ISO, obturador, formato...) cuando el enlace " + "Bluetooth es nuevo, y Windows no lo ha soltado: casi siempre es la ventana de " + "Configuración > Bluetooth.\n\n¿Cerrar esa ventana de Windows y reconectar ahora?", + ): + self.reconnect_fresh() + + def reconnect_fresh(self): + """Cierra Configuración de Windows (si está abierta), corta el enlace y vuelve a conectar.""" + import subprocess + + try: + si = subprocess.STARTUPINFO() + si.dwFlags |= subprocess.STARTF_USESHOWWINDOW + subprocess.run(["taskkill", "/IM", "SystemSettings.exe", "/F"], capture_output=True, timeout=10, + startupinfo=si) + self.log("Ventana de Configuración de Windows cerrada.") + except Exception as e: # noqa: BLE001 + self.log(f"No se pudo cerrar Configuración de Windows: {e}") + addr = self.cfg.get("last_address") + name = None + for d in self.devices: + if d["address"].upper() == (addr or "").upper(): + name = d.get("name") + if not addr: + return + + async def go(): + await self.cam.disconnect() + await self.cam._wait_link_down(addr, 25.0) + await self.cam.connect(addr, name) + + self.btn_connect.configure(state="disabled") + self._send(go(), "Reconexión", popup=True) + + def pair_camera(self): + if self.connected: + self._send(self.cam.disconnect(), "Desconectar") + idx = self.device_combo.current() + if idx < 0 or idx >= len(self.devices): + messagebox.showinfo("Labmagic", "Primero busca y elige una cámara en la lista.") + return + d = self.devices[idx] + if not messagebox.askokcancel( + "Emparejar con la cámara", + "Se quitará el emparejamiento anterior de Windows y se pedirá uno nuevo.\n\n" + "En la cámara, ten el Bluetooth activado (Ajustes > Setup > Bluetooth). Cuando Windows " + "lo solicite, la cámara mostrará un PIN de 6 cifras en pantalla: escríbelo en la ventana " + "que aparecerá aquí.\n\n¿Continuar?", + ): + return + self.cfg["last_address"] = d["address"] + save_config(self.cfg) + self.btn_pair.configure(state="disabled") + self.btn_connect.configure(state="disabled") + self._send(self.cam.pair(d["address"], self._ask_pin_blocking, d.get("name")), "Emparejar", popup=True) + + def _ask_pin_blocking(self): + """Se llama desde un hilo auxiliar: pide el PIN a la ventana y espera la respuesta.""" + reply = queue.Queue() + self.events.put({"kind": "ask_pin", "reply": reply, "t": time.time()}) + try: + return reply.get(timeout=240) + except queue.Empty: + return None + + def _show_pin_dialog(self, reply): + win = tk.Toplevel(self) + win.title("PIN de la cámara") + win.configure(bg=CARD) + win.resizable(False, False) + win.transient(self) + win.grab_set() + tk.Label(win, text="Escribe el PIN que muestra la cámara en su pantalla", bg=CARD, fg=FG, + font=self.F_BIG).pack(padx=24, pady=(20, 6)) + tk.Label(win, text="Son 6 cifras. Tienes unos 30 segundos antes de que caduque.", bg=CARD, fg=MUTED, + font=self.F_UI).pack(padx=24) + var = tk.StringVar() + entry = tk.Entry(win, textvariable=var, font=self.F_TC, width=8, justify="center", bg=FIELD, fg=FG, + insertbackground=FG, relief="flat", highlightthickness=1, highlightbackground=BORDER, + highlightcolor=FG) + entry.pack(padx=24, pady=16, ipady=6) + done = {"sent": False} + + def finish(value): + if not done["sent"]: + done["sent"] = True + reply.put(value) + try: + win.grab_release() + win.destroy() + except tk.TclError: + pass + + row = tk.Frame(win, bg=CARD) + row.pack(pady=(0, 20)) + ttk.Button(row, text="Emparejar", style="Big.TButton", + command=lambda: finish(var.get().strip() or None)).pack(side="left", padx=6) + ttk.Button(row, text="Cancelar", command=lambda: finish(None)).pack(side="left", padx=6) + entry.bind("", lambda e: finish(var.get().strip() or None)) + win.protocol("WM_DELETE_WINDOW", lambda: finish(None)) + win.update_idletasks() + x = self.winfo_rootx() + (self.winfo_width() - win.winfo_width()) // 2 + y = self.winfo_rooty() + (self.winfo_height() - win.winfo_height()) // 3 + win.geometry(f"+{max(0, x)}+{max(0, y)}") + entry.focus_set() + try: + self._dark_title_bar_for(win) + except Exception: # noqa: BLE001 + pass + + def _dark_title_bar_for(self, win): + win.update_idletasks() + hwnd = ctypes.windll.user32.GetParent(win.winfo_id()) + value = ctypes.c_int(1) + for attr in (20, 19): + if ctypes.windll.dwmapi.DwmSetWindowAttribute(hwnd, attr, ctypes.byref(value), 4) == 0: + break + + # ------------------------------------------------------------ acciones + def scan(self): + if not self.connected: + self.btn_scan.configure(state="disabled") + self.device_combo.set("Buscando...") + self._send(self.cam.find_cameras(4.0), "Búsqueda") + + def toggle_connect(self): + if self.connected: + self._send(self.cam.disconnect(), "Desconectar") + return + idx = self.device_combo.current() + if idx < 0 or idx >= len(self.devices): + messagebox.showinfo("Labmagic", "Primero busca y elige una cámara en la lista.") + return + addr = self.devices[idx]["address"] + name = self.devices[idx].get("name") + self.cfg["last_address"] = addr + save_config(self.cfg) + self.btn_connect.configure(state="disabled") + self._send(self.cam.connect(addr, name), "Conexión", popup=True) + + def autofocus(self): + if not self.connected: + return + self._send(self.cam.autofocus(), "Autofoco") + # Tras un AF la posición real del objetivo ya no es la última enviada (la cámara no la informa) + if not self._focus_reported: + self.focus_value = None + self.focus_lbl.configure(text="—") + # La cámara no confirma el AF: damos respuesta visual al enviar y recordamos las condiciones + try: + self.btn_af.configure(text="AF ● enviado") + self.after(900, lambda: self.btn_af.configure(text="AUTOFOCO (AF)")) + except tk.TclError: + pass + if not self._af_hint_shown: + self._af_hint_shown = True + self.log("AF enviado (paquete oficial 0.1). La cámara no confirma si el objetivo enfoca: el " + "interruptor del objetivo debe estar en AF y el adaptador debe admitir AF con ese " + "objetivo. Prueba: si el botón Focus de la propia cámara tampoco enfoca, es el " + "adaptador/objetivo, no la app.") + + def _space_af(self, event): + """Barra espaciadora = AF, salvo cuando se está escribiendo en un campo.""" + w = self.focus_get() + if isinstance(w, (tk.Entry, tk.Text, ttk.Entry, ttk.Spinbox, ttk.Combobox)): + return None + self.autofocus() + return "break" + + def _arrow_focus(self, event, delta): + """Flechas del teclado = pasos de foco, salvo cuando se está escribiendo en un campo.""" + w = self.focus_get() + if isinstance(w, (tk.Entry, tk.Text, ttk.Entry, ttk.Spinbox, ttk.Combobox)): + return None + if not self.connected: + return None + self.nudge_focus(delta) + return "break" + + def _af_tick(self): + if self.af_auto_var.get() and self.connected: + self.autofocus() + try: + secs = max(1, int(self.af_every_var.get())) + except (tk.TclError, ValueError): + secs = 5 + self.after(secs * 1000, self._af_tick) + + def _update_focus_mode(self): + """Objetivos EF por adaptador: la cámara solo admite AF; el foco manual no está disponible.""" + lens = (self._lens_type or "").upper() + ef = bool(lens) and ("EF" in lens or "X " in lens) and not self._focus_reported + manual_ok = self.connected + self.focus_slider.set_enabled(manual_ok) + for b in self.focus_nudge_btns: + b.configure(state="normal" if manual_ok else "disabled") + if ef: + self.focus_note_var.set("EF: tras AF el foco marca — · espacio = AF · ← → foco") + else: + self.focus_note_var.set("espacio = AF · ← → foco · Mayús = pasos grandes") + + def nudge_focus(self, delta): + if not self.connected: + return + if self.focus_value is None: + self._send(self.cam.offset_focus(delta), "Foco") + return + v = max(0.0, min(1.0, self.focus_value + delta)) + self.focus_value = v + self.focus_slider.set(v) + self.focus_lbl.configure(text=f"{v:.2f}") + self._send(self.cam.set_focus(v), "Foco") + + def nudge_aperture(self, delta): + if not self.connected: + return + if self.aperture_value is None: + self.log("Aún no se conoce la apertura actual: usa el deslizador o el menú IRIS del HUD.") + return + v = max(0.0, min(1.0, self.aperture_value + delta)) + self.aperture_value = v + self.aperture_slider.set(v) + self._send(self.cam.set_aperture_norm(v), "Apertura") + + def apply_wb(self): + try: + k, t = int(self.wb_var.get()), int(self.tint_var.get()) + except (tk.TclError, ValueError): + return + self._send(self.cam.set_white_balance(k, t), "Balance de blancos") + + def apply_wb_preset(self, _event=None): + name = self.wb_preset_var.get() + for label, k, t in WB_PRESETS: + if label == name: + self.wb_var.set(k) + self.tint_var.set(t) + self.apply_wb() + break + + def apply_lut(self): + name = self.lut_var.get() + idx = LUTS.index(name) if name in LUTS else 0 + self._send(self.cam.set_display_lut(idx, self.lut_on_var.get()), "LUT") + + def _targets(self): + """Bits de pantallas destino según el selector Aplicar en (HDMI / LCD / ambas).""" + t = self.target_var.get() + if t == "hdmi": + return Camera.OUT_HDMI + if t == "lcd": + return Camera.OUT_LCD + return Camera.OUT_LCD | Camera.OUT_HDMI + + def _on_target_change(self): + self.cfg["monitor_target"] = self.target_var.get() + save_config(self.cfg) + if self.connected: + self.apply_tools() + self.apply_overlays() + + def apply_tools(self): + if not self.connected: + return + self._send(self.cam.set_tools(self.zebra_var.get(), self.peak_var.get(), self.false_var.get(), + self._targets()), "Ayudas") + + def apply_overlays(self): + if not self.connected: + return + self._send(self.cam.set_overlays(self.status_ov_var.get(), self.guides_ov_var.get(), + self.clean_ov_var.get(), self._targets()), "Overlays") + + def apply_format(self): + if not self.connected: + return + fps, m_rate = fps_parse(self.fps_var.get()) + if not fps: + self.log("Elige los fotogramas por segundo.") + return + res = next((r for r in RESOLUTIONS if r[0] == self.res_var.get()), None) + if res is None: + self.log("Elige una resolución.") + return + sensor_label = self.sfps_var.get() + if sensor_label and sensor_label != "igual": + sfps, s_m_rate = fps_parse(sensor_label) + off_speed = True + else: + sfps, s_m_rate, off_speed = 0, False, False + codec = next((c for c in CODEC_CHOICES if c[0] == self.codec_sel_var.get()), None) + if codec is not None: + self._send(self.cam.set_codec(codec[1], codec[2]), "Códec") + self._send(self.cam.set_recording_format(fps, sfps, res[1], res[2], m_rate=m_rate, sensor_m_rate=s_m_rate, + off_speed=off_speed, windowed=self.window_var.get()), "Formato") + self.log(f"-> Formato pedido: {res[1]}×{res[2]} · {self.fps_var.get()} fps" + + (f" · sensor {sensor_label} fps" if off_speed else "") + + (" · ventana" if self.window_var.get() else "") + + (f" · {codec[0]}" if codec else "")) + + def toggle_record(self): + if not self.connected: + return + self._send(self.cam.set_recording(not self.recording), "Grabación") + + def power_off(self): + if not self.connected: + return + if messagebox.askyesno("Apagar cámara", "¿Apagar la cámara ahora? Tendrás que encenderla a mano."): + self._send(self.cam.power_off(), "Apagar") + + # -------------------------------------------------------- eventos BLE + def _poll_events(self): + try: + while True: + ev = self.events.get_nowait() + try: + self._handle_event(ev) + except Exception as e: # noqa: BLE001 + self.log(f"Error interno procesando {ev.get('kind')}: {e}") + except queue.Empty: + pass + if self.connected and self._connect_time and not self._payload_warned: + if time.time() - self._connect_time > 4 and self._payload_count < 10: + self._payload_warned = True + self.log("La cámara no ha enviado su configuración completa (Windows reutilizó un enlace " + "Bluetooth ya abierto). Los controles funcionan igual y los valores se irán " + "rellenando según los toques. Para sincronizar todo: cierra la ventana de " + "Configuración > Bluetooth de Windows (o apaga y enciende el Bluetooth de la " + "cámara) y vuelve a conectar.") + try: + while True: + d = self.web_cmds.get_nowait() + try: + self._web_cmd(d) + except Exception as e: # noqa: BLE001 + self.log(f"Panel OBS, orden {d.get('cmd')}: {e}") + except queue.Empty: + pass + if self.dock_running: + try: + self.dock.publish(self._web_state()) + except Exception as e: # noqa: BLE001 + self.log(f"Panel OBS, estado: {e}") + self._poll_id = self.after(50, self._poll_events) + + # ------------------------------------------------------------ panel para OBS + def _cell_text(self, cell): + t = cell.val.cget("text") + return "" if t == "—" else t + + def _web_state(self): + angle = speed = None + try: + angle = float(self.angle_var.get()) if self.angle_var.get() else None + except ValueError: + pass + if self.speed_var.get().isdigit(): + speed = int(self.speed_var.get()) + return { + "connected": self.connected, + "busy": self.led.itemcget(self.led_item, "fill") == LED_BUSY, + "name": self.name_var.get(), + "status": self.status_var.get(), + "power": self.power_var.get() if self.power_var.get() != "—" else "", + "tc": self.tc_var.get(), + "rec": self.recording, + "fps": self._cell_text(self.cell_fps), + "shutter": self._cell_text(self.cell_shutter), + "angle": angle, "speed": speed, + "iris": self._cell_text(self.cell_iris), + "iso": self.iso_var.get(), + "wb": self.wb_kelvin, + "tint": self.wb_tint if self.wb_kelvin else None, + "focus": self.focus_value, + "focus_text": self.focus_lbl.cget("text"), + "aperture": self.aperture_value, + "peak": bool(self.peak_var.get()), "peak_colour": self.peak_colour, + "zebra": bool(self.zebra_var.get()), "false": bool(self.false_var.get()), + "af_auto": bool(self.af_auto_var.get()), + "rec_info": self.rec_info_var.get(), + "lens": self.lens_var.get().replace("Objetivo: ", ""), + "notice": self._notice, + } + + def _web_cmd(self, d): + c = d.get("cmd") + if c == "show": + self.deiconify() + self.lift() + self.focus_force() + return + if c == "connect": + self.toggle_connect() + return + if not self.connected: + return + if c == "af": + self.autofocus() + elif c == "focus": + v = max(0.0, min(1.0, float(d.get("v", 0)))) + self.focus_slider.set(v) + self._on_slider("focus", v) + elif c == "focus_delta": + self.nudge_focus(float(d.get("d", 0))) + elif c == "iris": + v = max(0.0, min(1.0, float(d.get("v", 0)))) + self.aperture_slider.set(v) + self._on_slider("aperture", v) + elif c == "iris_delta": + self.nudge_aperture(float(d.get("d", 0))) + elif c == "iris_f": + self._send(self.cam.set_aperture_fstop(float(d["f"])), "Apertura") + elif c == "auto_iris": + self._send(self.cam.auto_iris(), "Auto iris") + elif c == "iso": + self._send(self.cam.set_iso(int(d["v"])), "ISO") + elif c == "angle": + self._send(self.cam.set_shutter_angle(float(d["a"])), "Obturador") + elif c == "speed": + self._send(self.cam.set_shutter_speed(int(d["s"])), "Obturador") + elif c == "wb": + self._set_wb(int(d.get("k", 5600)), int(d.get("t", 0))) + elif c == "awb": + self._send(self.cam.auto_white_balance(), "Auto WB") + elif c == "peak": + self.peak_var.set(bool(d.get("on"))) + self.apply_peaking() + elif c == "peak_colour": + self._set_peak_colour(int(d.get("c", 0))) + elif c == "zebra": + self.zebra_var.set(bool(d.get("on"))) + self.apply_tools() + elif c == "false": + self.false_var.set(bool(d.get("on"))) + self.apply_tools() + elif c == "af_auto": + self.af_auto_var.set(bool(d.get("on"))) + elif c == "record": + self.toggle_record() + else: + self.log(f"Panel OBS: orden desconocida {c}") + + def toggle_dock(self): + on = bool(self.obs_dock_var.get()) + self.cfg["obs_dock"] = on + save_config(self.cfg) + if on and not self.dock_running: + self.dock_running = self.dock.start() + if not self.dock_running: + self.notify(self.dock.error or "No se pudo abrir el panel para OBS", "warn", 8) + self.obs_dock_var.set(False) + elif not on and self.dock_running: + self.dock.stop() + self.dock_running = False + self._update_dock_line() + + def _update_dock_line(self): + self.dock_url_var.set(self.dock.url if self.dock_running else "panel apagado") + + def copy_dock_url(self): + self.clipboard_clear() + self.clipboard_append(self.dock.url) + self.notify("URL copiada: en OBS, Docks → Custom Browser Docks → pégala con el nombre Labmagic", "ok", 6) + + def add_dock_to_obs(self): + ok, msg = obs_add_browser_dock("Labmagic", self.dock.url) + self.notify(msg, "ok" if ok else "warn", 10) + self.log(("Panel OBS: " if ok else "Panel OBS, no añadido: ") + msg) + + def _handle_event(self, ev): + kind = ev["kind"] + if kind == "log": + self.log(ev["text"]) + elif kind == "error": + self.log(f"ERROR {ev['text']}") + self.notify(ev["text"], "error", 10 if ev.get("popup") else 6) + if not self.connected: + self.btn_connect.configure(state="normal") + self.btn_scan.configure(state="normal") + self.btn_pair.configure(state="normal") + self._set_led(LED_OFF) + if "emparej" in ev["text"].lower(): + self.status_var.set("Hace falta emparejar: pulsa «Emparejar (PIN)»") + else: + self.status_var.set("Desconectada") + elif kind == "devices": + self.devices = ev["devices"] + labels = [] + for d in self.devices: + extra = [] + if d.get("paired"): + extra.append("emparejada") + extra.append(f"{d['rssi']} dBm" if d.get("rssi") is not None else "no se anuncia ahora") + labels.append(f"{d['name']} · {d['address']} ({', '.join(extra)})") + self.device_combo.configure(values=labels) + self.btn_scan.configure(state="normal") + if labels: + sel = 0 + last = (self.cfg.get("last_address") or "").upper() + for i, d in enumerate(self.devices): + if d["address"].upper() == last: + sel = i + self.device_combo.current(sel) + # Conexión automática al abrir (solo la primera búsqueda y si la cámara de siempre está) + if (not self._autoconnected and self.autoconnect_var.get() and not self.connected + and self.devices[sel]["address"].upper() == last): + self._autoconnected = True + self.after(200, self.toggle_connect) + else: + self.device_combo.set("No se ha encontrado ninguna cámara") + elif kind == "connecting": + self._set_led(LED_BUSY) + self.status_var.set(ev.get("text") or f"Conectando con {ev['address']}...") + elif kind == "ask_pin": + self._show_pin_dialog(ev["reply"]) + elif kind == "pairing": + stage = ev.get("stage") + self._set_led(LED_BUSY) + if stage == "start": + self.status_var.set("Emparejando: preparando...") + elif stage == "requested": + self.status_var.set("Emparejando: mira el PIN en la pantalla de la cámara") + elif stage == "done": + self.status_var.set("Emparejada. Conectando...") + elif stage == "failed": + self._set_led(LED_OFF) + self.status_var.set("No se pudo emparejar") + self.btn_pair.configure(state="normal") + self.btn_connect.configure(state="normal") + elif kind == "needs_pairing": + self.status_var.set("Hace falta emparejar: pulsa «Emparejar (PIN)»") + self.btn_pair.configure(state="normal") + elif kind == "connected": + self.connected = True + self._connect_time = time.time() + self._payload_count = 0 + self._payload_warned = False + self._set_led(LED_ON) + self.name_var.set(ev.get("name") or "Cámara") + self.btn_connect.configure(text="Desconectar", state="normal") + self.btn_pair.configure(state="normal") + self.btn_scan.configure(state="disabled") + self._set_controls_enabled(True) + self._update_status_line(ev.get("protocol")) + if ev.get("payload") is False: + self._payload_warned = True # el módulo ya lo ha explicado en el registro + self.notify("La cámara no envió su configuración: vuelve a conectar", "warn", 8) + if self._link_held: + self._link_held = False + self.after(200, self._offer_close_settings) + elif kind == "link_held": + self._link_held = True + elif kind == "disconnected": + self.connected = False + self.recording = False + self._set_led(LED_OFF) + self.btn_connect.configure(text="Conectar", state="normal") + self.btn_scan.configure(state="normal") + self.btn_pair.configure(state="normal") + self._set_controls_enabled(False) + self.status_var.set("Desconectada" + (" · la cámara cortó la conexión" if ev.get("reason") == "remote" else "")) + self.tc_var.set("00:00:00:00") + self.tc_label.configure(fg=FG) + self.power_var.set("—") + self._update_record_ui() + elif kind == "status": + self._update_status_line() + elif kind == "timecode": + self.tc_var.set(ev["timecode"]) + elif kind == "sent": + name = PARAM_NAMES.get((ev["cat"], ev["par"]), f"{ev['cat']}.{ev['par']}") + if ev["raw"]: + vals = decode_data(ev["dtype"], ev["raw"]) + shown = ", ".join(f"{v:.3f}" if isinstance(v, float) else str(v) for v in vals) + else: + shown = "(orden)" + op = " (relativo)" if ev.get("op") == 1 else "" + self.log(f"-> {name}{op}: {shown}") + elif kind == "param": + self._payload_count += 1 + self._on_param(ev["cat"], ev["par"], ev["values"], ev["raw"]) + + def _update_status_line(self, protocol=None): + if not self.connected: + return + parts = [] + if self.cam.power_on is not None: + parts.append("encendida" if self.cam.power_on else "apagada") + proto = protocol if protocol is not None else self.cam.protocol_version + if proto: + parts.append(f"protocolo {proto}") + self.status_var.set("Conectada · " + " · ".join(parts) if parts else "Conectada") + pw = self.cam.state.get((9, 0)) + if pw and len(pw[2]) >= 2: + self.power_var.set(f"{pw[2][0] / 1000:.1f} V · {pw[2][1]} %") + + def _update_lens_line(self): + st = self.cam.state + bits = [] + for key in ((12, 9), (12, 11), (12, 10), (12, 12)): + v = st.get(key) + if v and v[2] and isinstance(v[2][0], str) and v[2][0].strip(): + bits.append(v[2][0].strip()) + z = st.get((0, 7)) + if z and z[2] and not any("mm" in b for b in bits): + bits.append(f"{z[2][0]} mm") + self.lens_var.set(("Objetivo: " + " · ".join(bits)) if bits else "") + + def _update_record_ui(self): + self._draw_rec() + if self.recording: + self.rec_state_var.set("GRABANDO") + self.rec_state_lbl.configure(fg=REC) + self.tc_label.configure(fg=REC) + else: + self.rec_state_var.set("GRABAR") + self.rec_state_lbl.configure(fg=FG) + self.tc_label.configure(fg=FG) + self.rec_dot.configure(fg=HUD) + + def _on_param(self, cat, par, values, raw): + key = (cat, par) + name = PARAM_NAMES.get(key) + if (name and cat != 9) or self.show_all_var.get(): + shown = ", ".join(f"{v:.3f}" if isinstance(v, float) else str(v) for v in values) + self.log(f"<- {name or f'{cat}.{par}'}: {shown}") + + if key == (0, 0) and values: + self.focus_value = values[0] + self.focus_slider.set(values[0]) + self.focus_lbl.configure(text=f"{values[0]:.2f}") + if not self._focus_reported: + self._focus_reported = True + self._update_focus_mode() + elif key == (0, 2) and values: + f = 2 ** (values[0] / 2) + txt = f"f/{f:.1f}" + self.aperture_lbl.configure(text=txt) + if not self._lens_iris_text: + self.cell_iris.set(txt) + elif key == (0, 3) and values: + self.aperture_value = values[0] + self.aperture_slider.set(values[0]) + if self.connected: + for b in self.aperture_nudge_btns: + b.configure(state="normal") + elif key == (0, 7) and values: + self.zoom_lbl.configure(text=f"{values[0]} mm") + self._update_lens_line() + elif key == (0, 8) and values: + self.zoom_value = values[0] + self.zoom_slider.set(values[0]) + elif key == (1, 2) and len(values) >= 2: + self.wb_kelvin, self.wb_tint = values[0], values[1] + self.wb_var.set(values[0]) + self.tint_var.set(values[1]) + self.cell_wb.set(f"{values[0]}K") + self.cell_tint.set(f"{values[1]:+d}" if values[1] else "0") + elif key == (1, 7) and values: + if 0 <= values[0] < len(DR_MODES): + self.dr_var.set(DR_MODES[values[0]]) + elif key == (1, 9) and len(values) >= 5: + fps, sfps, w, h, flags = values[:5] + fps_txt = fps_label(fps, bool(flags & 1)) + extra = [] + if flags & 4 and sfps and sfps != fps: + extra.append(f"sensor {fps_label(sfps, bool(flags & 2))} fps") + if flags & 16: + extra.append("ventana") + self.format_var.set(f"{w}×{h} · {fps_txt} fps" + (f" ({', '.join(extra)})" if extra else "")) + self.cell_fps.set(fps_txt) + self._update_rec_info() + # Reflejar en el panel de formato sin enviar nada + if fps_txt in FPS_CHOICES: + self.fps_var.set(fps_txt) + res = next((r for r in RESOLUTIONS if r[1] == w and r[2] == h), None) + self.res_var.set(res[0] if res else f"{w}×{h}") + if flags & 4 and sfps: + s_txt = fps_label(sfps, bool(flags & 2)) + self.sfps_var.set(s_txt if s_txt in SENSOR_FPS_CHOICES else "igual") + else: + self.sfps_var.set("igual") + self.window_var.set(bool(flags & 16)) + elif key == (1, 10) and values: + if 0 <= values[0] < len(AE_MODES): + self.ae_var.set(AE_MODES[values[0]]) + elif key == (1, 11) and values: + self.angle_var.set(f"{values[0] / 100:g}") + self.cell_shutter.set(f"{values[0] / 100:g}°") + elif key == (1, 12) and values: + self.speed_var.set(str(values[0])) + self.cell_shutter.set(f"1/{values[0]}") + elif key == (1, 14) and values: + self.iso_var.set(str(values[0])) + self.cell_iso.set(str(values[0])) + elif key == (1, 15) and len(values) >= 2: + if 0 <= values[0] < len(LUTS): + self.lut_var.set(LUTS[values[0]]) + self.lut_on_var.set(bool(values[1])) + elif key == (4, 1) and values: + bits = values[0] + self.zebra_var.set(bool(bits & 1)) + self.peak_var.set(bool(bits & 2)) + self.false_var.set(bool(bits & 4)) + elif key == (4, 5) and len(values) >= 2: + if 0 <= values[1] <= 4: + self.peak_colour = values[1] + self.peak_colour_btn.configure(text=self._peak_colour_text()) + elif key == (9, 0): + self._update_status_line() + elif key == (10, 0) and len(values) >= 2: + codec = CODECS.get(values[0], f"códec {values[0]}") + variant = CODEC_VARIANTS.get(values[0], {}).get(values[1], f"variante {values[1]}") + self.codec_var.set(f"{codec} {variant}") + self._update_rec_info() + choice = next((c for c in CODEC_CHOICES if c[1] == values[0] and c[2] == values[1]), None) + if choice: + self.codec_sel_var.set(choice[0]) + elif key == (3, 0) and values: + bits = values[0] + self.status_ov_var.set(bool(bits & 1)) + self.guides_ov_var.set(bool(bits & 2)) + self.clean_ov_var.set(bool(bits & 4)) + elif key == (10, 1) and values: + mode = values[0] + self.recording = mode == 2 + self._update_record_ui() + txt = {0: "en espera (preview)", 1: "reproduciendo", 2: "grabando"}.get(mode, f"modo {mode}") + self.transport_var.set(f"Transporte: {txt}") + elif key == (12, 10) and values and isinstance(values[0], str) and values[0].strip(): + self._lens_iris_text = values[0].strip() + self.cell_iris.set(self._lens_iris_text.replace("f", "f/", 1) if self._lens_iris_text.startswith("f") + and not self._lens_iris_text.startswith("f/") else self._lens_iris_text) + self._update_lens_line() + elif cat == 12 and par in (9, 11, 12): + if par == 9 and values and isinstance(values[0], str): + self._lens_type = values[0].strip() + self._update_focus_mode() + if par == 12 and values and isinstance(values[0], str) and values[0].strip(): + # Distancia de enfoque que informa el objetivo: la mostramos junto al deslizador + dist = values[0].strip() + pos = f"{self.focus_value:.2f} · " if self.focus_value is not None else "" + self.focus_lbl.configure(text=f"{pos}{dist}", width=14) + self._update_lens_line() + # Audio, guías, pantalla, tally, color, reproducción y pizarra + try: + self._sync_extra(cat, par, values) + except Exception as e: # noqa: BLE001 + self.log(f"Sincronía {cat}.{par}: {e}") + + # ------------------------------------------------------------- cierre + def on_close(self): + try: + self.after_cancel(self._poll_id) + except Exception: # noqa: BLE001 + pass + try: + self.cfg["pos"] = [self.winfo_x(), self.winfo_y()] + save_config(self.cfg) + except Exception: # noqa: BLE001 + pass + if self.connected: + try: + self.worker.submit(self.cam.disconnect()).result(timeout=3) + except Exception: # noqa: BLE001 + pass + self.worker.stop() + try: + self.dock.stop() + except Exception: # noqa: BLE001 + pass + self.destroy() + + +if __name__ == "__main__": + if not single_instance_or_focus(): + r = tk.Tk() + r.withdraw() + messagebox.showinfo("Labmagic", "BMPCC Control ya está abierta.") + sys.exit(0) + try: + open(LOG_PATH, "w", encoding="utf-8").close() + except OSError: + pass + app = App() + app.mainloop() diff --git a/bmpcc_ble.py b/bmpcc_ble.py new file mode 100644 index 0000000..851a5b3 --- /dev/null +++ b/bmpcc_ble.py @@ -0,0 +1,876 @@ +""" +Control de cámaras Blackmagic (Pocket Cinema Camera 4K/6K) por Bluetooth LE. + +Implementa el "Blackmagic Camera Control Protocol" sobre el servicio BLE de la +cámara. Toda la comunicación corre en un hilo propio con su bucle asyncio; la +interfaz gráfica habla con él mediante BleWorker.submit() y recibe eventos por +una cola (queue.Queue). +""" +import asyncio +import json +import math +import platform +import queue +import re +import struct +import subprocess +import threading +import time + +from bleak import BleakClient, BleakScanner + + +def _run_powershell(command: str) -> str: + """Ejecuta un comando de PowerShell sin ventana y devuelve su salida en UTF-8.""" + startupinfo = subprocess.STARTUPINFO() + startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW + full = "[Console]::OutputEncoding = [System.Text.Encoding]::UTF8; " + command + res = subprocess.run( + ["powershell", "-NoProfile", "-NonInteractive", "-Command", full], + capture_output=True, + timeout=20, + startupinfo=startupinfo, + ) + return res.stdout.decode("utf-8", errors="replace") + +# --------------------------------------------------------------------------- +# UUIDs del servicio Blackmagic Camera Service +# --------------------------------------------------------------------------- +SERVICE_UUID = "291d567a-6d75-11e6-8b77-86f30ca893d3" +CH_OUT = "5dd3465f-1aee-4299-8493-d2eca2f8e1bb" # Outgoing Camera Control (write) +CH_IN = "b864e140-76a0-416a-bf30-5876504537d9" # Incoming Camera Control (indicate) +CH_TIMECODE = "6d8f2110-86f1-41bf-9afb-451d87e976c8" # Timecode (notify) +CH_STATUS = "7fe8691d-95dc-4fc5-8abd-ca74339b51b9" # Camera Status (read/write/notify) +CH_DEVNAME = "ffac0c52-c9fb-41a0-b063-cc76282eb89c" # Device Name (write) +CH_PROTO_PREFIX = "8f1fd018-b508-456f-8f82-" # Protocol Version (read); el sufijo cambia + +# Tipos de dato del protocolo +T_VOID, T_INT8, T_INT16, T_INT32, T_INT64, T_STRING, T_FIXED16 = 0, 1, 2, 3, 4, 5, 128 +# Operaciones +OP_ASSIGN, OP_OFFSET, OP_REPORT = 0, 1, 2 + +# Nombres legibles de (categoría, parámetro) para el registro +PARAM_NAMES = { + (0, 0): "Foco", + (0, 1): "Autofoco", + (0, 2): "Apertura (AV)", + (0, 3): "Apertura normalizada", + (0, 4): "Apertura (ordinal)", + (0, 5): "Auto iris", + (0, 6): "Estabilización óptica", + (0, 7): "Zoom (mm)", + (0, 8): "Zoom normalizado", + (0, 9): "Zoom continuo", + (1, 0): "Modo de vídeo", + (1, 1): "Ganancia (antigua)", + (1, 2): "Balance de blancos", + (1, 3): "Auto balance de blancos", + (1, 4): "Restaurar auto WB", + (1, 5): "Exposición (µs)", + (1, 6): "Exposición (ordinal)", + (1, 7): "Rango dinámico", + (1, 8): "Nitidez", + (1, 9): "Formato de grabación", + (1, 10): "Modo de autoexposición", + (1, 11): "Ángulo de obturador", + (1, 12): "Velocidad de obturador", + (1, 13): "Ganancia (dB)", + (1, 14): "ISO", + (1, 15): "LUT de monitor", + (1, 16): "Filtro ND", + (2, 0): "Nivel de micrófono", + (2, 1): "Nivel de auriculares", + (2, 3): "Nivel de altavoz", + (2, 4): "Tipo de entrada de audio", + (2, 5): "Niveles de entrada", + (2, 6): "Alimentación phantom", + (3, 0): "Overlays activos", + (3, 3): "Overlays", + (4, 0): "Brillo de pantalla", + (4, 1): "Ayudas de exposición/enfoque", + (4, 2): "Nivel de zebra", + (4, 3): "Nivel de peaking", + (4, 4): "Barras de color (s)", + (4, 5): "Focus assist", + (5, 0): "Brillo tally", + (6, 0): "Fuente de referencia", + (7, 0): "Reloj", + (7, 1): "Idioma", + (8, 0): "Color: lift", + (8, 1): "Color: gamma", + (8, 2): "Color: gain", + (8, 3): "Color: offset", + (8, 4): "Color: contraste", + (8, 5): "Color: luma mix", + (8, 6): "Color: tono/saturación", + (8, 7): "Color: reset", + (9, 0): "Alimentación (mV, %, ?)", + (9, 4): "Timecode", + (10, 0): "Códec", + (10, 1): "Transporte", + (12, 0): "Metadatos: reel", + (12, 1): "Metadatos: etiquetas de escena", + (12, 2): "Metadatos: escena", + (12, 3): "Metadatos: toma", + (12, 4): "Metadatos: toma buena", + (12, 5): "Metadatos: id de cámara", + (12, 6): "Metadatos: operador", + (12, 7): "Metadatos: director", + (12, 8): "Metadatos: proyecto", + (12, 9): "Objetivo: tipo", + (12, 10): "Objetivo: iris", + (12, 11): "Objetivo: focal", + (12, 12): "Objetivo: distancia", + (12, 13): "Objetivo: filtro", +} + + +# --------------------------------------------------------------------------- +# Codificación / decodificación +# --------------------------------------------------------------------------- +def enc_fixed16(value: float) -> bytes: + """fixed16 = 5.11 con signo (valor * 2048), little-endian.""" + v = int(round(value * 2048)) + v = max(-32768, min(32767, v)) + return struct.pack(" bytes: + """Paquete del protocolo: cabecera de 4 bytes + comando 0 + datos, relleno a 4 bytes.""" + length = 4 + len(data) + pkt = bytes([255, length, 0, 0, category, parameter, dtype, op]) + data + pkt += b"\x00" * ((-len(pkt)) % 4) + return pkt + + +def decode_data(dtype: int, data: bytes): + """Convierte los bytes de datos a una lista de valores Python según el tipo.""" + try: + if dtype == T_VOID: + return list(data) + if dtype == T_INT8: + return list(struct.unpack(f"<{len(data)}b", data)) + if dtype == T_INT16: + n = len(data) // 2 + return list(struct.unpack(f"<{n}h", data[: n * 2])) + if dtype == T_INT32: + n = len(data) // 4 + return list(struct.unpack(f"<{n}i", data[: n * 4])) + if dtype == T_INT64: + n = len(data) // 8 + return list(struct.unpack(f"<{n}q", data[: n * 8])) + if dtype == T_STRING: + return [data.decode("utf-8", errors="replace").rstrip("\x00")] + if dtype == T_FIXED16: + n = len(data) // 2 + return [v / 2048.0 for v in struct.unpack(f"<{n}h", data[: n * 2])] + except struct.error: + pass + return list(data) + + +def parse_packets(buf: bytes): + """Trocea una notificación en paquetes (cat, par, tipo, op, datos). Puede venir más de uno.""" + out = [] + i = 0 + n = len(buf) + while i + 8 <= n: + length = buf[i + 1] + if length < 4: + break + cat, par, dtype, op = buf[i + 4], buf[i + 5], buf[i + 6], buf[i + 7] + data = bytes(buf[i + 8 : i + 4 + length]) + out.append((cat, par, dtype, op, data)) + i += 4 + length + i += (-i) % 4 + return out + + +def decode_timecode(data: bytes) -> str: + """Timecode BCD: bytes [FF, SS, MM, HH]; el bit alto de HH marca drop-frame.""" + if len(data) < 4: + return "--:--:--:--" + f, s, m, h = data[0], data[1], data[2], data[3] + sep = ";" if h & 0x80 else ":" + return f"{h & 0x7F:02x}:{m:02x}:{s:02x}{sep}{f:02x}" + + +# --------------------------------------------------------------------------- +# Hilo con bucle asyncio +# --------------------------------------------------------------------------- +class BleWorker: + """Ejecuta un bucle asyncio en un hilo aparte para que Tk no se bloquee.""" + + def __init__(self): + self.loop = asyncio.new_event_loop() + self._thread = threading.Thread(target=self._run, name="ble-loop", daemon=True) + self._thread.start() + + def _run(self): + asyncio.set_event_loop(self.loop) + self.loop.run_forever() + + def submit(self, coro): + """Lanza una corrutina en el bucle y devuelve un concurrent.futures.Future.""" + return asyncio.run_coroutine_threadsafe(coro, self.loop) + + def stop(self): + self.loop.call_soon_threadsafe(self.loop.stop) + + +# --------------------------------------------------------------------------- +# Cámara +# --------------------------------------------------------------------------- +class Camera: + """Una cámara Blackmagic por BLE. Los métodos async deben correr en el bucle del worker.""" + + def __init__(self, events: queue.Queue): + self.events = events + self.client = None + self.device = None + self.devices = {} # address -> BLEDevice (de la última búsqueda) + self.state = {} # (cat, par) -> (dtype, data bytes, valores) + self.protocol_version = "" + self.power_on = None + self._send_lock = asyncio.Lock() + self._proto_uuid = None + self._payload_count = 0 + self._payload_event = None + + # ----- eventos hacia la interfaz ------------------------------------- + def emit(self, kind: str, **payload): + payload["kind"] = kind + payload["t"] = time.time() + self.events.put(payload) + + def log(self, text: str): + self.emit("log", text=text) + + # ----- búsqueda y conexión ------------------------------------------ + async def scan(self, timeout: float = 5.0, emit_event: bool = True): + self.log(f"Buscando cámaras ({timeout:.0f} s)...") + found = await BleakScanner.discover(timeout=timeout, return_adv=True) + cams = [] + for address, (dev, adv) in found.items(): + uuids = [u.lower() for u in (adv.service_uuids or [])] + name = dev.name or adv.local_name or "" + if SERVICE_UUID in uuids or name.startswith("A:"): + self.devices[address] = dev + cams.append({"address": address, "name": name or "(sin nombre)", "rssi": adv.rssi}) + cams.sort(key=lambda c: -c["rssi"]) + if emit_event: + self.emit("devices", devices=cams) + self.log(f"Anunciándose ahora: {len(cams)} cámara(s).") + return cams + + async def paired_cameras(self): + """Cámaras Blackmagic ya emparejadas en Windows (aunque no se estén anunciando). + + Se consulta el árbol PnP de Windows con PowerShell: cada dispositivo BLE emparejado + aparece como BTHLE\\DEV_ con su nombre. + """ + cams = [] + try: + cmd = ( + "Get-PnpDevice -Class Bluetooth -ErrorAction SilentlyContinue | " + "Where-Object { $_.InstanceId -like 'BTHLE\\DEV_*' } | " + "Select-Object FriendlyName, InstanceId, Status | ConvertTo-Json -Compress" + ) + out = await asyncio.to_thread(_run_powershell, cmd) + if out.strip(): + items = json.loads(out) + if isinstance(items, dict): + items = [items] + for it in items: + name = (it.get("FriendlyName") or "").strip() + inst = it.get("InstanceId") or "" + if not (name.startswith("A:") or "blackmagic" in name.lower()): + continue + m = re.search(r"DEV_([0-9A-Fa-f]{12})", inst) + if not m: + continue + mac = m.group(1).upper() + addr = ":".join(mac[i : i + 2] for i in range(0, 12, 2)) + cams.append({"address": addr, "name": name, "rssi": None, "paired": True}) + except Exception as e: # noqa: BLE001 + self.log(f"No se pudo consultar los dispositivos emparejados: {e}") + return cams + + async def find_cameras(self, timeout: float = 5.0): + """Une las emparejadas en Windows con las que se anuncian ahora mismo.""" + paired = await self.paired_cameras() + seen = await self.scan(timeout, emit_event=False) + by_addr = {c["address"].upper(): dict(c, paired=False) for c in seen} + for c in paired: + key = c["address"].upper() + if key in by_addr: + by_addr[key]["paired"] = True + else: + by_addr[key] = c + cams = sorted(by_addr.values(), key=lambda c: (-(c["rssi"] or -999))) + self.emit("devices", devices=cams) + return cams + + async def connect(self, address: str, name: str | None = None, fresh_retry: bool = False): + if self.client and self.client.is_connected: + await self.disconnect() + self.emit("connecting", address=address) + dev = self.devices.get(address) + if dev is None: + # En Windows basta la dirección: no hace falta que la cámara se esté anunciando + # (una cámara ya conectada a nivel de sistema deja de anunciarse). + from bleak.backends.device import BLEDevice + + dev = BLEDevice(address, name, None) + elif name and not dev.name: + dev = type(dev)(dev.address, name, dev.details) + self.device = dev + self.state = {} + got_payload = False + for attempt in (1, 2): + self.client = BleakClient(dev, disconnected_callback=self._on_disconnected, timeout=30.0) + self.log(f"Conectando con {dev.name or address}..." if attempt == 1 else "Conectando de nuevo con enlace nuevo...") + try: + await self.client.connect() + got_payload = await self._setup_after_connect(address, dev) + except Exception: + c, self.client = self.client, None + try: + await c.disconnect() + except Exception: # noqa: BLE001 + pass + raise + if got_payload or not fresh_retry or attempt == 2: + break + # Sin volcado inicial: el enlace Bluetooth venía reutilizado. Lo cerramos y esperamos a + # que Windows lo suelte para que la próxima conexión sea un enlace nuevo. + self.log("La cámara no ha enviado su configuración (enlace Bluetooth reutilizado). " + "Reinicio el enlace para forzarla...") + self.emit("connecting", address=address, text="Reiniciando el enlace Bluetooth para leer la configuración...") + c, self.client = self.client, None + try: + await c.disconnect() + except Exception: # noqa: BLE001 + pass + if not await self._wait_link_down(address, 20.0): + self.log("Windows mantiene el enlace abierto: suele ser la ventana de Configuración > " + "Bluetooth. Ciérrala y vuelve a conectar para que lleguen todos los valores.") + self.emit("link_held", address=address) + self.emit( + "connected", + address=address, + name=dev.name or address, + protocol=self.protocol_version, + mtu=self.client.mtu_size, + payload=got_payload, + ) + if got_payload: + self.log(f"Conectada. Protocolo {self.protocol_version or '?'}. Configuración recibida.") + else: + self.log(f"Conectada. Protocolo {self.protocol_version or '?'}. Sin configuración inicial: los " + "valores se irán rellenando según los toques.") + + async def _wait_link_down(self, address: str, timeout: float) -> bool: + """Espera a que Windows suelte el enlace BLE con la cámara (connection_status = 0).""" + try: + from winrt.windows.devices.bluetooth import BluetoothLEDevice + except Exception: # noqa: BLE001 + await asyncio.sleep(3.0) + return True + addr = int(address.replace(":", ""), 16) + t0 = time.time() + while time.time() - t0 < timeout: + d = await BluetoothLEDevice.from_bluetooth_address_async(addr) + status = d.connection_status if d is not None else 0 + if d is not None: + d.close() + if status == 0: + await asyncio.sleep(0.5) + return True + await asyncio.sleep(1.0) + return False + + async def _setup_after_connect(self, address: str, dev) -> bool: + + # Localizar la característica de versión de protocolo (el sufijo del UUID varía) + self._proto_uuid = None + found_service = False + for svc in self.client.services: + if svc.uuid.lower() != SERVICE_UUID: + continue + found_service = True + for ch in svc.characteristics: + if ch.uuid.lower().startswith(CH_PROTO_PREFIX): + self._proto_uuid = ch.uuid + if not found_service: + # Windows oculta el servicio cuando no puede cifrar el enlace: la cámara ya no + # reconoce el emparejamiento guardado (o nunca se emparejó). + self.emit("needs_pairing", address=address) + raise RuntimeError( + "Acceso denegado al servicio de control de la cámara. Causas, por orden: (1) otra " + "aplicación de este PC ya está conectada a la cámara (otra copia de Labmagic, un " + "script de prueba o la ventana de Configuración > Bluetooth): ciérrala y vuelve a " + "conectar; (2) la cámara ya no acepta el emparejamiento guardado: pulsa «Emparejar " + "(PIN)» y escribe el PIN que muestre la cámara." + ) + if self._proto_uuid: + try: + raw = await self.client.read_gatt_char(self._proto_uuid) + self.protocol_version = raw.decode("utf-8", errors="replace").strip("\x00 ") + except Exception as e: # noqa: BLE001 + self.protocol_version = "?" + self.log(f"No se pudo leer la versión de protocolo: {e}") + + # Nombre con el que aparecemos en el menú Bluetooth de la cámara + try: + name = f"{platform.node()[:18]} (PC)" + await self.client.write_gatt_char(CH_DEVNAME, name.encode("utf-8"), response=True) + except Exception as e: # noqa: BLE001 + self.log(f"No se pudo enviar el nombre del equipo: {e}") + + # Estado (encendida/apagada) + try: + st = await self.client.read_gatt_char(CH_STATUS) + self._handle_status(bytes(st)) + except Exception as e: # noqa: BLE001 + msg = str(e).lower() + if "auth" in msg or "access" in msg or "0x05" in msg or "0x0f" in msg: + raise RuntimeError( + "La cámara exige emparejamiento. Empareja desde Configuración de Windows > " + "Bluetooth con el PIN que muestra la cámara y vuelve a conectar." + ) from e + raise + + self._payload_count = 0 + self._payload_event = asyncio.Event() + await self.client.start_notify(CH_STATUS, lambda _c, d: self._handle_status(bytes(d))) + await self.client.start_notify(CH_TIMECODE, lambda _c, d: self._handle_timecode(bytes(d))) + await self.client.start_notify(CH_IN, lambda _c, d: self._handle_incoming(bytes(d))) + + # Pedir el volcado completo de configuración. La cámara lo envía sola solo cuando el enlace + # Bluetooth es nuevo; escribir "Camera Ready" (0x20) con "Initial Payload Received" (0x10) a + # cero (y el bit de encendido) hace que lo reenvíe aunque Windows reutilice el enlace. + try: + await self.client.write_gatt_char(CH_STATUS, bytes([0x21]), response=True) + except Exception as e: # noqa: BLE001 + self.log(f"No se pudo pedir la configuración a la cámara: {e}") + # El volcado llega en varios bloques a lo largo de unos segundos; esperamos a tener una + # cantidad razonable de parámetros (o 6 s) antes de dar la conexión por completa. + t0 = time.time() + while time.time() - t0 < 6.0 and self._payload_count < 8: + await asyncio.sleep(0.2) + return self._payload_count >= 8 + + async def disconnect(self): + c = self.client + self.client = None + if c is not None: + try: + await c.disconnect() + except Exception as e: # noqa: BLE001 + self.log(f"Error al desconectar: {e}") + self.emit("disconnected", reason="manual") + + def _on_disconnected(self, client): + # Solo cuenta si es el cliente actual (los avisos de clientes antiguos llegan con retraso) + if self.client is not None and client is self.client: + self.client = None + self.log("La cámara se ha desconectado.") + self.emit("disconnected", reason="remote") + + @property + def connected(self) -> bool: + return bool(self.client and self.client.is_connected) + + # ----- emparejamiento con PIN (sin pasar por Configuración de Windows) ---------- + async def pair(self, address: str, ask_pin, name: str | None = None): + """Quita el emparejamiento antiguo de Windows y empareja de nuevo con el PIN de la cámara. + + ask_pin: función sin argumentos que se llama desde un hilo auxiliar y debe devolver el + PIN escrito por el usuario (o None para cancelar). Puede bloquear mientras espera. + Al terminar con éxito, conecta. + """ + from winrt.windows.devices.bluetooth import BluetoothLEDevice + from winrt.windows.devices.enumeration import ( + DeviceInformation, + DevicePairingKinds, + DevicePairingProtectionLevel, + ) + + if self.connected: + await self.disconnect() + self.emit("pairing", stage="start", address=address) + dev = await BluetoothLEDevice.from_bluetooth_address_async(int(address.replace(":", ""), 16)) + if dev is None: + raise RuntimeError("No se encuentra la cámara. ¿Está encendida y con el Bluetooth activado?") + info = await DeviceInformation.create_from_id_async(dev.device_information.id) + pairing = info.pairing + if pairing.is_paired: + self.log("Quitando el emparejamiento anterior de Windows...") + res = await pairing.unpair_async() + self.log(f"Emparejamiento anterior eliminado (estado {int(res.status)}).") + await asyncio.sleep(1.5) + info = await DeviceInformation.create_from_id_async(dev.device_information.id) + pairing = info.pairing + if not pairing.can_pair: + raise RuntimeError("Windows indica que este dispositivo no se puede emparejar ahora mismo.") + + custom = pairing.custom + log = self.log + + def handler(_sender, args): + kind = int(args.pairing_kind) + if kind == int(DevicePairingKinds.PROVIDE_PIN): + deferral = args.get_deferral() + + def work(): + try: + pin = ask_pin() + if pin: + args.accept_with_pin(str(pin).strip()) + else: + log("Emparejamiento cancelado por el usuario.") + except Exception as e: # noqa: BLE001 + log(f"Error al aceptar el PIN: {e}") + finally: + deferral.complete() + + threading.Thread(target=work, name="pin-prompt", daemon=True).start() + elif kind == int(DevicePairingKinds.DISPLAY_PIN): + log(f"La cámara pide este PIN: {args.pin}") + args.accept() + else: + args.accept() + + token = custom.add_pairing_requested(handler) + try: + try: + kinds = DevicePairingKinds( + int(DevicePairingKinds.PROVIDE_PIN) + | int(DevicePairingKinds.CONFIRM_ONLY) + | int(DevicePairingKinds.DISPLAY_PIN) + ) + except Exception: # noqa: BLE001 + kinds = DevicePairingKinds.PROVIDE_PIN + self.log("Solicitando emparejamiento: mira la pantalla de la cámara, mostrará un PIN.") + self.emit("pairing", stage="requested", address=address) + result = await custom.pair_with_protection_level_async( + kinds, DevicePairingProtectionLevel.ENCRYPTION_AND_AUTHENTICATION + ) + finally: + custom.remove_pairing_requested(token) + + status = int(result.status) + names = { + 0: "emparejada", 1: "la cámara no está lista para emparejar", 2: "no emparejada", + 3: "ya estaba emparejada", 4: "la cámara rechazó la conexión", 5: "demasiadas conexiones", + 6: "fallo de hardware", 7: "tiempo de espera agotado (no llegó el PIN a tiempo)", + 8: "autenticación no permitida", 9: "fallo de autenticación (PIN incorrecto)", + 10: "sin perfiles compatibles", 11: "no se alcanzó el nivel de protección", + 12: "acceso denegado", 13: "datos de ceremonia no válidos", 14: "emparejamiento cancelado", + 15: "ya hay una operación en curso", 16: "falta el manejador de PIN", + 17: "rechazado por el manejador", 18: "el dispositivo ya tiene asociación", 19: "fallo", + } + if status not in (0, 3): + self.emit("pairing", stage="failed", address=address, status=status) + raise RuntimeError(f"No se pudo emparejar: {names.get(status, status)} (código {status}).") + self.log("Cámara emparejada con Windows. Conectando...") + self.emit("pairing", stage="done", address=address) + await asyncio.sleep(1.0) + await self.connect(address, name) + + # ----- notificaciones ----------------------------------------------- + def _handle_status(self, data: bytes): + if not data: + return + self.power_on = bool(data[0] & 0x01) + self.emit("status", raw=data.hex(), power_on=self.power_on) + + def _handle_timecode(self, data: bytes): + pk = parse_packets(data) + if pk: + tc = decode_timecode(pk[-1][4]) + elif len(data) >= 4: + tc = decode_timecode(data[-4:]) + else: + return + self.emit("timecode", timecode=tc) + + def _handle_incoming(self, data: bytes): + for cat, par, dtype, op, raw in parse_packets(data): + if cat == 255 and par == 255: + # Fin de bloque del volcado inicial + if self._payload_event is not None: + self._payload_event.set() + continue + values = decode_data(dtype, raw) + self.state[(cat, par)] = (dtype, raw, values) + if cat != 9: + self._payload_count += 1 + self.emit("param", cat=cat, par=par, dtype=dtype, op=op, raw=raw, values=values) + + # ----- envío ---------------------------------------------------------- + async def send(self, category: int, parameter: int, dtype: int, op: int, data: bytes = b""): + if not self.connected: + raise RuntimeError("No hay cámara conectada.") + pkt = build_packet(category, parameter, dtype, op, data) + async with self._send_lock: + await self.client.write_gatt_char(CH_OUT, pkt, response=True) + self.emit("sent", cat=category, par=parameter, dtype=dtype, op=op, raw=data) + + # --- Objetivo -------------------------------------------------------- + async def autofocus(self): + await self.send(0, 1, T_VOID, OP_ASSIGN) + + async def set_focus(self, value: float): + await self.send(0, 0, T_FIXED16, OP_ASSIGN, enc_fixed16(max(0.0, min(1.0, value)))) + + async def offset_focus(self, delta: float): + await self.send(0, 0, T_FIXED16, OP_OFFSET, enc_fixed16(delta)) + + async def auto_iris(self): + await self.send(0, 5, T_VOID, OP_ASSIGN) + + async def set_aperture_norm(self, value: float): + await self.send(0, 3, T_FIXED16, OP_ASSIGN, enc_fixed16(max(0.0, min(1.0, value)))) + + async def set_aperture_fstop(self, fnumber: float): + """Apertura en f/: el protocolo usa el Aperture Value, AV = 2·log2(f).""" + av = 2.0 * math.log2(max(0.7, float(fnumber))) + await self.send(0, 2, T_FIXED16, OP_ASSIGN, enc_fixed16(av)) + + async def offset_aperture_norm(self, delta: float): + await self.send(0, 3, T_FIXED16, OP_OFFSET, enc_fixed16(delta)) + + async def set_zoom_norm(self, value: float): + await self.send(0, 8, T_FIXED16, OP_ASSIGN, enc_fixed16(max(0.0, min(1.0, value)))) + + async def set_ois(self, enabled: bool): + await self.send(0, 6, T_VOID, OP_ASSIGN, bytes([1 if enabled else 0])) + + # --- Vídeo / exposición --------------------------------------------- + async def set_iso(self, iso: int): + await self.send(1, 14, T_INT32, OP_ASSIGN, struct.pack("= 5: + data = bytearray(cur[1]) + else: + data = bytearray([0, 0, 0, 0, 0]) + data[0] = 2 if recording else 0 # 0 = preview, 1 = play, 2 = record + data[1] = 0 # velocidad: 0 = pausa / grabación normal + await self.send(10, 1, T_INT8, OP_ASSIGN, bytes(data)) + + # --- Monitor --------------------------------------------------------- + # Pantallas destino (segundo uint16 de 3.0 Overlay enables y 4.1 Exposure and focus tools) + OUT_LCD, OUT_HDMI, OUT_EVF, OUT_SDI_MAIN, OUT_SDI_FRONT = 1, 2, 4, 8, 16 + + async def set_tools(self, zebra: bool, focus_assist: bool, false_colour: bool, targets: int = 3): + """4.1: [bits zebra 0x1, focus assist 0x2, falso color 0x4] + [pantallas destino].""" + bits = (1 if zebra else 0) | (2 if focus_assist else 0) | (4 if false_colour else 0) + await self.send(4, 1, T_INT16, OP_ASSIGN, struct.pack("= 5 else bytearray([0, 0, 0, 0, 0]) + data[0] = mode & 0xFF + data[1] = struct.pack(" + + + + +Labmagic + + + + +
+
+ + Sin cámara + 00:00:00:00● +
+
Buscando Labmagic…
+
+
FPS
—
+
SHUTTER
—
+
IRIS
—
+
ISO
—
+
WB
—
+
TINT
—
+
+
+ +
+
+ + +
+
+ + + +
+
+
Foco—
+ + + +
+
+
Iris—
+ + + +
+
+ +
GRABAR
—
+
+ +
+
+
+ + + + diff --git a/icono.ico b/icono.ico new file mode 100644 index 0000000000000000000000000000000000000000..b1a3f3e214d546aa9563860a34e28684f2cf5696 GIT binary patch literal 35946 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 z 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 literal 0 HcmV?d00001 diff --git a/iconos/opcion-2.ico b/iconos/opcion-2.ico new file mode 100644 index 0000000000000000000000000000000000000000..b1a3f3e214d546aa9563860a34e28684f2cf5696 GIT binary patch literal 35946 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 z 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 WmzPgE_4D8W0000$q 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 G*#8eTj*US8 literal 0 HcmV?d00001 diff --git a/iconos/opcion-3.png b/iconos/opcion-3.png new file mode 100644 index 0000000000000000000000000000000000000000..27a16c59e7cd008e29e37db18aaa9e327cd6cb55 GIT binary patch literal 3215 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 bZlC{Oh?(`7cpOBk00000NkvXXu0mjfKu0F& literal 0 HcmV?d00001 diff --git a/iconos/opciones.png b/iconos/opciones.png new file mode 100644 index 0000000000000000000000000000000000000000..fe30e93ca0389a77dd868b83a339e78fd886b0ff GIT binary patch literal 94135 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 literal 0 HcmV?d00001 diff --git a/make_icon.py b/make_icon.py new file mode 100644 index 0000000..4e9c613 --- /dev/null +++ b/make_icon.py @@ -0,0 +1,140 @@ +""" +Genera el icono de Labmagic a partir del wordmark blanco real de Labstream. + +- icono.ico / icono.png: la opción elegida (OPCION_POR_DEFECTO). +- iconos/opcion-N.ico|png: todas las opciones, por si se quiere cambiar (basta copiar una sobre icono.ico). +- iconos/opciones.png: hoja de muestra con las opciones a 256 px y a tamaño pequeño. +""" +import os + +from PIL import Image, ImageDraw, ImageFont + +HERE = os.path.dirname(os.path.abspath(__file__)) +LOGO_BLANCO = r"C:\Users\Munka\OneDrive\Labstream\Propuestas\0_Modelo Propuestas\Logos\Logo Blanco.png" +OPCION_POR_DEFECTO = 2 + +ROJO = (227, 38, 44, 255) +ROJO_OSCURO = (170, 22, 28, 255) +NEGRO = (16, 16, 16, 255) +BLANCO = (255, 255, 255, 255) +SS = 4 # supermuestreo + + +def cargar_wordmark(): + """Devuelve (wordmark 'labstream', 'lab' solo, logo completo con STUDIO), todos RGBA blancos recortados.""" + img = Image.open(LOGO_BLANCO).convert("RGBA") + w, h = img.size + full = img.crop(img.getbbox()) + word = img.crop((0, 0, w, int(h * 0.66))) + word = word.crop(word.getbbox()) + lab = word.crop((0, 0, int(word.width * 0.295), word.height)) + lab = lab.crop(lab.getbbox()) + return word, lab, full + + +def fondo(size, color, radio=0.22, borde=None, grosor=0.035, inset=0.065): + s = size * SS + img = Image.new("RGBA", (s, s), (0, 0, 0, 0)) + d = ImageDraw.Draw(img) + d.rounded_rectangle((0, 0, s - 1, s - 1), radius=int(s * radio), fill=color) + if borde: + i = int(s * inset) + d.rounded_rectangle((i, i, s - 1 - i, s - 1 - i), radius=int(s * (radio - inset * 0.8)), + outline=borde, width=max(1, int(s * grosor))) + return img + + +def pegar_centrado(base, art, ancho_rel, dy_rel=0.0): + s = base.width + ratio = art.height / art.width + w = int(s * ancho_rel) + h = int(w * ratio) + art = art.resize((w, h), Image.LANCZOS) + x = (s - w) // 2 + y = int((s - h) / 2 + s * dy_rel) + base.alpha_composite(art, (x, y)) + return base + + +def punto(base, cx_rel, cy_rel, r_rel, color): + s = base.width + d = ImageDraw.Draw(base) + cx, cy, r = s * cx_rel, s * cy_rel, s * r_rel + d.ellipse((cx - r, cy - r, cx + r, cy + r), fill=color) + return base + + +def opcion(n, size): + word, lab, full = cargar_wordmark() + if n == 1: # Rojo, borde blanco fino, wordmark blanco + base = fondo(size, ROJO, borde=BLANCO) + return pegar_centrado(base, word, 0.74) + if n == 2: # Rojo, wordmark grande "lab" + punto REC blanco + base = fondo(size, ROJO, borde=BLANCO) + pegar_centrado(base, lab, 0.56, dy_rel=-0.03) + return punto(base, 0.5, 0.78, 0.055, BLANCO) + if n == 3: # Negro con borde rojo, wordmark blanco y punto rojo + base = fondo(size, NEGRO, borde=ROJO, grosor=0.05) + pegar_centrado(base, word, 0.74, dy_rel=-0.04) + return punto(base, 0.5, 0.74, 0.05, ROJO) + if n == 4: # Rojo oscuro degradado, logo completo (labstream + STUDIO) + s = size * SS + grad = Image.new("RGBA", (s, s), ROJO) + gd = ImageDraw.Draw(grad) + for y in range(s): + t = y / s + c = tuple(int(ROJO[i] * (1 - t) + ROJO_OSCURO[i] * t) for i in range(3)) + (255,) + gd.line((0, y, s, y), fill=c) + mask = fondo(size, BLANCO) + base = Image.new("RGBA", (s, s), (0, 0, 0, 0)) + base.paste(grad, (0, 0), mask) + ImageDraw.Draw(base).rounded_rectangle((int(s * 0.065), int(s * 0.065), s - 1 - int(s * 0.065), s - 1 - int(s * 0.065)), + radius=int(s * 0.17), outline=BLANCO, width=max(1, int(s * 0.03))) + return pegar_centrado(base, full, 0.72) + raise ValueError(n) + + +def render(n, size): + return opcion(n, size).resize((size, size), Image.LANCZOS) + + +def guardar_ico(n, ruta_ico, ruta_png): + sizes = [16, 24, 32, 48, 64, 128, 256] + imgs = [render(n, s) for s in sizes] + imgs[-1].save(ruta_ico, format="ICO", sizes=[(s, s) for s in sizes], append_images=imgs[:-1]) + render(n, 64).save(ruta_png) + + +def hoja(ruta): + """Hoja de muestra: cada opción a 256 px, y a 48/32/16 px para ver cómo se lee en pequeño.""" + try: + font = ImageFont.truetype("C:/Windows/Fonts/segoeui.ttf", 22) + fontb = ImageFont.truetype("C:/Windows/Fonts/segoeuib.ttf", 26) + except Exception: # noqa: BLE001 + font = fontb = ImageFont.load_default() + nombres = {1: "1 · Rojo, borde blanco, wordmark", 2: "2 · Rojo, 'lab' grande + punto", + 3: "3 · Negro, borde rojo, wordmark", 4: "4 · Rojo degradado, logo completo"} + col_w, pad = 360, 40 + sheet = Image.new("RGBA", (col_w * 4 + pad, 470), (24, 24, 24, 255)) + d = ImageDraw.Draw(sheet) + d.text((pad, 14), "Opciones de icono para Labmagic", fill=(240, 240, 240, 255), font=fontb) + for i, n in enumerate((1, 2, 3, 4)): + x0 = pad + i * col_w + sheet.alpha_composite(render(n, 256), (x0, 60)) + y = 340 + xx = x0 + for s in (48, 32, 16): + sheet.alpha_composite(render(n, s), (xx, y + (48 - s) // 2)) + xx += s + 14 + d.text((x0, 405), nombres[n], fill=(200, 200, 200, 255), font=font) + sheet.save(ruta) + + +if __name__ == "__main__": + out_dir = os.path.join(HERE, "iconos") + os.makedirs(out_dir, exist_ok=True) + for n in (1, 2, 3, 4): + guardar_ico(n, os.path.join(out_dir, f"opcion-{n}.ico"), os.path.join(out_dir, f"opcion-{n}.png")) + guardar_ico(OPCION_POR_DEFECTO, os.path.join(HERE, "icono.ico"), os.path.join(HERE, "icono.png")) + hoja(os.path.join(out_dir, "opciones.png")) + print("icono por defecto: opción", OPCION_POR_DEFECTO, "->", os.path.join(HERE, "icono.ico")) diff --git a/obs_dock.py b/obs_dock.py new file mode 100644 index 0000000..db9c571 --- /dev/null +++ b/obs_dock.py @@ -0,0 +1,247 @@ +""" +Panel para OBS: servidor HTTP local que sirve `dock.html` y lo mantiene sincronizado con la app. + +OBS Studio (28 o más) admite «Docks → Custom Browser Docks»: un panel acoplable que carga una URL. +Labmagic levanta este servidor en 127.0.0.1 y el panel habla con la misma conexión Bluetooth que +ya tiene la app (la cámara solo admite un proceso a la vez, así que el dock no se conecta solo). + + GET / -> dock.html + GET /state -> estado actual en JSON + GET /events -> Server-Sent Events: un `data:` con el estado cada vez que cambia + POST /cmd -> JSON {"cmd": "...", ...} que la app ejecuta en su hilo de Tk +""" +import json +import os +import queue +import threading +import time +import uuid +from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer + +HERE = os.path.dirname(os.path.abspath(__file__)) +DEFAULT_PORT = 8790 # 8765 lo usa el Organizador Labstream + + +class DockServer: + def __init__(self, cmd_queue: queue.Queue, port: int = DEFAULT_PORT, html_path: str = None): + self.cmd_queue = cmd_queue + self.port = port + self.html_path = html_path or os.path.join(HERE, "dock.html") + self._state = {} + self._state_json = "{}" + self._clients = set() + self._lock = threading.Lock() + self._httpd = None + self._thread = None + self.error = None + + # ----------------------------------------------------------- ciclo de vida + def start(self): + server = self + + class Handler(BaseHTTPRequestHandler): + protocol_version = "HTTP/1.1" + + def log_message(self, *_a): # silencio en consola + pass + + def _send(self, code, body: bytes, ctype="text/plain; charset=utf-8", extra=None): + self.send_response(code) + self.send_header("Content-Type", ctype) + self.send_header("Content-Length", str(len(body))) + self.send_header("Cache-Control", "no-store") + for k, v in (extra or {}).items(): + self.send_header(k, v) + self.end_headers() + self.wfile.write(body) + + def do_GET(self): + path = self.path.split("?", 1)[0] + if path in ("/", "/index.html", "/dock.html"): + try: + with open(server.html_path, "rb") as fh: + self._send(200, fh.read(), "text/html; charset=utf-8") + except OSError as e: + self._send(500, f"No se encuentra dock.html: {e}".encode()) + elif path == "/state": + self._send(200, server._state_json.encode("utf-8"), "application/json; charset=utf-8") + elif path == "/events": + self._sse() + elif path == "/icon.png": + icon = os.path.join(HERE, "icono.png") + try: + with open(icon, "rb") as fh: + self._send(200, fh.read(), "image/png") + except OSError: + self._send(404, b"") + else: + self._send(404, b"no") + + def _sse(self): + q = queue.Queue(maxsize=200) + with server._lock: + server._clients.add(q) + try: + self.send_response(200) + self.send_header("Content-Type", "text/event-stream; charset=utf-8") + self.send_header("Cache-Control", "no-store") + self.send_header("Connection", "keep-alive") + self.end_headers() + self.wfile.write(f"retry: 1500\ndata: {server._state_json}\n\n".encode("utf-8")) + self.wfile.flush() + while True: + try: + msg = q.get(timeout=15) + self.wfile.write(f"data: {msg}\n\n".encode("utf-8")) + except queue.Empty: + self.wfile.write(b": ping\n\n") + self.wfile.flush() + except (ConnectionError, OSError, ValueError): + pass + finally: + with server._lock: + server._clients.discard(q) + + def do_POST(self): + path = self.path.split("?", 1)[0] + n = int(self.headers.get("Content-Length") or 0) + raw = self.rfile.read(n) if n else b"" + if path != "/cmd": + self._send(404, b"no") + return + try: + data = json.loads(raw.decode("utf-8") or "{}") + if not isinstance(data, dict) or "cmd" not in data: + raise ValueError("falta cmd") + except (ValueError, UnicodeDecodeError) as e: + self._send(400, f"JSON no válido: {e}".encode()) + return + data["_t"] = time.time() + server.cmd_queue.put(data) + self._send(204, b"") + + # Si el puerto está ocupado por otro programa probamos los siguientes (la URL se guarda en config) + last_err = None + for port in range(self.port, self.port + 10): + try: + self._httpd = ThreadingHTTPServer(("127.0.0.1", port), Handler) + self._httpd.daemon_threads = True + self.port = port + break + except OSError as e: + last_err = e + self._httpd = None + if self._httpd is None: + self.error = f"No se pudo abrir ningún puerto entre {self.port} y {self.port + 9}: {last_err}" + return False + self._thread = threading.Thread(target=self._httpd.serve_forever, kwargs={"poll_interval": 0.5}, + name="labmagic-dock", daemon=True) + self._thread.start() + return True + + def stop(self): + if self._httpd is not None: + try: + self._httpd.shutdown() + self._httpd.server_close() + except Exception: # noqa: BLE001 + pass + self._httpd = None + + @property + def url(self): + return f"http://127.0.0.1:{self.port}/" + + @property + def clients(self): + with self._lock: + return len(self._clients) + + # ----------------------------------------------------------- estado + def publish(self, state: dict): + """Envía el estado a los paneles abiertos solo si ha cambiado.""" + js = json.dumps(state, ensure_ascii=False, separators=(",", ":")) + if js == self._state_json: + return + self._state, self._state_json = state, js + with self._lock: + clients = list(self._clients) + for q in clients: + try: + q.put_nowait(js) + except queue.Full: + pass + + +# ------------------------------------------------------------------ registro en OBS +def obs_user_ini(): + return os.path.join(os.environ.get("APPDATA", ""), "obs-studio", "user.ini") + + +def obs_running(): + try: + import subprocess + out = subprocess.run(["tasklist", "/FI", "IMAGENAME eq obs64.exe", "/NH"], capture_output=True, text=True, + creationflags=0x08000000).stdout + return "obs64.exe" in out + except Exception: # noqa: BLE001 + return False + + +def obs_add_browser_dock(title: str, url: str): + """Añade el panel a «Docks → Custom Browser Docks» de OBS editando user.ini (OBS debe estar cerrado). + + Devuelve (ok, mensaje).""" + ini = obs_user_ini() + if not os.path.exists(ini): + return False, "No se encuentra la configuración de OBS (user.ini). ¿Está instalado OBS 30 o superior?" + if obs_running(): + return False, "Cierra OBS antes: guarda su configuración al salir y borraría el cambio." + with open(ini, "r", encoding="utf-8-sig") as fh: + lines = fh.read().splitlines() + docks = [] + idx = None + section = None + basic_end = None + for i, line in enumerate(lines): + s = line.strip() + if s.startswith("[") and s.endswith("]"): + if section == "BasicWindow" and basic_end is None: + basic_end = i + section = s[1:-1] + elif section == "BasicWindow" and s.startswith("ExtraBrowserDocks="): + idx = i + try: + docks = json.loads(s.split("=", 1)[1] or "[]") + except ValueError: + docks = [] + for d in docks: + if isinstance(d, dict) and d.get("url", "").rstrip("/") == url.rstrip("/"): + return True, "El panel ya estaba añadido en OBS (Docks → Labmagic)." + docks.append({"title": title, "url": url, "uuid": str(uuid.uuid4())}) + new_line = "ExtraBrowserDocks=" + json.dumps(docks, ensure_ascii=False, separators=(",", ":")) + if idx is not None: + lines[idx] = new_line + else: + # Sin la clave: la añadimos al final de [BasicWindow] (o creamos la sección) + pos = None + for i, line in enumerate(lines): + if line.strip() == "[BasicWindow]": + pos = i + 1 + while pos < len(lines) and not lines[pos].strip().startswith("["): + pos += 1 + break + if pos is None: + lines += ["", "[BasicWindow]", new_line] + else: + lines.insert(pos, new_line) + backup = ini + ".labmagic.bak" + try: + if not os.path.exists(backup): + with open(ini, "rb") as src, open(backup, "wb") as dst: + dst.write(src.read()) + with open(ini, "w", encoding="utf-8") as fh: + fh.write("\n".join(lines) + "\n") + except OSError as e: + return False, f"No se pudo escribir user.ini: {e}" + return True, "Panel añadido. Abre OBS: aparece en Docks → Labmagic (arrástralo donde quieras)." diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..034722d --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +bleak>=3.0