237 lines
7.8 KiB
Python
237 lines
7.8 KiB
Python
"""
|
|
Weather icon drawing functions for 64x64 LED matrix.
|
|
All icons are designed for a 24x24 pixel area.
|
|
"""
|
|
from rgbmatrix import graphics
|
|
|
|
|
|
def draw_sunny(canvas, x, y):
|
|
"""Draw a sun with rays - clear/sunny weather."""
|
|
sun_color = graphics.Color(255, 200, 0)
|
|
ray_color = graphics.Color(255, 140, 0)
|
|
|
|
# Draw sun rays (8 directions)
|
|
graphics.DrawLine(canvas, x + 12, y + 2, x + 12, y + 5, ray_color)
|
|
graphics.DrawLine(canvas, x + 12, y + 19, x + 12, y + 22, ray_color)
|
|
graphics.DrawLine(canvas, x + 2, y + 12, x + 5, y + 12, ray_color)
|
|
graphics.DrawLine(canvas, x + 19, y + 12, x + 22, y + 12, ray_color)
|
|
graphics.DrawLine(canvas, x + 5, y + 5, x + 7, y + 7, ray_color)
|
|
graphics.DrawLine(canvas, x + 17, y + 17, x + 19, y + 19, ray_color)
|
|
graphics.DrawLine(canvas, x + 5, y + 19, x + 7, y + 17, ray_color)
|
|
graphics.DrawLine(canvas, x + 17, y + 7, x + 19, y + 5, ray_color)
|
|
|
|
# Draw filled sun
|
|
for r in range(6, 0, -1):
|
|
graphics.DrawCircle(canvas, x + 12, y + 12, r, sun_color)
|
|
|
|
|
|
def draw_clear_night(canvas, x, y):
|
|
"""Draw a crescent moon with stars."""
|
|
moon_color = graphics.Color(255, 255, 200)
|
|
|
|
# Draw moon
|
|
for r in range(7, 0, -1):
|
|
graphics.DrawCircle(canvas, x + 10, y + 12, r, moon_color)
|
|
|
|
# Draw stars
|
|
canvas.SetPixel(x + 20, y + 6, 255, 255, 255)
|
|
canvas.SetPixel(x + 18, y + 10, 255, 255, 255)
|
|
canvas.SetPixel(x + 22, y + 14, 255, 255, 255)
|
|
canvas.SetPixel(x + 19, y + 18, 255, 255, 255)
|
|
|
|
|
|
def _draw_cloud_shape(canvas, x, y, color):
|
|
"""Helper to draw a cloud shape."""
|
|
for r in range(4, 0, -1):
|
|
graphics.DrawCircle(canvas, x + 4, y + 4, r, color)
|
|
for r in range(5, 0, -1):
|
|
graphics.DrawCircle(canvas, x + 10, y + 3, r, color)
|
|
for r in range(4, 0, -1):
|
|
graphics.DrawCircle(canvas, x + 15, y + 5, r, color)
|
|
for r in range(3, 0, -1):
|
|
graphics.DrawCircle(canvas, x + 6, y + 7, r, color)
|
|
for r in range(3, 0, -1):
|
|
graphics.DrawCircle(canvas, x + 12, y + 7, r, color)
|
|
|
|
|
|
def draw_partly_cloudy(canvas, x, y):
|
|
"""Draw sun partially covered by cloud."""
|
|
sun_color = graphics.Color(255, 200, 0)
|
|
ray_color = graphics.Color(255, 140, 0)
|
|
cloud_color = graphics.Color(220, 220, 220)
|
|
|
|
# Draw partial sun
|
|
graphics.DrawLine(canvas, x + 8, y + 2, x + 8, y + 4, ray_color)
|
|
graphics.DrawLine(canvas, x + 2, y + 8, x + 4, y + 8, ray_color)
|
|
graphics.DrawLine(canvas, x + 3, y + 3, x + 5, y + 5, ray_color)
|
|
for r in range(4, 0, -1):
|
|
graphics.DrawCircle(canvas, x + 8, y + 8, r, sun_color)
|
|
|
|
# Draw cloud
|
|
_draw_cloud_shape(canvas, x + 6, y + 10, cloud_color)
|
|
|
|
|
|
def draw_partly_cloudy_night(canvas, x, y):
|
|
"""Draw moon partially covered by cloud."""
|
|
moon_color = graphics.Color(255, 255, 200)
|
|
cloud_color = graphics.Color(180, 180, 200)
|
|
|
|
for r in range(4, 0, -1):
|
|
graphics.DrawCircle(canvas, x + 8, y + 8, r, moon_color)
|
|
_draw_cloud_shape(canvas, x + 6, y + 10, cloud_color)
|
|
|
|
|
|
def draw_cloudy(canvas, x, y):
|
|
"""Draw overcast clouds."""
|
|
cloud_light = graphics.Color(200, 200, 200)
|
|
cloud_dark = graphics.Color(150, 150, 150)
|
|
|
|
_draw_cloud_shape(canvas, x + 2, y + 6, cloud_dark)
|
|
_draw_cloud_shape(canvas, x + 6, y + 10, cloud_light)
|
|
|
|
|
|
def draw_rainy(canvas, x, y):
|
|
"""Draw cloud with rain drops."""
|
|
cloud_color = graphics.Color(150, 150, 170)
|
|
rain_color = graphics.Color(100, 150, 255)
|
|
|
|
_draw_cloud_shape(canvas, x + 4, y + 4, cloud_color)
|
|
|
|
for i in range(4):
|
|
x_start = x + 6 + i * 4
|
|
graphics.DrawLine(canvas, x_start, y + 16, x_start - 2, y + 20, rain_color)
|
|
graphics.DrawLine(canvas, x_start + 1, y + 18, x_start - 1, y + 22, rain_color)
|
|
|
|
|
|
def draw_pouring(canvas, x, y):
|
|
"""Draw cloud with heavy rain."""
|
|
cloud_color = graphics.Color(100, 100, 120)
|
|
rain_color = graphics.Color(80, 130, 255)
|
|
|
|
_draw_cloud_shape(canvas, x + 4, y + 2, cloud_color)
|
|
|
|
for i in range(5):
|
|
x_start = x + 4 + i * 4
|
|
graphics.DrawLine(canvas, x_start, y + 14, x_start - 3, y + 22, rain_color)
|
|
|
|
|
|
def draw_snowy(canvas, x, y):
|
|
"""Draw cloud with snowflakes."""
|
|
cloud_color = graphics.Color(180, 180, 200)
|
|
|
|
_draw_cloud_shape(canvas, x + 4, y + 4, cloud_color)
|
|
|
|
for i in range(3):
|
|
sx = x + 8 + i * 5
|
|
sy = y + 18 + (i % 2) * 3
|
|
canvas.SetPixel(sx, sy, 255, 255, 255)
|
|
canvas.SetPixel(sx - 1, sy, 255, 255, 255)
|
|
canvas.SetPixel(sx + 1, sy, 255, 255, 255)
|
|
canvas.SetPixel(sx, sy - 1, 255, 255, 255)
|
|
canvas.SetPixel(sx, sy + 1, 255, 255, 255)
|
|
|
|
|
|
def draw_thunderstorm(canvas, x, y):
|
|
"""Draw cloud with lightning bolt."""
|
|
cloud_color = graphics.Color(80, 80, 100)
|
|
lightning_color = graphics.Color(255, 255, 0)
|
|
|
|
_draw_cloud_shape(canvas, x + 4, y + 2, cloud_color)
|
|
|
|
graphics.DrawLine(canvas, x + 12, y + 12, x + 10, y + 16, lightning_color)
|
|
graphics.DrawLine(canvas, x + 10, y + 16, x + 14, y + 16, lightning_color)
|
|
graphics.DrawLine(canvas, x + 14, y + 16, x + 10, y + 22, lightning_color)
|
|
|
|
|
|
def draw_foggy(canvas, x, y):
|
|
"""Draw horizontal fog lines."""
|
|
fog_color = graphics.Color(180, 180, 180)
|
|
|
|
for i in range(5):
|
|
y_pos = y + 6 + i * 3
|
|
graphics.DrawLine(canvas, x + 2, y_pos, x + 20, y_pos, fog_color)
|
|
|
|
|
|
def draw_windy(canvas, x, y):
|
|
"""Draw wind lines."""
|
|
wind_color = graphics.Color(150, 200, 255)
|
|
|
|
graphics.DrawLine(canvas, x + 2, y + 8, x + 18, y + 8, wind_color)
|
|
graphics.DrawLine(canvas, x + 18, y + 8, x + 20, y + 6, wind_color)
|
|
graphics.DrawLine(canvas, x + 4, y + 12, x + 22, y + 12, wind_color)
|
|
graphics.DrawLine(canvas, x + 22, y + 12, x + 23, y + 10, wind_color)
|
|
graphics.DrawLine(canvas, x + 2, y + 16, x + 16, y + 16, wind_color)
|
|
graphics.DrawLine(canvas, x + 16, y + 16, x + 18, y + 14, wind_color)
|
|
|
|
|
|
def draw_hail(canvas, x, y):
|
|
"""Draw cloud with hail."""
|
|
cloud_color = graphics.Color(140, 140, 160)
|
|
hail_color = graphics.Color(200, 220, 255)
|
|
|
|
_draw_cloud_shape(canvas, x + 4, y + 4, cloud_color)
|
|
|
|
for i in range(3):
|
|
hx = x + 8 + i * 5
|
|
hy = y + 18 + (i % 2) * 2
|
|
graphics.DrawCircle(canvas, hx, hy, 2, hail_color)
|
|
|
|
|
|
def draw_unknown(canvas, x, y):
|
|
"""Draw question mark for unknown weather."""
|
|
color = graphics.Color(255, 255, 255)
|
|
|
|
graphics.DrawCircle(canvas, x + 12, y + 8, 4, color)
|
|
canvas.SetPixel(x + 12, y + 14, 255, 255, 255)
|
|
canvas.SetPixel(x + 12, y + 17, 255, 255, 255)
|
|
|
|
|
|
# Weather state to icon function mapping
|
|
WEATHER_ICONS = {
|
|
'sunny': draw_sunny,
|
|
'clear-day': draw_sunny,
|
|
'clear-night': draw_clear_night,
|
|
'partlycloudy': draw_partly_cloudy,
|
|
'partly-cloudy-day': draw_partly_cloudy,
|
|
'partly-cloudy-night': draw_partly_cloudy_night,
|
|
'cloudy': draw_cloudy,
|
|
'overcast': draw_cloudy,
|
|
'rainy': draw_rainy,
|
|
'rain': draw_rainy,
|
|
'showers': draw_rainy,
|
|
'pouring': draw_pouring,
|
|
'snowy': draw_snowy,
|
|
'snow': draw_snowy,
|
|
'snowy-rainy': draw_snowy,
|
|
'sleet': draw_snowy,
|
|
'hail': draw_hail,
|
|
'lightning': draw_thunderstorm,
|
|
'lightning-rainy': draw_thunderstorm,
|
|
'thunderstorm': draw_thunderstorm,
|
|
'fog': draw_foggy,
|
|
'foggy': draw_foggy,
|
|
'mist': draw_foggy,
|
|
'hazy': draw_foggy,
|
|
'windy': draw_windy,
|
|
'windy-variant': draw_windy,
|
|
'exceptional': draw_unknown,
|
|
}
|
|
|
|
|
|
def draw_weather_icon(canvas, x, y, weather_state):
|
|
"""Draw weather icon based on state string."""
|
|
weather_lower = weather_state.lower() if weather_state else ''
|
|
|
|
# Try exact match
|
|
if weather_lower in WEATHER_ICONS:
|
|
WEATHER_ICONS[weather_lower](canvas, x, y)
|
|
return
|
|
|
|
# Try partial match
|
|
for key, draw_func in WEATHER_ICONS.items():
|
|
if key in weather_lower or weather_lower in key:
|
|
draw_func(canvas, x, y)
|
|
return
|
|
|
|
draw_unknown(canvas, x, y)
|