diff --git a/flockompass.kv b/flockompass.kv index 549eb07..2bdca28 100644 --- a/flockompass.kv +++ b/flockompass.kv @@ -1,8 +1,10 @@ #:import random random.random #:import RiseInTransition kivy.uix.screenmanager.RiseInTransition +#:import facade plyer.compass + : - MapScreen: + MapScreen: CompassScreen: @@ -35,6 +37,7 @@ : + facade: facade orientation: 'vertical' padding: '20dp' spacing: '10dp' @@ -50,10 +53,23 @@ ActionButton: important: True text: 'set destination' - on_press: root.manager.current = 'map'; + on_press: root.manager.current = 'map'; - - Button: - text: str(app.gps_data) - on_press: app.ms.cambia() - \ No newline at end of file + FloatLayout: + canvas: + Color: + rgb: .08, .08, .08 + Rectangle: + size: self.size + Image: + source: 'rose.png' + Image: + source: 'needle.png' + canvas.before: + PushMatrix + Rotate: + angle: app.needle_angle + axis: 0, 0, 1 + origin: self.center + canvas.after: + PopMatrix diff --git a/main.py b/main.py index a1700db..f981d89 100644 --- a/main.py +++ b/main.py @@ -1,21 +1,16 @@ from plyer import gps from kivy.app import App from kivy.clock import Clock -from kivy.properties import DictProperty +from kivy.properties import DictProperty, NumericProperty from kivy.clock import mainthread from kivy.utils import platform +from kivy_garden.mapview import MapView from kivy.uix.screenmanager import ScreenManager, Screen, RiseInTransition -from kivy_garden.mapview import MapView - from kivy.vector import Vector from kivy.animation import Animation from math import floor -import random -from time import sleep - -from pprint import pprint class MapScreen(Screen): @@ -30,11 +25,13 @@ class FlockompassApp(App): gps_data = DictProperty() session_data = DictProperty() + needle_angle = NumericProperty(0) def dump(self, dt): print(dt, self.gps_data, self.session_data) def set_destination(self): + self.compass_enable() self.session_data['dest_lat'] = self.ms.ids.centermark.lat self.session_data['dest_lon'] = self.ms.ids.centermark.lon self.ms.ids.mapview.center_on(self.session_data['dest_lat'], @@ -59,13 +56,6 @@ class FlockompassApp(App): def gps_stop(self): gps.stop() - def on_pause(self): - self.gps_stop() - return True - - def on_resume(self): - self.gps_start(1000, 0) - @mainthread def on_location(self, **kwargs): self.gps_data = kwargs @@ -79,6 +69,45 @@ class FlockompassApp(App): self.ms.ids.mapview.center_on(self.session_data['dest_lat'], self.session_data['dest_lon']) + def get_field(self, dt): + needle_angle = 7 + if self.cs.facade.field != (None, None, None): + self.x_calib, self.y_calib, self.z_calib = self.cs.facade.field + x, y, z = self.cs.facade.field + + needle_angle = Vector(x, y).angle((0, 1)) + 90. + + # fix animation transition around the unit circle + if (self.needle_angle % 360) - needle_angle > 180: + needle_angle += 360 + elif (self.needle_angle % 360) - needle_angle < -180: + needle_angle -= 360 + # add the number of revolutions to the result + needle_angle += 360 * floor(self.needle_angle / 360.) + + # animate the needle + if self.cs._anim: + self.cs._anim.stop(self) + self.cs._anim = Animation(needle_angle=needle_angle, d=.2, t='out_quad') + self.cs._anim.start(self) + + def compass_enable(self): + self.cs.facade.enable() + Clock.schedule_interval(self.get_field, 1 / 5.0) + + def compass_disable(self): + self.cs.facade.disable() + Clock.unschedule(self.get_field) + + def on_pause(self): + self.compass_disable() + self.gps_stop() + return True + + def on_resume(self): + self.compass_enable() + self.gps_start(1000, 0) + def build(self): # start GPS @@ -103,6 +132,8 @@ class FlockompassApp(App): screen_manager.add_widget(self.ms) self.cs = CompassScreen(name='compass') + self.cs._anim = None + self.cs.p = None screen_manager.add_widget(self.cs) Clock.schedule_interval(self.dump, 2.0)