Add support for 64px OLED screen height (#448)

* Add support for 64px screen height

* Handle case when only one argument is passed

* Simplify arg parsing

* Update install script to handle screen height selection

* Cleanup

* Update README

* Add blurb on running start.sh standalone

* Format

* Global constant for LINE_SPACING

* Make FONT_SIZE a global constant; improve code comments
This commit is contained in:
Daniel Markstedt 2021-11-13 17:40:49 -08:00 committed by GitHub
parent 65d0a9b2e6
commit 61c4534eab
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 91 additions and 38 deletions

View File

@ -134,11 +134,12 @@ function installRaScsiScreen() {
echo "IMPORTANT: This configuration requires a OLED screen to be installed onto your RaSCSI board."
echo "See wiki for more information: https://github.com/akuker/RASCSI/wiki/OLED-Status-Display-(Optional)"
echo ""
echo "Do you want to use the recommended screen rotation (180 degrees)?"
echo "Press Y/n and Enter, or CTRL-C to exit"
echo "Choose screen rotation:"
echo " 1) 0 degrees"
echo " 2) 180 degrees (default)"
read REPLY
if [ "$REPLY" == "N" ] || [ "$REPLY" == "n" ]; then
if [ "$REPLY" == "1" ]; then
echo "Proceeding with 0 degrees rotation."
ROTATION="0"
else
@ -146,6 +147,20 @@ function installRaScsiScreen() {
ROTATION="180"
fi
echo ""
echo "Choose screen resolution:"
echo " 1) 128x32 pixels (default)"
echo " 2) 128x64 pixels"
read REPLY
if [ "$REPLY" == "2" ]; then
echo "Proceeding with 128x64 pixel resolution."
SCREEN_HEIGHT="64"
else
echo "Proceeding with 128x32 pixel resolution."
SCREEN_HEIGHT="32"
fi
stopRaScsiScreen
updateRaScsiGit
@ -171,7 +186,7 @@ function installRaScsiScreen() {
echo "Installing the monitor_rascsi.service configuration..."
sudo cp -f "$BASE/src/oled_monitor/monitor_rascsi.service" /etc/systemd/system/monitor_rascsi.service
sudo sed -i /^ExecStart=/d /etc/systemd/system/monitor_rascsi.service
sudo sed -i "8 i ExecStart=$BASE/src/oled_monitor/start.sh --rotation=$ROTATION" /etc/systemd/system/monitor_rascsi.service
sudo sed -i "8 i ExecStart=$BASE/src/oled_monitor/start.sh --rotation=$ROTATION --height=$SCREEN_HEIGHT" /etc/systemd/system/monitor_rascsi.service
sudo systemctl daemon-reload
sudo systemctl enable monitor_rascsi

View File

@ -14,7 +14,24 @@ $ python3 rascsi_oled_monitor.py
### Parameters
The script takes one positional parameter: '0' or '180' which decides the screen rotation
The script takes two positional parameters:
* '0' or '180' which decides the screen rotation
* '32' or '64' which decides the vertical screen resolution in pixels
Ex.
```
$ python3 rascsi_oled_monitor.py 180 64
```
_Note:_ Both parameters must be passed for the script to read them. Ordering is also important.
## Run the start.sh script standalone
The start.sh script can also be run standalone, and will handle the venv creation/updating for you. It takes the same command line parameters in the following format:
```
$ ./start.sh --rotation=180 --height=64
```
## Static analysis with pylint
@ -28,12 +45,11 @@ $ pylint3 python_source_file.py
```
## Credits
type_writer.ttf
"Type Writer" TrueType font by Mandy Smith
Source: https://www.dafont.com/type-writer.font
Distributed under BSD 3-Clause by permission from author (see LICENSE for full text)
### type_writer.ttf
* _Type Writer_ TrueType font by Mandy Smith
* Source: https://www.dafont.com/type-writer.font
* Distributed under BSD 3-Clause by permission from author (see LICENSE for full text)
splash_start.bmp, splash_stop.bmp
Splash screen bitmap images
Drawn by Daniel Markstedt
Distributed under BSD 3-Clause license
### splash_start_\*.bmp, splash_stop_\*.bmp
* Drawn by Daniel Markstedt
* Distributed under BSD 3-Clause by permission from author (see LICENSE for full text)

View File

@ -40,8 +40,29 @@ from interrupt_handler import GracefulInterruptHandler
from pi_cmds import get_ip_and_host
from ractl_cmds import device_list
# Read positional arguments; expecting exactly two, or none
# Arg 1 is the rotation in degrees, arg 2 is the screen height in pixels
# Valid values are 0/180 for ROTATION, 32/64 for HEIGHT
if len(argv) == 3:
if int(argv[1]) == 0:
ROTATION = 0
else:
# 2 means 180 degrees
ROTATION = 2
if int(argv[2]) == 64:
HEIGHT = 64
LINES = 8
else:
HEIGHT = 32
LINES = 4
else:
# Default settings
ROTATION = 2
HEIGHT = 32
LINES = 4
print("No valid parameters detected; defaulting to 32 px height, 180 degrees rotation.")
WIDTH = 128
HEIGHT = 32 # Change to 64 if needed
BORDER = 5
# How long to delay between each update
@ -61,20 +82,6 @@ print(OLED)
print()
print("Will update the OLED display every " + str(DELAY_TIME_MS) + "ms (approximately)")
# Attempt to read the first argument to the script; fall back to 2 (180 degrees)
if len(argv) > 1:
if str(argv[1]) == "0":
ROTATION = 0
print("Using 0 degrees screen rotation.")
elif str(argv[1]) == "180":
ROTATION = 2
print("Using 180 degrees screen rotation.")
else:
exit("Only 0 and 180 are valid arguments for screen rotation.")
else:
print("Defaulting to 180 degrees screen rotation.")
ROTATION = 2
# Clear display.
OLED.rotation = ROTATION
OLED.fill(0)
@ -99,11 +106,18 @@ BOTTOM = HEIGHT - PADDING
# Move left to right keeping track of the current x position for drawing shapes.
X_POS = 0
# Alternatively load a TTF font. Make sure the .ttf font file
# is in the same directory as the python script!
# When using other fonts, you may need to adjust padding, font size, and line spacing.
# Font size in pixels. Not all TTF fonts have bitmap representations for all sizes.
FONT_SIZE = 8
# Vertical spacing between each line of text. Adjust in accordance with font size.
# Depending on the design of the font glyphs, this may be larger than FONT_SIZE.
LINE_SPACING = 8
# Load a TTF font for rendering glyphs on the screen.
# Make sure the .ttf font file is in the same directory as the python script!
# When using other fonts, you may need to adjust PADDING, FONT_SIZE,
# LINE_SPACING, and LINES.
# Some other nice fonts to try: http://www.dafont.com/bitmap.php
FONT = ImageFont.truetype('type_writer.ttf', 8)
FONT = ImageFont.truetype('type_writer.ttf', FONT_SIZE)
IP_ADDR, HOSTNAME = get_ip_and_host()
@ -151,7 +165,7 @@ def start_splash():
Displays a splash screen for the startup sequence
Make sure the splash bitmap image is in the same dir as this script
"""
splash = Image.open("splash_start.bmp").convert("1")
splash = Image.open(f"splash_start_{HEIGHT}.bmp").convert("1")
DRAW.bitmap((0, 0), splash)
OLED.image(splash)
OLED.show()
@ -163,7 +177,7 @@ def stop_splash():
Make sure the splash bitmap image is in the same dir as this script
"""
DRAW.rectangle((0, 0, WIDTH, HEIGHT), outline=0, fill=0)
splash = Image.open("splash_stop.bmp").convert("1")
splash = Image.open(f"splash_stop_{HEIGHT}.bmp").convert("1")
DRAW.bitmap((0, 0), splash)
OLED.image(splash)
OLED.show()
@ -191,10 +205,10 @@ with GracefulInterruptHandler() as handler:
y_pos = TOP
for output_line in active_output:
DRAW.text((X_POS, y_pos), output_line, font=FONT, fill=255)
y_pos += 8
y_pos += LINE_SPACING
# Shift the index of the array by one to get a scrolling effect
if len(active_output) > 5:
if len(active_output) > LINES:
active_output.rotate(-1)
# Display image.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 574 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 574 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 574 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 574 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -89,13 +89,16 @@ while [ "$1" != "" ]; do
-r | --rotation)
ROTATION=$VALUE
;;
-h | --height)
HEIGHT=$VALUE
;;
*)
echo "ERROR: unknown parameter \"$PARAM\""
exit 1
;;
esac
case $VALUE in
0 | 180 )
0 | 180 | 32 | 64 )
;;
*)
echo "ERROR: invalid option \"$VALUE\""
@ -111,4 +114,9 @@ if [ -z ${ROTATION+x} ]; then
else
echo "Screen rotation set to $ROTATION degrees."
fi
python3 rascsi_oled_monitor.py ${ROTATION}
if [ -z ${HEIGHT+x} ]; then
echo "No screen height parameter given; falling back to the default."
else
echo "Screen height set to $HEIGHT px."
fi
python3 rascsi_oled_monitor.py ${ROTATION} ${HEIGHT}