
Automation
Dependencies: BSP_DISCO_F746NG LCD_DISCO_F746NG TS_DISCO_F746NG
main.cpp
00001 #include "mbed.h" 00002 #include "TS_DISCO_F746NG.h" 00003 #include "LCD_DISCO_F746NG.h" 00004 #include "EthernetInterface.h" 00005 #include "TCPServer.h" 00006 #include "TCPSocket.h" 00007 #include <string> 00008 00009 #define BTN_R1_X 60 //coordenada X do botão relé 1 00010 #define BTN_R1_Y 130 //coordenada Y do botão relé 1 00011 00012 #define BTN_WIDTH 150 //largura do botão dos relés 00013 #define BTN_HEIGHT 75 //altura do botão dos relés 00014 00015 #define BTN_R2_X 50 + (BTN_R1_X + BTN_WIDTH) //coordenada X do botão relé 2 00016 #define BTN_R2_Y 130 //coordenada Y do botão relé 1 00017 00018 LCD_DISCO_F746NG lcd; //objeto que controla o display 00019 TS_DISCO_F746NG ts; //objeto que controla o touch do display 00020 00021 TCPSocket *clt_sock; //ponteiro para um socket TCP 00022 00023 //variáveis de controle de estado dos relés 00024 bool btnRelay1 = false; 00025 bool btnRelay2 = false; 00026 00027 /* PROTÓTIPO DAS FUNÇÕES */ 00028 //desenha um um botão na tela com uma escrita no meio 00029 void drawButton(int x, int y, int width, int height, uint32_t color, char* title); 00030 //verifica se ocorreu um toque na tela 00031 void verifyTouch(int x, int y); 00032 //verifica se o toque foi em algum dos botões 00033 bool verifyTouchButton(int x, int y, int rectX, int rectY); 00034 //envia um pacote de comandos para o client 00035 bool sendPacket(char* packet); 00036 //escreve na tela o status da conexão (client conectado ou desconectado) 00037 void writeStatus(char* status, uint32_t color); 00038 00039 00040 int main() 00041 { 00042 TS_StateTypeDef TS_State; //estado do touch 00043 uint8_t status; 00044 00045 status = ts.Init(lcd.GetXSize(), lcd.GetYSize()); //inicializa o touch na tela toda 00046 //se deu erro ao inicializar -> mensagem de falha e pára a execução do programa 00047 if (status != TS_OK) { 00048 lcd.Clear(LCD_COLOR_RED); 00049 lcd.SetBackColor(LCD_COLOR_RED); 00050 lcd.SetTextColor(LCD_COLOR_WHITE); 00051 lcd.DisplayStringAt(0, LINE(5), (uint8_t *)"TOUCHSCREEN INIT FAIL", CENTER_MODE); 00052 wait(2); 00053 return 0; 00054 } 00055 00056 lcd.Clear(LCD_COLOR_BLUE); //limpa a tela e pinta de azul 00057 lcd.SetBackColor(LCD_COLOR_BLUE); //cor de fundo de texto 00058 lcd.SetTextColor(LCD_COLOR_YELLOW); //cor do texto 00059 lcd.DisplayStringAt(0, LINE(5), (uint8_t *)"TOUCHSCREEN INIT OK", CENTER_MODE); 00060 00061 00062 wait(1); //aguarda um segundo 00063 lcd.Clear(LCD_COLOR_BLUE); //limpa a tela 00064 lcd.SetTextColor(LCD_COLOR_WHITE); //seta cor do texto 00065 lcd.SetFont(&Font24); //seta tamanho da fonte 00066 lcd.DisplayStringAt(0, LINE(1), (uint8_t *)"AUTOMATION", CENTER_MODE); 00067 00068 lcd.DisplayStringAt(BTN_R1_X, LINE(4), (uint8_t *)"RELAY 1", LEFT_MODE); 00069 lcd.DisplayStringAt(BTN_R2_X, LINE(4), (uint8_t *)"RELAY 2", LEFT_MODE); 00070 00071 //cria os botões 00072 drawButton(BTN_R1_X, BTN_R1_Y, BTN_WIDTH, BTN_HEIGHT, LCD_COLOR_RED, "OFF"); 00073 drawButton(BTN_R2_X, BTN_R2_Y, BTN_WIDTH, BTN_HEIGHT, LCD_COLOR_RED, "OFF"); 00074 00075 //objeto que controla a rede ethernet 00076 EthernetInterface eth; 00077 eth.connect(); //conecta à rede 00078 00079 string ip = eth.get_ip_address(); //pega o IP recebido 00080 lcd.SetBackColor(LCD_COLOR_BLUE); 00081 lcd.SetFont(&Font8); 00082 //verifica se o IP é válido 00083 if(ip.length() <= 16 && ip.length() >= 7 ) { 00084 uint8_t text[18]; 00085 sprintf((char*)text, "%s", eth.get_ip_address()); 00086 lcd.DisplayStringAt(0, LINE(1), (uint8_t *)&text, LEFT_MODE); //imprime na tela o IP 00087 } else { 00088 lcd.DisplayStringAt(0, LINE(1), (uint8_t *)"IP Invalido", LEFT_MODE); 00089 } 00090 00091 00092 TCPServer srv; //objeto de controle do server 00093 00094 //abre um server na rede 00095 srv.open(ð); 00096 //configura a porta TCP 80 para o server 00097 srv.bind(eth.get_ip_address(), 80); 00098 /* Can handle 1 simultaneous connections */ 00099 //aguarda uma única conexão 00100 srv.listen(1); 00101 00102 while(1) { 00103 writeStatus("Desconectado", LCD_COLOR_RED); //imprime o estado de desconectado 00104 TCPSocket socket; //objeto TCPsocket 00105 SocketAddress clt_addr; 00106 clt_sock = &socket; 00107 printf("waiting \n"); 00108 //fica aguardando um client conectar 00109 srv.accept(clt_sock, &clt_addr); 00110 printf("accept %s:%d\n", clt_addr.get_ip_address(), clt_addr.get_port()); 00111 00112 //char buffer[3]; 00113 //int n = clt_sock->recv(buffer, sizeof(buffer)); 00114 //printf("N : %d\n",n); 00115 //buffer[n] = '\0'; 00116 //printf("Received message from Client : %s\n",buffer); 00117 00118 00119 writeStatus("Conectado", LCD_COLOR_GREEN); //imprime o estado de conectado 00120 clt_sock->set_timeout(5000); //seta o timeout para o socket 00121 //enquanto o socket estiver aberto 00122 while(clt_sock != NULL) { 00123 ts.GetState(&TS_State); //registra o estado do touch 00124 //se algum toque na tela foi detectado 00125 if (TS_State.touchDetected) { 00126 uint8_t idx; 00127 //ao tocar a tela, pode ser que múltiplos toques foram dados, portanto faremos uma verificação 00128 for (idx = 0; idx < TS_State.touchDetected; idx++) { 00129 //se o evento do toque foi PRESS 00130 if(TS_State.touchEventId[idx] == TOUCH_EVENT_PRESS_DOWN) { 00131 verifyTouch(TS_State.touchX[idx], TS_State.touchY[idx]);//verifica se tocou em algum botão 00132 break; 00133 }//if 00134 }//for 00135 }//if 00136 }//while NULL 00137 00138 }//while 1 00139 } 00140 00141 //desenha um um botão na tela com uma escrita no meio 00142 void drawButton(int x, int y, int width, int height, uint32_t color, char* title) 00143 { 00144 lcd.SetFont(&Font24); 00145 lcd.SetTextColor(color); 00146 lcd.SetBackColor(color); 00147 lcd.FillRect(x, y, width, height); 00148 lcd.SetTextColor(LCD_COLOR_WHITE); 00149 uint8_t text[30]; 00150 sprintf((char*)text, "%s", title); 00151 lcd.DisplayStringAt(x+50, y+(height/2)-10, (uint8_t *)&text, LEFT_MODE); 00152 } 00153 00154 //verifica se ocorreu um toque na tela 00155 void verifyTouch(int x, int y) 00156 { 00157 bool response = false; //guarda o status do envio da mensagem para o client 00158 //verifica se tocou no botão do relé 1 00159 if( verifyTouchButton(x, y, BTN_R1_X, BTN_R1_Y) ) { 00160 char* text; 00161 uint32_t color; 00162 //se o relé está ligado então desliga 00163 if(btnRelay1) { 00164 text = "OFF"; 00165 color = LCD_COLOR_RED; 00166 response = sendPacket("#R1|0"); //envia comando para desligar o relé 00167 } else { 00168 //se relé está desligado, então liga 00169 text = "ON"; 00170 color = LCD_COLOR_GREEN; 00171 response = sendPacket("#R1|1");//envia comando para ligar o relé 00172 } 00173 //se o envio foi confirmado 00174 if(response) { 00175 drawButton(BTN_R1_X, BTN_R1_Y, BTN_WIDTH, BTN_HEIGHT, color, text); //atualiza o botão 00176 btnRelay1 = !btnRelay1; 00177 } 00178 00179 } 00180 //verifica se tocou no botão do relé 1 00181 else if( verifyTouchButton(x,y,BTN_R2_X,BTN_R2_Y) ) { 00182 char* text; 00183 uint32_t color; 00184 //se o relé está ligado então desliga 00185 if(btnRelay2) { 00186 text = "OFF"; 00187 color = LCD_COLOR_RED; 00188 response = sendPacket("#R2|0"); //envia comando para desligar o relé 00189 } else { 00190 //se relé está desligado, então liga 00191 text = "ON"; 00192 color = LCD_COLOR_GREEN; 00193 response = sendPacket("#R2|1");//envia comando para ligar o relé 00194 00195 } 00196 //se o envio foi confirmado 00197 if(response) { 00198 drawButton(BTN_R2_X, BTN_R2_Y, BTN_WIDTH, BTN_HEIGHT, color, text);//atualiza o botão 00199 btnRelay2 = !btnRelay2; 00200 } 00201 } 00202 } 00203 00204 //verifica se o toque foi em algum dos botões 00205 bool verifyTouchButton(int x, int y, int rectX, int rectY) 00206 { 00207 printf("tocou : %d,%d %d,%d\n",x,y,rectX,rectY); 00208 if( (x >= rectX) && (x <= rectX + BTN_WIDTH) ) { 00209 if( (y >= rectY) && (y <= rectY + BTN_HEIGHT) ) 00210 return true; 00211 } 00212 return false; 00213 } 00214 00215 //envia um pacote de comandos para o client 00216 bool sendPacket(char* packet) 00217 { 00218 char buffer[256]; 00219 clt_sock->send(packet, strlen(packet)); //envia o comando 00220 int n = clt_sock->recv(buffer, sizeof(buffer)); //aguarda confirmação 00221 printf("N : %d\n",n); 00222 //se não chegou bytes então client não recebeu o pacote 00223 if (n <= 0) { 00224 clt_sock->close(); //fecha o socket 00225 clt_sock = NULL; 00226 return false; 00227 } 00228 // print received message to terminal 00229 buffer[n] = '\0'; 00230 printf("Received message from Client : %s\n",buffer); 00231 return true; 00232 } 00233 00234 //escreve na tela o status da conexão (client conectado ou desconectado) 00235 void writeStatus(char* status, uint32_t color) 00236 { 00237 lcd.SetTextColor(color); 00238 lcd.SetBackColor(LCD_COLOR_BLUE); 00239 lcd.SetFont(&Font16); 00240 lcd.ClearStringLine(16); //limpa a linha que escreveremos 00241 uint8_t text[30]; 00242 sprintf((char*)text, "%s", status); 00243 lcd.DisplayStringAtLine(16, (uint8_t *)&text); 00244 } 00245 00246 00247 00248
Generated on Mon Dec 17 2018 22:58:11 by
