From 9be9ef78ea3ce3bdaeb9c76ebe54674eb3002bef Mon Sep 17 00:00:00 2001 From: Nicholas Pease Date: Sun, 17 Dec 2023 21:17:34 -0500 Subject: [PATCH] Initial --- 8bit.ttf | Bin 0 -> 14328 bytes clear.py | 30 ++++++++++++ main.py | 69 +++++++++++++++++++++++++++ startup.py | 96 ++++++++++++++++++++++++++++++++++++++ superstar_memesbruh03.ttf | Bin 0 -> 86196 bytes 5 files changed, 195 insertions(+) create mode 100644 8bit.ttf create mode 100644 clear.py create mode 100644 main.py create mode 100644 startup.py create mode 100644 superstar_memesbruh03.ttf diff --git a/8bit.ttf b/8bit.ttf new file mode 100644 index 0000000000000000000000000000000000000000..6d9b3972e185bb15dfa5555eb8e3accd796b50b0 GIT binary patch literal 14328 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 2020 Tony DiCola, James DeVito, +# and 2020 Melissa LeBlanc-Williams, for Adafruit Industries + +# SPDX-License-Identifier: MIT + + +# This example is for use on (Linux) computers that are using CPython with +# Adafruit Blinka to support CircuitPython libraries. CircuitPython does +# not support PIL/pillow (python imaging library)! + +import time +import subprocess +from board import SCL, SDA, D4 +import busio +import digitalio +from PIL import Image, ImageDraw, ImageFont +import adafruit_ssd1305 + +# Define the Reset Pin +oled_reset = digitalio.DigitalInOut(D4) + +# Create the I2C interface. +i2c = busio.I2C(SCL, SDA) + +# Create the SSD1305 OLED class. +# The first two parameters are the pixel width and pixel height. Change these +# to the right size for your display! +disp = adafruit_ssd1305.SSD1305_I2C(128, 32, i2c, reset=oled_reset) + +# Clear display. +disp.fill(0) +disp.show() + +# Create blank image for drawing. +# Make sure to create image with mode '1' for 1-bit color. +width = disp.width +height = disp.height +image = Image.new("1", (width, height)) + +# Get drawing object to draw on image. +draw = ImageDraw.Draw(image) + +# Draw a black filled box to clear the image. +draw.rectangle((0, 0, width, height), outline=0, fill=0) + +# Draw some shapes. +# First define some constants to allow easy resizing of shapes. +padding = 0 +top = padding +bottom = height - padding +# Move left to right keeping track of the current x position for drawing shapes. +x = 0 + + +# Load default font. +#def_font = ImageFont.load_default() + +# Alternatively load a TTF font. Make sure the .ttf font file is in the +# same directory as the python script! +# Some other nice fonts to try: http://www.dafont.com/bitmap.php +font = ImageFont.truetype('8bit.ttf', 8) + +# Write four lines of text. +draw.text((0, 0), "Av Assist V2", font=font, fill=255) +draw.text((0, 10), "IP ", font=font, fill=255) +draw.text((0,20), "Aircraft ", font=font, fill=255) +# Display image. +disp.image(image) +disp.show() diff --git a/startup.py b/startup.py new file mode 100644 index 0000000..db74ccc --- /dev/null +++ b/startup.py @@ -0,0 +1,96 @@ +# SPDX-FileCopyrightText: 2020 Tony DiCola, James DeVito, +# and 2020 Melissa LeBlanc-Williams, for Adafruit Industries + +# SPDX-License-Identifier: MIT + + +# This example is for use on (Linux) computers that are using CPython with +# Adafruit Blinka to support CircuitPython libraries. CircuitPython does +# not support PIL/pillow (python imaging library)! + +import time +import subprocess +from board import SCL, SDA, D4 +import busio +import digitalio +from PIL import Image, ImageDraw, ImageFont +import adafruit_ssd1305 +import os +import requests + +# Define the Reset Pin +oled_reset = digitalio.DigitalInOut(D4) + +# Create the I2C interface. +i2c = busio.I2C(SCL, SDA) + +# Create the SSD1305 OLED class. +# The first two parameters are the pixel width and pixel height. Change these +# to the right size for your display! +disp = adafruit_ssd1305.SSD1305_I2C(128, 32, i2c, reset=oled_reset) + +# Clear display. +disp.fill(0) +disp.show() + +# Create blank image for drawing. +# Make sure to create image with mode '1' for 1-bit color. +width = disp.width +height = disp.height +image = Image.new("1", (width, height)) + +# Get drawing object to draw on image. +draw = ImageDraw.Draw(image) + +# Draw a black filled box to clear the image. +draw.rectangle((0, 0, width, height), outline=0, fill=0) + +# Draw some shapes. +# First define some constants to allow easy resizing of shapes. +padding = 0 +top = padding +bottom = height - padding +# Move left to right keeping track of the current x position for drawing shapes. +x = 0 + + +# Load default font. +def_font = ImageFont.load_default() + +# Alternatively load a TTF font. Make sure the .ttf font file is in the +# same directory as the python script! +# Some other nice fonts to try: http://www.dafont.com/bitmap.php +font = ImageFont.truetype('superstar_memesbruh03.ttf', 16) +font1 = ImageFont.truetype('8bit.ttf', 8) + +# Write four lines of text. +draw.text(((128-8*8)//2, 0), "AVIATION", font=font, fill=255) +draw.text(((128-13*8)//2, 10), "ASSISTANT v.2", font=font, fill=255) + +# Display image. +disp.image(image) +disp.show() +time.sleep(3) +draw.rectangle((0, 0, width, height), outline=0, fill=0) +draw.text(((128-11*8)//2, 10), "STARTING UP", font=font, fill=255) +disp.image(image) +disp.show() + +while True: + # Stats + IP = subprocess.check_output("hostname -I | cut -d' ' -f1", shell=True).decode("utf-8") + UPTIME = subprocess.check_output("uptime", shell=True).decode("utf-8").split(" ")[4][:-1] + if UPTIME == "min": + UPTIME = str(subprocess.check_output("uptime", shell=True).decode("utf-8").split(" ")[3]) + " min" + AIRCRAFT = 0 + for i in requests.get('http://127.0.0.1/tar1090/data/aircraft.json').json()['aircraft']: + AIRCRAFT+=1 + + # Display image. + draw.rectangle((0, 0, width, height), outline=0, fill=0) + draw.text((5,0), "IP: "+IP, font=def_font, fill=255) + draw.text((5,9), "AIRCRAFT: "+str(AIRCRAFT), font=def_font, fill=255) + draw.text((5,18), "UPTIME: "+UPTIME, font=def_font, fill=255) + disp.image(image) + disp.show() + time.sleep(1) diff --git a/superstar_memesbruh03.ttf b/superstar_memesbruh03.ttf new file mode 100644 index 0000000000000000000000000000000000000000..5a19fd074c4ec07c87dd780e81dae6396f7728b3 GIT binary patch literal 86196 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 Xa)Y_pY%&*2#Wf#ur{dc4Ag=vCC7zt; literal 0 HcmV?d00001