From bc11d35338722c68ff0c5dfa47c2e41719247480 Mon Sep 17 00:00:00 2001 From: rgarcia-herrera Date: Tue, 2 Nov 2021 18:50:47 -0600 Subject: [PATCH] better session contro, version bump of bunch of stuff --- buildozer.spec | 2 +- main.py | 91 +++++++++++++++++++++++++----------------------- requirements.txt | 73 +++++++++++++++++++++----------------- 3 files changed, 91 insertions(+), 75 deletions(-) diff --git a/buildozer.spec b/buildozer.spec index e3c30c2..6b4cc2c 100644 --- a/buildozer.spec +++ b/buildozer.spec @@ -36,7 +36,7 @@ version = 0.1 # (list) Application requirements # comma separated e.g. requirements = sqlite3,kivy -requirements = hostpython3, python3, kivy, plyer, android, mapview, requests, urllib3, chardet, idna, geopy, geographiclib +requirements = hostpython3, python3, kivy, plyer, android, mapview, requests, urllib3, chardet, idna, geopy, geographiclib, python-dateutil # (str) Custom source folders for requirements # Sets custom source for any requirements with recipes diff --git a/main.py b/main.py index 8235c76..10dbe1d 100644 --- a/main.py +++ b/main.py @@ -3,6 +3,7 @@ from kivy.app import App from kivy.clock import Clock from kivy.core.window import Window from kivy.properties import DictProperty, NumericProperty, StringProperty +from kivy.logger import Logger from kivy.clock import mainthread from kivy.utils import platform from kivy_garden.mapview import MapView @@ -14,6 +15,7 @@ from kivy.animation import Animation from math import atan2, sin, cos, degrees, floor import requests from datetime import timedelta, datetime +from dateutil.parser import isoparse from geopy.distance import geodesic @@ -73,9 +75,6 @@ class FlockompassApp(App): 'to_map': "assets/to_map_dark.png", 'bgcolor': "#336645"}) - def dump(self, dt): - print(dt, self.gps_data, self.session_data) - def read_settings(self): app_folder = os.path.dirname(os.path.abspath(__file__)) pickle_path = path.join(app_folder, 'settings.pickle') @@ -121,7 +120,7 @@ class FlockompassApp(App): self.save_settings() def set_update_freq(self): - print('setting update freq to', self.ss.ids.slider_update_freq.value) + Logger.info('setting update freq to %s' % self.ss.ids.slider_update_freq.value) self.session_data['settings_update_freq'] = self.ss.ids.slider_update_freq.value self.save_settings() Clock.unschedule(self.flock) @@ -141,7 +140,10 @@ class FlockompassApp(App): self.ms.ids.mapview.center_on(self.session_data['dest_lat'], self.session_data['dest_lon']) self.flock_server_register() - + Clock.schedule_interval(self.flock, + self.session_data.get('settings_update_freq', 10.0)) + + def set_dark_theme(self, active): if active: self.theme = {'needle': "assets/needle_dark.png", @@ -165,9 +167,9 @@ class FlockompassApp(App): def callback(permissions, results): if all([res for res in results]): - print("All permissions granted.") + Logger.info("All permissions granted.") else: - print("Some permissions refused.", results) + Logger.info("Some permissions refused. %s" % results) request_permissions([Permission.ACCESS_COARSE_LOCATION, Permission.ACCESS_FINE_LOCATION], @@ -182,18 +184,15 @@ class FlockompassApp(App): @mainthread def on_location(self, **kwargs): self.gps_data = kwargs - # self.dump(1) - if ('dest_lat' not in self.session_data - and - 'dest_lon' not in self.session_data): + if ('dest_lat' not in self.session_data and 'dest_lon' not in self.session_data): + self.session_data['dest_lat'] = self.gps_data['lat'] self.session_data['dest_lon'] = self.gps_data['lon'] self.ms.ids.mapview.center_on(self.session_data['dest_lat'], self.session_data['dest_lon']) else: - dest_distance = geodesic( (self.gps_data['lat'], self.gps_data['lon']), (self.session_data['dest_lat'], self.session_data['dest_lon'])).kilometers @@ -203,12 +202,12 @@ class FlockompassApp(App): else: dest_distance = "%0.1f km" % dest_distance - km_per_mile = 1.609344 + km_per_mile = 1.609344 self.dest_distance = "Destino: %s\nVel: %0.1f km/h" % (dest_distance, self.gps_data['speed'] * km_per_mile) - if 'flock_lat' in self.session_data: + if 'flock_size' in self.session_data: flock_distance = geodesic( (self.gps_data['lat'], self.gps_data['lon']), (self.session_data['flock_lat'], self.session_data['flock_lon'])).kilometers @@ -266,12 +265,12 @@ class FlockompassApp(App): d=0.1, t='out_quad') - lat1 = self.gps_data['lat'] - lon1 = self.gps_data['lon'] - - lat2 = self.session_data['dest_lat'] - lon2 = self.session_data['dest_lon'] + lat1 = self.gps_data.get('lat', 0) + lon1 = self.gps_data.get('lon', 0) + lat2 = self.session_data.get('dest_lat', 0) + lon2 = self.session_data.get('dest_lon', 0) + dbearing = atan2(sin(lon2 - lon1) * cos(lat2), cos(lat1) * sin(lat2) - sin(lat1) * cos(lat2) * cos(lon2-lon1)) @@ -301,12 +300,14 @@ class FlockompassApp(App): self.cs._anim.start(self) def compass_enable(self): - self.cs.facade.enable() + if hasattr(self, 'cs'): + self.cs.facade.enable() Clock.schedule_interval(self.get_field, 1.0 - self.session_data.get('settings_compass_update', 0.88)) def compass_disable(self): - self.cs.facade.disable() + if hasattr(self, 'cs'): + self.cs.facade.disable() Clock.unschedule(self.get_field) def on_pause(self): @@ -327,17 +328,17 @@ class FlockompassApp(App): dest_lat=self.session_data['dest_lat']), timeout=0.5) self.session_data['bike_id'] = r.json()['bike_id'] - print('registered! got bike_id:', self.session_data['bike_id']) + Logger.info('registered! got bike_id: %s' % self.session_data['bike_id']) self.flock_server_update() except requests.exceptions.Timeout: - print('comm timeout while registering with flock server', self.session_data) + Logger.info('comm timeout while registering with flock server') except requests.exceptions.ConnectionError: - print('unable to connect while registering with flock server') - finally: - self.session_data.pop('bike_id', None) - self.session_data.pop('speed', None) - self.session_data.pop('bearing', None) - + Logger.info('unable to connect while registering with flock server') + # finally: + # self.session_data.pop('bike_id', None) + # self.session_data.pop('speed', None) + # self.session_data.pop('bearing', None) + def flock_server_update(self): @@ -351,10 +352,19 @@ class FlockompassApp(App): lon=self.session_data['lon']), timeout=0.5) resp = req.json() - self.session_data.update(resp) - self.session_data['last_update'] = datetime.now() + if resp: + self.session_data['last_update'] = isoparse(resp.pop('last_update')) + + if 'flock_size' not in resp: + self.session_data.pop('flock_avg_speed', None) + self.session_data.pop('flock_lat', None) + self.session_data.pop('flock_lon', None) + self.session_data.pop('flock_size', None) + + pLogger.info(self.session_data) + except requests.exceptions.Timeout: - print('comm timeout while updating flock server') + Logger.info('comm timeout while updating flock server') def get_session_timeout(self): @@ -364,14 +374,13 @@ class FlockompassApp(App): seconds = min_step / speed else: seconds = 100 - - return session_timeout = timedelta(seconds=seconds) - - + + return timedelta(seconds=seconds) + + def flock(self, dt): if ('bike_id' in self.session_data - and - (self.session_data.get('last_update') + self.get_sesion_timeout() < datetime.now())): + and (self.session_data.get('last_update') + self.get_session_timeout()) > datetime.now()): self.flock_server_update() else: self.flock_server_register() @@ -382,11 +391,10 @@ class FlockompassApp(App): # start GPS try: gps.configure(on_location=self.on_location) - except NotImplementedError: import traceback traceback.print_exc() - print('GPS is not implemented for your platform') + Logger.info('GPS is not implemented for your platform') if platform == "android": self.request_android_permissions() @@ -414,9 +422,6 @@ class FlockompassApp(App): self.cs._anim = None self.cs._anim1 = None screen_manager.add_widget(self.cs) - - Clock.schedule_interval(self.flock, self.session_data.get('settings_update_freq', 10.0)) - return screen_manager diff --git a/requirements.txt b/requirements.txt index a3e8a94..73b96e7 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,41 +1,52 @@ appdirs==1.4.4 backcall==0.2.0 +backports.entry-points-selectable==1.1.0 buildozer==1.2.0 -certifi==2020.6.20 -chardet==3.0.4 -colorama==0.4.3 -Cython==0.29.21 -decorator==4.4.2 -distlib==0.3.1 -docutils==0.16 -filelock==3.0.12 -geographiclib==1.50 -geopy==2.0.0 -idna==2.10 -importlib-metadata==1.7.0 -importlib-resources==3.0.0 -Jinja2==2.11.2 -Kivy==1.11.1 -Kivy-Garden==0.1.1 -kivy-garden.mapview @ file:///home/rgarcia/mapview +certifi==2021.10.8 +chardet==4.0.0 +charset-normalizer==2.0.7 +colorama==0.4.4 +Cython==0.29.24 +decorator==5.1.0 +distlib==0.3.3 +docutils==0.18 +elpy==1.999 +filelock==3.3.2 +geographiclib==1.52 +geopy==2.2.0 +idna==3.3 +importlib-metadata==4.8.1 +importlib-resources==5.4.0 +ipython==7.29.0 +ipython-genutils==0.2.0 +jedi==0.18.0 +Jinja2==3.0.2 +Kivy==2.0.0 +Kivy-Garden==0.1.4 +kivy-garden.mapview==1.0.5 LatLon23==1.0.7 -MarkupSafe==1.1.1 -parso==0.7.1 +MarkupSafe==2.0.1 +matplotlib-inline==0.1.3 +parso==0.8.2 pep517==0.6.0 pexpect==4.8.0 pickleshare==0.7.5 pkg_resources==0.0.0 -plyer==1.4.3 -prompt-toolkit==3.0.5 -ptyprocess==0.6.0 -Pygments==2.6.1 -pyproj==2.6.1.post1 +platformdirs==2.4.0 +plyer==2.0.0 +prompt-toolkit==3.0.21 +ptyprocess==0.7.0 +Pygments==2.10.0 +pyproj==3.2.1 +python-dateutil==2.8.2 pytoml==0.1.21 -requests==2.24.0 -sh==1.13.1 -six==1.15.0 -toml==0.10.1 -traitlets==4.3.3 -urllib3==1.25.9 +requests==2.26.0 +sh==1.14.2 +six==1.16.0 +toml==0.10.2 +tomli==1.2.2 +traitlets==5.1.1 +urllib3==1.26.7 +virtualenv==20.10.0 wcwidth==0.2.5 -zipp==3.1.0 +zipp==3.6.0