class Image_Send(object): def __init__(self): self.camara = Webcam() self.tcp = Comunicacion() self.host = "127.0.0.1" self.reintentos = 10 # cantidad de reintentos de conexion de la camara self.th_cam = ThreadAdmin() # Thread para la camara self.tiempo = Timer() # Control de fps self.log = self.__log_default # Para configurar log def config(self, host, port): self.host = host self.camara.config(Ancho=200, Alto=150) self.tcp.config(host, puerto=port, cliente=False, binario=True, callback=self.__call_conexion) def config_log(self, Log): '''posibilidad de configurar clase Log(Texto, Modulo)''' self.log = Log.log self.camara.config_log(Log) # enviamos el log configurado a la camara tambien def iniciar(self): self.camara.start() if self.camara.activo: # CONEXION EXITOSA self.log("CAMARA CONECTADA","IMAGE-SEND") self.tcp.iniciar() else: self.log("CAMARA SIN CONEXION", "IMAGE-SEND") # Recepcion de datos de la conexion def __call_conexion(self, codigo, mensaje): if codigo == 2: # Conexion self.th_cam.start(self.__th_camara, '', 'CAMARA ENVIO', callback=self.__log_th, enviar_ejecucion=True) elif codigo == 4: # Recepcion de datos self.log("RECEPCION INCORRECTA - COD: " + str(codigo) + " Men: " + str(mensaje), "IMAGE-SEND") elif codigo != 3: # 3 es envio de datos self.log("COD: " + str(codigo) + " Men: " + str(mensaje), "IMAGE-SEND") def __th_camara(self, run): self.tiempo.iniciar() while self.tcp.conexion and run.value: frame = self.camara.read() # Lectura de cuadro de camara self.tcp.enviar(frame) # Enviar cuadro # print(self.tiempo.fps()) # ver los fps que enviamos (solo envia 5 cuadros la raspberry) self.tiempo.delay(6) # Log por defecto def __log_default(self, Texto, Modulo): print(Texto) # Log que devuelve el thread def __log_th(self, Codigo, Mensaje): self.log(Mensaje, "IMAGE-SEND")
class Eventos(object): def __init__(self, c_objetos, c_log): # type: (Form_Principal, Logg)->None # utilizado para visualizar ayuda self.objetos = c_objetos self.log = c_log # Configuracion de objetos sin graficos self.tcp_cli = Comunicacion() self.face_comp = Face_Comp() self.tcp_cli.config(config.SERVIDOR, config.PUERTO, callback=self.evento_conexion) self.face_comp.config(config.SERVIDOR, config.PUERTO_IMG, self.objetos.box_imagen, self.objetos.label_fps, self.fun_envio) # Metodos de los objetos graficos self.objetos.bot_conectar.accion(self.click_conectar) self.objetos.bot_conec_img.accion(self.click_conectar_img) self.objetos.bot_guardar.accion(self.click_guardar) self.objetos.chbox_sens_cent.accion(self.click_chbox_sensor_cent) self.objetos.chbox_sens_izq.accion(self.click_chbox_sensor_izq) self.objetos.chbox_sens_der.accion(self.click_chbox_sensor_der) self.objetos.chbox_sens_bru.accion(self.click_chbox_brujula) self.objetos.bot_update_cent.accion(self.up_sonic_cent_time) self.objetos.bot_update_bru.accion(self.up_brujula_time) # Callback a eventos self.face_comp.config_eventos(self.evento_im_conexion) ########################################################### ### METODOS (ACCIONES DE LOS BOTONES) ### ########################################################### def click_conectar(self): """evento cuando se presiona boton de conexion """ if self.tcp_cli.conexion: self.objetos.bot_conectar.set_text("Desconectando...") self.tcp_cli.desconectar() else: self.objetos.bot_conectar.set_text("Conectando...") self.tcp_cli.iniciar() def click_conectar_img(self): """evento cuando se presiona boton de conexion de imagen""" if self.face_comp.conexion: self.objetos.bot_conec_img.set_text("Desconectando...") self.face_comp.desconectar() else: self.objetos.bot_conec_img.set_text("Conectando...") self.face_comp.iniciar() def click_guardar(self): """evento cuando se presiona boton de guardar""" config.CONFIGURACION.set('CONEXION', 'SERVIDOR', self.objetos.text_ip.text) config.CONFIGURACION.set('CONEXION', 'PUERTO', self.objetos.text_port.text) config.CONFIGURACION.set('CONEXION', 'PUERTO_IMG', self.objetos.text_port2.text) config.CONFIGURACION.set('SONICO', 'UPDATE', self.objetos.text_speed_cent.text) with open(config.ARCHIVO, 'w') as archivo: config.CONFIGURACION.write(archivo) # salvamos el archivo def click_chbox_sensor_cent(self, estado): """evento cuando se presiona checkbox de sensor central""" if estado: self.tcp_cli.enviar("SONICO|ENCENDIDO|1") else: self.tcp_cli.enviar("SONICO|ENCENDIDO|0") def click_chbox_brujula(self, estado): """evento cuando se presiona checkbox de la brujula""" if estado: self.tcp_cli.enviar("COMPAS|ENCENDIDO|1") else: self.tcp_cli.enviar("COMPAS|ENCENDIDO|0") def click_chbox_sensor_izq(self, estado): """evento cuando se presiona checkbox de sensor izquierdo""" if estado: self.tcp_cli.enviar("[SONICO_IZQ-ON]") else: self.tcp_cli.enviar("[SONICO_IZQ-OFF]") def click_chbox_sensor_der(self, estado): """evento cuando se presiona checkbox de sensor derecho""" if estado: self.tcp_cli.enviar("[SONICO_DER-ON]") else: self.tcp_cli.enviar("[SONICO_DER-OFF]") def up_sonic_cent_time(self): """evento cuando se presiona el boton de actualizacion de tiempo""" tiempo = self.objetos.text_speed_cent.text self.tcp_cli.enviar("SONICO|SPEED|" + tiempo) def up_brujula_time(self): """evento cuando se presiona el boton de actualizacion de tiempo""" tiempo = self.objetos.text_speed_bru.text self.tcp_cli.enviar("COMPAS|SPEED|" + tiempo) ########################################################### ### EVENTOS (CALLBACK DE CONEXION) ### ########################################################### def evento_conexion(self, codigo, mensaje): if codigo == 2: # Conectado self.objetos.bot_conectar.set_text("Desconectar") elif codigo == 0: # Desconectado self.objetos.bot_conectar.set_text("Conectar") elif codigo == -1: # Error self.objetos.bot_conectar.set_text("Conectar") elif codigo == 4: # Recepcion de datos self.recepcion_datos(mensaje) else: self.log.log(str(codigo) + " " + mensaje, "EVENTOS") ########################################################### ### PROCESAMIENTO DE DATOS RECIBIDOS ### ########################################################### def recepcion_datos(self, datos): datos = datos.replace("[", "", 1) datos = datos.replace("]", "", 1) try: self.log.log("RECP: " + datos) mensaje_split = str(datos).split(":", 1) # recepcion de 2 valores (parametros) if len(mensaje_split) > 1: parametro = mensaje_split[0] # Parametro valor = mensaje_split[1] # valor como string valor_f = float(valor) # valor como float valor_int = int(valor_f) # valor como integer print(valor_int) if parametro == "COMPAS": self.objetos.compbox.rotar(int(valor_int)) if parametro == "SONICO-CENT": self.objetos.prog_cent.set_text(str(valor_int)) if parametro == "SONICO-IZQ": self.objetos.prog_izq.set_text(str(valor_int)) if parametro == "SONICO-DER": self.objetos.prog_der.set_text(str(valor_int)) except Exception as e: self.log.log("ERR: " + str(e)) # EVENTOS def evento_im_conexion(self, Estado): if Estado: self.objetos.bot_conec_img.set_text("Desconectar") else: self.objetos.bot_conec_img.set_text("Conectar") # ENVIOS def fun_envio(self, modulo, comando, valor): mensaje = modulo + "|" + comando + "|" + valor self.tcp_cli.enviar(mensaje)
class Gestor(object): def __init__(self): self.tcp_gestor = Comunicacion() self.host = "127.0.0.1" self.log = self.__log_default # Para configurar log # Elementos de gestion self.im_send = Image_Send() self.cara = Robot_Cara() self.cuerpo = Robot_Cuerpo() self.voz = '' # type: TTS self.sonico_cent = UltraSonido() def config(self, host, voz): # type: (str, TTS)->None self.host = host # conexion del Gestor self.tcp_gestor.config(host, cliente=False, callback=self.__call_conexion) # Modulos de gestion self.im_send.config(host=host, port=50002) # Imagen send self.cara.config() # Cara self.cara.config_cuerpo(self.cuerpo) # datos del cuerpo a la cara self.cuerpo.config() # Cuerpo self.voz = voz # SENSORES self.sonico_cent.config(26, 19) # pines trigger y echo def config_log(self, Log): """posibilidad de configurar clase Log(Texto, Modulo)""" self.log = Log.log # Imagen send self.im_send.config_log(Log) def iniciar(self): self.log("INICIANDO GESTOR", "GESTOR") # Gestor self.tcp_gestor.iniciar() ############################ ### RECEPCION DE DATOS ### ############################ def __call_conexion(self, codigo, mensaje): if codigo == 2: # Conectado self.log("CONECTADO A GESTOR", "GESTOR") self.voz.say("Conexion establecida") # Imagen send self.im_send.iniciar() elif codigo == 4: # Recepcion de datos self.recepcion_datos(mensaje) elif codigo != 3: # 3 es envio de datos self.log("COD: " + str(codigo) + " Men: " + str(mensaje), "GESTOR") # Log por defecto def __log_default(self, Texto, Modulo): print(Texto) ########################################################### ### PROCESAMIENTO DE DATOS RECIBIDOS ### ########################################################### def recepcion_datos(self, datos): print(datos) splitted = datos.split("|") if len(splitted) == 1: # acciones de un solo valor self.accion_unica(datos) else: modulo, comando, valor = datos.split("|") self.acciones(modulo, comando, valor) ######################################## ### ANALISIS DE DATOS DE 1 VALOR ### ######################################## def accion_unica(self, comando): if comando == "[SONICO-ON]": TH_SONICO.start(self.hilo_sonico, COLA_SONICO, 'ENVIO_SONICO') if comando == "[SONICO-OFF]": TH_SONICO.close() ######################################## ### ANALISIS DE RECEPCION DE DATOS ### ######################################## def acciones(self, modulo, comando, valor): # Selecccion segun modulo if modulo == "FACE": self.modulo_FACE(comando, valor) def modulo_FACE(self, comando, valor): # Seleccion segun comando if comando == "CENTRAR": val_x, val_y = valor.split("/") # seperador de valores / val_x = int(int(val_x) * -0.2) val_y = int(int(val_y) * -0.2) # Mover la cara self.cara.mover(int(val_x), int(val_y)) ######################################## ### HILOS ### ######################################## def hilo_sonico(self, cola_tiempo): tiempo = 1 while self.tcp_gestor.conexion: # distancia = config.SONICO.distancia() distancia = self.sonico_cent.distancia_precisa(20) if distancia > -1: self.tcp_gestor.enviar("[SONICO:" + str(distancia) + "]") time.sleep(tiempo) # revisar cola if cola_tiempo.qsize() > 0: tiempo = float(cola_tiempo.get()) print("EXIT SEND DISTANCIA")
class Gestor_cli(object): def __init__(self, c_objetos): # type: (Form_Principal)->None # ejemplo ty_ (int, int) self.conexion = False # Estado de la conexion self.objeto = c_objetos self.tcp_gestor = Comunicacion() self.host = "127.0.0.1" self.log = self.__log_default # Para configurar log # Elementos de gestion self.face_analis = Face_Comp() self.fun_conexion = '' # devulve ele estado de la conexion def config(self, host, evento_conexion): """ host: IP del servidor evento_conexion devuelve el estado de la conexion """ self.host = host self.tcp_gestor.config(host, callback=self.__call_conexion) # Modulos de gestion self.face_analis.config(host, 50002, self.objeto.box_imagen, self.objeto.label_fps, self.enviar) self.face_analis.config_eventos(self.__evento_face) self.fun_conexion = evento_conexion def config_log(self, Log): """posibilidad de configurar clase Log(Texto, Modulo)""" self.log = Log.log def conectar(self): self.log("INICIANDO GESTOR CLIENTE", "GESTOR-CLI") # Gestor self.tcp_gestor.iniciar() def desconectar(self): self.log("DESCONECTAR GESTOR CLIENTE", "GESTOR-CLI") # Gestor self.tcp_gestor.desconectar() def conectar_face(self): #self.log("INICIANDO GESTOR CLIENTE", "GESTOR-CLI") self.face_analis.iniciar() def desconectar_face(self): #self.log("DESCONECTAR GESTOR CLIENTE", "GESTOR-CLI") self.face_analis.desconectar() ############################ ### ENVIO DE DATOS ### ############################ def enviar(self, modulo, comando, valor): mensaje = modulo + "|" + comando + "|" + valor self.tcp_gestor.enviar(mensaje) ############################ ### RECEPCION DE DATOS ### ############################ def __call_conexion(self, codigo, mensaje): if codigo == 2: # Conectado self.log("CONECTADO A GESTOR SERVIDOR", "GESTOR-CLI") self.conexion = True self.fun_conexion(True) if codigo == 0: # Desconectado self.conexion = False self.fun_conexion(False) def __evento_face(self, estado): # Log por defecto def __log_default(self, Texto, Modulo): print(Texto)