Project

General

Profile

Funciones en el codigo » History » Version 6

fernanda ventura, 12/29/2023 12:49 PM

1 1 fernanda ventura
h1. Funciones en el codigo
2 1 fernanda ventura
3 3 fernanda ventura
h3. Clase que representa la pantalla del usuario asistido
4 1 fernanda ventura
<pre>
5 1 fernanda ventura
class AsistidoScreen(Screen):
6 6 fernanda ventura
    recording = False  #Indica si se está grabando
7 1 fernanda ventura
    frames = []  # Almacena fragmentos de audio
8 1 fernanda ventura
    audio_stream = None  # Flujo de entrada de audio
9 1 fernanda ventura
    sound = None  # Objeto para reproducir sonido
10 1 fernanda ventura
    file_name = "grabacion.wav"  # Nombre del archivo de audio
11 1 fernanda ventura
12 1 fernanda ventura
    # Inicia la grabación de audio en un hilo separado
13 1 fernanda ventura
    def iniciar_grabacion(self):
14 1 fernanda ventura
        if not self.recording:
15 1 fernanda ventura
            self.recording = True
16 1 fernanda ventura
            threading.Thread(target=self._grabar_audio).start()
17 1 fernanda ventura
18 1 fernanda ventura
    # Detiene la grabación de audio y reproduce el audio grabado en un hilo separado
19 1 fernanda ventura
    def detener_grabacion(self):
20 1 fernanda ventura
        if self.recording:
21 1 fernanda ventura
            self.recording = False
22 1 fernanda ventura
            threading.Thread(target=self._reproducir_audio).start()
23 1 fernanda ventura
24 1 fernanda ventura
    # Método privado que realiza la grabación de audio
25 1 fernanda ventura
    def _grabar_audio(self):
26 1 fernanda ventura
        CHUNK = 1024
27 1 fernanda ventura
        FORMAT = pyaudio.paInt16
28 1 fernanda ventura
        CHANNELS = 2
29 1 fernanda ventura
        RATE = 44100
30 1 fernanda ventura
31 1 fernanda ventura
        p = pyaudio.PyAudio()
32 1 fernanda ventura
33 1 fernanda ventura
        # Crea o sobrescribe el archivo de audio
34 1 fernanda ventura
        with open(self.file_name, 'wb'):
35 1 fernanda ventura
            pass
36 1 fernanda ventura
37 1 fernanda ventura
        # Abre el flujo de entrada de audio
38 1 fernanda ventura
        self.audio_stream = p.open(format=FORMAT,
39 1 fernanda ventura
                                   channels=CHANNELS,
40 1 fernanda ventura
                                   rate=RATE,
41 1 fernanda ventura
                                   input=True,
42 1 fernanda ventura
                                   frames_per_buffer=CHUNK)
43 1 fernanda ventura
44 1 fernanda ventura
        # Bucle de grabación
45 1 fernanda ventura
        while self.recording:
46 1 fernanda ventura
            data = self.audio_stream.read(CHUNK)
47 1 fernanda ventura
            self.frames.append(data)
48 1 fernanda ventura
49 1 fernanda ventura
        # Detiene y cierra el flujo de entrada de audio
50 1 fernanda ventura
        self.audio_stream.stop_stream()
51 1 fernanda ventura
        self.audio_stream.close()
52 1 fernanda ventura
        p.terminate()
53 1 fernanda ventura
54 1 fernanda ventura
        # Guarda los frames grabados en un archivo WAV
55 1 fernanda ventura
        with wave.open(self.file_name, 'wb') as wf:
56 1 fernanda ventura
            wf.setnchannels(CHANNELS)
57 1 fernanda ventura
            wf.setsampwidth(pyaudio.PyAudio().get_sample_size(FORMAT))
58 1 fernanda ventura
            wf.setframerate(RATE)
59 1 fernanda ventura
            wf.writeframes(b''.join(self.frames))
60 1 fernanda ventura
61 1 fernanda ventura
        # Reproduce el audio grabado
62 1 fernanda ventura
        self._reproducir_audio()
63 1 fernanda ventura
64 1 fernanda ventura
        # Limpia los frames grabados
65 1 fernanda ventura
        self.frames = []
66 1 fernanda ventura
67 1 fernanda ventura
    # Método privado que reproduce el audio grabado
68 1 fernanda ventura
    def _reproducir_audio(self):
69 1 fernanda ventura
        if self.frames:
70 1 fernanda ventura
            sound_data = b''.join(self.frames)
71 1 fernanda ventura
72 1 fernanda ventura
            # Carga el sonido y lo reproduce
73 1 fernanda ventura
            sound = SoundLoader.load(self.file_name)
74 1 fernanda ventura
            if sound:
75 1 fernanda ventura
                sound.play()
76 1 fernanda ventura
77 1 fernanda ventura
    # Se llama al abandonar la pantalla para detener el sonido y cerrar el flujo de audio
78 1 fernanda ventura
    def on_leave(self):
79 1 fernanda ventura
        if self.sound:
80 1 fernanda ventura
            self.sound.stop()
81 1 fernanda ventura
        if self.audio_stream:
82 1 fernanda ventura
            self.audio_stream.stop_stream()
83 1 fernanda ventura
            self.audio_stream.close()
84 1 fernanda ventura
85 1 fernanda ventura
    # Muestra un teclado en una ventana emergente
86 1 fernanda ventura
    def show_keyboard(self):
87 1 fernanda ventura
        self.keyboard_popup = Popup(title='Teclado',
88 1 fernanda ventura
                                    content=self._build_keyboard_layout(),
89 1 fernanda ventura
                                    size_hint=(None, None),
90 1 fernanda ventura
                                    size=(400, 300),
91 1 fernanda ventura
                                    auto_dismiss=True)
92 1 fernanda ventura
        self.keyboard_popup.open()
93 1 fernanda ventura
94 1 fernanda ventura
    # Construye el diseño del teclado en la ventana emergente
95 1 fernanda ventura
    def _build_keyboard_layout(self):
96 1 fernanda ventura
        layout = BoxLayout(orientation='vertical', spacing=10, padding=10)
97 1 fernanda ventura
98 1 fernanda ventura
        text_input = TextInput(multiline=False, readonly=True, halign='center', font_size=24)
99 1 fernanda ventura
        layout.add_widget(text_input)
100 1 fernanda ventura
101 1 fernanda ventura
        buttons_layout = GridLayout(cols=10, spacing=5, size_hint_y=None, height=150)
102 1 fernanda ventura
103 1 fernanda ventura
        # Diseño del teclado QWERTY
104 1 fernanda ventura
        qwerty_layout = [
105 1 fernanda ventura
            'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P',
106 1 fernanda ventura
            'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L',
107 1 fernanda ventura
            'Z', 'X', 'C', 'V', 'B', 'N', 'M',
108 1 fernanda ventura
            'Space', 'Borrar', 'Enter'
109 1 fernanda ventura
        ]
110 1 fernanda ventura
111 1 fernanda ventura
        # Agrega botones al diseño
112 1 fernanda ventura
        for button_text in qwerty_layout:
113 1 fernanda ventura
            buttons_layout.add_widget(Button(text=button_text, on_press=self._on_button_press))
114 1 fernanda ventura
115 1 fernanda ventura
        layout.add_widget(buttons_layout)
116 1 fernanda ventura
117 1 fernanda ventura
        return layout
118 1 fernanda ventura
119 1 fernanda ventura
    # Maneja el evento de presionar un botón en el teclado
120 1 fernanda ventura
    def _on_button_press(self, instance):
121 1 fernanda ventura
        current_text_input = self.find_text_input(self.keyboard_popup.content)
122 1 fernanda ventura
123 1 fernanda ventura
        # Acciones según el botón presionado
124 1 fernanda ventura
        if instance.text == 'Enter':
125 1 fernanda ventura
            self.reproducir_texto(current_text_input.text)
126 1 fernanda ventura
            current_text_input.text = ''
127 1 fernanda ventura
        elif instance.text == 'Space':
128 1 fernanda ventura
            current_text_input.text += ' '
129 1 fernanda ventura
        elif instance.text == 'Borrar':
130 1 fernanda ventura
            current_text_input.text = ''
131 1 fernanda ventura
        else:
132 1 fernanda ventura
            current_text_input.text += instance.text
133 1 fernanda ventura
134 1 fernanda ventura
    # Encuentra el TextInput entre los hijos de un layout
135 1 fernanda ventura
    def find_text_input(self, layout):
136 1 fernanda ventura
        for child in layout.children:
137 1 fernanda ventura
            if isinstance(child, TextInput):
138 1 fernanda ventura
                return child
139 1 fernanda ventura
            elif len(child.children) > 0:
140 1 fernanda ventura
                text_input = self.find_text_input(child)
141 1 fernanda ventura
                if text_input:
142 1 fernanda ventura
                    return text_input
143 1 fernanda ventura
        return None
144 1 fernanda ventura
145 1 fernanda ventura
    # Inicia la reproducción de texto en un hilo separado
146 1 fernanda ventura
    def reproducir_texto(self, texto):
147 1 fernanda ventura
        threading.Thread(target=self._reproducir_voz, args=(texto,)).start()
148 1 fernanda ventura
149 1 fernanda ventura
    # Método privado que reproduce el texto utilizando la biblioteca pyttsx3
150 1 fernanda ventura
    def _reproducir_voz(self, texto):
151 1 fernanda ventura
        engine = pyttsx3.init()
152 1 fernanda ventura
        engine.say(texto)
153 2 fernanda ventura
        engine.runAndWait()
154 2 fernanda ventura
155 1 fernanda ventura
</pre>
156 4 fernanda ventura
157 4 fernanda ventura
h3. Clase que representa la pantalla del cuidador
158 4 fernanda ventura
<pre>
159 4 fernanda ventura
class CuidadorScreen(Screen):
160 4 fernanda ventura
    video = None  # Widget de video
161 4 fernanda ventura
    motion_label = None  # Etiqueta de movimiento
162 4 fernanda ventura
    camera_initialized = False  # Indica si la cámara ha sido inicializada
163 4 fernanda ventura
164 4 fernanda ventura
    # Se llama al entrar en la pantalla para inicializar la cámara y detectar el movimiento
165 4 fernanda ventura
    def on_enter(self, *args):
166 4 fernanda ventura
        super(CuidadorScreen, self).on_enter(*args)
167 4 fernanda ventura
168 4 fernanda ventura
        # Crea el widget de video si no se ha inicializado previamente
169 4 fernanda ventura
        if not self.camera_initialized:
170 4 fernanda ventura
            self.video = Video(
171 4 fernanda ventura
                source="http://172.20.10.3:5000/video_feed",
172 4 fernanda ventura
                state="play",
173 4 fernanda ventura
                options={"allow_stretch": True},
174 4 fernanda ventura
            )
175 4 fernanda ventura
            self.video.bind(texture=self.texture_callback)
176 4 fernanda ventura
            self.ids.camera_layout.add_widget(self.video)
177 4 fernanda ventura
178 4 fernanda ventura
            # Crea la etiqueta para la alerta de movimiento
179 4 fernanda ventura
            self.motion_label = Label(
180 4 fernanda ventura
                text="No se detecta movimiento", font_size="15sp", color=(1, 0, 0, 1)
181 4 fernanda ventura
            )
182 4 fernanda ventura
            self.ids.camera_layout.add_widget(self.motion_label)
183 4 fernanda ventura
184 4 fernanda ventura
            # Inicia el procesamiento de la cámara en un hilo separado
185 4 fernanda ventura
            threading.Thread(target=self.detect_motion).start()
186 4 fernanda ventura
187 4 fernanda ventura
            # Marca la cámara como inicializada para evitar la duplicación
188 4 fernanda ventura
            self.camera_initialized = True
189 4 fernanda ventura
190 4 fernanda ventura
    # Callback para actualizar la textura del widget de video
191 4 fernanda ventura
    def texture_callback(self, instance, value):
192 4 fernanda ventura
        self.video.texture = value
193 4 fernanda ventura
194 4 fernanda ventura
    # Método que detecta el movimiento en el feed de la cámara
195 4 fernanda ventura
    def detect_motion(self):
196 4 fernanda ventura
        cap = cv2.VideoCapture("http://172.20.10.3:5000/video_feed")
197 4 fernanda ventura
        _, prev_frame = cap.read()
198 4 fernanda ventura
199 4 fernanda ventura
        while True:
200 4 fernanda ventura
            _, frame = cap.read()
201 4 fernanda ventura
            diff = cv2.absdiff(prev_frame, frame)
202 4 fernanda ventura
            gray = cv2.cvtColor(diff, cv2.COLOR_BGR2GRAY)
203 4 fernanda ventura
            _, thresh = cv2.threshold(gray, 30, 255, cv2.THRESH_BINARY)
204 4 fernanda ventura
            contours, _ = cv2.findContours(
205 4 fernanda ventura
                thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE
206 4 fernanda ventura
            )
207 4 fernanda ventura
208 4 fernanda ventura
            # Verifica si hay algún contorno de movimiento
209 4 fernanda ventura
            motion_detected = any(cv2.contourArea(cnt) > 1000 for cnt in contours)
210 4 fernanda ventura
211 4 fernanda ventura
            if motion_detected:
212 4 fernanda ventura
                # Programa la muestra de la alerta
213 4 fernanda ventura
                Clock.schedule_once(self.show_alert, 0)
214 4 fernanda ventura
215 4 fernanda ventura
            prev_frame = frame.copy()
216 4 fernanda ventura
217 4 fernanda ventura
    # Muestra una alerta cuando se detecta movimiento
218 4 fernanda ventura
    def show_alert(self, *args):
219 4 fernanda ventura
        # Función asíncrona para enviar un mensaje a través de Telegram
220 4 fernanda ventura
        async def send_telegram_message(token, chat_id, message_text):
221 4 fernanda ventura
            bot = Client("my_account", api_id="your_api_id", api_hash="your_api_hash", bot_token=token)
222 4 fernanda ventura
            await bot.send_message(chat_id=chat_id, text=message_text)
223 4 fernanda ventura
            await bot.run()
224 4 fernanda ventura
225 4 fernanda ventura
        TOKEN = "6879188437:AAFO-HGke4OIoUZMGN_EAl6_vgcMfDufqhY"
226 4 fernanda ventura
        CHAT_ID = "5081858998"
227 4 fernanda ventura
        MESSAGE_TEXT = "¡Se detectó movimiento!"
228 4 fernanda ventura
        
229 4 fernanda ventura
        # Llama a la función asíncrona para enviar el mensaje a Telegram
230 4 fernanda ventura
        asyncio.run(send_telegram_message(TOKEN, CHAT_ID, MESSAGE_TEXT))
231 4 fernanda ventura
232 4 fernanda ventura
        # Actualiza la etiqueta de movimiento
233 4 fernanda ventura
        self.motion_label.text = "¡Se detectó movimiento!"
234 4 fernanda ventura
235 4 fernanda ventura
        # Programa la reinicialización de la alerta después de 5 segundos
236 4 fernanda ventura
        Clock.schedule_once(self.reset_alert, 5)
237 4 fernanda ventura
238 4 fernanda ventura
    # Reinicia la etiqueta y la detección de movimiento para la próxima alerta
239 4 fernanda ventura
    def reset_alert(self, *args):
240 4 fernanda ventura
        self.motion_label.text = "No se detecta movimiento"
241 4 fernanda ventura
        threading.Thread(
242 4 fernanda ventura
            target=self.detect_motion
243 4 fernanda ventura
        ).start()  # Reiniciar la detección para la próxima alerta
244 4 fernanda ventura
</pre>
245 4 fernanda ventura
246 4 fernanda ventura
h3. # Clase que representa la pantalla de información
247 4 fernanda ventura
248 4 fernanda ventura
<pre>
249 4 fernanda ventura
class InformacionScreen(Screen):
250 4 fernanda ventura
    # Abre el archivo PDF
251 4 fernanda ventura
    def open_pdf(self):
252 4 fernanda ventura
        pdf_file_path = "hola.pdf"
253 4 fernanda ventura
254 4 fernanda ventura
        try:
255 4 fernanda ventura
            os.startfile(pdf_file_path)
256 4 fernanda ventura
        except Exception as e:
257 4 fernanda ventura
            print(f"Error al abrir el archivo PDF: {e}")
258 4 fernanda ventura
</pre>