Exemple #1
0
    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]
Exemple #2
0
    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")
Exemple #3
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]
Exemple #4
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]
Exemple #5
0
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
Exemple #6
0
 def test_initial_status(self):
     """
     Initial status is day mode
     """
     style = Style()
     assert style.status == AVAILABLE_STATUSES[0]
Exemple #7
0
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()