APS SO

Dependencies:   WebSocketClient mbed

Fork of APS_SO by Ian Bolfarini

Committer:
ianwillianb
Date:
Fri Dec 15 20:07:49 2017 +0000
Revision:
2:27a7a42b2bae
Parent:
1:3da12598c635
finalizado;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ianwillianb 0:f603fa86c646 1 #include "mbed.h"
ianwillianb 2:27a7a42b2bae 2 #include "rtos.h"
ianwillianb 0:f603fa86c646 3 #include "Rtc_Ds1307.h"
ianwillianb 2:27a7a42b2bae 4 #include "EthernetInterface.h"
ianwillianb 2:27a7a42b2bae 5 #include "Websocket.h"
ianwillianb 2:27a7a42b2bae 6 #include <iostream>
ianwillianb 2:27a7a42b2bae 7 #include <string>
ianwillianb 0:f603fa86c646 8
ianwillianb 0:f603fa86c646 9
ianwillianb 2:27a7a42b2bae 10 //Objeto da ethernet
ianwillianb 2:27a7a42b2bae 11 EthernetInterface eth;
ianwillianb 0:f603fa86c646 12 //Inicialização do RTC
ianwillianb 0:f603fa86c646 13 Rtc_Ds1307 rtc(D14,D15);
ianwillianb 0:f603fa86c646 14 //Estrutura responsável por armazenar os dados do RTC
ianwillianb 0:f603fa86c646 15 Rtc_Ds1307::Time_rtc alarm_time ;
ianwillianb 2:27a7a42b2bae 16 //Estrutura responsável por armazenar a data/hora de ativação do alarme
ianwillianb 2:27a7a42b2bae 17 Rtc_Ds1307::Time_rtc a_time_start ;
ianwillianb 2:27a7a42b2bae 18 Rtc_Ds1307::Time_rtc a_time_end ;
ianwillianb 2:27a7a42b2bae 19 int range = 3; // uma flag mantida em "1" caso o tempo atual lido do rtc esteja dentro do intervalo de funcionamento do alarme e, caso contrário, setada para "0".
ianwillianb 0:f603fa86c646 20 //Estabelece comunicação serial para DEBUG
ianwillianb 0:f603fa86c646 21 Serial gSerial(USBTX, USBRX);
ianwillianb 2:27a7a42b2bae 22 //variavel de estado do alarme: 0 - desarmado devido ao horario, 1 - armado, 2 - disparando, 3- desarmado pelo usuario
ianwillianb 2:27a7a42b2bae 23 int state = 0; //incia em zero desarmado, é ajustado na thread de controle caso o horario esteja no range de alarme ativado
ianwillianb 2:27a7a42b2bae 24 DigitalIn enable(D8); //a variável enable lê o sinal do sensor de presença, que está conectado na entrada D8. Variável enable será true ou false conforme haja sinal ou não do sensor.
ianwillianb 2:27a7a42b2bae 25 DigitalOut led_red(LED_RED); //led vermelho
ianwillianb 2:27a7a42b2bae 26 DigitalOut led_green(LED_GREEN); //led verde
ianwillianb 2:27a7a42b2bae 27 DigitalOut led_blue(LED_BLUE); //led azul
ianwillianb 2:27a7a42b2bae 28 DigitalOut buzzer(D9); //buzzer
ianwillianb 2:27a7a42b2bae 29
ianwillianb 2:27a7a42b2bae 30
ianwillianb 2:27a7a42b2bae 31 //Declaracao das Threads
ianwillianb 2:27a7a42b2bae 32 Thread *RtcRead; //le o RTC e atualiza a estrutura
ianwillianb 2:27a7a42b2bae 33 Thread *SetRange; //Verifica se está dentro do range - entre tempo de inicio e tempo de fim
ianwillianb 2:27a7a42b2bae 34 Thread *LedThread; //controla leds de status e buzzer
ianwillianb 2:27a7a42b2bae 35 Thread *SetState; //verifica e ajusta os estados - armado, desarmado, disparando, desarmado forçado
ianwillianb 2:27a7a42b2bae 36 Thread *PrintRange; //imprime valores de estado e range e hora atual - para debug
ianwillianb 2:27a7a42b2bae 37 Thread *SocketThread; //thread das sockets
ianwillianb 2:27a7a42b2bae 38
ianwillianb 2:27a7a42b2bae 39 //Ajuste da hora atraves da interface serial, so para ajuste do relogio
ianwillianb 0:f603fa86c646 40 void set_time_serial()
ianwillianb 0:f603fa86c646 41 {
ianwillianb 2:27a7a42b2bae 42 int hora, min, seg, dia, mes, ano, opt, d_sem;
ianwillianb 0:f603fa86c646 43
ianwillianb 1:3da12598c635 44 gSerial.printf("\n1-Ajuste de Hora, 2-Ajuste de Data, 3-Ajuste de Data/Hora: ");
ianwillianb 0:f603fa86c646 45 gSerial.scanf("%d",&opt);
ianwillianb 2:27a7a42b2bae 46
ianwillianb 0:f603fa86c646 47
ianwillianb 0:f603fa86c646 48 if(opt == 1 || opt ==3 ) {
ianwillianb 0:f603fa86c646 49
ianwillianb 1:3da12598c635 50 gSerial.printf("\nInsira a hora(HH MM SS): ");
ianwillianb 0:f603fa86c646 51 gSerial.scanf("%d %d %d", &hora, &min, &seg);
ianwillianb 0:f603fa86c646 52
ianwillianb 0:f603fa86c646 53 if( (hora < 24 && hora>=0) && (min>=0 && min <60) && (seg>=0 && seg <60))
ianwillianb 0:f603fa86c646 54 {
ianwillianb 0:f603fa86c646 55
ianwillianb 0:f603fa86c646 56 rtc.getTime(alarm_time);
ianwillianb 0:f603fa86c646 57 alarm_time.hour = hora;
ianwillianb 0:f603fa86c646 58 alarm_time.min = min;
ianwillianb 0:f603fa86c646 59 alarm_time.sec = seg;
ianwillianb 0:f603fa86c646 60 rtc.setTime(alarm_time, true, false);
ianwillianb 0:f603fa86c646 61 rtc.getTime(alarm_time);
ianwillianb 0:f603fa86c646 62 gSerial.printf("\nHora Ajustada: %2d:%02d:%02d \n",alarm_time.hour,alarm_time.min,alarm_time.sec);
ianwillianb 0:f603fa86c646 63
ianwillianb 0:f603fa86c646 64
ianwillianb 0:f603fa86c646 65 }
ianwillianb 0:f603fa86c646 66
ianwillianb 0:f603fa86c646 67 else gSerial.printf("Entrada Incorreta.\n");
ianwillianb 0:f603fa86c646 68
ianwillianb 0:f603fa86c646 69
ianwillianb 0:f603fa86c646 70 }
ianwillianb 0:f603fa86c646 71
ianwillianb 0:f603fa86c646 72
ianwillianb 1:3da12598c635 73 if(opt==2 || opt ==3)
ianwillianb 0:f603fa86c646 74 {
ianwillianb 0:f603fa86c646 75
ianwillianb 2:27a7a42b2bae 76 gSerial.printf("Insira a data(DIA MES ANO DIA-SEMANA(1-7)): ");
ianwillianb 2:27a7a42b2bae 77 gSerial.scanf("%d %d %d %d", &dia, &mes, &ano, &d_sem);
ianwillianb 2:27a7a42b2bae 78 if((dia < 32 && dia >0 && mes<13 && mes>0 && ano>2000) && !(mes == 2 && dia >=29 ) && !((mes == 4 || mes == 6 || mes == 9 || mes == 11) && dia >30) && (d_sem>0 &&d_sem<8))
ianwillianb 1:3da12598c635 79 {
ianwillianb 0:f603fa86c646 80
ianwillianb 1:3da12598c635 81
ianwillianb 1:3da12598c635 82 rtc.getTime(alarm_time);
ianwillianb 2:27a7a42b2bae 83 alarm_time.wday = d_sem;
ianwillianb 1:3da12598c635 84 alarm_time.date = dia;
ianwillianb 1:3da12598c635 85 alarm_time.mon = mes;
ianwillianb 1:3da12598c635 86 alarm_time.year = ano;
ianwillianb 1:3da12598c635 87 rtc.setTime(alarm_time, true, false);
ianwillianb 1:3da12598c635 88 rtc.getTime(alarm_time);
ianwillianb 1:3da12598c635 89 gSerial.printf("\nData Ajustada: %2d/%02d/%d \n",alarm_time.date,alarm_time.mon,alarm_time.year);
ianwillianb 0:f603fa86c646 90
ianwillianb 1:3da12598c635 91 }
ianwillianb 1:3da12598c635 92
ianwillianb 1:3da12598c635 93 else gSerial.printf("Entrada Incorreta.\n");
ianwillianb 0:f603fa86c646 94
ianwillianb 0:f603fa86c646 95
ianwillianb 0:f603fa86c646 96 }
ianwillianb 1:3da12598c635 97
ianwillianb 2:27a7a42b2bae 98 else gSerial.printf("Opcao Invalida!.\n");
ianwillianb 2:27a7a42b2bae 99
ianwillianb 0:f603fa86c646 100
ianwillianb 2:27a7a42b2bae 101 }
ianwillianb 2:27a7a42b2bae 102
ianwillianb 2:27a7a42b2bae 103 void set_range () {
ianwillianb 2:27a7a42b2bae 104
ianwillianb 2:27a7a42b2bae 105 while(1) {
ianwillianb 2:27a7a42b2bae 106 /* pode-se ter 3 situações:
ianwillianb 2:27a7a42b2bae 107 // a hora de início da ativação do alarme é numericamente menor que a hora do encerramento
ianwillianb 2:27a7a42b2bae 108 // a hora de início da ativação é igual à hora de fim
ianwillianb 2:27a7a42b2bae 109 // a hora de início da ativação é numericamente maior que a hora de fim
ianwillianb 2:27a7a42b2bae 110 */
ianwillianb 2:27a7a42b2bae 111 if (a_time_start.hour < a_time_end.hour) { // Neste caso, o range está contido todo dentro de um dia (entre 0:00 e 23:59) mas as horas de início e fim do alarme são diferentes.
ianwillianb 2:27a7a42b2bae 112 if (a_time_start.hour < alarm_time.hour && alarm_time.hour < a_time_end.hour) {// Neste caso o valor do RTC está entre o horário de ligada e o de desligada
ianwillianb 2:27a7a42b2bae 113 printf("muda range = 1\n");
ianwillianb 2:27a7a42b2bae 114 range = 1;
ianwillianb 2:27a7a42b2bae 115 }
ianwillianb 2:27a7a42b2bae 116 else if (a_time_start.hour == alarm_time.hour) { // Neste caso a hora do RTC é igual à de um dos extremos (início do range)
ianwillianb 2:27a7a42b2bae 117 if (a_time_start.min <= alarm_time.min)
ianwillianb 2:27a7a42b2bae 118 range = 1;
ianwillianb 2:27a7a42b2bae 119 else range = 0;
ianwillianb 2:27a7a42b2bae 120 }
ianwillianb 2:27a7a42b2bae 121 else if (a_time_end.hour == alarm_time.hour) { // Neste caso a hora do RTC é igual à do último extremo (fim do range)
ianwillianb 2:27a7a42b2bae 122 if (a_time_end.min >= alarm_time.min)
ianwillianb 2:27a7a42b2bae 123 range = 1;
ianwillianb 2:27a7a42b2bae 124 else range = 0;
ianwillianb 2:27a7a42b2bae 125 }
ianwillianb 2:27a7a42b2bae 126 else range = 0;
ianwillianb 2:27a7a42b2bae 127 }
ianwillianb 2:27a7a42b2bae 128
ianwillianb 2:27a7a42b2bae 129 else if (a_time_start.hour == a_time_end.hour) { // Neste caso a hora de ativamento e de desarme do alarme é a mesma. Mas o caso específico será destrinchado nos "ifs" aninhados
ianwillianb 2:27a7a42b2bae 130 if (a_time_start.min < a_time_end.min) {
ianwillianb 2:27a7a42b2bae 131 if (alarm_time.hour == a_time_start.hour) {
ianwillianb 2:27a7a42b2bae 132 if (a_time_start.min <= alarm_time.min && alarm_time.min <= a_time_end.min)
ianwillianb 2:27a7a42b2bae 133 range = 1;
ianwillianb 2:27a7a42b2bae 134 else range = 0;
ianwillianb 2:27a7a42b2bae 135 }
ianwillianb 2:27a7a42b2bae 136 else range = 0;
ianwillianb 2:27a7a42b2bae 137 }
ianwillianb 2:27a7a42b2bae 138 else if (a_time_start.min > a_time_end.min) {
ianwillianb 2:27a7a42b2bae 139 if (alarm_time.hour == a_time_end.hour) {
ianwillianb 2:27a7a42b2bae 140 if (a_time_start.min > alarm_time.min && alarm_time.min > a_time_end.min)
ianwillianb 2:27a7a42b2bae 141 range = 0;
ianwillianb 2:27a7a42b2bae 142 else range = 1;
ianwillianb 2:27a7a42b2bae 143 }
ianwillianb 2:27a7a42b2bae 144 else range = 1;
ianwillianb 2:27a7a42b2bae 145 }
ianwillianb 2:27a7a42b2bae 146 else if(a_time_start.min == a_time_end.min) range = 0;
ianwillianb 2:27a7a42b2bae 147 }
ianwillianb 2:27a7a42b2bae 148
ianwillianb 2:27a7a42b2bae 149 else if (a_time_start.hour > a_time_end.hour) { // Neste caso, o range está contido em um período que compreende dois dias - alarme permanece ativado na transição de 23:59 para 0:00. As horas de início e fim do alarme são diferentes.
ianwillianb 2:27a7a42b2bae 150 if (a_time_start.hour > alarm_time.hour && alarm_time.hour > a_time_end.hour)
ianwillianb 2:27a7a42b2bae 151 range = 0;
ianwillianb 2:27a7a42b2bae 152 else if (a_time_end.hour == alarm_time.hour) {
ianwillianb 2:27a7a42b2bae 153 if (a_time_end.min < alarm_time.min)
ianwillianb 2:27a7a42b2bae 154 range = 0;
ianwillianb 2:27a7a42b2bae 155 else range = 1;
ianwillianb 2:27a7a42b2bae 156 }
ianwillianb 2:27a7a42b2bae 157 else if (a_time_start.hour == alarm_time.hour) {
ianwillianb 2:27a7a42b2bae 158 if (a_time_start.min > alarm_time.min)
ianwillianb 2:27a7a42b2bae 159 range = 0;
ianwillianb 2:27a7a42b2bae 160 else range = 1;
ianwillianb 2:27a7a42b2bae 161 }
ianwillianb 2:27a7a42b2bae 162 else range = 1;
ianwillianb 2:27a7a42b2bae 163 }
ianwillianb 2:27a7a42b2bae 164
ianwillianb 2:27a7a42b2bae 165 }
ianwillianb 2:27a7a42b2bae 166
ianwillianb 2:27a7a42b2bae 167 }
ianwillianb 1:3da12598c635 168
ianwillianb 2:27a7a42b2bae 169 void set_state () {
ianwillianb 2:27a7a42b2bae 170
ianwillianb 2:27a7a42b2bae 171 while (1) {
ianwillianb 2:27a7a42b2bae 172
ianwillianb 2:27a7a42b2bae 173 if (state != 3) { //se estado é 3 o alarme foi desabilitado pelo usuario, logo não são necessarios teste
ianwillianb 2:27a7a42b2bae 174 if (range == 0 && state == 1) state = 0; //se nao esta no range e estado =1(armado), desarma automatico
ianwillianb 2:27a7a42b2bae 175 if (range == 1 && state == 0) state = 1; //se esta no range mas estado = 0 (desarmado), arma automatico
ianwillianb 2:27a7a42b2bae 176 if (range == 1 && state == 1) { //estado armado e no range
ianwillianb 2:27a7a42b2bae 177 if (enable) state = 2; //se o sensor pir mandar um sinal em alto, manda para o estado 2 (armado)
ianwillianb 2:27a7a42b2bae 178 }
ianwillianb 2:27a7a42b2bae 179 }
ianwillianb 2:27a7a42b2bae 180
ianwillianb 2:27a7a42b2bae 181
ianwillianb 2:27a7a42b2bae 182
ianwillianb 2:27a7a42b2bae 183
ianwillianb 2:27a7a42b2bae 184 }
ianwillianb 2:27a7a42b2bae 185
ianwillianb 2:27a7a42b2bae 186 }
ianwillianb 2:27a7a42b2bae 187
ianwillianb 2:27a7a42b2bae 188 //thread resposavel por verificar a hora
ianwillianb 2:27a7a42b2bae 189 void rtc_read (){
ianwillianb 2:27a7a42b2bae 190
ianwillianb 2:27a7a42b2bae 191 while(1){
ianwillianb 2:27a7a42b2bae 192 rtc.getTime(alarm_time);
ianwillianb 2:27a7a42b2bae 193 }
ianwillianb 2:27a7a42b2bae 194
ianwillianb 2:27a7a42b2bae 195
ianwillianb 2:27a7a42b2bae 196 }
ianwillianb 2:27a7a42b2bae 197
ianwillianb 2:27a7a42b2bae 198 void led_thread()
ianwillianb 2:27a7a42b2bae 199 {
ianwillianb 2:27a7a42b2bae 200 //apaga todos os leds antes de acender os leds desejados
ianwillianb 2:27a7a42b2bae 201 led_blue=1;
ianwillianb 2:27a7a42b2bae 202 led_green=1;
ianwillianb 2:27a7a42b2bae 203 led_blue =1;
ianwillianb 2:27a7a42b2bae 204
ianwillianb 2:27a7a42b2bae 205
ianwillianb 2:27a7a42b2bae 206 while(true){
ianwillianb 2:27a7a42b2bae 207
ianwillianb 2:27a7a42b2bae 208 if(state == 0 || state==3) { //neste caso o alarme não está ativo - estado desarmado ou desarmado forçado
ianwillianb 2:27a7a42b2bae 209
ianwillianb 2:27a7a42b2bae 210
ianwillianb 2:27a7a42b2bae 211 led_green = 1;
ianwillianb 2:27a7a42b2bae 212 led_blue = 1;
ianwillianb 2:27a7a42b2bae 213 led_red =0;
ianwillianb 2:27a7a42b2bae 214
ianwillianb 2:27a7a42b2bae 215
ianwillianb 2:27a7a42b2bae 216 }
ianwillianb 2:27a7a42b2bae 217
ianwillianb 2:27a7a42b2bae 218
ianwillianb 2:27a7a42b2bae 219 if(state == 1) //se estiver armado só liga o led verde
ianwillianb 2:27a7a42b2bae 220
ianwillianb 2:27a7a42b2bae 221 {
ianwillianb 2:27a7a42b2bae 222
ianwillianb 2:27a7a42b2bae 223 led_green = 0;
ianwillianb 2:27a7a42b2bae 224 led_blue = 1;
ianwillianb 2:27a7a42b2bae 225 led_red =1;
ianwillianb 2:27a7a42b2bae 226
ianwillianb 2:27a7a42b2bae 227
ianwillianb 2:27a7a42b2bae 228
ianwillianb 2:27a7a42b2bae 229 }
ianwillianb 2:27a7a42b2bae 230
ianwillianb 2:27a7a42b2bae 231
ianwillianb 2:27a7a42b2bae 232 if(state == 2) //estado disparado: acionamento dos leds vermelho e azul alternado em 0.5s, buzzer é ativo junto com os leds na mesma frequência
ianwillianb 2:27a7a42b2bae 233
ianwillianb 2:27a7a42b2bae 234 { //desliga todos os leds para assegurar que somente os desejados estarão ligados neste estado
ianwillianb 2:27a7a42b2bae 235 led_red=1;
ianwillianb 2:27a7a42b2bae 236 led_blue=1;
ianwillianb 2:27a7a42b2bae 237 led_green =1;
ianwillianb 2:27a7a42b2bae 238
ianwillianb 2:27a7a42b2bae 239 led_red =0; //liga o led vermelho
ianwillianb 2:27a7a42b2bae 240 buzzer = 0; //liga o buzzer, ativo em 0 devido ao transistor PNP
ianwillianb 2:27a7a42b2bae 241 wait(0.5); //aguarda meio segundo
ianwillianb 2:27a7a42b2bae 242 led_red = 1; //desliga o led vermelho
ianwillianb 2:27a7a42b2bae 243 led_blue = 0; //liga o led azul
ianwillianb 2:27a7a42b2bae 244 buzzer = 1; //desliga o buzzer
ianwillianb 2:27a7a42b2bae 245 wait(0.5); //aguarda 0.5s
ianwillianb 2:27a7a42b2bae 246 led_blue=1; //desliga o led azul
ianwillianb 2:27a7a42b2bae 247
ianwillianb 2:27a7a42b2bae 248
ianwillianb 2:27a7a42b2bae 249
ianwillianb 2:27a7a42b2bae 250 }
ianwillianb 2:27a7a42b2bae 251
ianwillianb 2:27a7a42b2bae 252 }
ianwillianb 2:27a7a42b2bae 253
ianwillianb 2:27a7a42b2bae 254
ianwillianb 2:27a7a42b2bae 255 }
ianwillianb 2:27a7a42b2bae 256
ianwillianb 2:27a7a42b2bae 257 //thread para estabelecer comunicação via sockets
ianwillianb 2:27a7a42b2bae 258 void socket_thread(){
ianwillianb 2:27a7a42b2bae 259
ianwillianb 2:27a7a42b2bae 260 //inicia um comunicação via socket com o seguinte servidor
ianwillianb 2:27a7a42b2bae 261 Websocket ws("ws://192.168.2.2:8555/ws", &eth);
ianwillianb 2:27a7a42b2bae 262 //conecta
ianwillianb 2:27a7a42b2bae 263 int connect_error = ws.connect();
ianwillianb 2:27a7a42b2bae 264 //wait para o sensor exibir mensagem de comunicação
ianwillianb 2:27a7a42b2bae 265 wait(1);
ianwillianb 2:27a7a42b2bae 266
ianwillianb 2:27a7a42b2bae 267
ianwillianb 2:27a7a42b2bae 268
ianwillianb 2:27a7a42b2bae 269 //buffer de entrada, guarda dados do servidor
ianwillianb 2:27a7a42b2bae 270 char buf_in[20];
ianwillianb 2:27a7a42b2bae 271 //ponteiro usado na função strtok_r
ianwillianb 2:27a7a42b2bae 272 char *token;
ianwillianb 2:27a7a42b2bae 273 //char para o codigo para indicar que o servidor deve exibir o menu
ianwillianb 2:27a7a42b2bae 274 char menu_return[2];
ianwillianb 2:27a7a42b2bae 275
ianwillianb 2:27a7a42b2bae 276
ianwillianb 2:27a7a42b2bae 277
ianwillianb 2:27a7a42b2bae 278
ianwillianb 2:27a7a42b2bae 279 //loop da thread
ianwillianb 2:27a7a42b2bae 280 while(true){
ianwillianb 2:27a7a42b2bae 281
ianwillianb 2:27a7a42b2bae 282
ianwillianb 2:27a7a42b2bae 283
ianwillianb 2:27a7a42b2bae 284 //se receber dados via socket
ianwillianb 2:27a7a42b2bae 285 if (ws.read(buf_in)) {
ianwillianb 2:27a7a42b2bae 286 //cria uma cópia do buffer para ser "thread safe"
ianwillianb 2:27a7a42b2bae 287 char *rest = buf_in;
ianwillianb 2:27a7a42b2bae 288 //corta a string entre espaços
ianwillianb 2:27a7a42b2bae 289 token = strtok_r(rest, " ", &rest);
ianwillianb 2:27a7a42b2bae 290 //converte o primeiro dado para int. opt indica qual operação sera realiza, é sempre o primeiro dado da string recebida
ianwillianb 2:27a7a42b2bae 291 int opt = atoi(token);
ianwillianb 2:27a7a42b2bae 292 //se for 1, realiza a modificação do horario de inicio e fim de operação do alarme
ianwillianb 2:27a7a42b2bae 293 if(opt ==1){
ianwillianb 2:27a7a42b2bae 294 //divide a string e converte os dados para int
ianwillianb 2:27a7a42b2bae 295 token = strtok_r(rest, " ", &rest);
ianwillianb 2:27a7a42b2bae 296 int start_hour = atoi(token);
ianwillianb 2:27a7a42b2bae 297 token = strtok_r(rest, " ", &rest);
ianwillianb 2:27a7a42b2bae 298 int start_min = atoi(token);
ianwillianb 2:27a7a42b2bae 299 token = strtok_r(rest, " ", &rest);
ianwillianb 2:27a7a42b2bae 300 int start_sec = atoi(token);
ianwillianb 2:27a7a42b2bae 301 token = strtok_r(rest, " ", &rest);
ianwillianb 2:27a7a42b2bae 302 int end_hour = atoi(token);
ianwillianb 2:27a7a42b2bae 303 token = strtok_r(rest, " ", &rest);
ianwillianb 2:27a7a42b2bae 304 int end_min = atoi(token);
ianwillianb 2:27a7a42b2bae 305 token = strtok_r(rest, " ", &rest);
ianwillianb 2:27a7a42b2bae 306 int end_sec = atoi(token);
ianwillianb 2:27a7a42b2bae 307 //faz atribuições
ianwillianb 2:27a7a42b2bae 308 a_time_start.hour = start_hour;
ianwillianb 2:27a7a42b2bae 309 a_time_start.min = start_min;
ianwillianb 2:27a7a42b2bae 310 a_time_start.sec = start_sec;
ianwillianb 2:27a7a42b2bae 311 a_time_end.hour = end_hour;
ianwillianb 2:27a7a42b2bae 312 a_time_end.min = end_min;
ianwillianb 2:27a7a42b2bae 313 a_time_end.sec = end_sec;
ianwillianb 2:27a7a42b2bae 314
ianwillianb 2:27a7a42b2bae 315
ianwillianb 2:27a7a42b2bae 316 sprintf (menu_return, "99"); //codigo de retorno ao menu para a aplicação no pc
ianwillianb 2:27a7a42b2bae 317 ws.send(menu_return); //envia código indicando que a operação foi finalizada e aplicação deve retornar ao menu
ianwillianb 2:27a7a42b2bae 318
ianwillianb 2:27a7a42b2bae 319
ianwillianb 2:27a7a42b2bae 320
ianwillianb 2:27a7a42b2bae 321 }
ianwillianb 0:f603fa86c646 322
ianwillianb 0:f603fa86c646 323
ianwillianb 2:27a7a42b2bae 324 //opção 2 usuario habilita ou desabilita o alarme mesmo que esteja dentro do range de tempo de funcionamento
ianwillianb 2:27a7a42b2bae 325 if(opt == 2)
ianwillianb 2:27a7a42b2bae 326 {
ianwillianb 2:27a7a42b2bae 327 char en_dis[25];
ianwillianb 2:27a7a42b2bae 328 //se o estado for diferente de 3 (desarmado pelo usuario), seta em 3
ianwillianb 2:27a7a42b2bae 329 if(state!=3){
ianwillianb 2:27a7a42b2bae 330
ianwillianb 2:27a7a42b2bae 331 printf("opt: %d\n",opt);
ianwillianb 2:27a7a42b2bae 332 state =3;
ianwillianb 2:27a7a42b2bae 333
ianwillianb 2:27a7a42b2bae 334 printf("state: %d\n",state);
ianwillianb 2:27a7a42b2bae 335 //envia feedback para a aplicação
ianwillianb 2:27a7a42b2bae 336 sprintf (en_dis, "Sistema Desabilitado");
ianwillianb 2:27a7a42b2bae 337 ws.send(en_dis);
ianwillianb 2:27a7a42b2bae 338
ianwillianb 2:27a7a42b2bae 339 }
ianwillianb 2:27a7a42b2bae 340 //caso for 3 habilita o alarme
ianwillianb 2:27a7a42b2bae 341 else if(state==3){
ianwillianb 2:27a7a42b2bae 342
ianwillianb 2:27a7a42b2bae 343 printf("opt: %d\n",opt);
ianwillianb 2:27a7a42b2bae 344 state =0;
ianwillianb 2:27a7a42b2bae 345
ianwillianb 2:27a7a42b2bae 346 //envia feedback para a aplicação
ianwillianb 2:27a7a42b2bae 347 sprintf (en_dis, "Sistema Habilitado");
ianwillianb 2:27a7a42b2bae 348 ws.send(en_dis);
ianwillianb 0:f603fa86c646 349
ianwillianb 0:f603fa86c646 350
ianwillianb 0:f603fa86c646 351
ianwillianb 2:27a7a42b2bae 352
ianwillianb 2:27a7a42b2bae 353 }
ianwillianb 2:27a7a42b2bae 354 wait(1);
ianwillianb 2:27a7a42b2bae 355 sprintf (menu_return, "99"); //codigo de retorno ao menu
ianwillianb 2:27a7a42b2bae 356 ws.send(menu_return);
ianwillianb 2:27a7a42b2bae 357 }
ianwillianb 2:27a7a42b2bae 358
ianwillianb 2:27a7a42b2bae 359 // envia para a aplicação feedback de seu status
ianwillianb 2:27a7a42b2bae 360 if(opt == 3)
ianwillianb 2:27a7a42b2bae 361 { char state_text[60];
ianwillianb 2:27a7a42b2bae 362
ianwillianb 2:27a7a42b2bae 363 if(state == 0){
ianwillianb 2:27a7a42b2bae 364 sprintf (state_text, "Alarme Desabilitado - Fora do Periodo de Funcionamento");
ianwillianb 2:27a7a42b2bae 365 ws.send(state_text);
ianwillianb 2:27a7a42b2bae 366 }
ianwillianb 2:27a7a42b2bae 367 if(state == 1){
ianwillianb 2:27a7a42b2bae 368 sprintf (state_text, "Alarme Habilitado");
ianwillianb 2:27a7a42b2bae 369 ws.send(state_text);
ianwillianb 2:27a7a42b2bae 370 }
ianwillianb 2:27a7a42b2bae 371 if(state == 2){
ianwillianb 2:27a7a42b2bae 372 sprintf (state_text, "Alarme Disparado!!!");
ianwillianb 2:27a7a42b2bae 373 ws.send(state_text);
ianwillianb 2:27a7a42b2bae 374 }
ianwillianb 2:27a7a42b2bae 375 if(state == 3){
ianwillianb 2:27a7a42b2bae 376 sprintf (state_text, "Alarme Desabilitido pelo Usuario");
ianwillianb 2:27a7a42b2bae 377 ws.send(state_text);
ianwillianb 2:27a7a42b2bae 378 }
ianwillianb 2:27a7a42b2bae 379 wait(1);
ianwillianb 2:27a7a42b2bae 380 sprintf (menu_return, "99"); //codigo de retorno ao menu
ianwillianb 2:27a7a42b2bae 381 ws.send(menu_return);
ianwillianb 2:27a7a42b2bae 382
ianwillianb 2:27a7a42b2bae 383 } //fim do opt==3
ianwillianb 2:27a7a42b2bae 384
ianwillianb 2:27a7a42b2bae 385
ianwillianb 2:27a7a42b2bae 386
ianwillianb 2:27a7a42b2bae 387 //informa para a aplicação, que deve voltar ao menu principal
ianwillianb 2:27a7a42b2bae 388 if(opt == 8 || opt == 6)
ianwillianb 2:27a7a42b2bae 389
ianwillianb 2:27a7a42b2bae 390 {
ianwillianb 2:27a7a42b2bae 391 char back_to_menu1[2];
ianwillianb 2:27a7a42b2bae 392 sprintf(back_to_menu1,"99");
ianwillianb 2:27a7a42b2bae 393 ws.send(back_to_menu1);
ianwillianb 2:27a7a42b2bae 394
ianwillianb 2:27a7a42b2bae 395
ianwillianb 2:27a7a42b2bae 396 }
ianwillianb 2:27a7a42b2bae 397
ianwillianb 1:3da12598c635 398
ianwillianb 2:27a7a42b2bae 399 }
ianwillianb 2:27a7a42b2bae 400
ianwillianb 2:27a7a42b2bae 401 //caso dispare
ianwillianb 2:27a7a42b2bae 402 if(state==2){
ianwillianb 2:27a7a42b2bae 403 //buffer de entrada
ianwillianb 2:27a7a42b2bae 404 char state_2[1];
ianwillianb 2:27a7a42b2bae 405 //para sair do loop
ianwillianb 2:27a7a42b2bae 406 int input =1;
ianwillianb 2:27a7a42b2bae 407 //manda código para a apicação informando que o alarme disparou
ianwillianb 2:27a7a42b2bae 408 char disp[2];
ianwillianb 2:27a7a42b2bae 409 //int resposavel por armazenar a resposta da aplicação
ianwillianb 2:27a7a42b2bae 410 int state_20;
ianwillianb 2:27a7a42b2bae 411 sprintf(disp,"88"); //codigo 88 alarme disparado
ianwillianb 2:27a7a42b2bae 412 ws.send(disp);
ianwillianb 2:27a7a42b2bae 413 //loop para receber a resposta
ianwillianb 2:27a7a42b2bae 414 while(input){
ianwillianb 2:27a7a42b2bae 415 //se receber dados da aplicação
ianwillianb 2:27a7a42b2bae 416 if(ws.read(state_2)){
ianwillianb 2:27a7a42b2bae 417
ianwillianb 2:27a7a42b2bae 418
ianwillianb 2:27a7a42b2bae 419 //converte para int o dado recebido
ianwillianb 2:27a7a42b2bae 420 state_20 = atoi(state_2);
ianwillianb 2:27a7a42b2bae 421
ianwillianb 2:27a7a42b2bae 422
ianwillianb 2:27a7a42b2bae 423
ianwillianb 2:27a7a42b2bae 424 }
ianwillianb 2:27a7a42b2bae 425
ianwillianb 2:27a7a42b2bae 426 //se for 9 (indica que o usuario desabilitou o alarme)
ianwillianb 2:27a7a42b2bae 427 if(state_20 == 9) {
ianwillianb 2:27a7a42b2bae 428
ianwillianb 2:27a7a42b2bae 429
ianwillianb 2:27a7a42b2bae 430 //alarme desabilitado, volta para 0, deixa para a thread set_state decidir o proximo estado
ianwillianb 2:27a7a42b2bae 431 state = 0;
ianwillianb 2:27a7a42b2bae 432 //condicao para sair do loop
ianwillianb 2:27a7a42b2bae 433 input = 0;
ianwillianb 2:27a7a42b2bae 434
ianwillianb 2:27a7a42b2bae 435
ianwillianb 2:27a7a42b2bae 436 }
ianwillianb 2:27a7a42b2bae 437
ianwillianb 2:27a7a42b2bae 438
ianwillianb 2:27a7a42b2bae 439
ianwillianb 2:27a7a42b2bae 440 }//fim do while do state 2
ianwillianb 2:27a7a42b2bae 441
ianwillianb 2:27a7a42b2bae 442
ianwillianb 2:27a7a42b2bae 443
ianwillianb 2:27a7a42b2bae 444 }//fim do if state=2
ianwillianb 2:27a7a42b2bae 445
ianwillianb 2:27a7a42b2bae 446
ianwillianb 2:27a7a42b2bae 447
ianwillianb 2:27a7a42b2bae 448
ianwillianb 2:27a7a42b2bae 449 }//fim do while
ianwillianb 2:27a7a42b2bae 450
ianwillianb 2:27a7a42b2bae 451
ianwillianb 2:27a7a42b2bae 452
ianwillianb 2:27a7a42b2bae 453
ianwillianb 2:27a7a42b2bae 454
ianwillianb 2:27a7a42b2bae 455
ianwillianb 1:3da12598c635 456
ianwillianb 1:3da12598c635 457 }
ianwillianb 1:3da12598c635 458
ianwillianb 1:3da12598c635 459
ianwillianb 2:27a7a42b2bae 460 //thread explicitamente usada para debug, nao realiza trabalho útil. É dispensável para o funcionamento do sistema
ianwillianb 2:27a7a42b2bae 461 void print_range(){
ianwillianb 2:27a7a42b2bae 462
ianwillianb 2:27a7a42b2bae 463 while(true){
ianwillianb 2:27a7a42b2bae 464
ianwillianb 2:27a7a42b2bae 465 //hora do rtc
ianwillianb 2:27a7a42b2bae 466 gSerial.printf("Hora: %2d:%02d:%02d \n",alarm_time.hour,alarm_time.min,alarm_time.sec);
ianwillianb 2:27a7a42b2bae 467 //valor do range
ianwillianb 2:27a7a42b2bae 468 gSerial.printf("Valor Range: %d\n", range);
ianwillianb 2:27a7a42b2bae 469 //valor de hora de inicio e fim da ativação ajustado via aplicação
ianwillianb 2:27a7a42b2bae 470 gSerial.printf("para a estrutura: start_hour: %d start_min: %d start_sec: %d end_hour: %d end_min: %d end_sec: %d \n",a_time_start.hour,a_time_start.min,a_time_start.sec,a_time_end.hour,a_time_end.min,a_time_end.sec);
ianwillianb 2:27a7a42b2bae 471
ianwillianb 2:27a7a42b2bae 472 wait(1);
ianwillianb 2:27a7a42b2bae 473
ianwillianb 2:27a7a42b2bae 474
ianwillianb 2:27a7a42b2bae 475
ianwillianb 2:27a7a42b2bae 476 }
ianwillianb 2:27a7a42b2bae 477
ianwillianb 2:27a7a42b2bae 478
ianwillianb 2:27a7a42b2bae 479 }
ianwillianb 2:27a7a42b2bae 480
ianwillianb 2:27a7a42b2bae 481
ianwillianb 0:f603fa86c646 482
ianwillianb 2:27a7a42b2bae 483
ianwillianb 2:27a7a42b2bae 484 int main()
ianwillianb 2:27a7a42b2bae 485 {
ianwillianb 2:27a7a42b2bae 486 buzzer = 1; //desativa o buzzer. Como usamos um transistor pnp para chavear o buzzer, a lógica é inversa. O buzzer deve ser desativado pois a saida default da porta é 0
ianwillianb 2:27a7a42b2bae 487 enable.mode(PullDown); //coloca na entrada um resistor de pull-down para ler 0, a não ser que exista uma entrada em 1 vindo do sensor PIR
ianwillianb 2:27a7a42b2bae 488
ianwillianb 2:27a7a42b2bae 489 int x = eth.set_dhcp(true); //ativa dhcp
ianwillianb 2:27a7a42b2bae 490 int i=eth.connect(); //conecta
ianwillianb 2:27a7a42b2bae 491 //verifica conexão para debug apenas
ianwillianb 2:27a7a42b2bae 492 gSerial.printf("DHCP status: %i \r\n",x);
ianwillianb 2:27a7a42b2bae 493 gSerial.printf("connect status: %i \r\n",i);
ianwillianb 2:27a7a42b2bae 494 gSerial.printf("IP Address is %s\n\r", eth.get_ip_address());
ianwillianb 2:27a7a42b2bae 495
ianwillianb 2:27a7a42b2bae 496
ianwillianb 2:27a7a42b2bae 497
ianwillianb 2:27a7a42b2bae 498
ianwillianb 2:27a7a42b2bae 499
ianwillianb 2:27a7a42b2bae 500 //Iniciando o alarme com valor default inicial
ianwillianb 2:27a7a42b2bae 501 a_time_start.hour = 0;
ianwillianb 2:27a7a42b2bae 502 a_time_start.min = 10;
ianwillianb 2:27a7a42b2bae 503
ianwillianb 2:27a7a42b2bae 504 //Iniciando o alarme com valor default final
ianwillianb 2:27a7a42b2bae 505 a_time_end.hour = 6;
ianwillianb 2:27a7a42b2bae 506 a_time_end.min = 50;
ianwillianb 2:27a7a42b2bae 507
ianwillianb 2:27a7a42b2bae 508
ianwillianb 2:27a7a42b2bae 509
ianwillianb 2:27a7a42b2bae 510 wait(2); //aguarda 2s para o sensor PIR gerar uma saida consistente
ianwillianb 2:27a7a42b2bae 511
ianwillianb 2:27a7a42b2bae 512 //Inicialização das Threads
ianwillianb 2:27a7a42b2bae 513 SetRange = new Thread(set_range);
ianwillianb 2:27a7a42b2bae 514 RtcRead = new Thread(rtc_read);
ianwillianb 2:27a7a42b2bae 515 PrintRange = new Thread(print_range);
ianwillianb 2:27a7a42b2bae 516 SetState = new Thread(set_state);
ianwillianb 2:27a7a42b2bae 517 LedThread = new Thread(led_thread);
ianwillianb 2:27a7a42b2bae 518 SocketThread = new Thread(socket_thread);
ianwillianb 2:27a7a42b2bae 519
ianwillianb 2:27a7a42b2bae 520
ianwillianb 2:27a7a42b2bae 521
ianwillianb 2:27a7a42b2bae 522
ianwillianb 2:27a7a42b2bae 523
ianwillianb 2:27a7a42b2bae 524
ianwillianb 2:27a7a42b2bae 525 }
ianwillianb 2:27a7a42b2bae 526
ianwillianb 2:27a7a42b2bae 527
ianwillianb 2:27a7a42b2bae 528
ianwillianb 2:27a7a42b2bae 529
ianwillianb 2:27a7a42b2bae 530