better session contro, version bump of bunch of stuff
This commit is contained in:
parent
fb68adf964
commit
bc11d35338
@ -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
91
main.py
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user