void tempo(int16 seg) { // recibe como argumento en segundos, el tiempo que se desea sumar a la hora actual.
// la función cargará en tres variables globales _hora, _minutos _segundos a qué hora se dará el vencimiento
if (busy == 1) return; // no haremos nada si ya hay una temporizacion activa.
// busy será bajada a cero por tempo_out() una vez concluido el vencimiento.
// Por ello, es de vital importancia consultar tempo_out periodicamente cuando se haga uso de tempo()
mas24 = 0; // bandera de control cruce de 23 a 00 horas inactivo inicialmente.
// primero descomponemos los segundos recibidos en el argumento y obtenemos (segundos, minutos y horas). Lo llamamos tiempo de consigna a cronometrar
int8 segundos_consigna = seg % 60; // pedimos modulo de 60 y obtenemos los segundos en formato horario.
int8 minutos_consigna = (seg / 60) % 60; // despejamos los minutos totales
int8 hora_consigna = seg / 3600; // despejamos las horas totales.
// ya sabemos cuantas horas, minutos y segundos en formato correcto corresponden a la cifra en segundos recibida en el argumento
// ahora vamos a ver qué hora es ahora mismo y le vamos a sumar este tiempo consignado. Luego entonces, determinaremos a qué hora se dará el vencimiento.
read_rtc(); // primero leemos la hora actual. Esta funcion leerá el rtc y actualizará las variables globales "hora,minutos,segundos" con la hora exacta en este momento.
segundos_ = segundos + segundos_consigna; // sumamos los segundos actuales a los consignados arriba.
minutos_ = minutos + minutos_consigna; // misma operación para los minutos.
hora_ = hora + hora_consigna; // misma operación para la hora.
if (segundos_ > 60) { // si segundos_ es superior a 60, hallamos su modulo e incrementamos minutos_ en una unidad
segundos_ = segundos_ % 60;
minutos_++;
}
if (minutos_ > 60) { // Si _minutos es superior a 60, hallamos su modulo e incrementamos hora_ en una unidad.
minutos_ = minutos_ % 60;
hora_++;
}
if (hora_ > 23) {hora_ = hora_ - 24; mas24 = 1;} // Si da mas de 23 horas, hayamos la diferencia desde 24 y determinamos la hora equivalente en el formato de 24h, además lo indicamos mediante la bandera mas24.
// para que la funcion tempo_out(); lo tenga en cuenta a la hora de evaluar si nos hemos pasado de hora o se a alcanzado.
busy = 1; // Indicamos que esta función ya tiene una temporización en curso. Si se intenta llamar con otro tiempo, se efectuará un return al principio sin hacer ni cambiar nada.
// Esta bandera será bajada por (tempo_out(); cuando se indique vencimiento.
}