From 001710008e90efac33296c34b071e5329d46ec0c Mon Sep 17 00:00:00 2001 From: Jeff Epler Date: Sat, 12 Dec 2020 13:32:08 -0600 Subject: [PATCH] Add script to set up chromium in kiosk mode --- Raspberry_Pi_Braincraft_Radio/setup-kiosk.sh | 303 +++++++++++++++++++ 1 file changed, 303 insertions(+) create mode 100644 Raspberry_Pi_Braincraft_Radio/setup-kiosk.sh diff --git a/Raspberry_Pi_Braincraft_Radio/setup-kiosk.sh b/Raspberry_Pi_Braincraft_Radio/setup-kiosk.sh new file mode 100644 index 000000000..d38e84985 --- /dev/null +++ b/Raspberry_Pi_Braincraft_Radio/setup-kiosk.sh @@ -0,0 +1,303 @@ +# Inspired by https://pimylifeup.com/raspberry-pi-kiosk/ +# Start with a raspberry pi "full" installation that boots to desktop and +# can run chromium browser. +# +# Follow braincraft setup instructions sections: +# - raspberry pi setup +# - blinka setup +# - audio setup +# - fan service setup (optional) +# +# Now run this script, restart, and satisfy yourself that the player works +# properly using a HDMI monitor. Troubleshooting is easier at this point! +# +# Now run the braincraft setup setps: +# - display module install +# - enable "overlay mode" in raspi-config so that it's safe to just power off +# the pi anytime +# +# Before working with the system, remember to +# - disable "overlay mode" +# - optionally disable the display module to get a regular desktop back + +cd $HOME + +sudo apt-get install -y xdotool unclutter sed +cat > kiosk.sh < braincraftKeys.py <<"EOF" +#!/usr/bin/env python3 +# Credit to Pimoroni for Picade HAT scripts as starting point. + +import time +import signal +import os +import sys +from datetime import datetime + +try: + from evdev import uinput, UInput, ecodes as e +except ImportError: + exit("This library requires the evdev module\nInstall with: sudo pip install evdev") + +import digitalio +import board + +DEBUG = False +BOUNCE_TIME = 0.01 # Debounce time in seconds +POWEROFF_TIMEOUT = 5 + +KEYS= [ # EDIT KEYCODES IN THIS TABLE TO YOUR PREFERENCES: + # See /usr/include/linux/input.h for keycode names + # Keyboard Action (tuple = press together, no repeat) + (board.D17, (e.KEY_K,)), # button - play/pause + (board.D16, (e.KEY_LEFTCTRL, e.KEY_R)), # push stick - reload + (board.D22, (e.KEY_LEFTSHIFT, e.KEY_P)), # left - previous in playlist + (board.D24, (e.KEY_LEFTSHIFT, e.KEY_N)), # right - next in playlist + (board.D23, e.KEY_EQUAL), # up - volume up + (board.D27, e.KEY_MINUS), # down - volume down +] + +key_values = set() +for pin, action in KEYS: + if isinstance(action, int): + key_values.add(action) + else: + key_values.update(action) + +class KeyManager: + def __init__(self, pin, action): + self.pin = digitalio.DigitalInOut(pin) + self.pin.switch_to_output(digitalio.Pull.UP) + self.action = action + self.old_value = False + + @property + def value(self): + return not self.pin.value # buttons are active-low + + def tick(self): + value = self.value + if value != self.old_value: + if isinstance(self.action, int): + ui.write(e.EV_KEY, self.action, value) + ui.syn() + elif value: + for key in self.action: + ui.write(e.EV_KEY, key, 1) + ui.syn() + for key in self.action[::-1]: + ui.write(e.EV_KEY, key, 0) + ui.syn() + self.old_value = value + +class ShutdownManager: + def __init__(self, manager): + self.manager = manager + self.old_value = False + self.press_start = 0 + + @property + def value(self): + return self.manager.value + + def tick(self): + now = time.time() + value = self.value + if value: + if self.old_value: + if now > self.press_start + POWEROFF_TIMEOUT: + os.system("env DISPLAY=:0 XAUTHORITY=/home/pi/.Xauthority xset dpms force off") + os.system("sudo poweroff") + else: + self.press_start = now + self.old_value = value + +managers = [KeyManager(k, v) for k, v in KEYS] +managers.append(ShutdownManager(managers[0])) + +os.system("sudo modprobe uinput") + +try: + ui = UInput({e.EV_KEY: key_values}, name="braincraft-hat", bustype=e.BUS_USB) +except uinput.UInputError as e: + sys.stdout.write(repr(e)) + sys.stdout.write("Have you tried running as root? sudo {}".format(sys.argv[0])) + sys.exit(0) + +def log(msg): + sys.stdout.write(str(datetime.now())) + sys.stdout.write(": ") + sys.stdout.write(msg) + sys.stdout.write("\n") + sys.stdout.flush() + +while True: + for manager in managers: + manager.tick() + time.sleep(BOUNCE_TIME) +EOF +chmod +x braincraftKeys.py + +cat > kiosk.service < kioskvideo.html <<"EOF" + + +Braincraft Hat - lofi hip hop radio - betas to relax/study to + + + +
+
+
+NOTE: Chromium must be launched with --autoplay-policy=no-user-gesture-required or the video will not autoplay and the play/pause keystrokes will not work properly. Clicking in the video will also affect keystroke functionality! + + +EOF