Automation

Dependencies:   BSP_DISCO_F746NG LCD_DISCO_F746NG TS_DISCO_F746NG

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

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(&eth);
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