def test_from_night_to_day(self): """ We should be also allowed to go back from night mode to day """ style = Style() tps_within_range = (style.threshold_lower_limit ) # the lower limit is inside the range seconds_to_switch_status = style.elapsed_seconds start_time = datetime.datetime.now() with freeze_time(start_time): style.update(tps_within_range) # night mode with freeze_time(start_time + datetime.timedelta(0, seconds_to_switch_status)): style.update(tps_within_range) assert style.status == AVAILABLE_STATUSES[1] style.update(tps_within_range) # coming back to day mode with freeze_time(start_time + datetime.timedelta(0, seconds_to_switch_status * 2)): style.update(tps_within_range) assert style.status == AVAILABLE_STATUSES[0]
def test_update_no_change_status(self): """ Status should not change if the tps is not within the range """ style = Style() tps_outside_range = (style.threshold_upper_limit + 1 ) # the upper limit + 1 is outside the range seconds_to_switch_status = style.elapsed_seconds start_time = datetime.datetime.now() # starting in day mode with freeze_time(start_time): style.update(tps_outside_range) assert style.status == AVAILABLE_STATUSES[0] # not reaching the seconds needed to switch status with freeze_time(start_time + datetime.timedelta(0, seconds_to_switch_status - 1)): style.update(tps_outside_range) assert style.status == AVAILABLE_STATUSES[0] # reaching the seconds needed to switch status but, # in this case we never been in the tps range so no status change should be performed. with freeze_time(start_time + datetime.timedelta(0, seconds_to_switch_status)): style.update(tps_outside_range) assert style.status == AVAILABLE_STATUSES[0]
def test_update_change_status(self): """ Status should change if the tps is within the range for specific amount of time """ style = Style() tps_within_range = (style.threshold_lower_limit ) # the lower limit is inside the range seconds_to_switch_status = style.elapsed_seconds start_time = datetime.datetime.now() # starting in day mode with freeze_time(start_time): style.update(tps_within_range) assert style.status == AVAILABLE_STATUSES[0] # not reaching the seconds needed to switch status with freeze_time(start_time + datetime.timedelta(0, seconds_to_switch_status - 1)): style.update(tps_within_range) assert style.status == AVAILABLE_STATUSES[0] # reaching the seconds needed to switch status with freeze_time(start_time + datetime.timedelta(0, seconds_to_switch_status)): style.update(tps_within_range) assert style.status == AVAILABLE_STATUSES[1]
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
an5_unit = setup_file.json.get("an5", {}).get("unit", "volts") an6_unit = setup_file.json.get("an6", {}).get("unit", "volts") an7_unit = setup_file.json.get("an7", {}).get("unit", "volts") an0_formula = setup_file.get_formula("an0") an1_formula = setup_file.get_formula("an1") an2_formula = setup_file.get_formula("an2") an3_formula = setup_file.get_formula("an3") an4_formula = setup_file.get_formula("an4") an5_formula = setup_file.get_formula("an5") an6_formula = setup_file.get_formula("an6") an7_formula = setup_file.get_formula("an7") while True: odo.save(kpro.vss()["kmh"]) style.update(kpro.tps()) 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(),