9.6 KiB
Refactoring Plan: GUI as ARTOS API Client
Problema Attuale
La GUI attuale accede direttamente a ConnectionManager invece di usare BusMonitorCore:
# CURRENT (Wrong approach)
from pybusmonitor1553.core.connection_manager import get_manager
self.manager = get_manager()
self.manager.init_library()
self.manager.start()
Problema: Questa NON è l'API che userà ARTOS! Stiamo testando l'implementazione sbagliata.
Soluzione: GUI Diventa Client del Modulo
La GUI deve usare esattamente la stessa API BaseModule che userà ARTOS:
# NEW (Correct approach - same as ARTOS)
from pybusmonitor1553.core import BusMonitorCore
self.bus_monitor = BusMonitorCore()
self.bus_monitor.initialize(config)
self.bus_monitor.start_session()
self.bus_monitor.stop_session()
Architettura Target
┌──────────────────────────────────────────────────────────┐
│ ARTOS Collector │
│ ┌────────────────────────────────────────────────────┐ │
│ │ from pybusmonitor1553.core import BusMonitorCore │ │
│ │ monitor = BusMonitorCore() │ │
│ │ monitor.initialize({'ip': ..., 'port': ...}) │ │
│ │ monitor.start_session() │ │
│ └────────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────┘
↕ SAME API
┌──────────────────────────────────────────────────────────┐
│ PyBusMonitor1553 GUI (Test Tool) │
│ ┌────────────────────────────────────────────────────┐ │
│ │ from pybusmonitor1553.core import BusMonitorCore │ │
│ │ monitor = BusMonitorCore() │ │
│ │ monitor.initialize({'ip': ..., 'port': ...}) │ │
│ │ monitor.start_session() │ │
│ └────────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────┘
Benefit: Se la GUI funziona, ARTOS funzionerà. Zero sorprese!
Modifiche Necessarie
File da Modificare
1. gui/monitor.py
Prima (linea ~793):
from pybusmonitor1553.core.connection_manager import get_manager
self.manager = get_manager()
Dopo:
from pybusmonitor1553.core import BusMonitorCore
self.bus_monitor = BusMonitorCore()
Cambio metodi (linea ~809):
| Prima | Dopo |
|---|---|
self.manager.init_library() |
self.bus_monitor.initialize(config) |
self.manager.start() |
self.bus_monitor.start_session() |
self.manager.stop() |
self.bus_monitor.stop_session() |
self.manager.is_running() |
self.bus_monitor.get_status()['is_running'] |
2. bus_monitor_core.py - Aggiungere MessageDB Integration
Attualmente get_message() ritorna None. Dobbiamo integrare il MessageDB:
def get_message(self, label: str) -> Optional[Any]:
"""Get message by label."""
# Import MessageDB lazily
from ..Grifo_E_1553lib.messages import MessageDB # o dove si trova
return MessageDB.get_message(label)
def get_all_messages(self) -> List[Any]:
"""Get all registered messages."""
from ..Grifo_E_1553lib.messages import MessageDB
return MessageDB.get_all_messages()
3. Aggiungere Config Helper nella GUI
La GUI deve costruire il dizionario di configurazione:
def get_config_from_gui(self) -> Dict[str, Any]:
"""Build config dict from GUI widgets (if any config UI exists)."""
return {
'ip': os.getenv('PYBM_RX_IP', '127.0.0.1'),
'send_port': int(os.getenv('PYBM_TX_PORT', '5001')),
'recv_port': int(os.getenv('PYBM_RX_PORT', '5002'))
}
Step-by-Step Implementation Plan
Phase 1: Preparare BusMonitorCore (Completamento)
File: pybusmonitor1553/core/bus_monitor_core.py
- ✅ Interfaccia BaseModule (già fatto)
- ✅ Recording system (già fatto)
- ❌ TODO: Integrare MessageDB per
get_message()eget_all_messages() - ❌ TODO: Assicurarsi che
initialize()configuri correttamente ConnectionManager
Phase 2: Refactorare GUI per Usare BusMonitorCore
File: pybusmonitor1553/gui/monitor.py
- Cambiare import da
connection_manageraBusMonitorCore - Sostituire
self.managerconself.bus_monitor - Mappare tutti i metodi vecchi ai nuovi:
init_library()→initialize(config)start()→start_session()stop()→stop_session()
- Usare
get_status()per verificare stato - Usare
get_message()eget_all_messages()per accesso ai dati
Phase 3: Registrare Callbacks per GUI Updates
La GUI può usare il callback system per aggiornamenti real-time:
def on_message_received(self, label: str, message: Any):
"""Callback called when a message arrives."""
# Update GUI tree view
self.refresh_single_message(label, message)
# During initialization:
self.bus_monitor.register_callback("msg_a2",
lambda msg: self.on_message_received("msg_a2", msg))
Phase 4: Testing & Validation
- Verificare che la GUI funzioni come prima (comportamento invariato)
- Verificare che i log mostrino lo stesso output
- Testare Initialize → Start → Stop → Recording
- IMPORTANTE: Creare un test automatico che usi lo stesso workflow della GUI
Boundary Definition: Core Module vs GUI
Core Module (Auto-contenuto, Esportabile)
Folder: pybusmonitor1553/core/
pybusmonitor1553/
├── core/
│ ├── __init__.py # Exports: BaseModule, BusMonitorCore, DataRecorder
│ ├── base_module.py # ARTOS interface
│ ├── bus_monitor_core.py # Business logic
│ ├── data_recorder.py # Recording system
│ └── connection_manager.py # Internal (non esposto!)
└── Grifo_E_1553lib/ # Protocol layer (parte del core)
├── messages/
├── udp_parser.py
└── ...
Public API (quello che ARTOS importa):
from pybusmonitor1553.core import BusMonitorCore
# That's it! Tutto il resto è internal.
GUI (Development/Test Tool)
Folder: pybusmonitor1553/gui/
pybusmonitor1553/
└── gui/
├── __init__.py
├── monitor.py # Main GUI - imports BusMonitorCore
├── details_pane.py # Helper widgets
└── monitor_helpers.py # GUI utilities
GUI è un CLIENT, non parte del core module.
Standalone Entry Point
File: pybusmonitor1553/__main__.py
def main():
"""Standalone mode: start GUI test tool."""
from pybusmonitor1553.gui.monitor import main as gui_main
gui_main()
Package Structure for Distribution
Scenario 1: Full Package (Development)
pip install pybusmonitor1553[gui]
python -m pybusmonitor1553 # Runs GUI test tool
Scenario 2: Core Only (ARTOS)
pip install pybusmonitor1553 # No GUI dependencies
# In ARTOS Collector
from pybusmonitor1553.core import BusMonitorCore
setup.py Configuration
setup(
name="pybusmonitor1553",
packages=find_packages(),
install_requires=[
# Core dependencies only
"no external dependencies!" # Tutto built-in Python
],
extras_require={
'gui': [
'tkinter', # Usually included in Python, but explicit here
# Add other GUI-specific deps if needed
]
}
)
Vantaggi di Questo Approccio
✅ API Consistency
GUI e ARTOS usano identica API → zero discrepanze.
✅ True Test Harness
Se la GUI funziona, ARTOS funzionerà. La GUI diventa lo strumento di test del modulo.
✅ Clean Separation
- Core: Auto-contenuto, zero dipendenze esterne
- GUI: Tool opzionale che dipende dal core
✅ Easy Distribution
# ARTOS project doesn't even know GUI exists:
from pybusmonitor1553.core import BusMonitorCore
✅ Future-Proof
Domani puoi creare un CLI, un REST API server, o un altro client - tutti useranno lo stesso core!
Next Steps
Immediate (Completare BusMonitorCore)
- Integrare MessageDB in
bus_monitor_core.py - Verificare che
initialize()configuri ConnectionManager correttamente - Testare recording/replay con messaggi reali
Short-term (Refactorare GUI)
- Modificare
gui/monitor.pyper usare BusMonitorCore - Rimuovere accessi diretti a ConnectionManager
- Testare che la GUI funzioni come prima
Mid-term (Packaging)
- Configurare setup.py con extras_require
- Documentare API pubblica
- Creare esempi di utilizzo (GUI + ARTOS)
Vuoi che proceda con l'implementazione del refactoring?