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:
2019-03-11 22:56:08 -07:00
parent dedcb5af71
commit d5bfecedb2
10 changed files with 285 additions and 8 deletions

View File

@@ -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;
}