
Version1
Dependencies: BSP_DISCO_F746NG DHT22
gauge.cpp@0:d60753bdf6d7, 2020-06-22 (annotated)
- Committer:
- antoinnneee
- Date:
- Mon Jun 22 15:16:28 2020 +0000
- Revision:
- 0:d60753bdf6d7
FirstCommit;
Who changed what in which revision?
User | Revision | Line number | New 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 |