Files
xterra-overland-dashboard/pico-dashboard/comms/communication_service.py
T

69 lines
1.9 KiB
Python

from .protocol import (
make_status_request,
make_set_relay,
is_status_response,
is_relay_response,
is_error,
)
class CommunicationService:
def __init__(self, uart_client, app_state, http_client=None):
self.uart_client = uart_client
self.http_client = http_client
self.app_state = app_state
self.last_messages = []
self.use_http_fallback = False
def request_status(self):
if self.use_http_fallback and self.http_client:
message = self.http_client.get_status()
self.handle_message(message)
return message
self.uart_client.send_message(make_status_request())
return None
def set_relay(self, relay, enabled):
if self.use_http_fallback and self.http_client:
message = self.http_client.set_relay(relay, enabled)
self.handle_message(message)
return message
self.uart_client.send_message(make_set_relay(relay, enabled))
return None
def poll(self):
messages = self.uart_client.read_available_messages()
self.last_messages = messages
for message in messages:
self.handle_message(message)
return messages
def enable_http_fallback(self):
self.use_http_fallback = True
def disable_http_fallback(self):
self.use_http_fallback = False
def handle_message(self, message):
if is_status_response(message):
self.app_state.update_from_status(message)
return
if is_relay_response(message):
self.app_state.update_from_relay_response(message)
return
if is_error(message):
self.app_state.set_error(message)
return
self.app_state.set_error({
"type": "error",
"message": "unknown_message_type",
"raw": message,
})