Add files for Pi SSD server
Add files for Pi SSD server
This commit is contained in:
parent
7a9a1e25ab
commit
868e53cf15
11 changed files with 45894 additions and 0 deletions
99
Pi_SSD_Media_Server/display-info.py
Executable file
99
Pi_SSD_Media_Server/display-info.py
Executable file
|
|
@ -0,0 +1,99 @@
|
|||
# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
import time
|
||||
import subprocess
|
||||
import board
|
||||
import terminalio
|
||||
import displayio
|
||||
from adafruit_display_text import label
|
||||
from adafruit_bitmap_font import bitmap_font
|
||||
from adafruit_st7789 import ST7789
|
||||
import gpiozero as gz
|
||||
|
||||
BORDER_WIDTH = 4
|
||||
TEXT_SCALE = 1
|
||||
|
||||
font = bitmap_font.load_font("/home/pi/fonts/Arial-18.bdf")
|
||||
font_small = bitmap_font.load_font("/home/pi/fonts/Arial-14.bdf")
|
||||
font_bold = bitmap_font.load_font("/home/pi/fonts/Arial-Bold-24.bdf")
|
||||
|
||||
# Release any resources currently in use for the displays
|
||||
displayio.release_displays()
|
||||
|
||||
spi = board.SPI()
|
||||
tft_cs = board.CE0
|
||||
tft_dc = board.D25
|
||||
tft_rst = board.D24
|
||||
|
||||
display_bus = displayio.FourWire(spi, command=tft_dc, chip_select=tft_cs, reset=tft_rst)
|
||||
|
||||
display = ST7789(display_bus, width=320, height=170, colstart=35, rotation=270)
|
||||
|
||||
# Make the display context
|
||||
splash = displayio.Group()
|
||||
display.show(splash)
|
||||
|
||||
color_bitmap = displayio.Bitmap(display.width, display.height, 1)
|
||||
color_palette = displayio.Palette(1)
|
||||
color_palette[0] = 0xAA0088 # Purple
|
||||
bg_sprite = displayio.TileGrid(color_bitmap, pixel_shader=color_palette, x=0, y=0)
|
||||
splash.append(bg_sprite)
|
||||
|
||||
# Draw a smaller inner rectangle
|
||||
inner_bitmap = displayio.Bitmap(
|
||||
display.width - (BORDER_WIDTH * 2), display.height - (BORDER_WIDTH * 2), 1
|
||||
)
|
||||
inner_palette = displayio.Palette(1)
|
||||
inner_palette[0] = 0x222222 # Dark Gray
|
||||
inner_sprite = displayio.TileGrid(
|
||||
inner_bitmap, pixel_shader=inner_palette, x=BORDER_WIDTH, y=BORDER_WIDTH
|
||||
)
|
||||
splash.append(inner_sprite)
|
||||
|
||||
# display ip, cpu and memory usage
|
||||
cmd = "hostname -I | cut -d' ' -f1"
|
||||
IP = subprocess.check_output(cmd, shell=True).decode("utf-8")
|
||||
cmd = 'cut -f 1 -d " " /proc/loadavg'
|
||||
CPU = subprocess.check_output(cmd, shell=True).decode("utf-8")
|
||||
cmd = "free -m | awk 'NR==2{printf \"Mem: %s/%s MB %.2f%%\", $3,$2,$3*100/$2 }'"
|
||||
MemUsage = subprocess.check_output(cmd, shell=True).decode("utf-8")
|
||||
cmd = "vcgencmd measure_temp | grep -o -E '[[:digit:]].*'"
|
||||
cpu_temp = subprocess.check_output(cmd, shell=True).decode("utf-8")
|
||||
|
||||
# Draw a label
|
||||
text_ip = label.Label(
|
||||
font_bold,
|
||||
text="IP: " + IP,
|
||||
color=0x1BF702,
|
||||
scale=TEXT_SCALE,
|
||||
)
|
||||
text_cpu = label.Label(
|
||||
font,
|
||||
text="CPU: " + cpu_temp,
|
||||
color=0xFFFFFF,
|
||||
scale=TEXT_SCALE,
|
||||
)
|
||||
text_mem = label.Label(
|
||||
font_small,
|
||||
text=MemUsage,
|
||||
color=0xCCCCCC,
|
||||
scale=TEXT_SCALE,
|
||||
)
|
||||
text_ip.x = 12
|
||||
text_cpu.x = 12
|
||||
text_mem.x = 12
|
||||
|
||||
text_ip.y = 30
|
||||
text_cpu.y = 70
|
||||
text_mem.y = 150
|
||||
|
||||
splash.append(text_ip)
|
||||
splash.append(text_cpu)
|
||||
splash.append(text_mem)
|
||||
|
||||
while True:
|
||||
text_ip.text = "IP: " + IP
|
||||
text_cpu.text = "CPU:" + cpu_temp
|
||||
text_mem.text = MemUsage
|
||||
display.refresh()
|
||||
27566
Pi_SSD_Media_Server/fonts/Arial-14.bdf
Executable file
27566
Pi_SSD_Media_Server/fonts/Arial-14.bdf
Executable file
File diff suppressed because it is too large
Load diff
8021
Pi_SSD_Media_Server/fonts/Arial-18.bdf
Executable file
8021
Pi_SSD_Media_Server/fonts/Arial-18.bdf
Executable file
File diff suppressed because it is too large
Load diff
10035
Pi_SSD_Media_Server/fonts/Arial-Bold-24.bdf
Executable file
10035
Pi_SSD_Media_Server/fonts/Arial-Bold-24.bdf
Executable file
File diff suppressed because it is too large
Load diff
173
Pi_SSD_Media_Server/gif-player.py
Executable file
173
Pi_SSD_Media_Server/gif-player.py
Executable file
|
|
@ -0,0 +1,173 @@
|
|||
# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
import os
|
||||
import time
|
||||
import digitalio
|
||||
import board
|
||||
from PIL import Image, ImageOps
|
||||
import numpy # pylint: disable=unused-import
|
||||
from adafruit_rgb_display import st7789 # pylint: disable=unused-import
|
||||
|
||||
# Change to match your display
|
||||
BUTTON_NEXT = board.D17
|
||||
BUTTON_PREVIOUS = board.D22
|
||||
|
||||
# Configuration for CS and DC pins (these are PiTFT defaults):
|
||||
cs_pin = digitalio.DigitalInOut(board.CE0)
|
||||
dc_pin = digitalio.DigitalInOut(board.D25)
|
||||
reset_pin = digitalio.DigitalInOut(board.D24)
|
||||
|
||||
def init_button(pin):
|
||||
button = digitalio.DigitalInOut(pin)
|
||||
button.switch_to_input()
|
||||
button.pull = digitalio.Pull.UP
|
||||
return button
|
||||
|
||||
# pylint: disable=too-few-public-methods
|
||||
class Frame:
|
||||
def __init__(self, duration=0):
|
||||
self.duration = duration
|
||||
self.image = None
|
||||
|
||||
# pylint: enable=too-few-public-methods
|
||||
|
||||
class AnimatedGif:
|
||||
def __init__(self, display, width=None, height=None, folder=None):
|
||||
self._frame_count = 0
|
||||
self._loop = 0
|
||||
self._index = 0
|
||||
self._duration = 0
|
||||
self._gif_files = []
|
||||
self._frames = []
|
||||
|
||||
if width is not None:
|
||||
self._width = width
|
||||
else:
|
||||
self._width = display.width
|
||||
if height is not None:
|
||||
self._height = height
|
||||
else:
|
||||
self._height = display.height
|
||||
self.display = display
|
||||
self.advance_button = init_button(BUTTON_NEXT)
|
||||
self.back_button = init_button(BUTTON_PREVIOUS)
|
||||
if folder is not None:
|
||||
self.load_files(folder)
|
||||
self.run()
|
||||
|
||||
def advance(self):
|
||||
self._index = (self._index + 1) % len(self._gif_files)
|
||||
|
||||
def back(self):
|
||||
self._index = (self._index - 1 + len(self._gif_files)) % len(self._gif_files)
|
||||
|
||||
def load_files(self, folder):
|
||||
gif_files = [f for f in os.listdir(folder) if f.endswith(".gif")]
|
||||
for gif_file in gif_files:
|
||||
gif_file = os.path.join(folder, gif_file)
|
||||
image = Image.open(gif_file)
|
||||
# Only add animated Gifs
|
||||
if image.is_animated:
|
||||
self._gif_files.append(gif_file)
|
||||
|
||||
print("Found", self._gif_files)
|
||||
if not self._gif_files:
|
||||
print("No Gif files found in current folder")
|
||||
exit() # pylint: disable=consider-using-sys-exit
|
||||
|
||||
def preload(self):
|
||||
image = Image.open(self._gif_files[self._index])
|
||||
print("Loading {}...".format(self._gif_files[self._index]))
|
||||
if "duration" in image.info:
|
||||
self._duration = image.info["duration"]
|
||||
else:
|
||||
self._duration = 0
|
||||
if "loop" in image.info:
|
||||
self._loop = image.info["loop"]
|
||||
else:
|
||||
self._loop = 1
|
||||
self._frame_count = image.n_frames
|
||||
self._frames.clear()
|
||||
for frame in range(self._frame_count):
|
||||
image.seek(frame)
|
||||
# Create blank image for drawing.
|
||||
# Make sure to create image with mode 'RGB' for full color.
|
||||
frame_object = Frame(duration=self._duration)
|
||||
if "duration" in image.info:
|
||||
frame_object.duration = image.info["duration"]
|
||||
frame_object.image = ImageOps.pad( # pylint: disable=no-member
|
||||
image.convert("RGB"),
|
||||
(self._width, self._height),
|
||||
method=Image.Resampling.NEAREST,
|
||||
color=(0, 0, 0),
|
||||
centering=(0.5, 0.5),
|
||||
)
|
||||
self._frames.append(frame_object)
|
||||
|
||||
def play(self):
|
||||
self.preload()
|
||||
|
||||
_prev_advance_btn_val = self.advance_button.value
|
||||
_prev_back_btn_val = self.back_button.value
|
||||
# Check if we have loaded any files first
|
||||
if not self._gif_files:
|
||||
print("There are no Gif Images loaded to Play")
|
||||
return False
|
||||
while True:
|
||||
for frame_object in self._frames:
|
||||
start_time = time.monotonic()
|
||||
self.display.image(frame_object.image)
|
||||
_cur_advance_btn_val = self.advance_button.value
|
||||
_cur_back_btn_val = self.back_button.value
|
||||
if not _cur_advance_btn_val and _prev_advance_btn_val:
|
||||
self.advance()
|
||||
return False
|
||||
if not _cur_back_btn_val and _prev_back_btn_val:
|
||||
self.back()
|
||||
return False
|
||||
|
||||
_prev_back_btn_val = _cur_back_btn_val
|
||||
_prev_advance_btn_val = _cur_advance_btn_val
|
||||
while time.monotonic() < (start_time + frame_object.duration / 1000):
|
||||
pass
|
||||
|
||||
if self._loop == 1:
|
||||
return True
|
||||
if self._loop > 0:
|
||||
self._loop -= 1
|
||||
|
||||
def run(self):
|
||||
while True:
|
||||
auto_advance = self.play()
|
||||
if auto_advance:
|
||||
self.advance()
|
||||
|
||||
|
||||
# Config for display baudrate (default max is 64mhz):
|
||||
BAUDRATE = 64000000
|
||||
|
||||
# Setup SPI bus using hardware SPI:
|
||||
spi = board.SPI()
|
||||
|
||||
disp = st7789.ST7789(
|
||||
spi,
|
||||
rotation=270,
|
||||
width=170,
|
||||
height=320,
|
||||
x_offset=35,
|
||||
cs=cs_pin,
|
||||
dc=dc_pin,
|
||||
rst=reset_pin,
|
||||
baudrate=BAUDRATE,
|
||||
)
|
||||
# pylint: enable=line-too-long
|
||||
|
||||
if disp.rotation % 180 == 90:
|
||||
disp_height = disp.width # we swap height/width to rotate it to landscape!
|
||||
disp_width = disp.height
|
||||
else:
|
||||
disp_width = disp.width
|
||||
disp_height = disp.height
|
||||
|
||||
gif_player = AnimatedGif(disp, width=disp_width, height=disp_height, folder="gifs")
|
||||
BIN
Pi_SSD_Media_Server/gifs/arduino.gif
Normal file
BIN
Pi_SSD_Media_Server/gifs/arduino.gif
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 139 KiB |
BIN
Pi_SSD_Media_Server/gifs/blinka.gif
Normal file
BIN
Pi_SSD_Media_Server/gifs/blinka.gif
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 125 KiB |
BIN
Pi_SSD_Media_Server/gifs/braincraft.gif
Normal file
BIN
Pi_SSD_Media_Server/gifs/braincraft.gif
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 197 KiB |
BIN
Pi_SSD_Media_Server/gifs/cpx.gif
Normal file
BIN
Pi_SSD_Media_Server/gifs/cpx.gif
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 357 KiB |
BIN
Pi_SSD_Media_Server/gifs/doomguy.gif
Normal file
BIN
Pi_SSD_Media_Server/gifs/doomguy.gif
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 379 KiB |
BIN
Pi_SSD_Media_Server/gifs/glasses.gif
Normal file
BIN
Pi_SSD_Media_Server/gifs/glasses.gif
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 323 KiB |
Loading…
Reference in a new issue