Teste

Dependencies:   BSP_DISCO_F746NG LCD_DISCO_F746NG TS_DISCO_F746NG

Committer:
fabiorangel
Date:
Tue Sep 25 19:37:03 2018 +0000
Revision:
2:0cd40368f5a1
Parent:
1:a63eac8f5d0a
Final

Who changed what in which revision?

UserRevisionLine numberNew contents of line
fabiorangel 0:eb8850f13a55 1 #include "mbed.h"
fabiorangel 1:a63eac8f5d0a 2 #include "TS_DISCO_F746NG.h"
fabiorangel 1:a63eac8f5d0a 3 #include "LCD_DISCO_F746NG.h"
fabiorangel 1:a63eac8f5d0a 4 #include "EthernetInterface.h"
fabiorangel 1:a63eac8f5d0a 5 #include "TCPServer.h"
fabiorangel 1:a63eac8f5d0a 6 #include "TCPSocket.h"
fabiorangel 1:a63eac8f5d0a 7 #include <string>
fabiorangel 1:a63eac8f5d0a 8
fabiorangel 1:a63eac8f5d0a 9 #define BTN_R1_X 60 //coordenada X do botão relé 1
fabiorangel 1:a63eac8f5d0a 10 #define BTN_R1_Y 130 //coordenada Y do botão relé 1
fabiorangel 1:a63eac8f5d0a 11
fabiorangel 1:a63eac8f5d0a 12 #define BTN_WIDTH 150 //largura do botão dos relés
fabiorangel 1:a63eac8f5d0a 13 #define BTN_HEIGHT 75 //altura do botão dos relés
fabiorangel 1:a63eac8f5d0a 14
fabiorangel 1:a63eac8f5d0a 15 #define BTN_R2_X 50 + (BTN_R1_X + BTN_WIDTH) //coordenada X do botão relé 2
fabiorangel 1:a63eac8f5d0a 16 #define BTN_R2_Y 130 //coordenada Y do botão relé 1
fabiorangel 1:a63eac8f5d0a 17
fabiorangel 1:a63eac8f5d0a 18 LCD_DISCO_F746NG lcd; //objeto que controla o display
fabiorangel 1:a63eac8f5d0a 19 TS_DISCO_F746NG ts; //objeto que controla o touch do display
fabiorangel 1:a63eac8f5d0a 20
fabiorangel 1:a63eac8f5d0a 21 TCPSocket *clt_sock; //ponteiro para um socket TCP
fabiorangel 1:a63eac8f5d0a 22
fabiorangel 1:a63eac8f5d0a 23 //variáveis de controle de estado dos relés
fabiorangel 1:a63eac8f5d0a 24 bool btnRelay1 = false;
fabiorangel 1:a63eac8f5d0a 25 bool btnRelay2 = false;
fabiorangel 1:a63eac8f5d0a 26
fabiorangel 1:a63eac8f5d0a 27 /* PROTÓTIPO DAS FUNÇÕES */
fabiorangel 1:a63eac8f5d0a 28 //desenha um um botão na tela com uma escrita no meio
fabiorangel 1:a63eac8f5d0a 29 void drawButton(int x, int y, int width, int height, uint32_t color, char* title);
fabiorangel 1:a63eac8f5d0a 30 //verifica se ocorreu um toque na tela
fabiorangel 1:a63eac8f5d0a 31 void verifyTouch(int x, int y);
fabiorangel 1:a63eac8f5d0a 32 //verifica se o toque foi em algum dos botões
fabiorangel 1:a63eac8f5d0a 33 bool verifyTouchButton(int x, int y, int rectX, int rectY);
fabiorangel 1:a63eac8f5d0a 34 //envia um pacote de comandos para o client
fabiorangel 1:a63eac8f5d0a 35 bool sendPacket(char* packet);
fabiorangel 1:a63eac8f5d0a 36 //escreve na tela o status da conexão (client conectado ou desconectado)
fabiorangel 1:a63eac8f5d0a 37 void writeStatus(char* status, uint32_t color);
fabiorangel 1:a63eac8f5d0a 38
fabiorangel 1:a63eac8f5d0a 39
fabiorangel 1:a63eac8f5d0a 40 int main()
fabiorangel 1:a63eac8f5d0a 41 {
fabiorangel 1:a63eac8f5d0a 42 TS_StateTypeDef TS_State; //estado do touch
fabiorangel 1:a63eac8f5d0a 43 uint8_t status;
fabiorangel 0:eb8850f13a55 44
fabiorangel 1:a63eac8f5d0a 45 status = ts.Init(lcd.GetXSize(), lcd.GetYSize()); //inicializa o touch na tela toda
fabiorangel 1:a63eac8f5d0a 46 //se deu erro ao inicializar -> mensagem de falha e pára a execução do programa
fabiorangel 1:a63eac8f5d0a 47 if (status != TS_OK) {
fabiorangel 1:a63eac8f5d0a 48 lcd.Clear(LCD_COLOR_RED);
fabiorangel 1:a63eac8f5d0a 49 lcd.SetBackColor(LCD_COLOR_RED);
fabiorangel 1:a63eac8f5d0a 50 lcd.SetTextColor(LCD_COLOR_WHITE);
fabiorangel 1:a63eac8f5d0a 51 lcd.DisplayStringAt(0, LINE(5), (uint8_t *)"TOUCHSCREEN INIT FAIL", CENTER_MODE);
fabiorangel 1:a63eac8f5d0a 52 wait(2);
fabiorangel 1:a63eac8f5d0a 53 return 0;
fabiorangel 1:a63eac8f5d0a 54 }
fabiorangel 1:a63eac8f5d0a 55
fabiorangel 1:a63eac8f5d0a 56 lcd.Clear(LCD_COLOR_BLUE); //limpa a tela e pinta de azul
fabiorangel 1:a63eac8f5d0a 57 lcd.SetBackColor(LCD_COLOR_BLUE); //cor de fundo de texto
fabiorangel 1:a63eac8f5d0a 58 lcd.SetTextColor(LCD_COLOR_YELLOW); //cor do texto
fabiorangel 1:a63eac8f5d0a 59 lcd.DisplayStringAt(0, LINE(5), (uint8_t *)"TOUCHSCREEN INIT OK", CENTER_MODE);
fabiorangel 1:a63eac8f5d0a 60
fabiorangel 1:a63eac8f5d0a 61
fabiorangel 1:a63eac8f5d0a 62 wait(1); //aguarda um segundo
fabiorangel 1:a63eac8f5d0a 63 lcd.Clear(LCD_COLOR_BLUE); //limpa a tela
fabiorangel 1:a63eac8f5d0a 64 lcd.SetTextColor(LCD_COLOR_WHITE); //seta cor do texto
fabiorangel 1:a63eac8f5d0a 65 lcd.SetFont(&Font24); //seta tamanho da fonte
fabiorangel 1:a63eac8f5d0a 66 lcd.DisplayStringAt(0, LINE(1), (uint8_t *)"AUTOMATION", CENTER_MODE);
fabiorangel 1:a63eac8f5d0a 67
fabiorangel 1:a63eac8f5d0a 68 lcd.DisplayStringAt(BTN_R1_X, LINE(4), (uint8_t *)"RELAY 1", LEFT_MODE);
fabiorangel 1:a63eac8f5d0a 69 lcd.DisplayStringAt(BTN_R2_X, LINE(4), (uint8_t *)"RELAY 2", LEFT_MODE);
fabiorangel 1:a63eac8f5d0a 70
fabiorangel 1:a63eac8f5d0a 71 //cria os botões
fabiorangel 1:a63eac8f5d0a 72 drawButton(BTN_R1_X, BTN_R1_Y, BTN_WIDTH, BTN_HEIGHT, LCD_COLOR_RED, "OFF");
fabiorangel 1:a63eac8f5d0a 73 drawButton(BTN_R2_X, BTN_R2_Y, BTN_WIDTH, BTN_HEIGHT, LCD_COLOR_RED, "OFF");
fabiorangel 1:a63eac8f5d0a 74
fabiorangel 1:a63eac8f5d0a 75 //objeto que controla a rede ethernet
fabiorangel 1:a63eac8f5d0a 76 EthernetInterface eth;
fabiorangel 1:a63eac8f5d0a 77 eth.connect(); //conecta à rede
fabiorangel 1:a63eac8f5d0a 78
fabiorangel 1:a63eac8f5d0a 79 string ip = eth.get_ip_address(); //pega o IP recebido
fabiorangel 1:a63eac8f5d0a 80 lcd.SetBackColor(LCD_COLOR_BLUE);
fabiorangel 1:a63eac8f5d0a 81 lcd.SetFont(&Font8);
fabiorangel 1:a63eac8f5d0a 82 //verifica se o IP é válido
fabiorangel 1:a63eac8f5d0a 83 if(ip.length() <= 16 && ip.length() >= 7 ) {
fabiorangel 1:a63eac8f5d0a 84 uint8_t text[18];
fabiorangel 1:a63eac8f5d0a 85 sprintf((char*)text, "%s", eth.get_ip_address());
fabiorangel 1:a63eac8f5d0a 86 lcd.DisplayStringAt(0, LINE(1), (uint8_t *)&text, LEFT_MODE); //imprime na tela o IP
fabiorangel 1:a63eac8f5d0a 87 } else {
fabiorangel 1:a63eac8f5d0a 88 lcd.DisplayStringAt(0, LINE(1), (uint8_t *)"IP Invalido", LEFT_MODE);
fabiorangel 1:a63eac8f5d0a 89 }
fabiorangel 1:a63eac8f5d0a 90
fabiorangel 1:a63eac8f5d0a 91
fabiorangel 1:a63eac8f5d0a 92 TCPServer srv; //objeto de controle do server
fabiorangel 0:eb8850f13a55 93
fabiorangel 1:a63eac8f5d0a 94 //abre um server na rede
fabiorangel 1:a63eac8f5d0a 95 srv.open(&eth);
fabiorangel 1:a63eac8f5d0a 96 //configura a porta TCP 80 para o server
fabiorangel 1:a63eac8f5d0a 97 srv.bind(eth.get_ip_address(), 80);
fabiorangel 1:a63eac8f5d0a 98 /* Can handle 1 simultaneous connections */
fabiorangel 1:a63eac8f5d0a 99 //aguarda uma única conexão
fabiorangel 1:a63eac8f5d0a 100 srv.listen(1);
fabiorangel 1:a63eac8f5d0a 101
fabiorangel 0:eb8850f13a55 102 while(1) {
fabiorangel 1:a63eac8f5d0a 103 writeStatus("Desconectado", LCD_COLOR_RED); //imprime o estado de desconectado
fabiorangel 1:a63eac8f5d0a 104 TCPSocket socket; //objeto TCPsocket
fabiorangel 1:a63eac8f5d0a 105 SocketAddress clt_addr;
fabiorangel 1:a63eac8f5d0a 106 clt_sock = &socket;
fabiorangel 1:a63eac8f5d0a 107 printf("waiting \n");
fabiorangel 1:a63eac8f5d0a 108 //fica aguardando um client conectar
fabiorangel 1:a63eac8f5d0a 109 srv.accept(clt_sock, &clt_addr);
fabiorangel 1:a63eac8f5d0a 110 printf("accept %s:%d\n", clt_addr.get_ip_address(), clt_addr.get_port());
fabiorangel 1:a63eac8f5d0a 111
fabiorangel 1:a63eac8f5d0a 112 //char buffer[3];
fabiorangel 1:a63eac8f5d0a 113 //int n = clt_sock->recv(buffer, sizeof(buffer));
fabiorangel 1:a63eac8f5d0a 114 //printf("N : %d\n",n);
fabiorangel 1:a63eac8f5d0a 115 //buffer[n] = '\0';
fabiorangel 1:a63eac8f5d0a 116 //printf("Received message from Client : %s\n",buffer);
fabiorangel 1:a63eac8f5d0a 117
fabiorangel 1:a63eac8f5d0a 118
fabiorangel 1:a63eac8f5d0a 119 writeStatus("Conectado", LCD_COLOR_GREEN); //imprime o estado de conectado
fabiorangel 1:a63eac8f5d0a 120 clt_sock->set_timeout(5000); //seta o timeout para o socket
fabiorangel 1:a63eac8f5d0a 121 //enquanto o socket estiver aberto
fabiorangel 1:a63eac8f5d0a 122 while(clt_sock != NULL) {
fabiorangel 1:a63eac8f5d0a 123 ts.GetState(&TS_State); //registra o estado do touch
fabiorangel 1:a63eac8f5d0a 124 //se algum toque na tela foi detectado
fabiorangel 1:a63eac8f5d0a 125 if (TS_State.touchDetected) {
fabiorangel 1:a63eac8f5d0a 126 uint8_t idx;
fabiorangel 1:a63eac8f5d0a 127 //ao tocar a tela, pode ser que múltiplos toques foram dados, portanto faremos uma verificação
fabiorangel 1:a63eac8f5d0a 128 for (idx = 0; idx < TS_State.touchDetected; idx++) {
fabiorangel 1:a63eac8f5d0a 129 //se o evento do toque foi PRESS
fabiorangel 1:a63eac8f5d0a 130 if(TS_State.touchEventId[idx] == TOUCH_EVENT_PRESS_DOWN) {
fabiorangel 1:a63eac8f5d0a 131 verifyTouch(TS_State.touchX[idx], TS_State.touchY[idx]);//verifica se tocou em algum botão
fabiorangel 1:a63eac8f5d0a 132 break;
fabiorangel 1:a63eac8f5d0a 133 }//if
fabiorangel 1:a63eac8f5d0a 134 }//for
fabiorangel 1:a63eac8f5d0a 135 }//if
fabiorangel 1:a63eac8f5d0a 136 }//while NULL
fabiorangel 1:a63eac8f5d0a 137
fabiorangel 1:a63eac8f5d0a 138 }//while 1
fabiorangel 1:a63eac8f5d0a 139 }
fabiorangel 1:a63eac8f5d0a 140
fabiorangel 1:a63eac8f5d0a 141 //desenha um um botão na tela com uma escrita no meio
fabiorangel 1:a63eac8f5d0a 142 void drawButton(int x, int y, int width, int height, uint32_t color, char* title)
fabiorangel 1:a63eac8f5d0a 143 {
fabiorangel 1:a63eac8f5d0a 144 lcd.SetFont(&Font24);
fabiorangel 1:a63eac8f5d0a 145 lcd.SetTextColor(color);
fabiorangel 1:a63eac8f5d0a 146 lcd.SetBackColor(color);
fabiorangel 1:a63eac8f5d0a 147 lcd.FillRect(x, y, width, height);
fabiorangel 1:a63eac8f5d0a 148 lcd.SetTextColor(LCD_COLOR_WHITE);
fabiorangel 1:a63eac8f5d0a 149 uint8_t text[30];
fabiorangel 1:a63eac8f5d0a 150 sprintf((char*)text, "%s", title);
fabiorangel 1:a63eac8f5d0a 151 lcd.DisplayStringAt(x+50, y+(height/2)-10, (uint8_t *)&text, LEFT_MODE);
fabiorangel 1:a63eac8f5d0a 152 }
fabiorangel 1:a63eac8f5d0a 153
fabiorangel 1:a63eac8f5d0a 154 //verifica se ocorreu um toque na tela
fabiorangel 1:a63eac8f5d0a 155 void verifyTouch(int x, int y)
fabiorangel 1:a63eac8f5d0a 156 {
fabiorangel 1:a63eac8f5d0a 157 bool response = false; //guarda o status do envio da mensagem para o client
fabiorangel 1:a63eac8f5d0a 158 //verifica se tocou no botão do relé 1
fabiorangel 1:a63eac8f5d0a 159 if( verifyTouchButton(x, y, BTN_R1_X, BTN_R1_Y) ) {
fabiorangel 1:a63eac8f5d0a 160 char* text;
fabiorangel 1:a63eac8f5d0a 161 uint32_t color;
fabiorangel 1:a63eac8f5d0a 162 //se o relé está ligado então desliga
fabiorangel 1:a63eac8f5d0a 163 if(btnRelay1) {
fabiorangel 1:a63eac8f5d0a 164 text = "OFF";
fabiorangel 1:a63eac8f5d0a 165 color = LCD_COLOR_RED;
fabiorangel 1:a63eac8f5d0a 166 response = sendPacket("#R1|0"); //envia comando para desligar o relé
fabiorangel 1:a63eac8f5d0a 167 } else {
fabiorangel 1:a63eac8f5d0a 168 //se relé está desligado, então liga
fabiorangel 1:a63eac8f5d0a 169 text = "ON";
fabiorangel 1:a63eac8f5d0a 170 color = LCD_COLOR_GREEN;
fabiorangel 1:a63eac8f5d0a 171 response = sendPacket("#R1|1");//envia comando para ligar o relé
fabiorangel 1:a63eac8f5d0a 172 }
fabiorangel 1:a63eac8f5d0a 173 //se o envio foi confirmado
fabiorangel 1:a63eac8f5d0a 174 if(response) {
fabiorangel 1:a63eac8f5d0a 175 drawButton(BTN_R1_X, BTN_R1_Y, BTN_WIDTH, BTN_HEIGHT, color, text); //atualiza o botão
fabiorangel 1:a63eac8f5d0a 176 btnRelay1 = !btnRelay1;
fabiorangel 1:a63eac8f5d0a 177 }
fabiorangel 1:a63eac8f5d0a 178
fabiorangel 1:a63eac8f5d0a 179 }
fabiorangel 1:a63eac8f5d0a 180 //verifica se tocou no botão do relé 1
fabiorangel 1:a63eac8f5d0a 181 else if( verifyTouchButton(x,y,BTN_R2_X,BTN_R2_Y) ) {
fabiorangel 1:a63eac8f5d0a 182 char* text;
fabiorangel 1:a63eac8f5d0a 183 uint32_t color;
fabiorangel 1:a63eac8f5d0a 184 //se o relé está ligado então desliga
fabiorangel 1:a63eac8f5d0a 185 if(btnRelay2) {
fabiorangel 1:a63eac8f5d0a 186 text = "OFF";
fabiorangel 1:a63eac8f5d0a 187 color = LCD_COLOR_RED;
fabiorangel 1:a63eac8f5d0a 188 response = sendPacket("#R2|0"); //envia comando para desligar o relé
fabiorangel 1:a63eac8f5d0a 189 } else {
fabiorangel 1:a63eac8f5d0a 190 //se relé está desligado, então liga
fabiorangel 1:a63eac8f5d0a 191 text = "ON";
fabiorangel 1:a63eac8f5d0a 192 color = LCD_COLOR_GREEN;
fabiorangel 1:a63eac8f5d0a 193 response = sendPacket("#R2|1");//envia comando para ligar o relé
fabiorangel 1:a63eac8f5d0a 194
fabiorangel 1:a63eac8f5d0a 195 }
fabiorangel 1:a63eac8f5d0a 196 //se o envio foi confirmado
fabiorangel 1:a63eac8f5d0a 197 if(response) {
fabiorangel 1:a63eac8f5d0a 198 drawButton(BTN_R2_X, BTN_R2_Y, BTN_WIDTH, BTN_HEIGHT, color, text);//atualiza o botão
fabiorangel 1:a63eac8f5d0a 199 btnRelay2 = !btnRelay2;
fabiorangel 1:a63eac8f5d0a 200 }
fabiorangel 0:eb8850f13a55 201 }
fabiorangel 0:eb8850f13a55 202 }
fabiorangel 1:a63eac8f5d0a 203
fabiorangel 1:a63eac8f5d0a 204 //verifica se o toque foi em algum dos botões
fabiorangel 1:a63eac8f5d0a 205 bool verifyTouchButton(int x, int y, int rectX, int rectY)
fabiorangel 1:a63eac8f5d0a 206 {
fabiorangel 1:a63eac8f5d0a 207 printf("tocou : %d,%d %d,%d\n",x,y,rectX,rectY);
fabiorangel 1:a63eac8f5d0a 208 if( (x >= rectX) && (x <= rectX + BTN_WIDTH) ) {
fabiorangel 1:a63eac8f5d0a 209 if( (y >= rectY) && (y <= rectY + BTN_HEIGHT) )
fabiorangel 1:a63eac8f5d0a 210 return true;
fabiorangel 1:a63eac8f5d0a 211 }
fabiorangel 1:a63eac8f5d0a 212 return false;
fabiorangel 1:a63eac8f5d0a 213 }
fabiorangel 1:a63eac8f5d0a 214
fabiorangel 1:a63eac8f5d0a 215 //envia um pacote de comandos para o client
fabiorangel 1:a63eac8f5d0a 216 bool sendPacket(char* packet)
fabiorangel 1:a63eac8f5d0a 217 {
fabiorangel 1:a63eac8f5d0a 218 char buffer[256];
fabiorangel 1:a63eac8f5d0a 219 clt_sock->send(packet, strlen(packet)); //envia o comando
fabiorangel 1:a63eac8f5d0a 220 int n = clt_sock->recv(buffer, sizeof(buffer)); //aguarda confirmação
fabiorangel 1:a63eac8f5d0a 221 printf("N : %d\n",n);
fabiorangel 1:a63eac8f5d0a 222 //se não chegou bytes então client não recebeu o pacote
fabiorangel 1:a63eac8f5d0a 223 if (n <= 0) {
fabiorangel 1:a63eac8f5d0a 224 clt_sock->close(); //fecha o socket
fabiorangel 1:a63eac8f5d0a 225 clt_sock = NULL;
fabiorangel 1:a63eac8f5d0a 226 return false;
fabiorangel 1:a63eac8f5d0a 227 }
fabiorangel 1:a63eac8f5d0a 228 // print received message to terminal
fabiorangel 1:a63eac8f5d0a 229 buffer[n] = '\0';
fabiorangel 1:a63eac8f5d0a 230 printf("Received message from Client : %s\n",buffer);
fabiorangel 1:a63eac8f5d0a 231 return true;
fabiorangel 1:a63eac8f5d0a 232 }
fabiorangel 1:a63eac8f5d0a 233
fabiorangel 1:a63eac8f5d0a 234 //escreve na tela o status da conexão (client conectado ou desconectado)
fabiorangel 1:a63eac8f5d0a 235 void writeStatus(char* status, uint32_t color)
fabiorangel 1:a63eac8f5d0a 236 {
fabiorangel 1:a63eac8f5d0a 237 lcd.SetTextColor(color);
fabiorangel 1:a63eac8f5d0a 238 lcd.SetBackColor(LCD_COLOR_BLUE);
fabiorangel 1:a63eac8f5d0a 239 lcd.SetFont(&Font16);
fabiorangel 1:a63eac8f5d0a 240 lcd.ClearStringLine(16); //limpa a linha que escreveremos
fabiorangel 1:a63eac8f5d0a 241 uint8_t text[30];
fabiorangel 1:a63eac8f5d0a 242 sprintf((char*)text, "%s", status);
fabiorangel 1:a63eac8f5d0a 243 lcd.DisplayStringAtLine(16, (uint8_t *)&text);
fabiorangel 1:a63eac8f5d0a 244 }
fabiorangel 1:a63eac8f5d0a 245
fabiorangel 1:a63eac8f5d0a 246
fabiorangel 1:a63eac8f5d0a 247
fabiorangel 1:a63eac8f5d0a 248