94 lines
3.0 KiB
Python
94 lines
3.0 KiB
Python
import requests_unixsocket as req
|
|
import config
|
|
from time import sleep
|
|
import socket
|
|
import json
|
|
import logging
|
|
|
|
class Networking:
|
|
def __init__(self, output_server_address, input_socket_address):
|
|
self.retries = 0
|
|
self.server_address = ""
|
|
self.output_server_address = output_server_address
|
|
self.input_socket_address = input_socket_address
|
|
self.__connect__(output_server_address, input_socket_address)
|
|
|
|
|
|
def __connect__(self):
|
|
self.input_socket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
|
|
self.output_session = req.Session()
|
|
adapter = req.adapters.UnixAdapter(pool_connections=1)
|
|
self.output_session.mount('http+unix://', adapter)
|
|
self.server_address = "http+unix://" + self.output_server_address.replace("/", "%2F")
|
|
self.input_socket.connect(self.input_socket_address)
|
|
print("Connected to " + self.input_socket_address + " and started server " + self.server_address)
|
|
|
|
def get(self, path):
|
|
if self.retries > config.MAX_NETWORK_RETRIES:
|
|
return
|
|
|
|
try:
|
|
response = self.output_session.get(self.server_address + path)
|
|
except Exception as e:
|
|
logging.error("Network exception. Could not get " + path + ".... Reconnecting!")
|
|
logging.error(e)
|
|
self.retries += 1
|
|
sleep(config.NETWORK_SLEEP_TIME_SECONDS)
|
|
self.__connect__()
|
|
return self.get(path)
|
|
|
|
assert response.status_code == 200
|
|
return response.content
|
|
|
|
def getSolenoids(self):
|
|
return json.loads(self.get("/solenoids"))
|
|
|
|
def getSounds(self):
|
|
return json.loads(self.get("/sounds"))
|
|
|
|
def getLamps(self):
|
|
return json.loads(self.get("/lamps"))
|
|
|
|
def getDisplays(self):
|
|
return json.loads(self.get("/displays"))
|
|
|
|
def triggerSolenoid(self, solenoid):
|
|
self.get("/solenoids/" + solenoid + "/trigger")
|
|
|
|
def playSound(self, sound):
|
|
self.get("/sounds/" + sound + "/play")
|
|
|
|
def activateLamp(self, lamp):
|
|
self.get("/lamps/" + lamp.name + "/activate")
|
|
|
|
def deactivateLamp(self, lamp):
|
|
self.get("/lamps/" + lamp.name + "/deactivate")
|
|
|
|
def activateFlipper(self, name):
|
|
self.get("/flippers/" + name + "/activate")
|
|
|
|
def deactivateFlipper(self, name):
|
|
self.get("/flippers/" + name + "/deactivate")
|
|
|
|
def lampStatus(self, lamp):
|
|
return json.loads(self.get("/lamps/" + lamp + "/status"))
|
|
|
|
def writeDisplayScore(self, display, score):
|
|
self.get("/displays/" + display + "/write_score/" + str(score))
|
|
|
|
def writeDisplayContent(self, display, content):
|
|
self.get("/displays/" + display + "/write_content/" + content)
|
|
|
|
async def getInputEvent(self):
|
|
header = list()
|
|
while b'\x02' not in header:
|
|
byte = self.input_socket.recv(1)
|
|
header.append(byte)
|
|
header = [x.decode('utf8') for x in header[:-1]]
|
|
|
|
headerAsString = str().join(header)
|
|
|
|
eventAsJson = json.loads(headerAsString)
|
|
|
|
return eventAsJson
|