GameCounter/Source/src/screen/counter.c

87 lines
1.8 KiB
C

#include <stdint.h>
#include <ssd1306xled.h>
#include "counter.h"
void handleCounterScreen()
{
drawCounter(counter);
}
void drawCounter(uint16_t value)
{
if (value > 999) value = 999;
uint8_t column = DigitFullOffset;
if (value < 10)
{
// Single digit, blank left and right (prevents flicker)
blankDigitColumn(&column, SpacingLeft1);
drawDigit(&column, value);
blankDigitColumn(&column, SpacingRight1);
}
else if (value < 100)
{
// Two digits, similar but also blank the spacing
blankDigitColumn(&column, SpacingLeft2);
drawDigit(&column, value / 10);
blankDigitColumn(&column, DigitSpacing);
drawDigit(&column, value % 10);
blankDigitColumn(&column, SpacingRight2);
}
else
{
// Three digits, you know the drill by now
drawDigit(&column, value / 100);
blankDigitColumn(&column, DigitSpacing);
drawDigit(&column, (value % 100) / 10);
blankDigitColumn(&column, DigitSpacing);
drawDigit(&column, value % 10);
}
}
void drawDigit(uint8_t* column, uint8_t digit)
{
if (digit > 9) return;
uint8_t yEnd = DigitPage + DigitRows;
uint16_t bitmapOffset = digit * DigitBytesPerChar;
for (uint8_t y = DigitPage; y < yEnd; y++)
{
ssd1306_setpos(*column, y);
ssd1306_send_data_start();
for (uint8_t x = 0; x < DigitWidth; x++)
{
ssd1306_send_byte(pgm_read_byte(&Digits[bitmapOffset]));
bitmapOffset++;
}
ssd1306_send_data_stop();
}
(*column) += DigitWidth;
}
void blankDigitColumn(uint8_t* column, uint8_t width)
{
uint8_t yEnd = DigitPage + DigitRows;
for (uint8_t y = DigitPage; y < yEnd; y++)
{
ssd1306_setpos(*column, y);
ssd1306_send_data_start();
for (uint8_t i = 0; i < width; i++)
ssd1306_send_byte(0);
ssd1306_send_data_stop();
}
(*column) += width;
}