/*
*  Ejemplo de una alarma simple para una casa con el microPLC - arduino
*  
*  Descripción: Programa básico que reproduce el funcionamiento de una alarma para una casa
*
*  Autor: Rafa Aranda
*  Fecha: 12-03-2014
*  Versión: 1.0
*/

// Asignación de Pins a Salidas digitales (están ordenados de forma decreciente por necesidades del PCB)
#define Out_1 6 
#define Out_2 7 
#define Out_3 8 
#define Out_4 9 

// Pins de entrada (están ordenados de forma decerciente por necesidades del PCB)
#define In_1 5 
#define In_2 4 
#define In_3 3 
#define In_4 2

// Librerías 
#include "microPLC.h"

// Funciones prototipo 
void getInputs(void);
void setOutputs(void);

//  Variables globales

//Definición de las variables de trabajo
m4bits s;		// Entradas del microPLC
m4bits k;		// Salidas del microPLC
m4bits m1;	// Memoria temporal

// microPLC
microPLC uPLC;	// Declaración del microPLC

// Contadores y temporizadores
TRC ts(10,T1S);		// Tiempo de salida 10 segundos
TRCM te(5,T1S);		// Tiempo de entrada 5 segundos
TI ta(15,T1S);		// Tiempo de alarma	15 segundos
PULSE tp(1, 1, T1S, 0);	// Iniciamos el temporizador t1 con 1 segundo en ON y 1 segundo en OFF, impulsos continuos


/*  setup
*  Tareas iniciales de preparación
*/
void setup(){
	// Establecer los pins de salida de los relés
  pinMode(Out_1, OUTPUT);
  pinMode(Out_2, OUTPUT);
  pinMode(Out_3, OUTPUT);
  pinMode(Out_4, OUTPUT);
  
  // Establecer los pins de entradas digitales optoacopladas
  pinMode(In_1, INPUT);
  pinMode(In_2, INPUT);
  pinMode(In_3, INPUT);
  pinMode(In_4, INPUT);
	 
  // Preparar las variables
	uPLC.init(); // Iniciar funciones del tiempo
}

/*  loop
*  Programa principal
*/
void loop() {
  getInputs();    // Leer las entradas digitales
	
	//-------- Alarma --------
	// A. Temporizador de salida
	ts.Set(s._1);
	// B. Piloto de alarma en funcionamiento
	k._1=ts.Q();
	// C. Temporizador de entrada por la puerta
	te.Set(s._2&ts.Q());	// Activación del temporizador por la ppuerta si la alarma esté en marcha
	te.Reset(ta.Q());			// Iniciamos el temporizador, cuando se dispara la alarma 
	// D. Temporizador de alarma o sirena en marcha
	ta.Set((s._3|te.Q()|ta.Q())&ts.Q());
	// E. Sirena
	k._2=ta.Q();
	// F. Pilotos indicadores de tiempo de entrada y salida
	tp.Set(ts.T()|te.T());
	// G. Asignar la salida K3 como piloto de parpadeo de tiempos
	k._3=tp.Q();
	//------------------------
	
  setOutputs();   // Activar las salidas
  delay(1);				// CicloScan + 1ms, retardo para anti-rebotes
}

/*  GetInputs
*  Lee el estado de la entrada indicada en el parámetro y lo asigna invertido a las variables de trabajo	
*/
void getInputs(void){
	s._1=!digitalRead(In_1);
  s._2=!digitalRead(In_2);
  s._3=!digitalRead(In_3);
  s._4=!digitalRead(In_4);
}

/*  setOutputs
*  asigna el estado de las varibles de trabajo a las salidas digitales	
*/
void setOutputs(void){
  digitalWrite(Out_1, k._1);
  digitalWrite(Out_2, k._2);
  digitalWrite(Out_3, k._3);
  digitalWrite(Out_4, k._4);
}