Toggle Navigation
Hatchery
Eggs
airspace
__init__.py
Users
Badges
Login
Register
__init__.py
raw
Content
import system import wifi import display import gc import buttons import urequests as requests import sys import mch22 # Simple logging implementation class Logger: INFO = 1 ERROR = 2 DEBUG = 3 def __init__(self, name): self.name = name def _log(self, level, msg): level_str = "INFO" if level == self.INFO else "ERROR" if level == self.ERROR else "DEBUG" print(f"[{level_str}] {self.name}: {msg}") def info(self, msg): self._log(self.INFO, msg) def error(self, msg): self._log(self.ERROR, msg) def debug(self, msg): self._log(self.DEBUG, msg) # Create logger instance logger = Logger(__name__) def draw_error(message, details=""): """Utility function to display errors consistently""" display.drawFill(display.WHITE) display.drawText(10, 10, message, 0x000000, "Roboto_Regular12") if details: display.drawText(10, 30, str(details), 0x000000, "Roboto_Regular12") display.flush() def connect_to_wifi(): if not wifi.status(): logger.info("Connecting to WiFi...") wifi.connect() #("Wokwi-GUEST", "") display.drawFill(display.WHITE) display.drawText(10, 10, "Connecting to WiFi...", 0x000000, "Roboto_Regular12") display.flush() if not wifi.wait(): logger.error("WiFi connection failed") system.home() logger.info("WiFi connected successfully") def draw_splash(): display.drawFill(display.WHITE) display.drawText(10, 10, "Getting aircraft data...", 0x000000, "Roboto_Regular12") display.drawText(10, 30, "Powered by ADSB.fi", 0x000000, "Roboto_Regular12") display.flush() def fetch_aircraft_data(): # Zeewolde coordinates lat = 52.3333 lon = 5.5333 dist = 25 # 25nm radius url = f"https://opendata.adsb.fi/api/v2/lat/{lat}/lon/{lon}/dist/{dist}" logger.info(f"Fetching aircraft data from {url}") r = requests.get(url) gc.collect() data = r.json() r.close() logger.info("Aircraft data fetched successfully") return data def draw_aircraft(aircraft_list): display.drawFill(display.WHITE) # Draw header with nice border display.drawRect(0, 0, display.width(), 25, False, 0x000000) display.drawText(5, 5, f"Aircraft near Zeewolde ({len(aircraft_list)})", 0x000000, "pixelade13") if not aircraft_list: display.drawText(10, 40, "No aircraft in range", 0x000000, "Roboto_Regular12") display.flush() return y = 35 for i, aircraft in enumerate(aircraft_list[:6]): # Show max 7 aircraft for better spacing callsign = aircraft.get("flight", "N/A").strip() alt = aircraft.get("alt_baro", 0) speed = aircraft.get("gs", 0) # Ground speed in knots alt_text = "GND" if isinstance(alt, str) else f"{int(alt)}ft" # Draw box around each aircraft entry display.drawRect(5, y + (i * 30) - 5, display.width() - 10, 25, False, 0x000000) # Main flight info display.drawText(10, y + (i * 30), callsign, 0x000000, "DejaVuSans20") # Altitude and speed on the right speed_text = f"{int(speed)}kt" if speed else "---" alt_info = f"{alt_text}/{speed_text}" display.drawText(display.width() - 120, y + (i * 30), alt_info, 0x000000, "Roboto_Regular12") # Draw footer footer_y = y + (6 * 30) display.drawLine(0, footer_y, display.width(), footer_y, 0x000000) display.drawText(5, footer_y + 5, "A: Refresh | HOME: Exit", 0x000000, "Roboto_Regular12") display.flush() def main(): try: logger.info("Starting application") connect_to_wifi() draw_splash() data = fetch_aircraft_data() aircraft_list = data.get("aircraft", []) draw_aircraft(aircraft_list) except Exception as exc: sys.print_exception(exc) error_msg = f"Error in main: {type(exc).__name__} - {str(exc)}" logger.error(error_msg) draw_error("Application Error", error_msg) def cb_home(pressed): logger.info("Home callback triggered") if pressed: logger.info("Home button pressed") mch22.exit_python() def cb_refresh(pressed): logger.info("Refresh callback triggered") if pressed: logger.info("Refresh button pressed") try: data = fetch_aircraft_data() aircraft_list = data.get("aircraft", []) draw_aircraft(aircraft_list) except Exception as exc: sys.print_exception(exc) error_msg = f"Error during refresh: {str(exc)}" logger.error(error_msg) draw_error("Error fetching data", error_msg) buttons.attach(buttons.BTN_HOME, cb_home) buttons.attach(buttons.BTN_A, cb_refresh) main()