/*
*  Ejemplo de Contadores con el microPLC - arduino
*
*  Descripción: Programa básico de contadores
*
*  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
CI ci1;	// Contador incremental


/*  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
	
	//-------- Contador ascendente --------
	// A. Entrada contadora de pulsos
	ci1.Inc(s._1);
	// B. Salida activa la lámpara en k1
	k._1=ci1.Q();
	// C. Comparación con 4 y reiniciar el contador
	if(ci1.Con()>4)
		ci1.Reset(true);
	else
		ci1.Reset(false);
	//------------------------
	
	setOutputs();   // Activar las salidas
	delay(2);				// CicloScan + 2ms, 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);
}