Project

General

Profile

Funciones en el codigo » History » Version 7

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