Version1

Dependencies:   BSP_DISCO_F746NG DHT22

Committer:
antoinnneee
Date:
Mon Jun 22 15:16:28 2020 +0000
Revision:
0:d60753bdf6d7
FirstCommit;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
antoinnneee 0:d60753bdf6d7 1
antoinnneee 0:d60753bdf6d7 2 #include "mbed.h"
antoinnneee 0:d60753bdf6d7 3 #include "stm32746g_discovery_lcd.h"
antoinnneee 0:d60753bdf6d7 4 #include "gauge.h"
antoinnneee 0:d60753bdf6d7 5
antoinnneee 0:d60753bdf6d7 6 Serial pc(USBTX, USBRX, 115200);
antoinnneee 0:d60753bdf6d7 7
antoinnneee 0:d60753bdf6d7 8 Gauge::Gauge(int x, int y, int width, int height, uint32_t bgColor, uint32_t borderWidth)
antoinnneee 0:d60753bdf6d7 9 : m_x(x), m_y(y), m_width(width), m_height(height), m_bgColor(bgColor), m_borderWidth(borderWidth)
antoinnneee 0:d60753bdf6d7 10 {
antoinnneee 0:d60753bdf6d7 11 m_delta = m_limHigh - m_limLow;
antoinnneee 0:d60753bdf6d7 12 m_offset = -m_limLow;
antoinnneee 0:d60753bdf6d7 13 memset(m_text, 0, 30);
antoinnneee 0:d60753bdf6d7 14 }
antoinnneee 0:d60753bdf6d7 15
antoinnneee 0:d60753bdf6d7 16 void Gauge::setLimit(int low, int high)
antoinnneee 0:d60753bdf6d7 17 {
antoinnneee 0:d60753bdf6d7 18 m_limHigh = high;
antoinnneee 0:d60753bdf6d7 19 m_limLow = low;
antoinnneee 0:d60753bdf6d7 20 m_delta = m_limHigh - m_limLow;
antoinnneee 0:d60753bdf6d7 21 m_offset = -m_limLow;
antoinnneee 0:d60753bdf6d7 22 }
antoinnneee 0:d60753bdf6d7 23
antoinnneee 0:d60753bdf6d7 24 int Gauge::strlen(uint8_t *str)
antoinnneee 0:d60753bdf6d7 25 {
antoinnneee 0:d60753bdf6d7 26 int i = 0;
antoinnneee 0:d60753bdf6d7 27 while(str[i])
antoinnneee 0:d60753bdf6d7 28 i++;
antoinnneee 0:d60753bdf6d7 29 return i;
antoinnneee 0:d60753bdf6d7 30 }
antoinnneee 0:d60753bdf6d7 31
antoinnneee 0:d60753bdf6d7 32 void Gauge::setColorType(uint8_t type)
antoinnneee 0:d60753bdf6d7 33 {
antoinnneee 0:d60753bdf6d7 34 m_colorType = type;
antoinnneee 0:d60753bdf6d7 35 }
antoinnneee 0:d60753bdf6d7 36
antoinnneee 0:d60753bdf6d7 37 uint32_t Gauge::getColor(uint32_t position)
antoinnneee 0:d60753bdf6d7 38 {
antoinnneee 0:d60753bdf6d7 39 float coef = ((float)m_height) / (float)m_delta;
antoinnneee 0:d60753bdf6d7 40
antoinnneee 0:d60753bdf6d7 41 uint8_t red = 255 - ((position * 255) / m_delta) / coef;
antoinnneee 0:d60753bdf6d7 42 uint8_t blue = 255 - red;
antoinnneee 0:d60753bdf6d7 43 uint32_t color = 0;
antoinnneee 0:d60753bdf6d7 44
antoinnneee 0:d60753bdf6d7 45 if (m_colorType == 0)
antoinnneee 0:d60753bdf6d7 46 color = blue + (red <<16) + (255<<24);
antoinnneee 0:d60753bdf6d7 47 else
antoinnneee 0:d60753bdf6d7 48 color = red + (blue <<8) + (255<<24);
antoinnneee 0:d60753bdf6d7 49
antoinnneee 0:d60753bdf6d7 50 return color;
antoinnneee 0:d60753bdf6d7 51 }
antoinnneee 0:d60753bdf6d7 52
antoinnneee 0:d60753bdf6d7 53 void Gauge::drawBorder()
antoinnneee 0:d60753bdf6d7 54 {
antoinnneee 0:d60753bdf6d7 55 int x = m_x;
antoinnneee 0:d60753bdf6d7 56 int y = m_y;
antoinnneee 0:d60753bdf6d7 57 while(y < m_y+m_height)
antoinnneee 0:d60753bdf6d7 58 {
antoinnneee 0:d60753bdf6d7 59 BSP_LCD_DrawPixel(m_x, y, m_borderColor);
antoinnneee 0:d60753bdf6d7 60 BSP_LCD_DrawPixel(m_x + m_width, y, m_borderColor);
antoinnneee 0:d60753bdf6d7 61 y++;
antoinnneee 0:d60753bdf6d7 62 }
antoinnneee 0:d60753bdf6d7 63 while(x < m_x+m_width)
antoinnneee 0:d60753bdf6d7 64 {
antoinnneee 0:d60753bdf6d7 65 BSP_LCD_DrawPixel(x, m_y, m_borderColor);
antoinnneee 0:d60753bdf6d7 66 BSP_LCD_DrawPixel(x, m_y + m_height, m_borderColor);
antoinnneee 0:d60753bdf6d7 67 x++;
antoinnneee 0:d60753bdf6d7 68 }
antoinnneee 0:d60753bdf6d7 69 }
antoinnneee 0:d60753bdf6d7 70
antoinnneee 0:d60753bdf6d7 71 void Gauge::draw()
antoinnneee 0:d60753bdf6d7 72 {
antoinnneee 0:d60753bdf6d7 73 drawBorder();
antoinnneee 0:d60753bdf6d7 74 int percentValue = getGaugePercentValue(m_value);
antoinnneee 0:d60753bdf6d7 75
antoinnneee 0:d60753bdf6d7 76 int x = m_x+1;
antoinnneee 0:d60753bdf6d7 77 while (x < m_x + m_width) {
antoinnneee 0:d60753bdf6d7 78 int y = m_y +1;
antoinnneee 0:d60753bdf6d7 79 while (y < m_y + m_height) {
antoinnneee 0:d60753bdf6d7 80 uint32_t color = 0;
antoinnneee 0:d60753bdf6d7 81 if (percentValue < 100 - getGaugePercentPosition(y))
antoinnneee 0:d60753bdf6d7 82 color = LCD_COLOR_LIGHTGRAY;
antoinnneee 0:d60753bdf6d7 83 else
antoinnneee 0:d60753bdf6d7 84 color = getColor(y - m_y);
antoinnneee 0:d60753bdf6d7 85 BSP_LCD_DrawPixel(x, y, color);
antoinnneee 0:d60753bdf6d7 86 y++;
antoinnneee 0:d60753bdf6d7 87 }
antoinnneee 0:d60753bdf6d7 88 x++;
antoinnneee 0:d60753bdf6d7 89 }
antoinnneee 0:d60753bdf6d7 90 printValue();
antoinnneee 0:d60753bdf6d7 91 printRange();
antoinnneee 0:d60753bdf6d7 92 printText();
antoinnneee 0:d60753bdf6d7 93 }
antoinnneee 0:d60753bdf6d7 94
antoinnneee 0:d60753bdf6d7 95 void Gauge::printValue()
antoinnneee 0:d60753bdf6d7 96 {
antoinnneee 0:d60753bdf6d7 97 memset(tValue, 0, 6);
antoinnneee 0:d60753bdf6d7 98 sprintf(tValue, "%d", m_value);
antoinnneee 0:d60753bdf6d7 99 BSP_LCD_DisplayStringAt((m_x + m_width/2)- 8*(strlen((uint8_t *)tValue)/2), (m_y + m_height) + 5, (uint8_t *)&tValue, LEFT_MODE);
antoinnneee 0:d60753bdf6d7 100 }
antoinnneee 0:d60753bdf6d7 101
antoinnneee 0:d60753bdf6d7 102 void Gauge::printText()
antoinnneee 0:d60753bdf6d7 103 {
antoinnneee 0:d60753bdf6d7 104 BSP_LCD_DisplayStringAt((m_x + m_width/2)- 8*(strlen((uint8_t *)m_text)/2), m_y - 15, (uint8_t *)&m_text, LEFT_MODE);
antoinnneee 0:d60753bdf6d7 105 }
antoinnneee 0:d60753bdf6d7 106
antoinnneee 0:d60753bdf6d7 107 void Gauge::printRange()
antoinnneee 0:d60753bdf6d7 108 {
antoinnneee 0:d60753bdf6d7 109 memset(textValue, 0, 6);
antoinnneee 0:d60753bdf6d7 110
antoinnneee 0:d60753bdf6d7 111 sprintf(textValue, "%d", m_limLow);
antoinnneee 0:d60753bdf6d7 112 BSP_LCD_DisplayStringAt(m_x- 8*(strlen((uint8_t *)textValue)), m_y + m_height - 12, (uint8_t *)&textValue, LEFT_MODE);
antoinnneee 0:d60753bdf6d7 113 sprintf(textValue, "%d", m_limHigh);
antoinnneee 0:d60753bdf6d7 114 BSP_LCD_DisplayStringAt(m_x- 8*(strlen((uint8_t *)textValue)), m_y, (uint8_t *)&textValue, LEFT_MODE);
antoinnneee 0:d60753bdf6d7 115 sprintf(textValue, "%d", (m_limHigh + m_limLow)/2);
antoinnneee 0:d60753bdf6d7 116 BSP_LCD_DisplayStringAt(m_x- 8*(strlen((uint8_t *)textValue)), m_y + m_height/2 - 8, (uint8_t *)&textValue, LEFT_MODE);
antoinnneee 0:d60753bdf6d7 117 }
antoinnneee 0:d60753bdf6d7 118
antoinnneee 0:d60753bdf6d7 119 void Gauge::setValue(int value)
antoinnneee 0:d60753bdf6d7 120 {
antoinnneee 0:d60753bdf6d7 121 m_value = value;
antoinnneee 0:d60753bdf6d7 122 printValue();
antoinnneee 0:d60753bdf6d7 123 draw();
antoinnneee 0:d60753bdf6d7 124 }
antoinnneee 0:d60753bdf6d7 125 void Gauge::setText(const char* str)
antoinnneee 0:d60753bdf6d7 126 {
antoinnneee 0:d60753bdf6d7 127 sprintf((char*)m_text, str);
antoinnneee 0:d60753bdf6d7 128 }
antoinnneee 0:d60753bdf6d7 129
antoinnneee 0:d60753bdf6d7 130 int8_t Gauge::getGaugePercentValue(int value)
antoinnneee 0:d60753bdf6d7 131 {
antoinnneee 0:d60753bdf6d7 132 // ((input - min) * 100) / (max - min)
antoinnneee 0:d60753bdf6d7 133 uint32_t delta = m_limHigh - m_limLow;
antoinnneee 0:d60753bdf6d7 134
antoinnneee 0:d60753bdf6d7 135 int32_t perc = ((value - m_limLow) * 100) / (delta);
antoinnneee 0:d60753bdf6d7 136 return perc;
antoinnneee 0:d60753bdf6d7 137 }
antoinnneee 0:d60753bdf6d7 138
antoinnneee 0:d60753bdf6d7 139 int8_t Gauge::getGaugePercentPosition(int value)
antoinnneee 0:d60753bdf6d7 140 {
antoinnneee 0:d60753bdf6d7 141 // ((input - min) * 100) / (max - min)
antoinnneee 0:d60753bdf6d7 142 uint32_t delta = (m_height + m_y) - m_y;
antoinnneee 0:d60753bdf6d7 143
antoinnneee 0:d60753bdf6d7 144 int32_t perc = ((value - m_y) * 100) / (delta);
antoinnneee 0:d60753bdf6d7 145 return perc;
antoinnneee 0:d60753bdf6d7 146 }
antoinnneee 0:d60753bdf6d7 147