/* Biblioteca basica del susbsistema de Disco	*/
/*	Subsistema de disco			*/
/*	version 2.0 marzo 1997			*/

#include <unistd.h>
#include <signal.h>
#include <sys/time.h>

#include "Tipos_DISCO.h"
#include "Error_DISCO.h"

int alarma;
extern int     error_disco;


/* Seccion de funciones para simular tiempos caracteristicos */

void retorno()
{
     alarma = 1;
}

/* Funcion de inicializacion de la alarma de recepcion de datos */
/* tiempo es el intervalo a inicializar la alarma del proceso	*/
/* tiempo se especifica en segundos y microsegundos		*/
/* reloj es una FUNCION INTERNA de este modulo			*/

int reloj( tiempo t )
{
     struct itimerval        it_control;
     struct timeval          time_control;
     void                    retorno() ;

     if ( (t.seg == 0) && (t.mseg == 0) ) {
        alarma = 1;
     return(0);
     }

     time_control.tv_sec = t.seg;
     time_control.tv_usec = t.mseg;
     it_control.it_value = time_control;
     time_control.tv_sec = 0;
     time_control.tv_usec = 0;
     it_control.it_interval = time_control;  
     signal(SIGALRM, retorno);  
     if ( setitimer ( ITIMER_REAL, &it_control, 0 ) ) return(-1); 
     return(0);
}


/* Funcion de simulacion del tiempo de posicionamiento (seek) de una unidad */
/* tiempo es el intervalo de tiempo asociado al posicionamiento del brazo */
/* tiempo se especifica en segundos y microsegundos	*/	
/* Tiempo_Seek es una FUNCION EXTERNA			*/

int Tiempo_Seek( tiempo t )
{
     int  ret;

     alarma = 0;
     if ( reloj(t) < 0 ) return(-1);
          
     while ( !alarma ); 

     return(0);
}

/* Funcion de simulacion del tiempo de latencia de la unidad	*/
/* Tiempo_Late es una FUNCION EXTERNA				*/

int Tiempo_Late( tiempo t )
{
     int ret;

     alarma = 0;
     if ( reloj(t) < 0 ) return(-1);

     while ( !alarma );

     return(0);
}

/* Funcion de simulacion del tiempo de transferencia de la unidad */
/* tiempo es el intervalo de tiempo asociado a la transferencia	*/
/* Tiempo_Transf es una FUNCION EXTERNA				*/

int Tiempo_Transf( tiempo t )
{
     int ret;

     alarma = 0;
     if ( reloj(t) < 0 ) return(-1);

     while( !alarma );

     return(0);
}

/* Funcion de simulacion del tiempo de recalibrado de la unidad */
/* tiempo es el intervalo de tiempo asociado al recalibrado	*/
/* Tiempo_Recal es una FUNCION EXTERNA				*/

int Tiempo_Recal( tiempo t )
{

     int ret;

     alarma = 0;
     if ( reloj(t) < 0) return(-1);

     while( !alarma );

     return(0);
}