57 lines
1.6 KiB
Python
57 lines
1.6 KiB
Python
"""Wyoming event handler for satellites."""
|
|
import argparse
|
|
import logging
|
|
import time
|
|
|
|
from wyoming.event import Event
|
|
from wyoming.info import Describe, Info
|
|
from wyoming.server import AsyncEventHandler
|
|
|
|
from .satellite import SatelliteBase
|
|
|
|
_LOGGER = logging.getLogger()
|
|
|
|
|
|
class SatelliteEventHandler(AsyncEventHandler):
|
|
"""Event handler for clients."""
|
|
|
|
def __init__(
|
|
self,
|
|
wyoming_info: Info,
|
|
satellite: SatelliteBase,
|
|
cli_args: argparse.Namespace,
|
|
*args,
|
|
**kwargs,
|
|
) -> None:
|
|
super().__init__(*args, **kwargs)
|
|
|
|
self.cli_args = cli_args
|
|
self.wyoming_info_event = wyoming_info.event()
|
|
self.client_id = str(time.monotonic_ns())
|
|
self.satellite = satellite
|
|
|
|
# -------------------------------------------------------------------------
|
|
|
|
async def handle_event(self, event: Event) -> bool:
|
|
"""Handle events from the server."""
|
|
if Describe.is_type(event.type):
|
|
await self.write_event(self.wyoming_info_event)
|
|
return True
|
|
|
|
if self.satellite.server_id is None:
|
|
# Take over after a problem occurred
|
|
self.satellite.set_server(self.client_id, self.writer)
|
|
elif self.satellite.server_id != self.client_id:
|
|
# New connection
|
|
_LOGGER.debug("Connection cancelled: %s", self.client_id)
|
|
return False
|
|
|
|
await self.satellite.event_from_server(event)
|
|
|
|
return True
|
|
|
|
async def disconnect(self) -> None:
|
|
"""Server disconnect."""
|
|
if self.satellite.server_id == self.client_id:
|
|
self.satellite.clear_server()
|