Funções Solidtec

tela.cpp

Committer:
marcusncunha
Date:
2018-11-06
Revision:
1:392e0e10ccf7
Parent:
0:73f074c39876

File content as of revision 1:392e0e10ccf7:

#include "tela.h"

LCD_DISCO_F746NG _lcd;

void desenharImagem(const unsigned long *PICTURE, uint16_t largura, uint16_t altura,uint16_t posX, uint16_t posY){
    int i;
    int j;
    int contadorImagem = 0;
    for (i=0; i<altura; i++){
        for (j=0; j<largura; j++){
            _lcd.DrawPixel(j + posX,i + posY,PICTURE[contadorImagem]);
            contadorImagem++;
        }
    }
}

void desenharImagemKey(const unsigned long *PICTURE, dadosImagem imagem, uint32_t corDeFundo,uint16_t posX, uint16_t posY){
    int i;
    int j;
    int contadorKey = 0;
    for (i=0; i<imagem.altura; i++){
        for (j=0; j<imagem.largura; j++){
            if (PICTURE[contadorKey] == imagem.corKey){
                _lcd.DrawPixel(j + posX,i + posY,corDeFundo);
            }
            else
            {   
                _lcd.DrawPixel(j + posX,i + posY,PICTURE[contadorKey]);
            }    
            contadorKey++;
        }
    }
}

void desenhaBotaoComImagem (const unsigned long *PICTURE, dadosImagem imagem, uint32_t cor, botao *botaoObjeto){
    int xDaImagem = botaoObjeto->retanguloObjeto.x + (botaoObjeto->retanguloObjeto.largura - imagem.largura) / 2;
    int yDaImagem = botaoObjeto->retanguloObjeto.y + (botaoObjeto->retanguloObjeto.altura - imagem.altura) / 2;
    _lcd.SetTextColor(cor);
    _lcd.FillRect(botaoObjeto->retanguloObjeto.x, botaoObjeto->retanguloObjeto.y, botaoObjeto->retanguloObjeto.largura, botaoObjeto->retanguloObjeto.altura);
    desenharImagemKey(PICTURE, imagem, cor, xDaImagem, yDaImagem);
}

void desenhaBotao(uint32_t cor, botao *botaoObjeto){
    _lcd.SetTextColor(cor);
    _lcd.FillRect(botaoObjeto->retanguloObjeto.x, botaoObjeto->retanguloObjeto.y, botaoObjeto->retanguloObjeto.largura, botaoObjeto->retanguloObjeto.altura);
}

void desenhaCaixaMensagem(const unsigned long *PICTURE, dadosImagem imagem, uint32_t corDeBordaCaixa, uint32_t corDeFundoCaixa, dadosRetanguloBase *baseMensagem){
    int xDaImagem = baseMensagem->x + (baseMensagem->largura - imagem.largura) / 2;
    int yDaImagem = baseMensagem->y + (baseMensagem->altura - imagem.altura) / 2;
    _lcd.SetTextColor(corDeFundoCaixa);
    _lcd.FillRect(baseMensagem->x, baseMensagem->y, baseMensagem->largura, baseMensagem->altura);
    desenharImagemKey(PICTURE, imagem, corDeFundoCaixa, xDaImagem, yDaImagem);
    _lcd.SetTextColor(corDeBordaCaixa);
    _lcd.DrawRect(baseMensagem->x, baseMensagem->y, baseMensagem->largura, baseMensagem->altura);
}

void iniciarBotaoArea(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;
          }
     }else{
        //Se ele estava pressionado
        if((botaoObjeto->isPressed)){
            botaoObjeto->depressTime.stop();
            botaoObjeto->isPressed = 0;
            if(botaoObjeto->depressTime.read() > TEMPO_PRESSIONADO_BOTAO){
                botaoObjeto->updateFlag = 1;
            }
        }
    }
}

void iniciarBotaoComImagem(const unsigned long *PICTURE, dadosImagem imagem, uint32_t corSemClick, uint32_t corComClick, 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;
            desenhaBotaoComImagem (PICTURE, imagem, corComClick, botaoObjeto);
          }
     }else{
        //Se ele estava pressionado
        if((botaoObjeto->isPressed)){
            botaoObjeto->depressTime.stop();
            botaoObjeto->isPressed = 0;
            if(botaoObjeto->depressTime.read() > TEMPO_PRESSIONADO_BOTAO){
                botaoObjeto->updateFlag = 1;
            }
            desenhaBotaoComImagem (PICTURE, imagem, corSemClick, botaoObjeto);
        }
    }
}

void desenhaBotaoComLabel(string label, int tamanhoFonte, uint32_t corSemClickLabel, uint32_t corSemClick, botao *botaoObjeto){
    int diferencaX = 0;
    int diferencaY = 0;
    switch(tamanhoFonte){
        case 16:
            _lcd.SetFont(&Font16);
            diferencaX = label.length() * 12;
            diferencaY = 15;
        break;
        case 20:
            _lcd.SetFont(&Font20);
            diferencaX = label.length() * 15;
            diferencaY = 20;
        break;
        case 24:
            _lcd.SetFont(&Font16);
            diferencaX = label.length() * 18;
            diferencaY = 25;
        break;
        default:
            _lcd.SetFont(&Font12);
            diferencaX = label.length() * 7;
            diferencaY = 10;
        break;
    }
    int xDoLabel = botaoObjeto->retanguloObjeto.x + (botaoObjeto->retanguloObjeto.largura - diferencaX) / 2;
    int yDoLabel = botaoObjeto->retanguloObjeto.y + (botaoObjeto->retanguloObjeto.altura - diferencaY) / 2;
    
    desenhaBotao(corSemClick, botaoObjeto);
    _lcd.SetTextColor(corSemClickLabel);
    _lcd.SetBackColor(corSemClick);
    _lcd.DisplayStringAt(xDoLabel, yDoLabel, (uint8_t *)label.c_str(), LEFT_MODE);
}

void iniciarBotaoComLabel(string label, int tamanhoFonte, uint32_t corSemClickLabel, uint32_t corComClickLabel, uint32_t corSemClick, uint32_t corComClick, botao *botaoObjeto, TS_StateTypeDef *toqueTela){
    bool isDentroBotaoX = 0;
    bool isDentroBotaoY = 0;
    int diferencaX = 0;
    int diferencaY = 0;
    switch(tamanhoFonte){
        case 16:
            _lcd.SetFont(&Font16);
            diferencaX = label.length() * 12;
            diferencaY = 15;
        break;
        case 20:
            _lcd.SetFont(&Font20);
            diferencaX = label.length() * 15;
            diferencaY = 20;
        break;
        case 24:
            _lcd.SetFont(&Font16);
            diferencaX = label.length() * 18;
            diferencaY = 25;
        break;
        default:
            _lcd.SetFont(&Font12);
            diferencaX = label.length() * 7;
            diferencaY = 10;
        break;
    }
    int xDoLabel = botaoObjeto->retanguloObjeto.x + (botaoObjeto->retanguloObjeto.largura - diferencaX) / 2;
    int yDoLabel = botaoObjeto->retanguloObjeto.y + (botaoObjeto->retanguloObjeto.altura - diferencaY) / 2;
    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;
            desenhaBotao(corComClick, botaoObjeto);
            _lcd.SetTextColor(corComClickLabel);
            _lcd.SetBackColor(corComClick);
            _lcd.DisplayStringAt(xDoLabel, yDoLabel, (uint8_t *)label.c_str(), LEFT_MODE);
          }
     }else{
        //Se ele estava pressionado
        if((botaoObjeto->isPressed)){
            botaoObjeto->depressTime.stop();
            botaoObjeto->isPressed = 0;
            if(botaoObjeto->depressTime.read() > TEMPO_PRESSIONADO_BOTAO){
                botaoObjeto->updateFlag = 1;
            }
            desenhaBotao(corSemClick, botaoObjeto);
            _lcd.SetTextColor(corSemClickLabel);
            _lcd.SetBackColor(corSemClick);
            _lcd.DisplayStringAt(xDoLabel, yDoLabel, (uint8_t *)label.c_str(), LEFT_MODE);
        }
    }
}

void iniciarBotaoComImagemClick(const unsigned long *PICTURE, const unsigned long *PICTURECLK, dadosImagem imagem, dadosImagem imagemClk,uint32_t corSemClick, uint32_t corComClick, 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;
            desenhaBotaoComImagem (PICTURECLK, imagemClk, corComClick, botaoObjeto);
          }
     }else{
        //Se ele estava pressionado
        if((botaoObjeto->isPressed)){
            botaoObjeto->depressTime.stop();
            botaoObjeto->isPressed = 0;
            if(botaoObjeto->depressTime.read() > TEMPO_PRESSIONADO_BOTAO){
                botaoObjeto->updateFlag = 1;
            }
            desenhaBotaoComImagem (PICTURE, imagem, corSemClick, botaoObjeto);
        }
    }
}

void escreverInteiroTelaDireita(int variavel, int x, int y){
    char txtTemporario[50];
    sprintf(txtTemporario, "%d", variavel);
    _lcd.DisplayStringAt(x, y, (uint8_t *)&txtTemporario, RIGHT_MODE);
}

void escreverInteiroTelaEsquerda(int variavel, int x, int y){
    char txtTemporario[50];
    sprintf(txtTemporario, "%d", variavel);
    _lcd.DisplayStringAt(x, y, (uint8_t *)&txtTemporario, LEFT_MODE);
}

void escreverDoubleTelaDireita(double variavel, int x, int y){
    char txtTemporario[50];
    sprintf(txtTemporario, "%.2f", variavel);
    _lcd.DisplayStringAt(x, y, (uint8_t *)&txtTemporario, RIGHT_MODE);
}

void escreverDoubleTelaEsquerda(double variavel, int x, int y){
    char txtTemporario[50];
    sprintf(txtTemporario, "%.2f", variavel);
    _lcd.DisplayStringAt(x, y, (uint8_t *)&txtTemporario, LEFT_MODE);
}