A continuación, vamos a proceder a explicar el diseño realizado en el proyecto CAMX.
El desarrollo se ha llevado a cabo a través de un proceso iterativo en espiral, incrementando en cada iteración el desarrollo del mismo añadiendo nuevas funcionalidades a cada versión que se ha realizado.
El lenguaje de programación que se ha usado para crear la aplicación ha sido Python.
Una vez explicado ésto continuaremos viendo un ligera descripción de las clases principales, así como de los aspectos más importantes a tener en cuenta del diseño.
Esta clase se encargará del control de la conexión TCP/IP con la matriz.
El objeto conexión será creado al inicio de la aplicación en el programa principal, con éste se lanzará la hebra encargada de "dialogar" con la matriz mientras no se produzca ningún evento. Ésta hebra será lanzada mediante el método 'crear_hebra'.
Puesto que el objeto será compartido y para seguir el protocolo utilizado por la matriz, deberemos ocuparnos primero de evitar que se produzcan dos envíos simultáneos y segundo deberemos dar prioridad a las respuestas de la hebra encargada de mantener el 'are u alive'.
Para la consecución de la prioridad, utilizamos un objeto condición pasado como parámetro de entrada, que mediante la modificación de otra variable, ésta vez la privada __bloqueo, congela cualquier envío que se quiera lanzar contra la matriz hasta que su mensaje de reconocimiento haya sido respondido.
La clase mensaje es la encargada de crear y analizar todos los mensajes XML que nuestra aplicación utiliza.
Generará los mensajes que nuestra aplicación envíe a la matriz por medio del procedimiento XmlGenerator, que en su mayoría se basa en el creado por Mark Pilgrim y que podremos encontrar en las referencias bibliográficas. Éste utilizando un mensaje XML para generar XML (a primera vista parece complicado, pero no lo es) construye el mensaje a raíz de un axioma, dependiendo del tipo de mensaje que le pidamos, como si de una gramática se tratara.
La clase gestiona el envío de eventos, puesto que realiza la llamada al procedimiento de la clase conexión encargado de escribir en ésta. Una vez que se envía el primer mensaje (que será el de Login) a la matriz con los parámetros por defecto, se obtiene de ésta los parámetros que serán utilizados para los siguientes envíos; éstos se guardarán en el diccionario de dispositivos 'dev'. Además de los dispositivos, también tiene otros parámetros de vital importancia para nuestra aplicación como son el identificador de mensaje ('msgID') o el path del mensaje XML utilizado para la construcción de los mensajes ('origen.xml').
Por otro lado, al realizar el análisis de los mensajes recibidos, extraemos el tipo al que pertenecen y dependiendo de éste, guardaremos los parámetros cuya información no sea de utilidad, como puede ser el evento del que se nos confirmó su activación, el valor de cierto entrada de audio, etc..
Como es explicado en la clase conexión, si en el momento de querer enviar un evento a la matriz, ésta nos envió un mensaje, nuestro envío será bloqueado (mediante un objeto condición) por la hebra encargada de leer lo escrito por la matriz, el bloqueo acabará en el momento en que la matriz sea respondida.
Ahora bien, nuestro mensaje se pudo bloquear en dos sitios, justo antes de ser completamente generado o justo después. Si lo fue después, un mensaje de respuesta de la hebra a la matriz pudo ser enviado mientras nuestro mensaje permanecía bloqueado; es por eso, por lo que es necesario refrescar el mensaje bloqueado, cambiándole para eso su identificador de mensaje ('msgID') que habrá caducado al haber sido ya utilizado por otro mensaje.
La clase matriz de vídeo se encarga de recoger los eventos activados que ésta tiene y que nos son de interés. Además, nos proporciona los métodos necesarios para manejar sus entradas y salidas.
Para la gestión de todos los eventos, los clasifica en activados o desactivados. Después de hacer esto y dependiendo de lo que nos interese, trataremos la información que nos supone el evento. Esa información se puede referir a la cámara activada, a la información asociada a esa cámara (como la velocidad o el estado del auto), al volumen de las entradas de audio y a las entradas/salidas seleccionadas.
Para la actualización de todos estos eventos, el objeto matriz es pasado al procedimiento que analiza los mensajes recibidos. Como ya se deduce, matriz de vídeo será un objeto que se cree al comienzo de la aplicación y que se pase como parámetro.
Para todos los atributos de la matriz de vídeo a los que se les da valor al analizar el mensaje recibido, se cuenta con métodos para obtener y guardar su valor.
Ésta clase se encarga de ofrecer al usuario todos los movimientos posibles para la cámara, así como sus posiciones predefinidas con posibilidad de modificarlas, la selección del recorrido automático gestionado por la matriz y la creación de un recorrido automático con tiempo personalizado que será controlado por una hebra creada por nuestro programa cliente.
Mediante esta clase, es posible aumentar o disminuir los volúmenes de las entradas de audio de la matriz.