MaselliSimulatorApp/config_manager.py

170 lines
7.0 KiB
Python

"""
Gestor de configuración para guardar y cargar ajustes
"""
import json
import os
class ConfigManager:
def __init__(self, config_file="maselli_simulator_config.json"):
self.config_file = config_file
self.default_config = {
'connection_type': 'TCP',
'com_port': 'COM8',
'baud_rate': '115200',
'ip_address': '10.1.33.18',
'port': '8899',
'adam_address': '01',
'function_type': 'Sinusoidal',
'min_brix_map': '0',
'max_brix_map': '80',
'cycle_time': '0.5',
'manual_input_type': 'Brix', # Nuevo: 'Brix', 'mA', 'Voltaje'
'manual_value': '10.0', # Nuevo: valor correspondiente al manual_input_type
'random_error_interval': '10.0', # Intervalo para errores aleatorios en el simulador
# Configuración para NetCom
'netcom_com_port': 'COM3',
'netcom_baud_rate': '115200',
'netcom_bytesize': 8, # Data bits (5, 6, 7, 8)
'netcom_parity': 'N', # Parity ('N', 'E', 'O', 'M', 'S')
'netcom_stopbits': 1, # Stop bits (1, 1.5, 2)
'netcom_rtscts': False, # Hardware flow control RTS/CTS
'netcom_dsrdtr': False, # Hardware flow control DSR/DTR
'netcom_xonxoff': False, # Software flow control XON/XOFF
'netcom_bridge_delay': 0.001 # Delay in seconds for the bridge polling loop
}
def save_config(self, config_data):
"""Guarda la configuración en archivo JSON"""
try:
with open(self.config_file, 'w') as f:
json.dump(config_data, f, indent=4)
return True
except Exception as e:
print(f"Error al guardar configuración: {e}")
return False
def load_config(self):
"""Carga la configuración desde archivo JSON"""
if not os.path.exists(self.config_file):
return self.default_config.copy()
try:
with open(self.config_file, 'r') as f:
config = json.load(f)
# Asegurarse de que todas las claves necesarias estén presentes
for key, value in self.default_config.items():
if key not in config:
config[key] = value
# Migrar 'period' a 'cycle_time' si existe
if 'period' in config and 'cycle_time' not in config:
config['cycle_time'] = config['period']
del config['period']
# Migrar 'manual_brix' a 'manual_input_type' y 'manual_value'
if 'manual_brix' in config and 'manual_value' not in config:
config['manual_value'] = config['manual_brix']
config['manual_input_type'] = config.get('manual_input_type', 'Brix') # Asumir Brix si no existe
del config['manual_brix']
return config
except Exception as e:
print(f"Error al cargar configuración: {e}")
return self.default_config.copy()
def get_connection_params(self, config, use_netcom_port=False):
"""Extrae los parámetros de conexión de la configuración"""
conn_type = config.get('connection_type', 'Serial')
if conn_type == "Serial":
if use_netcom_port:
# Para NetCom, usar el puerto COM físico dedicado
return {
'port': config.get('netcom_com_port', 'COM3'),
'baud': int(config.get('netcom_baud_rate', '115200'))
}
else:
return {
'port': config.get('com_port', 'COM3'),
'baud': int(config.get('baud_rate', '115200'))
}
elif conn_type == "TCP-Server":
# Para TCP-Server, la IP es implícitamente '0.0.0.0' (escuchar en todas las interfaces)
# Solo necesitamos el puerto para el bind.
return {
'port': int(config.get('port', '8899')) # Usa el mismo campo de puerto
}
else:
return {
'ip': config.get('ip_address', '192.168.1.100'),
'port': int(config.get('port', '502'))
}
def validate_config(self, config):
"""Valida que la configuración tenga valores correctos"""
errors = []
# Validar dirección ADAM
adam_address = config.get('adam_address', '')
if len(adam_address) != 2:
errors.append("La dirección ADAM debe tener exactamente 2 caracteres")
# Validar rango de Brix
try:
min_brix = float(config.get('min_brix_map', '0'))
max_brix = float(config.get('max_brix_map', '80'))
if min_brix >= max_brix:
errors.append("El valor mínimo de Brix debe ser menor que el máximo")
except ValueError:
errors.append("Los valores de Brix deben ser números válidos")
# Validar tiempo de ciclo
try:
cycle_time = float(config.get('cycle_time', '1.0'))
if cycle_time <= 0:
errors.append("El tiempo de ciclo debe ser mayor que 0")
except ValueError:
errors.append("El tiempo de ciclo debe ser un número válido")
# Validar valor manual
try:
manual_value = float(config.get('manual_value', '0'))
# Aquí se podrían añadir validaciones de rango según el manual_input_type
except ValueError:
errors.append("El valor manual debe ser un número válido")
# Validar intervalo de errores aleatorios del simulador
try:
random_error_interval = float(config.get('random_error_interval', '10.0'))
if random_error_interval <= 0:
errors.append("El intervalo para errores aleatorios debe ser un número positivo.")
except ValueError:
errors.append("El intervalo para errores aleatorios debe ser un número válido.")
# Validar puerto serie
if config.get('connection_type') == 'Serial':
com_port = config.get('com_port', '')
if not com_port.upper().startswith('COM'):
errors.append("El puerto COM debe tener formato 'COMx'")
try:
baud_rate = int(config.get('baud_rate', '9600'))
if baud_rate <= 0:
errors.append("La velocidad de baudios debe ser mayor que 0")
except ValueError:
errors.append("La velocidad de baudios debe ser un número entero")
# Validar configuración TCP/UDP/TCP-Server
else:
try:
port = int(config.get('port', '502'))
if port <= 0 or port > 65535:
errors.append("El puerto debe estar entre 1 y 65535")
except ValueError:
errors.append("El puerto debe ser un número entero")
return errors