#include "timer_System.h"
#include "calib_manager.h"
#include "ac_adq.h"
#include "inps_manager.h"
#include "led_manager.h"
#include "pot_manager.h"
#include "adjust_manager.h"
#include "rele_manager.h"
#include "tc_manager.h"
#include "global.h"
// Array de strings
const char* mensajes[] = {
"DESARMADO",
"ARMADO RELE ON",
"TEMPORIZANDO CONEXION",
"ARMADO AUX ABIERTO",
"FALLA VOLTAJE ALTO",
"FALLA VOLTAJE BAJO",
"FALLA INESTABILIDAD",
"FALLA SOBRECARGA",
"FALLA SUBCARGA",
"DESARMADO 3 SOBRE-CARGA",
"DESARMADO 3 SUB-CARGA",
"NO DEFINIDO"
};
const uint8_t REDLED2 = 10;
const uint8_t REDLED1 = 9;
const uint8_t GREENLED = 8;
const uint8_t RED_BUTTON = 7;
const uint8_t GREEN_BUTTON = 6;
const uint8_t PIN_PW = 2;
const uint8_t PIN_TEST = 3;
const uint8_t PIN_DI = 4;
const uint8_t B_PW = 0;
const uint8_t B_TEST = 1;
const uint8_t DI = 2;
///////////////////////////////////////////////////////////////////////////////////////
typedef enum {
DESARMADO_OFF_MAN = 0,
ARMADO_RLY_ON,
TEMPORIZADO_FALLA,
ARMADO_AUX_OPEN,
FALLA_V_ALTO,
FALLA_V_BAJO,
FALLA_INESTABILIDAD,
FALLA_SOBRE_CARGA,
FALLA_SUB_CARGA,
DESARMADO_3F_SOBRE,
DESARMADO_3F_SUB,
}STATES_TEST;
uint8_t stateTest = DESARMADO_OFF_MAN;
uint8_t oldstate = DESARMADO_3F_SUB;
bool stButtonTest = false;
void readPinState(void);
void stateMachine(void);
///////////////////////////////////////////////////////////////////////////////////////
void SetTimer1()
{
cli(); //stop interrupts
//set timer1 interrupt at 120Hz
TCCR1A = 0;// set entire TCCR1A register to 0
TCCR1B = 0;// same for TCCR1B
TCNT1 = 0;//initialize counter value to 0
// set compare match register for 60hz increments
OCR1A = 10000; // = (16*10^6) / (120 * 8) - 1 (must be <65536) //60Hz 16683
// turn on CTC mode
TCCR1B |= (1 << WGM12);
// Set CS10 and CS12 bits for 1024 prescaler
//TCCR1B |= (1 << CS12) | (1 << CS10);
// Set CS11 bit for 8 prescaler
TCCR1B |= (1 << CS11);
// enable timer compare interrupt
TIMSK1 |= (1 << OCIE1A);
sei(); //allow interrupts
}
/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
ISR(TIMER1_COMPA_vect)
{
TimersSys_Tick();
inpManager_Refresh();
}
/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
void setup()
{
Serial.begin(57200);
/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
SetTimer1();
TimersSys_Init(); // Inicializa la estructuras de los 4 timers del sistema, en el header de la libreria
TimersSys_Start(0, 10); // Inicializa 0 de TimerSys, de calibración 100 ms
TimersSys_Start(1, 12); // Inicializa 1 de TimersSys: 120ms (12 * Tick de TMR2(10ms))
TimersSys_Start(2, 6); // Inicializa 2 de TimersSys: 60ms (6 * Tick de TMR2(10ms)) 16 por segundo
TimersSys_Start(3, 200); // Inicializa 3 de TimersSys: 2s (200 * Tick de TMR2(10ms))
/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
relay_Init(RELAY_CNNDLY_DISABLE & RELAY_DCNNDLY_DISABLE & RELAY_POL_DIRECT & (RELAY_GPIO_MASK_PIN | 5),0,0);
/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
// put your setup code here, to run once:
//pinMode(PINLED, OUTPUT);
inpsManager_Init();
inpsManager_Cfg(B_PW, PIN_PW, INPUT_PULLUP);
inpsManager_Cfg(B_TEST, PIN_TEST, INPUT_PULLUP);
inpsManager_Cfg(DI, PIN_DI, INPUT_PULLUP);
/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
ledManager_CfgLed(0, REDLED1);
ledManager_CfgLed(1, REDLED2);
ledManager_CfgLed(2, GREENLED);
ledManager_CfgLed(3, RED_BUTTON);
ledManager_CfgLed(4, GREEN_BUTTON);
ledManager_DefSecOut(LED_BLINK1, 0b11000000); //define la secuencias del estado BLINK1
ledManager_DefSecOut(LED_BLINK2, 0b11110000); //define la secuencias del estado BLINK1
//Asociadas a las fallas
ledManager_Update(0, LED_OFF);
ledManager_Update(1, LED_OFF);
ledManager_Update(2, LED_OFF);
//Asociadas al boton
ledManager_Update(3, LED_ON);
ledManager_Update(4, LED_OFF);
/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
}
void loop()
{
readPinState();
stateMachine();
//////////////////////////////////////////////
if (TIMERSYS_CHECK_EVENT(2)) // 120 ms
{
TIMERSYS_CLEAR_EVENT(2);
ledManager_Refresh();
}
//llevar esta a 50 ms
if (TIMERSYS_CHECK_EVENT(1)) // 60 ms
{
TIMERSYS_CLEAR_EVENT(1);
inpManager_Refresh();
}
if (TIMERSYS_CHECK_EVENT(3)) //2s
{
TIMERSYS_CLEAR_EVENT(3);
}
}
void readPinState()
{
if(inpsInfo[B_PW].b.change == 1)
{
inpsInfo[B_PW].b.change = 0;
if(GET_INP_STATE(B_PW) == 0)
{
stButtonTest = !stButtonTest;
//Serial.println(stButtonTest, DEC);
if(stButtonTest == 1)
{
//Armado y rele conectado
ledManager_Update(4, LED_ON);
ledManager_Update(3, LED_OFF);
stateTest = ARMADO_RLY_ON;
}
else
{
//Desarmado off manual
ledManager_Update(4, LED_OFF);
ledManager_Update(3, LED_ON);
stateTest = DESARMADO_OFF_MAN;
}
}
}
if(inpsInfo[B_TEST].b.change == 1)
{
inpsInfo[B_TEST].b.change = 0;
if(GET_INP_STATE(B_TEST) == 0)
{
if(++stateTest > DESARMADO_3F_SUB)
{
stateTest = DESARMADO_OFF_MAN;
}
}
}
}
void stateMachine()
{
if(stateTest == oldstate)
return;
switch(stateTest)
{
case DESARMADO_OFF_MAN:
ledManager_Update(0, LED_OFF);
ledManager_Update(1, LED_OFF);
ledManager_Update(2, LED_OFF);
ledManager_Update(4, LED_OFF);
ledManager_Update(3, LED_ON);
break;
case ARMADO_RLY_ON:
ledManager_Update(0, LED_OFF);
ledManager_Update(1, LED_OFF);
ledManager_Update(2, LED_ON);
ledManager_Update(4, LED_ON);
ledManager_Update(3, LED_OFF);
break;
case TEMPORIZADO_FALLA:
ledManager_Update(0, LED_OFF);
ledManager_Update(1, LED_OFF);
ledManager_Update(2, LED_BLINK2);
break;
case ARMADO_AUX_OPEN:
ledManager_Update(0, LED_OFF);
ledManager_Update(1, LED_OFF);
ledManager_Update(2, LED_OFF);
break;
case FALLA_V_ALTO:
ledManager_Update(2, LED_OFF); //Verde
ledManager_Update(1, LED_OFF);
ledManager_Update(0, LED_ON); //rojo medio
break;
case FALLA_V_BAJO:
ledManager_Update(2, LED_OFF);
ledManager_Update(1, LED_OFF);
ledManager_Update(0, LED_BLINK2);
break;
case FALLA_INESTABILIDAD:
ledManager_Update(2, LED_OFF);
ledManager_Update(0, LED_BLINK2);
ledManager_Update(1, LED_BLINK2);
break;
case FALLA_SOBRE_CARGA:
ledManager_Update(2, LED_OFF);
ledManager_Update(1, LED_ON);
ledManager_Update(0, LED_OFF);
break;
case FALLA_SUB_CARGA:
ledManager_Update(2, LED_OFF);
ledManager_Update(1, LED_BLINK2);
ledManager_Update(0, LED_OFF);
break;
case DESARMADO_3F_SOBRE:
ledManager_Update(0, LED_OFF);
ledManager_Update(1, LED_ON);
ledManager_Update(2, LED_OFF);
ledManager_Update(4, LED_OFF);
ledManager_Update(3, LED_ON);
break;
case DESARMADO_3F_SUB:
ledManager_Update(1, LED_BLINK2);
ledManager_Update(0, LED_OFF);
ledManager_Update(2, LED_OFF);
ledManager_Update(4, LED_OFF);
ledManager_Update(3, LED_ON);
break;
}
oldstate = stateTest;
Serial.println(mensajes[stateTest]);
//Serial.println(stateTest, DEC);
}