Teste de Tela

Dependencies:   BSP_DISCO_F746NG LCD_DISCO_F746NG TS_DISCO_F746NG mbed

main.cpp

Committer:
marcusncunha
Date:
2017-06-27
Revision:
0:9b2b74c6af2f
Child:
1:c04c41de6eef

File content as of revision 0:9b2b74c6af2f:

#include "mbed.h"
#include "TS_DISCO_F746NG.h"
#include "LCD_DISCO_F746NG.h"
#include "codigoBotaoReset.h"

#define TEMPO_PRESSIONADO_BOTAO 0.01000f

LCD_DISCO_F746NG lcd;
TS_DISCO_F746NG ts;
TS_StateTypeDef TS_State;


typedef struct{
    uint16_t x;
    uint16_t y;
    uint16_t largura;
    uint16_t altura;
}dadosRetanguloBase;

   
typedef struct{
    dadosRetanguloBase retanguloObjeto;
    uint16_t valor;
    bool updateFlag;
}barra;

typedef struct{
    dadosRetanguloBase retanguloObjeto;
    bool isPressed;
    bool updateFlag;
    Timer depressTime;
}botao;

//Base do botão que é um retângulo desenhado
dadosRetanguloBase baseBotaoReset = {24, 180, 125, 70};
dadosRetanguloBase baseBotaoAprender = {170, 180, 125, 70};
dadosRetanguloBase baseBotaoConfigurarVoltar = {436, 4, 40, 40};

//Criado cada botão com sua base/localização correspondente
botao botaoReset = {baseBotaoReset, 0, 0};
botao botaoAprender = {baseBotaoAprender, 0, 0};
botao botaoConfigurarVoltar = {baseBotaoConfigurarVoltar, 0, 0};

void iniciarBotao(botao *botaoObjeto, TS_StateTypeDef *toqueTela){
    bool isDentroBotaoX = 0;
    bool isDentroBotaoY = 0;
    
    uint16_t cliqueX = toqueTela->touchX[0];
    uint16_t cliqueY = toqueTela->touchY[0];
    
    //Testar se foi na área do botão em x e marca o flag
    if((cliqueX > botaoObjeto->retanguloObjeto.x) && (cliqueX < ( botaoObjeto->retanguloObjeto.x + botaoObjeto->retanguloObjeto.largura))){
        isDentroBotaoX = 1;
    }
    
    //Testar se foi na área do botão em y e marca o flag
    if((cliqueY > botaoObjeto->retanguloObjeto.y) && (cliqueY < ( botaoObjeto->retanguloObjeto.y + botaoObjeto->retanguloObjeto.altura))){
        isDentroBotaoY = 1;
    }
    
    //Testa se está dentro da área do botão XY
    if(isDentroBotaoX && isDentroBotaoY){
        //Se ele não estava pressionado
        if(!(botaoObjeto->isPressed)){
            botaoObjeto->depressTime.start();
            botaoObjeto->isPressed = 1;
            lcd.SetTextColor(LCD_COLOR_DARKBLUE);
            lcd.FillRect(botaoObjeto->retanguloObjeto.x, botaoObjeto->retanguloObjeto.y, botaoObjeto->retanguloObjeto.largura, botaoObjeto->retanguloObjeto.altura);
            lcd.SetTextColor(LCD_COLOR_BLACK);
            lcd.DrawRect(botaoObjeto->retanguloObjeto.x, botaoObjeto->retanguloObjeto.y, botaoObjeto->retanguloObjeto.largura, botaoObjeto->retanguloObjeto.altura);
            }
     }else{
        //Se ele estava pressionado
        if((botaoObjeto->isPressed)){
            botaoObjeto->depressTime.stop();
            botaoObjeto->isPressed = 0;
            if(botaoObjeto->depressTime.read() > TEMPO_PRESSIONADO_BOTAO){
                botaoObjeto->updateFlag = 1;
            }
            lcd.SetTextColor(LCD_COLOR_BLUE);
            lcd.FillRect(botaoObjeto->retanguloObjeto.x, botaoObjeto->retanguloObjeto.y, botaoObjeto->retanguloObjeto.largura, botaoObjeto->retanguloObjeto.altura);
            lcd.SetTextColor(LCD_COLOR_BLACK);
            lcd.DrawRect(botaoObjeto->retanguloObjeto.x, botaoObjeto->retanguloObjeto.y, botaoObjeto->retanguloObjeto.largura, botaoObjeto->retanguloObjeto.altura);
        }
    }
}

void resetTela(){
    lcd.SetFont(&Font24);
    lcd.Clear(LCD_COLOR_WHITE);
    lcd.SetBackColor(LCD_COLOR_WHITE);
    lcd.SetTextColor(LCD_COLOR_BLACK);
    lcd.DrawRect(22, 18, 272, 147);
    lcd.SetTextColor(LCD_COLOR_RED);
    lcd.FillRect(baseBotaoReset.x, baseBotaoReset.y, baseBotaoReset.largura, baseBotaoReset.altura);
    lcd.SetTextColor(LCD_COLOR_GREEN);
    lcd.FillRect(baseBotaoAprender.x, baseBotaoAprender.y, baseBotaoAprender.largura, baseBotaoAprender.altura);
    lcd.SetTextColor(LCD_COLOR_GRAY);
    lcd.FillRect(baseBotaoConfigurarVoltar.x, baseBotaoConfigurarVoltar.y, baseBotaoConfigurarVoltar.largura, baseBotaoConfigurarVoltar.altura);
    lcd.SetTextColor(LCD_COLOR_BLACK);
    lcd.DrawRect(baseBotaoReset.x, baseBotaoReset.y, baseBotaoReset.largura, baseBotaoReset.altura);
    lcd.DrawRect(baseBotaoAprender.x, baseBotaoAprender.y, baseBotaoAprender.largura, baseBotaoAprender.altura);
    lcd.DrawRect(baseBotaoConfigurarVoltar.x, baseBotaoConfigurarVoltar.y, baseBotaoConfigurarVoltar.largura, baseBotaoConfigurarVoltar.altura);
}

void aprender(uint8_t status){
    uint8_t text[30];
    sprintf((char*)text, "Aprender: %d", status + 1);
    lcd.DisplayStringAt(37, 83, (uint8_t *)text, LEFT_MODE);
}

//Funções chamadas pelo clique do botão(callback)
void botaoReset_callback(){
    lcd.DisplayStringAt(37, 83,(uint8_t *)"Reset      ", LEFT_MODE);
    botaoReset.updateFlag = 0;
}

void botaoAprender_callback(){
    lcd.DisplayStringAt(37, 83, (uint8_t *)"Aprender  ", LEFT_MODE);
    botaoAprender.updateFlag = 0;
    lcd.DrawBitmap(0,0,(uint8_t *)img);
}

void botaoConfigurarVoltar_callback(){
    lcd.DisplayStringAt(37, 83, (uint8_t *)"Configurar", LEFT_MODE);
    botaoConfigurarVoltar.updateFlag = 0;
    
}

void desenhaBotao(){
    lcd.SetTextColor(LCD_COLOR_CYAN)
    lcd.FillCircle(330,76,32);
}
    
int main()
{
    uint16_t x, y;
    uint8_t text[30];
    uint8_t status = 0;
    uint8_t idx;
    uint8_t cleared = 0;
    uint8_t prev_nb_touches = 0;

    lcd.DisplayStringAt(0, LINE(5), (uint8_t *)"CFM SOLIDTEC", CENTER_MODE);
    wait(1);

    //Desenha tela Inicial
    resetTela();
    desenhaBotao();
    
    while(1) {
        //Inicia os controles
        ts.ResetTouchData(&TS_State);
        ts.GetState(&TS_State);
        iniciarBotao(&botaoReset, &TS_State);
        iniciarBotao(&botaoAprender, &TS_State);
        iniciarBotao(&botaoConfigurarVoltar, &TS_State);
        
        if(status < 3){
            aprender(status);
        
        }
        
        
        //Ação caso tenha clicado no botão
        if(botaoReset.updateFlag){
            botaoReset_callback();
        }
        if(botaoAprender.updateFlag){
            botaoAprender_callback();
        }
        if(botaoConfigurarVoltar.updateFlag){
            status++;
            botaoConfigurarVoltar_callback();
        }
    }
}