compass in second screen

This commit is contained in:
rgarcia-herrera 2020-08-10 23:50:25 -05:00
parent dd2c675146
commit 82be1ba9e0
2 changed files with 68 additions and 21 deletions

View File

@ -1,8 +1,10 @@
#:import random random.random #:import random random.random
#:import RiseInTransition kivy.uix.screenmanager.RiseInTransition #:import RiseInTransition kivy.uix.screenmanager.RiseInTransition
#:import facade plyer.compass
<RootScreen>: <RootScreen>:
MapScreen: MapScreen:
CompassScreen: CompassScreen:
@ -35,6 +37,7 @@
<CompassScreen>: <CompassScreen>:
facade: facade
orientation: 'vertical' orientation: 'vertical'
padding: '20dp' padding: '20dp'
spacing: '10dp' spacing: '10dp'
@ -50,10 +53,23 @@
ActionButton: ActionButton:
important: True important: True
text: 'set destination' text: 'set destination'
on_press: root.manager.current = 'map'; on_press: root.manager.current = 'map';
FloatLayout:
Button: canvas:
text: str(app.gps_data) Color:
on_press: app.ms.cambia() 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

59
main.py
View File

@ -1,21 +1,16 @@
from plyer import gps from plyer import gps
from kivy.app import App from kivy.app import App
from kivy.clock import Clock from kivy.clock import Clock
from kivy.properties import DictProperty from kivy.properties import DictProperty, NumericProperty
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.uix.screenmanager import ScreenManager, Screen, RiseInTransition from kivy.uix.screenmanager import ScreenManager, Screen, RiseInTransition
from kivy_garden.mapview import MapView
from kivy.vector import Vector from kivy.vector import Vector
from kivy.animation import Animation from kivy.animation import Animation
from math import floor from math import floor
import random
from time import sleep
from pprint import pprint
class MapScreen(Screen): class MapScreen(Screen):
@ -30,11 +25,13 @@ class FlockompassApp(App):
gps_data = DictProperty() gps_data = DictProperty()
session_data = DictProperty() session_data = DictProperty()
needle_angle = NumericProperty(0)
def dump(self, dt): def dump(self, dt):
print(dt, self.gps_data, self.session_data) print(dt, self.gps_data, self.session_data)
def set_destination(self): def set_destination(self):
self.compass_enable()
self.session_data['dest_lat'] = self.ms.ids.centermark.lat self.session_data['dest_lat'] = self.ms.ids.centermark.lat
self.session_data['dest_lon'] = self.ms.ids.centermark.lon self.session_data['dest_lon'] = self.ms.ids.centermark.lon
self.ms.ids.mapview.center_on(self.session_data['dest_lat'], self.ms.ids.mapview.center_on(self.session_data['dest_lat'],
@ -59,13 +56,6 @@ class FlockompassApp(App):
def gps_stop(self): def gps_stop(self):
gps.stop() gps.stop()
def on_pause(self):
self.gps_stop()
return True
def on_resume(self):
self.gps_start(1000, 0)
@mainthread @mainthread
def on_location(self, **kwargs): def on_location(self, **kwargs):
self.gps_data = kwargs self.gps_data = kwargs
@ -79,6 +69,45 @@ 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'])
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): def build(self):
# start GPS # start GPS
@ -103,6 +132,8 @@ class FlockompassApp(App):
screen_manager.add_widget(self.ms) screen_manager.add_widget(self.ms)
self.cs = CompassScreen(name='compass') self.cs = CompassScreen(name='compass')
self.cs._anim = None
self.cs.p = None
screen_manager.add_widget(self.cs) screen_manager.add_widget(self.cs)
Clock.schedule_interval(self.dump, 2.0) Clock.schedule_interval(self.dump, 2.0)