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("backend.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("backend.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("backend.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("backend.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}
def test_save_not_enough_distance_traveled(self): """ The mileage while calling save method should only be returned if more than one km more is not reached """ with freeze_time("00:00:00"): # setting the starting mileage 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 # since at that speed is not enough to travel a single km it´s expected to return False assert odo.save(100) is False # 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 to 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 # the save method should return True meaning 1 km more has been traveled assert odo.save(100) is True # after an hour we should be in 100km mileage assert odo.get_mileage() == {"km": 100, "miles": 62}
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
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.setup_file.get_value("odo").get("value"), self.setup_file.get_value("odo").get("unit"), ) # if we are here because a reset don't re-init the ecu try: self.ecu except AttributeError: self.ecu = Ecu() 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.an0_extra_params = self.setup_file.get_formula( "an0") self.an1_formula, self.an1_extra_params = self.setup_file.get_formula( "an1") self.an2_formula, self.an2_extra_params = self.setup_file.get_formula( "an2") self.an3_formula, self.an3_extra_params = self.setup_file.get_formula( "an3") self.an4_formula, self.an4_extra_params = self.setup_file.get_formula( "an4") self.an5_formula, self.an5_extra_params = self.setup_file.get_formula( "an5") self.an6_formula, self.an6_extra_params = self.setup_file.get_formula( "an6") self.an7_formula, self.an7_extra_params = self.setup_file.get_formula( "an7") def _call_analog_input(self, port): voltage = self.ecu.analog_input(port) extra_params = getattr(self, f"an{port}_extra_params") formula = getattr(self, f"an{port}_formula") if extra_params is None: return formula(**{"voltage": voltage})[getattr( self, f"an{port}_unit")] else: args = {"voltage": voltage} args.update(extra_params) return formula(**args) def update(self): """ load the websocket with updated info """ if self.odo.save(self.ecu.vss["kmh"]): self.setup_file.update_key("odo", {"value": self.odo.preferred_mileage}) self.style.update(self.ecu.tps) return { "bat": self.ecu.bat, "gear": self.ecu.gear, "iat": self.ecu.iat[self.iat_unit], "tps": self.ecu.tps, "ect": self.ecu.ect[self.ect_unit], "rpm": self.ecu.rpm, "vss": self.ecu.vss[self.vss_unit], "o2": self.ecu.o2[self.o2_unit], "cam": self.ecu.cam, "mil": self.ecu.mil, "fan": self.ecu.fanc, "bksw": self.ecu.bksw, "flr": self.ecu.flr, "eth": self.ecu.eth, "scs": self.ecu.scs, "fmw": self.ecu.firmware, "map": self.ecu.map[self.map_unit], "an0": self._call_analog_input(0), "an1": self._call_analog_input(1), "an2": self._call_analog_input(2), "an3": self._call_analog_input(3), "an4": self._call_analog_input(4), "an5": self._call_analog_input(5), "an6": self._call_analog_input(6), "an7": self._call_analog_input(7), "time": self.time.get_time(), "odo": self.odo.preferred_mileage, "style": self.style.status, "name": self.ecu.name, "ver": __version__, } def setup(self): """Return the current setup""" return self.setup_file.load_setup() def save(self, new_setup): """Save a new setup""" SetupValidator().validate(new_setup) self.setup_file.save_setup(new_setup) self.setup_file.rotate_screen(new_setup["screen"]["rotate"]) # refresh the backend too self._load_user_preferences() self._init_resources() def reset(self): """Reset to the default setup""" self.setup_file.reset_setup() # refresh the backend too self._load_user_preferences() self._init_resources()