Explicación del Programa Emisor - UTN FRBA

Anuncio
Explicación del Programa Emisor
El programa emisor comienza con varios includes, uno especial para poder
manejarse en C++, el IOSTREAM.H . Luego de los includes, se encuentran los defines
de puerto serie y sus registros y del LPT, con el propósito de facilitar el uso de los
registros mientras que se crea el código del programa.
El programa comienza con unas estructuras importantes que son la base del
sistema de acceso (clase CITANOVA). Estas estructuras son “agenda”, que va a
mantener el nombre, apellido y contraseña del ingresante para su corroboración
posterior. La estructura NODE, permite el enlace de los datos para crear una estructura
avanzada de datos de los mismos.
Antes de empezar, aclaramos el uso de las funciones WRIADV,
ERASECURSOR, VERIFY. La función ERASECURSOR consiste en la utilización de
interrupciones de software para modificar el espesor del cursor, por lo tanto nosotros lo
medicamos para que desaparezca. La función VERIFY es una función que protege el
uso de “teclas prohibidas” durante uno mande datos por el puerto serie. Estas teclas son:
F1 hasta F12, y el backspace. Cabe acotar que se usan dos getch en la funcion, porque el
tamaño de los F1, F2, F3, etc., es de 2 bytes, por lo tanto con un solo getch() no se podia
abarcar la información hexadecimal del carácter. La función WRIADV se encarga de
una de las opciones del programa principal, y nos permite escribir propagandas,
abriendo una corriente de un archivo en modo write y mandar cada carácter que
escribimos al mismo para después ser leídos por la función PUBLISH que
comentaremos mas adelante. Hay dos variables importantes en esta funcion, datododo y
datododo2, siendo la primera la que reciba de teclado el carácter y con fputc se escriba
en la corriente de archivo y la segunda un carácter inicializado como ‘-‘ que con un
while se escribira en la corriente, para separar una propaganda de otra. Tambien usamos
una clase llamada WRITEN que nos permite visualizar los datos en la pantalla mientras
los escribimos. (La clase crea una lista de nodos que tienen como dato l carácter que
nosotros tomamos de teclado).
Hablemos ahora de la clase CITANOVA, en su parte privada se crea un header
*h y un indicador de ultimo lugar *l que van a servir para indicarnos el primer objeto y
el ultimo, respectivamente, de la estructura avanzada. En el constructor CITANOVA(),
se inicializan las variables y el flag FFLAG en 1 que va a servir para indicarnos mas
adelante si hubo concordancia entre los datos ingresados y los que fueron levantados del
archivo.
Para el programa en si, no era necesario ordenar alfabéticamente los datos
ingresados, ya que lo que hacemos nosotros es nada mas verificar si existe en la lista
que obtuvimos por archivo, pero existen en la clase funciones de ordenamiento, las
cuales son: PUTFIRST() , PUTEND(), INSERT () y la función LOOPIN, que es la que
va a manejar a las primeras según la posición que deban tomar los datos que se
ingresaron. Por lo tanto explicaremos la función LOOPIN que va a abarcar a las demás.
LOOPIN es el encargado de ingresar los datos a la lista, y aunque su
funcionalidad no este %100 aprovechada en el programa, brevemente explicaremos que
cuando se ingresa un dato, la función los ordena en orden alfabético. PUTFIRST es el
encargado de ingresar un dato en forma de pila, ya sea porque es el primer nodo de la
lista o porque el nombre es alfabéticamente superior en orden. Luego se procede a
recorrer los nodos de la lista y nos vamos preguntando si la misma llego al final o si hay
un nodo que tenemos que ingresar en algún lado en particular de la estructura de datos.
Por lo tanto con la función INSERT, pasamos la dirección donde se tiene que
enganchar el nuevo nodo y los datos. Por último, tenemos que averiguar si llego al final
de la lista, porque si fue así tenemos que agregar el nodo al final, deduciendo que los
datos del nodo nuevo son alfabéticamente menor en orden.
Una vez ingresados los datos, mientras se corra el programa, se utilizara la
función SEARCH, que ingresando los datos por una estructura auxiliar, se recorre la
lista y se verifica si existen entre los nodos de la lista. En caso afirmativo se activa el
flag ya nombrado FFLAG.
Ahora que terminamos con esta clase, veremos que hay unas funciones
declaradas antes del main. INIT() es la función que inicializa el puerto serie, el vector
de interrupciones, la máscara de interrupciones y salva guarda los registros de la UART.
RESUME es una funcion que guarda en el archivo RESUMEN.TXT los datos de los
caracteres enviados y las palabras enviadas en la ultima sesión del programa.
LASTRESUME lee los datos del archivo RESUMEN.TXT y los imprime en pantalla.
La funcion SEND es una de las más importantes porque es la que envía los datos
que se obtienen por teclado al puerto serie. La funcion contiene contadores y se maneja
con la lista WRITEN usando su función SHOW ( que sirve para mostrar los datos que
vamos ingresando) Mientras no se oprima la tecla ESC, se llamara a la función SEND
indefinidas veces y esta espera a que el flag THRELIBRE (de lógica negada) se active
en 0 para poder realizar la obtención del dato, la verificación del mismo y el backup de
este en un buffer auxiliar. Luego se manda al puerto serie y al finalizar se verifica si el
dato fue un ENTER o un SPACE para facilidades de visualización en pantalla.
Obviamente el flag THRELIBRE queda inactivo en 1, esperando a que la ISR nueva de
la interrupción del puerto serie de Registro de Transmisión Vacío lo active de vuelta en
0, indicando que el registro esta listo para recibir un dato nuevo. La otra función
importante es PUBLISH que será la encargada de leer los archivos con publicidades
para poder mandarlas al puerto serie. Por lo tanto, la función utiliza un sistema switch,
que indicando la publicidad deseada, el archivo con la misma se carga enana corriente y
por un método parecido al de la función SEND (con el del flag THRELIBRE) manda al
puerto la información caracter por caracter. Ya sea en cualquiera de estas dos funciones,
hay una corriente ARCH que graba todos los datos enviados en el archivo
MANDADO.TXT .
Como último, tenemos *OLDINTCOM y INTCOM, donde OLDINTCOM es un
puntero a función de interrupción, que va a apuntar a la rutina antigua de interrupción
del puerto serie, y INTCOM será nuestra nueva rutina de interrupción. En la función
INIT hacemos el enganche de la nueva rutina de interrupción con la nueva con los
comandos getvect (que obtiene la direccion actual) y setvect (que coloca la nueva rutina
en el vector de interrupciones).
Descargar