#include <16F876A.h>
#include <stdlib.h>
#FUSES NOWDT, XT, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT, HS
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, STREAM=COM_A, parity=N, bits=8)
char p, term[2], command[66] = "", action[10] = "", values[45] = "", picid[10] = "";
char picsaved[8] = "", permited[9] = "";
short newcommand = 0;
int k = 0;
int32 seconds[14], times[14], epoch;
int contador1 = 0;
int1 newsecond=0;
// subrutina de interrupción del timer1
#int_TIMER1
void TIMER1_isr(){
disable_interrupts(INT_TIMER1);
contador1++;
if(contador1 == 1500){
newsecond = 1;
contador1 = 0;
}
set_timer1(63936);
enable_interrupts(INT_TIMER1);
}
#INT_RDA
void usart_modem(void)
{
disable_interrupts(INT_RDA);
newcommand = 0;
if (kbhit(COM_A))
{
p = fgetc(COM_A);
if(p == '#') {
command[k] = '\0';
newcommand = 1;
k = 0;
}else{
command[k] = p;
k++;
}
}
enable_interrupts(INT_RDA);
}
int is_equal(char *p1, char *p2)
{
int *p3;
p3 = strstr(p1,p2);
return (p3);
}
void open(void)
{
int i, j=0;
char numbers[3] = "", letter;
unsigned char number;
for(i = 0; i < strlen(values); i += 3){
numbers[0] = values[i];
numbers[1] = values[i+1];
numbers[2] = '\0';
letter = values[i+2];
number = atoi(numbers);
if(letter == 77) number *= 60;
seconds[j] = number;
times[j] = epoch;
j++;
}
if(seconds[0] > 0) output_bit(PIN_C0, 1);
if(seconds[1] > 0) output_bit(PIN_C1, 1);
if(seconds[2] > 0) output_bit(PIN_C2, 1);
if(seconds[3] > 0) output_bit(PIN_C3, 1);
if(seconds[4] > 0) output_bit(PIN_B7, 1);
if(seconds[5] > 0) output_bit(PIN_B6, 1);
if(seconds[6] > 0) output_bit(PIN_B5, 1);
if(seconds[7] > 0) output_bit(PIN_B4, 1);
if(seconds[8] > 0) output_bit(PIN_B3, 1);
if(seconds[9] > 0) output_bit(PIN_B2, 1);
if(seconds[10] > 0) output_bit(PIN_B1, 1);
if(seconds[11] > 0) output_bit(PIN_B0, 1);
if(seconds[12] > 0) output_bit(PIN_C5, 1);
if(seconds[13] > 0) output_bit(PIN_C4, 1);
}
void close(void)
{
if(values[0] > 0) output_bit(PIN_C0, 0);
if(values[1] > 0) output_bit(PIN_C1, 0);
if(values[2] > 0) output_bit(PIN_C2, 0);
if(values[3] > 0) output_bit(PIN_C3, 0);
if(values[4] > 0) output_bit(PIN_B7, 0);
if(values[5] > 0) output_bit(PIN_B6, 0);
if(values[6] > 0) output_bit(PIN_B5, 0);
if(values[7] > 0) output_bit(PIN_B4, 0);
if(values[8] > 0) output_bit(PIN_B3, 0);
if(values[9] > 0) output_bit(PIN_B2, 0);
if(values[10] > 0) output_bit(PIN_B1, 0);
if(values[11] > 0) output_bit(PIN_B0, 0);
if(values[12] > 0) output_bit(PIN_C5, 0);
if(values[13] > 0) output_bit(PIN_C4, 0);
}
void auto_off(void)
{
if(seconds[0] > 0 && (epoch - times[0]) > seconds[0]) output_bit(PIN_C0, 0);
if(seconds[1] > 0 && (epoch - times[1]) > seconds[1]) output_bit(PIN_C1, 0);
if(seconds[2] > 0 && (epoch - times[2]) > seconds[2]) output_bit(PIN_C2, 0);
if(seconds[3] > 0 && (epoch - times[3]) > seconds[3]) output_bit(PIN_C3, 0);
if(seconds[4] > 0 && (epoch - times[4]) > seconds[4]) output_bit(PIN_B7, 0);
if(seconds[5] > 0 && (epoch - times[5]) > seconds[5]) output_bit(PIN_B6, 0);
if(seconds[6] > 0 && (epoch - times[6]) > seconds[6]) output_bit(PIN_B5, 0);
if(seconds[7] > 0 && (epoch - times[7]) > seconds[7]) output_bit(PIN_B4, 0);
if(seconds[8] > 0 && (epoch - times[8]) > seconds[8]) output_bit(PIN_B3, 0);
if(seconds[9] > 0 && (epoch - times[9]) > seconds[9]) output_bit(PIN_B2, 0);
if(seconds[10] > 0 && (epoch - times[10]) > seconds[10]) output_bit(PIN_B1, 0);
if(seconds[11] > 0 && (epoch - times[11]) > seconds[11]) output_bit(PIN_B0, 0);
if(seconds[12] > 0 && (epoch - times[12]) > seconds[12]) output_bit(PIN_C5, 0);
if(seconds[13] > 0 && (epoch - times[13]) > seconds[13]) output_bit(PIN_C4, 0);
}
/* Programa principal */
void main(void)
{
// Activo todos los pines B como salidas
set_tris_b(0b00000000);
// Activo PIN_C4 y PIN_C7 como entradas
set_tris_c(0b10010000);
// Todos los pines B y C apagados, excepto los que son entradas
output_B(0b00000000);
output_bit(PIN_C0, 0);
output_bit(PIN_C1, 0);
output_bit(PIN_C2, 0);
output_bit(PIN_C3, 0);
output_bit(PIN_C4, 0);
output_bit(PIN_C5, 0);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
set_timer1(63936);
// Activo interrupciones
enable_interrupts(GLOBAL);
enable_interrupts(INT_RDA);
enable_interrupts(INT_TIMER1);
epoch = 0;
strcpy(picsaved, "ITG0001");
while(TRUE)
{
if(newsecond)
{
epoch++;
auto_off();
newsecond = 0;
}
if(newcommand)
{
newcommand = 0;
strcpy(term, "|");
strcpy(picid, strtok(command, term));
strcpy(action, strtok(0, term));
strcpy(values, strtok(0, term));
if(is_equal(picid, picsaved))
{
strcpy(permited, "OPEN");
if(is_equal(permited, action))
{
open();
printf("%s opened\r\n", picid);
}
strcpy(permited, "CLOSE");
if(is_equal(permited, action))
{
close();
printf("%s closed\r\n", picid);
}
}
}
}
}