Version1

Dependencies:   BSP_DISCO_F746NG DHT22

gauge.cpp

Committer:
antoinnneee
Date:
2020-06-22
Revision:
0:d60753bdf6d7

File content as of revision 0:d60753bdf6d7:


#include "mbed.h"
#include "stm32746g_discovery_lcd.h"
#include "gauge.h"

Serial pc(USBTX, USBRX, 115200);

Gauge::Gauge(int x, int y, int width, int height, uint32_t bgColor, uint32_t borderWidth)
    : m_x(x), m_y(y), m_width(width), m_height(height), m_bgColor(bgColor), m_borderWidth(borderWidth)
{
    m_delta = m_limHigh - m_limLow;
    m_offset = -m_limLow;
    memset(m_text, 0, 30);
}

void Gauge::setLimit(int low, int high)
{
    m_limHigh = high;
    m_limLow = low;
    m_delta = m_limHigh - m_limLow;
    m_offset = -m_limLow;    
}

int Gauge::strlen(uint8_t *str)
{
    int i = 0;
    while(str[i])
        i++;
    return i;
}

void    Gauge::setColorType(uint8_t type)
{
    m_colorType = type;    
}

uint32_t Gauge::getColor(uint32_t position)
{
    float coef = ((float)m_height) / (float)m_delta;
    
    uint8_t red = 255 - ((position * 255) / m_delta) / coef;
    uint8_t blue = 255 - red;
    uint32_t color = 0;
    
    if (m_colorType == 0)
        color = blue + (red <<16) + (255<<24);
    else
        color = red + (blue <<8) + (255<<24);
    
    return color;
}

void Gauge::drawBorder()
{
    int x = m_x;
    int y = m_y;
    while(y < m_y+m_height)
    {
        BSP_LCD_DrawPixel(m_x, y, m_borderColor);
        BSP_LCD_DrawPixel(m_x + m_width, y, m_borderColor);
        y++;
    }
    while(x < m_x+m_width)
    {
        BSP_LCD_DrawPixel(x, m_y, m_borderColor);
        BSP_LCD_DrawPixel(x, m_y + m_height, m_borderColor);
        x++;
    }    
}

void Gauge::draw()
{
    drawBorder();
    int percentValue = getGaugePercentValue(m_value);
    
    int x = m_x+1;
    while (x < m_x + m_width) {
        int y = m_y +1;
        while (y < m_y + m_height) {
            uint32_t color = 0;
            if (percentValue < 100 - getGaugePercentPosition(y))
                color = LCD_COLOR_LIGHTGRAY;
            else
                color = getColor(y - m_y);
            BSP_LCD_DrawPixel(x, y, color);
            y++;
        }
        x++;
    }
    printValue();
    printRange();
    printText();
}

void Gauge::printValue()
{
    memset(tValue, 0, 6);
    sprintf(tValue, "%d", m_value);
    BSP_LCD_DisplayStringAt((m_x + m_width/2)- 8*(strlen((uint8_t *)tValue)/2), (m_y + m_height) + 5, (uint8_t *)&tValue, LEFT_MODE);
}

void Gauge::printText()
{
    BSP_LCD_DisplayStringAt((m_x + m_width/2)- 8*(strlen((uint8_t *)m_text)/2), m_y  - 15, (uint8_t *)&m_text, LEFT_MODE);
}

void Gauge::printRange()
{
    memset(textValue, 0, 6);

    sprintf(textValue, "%d", m_limLow);
    BSP_LCD_DisplayStringAt(m_x- 8*(strlen((uint8_t *)textValue)), m_y + m_height - 12, (uint8_t *)&textValue, LEFT_MODE);
    sprintf(textValue, "%d", m_limHigh);
    BSP_LCD_DisplayStringAt(m_x- 8*(strlen((uint8_t *)textValue)), m_y, (uint8_t *)&textValue, LEFT_MODE);
    sprintf(textValue, "%d", (m_limHigh + m_limLow)/2);
    BSP_LCD_DisplayStringAt(m_x- 8*(strlen((uint8_t *)textValue)), m_y + m_height/2 - 8, (uint8_t *)&textValue, LEFT_MODE);
}

void Gauge::setValue(int value)
{
    m_value = value;
    printValue();
    draw();
}
void Gauge::setText(const char* str)
{
    sprintf((char*)m_text, str);
}

int8_t Gauge::getGaugePercentValue(int value)
{
//    ((input - min) * 100) / (max - min)
    uint32_t delta = m_limHigh - m_limLow;

    int32_t perc = ((value - m_limLow) * 100) / (delta);
    return perc;
}

int8_t Gauge::getGaugePercentPosition(int value)
{
//    ((input - min) * 100) / (max - min)
    uint32_t delta = (m_height + m_y) - m_y;

    int32_t perc = ((value - m_y) * 100) / (delta);
    return perc;
}