diff --git a/assets/needle_to_flock.png b/assets/needle_to_flock.png new file mode 100644 index 0000000..b8e2462 Binary files /dev/null and b/assets/needle_to_flock.png differ diff --git a/flockompass.kv b/flockompass.kv index ac737c3..0f93cda 100644 --- a/flockompass.kv +++ b/flockompass.kv @@ -108,6 +108,18 @@ id: to_dest source: 'assets/needle_to_dest.png' pos_hint: {"center_x": 0.5, "center_y": 0.7} + canvas.before: + PushMatrix + Rotate: + angle: app.dbearing + axis: 0, 0, 1 + origin: self.center + canvas.after: + PopMatrix + Image: + id: to_flock + source: 'assets/needle_to_flock.png' + pos_hint: {"center_x": 0.5, "center_y": 0.7} canvas.before: PushMatrix Rotate: diff --git a/main.py b/main.py index 92cd2ba..4032313 100644 --- a/main.py +++ b/main.py @@ -12,12 +12,16 @@ from kivy.uix.image import Image from kivy.vector import Vector from kivy.animation import Animation from math import atan2, sin, cos, degrees, floor +import requests from geopy.distance import geodesic from os import path import pickle +FLOCK_SERVER="http://192.168.0.8:5000" + + class IconButton(ButtonBehavior, Image): pass @@ -57,6 +61,7 @@ class FlockompassApp(App): session_data = DictProperty() needle_angle = NumericProperty(0) fbearing = NumericProperty(0) + dbearing = NumericProperty(0) dest_distance = StringProperty("") dashboard_dest = StringProperty("") @@ -185,7 +190,12 @@ class FlockompassApp(App): self.dest_distance = "Destino: %s\nVel: %0.1f km/h" % (dest_distance, self.gps_data['speed'] * 1.609344) + self.session_data.update({'speed': self.gps_data['speed'] * 1.609344, + 'bearing': self.gps_data['bearing'], + 'lat': self.gps_data['lat'], + 'lon': self.gps_data['lon']}) + def center_map_on_gps(self): self.ms.ids.mapview.center_on(self.gps_data['lat'], self.gps_data['lon']) @@ -227,14 +237,12 @@ class FlockompassApp(App): lat2 = self.session_data['dest_lat'] lon2 = self.session_data['dest_lon'] - fbearing = atan2(sin(lon2 - lon1) * cos(lat2), + dbearing = atan2(sin(lon2 - lon1) * cos(lat2), cos(lat1) * sin(lat2) - sin(lat1) * cos(lat2) * cos(lon2-lon1)) - fbearing = self.needle_angle - degrees(fbearing) + dbearing = self.needle_angle - degrees(dbearing) - #fbearing = (fbearing + 360) % 360 - - self.cs._anim &= Animation(fbearing=fbearing, + self.cs._anim &= Animation(dbearing=dbearing, d=0.1, t='out_quad') @@ -258,6 +266,37 @@ class FlockompassApp(App): self.compass_enable() self.gps_start(1000, 0) + def flock_server_register(self): + + register_url = "{server}/register/?dest_lon={dest_lon}&dest_lat={dest_lat}" + r = requests.get(register_url.format(server=FLOCK_SERVER, + dest_lon=self.session_data['dest_lon'], + dest_lat=self.session_data['dest_lat'])) + out = r.json() + + self.session_data['bike_id'] = out['bike_id'] + + + def flock_server_update(self): + update_url = "{server}/update/{bike_id}/?lat={lat}&lon={lon}&speed={speed}&bearing={bearing}" + req = requests.get(update_url.format(server=FLOCK_SERVER, + bike_id=self.session_data['bike_id'], + speed=self.session_data['speed'], + bearing=self.session_data['bearing'], + lat=self.session_data['lat'], + lon=self.session_data['lon'])) + resp = req.json() + self.session_data.update(resp) + + + + def flock(self, dt): + if 'bike_id' in self.session_data: + self.flock_server_update() + else: + self.flock_server_register() + + def build(self): # start GPS @@ -296,7 +335,7 @@ class FlockompassApp(App): self.cs._anim1 = None screen_manager.add_widget(self.cs) - #Clock.schedule_interval(self.dump, 2.0) + Clock.schedule_interval(self.flock, 20.0) return screen_manager