From 168ea4b5641eb08ef24c70e94e332aaabf7e2e81 Mon Sep 17 00:00:00 2001 From: Daniel Friesel Date: Tue, 13 Apr 2021 08:31:21 +0200 Subject: add ssd1306 bad apple skeleton --- src/app/ssd1306-bad-apple/Kconfig | 6 +++ src/app/ssd1306-bad-apple/Makefile.inc | 15 +++++++ src/app/ssd1306-bad-apple/convert | 16 ++++++++ src/app/ssd1306-bad-apple/frames-to-cc | 42 +++++++++++++++++++ src/app/ssd1306-bad-apple/main.cc | 74 ++++++++++++++++++++++++++++++++++ 5 files changed, 153 insertions(+) create mode 100644 src/app/ssd1306-bad-apple/Kconfig create mode 100644 src/app/ssd1306-bad-apple/Makefile.inc create mode 100755 src/app/ssd1306-bad-apple/convert create mode 100755 src/app/ssd1306-bad-apple/frames-to-cc create mode 100644 src/app/ssd1306-bad-apple/main.cc 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 -r [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 -- cgit v1.2.3