2023-05-30 11:42:27 +00:00
|
|
|
import time
|
|
|
|
from stellar import StellarUnicorn
|
|
|
|
from picographics import PicoGraphics, DISPLAY_STELLAR_UNICORN as DISPLAY
|
|
|
|
import WIFI_CONFIG
|
|
|
|
from network_manager import NetworkManager
|
|
|
|
import uasyncio as asyncio
|
|
|
|
import uasyncio.core
|
|
|
|
from tinyweb.server import webserver
|
|
|
|
|
|
|
|
'''
|
|
|
|
Display scrolling wisdom, quotes or greetz... from the internetz!
|
|
|
|
|
|
|
|
You can adjust the brightness with LUX + and -.
|
|
|
|
|
|
|
|
Requires network_manager.py , WIFI_CONFIG.py, logging.mpy and tinyweb from micropython/examples/common
|
|
|
|
You'll also need index.html to be saved alongside this file.
|
|
|
|
'''
|
|
|
|
|
|
|
|
# Server Settings
|
|
|
|
host = "0.0.0.0"
|
|
|
|
port = 80
|
|
|
|
|
|
|
|
|
|
|
|
def convert_colour(colour_str):
|
|
|
|
colour_str = colour_str.split(',')
|
|
|
|
print(colour_str)
|
|
|
|
return colour_str[0], colour_str[1], colour_str[2]
|
|
|
|
|
|
|
|
|
|
|
|
class text:
|
|
|
|
|
|
|
|
def get(self, data):
|
|
|
|
global MESSAGE, MESSAGE_COLOUR, BACKGROUND_COLOUR
|
|
|
|
print(data)
|
|
|
|
if 'text' in data.keys():
|
|
|
|
MESSAGE = data['text']
|
|
|
|
if 'colourfg' in data.keys():
|
|
|
|
MESSAGE_COLOUR = convert_colour(data['colourfg'])
|
|
|
|
if 'colourbg' in data.keys():
|
|
|
|
BACKGROUND_COLOUR = convert_colour(data['colourbg'])
|
|
|
|
return {'message': 'text updated'}, 201
|
|
|
|
|
|
|
|
def post(self, data):
|
|
|
|
|
|
|
|
return {'message': 'text updated'}, 201
|
|
|
|
|
|
|
|
|
|
|
|
def status_handler(mode, status, ip):
|
|
|
|
global MESSAGE
|
|
|
|
print("Network: {}".format(WIFI_CONFIG.SSID))
|
|
|
|
status_text = "Connecting..."
|
|
|
|
if status is not None:
|
|
|
|
if status:
|
|
|
|
status_text = "Connection successful!"
|
|
|
|
else:
|
|
|
|
status_text = "Connection failed!"
|
|
|
|
|
|
|
|
print(status_text)
|
|
|
|
print("IP: {}".format(ip))
|
|
|
|
MESSAGE = "{}".format(ip)
|
|
|
|
|
|
|
|
|
|
|
|
# Create web server application
|
|
|
|
app = webserver()
|
|
|
|
|
|
|
|
|
|
|
|
# Index page
|
|
|
|
@app.route('/')
|
|
|
|
async def index(request, response):
|
|
|
|
# Send actual HTML page
|
|
|
|
await response.send_file('index.html', content_type='text/html')
|
|
|
|
|
|
|
|
|
|
|
|
# HTTP redirection
|
|
|
|
@app.route('/redirect')
|
|
|
|
async def redirect(request, response):
|
|
|
|
# Start HTTP response with content-type text/html
|
|
|
|
await response.redirect('/')
|
|
|
|
|
|
|
|
# constants for controlling scrolling text
|
|
|
|
PADDING = 5
|
|
|
|
MESSAGE_COLOUR = (255, 255, 255)
|
|
|
|
OUTLINE_COLOUR = (0, 0, 0)
|
|
|
|
BACKGROUND_COLOUR = (10, 0, 96)
|
|
|
|
MESSAGE = "Connecting"
|
|
|
|
HOLD_TIME = 2.0
|
|
|
|
STEP_TIME = 0.075
|
|
|
|
|
|
|
|
# create galactic object and graphics surface for drawing
|
|
|
|
su = StellarUnicorn()
|
|
|
|
graphics = PicoGraphics(DISPLAY)
|
|
|
|
|
|
|
|
width = StellarUnicorn.WIDTH
|
|
|
|
height = StellarUnicorn.HEIGHT
|
|
|
|
|
|
|
|
|
|
|
|
# function for drawing outlined text
|
|
|
|
def outline_text(text, x, y):
|
|
|
|
graphics.set_pen(graphics.create_pen(int(OUTLINE_COLOUR[0]), int(OUTLINE_COLOUR[1]), int(OUTLINE_COLOUR[2])))
|
|
|
|
graphics.text(text, x - 1, y - 1, -1, 1)
|
|
|
|
graphics.text(text, x, y - 1, -1, 1)
|
|
|
|
graphics.text(text, x + 1, y - 1, -1, 1)
|
|
|
|
graphics.text(text, x - 1, y, -1, 1)
|
|
|
|
graphics.text(text, x + 1, y, -1, 1)
|
|
|
|
graphics.text(text, x - 1, y + 1, -1, 1)
|
|
|
|
graphics.text(text, x, y + 1, -1, 1)
|
|
|
|
graphics.text(text, x + 1, y + 1, -1, 1)
|
|
|
|
|
|
|
|
graphics.set_pen(graphics.create_pen(int(MESSAGE_COLOUR[0]), int(MESSAGE_COLOUR[1]), int(MESSAGE_COLOUR[2])))
|
|
|
|
graphics.text(text, x, y, -1, 1)
|
|
|
|
|
|
|
|
|
|
|
|
def run():
|
|
|
|
# Setup wifi
|
|
|
|
network_manager = NetworkManager(WIFI_CONFIG.COUNTRY, status_handler=status_handler)
|
|
|
|
|
|
|
|
app.add_resource(text, '/update')
|
|
|
|
|
|
|
|
# Connect to Wifi network
|
|
|
|
asyncio.get_event_loop().run_until_complete(network_manager.client(WIFI_CONFIG.SSID, WIFI_CONFIG.PSK))
|
|
|
|
while (not network_manager.isconnected()):
|
|
|
|
time.sleep(0.1)
|
|
|
|
|
|
|
|
|
|
|
|
su.set_brightness(0.5)
|
|
|
|
|
|
|
|
# Start wifi connection
|
|
|
|
run()
|
|
|
|
|
|
|
|
|
|
|
|
async def message_update():
|
|
|
|
global MESSAGE
|
|
|
|
last_time = time.ticks_ms()
|
|
|
|
STATE_PRE_SCROLL = 0
|
|
|
|
STATE_SCROLLING = 1
|
|
|
|
STATE_POST_SCROLL = 2
|
|
|
|
|
|
|
|
shift = 0
|
|
|
|
state = STATE_PRE_SCROLL
|
|
|
|
|
|
|
|
# set the font
|
|
|
|
graphics.set_font("bitmap8")
|
|
|
|
|
|
|
|
# calculate the message width so scrolling can happen
|
|
|
|
msg_width = graphics.measure_text(MESSAGE, 1)
|
|
|
|
while 1:
|
|
|
|
|
|
|
|
msg_width = graphics.measure_text(MESSAGE, 1)
|
|
|
|
time_ms = time.ticks_ms()
|
|
|
|
|
|
|
|
if su.is_pressed(StellarUnicorn.SWITCH_BRIGHTNESS_UP):
|
|
|
|
su.adjust_brightness(+0.01)
|
|
|
|
|
|
|
|
if su.is_pressed(StellarUnicorn.SWITCH_BRIGHTNESS_DOWN):
|
|
|
|
su.adjust_brightness(-0.01)
|
|
|
|
|
|
|
|
if state == STATE_PRE_SCROLL and time_ms - last_time > HOLD_TIME * 1000:
|
|
|
|
if msg_width + PADDING * 2 >= width:
|
|
|
|
state = STATE_SCROLLING
|
|
|
|
last_time = time_ms
|
|
|
|
|
|
|
|
if state == STATE_SCROLLING and time_ms - last_time > STEP_TIME * 1000:
|
|
|
|
shift += 1
|
|
|
|
if shift >= (msg_width + PADDING * 2) - width - 1:
|
|
|
|
state = STATE_POST_SCROLL
|
|
|
|
last_time = time_ms
|
|
|
|
|
|
|
|
if state == STATE_POST_SCROLL and time_ms - last_time > HOLD_TIME * 1000:
|
|
|
|
state = STATE_PRE_SCROLL
|
|
|
|
shift = 0
|
|
|
|
last_time = time_ms
|
|
|
|
|
|
|
|
graphics.set_pen(graphics.create_pen(int(BACKGROUND_COLOUR[0]), int(BACKGROUND_COLOUR[1]), int(BACKGROUND_COLOUR[2])))
|
|
|
|
graphics.clear()
|
|
|
|
|
2023-07-02 14:14:25 +00:00
|
|
|
outline_text(MESSAGE, x=PADDING - shift, y=4)
|
2023-05-30 11:42:27 +00:00
|
|
|
|
|
|
|
# update the display
|
|
|
|
su.update(graphics)
|
|
|
|
|
|
|
|
# pause for a moment (important or the USB serial device will fail)
|
|
|
|
await asyncio.sleep(0.001)
|
|
|
|
|
|
|
|
|
|
|
|
# The following is required to run both the web server and the scrolling text coherently
|
|
|
|
app._server_coro = app._tcp_server(host, port, app.backlog)
|
|
|
|
loop = asyncio.get_event_loop()
|
|
|
|
t1 = loop.create_task(message_update())
|
|
|
|
t2 = loop.create_task(app._server_coro)
|
|
|
|
loop.run_forever()
|