Practica3 Comunicacion Archivo Proyectado Memoria - raquelcedazo/sistemas-informaticos-industriales GitHub Wiki

Antes de comenzar con el desarrollo de la práctica 3 debes haber creado una etiqueta en el repositorio con el mensaje 'Fin de la práctica 2' para marcar el hito.

A continuación, para la realización de la práctica 3, crea una rama y salta a dicha rama:

$ git branch practica3
$ git checkout practica3

COMUNICACIÓN INTERPROCESO

Este ejercicio pretende poner en práctica un mecanismo de comunicación visto en la teoría:

  • Proyección de ficheros en memoria.

Para ello se propone desarrollar:

  • Programa bot (clase bot.cpp) que se encargue de controlar la raqueta1 de forma automática. La comunicación entre el bot y el tenis se debe realizar mediante el mecanismo de comunicación de ficheros proyectados en memoria.

Al finalizar esta práctica se tendrán tres procesos ejecutando en nuestro equipo con el esquema siguiente:

1030911270-esquema.png

Descripción del programa bot

Se pide implementar un programa bot que, por medio del mecanismo de ficheros proyectados en memoria, intercambie la información necesaria con el juego tenis para que sea el bot el que controle la raqueta1.

La información a compartir se compone de: la raqueta1 y la pelota para conocer la posición de ambas; y una acción que es la que debe decidir el bot en función de una lógica a desarrollar: arriba, abajo, o nada. Para ello se debe crear el fichero DatosMemCompartida.h (dentro del directorio include) con la definición de la siguiente estructura:

#pragma once 
#include "Esfera.h"
#include "Raqueta.h"
class DatosMemCompartida
{       
public:         
      Esfera esfera;
      Raqueta raqueta1;
      int accion; //1 arriba, 0 nada, -1 abajo
};

A continuación se describen los pasos a seguir para el desarrollo del bot (Existe un esquema del código en el directorio external. Puedes copiarlo al src/ y completarlo):

  1. Declarar una variable de tipo puntero a DatosMemCompartida.
  2. Abrir el fichero proyectado en memoria creado anteriormente en el tenis (open) y proyectarlo en memoria (mmap).
  3. Cerrar el descriptor de fichero.
  4. Asignar la dirección de comienzo de la región creada al atributo de tipo puntero creado en el paso 2.
  5. El bot entra en un bucle infinito incluyendo una llamada a usleep(25000) para que se suspenda durante 25 ms y en cada iteración hay que añadir la lógica necesaria para que el bot, en función de las coordenadas Y de la Esfera y la Raqueta, establezca la acción a realizar.

Modificaciones en el programa tenis

Y, por otra parte, el tenis debe modificarse según lo siguiente:

  1. Añadir un atributo del tipo puntero a DatosMemCompartida en Mundo.h.
  2. En el método Init() de Mundo:
    1. Crear un fichero del tamaño de DatosMemCompartida (open y ftruncate).
    2. Proyectar el fichero en memoria (mmap).
    3. Cerrar el descriptor de fichero.
    4. Asignar la dirección de comienzo de la región creada al atributo de tipo puntero creado en el paso 1.
  3. En el método OnTimer() de Mundo, actualizar los campos del atributo DatosMemCompartida e invocar al método OnKeyboardDown según el valor de la acción correspondiente.

Recordad que hay que modificar el CMakeLists.txt para añadir el nuevo programa (mediante ADD_EXECUTABLE) y que compile correctamente. Por último, subid la nueva rama al repositorio:

$ git push origin practica3

Una vez desarrollado el ejercicio propuesto, haz un merge de la rama practica3 con la rama master:

$ git checkout master
$ git merge practica3
$ git push origin master 

Para marcar el hito, crea una etiqueta con el texto: 'Fin de la práctica 3'.