APS SO
Dependencies: WebSocketClient mbed
Fork of APS_SO by
main.cpp@2:27a7a42b2bae, 2017-12-15 (annotated)
- Committer:
- ianwillianb
- Date:
- Fri Dec 15 20:07:49 2017 +0000
- Revision:
- 2:27a7a42b2bae
- Parent:
- 1:3da12598c635
finalizado;
Who changed what in which revision?
User | Revision | Line number | New 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", ð); |
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 |