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 "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 "See wiki for more information: https://github.com/akuker/RASCSI/wiki/OLED-Status-Display-(Optional)"
echo "" echo ""
echo "Do you want to use the recommended screen rotation (180 degrees)?" echo "Choose screen rotation:"
echo "Press Y/n and Enter, or CTRL-C to exit" echo " 1) 0 degrees"
echo " 2) 180 degrees (default)"
read REPLY read REPLY
if [ "$REPLY" == "N" ] || [ "$REPLY" == "n" ]; then if [ "$REPLY" == "1" ]; then
echo "Proceeding with 0 degrees rotation." echo "Proceeding with 0 degrees rotation."
ROTATION="0" ROTATION="0"
else else
@ -146,6 +147,20 @@ function installRaScsiScreen() {
ROTATION="180" ROTATION="180"
fi 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 stopRaScsiScreen
updateRaScsiGit updateRaScsiGit
@ -171,7 +186,7 @@ function installRaScsiScreen() {
echo "Installing the monitor_rascsi.service configuration..." echo "Installing the monitor_rascsi.service configuration..."
sudo cp -f "$BASE/src/oled_monitor/monitor_rascsi.service" /etc/systemd/system/monitor_rascsi.service 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 /^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 daemon-reload
sudo systemctl enable monitor_rascsi sudo systemctl enable monitor_rascsi

View File

@ -14,7 +14,24 @@ $ python3 rascsi_oled_monitor.py
### Parameters ### 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 ## Static analysis with pylint
@ -28,12 +45,11 @@ $ pylint3 python_source_file.py
``` ```
## Credits ## Credits
type_writer.ttf ### type_writer.ttf
"Type Writer" TrueType font by Mandy Smith * _Type Writer_ TrueType font by Mandy Smith
Source: https://www.dafont.com/type-writer.font * Source: https://www.dafont.com/type-writer.font
Distributed under BSD 3-Clause by permission from author (see LICENSE for full text) * Distributed under BSD 3-Clause by permission from author (see LICENSE for full text)
splash_start.bmp, splash_stop.bmp ### splash_start_\*.bmp, splash_stop_\*.bmp
Splash screen bitmap images * Drawn by Daniel Markstedt
Drawn by Daniel Markstedt * Distributed under BSD 3-Clause by permission from author (see LICENSE for full text)
Distributed under BSD 3-Clause license

View File

@ -40,8 +40,29 @@ from interrupt_handler import GracefulInterruptHandler
from pi_cmds import get_ip_and_host from pi_cmds import get_ip_and_host
from ractl_cmds import device_list 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 WIDTH = 128
HEIGHT = 32 # Change to 64 if needed
BORDER = 5 BORDER = 5
# How long to delay between each update # How long to delay between each update
@ -61,20 +82,6 @@ print(OLED)
print() print()
print("Will update the OLED display every " + str(DELAY_TIME_MS) + "ms (approximately)") 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. # Clear display.
OLED.rotation = ROTATION OLED.rotation = ROTATION
OLED.fill(0) OLED.fill(0)
@ -99,11 +106,18 @@ BOTTOM = HEIGHT - PADDING
# Move left to right keeping track of the current x position for drawing shapes. # Move left to right keeping track of the current x position for drawing shapes.
X_POS = 0 X_POS = 0
# Alternatively load a TTF font. Make sure the .ttf font file # Font size in pixels. Not all TTF fonts have bitmap representations for all sizes.
# is in the same directory as the python script! FONT_SIZE = 8
# When using other fonts, you may need to adjust padding, font size, and line spacing. # 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 # 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() IP_ADDR, HOSTNAME = get_ip_and_host()
@ -151,7 +165,7 @@ def start_splash():
Displays a splash screen for the startup sequence Displays a splash screen for the startup sequence
Make sure the splash bitmap image is in the same dir as this script 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) DRAW.bitmap((0, 0), splash)
OLED.image(splash) OLED.image(splash)
OLED.show() OLED.show()
@ -163,7 +177,7 @@ def stop_splash():
Make sure the splash bitmap image is in the same dir as this script Make sure the splash bitmap image is in the same dir as this script
""" """
DRAW.rectangle((0, 0, WIDTH, HEIGHT), outline=0, fill=0) 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) DRAW.bitmap((0, 0), splash)
OLED.image(splash) OLED.image(splash)
OLED.show() OLED.show()
@ -191,10 +205,10 @@ with GracefulInterruptHandler() as handler:
y_pos = TOP y_pos = TOP
for output_line in active_output: for output_line in active_output:
DRAW.text((X_POS, y_pos), output_line, font=FONT, fill=255) 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 # 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) active_output.rotate(-1)
# Display image. # 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) -r | --rotation)
ROTATION=$VALUE ROTATION=$VALUE
;; ;;
-h | --height)
HEIGHT=$VALUE
;;
*) *)
echo "ERROR: unknown parameter \"$PARAM\"" echo "ERROR: unknown parameter \"$PARAM\""
exit 1 exit 1
;; ;;
esac esac
case $VALUE in case $VALUE in
0 | 180 ) 0 | 180 | 32 | 64 )
;; ;;
*) *)
echo "ERROR: invalid option \"$VALUE\"" echo "ERROR: invalid option \"$VALUE\""
@ -111,4 +114,9 @@ if [ -z ${ROTATION+x} ]; then
else else
echo "Screen rotation set to $ROTATION degrees." echo "Screen rotation set to $ROTATION degrees."
fi 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}