def test_get_mileage_no_mileage_found(self): """ If no mileage is found in the setup file, the odometer should start from 0 """ with patch("devices.odometer.SetupFile.get_value") as m_get_value: m_get_value.side_effect = AttributeError odo = Odometer() assert odo.get_mileage() == {"km": 0, "miles": 0}
def test_get_mileage(self, unit, value, expected_km, expected_miles): """ Checks that the odometer reads the correct mileage after setting the value in the json setup file. """ with patch("devices.odometer.SetupFile.get_value") as m_get_value: m_get_value.return_value = {"value": value, "unit": unit} odo = Odometer() assert odo.get_mileage() == {"km": expected_km, "miles": expected_miles}
def test_save_not_enough_distance_traveled(self): """ The mileage should not increase if more than one km more is not reached """ with freeze_time("00:00:00"): # setting the starting mileage with patch("devices.odometer.SetupFile.get_value") as get_value: get_value.return_value = {"value": 0} odo = Odometer() assert odo.get_mileage() == {"km": 0, "miles": 0} # we are clean with freeze_time("00:00:30"): # after 30 secs we will notify the odometer that we have been going to 100km/h with patch("devices.odometer.SetupFile.update_key") as m_update_key: odo.save(100) # checking that we couldn't reach one km more so no update to the setup file is needed m_update_key.assert_not_called() # the mileage will remain the same assert odo.get_mileage() == {"km": 0, "miles": 0}
def test_save(self): """ Checks that the mileage increases after been some time running to a certain speed. """ with freeze_time("00:00:00"): # setting the starting mileage with patch("devices.odometer.SetupFile.get_value") as get_value: get_value.return_value = {"value": 0} odo = Odometer() assert odo.get_mileage() == {"km": 0, "miles": 0} # we are clean with freeze_time("01:00:00"): # after an hour we will notify the odometer that we have been going to 100km/h with patch("devices.odometer.SetupFile.update_key") as m_update_key: odo.save(100) # checking that we tried to save the new mileage into the setup file m_update_key.assert_called_with("odo", {"value": 100}) # after an hour we should be in 100km mileage assert odo.get_mileage() == {"km": 100, "miles": 62}
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
'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)
odo.save(kpro.vss()['kmh']) publish( 'data', { 'bat': kpro.bat(), 'gear': kpro.gear(), '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(), '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], }) sleep(0.1)
'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)
"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)
while True: odo.save(kpro.vss()['kmh']) publish('data', {'bat': kpro.bat(), 'gear': kpro.gear(), '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(), '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], }) sleep(0.1)