compass in second screen
This commit is contained in:
parent
dd2c675146
commit
82be1ba9e0
@ -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
59
main.py
@ -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)
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user