<wb:DeviceCapability Name="bluetooth.rfcomm"> <wb:Device Id="any"> <wb:Function Type="serviceId:00001101-0000-1000-8000-00805F9B34FB" /> </wb:Device> </wb:DeviceCapability>
<Grid Background="#0094D0"> <TextBlock x:Name="SpheroName" HorizontalAlignment="Left" Margin="82,97,0,0" TextWrapping="Wrap" Text="No Sphero Connected" VerticalAlignment="Top" FontSize="24"/> <ToggleSwitch x:Name="ConnectionToggle" HorizontalAlignment="Left" Margin="76,122,0,0" VerticalAlignment="Top" Toggled="ConnectionToggle_Toggled" /> <Grid HorizontalAlignment="Center" Height="512" Margin="0,0,0,0" VerticalAlignment="Center" Width="512"> <Button Name="startGameBtn" Click="startGameBtn_Click" Content="Start" Height="113" Width="334" /> </Grid> </Grid>
public sealed partial class MainPage : Page { private Sphero m_robot = null; private long m_lastCommandSentTimeMs; private bool m_gameIsStarted = 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; } // . protected override void OnNavigatedFrom(NavigationEventArgs e) { base.OnNavigatedFrom(e); ShutdownRobotConnection(); Application app = Application.Current; app.Suspending -= OnSuspending; } // 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.SensorControl.StopAll(); m_robot.Sleep(); m_robot.Disconnect(); ConnectionToggle.OffContent = "Disconnected"; SpheroName.Text = c_noSpheroConnected; m_robot.SensorControl.AccelerometerUpdatedEvent -= OnAccelerometerUpdated; 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); SetRobotDefault(); m_robot.SensorControl.Hz = 10; m_robot.SensorControl.AccelerometerUpdatedEvent += OnAccelerometerUpdated; } // private void OnAccelerometerUpdated(object sender, AccelerometerReading reading) { if (m_gameIsStarted) MoveRobot(reading.X, reading.Y); } // . private void SetRobotDefault() { m_robot.SetHeading(0); m_robot.SetRGBLED(0, 255, 0); m_robot.Roll(0, 0); } // public async void ChangeRobotColor() { int colorsCount = 20; Random r = new Random(); List<Color> colors = new List<Color> { Color.FromArgb(100, 0, 255, 0) }; for (int c = 0; c < colorsCount; c++) colors.Add(Color.FromArgb(100, (byte)r.Next(255), 0, (byte)r.Next(255))); List<int> miliseconds = new List<int>(); for (int m = 0; m <= 5; m++) miliseconds.Add(r.Next(1000)); while (true) { int colorNumber = r.Next(colorsCount); Color color = colors[colorNumber]; int milisecond = miliseconds[r.Next(5)]; m_robot.SetRGBLED(color.R, color.G, color.B); await Task.Delay(TimeSpan.FromMilliseconds(milisecond)); } } // . 10 public void MoveRobot(float x, float y) { m_robot.SetHeading(0); int angleDegrees = 10; long milliseconds = DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond; if ((milliseconds - m_lastCommandSentTimeMs) > 1) { m_robot.Roll(angleDegrees, 0); m_lastCommandSentTimeMs = milliseconds; } } // private void startGameBtn_Click(object sender, RoutedEventArgs e) { m_gameIsStarted = !m_gameIsStarted; if (m_gameIsStarted) { startGameBtn.Content = "Stop"; ChangeRobotColor(); } else { startGameBtn.Content = "Start"; SetRobotDefault(); } } // private void ConnectionToggle_Toggled(object sender, RoutedEventArgs e) { ConnectionToggle.OnContent = "Connecting..."; if (ConnectionToggle.IsOn) { if (m_robot == null) { SetupRobotConnection(); } } else { ShutdownRobotConnection(); } } }
Source: https://habr.com/ru/post/213797/
All Articles