protected override void OnNavigatedTo(NavigationEventArgs e) { … Accelerometer _accelerometer = Accelerometer.GetDefault(); _accelerometer.ReadingChanged += new TypedEventHandler<Accelerometer, AccelerometerReadingChangedEventArgs>(ReadingChanged); … } async private void ReadingChanged(object sender, AccelerometerReadingChangedEventArgs e) { … }
private void OnRobotConnected(object sender, Robot robot) { … robot.CollisionControl.StartDetectionForWallCollisions(); robot.CollisionControl.CollisionDetectedEvent += OnCollisionDetectedEvent; … }
robot.CollisionControl.StartDetectionForWallCollisions();
robot.CollisionControl.StopDetection();
<wb:DeviceCapability Name="bluetooth.rfcomm"> <wb:Device Id="any"> <wb:Function Type="serviceId:00001101-0000-1000-8000-00805F9B34FB" /> </wb:Device> </wb:DeviceCapability>
<Page x:Class="SpheroRace.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:SpheroRace" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" > <Grid Margin="100" > <Grid.RowDefinitions > <RowDefinition Height="60"/> <RowDefinition Height="60"/> <RowDefinition/> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition/> <ColumnDefinition/> </Grid.ColumnDefinitions> <TextBlock x:Name="SpheroName" Grid.Row="0" Grid.Column="0" Text="No Sphero Connected" FontSize="24"/> <ToggleSwitch x:Name="ConnectionToggle" Grid.Row="1" Grid.Column="0" Toggled="ConnectionToggle_Toggled" /> <Button Name="StartBtn" Click="StartBtn_Click" Grid.Row="2" Grid.Column="0" Content="Start" VerticalAlignment="Bottom" HorizontalAlignment="Left" Padding="100" ></Button> <Button Name="StopBtn" Click="StopBtn_Click" Grid.Row="2" Grid.Column="1" Content="Stop" VerticalAlignment="Bottom" HorizontalAlignment="Right" Padding="100" IsEnabled="False" ></Button> </Grid> </Page>
public sealed partial class MainPage : Page { private Sphero m_robot = null; private long m_lastTimeMs; private double m_currentX = 0; private double m_currentY = 0; private bool m_isStarted = false; private const string c_noSpheroConnected = "No Sphero Connected"; private const string c_connectingToSphero = "Connecting to {0}"; private const string c_spheroConnected = "Connected to {0}"; public MainPage() { this.InitializeComponent(); } // . protected override void OnNavigatedTo(NavigationEventArgs e) { base.OnNavigatedTo(e); SetupRobotConnection(); Application app = Application.Current; app.Suspending += OnSuspending; Accelerometer _accelerometer = Accelerometer.GetDefault(); _accelerometer.ReadingChanged += new TypedEventHandler<Accelerometer, AccelerometerReadingChangedEventArgs>(ReadingChanged); } // . protected override void OnNavigatedFrom(NavigationEventArgs e) { base.OnNavigatedFrom(e); ShutdownRobotConnection(); Application app = Application.Current; app.Suspending -= OnSuspending; Accelerometer _accelerometer = Accelerometer.GetDefault(); _accelerometer.ReadingChanged -= new TypedEventHandler<Accelerometer, AccelerometerReadingChangedEventArgs>(ReadingChanged); } //handle the application entering the background private void OnSuspending(object sender, SuspendingEventArgs args) { ShutdownRobotConnection(); } // private void SetupRobotConnection() { SpheroName.Text = c_noSpheroConnected; RobotProvider provider = RobotProvider.GetSharedProvider(); provider.DiscoveredRobotEvent += OnRobotDiscovered; provider.NoRobotsEvent += OnNoRobotsEvent; provider.ConnectedRobotEvent += OnRobotConnected; provider.FindRobots(); } // private void ShutdownRobotConnection() { if (m_robot != null && m_robot.ConnectionState == ConnectionState.Connected) { m_robot.SensorControl.StopAll(); m_robot.CollisionControl.StopDetection(); m_robot.Sleep(); m_robot.Disconnect(); ConnectionToggle.OffContent = "Disconnected"; SpheroName.Text = c_noSpheroConnected; SetRedColor(); RobotProvider provider = RobotProvider.GetSharedProvider(); provider.DiscoveredRobotEvent -= OnRobotDiscovered; provider.NoRobotsEvent -= OnNoRobotsEvent; provider.ConnectedRobotEvent -= OnRobotConnected; } } // ! private void OnRobotDiscovered(object sender, Robot robot) { if (m_robot == null) { RobotProvider provider = RobotProvider.GetSharedProvider(); provider.ConnectRobot(robot); ConnectionToggle.OnContent = "Connecting..."; m_robot = (Sphero)robot; SpheroName.Text = string.Format(c_connectingToSphero, robot.BluetoothName); } } // :( private void OnNoRobotsEvent(object sender, EventArgs e) { MessageDialog dialog = new MessageDialog(c_noSpheroConnected); dialog.DefaultCommandIndex = 0; dialog.CancelCommandIndex = 1; dialog.ShowAsync(); } // private void OnRobotConnected(object sender, Robot robot) { ConnectionToggle.IsOn = true; ConnectionToggle.OnContent = "Connected"; SpheroName.Text = string.Format(c_spheroConnected, robot.BluetoothName); if (m_robot != null && m_robot.ConnectionState == ConnectionState.Connected) { m_robot.CollisionControl.StartDetectionForWallCollisions(); m_robot.CollisionControl.CollisionDetectedEvent += OnCollisionDetectedEvent; SetRedColor(); } } // async private void ReadingChanged(object sender, AccelerometerReadingChangedEventArgs e) { if (!m_isStarted) return; await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { Windows.Devices.Sensors.AccelerometerReading reading = e.Reading; SendRollCommand(reading.AccelerationX, reading.AccelerationY, reading.AccelerationZ); }); } // private void OnCollisionDetectedEvent(object sender, RobotKit.CollisionData data) { SetRedColor(); m_robot.Roll(0, 0); } // private void ConnectionToggle_Toggled(object sender, RoutedEventArgs e) { ConnectionToggle.OnContent = "Connecting..."; if (ConnectionToggle.IsOn) { if (m_robot == null || m_robot.ConnectionState != ConnectionState.Connected) { SetupRobotConnection(); } } else { ShutdownRobotConnection(); } } // private void StartBtn_Click(object sender, RoutedEventArgs e) { m_isStarted = true; StartBtn.IsEnabled = false; StopBtn.IsEnabled = true; SetGreenColor(); m_robot.Roll(0, 0); } // private void StopBtn_Click(object sender, RoutedEventArgs e) { m_isStarted = false; StartBtn.IsEnabled = true; StopBtn.IsEnabled = false; SetRedColor(); m_robot.Roll(0, 0); } // . private void SetGreenColor() { m_robot.SetHeading(0); m_robot.SetBackLED(1.0f); m_robot.SetRGBLED(0, 255, 0); } // private void SetRedColor() { m_robot.SetHeading(0); m_robot.SetBackLED(1.0f); m_robot.SetRGBLED(255, 0, 0); } // private async void SendRollCommand(double newX, double newY, double newZ) { float x = (float)newX; float y = (float)newY; float z = (float)newZ; float speed = Math.Abs(z); speed = (speed == 0) ? 0 : (float)Math.Sqrt(speed); if (speed > 1f) speed = 0.01f; int heading = Convert.ToInt32(Math.PI / 2.0 - Math.Atan2((double)y - m_currentY, (double)x - m_currentX)); long milliseconds = DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond; if ((milliseconds - m_lastTimeMs) > 1000) { SetGreenColor(); m_robot.Roll(heading, speed); m_lastTimeMs = milliseconds; m_currentX = x; m_currentY = y; } } }
Source: https://habr.com/ru/post/214759/
All Articles