WatchyWatchFace/src/SevenSegment.cpp
2023-05-30 00:55:16 +03:00

95 lines
3.3 KiB
C++

#include "SevenSegment.h"
SevenSegment::SevenSegment(uint16_t digitWidth,
uint16_t digitHeight,
uint16_t digitGap,
uint16_t segmentThickness,
uint16_t segmentGap)
: m_digitWidth(digitWidth),
m_digitHeight(digitHeight),
m_digitGap(digitGap),
m_segmentThickness(segmentThickness),
m_segmentGap(segmentGap)
{
}
void SevenSegment::DrawDigit(GxEPD2_BW<WatchyDisplayBase,
WatchyDisplayBase::HEIGHT> & display,
uint8_t digit,
uint16_t x,
uint16_t y,
uint8_t color)
{
if (digit > 9) {
return;
}
uint16_t digitX = x;
uint16_t digitY = y;
uint8_t drawcolors[] = { (uint8_t) (color ^ 0xFF) ,
(uint8_t) color };
// top top-right bottom-right bottom bottom-left top-left middle
const bool drawSegments[10][7] = {
{ true, true, true, true, true, true, false },
{ false, true, true, false, false, false, false },
{ true, true, false, true, true, false, true },
{ true, true, true, true, false, false, true },
{ false, true, true, false, false, true, true },
{ true, false, true, true, false, true, true },
{ true, false, true, true, true, true, true },
{ true, true, true, false, false, false, false },
{ true, true, true, true, true, true, true },
{ true, true, true, true, false, true, true }
};
const bool * segments = drawSegments[digit];
// Top
display.fillRect(digitX + m_segmentThickness,
digitY,
m_digitWidth - 2 * m_segmentThickness,
m_segmentThickness,
drawcolors[segments[0]]);
// Top-right
display.fillRect(digitX + m_digitWidth - m_segmentThickness,
digitY + m_segmentThickness,
m_segmentThickness,
m_digitHeight / 2 - m_segmentThickness * 2,
drawcolors[segments[1]]);
// Bottom-right
display.fillRect(digitX + m_digitWidth - m_segmentThickness,
digitY + m_digitHeight / 2, m_segmentThickness,
m_digitHeight / 2 - m_segmentThickness * 2,
drawcolors[segments[2]]);
// Bottom
display.fillRect(digitX + m_segmentThickness,
digitY + m_digitHeight - m_segmentThickness * 2,
m_digitWidth - 2 * m_segmentThickness,
m_segmentThickness,
drawcolors[segments[3]]);
// Bottom-left
display.fillRect(digitX,
digitY + m_digitHeight / 2,
m_segmentThickness, m_digitHeight / 2 - m_segmentThickness * 2,
drawcolors[segments[4]]);
// Top-left
display.fillRect(digitX,
digitY + m_segmentThickness,
m_segmentThickness,
m_digitHeight / 2 - m_segmentThickness * 2,
drawcolors[segments[5]]);
// Middle
display.fillRect(digitX + m_segmentThickness,
digitY + m_digitHeight / 2 - m_segmentThickness,
m_digitWidth - 2 * m_segmentThickness,
m_segmentThickness,
drawcolors[segments[6]]);
}