compass in second screen
This commit is contained in:
parent
dd2c675146
commit
82be1ba9e0
@ -1,5 +1,7 @@
|
||||
#:import random random.random
|
||||
#:import RiseInTransition kivy.uix.screenmanager.RiseInTransition
|
||||
#:import facade plyer.compass
|
||||
|
||||
|
||||
<RootScreen>:
|
||||
MapScreen:
|
||||
@ -35,6 +37,7 @@
|
||||
|
||||
|
||||
<CompassScreen>:
|
||||
facade: facade
|
||||
orientation: 'vertical'
|
||||
padding: '20dp'
|
||||
spacing: '10dp'
|
||||
@ -52,8 +55,21 @@
|
||||
text: 'set destination'
|
||||
on_press: root.manager.current = 'map';
|
||||
|
||||
|
||||
Button:
|
||||
text: str(app.gps_data)
|
||||
on_press: app.ms.cambia()
|
||||
|
||||
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
|
||||
|
||||
59
main.py
59
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)
|
||||
|
||||
Loading…
Reference in New Issue
Block a user