From 2eed5417186c319b01616e5758b6635d98c8c2bc Mon Sep 17 00:00:00 2001 From: Marco Zeisler Date: Sat, 15 May 2021 17:27:58 +0200 Subject: [PATCH] implemented NCE recovery; --- components/i_feed/vehicle.py | 61 +++++++++++++++++++++++++++++------- 1 file changed, 50 insertions(+), 11 deletions(-) diff --git a/components/i_feed/vehicle.py b/components/i_feed/vehicle.py index bf8872a..f056116 100644 --- a/components/i_feed/vehicle.py +++ b/components/i_feed/vehicle.py @@ -1,3 +1,4 @@ +import threading import time from datetime import datetime from typing import Union @@ -14,16 +15,23 @@ STARTING_VELOCITY = 130 # Driving direction in degrees: 0=N, 90=E, 180=S, 270=W BEARING = 0 # Scale speed of vehicles by factor x -SCALING = 1 +SCALING = 100 # At x km the NCE shall happen -NCE_KM = 0.1 +NCE_KM = 30 +# Time in seconds to recover from NCE (will be scaled) +TIME_TO_RECOVER = 100 +# Resets vehicle at km x +RESET_KM = 50 class Vehicle: + t: threading.Thread vin: str velocity: float + _last_velocity: float timestamp: Union[datetime, None] _driven_kms: int + _starting_point: geopy.Point _gps_location: geopy.Point _nce_happened = False @@ -32,18 +40,31 @@ class Vehicle: starting_point: geopy.Point = STARTING_POINT, starting_velocity: float = STARTING_VELOCITY): self.vin = vin + self._starting_point = starting_point self._gps_location = starting_point self.velocity = starting_velocity @property def nce(self): - nce = self._nce_happened - if not nce: + if not self._nce_happened: if self._driven_kms >= NCE_KM: - nce = True - self._nce_happened = nce + self._nce_happened = True + self._last_velocity = self.velocity self.velocity = 0 - return nce + threading.Thread(target=self._sleep_and_recover_from_nce).start() + return True + return False + + def _sleep_and_recover_from_nce(self): + recover_in = TIME_TO_RECOVER / SCALING + print('\nNCE !!! Recovering in {} (scaled) seconds.\n'.format(recover_in)) + time.sleep(recover_in) + print('\nRecovered.\n') + self.velocity = self._last_velocity + + @nce.setter + def nce(self, val): + self._nce_happened = val @property def daf(self): @@ -92,20 +113,38 @@ class Vehicle: return '{}km'.format(round(self._driven_kms, 2)) def start_driving(self): + print('Start driving ... SCALING: x{}\n\n'.format(SCALING)) self.timestamp = datetime.now() self._driven_kms = 0 + self.t = threading.Thread(target=self.drive) + self.t.start() + + def drive(self): + while self.timestamp: + self.check_reset() + self.external_call() + time.sleep(1) + def stop_driving(self): + self._gps_location = self._starting_point + self._driven_kms = 0 self.timestamp = None + def check_reset(self): + if self._driven_kms >= RESET_KM: + print('\n\nEnd of route reached ... resetting and restarting vehicle') + self._gps_location = self._starting_point + self._driven_kms = 0 + self.timestamp = datetime.now() + self.nce = False + @circuit(failure_threshold=10, expected_exception=ConnectionError) def external_call(self): - ... + print(v1.driven_kms, '\t', v1.daf) if __name__ == "__main__": v1 = Vehicle(vin='SB164ABN1PE082986') v1.start_driving() - while True: - print(v1.daf) - time.sleep(1) + # stop manually