class Backend: _instance = None def __init__(self): self._init_websocket() self._load_user_preferences() self._init_resources() @staticmethod def _init_websocket(): websocket_started = False while not websocket_started: try: app.run() websocket_started = app._started except AlreadyRunningError: app.stop() except (ConnectionRefusedError, TimeoutError): # Crossbar router not yet accepting connections, let's try again pass def _init_resources(self): self.time = Time() self.odo = Odometer() self.kpro = Kpro() def _load_user_preferences(self): """ In order to read only once from the setup file we will load in memory some user preferences that we are gonna use later on. """ self.setup_file = SetupFile() self.style = Style( self.setup_file.json.get("style").get("tpsLowerThreshold"), self.setup_file.json.get("style").get("tpsUpperThreshold"), self.setup_file.json.get("style").get("elapsedSeconds"), ) self.iat_unit = self.setup_file.json.get("iat", {}).get("unit", "celsius") self.ect_unit = self.setup_file.json.get("ect", {}).get("unit", "celsius") self.vss_unit = self.setup_file.json.get("vss", {}).get("unit", "kmh") self.o2_unit = self.setup_file.json.get("o2", {}).get("unit", "afr") self.odo_unit = self.setup_file.json.get("odo", {}).get("unit", "km") self.map_unit = self.setup_file.json.get("map", {}).get("unit", "bar") self.an0_unit = self.setup_file.json.get("an0", {}).get("unit", "volts") self.an1_unit = self.setup_file.json.get("an1", {}).get("unit", "volts") self.an2_unit = self.setup_file.json.get("an2", {}).get("unit", "volts") self.an3_unit = self.setup_file.json.get("an3", {}).get("unit", "volts") self.an4_unit = self.setup_file.json.get("an4", {}).get("unit", "volts") self.an5_unit = self.setup_file.json.get("an5", {}).get("unit", "volts") self.an6_unit = self.setup_file.json.get("an6", {}).get("unit", "volts") self.an7_unit = self.setup_file.json.get("an7", {}).get("unit", "volts") self.an0_formula = self.setup_file.get_formula("an0") self.an1_formula = self.setup_file.get_formula("an1") self.an2_formula = self.setup_file.get_formula("an2") self.an3_formula = self.setup_file.get_formula("an3") self.an4_formula = self.setup_file.get_formula("an4") self.an5_formula = self.setup_file.get_formula("an5") self.an6_formula = self.setup_file.get_formula("an6") self.an7_formula = self.setup_file.get_formula("an7") def update(self): """ load the websocket with updated info """ if not self.kpro.status: # if kpro is down try to reconnect self.kpro.find_and_connect() self.odo.save(self.kpro.vss["kmh"]) self.style.update(self.kpro.tps) publish( "data", { "bat": self.kpro.bat, "gear": self.kpro.gear, "iat": self.kpro.iat[self.iat_unit], "tps": self.kpro.tps, "ect": self.kpro.ect[self.ect_unit], "rpm": self.kpro.rpm, "vss": self.kpro.vss[self.vss_unit], "o2": self.kpro.o2[self.o2_unit], "cam": self.kpro.cam, "mil": self.kpro.mil, "fan": self.kpro.fanc, "bksw": self.kpro.bksw, "flr": self.kpro.flr, "eth": self.kpro.eth, "scs": self.kpro.scs, "fmw": self.kpro.firmware, "map": self.kpro.map[self.map_unit], "an0": self.an0_formula( self.kpro.analog_input(0))[self.an0_unit], "an1": self.an1_formula( self.kpro.analog_input(1))[self.an1_unit], "an2": self.an2_formula( self.kpro.analog_input(2))[self.an2_unit], "an3": self.an3_formula( self.kpro.analog_input(3))[self.an3_unit], "an4": self.an4_formula( self.kpro.analog_input(4))[self.an4_unit], "an5": self.an5_formula( self.kpro.analog_input(5))[self.an5_unit], "an6": self.an6_formula( self.kpro.analog_input(6))[self.an6_unit], "an7": self.an7_formula( self.kpro.analog_input(7))[self.an7_unit], "time": self.time.get_time(), "odo": self.odo.get_mileage()[self.odo_unit], "style": self.style.status, "ver": __version__, }, ) def _setup(self): return self.setup_file.load_setup() def _save(self, new_setup): self.setup_file.save_setup(new_setup) self.setup_file.rotate_screen(new_setup["screen"]["rotate"]) publish( "refresh") # refresh the frontend so the new changes are applied self._load_user_preferences() # refresh the backend too def _reset(self): self.setup_file.reset_setup() publish( "refresh") # refresh the frontend so the new changes are applied self._load_user_preferences() # refresh the backend too @classmethod def get(cls): """ get the running instance of Backend class or instantiate it for first time """ if cls._instance is None: cls._instance = cls() return cls._instance @classmethod def setup(cls): return cls.get()._setup() @classmethod def save(cls, new_setup): cls.get()._save(new_setup) @classmethod def reset(cls): cls.get()._reset()
class Backend: def __init__(self): self._load_user_preferences() self._init_resources() self._init_websocket() def stop(self): self.websocket.stop() def _init_websocket(self): self.websocket = Websocket(self) def _init_resources(self): self.time = Time() self.odo = Odometer() self.kpro = Kpro() def _load_user_preferences(self): """ In order to read only once from the setup file we will load in memory some user preferences that we are gonna use later on. """ self.setup_file = SetupFile() self.style = Style( self.setup_file.json.get("style").get("tpsLowerThreshold"), self.setup_file.json.get("style").get("tpsUpperThreshold"), self.setup_file.json.get("style").get("elapsedSeconds"), ) self.iat_unit = self.setup_file.json.get("iat", {}).get("unit", "celsius") self.ect_unit = self.setup_file.json.get("ect", {}).get("unit", "celsius") self.vss_unit = self.setup_file.json.get("vss", {}).get("unit", "kmh") self.o2_unit = self.setup_file.json.get("o2", {}).get("unit", "afr") self.odo_unit = self.setup_file.json.get("odo", {}).get("unit", "km") self.map_unit = self.setup_file.json.get("map", {}).get("unit", "bar") self.an0_unit = self.setup_file.json.get("an0", {}).get("unit", "volts") self.an1_unit = self.setup_file.json.get("an1", {}).get("unit", "volts") self.an2_unit = self.setup_file.json.get("an2", {}).get("unit", "volts") self.an3_unit = self.setup_file.json.get("an3", {}).get("unit", "volts") self.an4_unit = self.setup_file.json.get("an4", {}).get("unit", "volts") self.an5_unit = self.setup_file.json.get("an5", {}).get("unit", "volts") self.an6_unit = self.setup_file.json.get("an6", {}).get("unit", "volts") self.an7_unit = self.setup_file.json.get("an7", {}).get("unit", "volts") self.an0_formula = self.setup_file.get_formula("an0") self.an1_formula = self.setup_file.get_formula("an1") self.an2_formula = self.setup_file.get_formula("an2") self.an3_formula = self.setup_file.get_formula("an3") self.an4_formula = self.setup_file.get_formula("an4") self.an5_formula = self.setup_file.get_formula("an5") self.an6_formula = self.setup_file.get_formula("an6") self.an7_formula = self.setup_file.get_formula("an7") def update(self): """ load the websocket with updated info """ if not self.kpro.status: # if kpro is down try to reconnect self.kpro.find_and_connect() self.odo.save(self.kpro.vss["kmh"]) self.style.update(self.kpro.tps) return { "bat": self.kpro.bat, "gear": self.kpro.gear, "iat": self.kpro.iat[self.iat_unit], "tps": self.kpro.tps, "ect": self.kpro.ect[self.ect_unit], "rpm": self.kpro.rpm, "vss": self.kpro.vss[self.vss_unit], "o2": self.kpro.o2[self.o2_unit], "cam": self.kpro.cam, "mil": self.kpro.mil, "fan": self.kpro.fanc, "bksw": self.kpro.bksw, "flr": self.kpro.flr, "eth": self.kpro.eth, "scs": self.kpro.scs, "fmw": self.kpro.firmware, "map": self.kpro.map[self.map_unit], "an0": self.an0_formula(self.kpro.analog_input(0))[self.an0_unit], "an1": self.an1_formula(self.kpro.analog_input(1))[self.an1_unit], "an2": self.an2_formula(self.kpro.analog_input(2))[self.an2_unit], "an3": self.an3_formula(self.kpro.analog_input(3))[self.an3_unit], "an4": self.an4_formula(self.kpro.analog_input(4))[self.an4_unit], "an5": self.an5_formula(self.kpro.analog_input(5))[self.an5_unit], "an6": self.an6_formula(self.kpro.analog_input(6))[self.an6_unit], "an7": self.an7_formula(self.kpro.analog_input(7))[self.an7_unit], "time": self.time.get_time(), "odo": self.odo.get_mileage()[self.odo_unit], "style": self.style.status, "ver": __version__, } def setup(self): """Return the current setup""" return self.setup_file.load_setup() def save(self, new_setup): """Save a new setup""" self.setup_file.save_setup(new_setup) self.setup_file.rotate_screen(new_setup["screen"]["rotate"]) self._load_user_preferences() # refresh the backend too def reset(self): """Reset to the default setup""" self.setup_file.reset_setup() self._load_user_preferences() # refresh the backend too
def test_get_time(self): t = Time() self.assertRegexpMatches(t.get_time(), r'\d{2}:\d{2}:\d{2}')
'ect': kpro.ect().setdefault(ect_unit, 'celsius'), 'rpm': kpro.rpm(), 'vss': kpro.vss().setdefault(vss_unit, 'kmh'), 'o2': kpro.o2().setdefault(o2_unit, 'afr'), 'cam': kpro.cam(), 'mil': kpro.mil(), 'bksw': kpro.bksw(), 'flr': kpro.flr(), 'map': kpro.map().setdefault(map_unit, 'bar'), 'eth': kpro.eth(), 'an0': an0_formula(kpro.analog_input(0)).setdefault( an0_unit, 'volts'), 'an1': an1_formula(kpro.analog_input(1)).setdefault( an1_unit, 'volts'), 'an2': an2_formula(kpro.analog_input(2)).setdefault( an2_unit, 'volts'), 'an3': an3_formula(kpro.analog_input(3)).setdefault( an3_unit, 'volts'), 'an4': an4_formula(kpro.analog_input(4)).setdefault( an4_unit, 'volts'), 'an5': an5_formula(kpro.analog_input(5)).setdefault( an5_unit, 'volts'), 'an6': an6_formula(kpro.analog_input(6)).setdefault( an6_unit, 'volts'), 'an7': an7_formula(kpro.analog_input(7)).setdefault( an7_unit, 'volts'), 'time': time.get_time(), 'odo': odo.get_mileage(), }) sleep(0.1)
def test_get_time(self): t = Time() self.assertRegex(t.get_time(), r'\d{2}:\d{2}:\d{2}')
def test_get_time(self): t = Time() self.assertRegex(t.get_time(), r"\d{2}:\d{2}:\d{2}")
'mil': random.choice([True, False]), 'bksw': random.choice([True, False]), 'an0': Formula.psi_to_bar(Formula.ebay_150_psi(random.uniform(0, 5))), 'an1': Formula.autometer_2246(random.uniform(0, 5)), 'an2': random.uniform(0, 5), 'an3': random.uniform(0, 5), 'an4': random.uniform(0, 5), 'an5': random.uniform(0, 5), 'an6': random.uniform(0, 5), 'an7': random.uniform(0, 5), 'di4': random.randint(0, 1), 'di5': random.randint(0, 1), 'di6': random.randint(0, 1), 'di12': random.randint(0, 1), 'di21': random.randint(0, 1), 'di17': random.randint(0, 1), 'di27': random.randint(0, 1), 'di22': random.randint(0, 1), 'time': time.get_time(), 'odo': odo.get_mileage(), 'ai0': Formula.vdo_323_057(random.uniform(0, 5)), 'ai1': Formula.civic_eg_fuel_tank(random.uniform(0, 5)), 'ai2': random.uniform(0, 5), 'ai3': random.uniform(0, 5), 'ai4': random.uniform(0, 5), 'ai5': random.uniform(0, 5), 'ai6': random.uniform(0, 5), 'ai7': random.uniform(0, 5), }) sleep(0.1)
"iat": kpro.iat()[iat_unit], "tps": kpro.tps(), "ect": kpro.ect()[ect_unit], "rpm": kpro.rpm(), "vss": kpro.vss()[vss_unit], "o2": kpro.o2()[o2_unit], "cam": kpro.cam(), "mil": kpro.mil(), "fan": kpro.fanc(), "bksw": kpro.bksw(), "flr": kpro.flr(), "eth": kpro.eth(), "scs": kpro.scs(), "fmw": kpro.firmware(), "map": kpro.map()[map_unit], "an0": an0_formula(kpro.analog_input(0))[an0_unit], "an1": an1_formula(kpro.analog_input(1))[an1_unit], "an2": an2_formula(kpro.analog_input(2))[an2_unit], "an3": an3_formula(kpro.analog_input(3))[an3_unit], "an4": an4_formula(kpro.analog_input(4))[an4_unit], "an5": an5_formula(kpro.analog_input(5))[an5_unit], "an6": an6_formula(kpro.analog_input(6))[an6_unit], "an7": an7_formula(kpro.analog_input(7))[an7_unit], "time": time.get_time(), "odo": odo.get_mileage()[odo_unit], "style": style.status, "ver": __version__, }, ) sleep(0.1)