Teste de Tela

Dependencies:   BSP_DISCO_F746NG LCD_DISCO_F746NG TS_DISCO_F746NG mbed

main.cpp

Committer:
marcusncunha
Date:
2017-06-30
Revision:
1:c04c41de6eef
Parent:
0:9b2b74c6af2f
Child:
2:ae8636da1252

File content as of revision 1:c04c41de6eef:

#include "mbed.h"
#include "TS_DISCO_F746NG.h"
#include "LCD_DISCO_F746NG.h"
#include "codigoBotaoReset.h"
#include "logo.h"
#define TEMPO_PRESSIONADO_BOTAO 0.01000f

LCD_DISCO_F746NG lcd;
TS_DISCO_F746NG ts;
TS_StateTypeDef TS_State;
Serial pc (USBTX, USBRX);

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 desenharImagem(){
    uint16_t larg = 100;
    uint16_t alt = 32;
    int i;
    int j;
    int contador = 0;
    for (i=0; i<alt; i++){
        for (j=0; j<larg; j++){
            lcd.DrawPixel(j,i,LOGOSOLID[contador]);
            //pc.printf("%d;",LOGOSOLID[contador]);
            contador++;
        }
    }
}
    

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();
    lcd.Clear(LCD_COLOR_RED);
    desenharImagem();
    pc.printf("%d",LCD_COLOR_WHITE);
    
    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();
            pc.printf("Botao Reset");
        }
        if(botaoAprender.updateFlag){
            botaoAprender_callback();
            pc.printf("Botao Aprender");
        }
        if(botaoConfigurarVoltar.updateFlag){
            status++;
            botaoConfigurarVoltar_callback();
            pc.printf("Botao Configurar/Voltar");
        }
    }
}