summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Friesel <daniel.friesel@uos.de>2021-04-13 08:31:21 +0200
committerDaniel Friesel <daniel.friesel@uos.de>2021-04-13 08:31:21 +0200
commit168ea4b5641eb08ef24c70e94e332aaabf7e2e81 (patch)
tree0b24f7340be7e671c61d9d4f3f3c699349e2c235
parentb650f2ac498df4ba18d23ad7f02637f40917c28e (diff)
add ssd1306 bad apple skeleton
-rw-r--r--src/app/ssd1306-bad-apple/Kconfig6
-rw-r--r--src/app/ssd1306-bad-apple/Makefile.inc15
-rwxr-xr-xsrc/app/ssd1306-bad-apple/convert16
-rwxr-xr-xsrc/app/ssd1306-bad-apple/frames-to-cc42
-rw-r--r--src/app/ssd1306-bad-apple/main.cc74
5 files changed, 153 insertions, 0 deletions
diff --git a/src/app/ssd1306-bad-apple/Kconfig b/src/app/ssd1306-bad-apple/Kconfig
new file mode 100644
index 0000000..e599858
--- /dev/null
+++ b/src/app/ssd1306-bad-apple/Kconfig
@@ -0,0 +1,6 @@
+# Copyright 2020 Daniel Friesel
+#
+# SPDX-License-Identifier: CC0-1.0
+
+prompt "SSD1306 Bad Apple"
+depends on driver_ssd1306 && !wakeup
diff --git a/src/app/ssd1306-bad-apple/Makefile.inc b/src/app/ssd1306-bad-apple/Makefile.inc
new file mode 100644
index 0000000..bbe2db7
--- /dev/null
+++ b/src/app/ssd1306-bad-apple/Makefile.inc
@@ -0,0 +1,15 @@
+# vim:ft=make
+#
+# Copyright 2020 Daniel Friesel
+#
+# SPDX-License-Identifier: CC0-1.0
+
+ifdef app
+ override arch_drivers += i2c,timer
+ CONFIG_driver_ssd1306 = y
+ CONFIG_driver_ssd1306_width = 128
+ CONFIG_driver_ssd1306_height = 64
+ CONFIG_lib_inflate = y
+ CONFIG_lib_inflate_lut = y
+ CONFIG_arch_msp430fr5994lp_large_mode = y
+endif
diff --git a/src/app/ssd1306-bad-apple/convert b/src/app/ssd1306-bad-apple/convert
new file mode 100755
index 0000000..f0118dd
--- /dev/null
+++ b/src/app/ssd1306-bad-apple/convert
@@ -0,0 +1,16 @@
+#!/bin/sh
+
+# ./convert.sh <file> -r <frame rate> [additional ffmpeg args]
+
+set -eu
+
+mkdir -p tmp
+
+ffmpeg -i "$@" tmp/frame%4d.png
+
+parallel mogrify -resize 128x64 -threshold 50% -- tmp/*.png
+
+echo "const unsigned char frame_rate = $3;" > frames.cc
+./frames-to-cc tmp/*.png >> frames.cc
+
+rm -rf tmp
diff --git a/src/app/ssd1306-bad-apple/frames-to-cc b/src/app/ssd1306-bad-apple/frames-to-cc
new file mode 100755
index 0000000..0ae95ec
--- /dev/null
+++ b/src/app/ssd1306-bad-apple/frames-to-cc
@@ -0,0 +1,42 @@
+#!/usr/bin/env python3
+
+from PIL import Image
+import sys
+import zlib
+
+buf_w = 128
+buf_h = 64
+
+def load_image(filename):
+ im = Image.open(filename)
+ w, h = im.size
+ buf = [0 for i in range(buf_w * buf_h // 8)]
+ for y in range(min(h, buf_h)):
+ for x in range(min(w, buf_w)):
+ if im.getpixel((x, y)):
+ buf[(y // 8) * buf_w + x] |= 1 << (y % 8)
+ return buf
+
+
+for i in range(1, len(sys.argv) - 2, 3):
+ buf = (
+ load_image(sys.argv[i])
+ + load_image(sys.argv[i + 1])
+ + load_image(sys.argv[i + 2])
+ )
+ c_buf = ",".join(map(str, buf))
+ z_buf = zlib.compress(bytes(buf), 9)
+ z_buf = z_buf[2:-4]
+ out_buf = ",".join(map(str, z_buf))
+ print(
+ f'__attribute__((section(".text"))) unsigned char const frame{i:04d}[] = {{ {out_buf} }};'
+ )
+
+frames = list()
+for i in range(1, len(sys.argv) - 2, 3):
+ frames.append(f"(unsigned char*)frame{i:04d}")
+
+prefix = "unsigned char* const frames[] = {"
+postfix = "};"
+
+print(prefix + ", ".join(frames) + postfix)
diff --git a/src/app/ssd1306-bad-apple/main.cc b/src/app/ssd1306-bad-apple/main.cc
new file mode 100644
index 0000000..5e89625
--- /dev/null
+++ b/src/app/ssd1306-bad-apple/main.cc
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2020 Daniel Friesel
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+#include "arch.h"
+#include "driver/gpio.h"
+#include "driver/stdout.h"
+#include "driver/i2c.h"
+#include "driver/ssd1306.h"
+#include "lib/inflate.h"
+
+#include "driver/timer.h"
+volatile unsigned char timer_done = 0;
+
+#include "frames.cc"
+
+__attribute__((section(".leaRAM"))) unsigned char img_buf[(128 * 64 / 8) * 3];
+
+int main(void)
+{
+ unsigned int i = 0;
+ unsigned char line;
+ arch.setup();
+ gpio.setup();
+ kout.setup();
+ i2c.setup();
+ ssd1306.init();
+
+ timer.setup_hz_low(frame_rate);
+
+ while (1) {
+ for (i = 0; i < (sizeof(frames) / sizeof(frames[0])); i++) {
+
+ timer_done = 0;
+ timer.start(1);
+
+ ssd1306.showImage(img_buf + (128 * 64 / 8 * 2), 128 * 64 / 8);
+
+ inflate(frames[i], sizeof(img_buf), img_buf, sizeof(img_buf));
+
+ while (!timer_done) {
+ arch.idle();
+ }
+ timer.stop();
+
+ timer_done = 0;
+ timer.start(1);
+
+ ssd1306.showImage(img_buf + (128 * 64 / 8 * 0), 128 * 64 / 8);
+
+ while (!timer_done) {
+ arch.idle();
+ }
+ timer.stop();
+
+ timer_done = 0;
+ timer.start(1);
+
+ ssd1306.showImage(img_buf + (128 * 64 / 8 * 1), 128 * 64 / 8);
+
+ while (!timer_done) {
+ arch.idle();
+ }
+ timer.stop();
+ }
+ }
+
+ return 0;
+}
+
+ON_TIMER_INTERRUPT_head
+ timer_done = 1;
+ON_TIMER_INTERRUPT_tail