summaryrefslogtreecommitdiffstats
path: root/src/device/screen.cpp
diff options
context:
space:
mode:
authorGravatar Ramūnas Mažeikis <ramunasnezinomas@gmail.com> 2019-05-27 23:12:42 +0300
committerGravatar Ramūnas Mažeikis <ramunasnezinomas@gmail.com> 2019-05-27 23:12:42 +0300
commitbf8b16d036e60eec56a42cbfcf012390c143e699 (patch)
tree147631af48a0b306162365147384f7dd9d1558b8 /src/device/screen.cpp
parente37b3eacefef04258a6dc6e8714da249d2ff9c1d (diff)
downloadusurpation-bf8b16d036e60eec56a42cbfcf012390c143e699.tar.gz
usurpation-bf8b16d036e60eec56a42cbfcf012390c143e699.tar.bz2
usurpation-bf8b16d036e60eec56a42cbfcf012390c143e699.zip
Screen: implementation of drawing and trivial docs.
Signed-off-by: Ramūnas Mažeikis <ramunasnezinomas@gmail.com>
Diffstat (limited to 'src/device/screen.cpp')
-rw-r--r--src/device/screen.cpp70
1 files changed, 70 insertions, 0 deletions
diff --git a/src/device/screen.cpp b/src/device/screen.cpp
new file mode 100644
index 0000000..cfabcc5
--- /dev/null
+++ b/src/device/screen.cpp
@@ -0,0 +1,70 @@
+#include <time.h>
+#include <stdlib.h>
+#include <string.h>
+#include <SSD1306Brzo.h>
+#include <Wire.h>
+#include "screen.h"
+
+void draw_lines(struct display_status *status);
+void update_lines(struct display_status *status);
+void init_msg(char *msg, size_t size);
+
+void display_status_init(struct display_status *status, char *msg)
+{
+ status->delta = 2; /* Currently default */
+ init_msg(msg, strlen(msg));
+ status->message = msg;
+ status->line_cursor = 0;
+ status->last_scroll_time = time(NULL);
+ update_lines(status);
+}
+
+/**
+ * Turns all whitespace into literal spaces to save screen real-estate and
+ * possible misinterpretation.
+ */
+void init_msg(char *msg, size_t size)
+{
+ size_t i;
+
+ for (i = 0; i < size; i++) {
+ switch (msg[i]) {
+ case '\n':
+ case '\t':
+ case '\r':
+ msg[i] = ' ';
+ break;
+ case '\0':
+ goto end;
+ default:
+ break;
+ }
+ }
+end:
+ return;
+}
+
+void display_update_scroll(struct display_status *status)
+{
+ time_t crr_time = time(NULL);
+ /* Only scroll lines once a delta, because --- duh! */
+ if (status->last_scroll_time - crr_time > status->delta) {
+ status->last_scroll_time += status->delta;
+ status->line_cursor++;
+ update_lines(status);
+ draw_lines(status);
+ }
+}
+
+void draw_lines(SSD1306Brzo *screen, struct display_status *status)
+{
+ screen->clear();
+ screen->drawString(0, 0, status->first_line);
+ screen->drawString(0, SCREEN_HEIGHT / 2, status->second_line);
+}
+
+void update_lines(struct display_status *status)
+{
+ status->first_line = get_line(status, status->line_cursor);
+ status->second_line = get_line(status, status->line_cursor + 1);
+} \ No newline at end of file