better session contro, version bump of bunch of stuff

This commit is contained in:
rgarcia-herrera 2021-11-02 18:50:47 -06:00
parent fb68adf964
commit bc11d35338
3 changed files with 91 additions and 75 deletions

View File

@ -36,7 +36,7 @@ version = 0.1
# (list) Application requirements # (list) Application requirements
# comma separated e.g. requirements = sqlite3,kivy # 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 # (str) Custom source folders for requirements
# Sets custom source for any requirements with recipes # Sets custom source for any requirements with recipes

91
main.py
View File

@ -3,6 +3,7 @@ from kivy.app import App
from kivy.clock import Clock from kivy.clock import Clock
from kivy.core.window import Window from kivy.core.window import Window
from kivy.properties import DictProperty, NumericProperty, StringProperty from kivy.properties import DictProperty, NumericProperty, StringProperty
from kivy.logger import Logger
from kivy.clock import mainthread from kivy.clock import mainthread
from kivy.utils import platform from kivy.utils import platform
from kivy_garden.mapview import MapView from kivy_garden.mapview import MapView
@ -14,6 +15,7 @@ from kivy.animation import Animation
from math import atan2, sin, cos, degrees, floor from math import atan2, sin, cos, degrees, floor
import requests import requests
from datetime import timedelta, datetime from datetime import timedelta, datetime
from dateutil.parser import isoparse
from geopy.distance import geodesic from geopy.distance import geodesic
@ -73,9 +75,6 @@ class FlockompassApp(App):
'to_map': "assets/to_map_dark.png", 'to_map': "assets/to_map_dark.png",
'bgcolor': "#336645"}) 'bgcolor': "#336645"})
def dump(self, dt):
print(dt, self.gps_data, self.session_data)
def read_settings(self): def read_settings(self):
app_folder = os.path.dirname(os.path.abspath(__file__)) app_folder = os.path.dirname(os.path.abspath(__file__))
pickle_path = path.join(app_folder, 'settings.pickle') pickle_path = path.join(app_folder, 'settings.pickle')
@ -121,7 +120,7 @@ class FlockompassApp(App):
self.save_settings() self.save_settings()
def set_update_freq(self): 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.session_data['settings_update_freq'] = self.ss.ids.slider_update_freq.value
self.save_settings() self.save_settings()
Clock.unschedule(self.flock) Clock.unschedule(self.flock)
@ -141,7 +140,10 @@ class FlockompassApp(App):
self.ms.ids.mapview.center_on(self.session_data['dest_lat'], self.ms.ids.mapview.center_on(self.session_data['dest_lat'],
self.session_data['dest_lon']) self.session_data['dest_lon'])
self.flock_server_register() self.flock_server_register()
Clock.schedule_interval(self.flock,
self.session_data.get('settings_update_freq', 10.0))
def set_dark_theme(self, active): def set_dark_theme(self, active):
if active: if active:
self.theme = {'needle': "assets/needle_dark.png", self.theme = {'needle': "assets/needle_dark.png",
@ -165,9 +167,9 @@ class FlockompassApp(App):
def callback(permissions, results): def callback(permissions, results):
if all([res for res in results]): if all([res for res in results]):
print("All permissions granted.") Logger.info("All permissions granted.")
else: else:
print("Some permissions refused.", results) Logger.info("Some permissions refused. %s" % results)
request_permissions([Permission.ACCESS_COARSE_LOCATION, request_permissions([Permission.ACCESS_COARSE_LOCATION,
Permission.ACCESS_FINE_LOCATION], Permission.ACCESS_FINE_LOCATION],
@ -182,18 +184,15 @@ class FlockompassApp(App):
@mainthread @mainthread
def on_location(self, **kwargs): def on_location(self, **kwargs):
self.gps_data = kwargs self.gps_data = kwargs
# self.dump(1)
if ('dest_lat' not in self.session_data if ('dest_lat' not in self.session_data and 'dest_lon' 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_lat'] = self.gps_data['lat']
self.session_data['dest_lon'] = self.gps_data['lon'] self.session_data['dest_lon'] = self.gps_data['lon']
self.ms.ids.mapview.center_on(self.session_data['dest_lat'], self.ms.ids.mapview.center_on(self.session_data['dest_lat'],
self.session_data['dest_lon']) self.session_data['dest_lon'])
else: else:
dest_distance = geodesic( dest_distance = geodesic(
(self.gps_data['lat'], self.gps_data['lon']), (self.gps_data['lat'], self.gps_data['lon']),
(self.session_data['dest_lat'], self.session_data['dest_lon'])).kilometers (self.session_data['dest_lat'], self.session_data['dest_lon'])).kilometers
@ -203,12 +202,12 @@ class FlockompassApp(App):
else: else:
dest_distance = "%0.1f km" % dest_distance 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.dest_distance = "Destino: %s\nVel: %0.1f km/h" % (dest_distance,
self.gps_data['speed'] * km_per_mile) self.gps_data['speed'] * km_per_mile)
if 'flock_lat' in self.session_data: if 'flock_size' in self.session_data:
flock_distance = geodesic( flock_distance = geodesic(
(self.gps_data['lat'], self.gps_data['lon']), (self.gps_data['lat'], self.gps_data['lon']),
(self.session_data['flock_lat'], self.session_data['flock_lon'])).kilometers (self.session_data['flock_lat'], self.session_data['flock_lon'])).kilometers
@ -266,12 +265,12 @@ class FlockompassApp(App):
d=0.1, d=0.1,
t='out_quad') t='out_quad')
lat1 = self.gps_data['lat'] lat1 = self.gps_data.get('lat', 0)
lon1 = self.gps_data['lon'] lon1 = self.gps_data.get('lon', 0)
lat2 = self.session_data['dest_lat']
lon2 = self.session_data['dest_lon']
lat2 = self.session_data.get('dest_lat', 0)
lon2 = self.session_data.get('dest_lon', 0)
dbearing = atan2(sin(lon2 - lon1) * cos(lat2), dbearing = atan2(sin(lon2 - lon1) * cos(lat2),
cos(lat1) * sin(lat2) cos(lat1) * sin(lat2)
- sin(lat1) * cos(lat2) * cos(lon2-lon1)) - sin(lat1) * cos(lat2) * cos(lon2-lon1))
@ -301,12 +300,14 @@ class FlockompassApp(App):
self.cs._anim.start(self) self.cs._anim.start(self)
def compass_enable(self): def compass_enable(self):
self.cs.facade.enable() if hasattr(self, 'cs'):
self.cs.facade.enable()
Clock.schedule_interval(self.get_field, Clock.schedule_interval(self.get_field,
1.0 - self.session_data.get('settings_compass_update', 0.88)) 1.0 - self.session_data.get('settings_compass_update', 0.88))
def compass_disable(self): def compass_disable(self):
self.cs.facade.disable() if hasattr(self, 'cs'):
self.cs.facade.disable()
Clock.unschedule(self.get_field) Clock.unschedule(self.get_field)
def on_pause(self): def on_pause(self):
@ -327,17 +328,17 @@ class FlockompassApp(App):
dest_lat=self.session_data['dest_lat']), dest_lat=self.session_data['dest_lat']),
timeout=0.5) timeout=0.5)
self.session_data['bike_id'] = r.json()['bike_id'] 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() self.flock_server_update()
except requests.exceptions.Timeout: 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: except requests.exceptions.ConnectionError:
print('unable to connect while registering with flock server') Logger.info('unable to connect while registering with flock server')
finally: # finally:
self.session_data.pop('bike_id', None) # self.session_data.pop('bike_id', None)
self.session_data.pop('speed', None) # self.session_data.pop('speed', None)
self.session_data.pop('bearing', None) # self.session_data.pop('bearing', None)
def flock_server_update(self): def flock_server_update(self):
@ -351,10 +352,19 @@ class FlockompassApp(App):
lon=self.session_data['lon']), lon=self.session_data['lon']),
timeout=0.5) timeout=0.5)
resp = req.json() resp = req.json()
self.session_data.update(resp) if resp:
self.session_data['last_update'] = datetime.now() 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: except requests.exceptions.Timeout:
print('comm timeout while updating flock server') Logger.info('comm timeout while updating flock server')
def get_session_timeout(self): def get_session_timeout(self):
@ -364,14 +374,13 @@ class FlockompassApp(App):
seconds = min_step / speed seconds = min_step / speed
else: else:
seconds = 100 seconds = 100
return session_timeout = timedelta(seconds=seconds) return timedelta(seconds=seconds)
def flock(self, dt): def flock(self, dt):
if ('bike_id' in self.session_data if ('bike_id' in self.session_data
and and (self.session_data.get('last_update') + self.get_session_timeout()) > datetime.now()):
(self.session_data.get('last_update') + self.get_sesion_timeout() < datetime.now())):
self.flock_server_update() self.flock_server_update()
else: else:
self.flock_server_register() self.flock_server_register()
@ -382,11 +391,10 @@ class FlockompassApp(App):
# start GPS # start GPS
try: try:
gps.configure(on_location=self.on_location) gps.configure(on_location=self.on_location)
except NotImplementedError: except NotImplementedError:
import traceback import traceback
traceback.print_exc() traceback.print_exc()
print('GPS is not implemented for your platform') Logger.info('GPS is not implemented for your platform')
if platform == "android": if platform == "android":
self.request_android_permissions() self.request_android_permissions()
@ -414,9 +422,6 @@ class FlockompassApp(App):
self.cs._anim = None self.cs._anim = None
self.cs._anim1 = None self.cs._anim1 = None
screen_manager.add_widget(self.cs) screen_manager.add_widget(self.cs)
Clock.schedule_interval(self.flock, self.session_data.get('settings_update_freq', 10.0))
return screen_manager return screen_manager

View File

@ -1,41 +1,52 @@
appdirs==1.4.4 appdirs==1.4.4
backcall==0.2.0 backcall==0.2.0
backports.entry-points-selectable==1.1.0
buildozer==1.2.0 buildozer==1.2.0
certifi==2020.6.20 certifi==2021.10.8
chardet==3.0.4 chardet==4.0.0
colorama==0.4.3 charset-normalizer==2.0.7
Cython==0.29.21 colorama==0.4.4
decorator==4.4.2 Cython==0.29.24
distlib==0.3.1 decorator==5.1.0
docutils==0.16 distlib==0.3.3
filelock==3.0.12 docutils==0.18
geographiclib==1.50 elpy==1.999
geopy==2.0.0 filelock==3.3.2
idna==2.10 geographiclib==1.52
importlib-metadata==1.7.0 geopy==2.2.0
importlib-resources==3.0.0 idna==3.3
Jinja2==2.11.2 importlib-metadata==4.8.1
Kivy==1.11.1 importlib-resources==5.4.0
Kivy-Garden==0.1.1 ipython==7.29.0
kivy-garden.mapview @ file:///home/rgarcia/mapview 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 LatLon23==1.0.7
MarkupSafe==1.1.1 MarkupSafe==2.0.1
parso==0.7.1 matplotlib-inline==0.1.3
parso==0.8.2
pep517==0.6.0 pep517==0.6.0
pexpect==4.8.0 pexpect==4.8.0
pickleshare==0.7.5 pickleshare==0.7.5
pkg_resources==0.0.0 pkg_resources==0.0.0
plyer==1.4.3 platformdirs==2.4.0
prompt-toolkit==3.0.5 plyer==2.0.0
ptyprocess==0.6.0 prompt-toolkit==3.0.21
Pygments==2.6.1 ptyprocess==0.7.0
pyproj==2.6.1.post1 Pygments==2.10.0
pyproj==3.2.1
python-dateutil==2.8.2
pytoml==0.1.21 pytoml==0.1.21
requests==2.24.0 requests==2.26.0
sh==1.13.1 sh==1.14.2
six==1.15.0 six==1.16.0
toml==0.10.1 toml==0.10.2
traitlets==4.3.3 tomli==1.2.2
urllib3==1.25.9 traitlets==5.1.1
urllib3==1.26.7
virtualenv==20.10.0
wcwidth==0.2.5 wcwidth==0.2.5
zipp==3.1.0 zipp==3.6.0