mirror of
https://github.com/akuker/RASCSI.git
synced 2024-11-26 13:49:21 +00:00
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:
parent
65d0a9b2e6
commit
61c4534eab
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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 |
BIN
src/oled_monitor/splash_start_32.bmp
Normal file
BIN
src/oled_monitor/splash_start_32.bmp
Normal file
Binary file not shown.
After Width: | Height: | Size: 574 B |
BIN
src/oled_monitor/splash_start_64.bmp
Normal file
BIN
src/oled_monitor/splash_start_64.bmp
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.1 KiB |
Binary file not shown.
Before Width: | Height: | Size: 574 B |
BIN
src/oled_monitor/splash_stop_32.bmp
Normal file
BIN
src/oled_monitor/splash_stop_32.bmp
Normal file
Binary file not shown.
After Width: | Height: | Size: 574 B |
BIN
src/oled_monitor/splash_stop_64.bmp
Normal file
BIN
src/oled_monitor/splash_stop_64.bmp
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.1 KiB |
@ -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}
|
||||
|
Loading…
Reference in New Issue
Block a user