Use the builtin RTC and display it
Its roughly %15 fast, and initializes to zero, but the display currently shows HH:MM:SS AM/PM.
This commit is contained in:
38
display.c
38
display.c
@@ -89,10 +89,25 @@ static void display_spi_init(struct display *display)
|
||||
void display_init(struct display *display, SPI_TypeDef* spi)
|
||||
{
|
||||
display->spi = spi;
|
||||
display->is_dirty = true;
|
||||
display->dirty_line_min = 0;
|
||||
display->dirty_line_max = DISPLAY_HEIGHT - 1;
|
||||
display_buffer_init(&display->buffer);
|
||||
display_spi_init(display);
|
||||
}
|
||||
|
||||
static void display_set_dirty(struct display *display, unsigned int y)
|
||||
{
|
||||
if (!display->is_dirty) {
|
||||
display->is_dirty = true;
|
||||
display->dirty_line_min = y;
|
||||
display->dirty_line_max = y;
|
||||
} else {
|
||||
display->dirty_line_min = MIN(y, display->dirty_line_min);
|
||||
display->dirty_line_max = MAX(y, display->dirty_line_max);
|
||||
}
|
||||
}
|
||||
|
||||
void display_set_bit(struct display *display, unsigned int x, unsigned int y, uint8_t val)
|
||||
{
|
||||
if (x >= DISPLAY_WIDTH || y >= DISPLAY_HEIGHT) {
|
||||
@@ -106,6 +121,8 @@ void display_set_bit(struct display *display, unsigned int x, unsigned int y, ui
|
||||
} else {
|
||||
SET_POS(*byte, x & 7);
|
||||
}
|
||||
|
||||
display_set_dirty(display, y);
|
||||
}
|
||||
|
||||
void display_set_byte(struct display *display, unsigned int x, unsigned int y, uint8_t val)
|
||||
@@ -120,6 +137,7 @@ void display_set_byte(struct display *display, unsigned int x, unsigned int y, u
|
||||
|
||||
struct display_line *line = &display->buffer.lines[y];
|
||||
line->data[x >> 3] = val;
|
||||
display_set_dirty(display, y);
|
||||
}
|
||||
|
||||
void display_char_at(struct display *display, int *x_off, int y_off, char c, const struct font *font)
|
||||
@@ -129,7 +147,8 @@ void display_char_at(struct display *display, int *x_off, int y_off, char c, con
|
||||
return;
|
||||
}
|
||||
|
||||
int byte_cols = 1; // TODO: Don't hardcode this
|
||||
// TODO: Don't hardcode this
|
||||
int byte_cols = 1;
|
||||
for (size_t x = 0; x < g->cols; x++) {
|
||||
for (size_t y = 0; y < g->rows; y++) {
|
||||
int byte_x = x >> 3;
|
||||
@@ -153,10 +172,25 @@ void display_string_at(struct display *display, int x_off, int y_off, const char
|
||||
|
||||
void display_refresh(struct display *display)
|
||||
{
|
||||
spi_send_blocking(display->spi, (uint8_t *) &display->buffer, sizeof(display->buffer));
|
||||
if (!display->is_dirty) {
|
||||
return;
|
||||
}
|
||||
|
||||
uint8_t *start = (uint8_t *) &display->buffer.lines[display->dirty_line_min];
|
||||
// Data size
|
||||
size_t size = sizeof(display->buffer.lines[0]) *
|
||||
(display->dirty_line_max - display->dirty_line_min + 1);
|
||||
// Trailer dummy data
|
||||
size += 2;
|
||||
|
||||
spi_send_blocking(display->spi, start , size);
|
||||
display->is_dirty = false;
|
||||
}
|
||||
|
||||
void display_clear(struct display *display)
|
||||
{
|
||||
display_buffer_init(&display->buffer);
|
||||
display->is_dirty = true;
|
||||
display->dirty_line_min = 0;
|
||||
display->dirty_line_max = DISPLAY_HEIGHT - 1;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user