private void lbstart_SelectionChanged(object sender, SelectionChangedEventArgs e) { CC2650SensorTag.SensorIndexes start = (CC2650SensorTag.SensorIndexes)lbstart.SelectedIndex; CC2650SensorTag.SensorIndexes end = (CC2650SensorTag.SensorIndexes)lbend.SelectedIndex; if (end < start) { lbend.SelectedIndex = (int)start; } else { CC2650SensorTag.FIRST_SENSOR = (int)start; CC2650SensorTag.NUM_SENSORS_TO_TEST = 1 + (int)end - (int)start; } }
//private int DoneSensorCout { get; set; } = 0; private async Task initSensor(CC2650SensorTag.SensorIndexes sensorIndx) { Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { if (sensorIndx >= 0 && sensorIndx != CC2650SensorTag.SensorIndexes.IO_SENSOR && sensorIndx != CC2650SensorTag.SensorIndexes.REGISTERS) { //temp.CallMeBack = CallMeBackTemp; switch (sensorIndx) { case (CC2650SensorTag.SensorIndexes.IR_SENSOR): IRTitle.Foreground = new SolidColorBrush(Colors.Green); break; case (CC2650SensorTag.SensorIndexes.MOVEMENT): AccelTitle.Foreground = new SolidColorBrush(Colors.Green); GyroTitle.Foreground = new SolidColorBrush(Colors.Green); MagnoTitle.Foreground = new SolidColorBrush(Colors.Green); //temp.setSensorPeriod(1000); break; case (CC2650SensorTag.SensorIndexes.HUMIDITY): HumidTitle.Foreground = new SolidColorBrush(Colors.Green); break; case (CC2650SensorTag.SensorIndexes.OPTICAL): LuxTitle.Foreground = new SolidColorBrush(Colors.Green); break;; case (CC2650SensorTag.SensorIndexes.BAROMETRIC_PRESSURE): BaroTitle.Foreground = new SolidColorBrush(Colors.Green); //BaroTitleTemp.Foreground = new SolidColorBrush(Colors.Green); break; case (CC2650SensorTag.SensorIndexes.KEYS): KeyTitle.Foreground = new SolidColorBrush(Colors.Green); break; default: break; } } //DoneSensorCout++; //UserOut.Text = UserOut.Text.Substring(0, UserOut.Text.Length - 5) + string.Format(" {0,4}", DoneSensorCout); }); SetUpProgress2(); Debug.WriteLine("End init sensor(new): " + sensorIndx.ToString()); }
private async Task initSensor(CC2650SensorTag.SensorIndexes sensorIndx) { Dispatcher.RunAsync(CoreDispatcherPriority.Low, () => { if (sensorIndx >= 0 && sensorIndx != CC2650SensorTag.SensorIndexes.IO_SENSOR && sensorIndx != CC2650SensorTag.SensorIndexes.REGISTERS) { //temp.CallMeBack = CallMeBackTemp; switch (sensorIndx) { case (CC2650SensorTag.SensorIndexes.IR_SENSOR): IRTitle.Foreground = new SolidColorBrush(Colors.Green); break; case (CC2650SensorTag.SensorIndexes.MOVEMENT): AccelTitle.Foreground = new SolidColorBrush(Colors.Green); GyroTitle.Foreground = new SolidColorBrush(Colors.Green); MagnoTitle.Foreground = new SolidColorBrush(Colors.Green); //temp.setSensorPeriod(1000); break; case (CC2650SensorTag.SensorIndexes.HUMIDITY): HumidTitle.Foreground = new SolidColorBrush(Colors.Green); break; case (CC2650SensorTag.SensorIndexes.OPTICAL): LuxTitle.Foreground = new SolidColorBrush(Colors.Green); break;; case (CC2650SensorTag.SensorIndexes.BAROMETRIC_PRESSURE): BaroTitle.Foreground = new SolidColorBrush(Colors.Green); BaroTitleTemp.Foreground = new SolidColorBrush(Colors.Green); break; case (CC2650SensorTag.SensorIndexes.KEYS): KeyTitle.Foreground = new SolidColorBrush(Colors.Green); break; default: break; } } }); Debug.WriteLine("End init sensor(new): " + sensorIndx.ToString()); }
private async Task initSensor(CC2650SensorTag.SensorIndexes sensorIndx) { GattDeviceService gattService = CC2650SensorTag.ServiceList[(int)sensorIndx]; if (gattService != null) { CC2650SensorTag temp = new CC2650SensorTag(gattService, sensorIndx, CallMeBack); if (temp != null) { await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync( Windows.UI.Core.CoreDispatcherPriority.Normal, () => { // your code to access the UI thread widgets InitSensorCallback?.Invoke(sensorIndx); }); } //Sensor Specific NonUI actions post init switch (sensorIndx) { case (CC2650SensorTag.SensorIndexes.IR_SENSOR): break; case (CC2650SensorTag.SensorIndexes.MOVEMENT): temp.setSensorPeriod(1000); break; case (CC2650SensorTag.SensorIndexes.HUMIDITY): break; case (CC2650SensorTag.SensorIndexes.OPTICAL): break;; case (CC2650SensorTag.SensorIndexes.BAROMETRIC_PRESSURE):; break; case (CC2650SensorTag.SensorIndexes.KEYS): break; default: break; } } CC2650SensorTag.IncProgressCounter(); }
private void Go_Tapped(object sender, TappedRoutedEventArgs e) { //uint numTags = 2; //bool res = uint.TryParse(txtnumTags.Text.Trim(), out numTags); //if (res) // MainPage2.numDevices = (int)numTags; if ((bool)chkUseBattery.IsChecked) { CC2650SensorTag.Use_DEVICE_BATTERY_SERVICE = true; } else { CC2650SensorTag.Use_DEVICE_BATTERY_SERVICE = false; } if ((bool)chkGetSysInfo.IsChecked) { CC2650SensorTag.Use_UUID_PROPERTIES_SERVICE = true; } else { CC2650SensorTag.Use_UUID_PROPERTIES_SERVICE = false; } if ((bool)chkServiceSensors.IsChecked) { CC2650SensorTag.ServiceSensors = true; } else { CC2650SensorTag.ServiceSensors = false; } if ((bool)chkPeriodicUpdatesOnly.IsChecked) { CC2650SensorTag.PeriodicUpdatesOnly = true; } else { CC2650SensorTag.PeriodicUpdatesOnly = false; } System.Diagnostics.Debug.WriteLine("=================="); string valStr = this.txtUpdatePeriod.Text; long val = 4; bool res = long.TryParse(valStr, out val); if (res) { CC2650SensorTag.UpdatePeriod = val * 1000; } System.Diagnostics.Debug.WriteLine("LogPeriod(ms): " + CC2650SensorTag.UpdatePeriod.ToString()); if ((bool)chkPeriodicUpdatesOnly.IsChecked) { System.Diagnostics.Debug.WriteLine("In periodic manual read of sensors mode, except Optical (OnChange) and Motion (Periodic 1s))"); valStr = this.txtPeriod.Text; res = long.TryParse(valStr, out val); if (res) { CC2650SensorTag.Period = val; } System.Diagnostics.Debug.WriteLine("UpdatePeriod (No. log perios): " + CC2650SensorTag.Period.ToString()); valStr = this.txtUpdatePeriodsToSkip.Text; res = long.TryParse(valStr, out val); if (res) { CC2650SensorTag.NumTimerEventsToWaitBeforeTurningOffUpdates = val; } System.Diagnostics.Debug.WriteLine("Period to wait before turning off OnChange Updates (No. Log Periods): " + CC2650SensorTag.NumTimerEventsToWaitBeforeTurningOffUpdates.ToString()); } else { System.Diagnostics.Debug.WriteLine("In OnChange read of sensors mode, except Motion (Periodic 1s))"); //CC2650SensorTag.ServiceSensors = false; } if ((bool)chkServiceSensors.IsChecked) { CC2650SensorTag.SensorIndexes start = (CC2650SensorTag.SensorIndexes)lbstart.SelectedIndex; CC2650SensorTag.SensorIndexes end = (CC2650SensorTag.SensorIndexes)lbend.SelectedIndex; CC2650SensorTag.FIRST_SENSOR = (int)start; CC2650SensorTag.NUM_SENSORS_TO_TEST = 1 + (int)end - (int)start; System.Diagnostics.Debug.WriteLine("Using sensors " + start.ToString() + " to " + end.ToString()); } else { System.Diagnostics.Debug.WriteLine("Not reading sensors"); } System.Diagnostics.Debug.WriteLine("=================="); this.Frame.Navigate(typeof(MainPage2), this); }
//Watcher for Bluetooth LE Services public void StartBLEWatcher(Page mainPage2, DeviceInfoDel SetDevInfo, SetupProgressDel setUpProgress2) { NainPage2 = mainPage2; HasOKd = false; int targetNoServices = CC2650SensorTag.NUM_SENSORS_TO_TEST; if (CC2650SensorTag.Use_DEVICE_BATTERY_SERVICE) { targetNoServices++; } if (CC2650SensorTag.Use_UUID_PROPERTIES_SERVICE) { targetNoServices++; } ManualResetEvent firstServiceStartedManualResetEvent = new ManualResetEvent(false); CC2650SensorTag.EventCount = 0; CC2650SensorTag.SetSensorsManualMode = false; //Init values for log long start = 0; counter = 0; System.Threading.Interlocked.Exchange(ref updating, 0); // Hook up handlers for the watcher events before starting the watcher OnBLEAdded = async(watcher, deviceInfo) => { if (System.Threading.Interlocked.Increment(ref notifiedServices) == 1) { //await Task.Run(async () => await NainPage2.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, async() => { //Set up event logging StorageFolder storageFolder = KnownFolders.DocumentsLibrary; sampleFile = await storageFolder.CreateFileAsync("sample.log", CreationCollisionOption.ReplaceExisting); if (CC2650SensorTag.DeviceAltSensorNames.Contains(deviceInfo.Name)) { setUpProgress2(); Debug.WriteLine("OnBLEAdded1 On UI Thread: " + deviceInfo.Id); GattDeviceService service = null; try { HasOKd = true; service = await GattDeviceService.FromIdAsync(deviceInfo.Id); SetDevInfo(deviceInfo); } catch (Exception ex) { HasOKd = false; string msg = ex.Message; Debug.WriteLine("Error: OnBLEAdded2() on UI Thread(): " + deviceInfo.Id + " " + msg); return; } if (service != null) { CC2650SensorTag.SensorIndexes sensorIndx = CC2650SensorTag.SensorIndexes.NOTFOUND; string svcGuid = service.Uuid.ToString().ToUpper(); Debug.WriteLine("Found Service: " + svcGuid); //Let other services start now firstServiceStartedManualResetEvent.Set(); // Add this service to the list if it conforms to the TI-GUID pattern for most sensors if (svcGuid == CC2650SensorTag.DEVICE_BATTERY_SERVICE) { CC2650SensorTag.SetUpBattery(service); byte[] bytes = await CC2650SensorTag.GetBatteryLevel(); } else if (svcGuid == CC2650SensorTag.UUID_PROPERTIES_SERVICE.ToUpper()) { CC2650SensorTag.DevicePropertyService = service; await CC2650SensorTag.GetProperties(false); } else { if (svcGuid == CC2650SensorTag.IO_SENSOR_GUID_STR) { sensorIndx = CC2650SensorTag.SensorIndexes.IO_SENSOR; } else if (svcGuid == CC2650SensorTag.REGISTERS_GUID_STR) { sensorIndx = CC2650SensorTag.SensorIndexes.REGISTERS; } // otherwise, if this is the GUID for the KEYS, then handle it special else if (svcGuid == CC2650SensorTag.BUTTONS_GUID_STR) { sensorIndx = CC2650SensorTag.SensorIndexes.KEYS; } else if (svcGuid.StartsWith(CC2650SensorTag.SENSOR_GUID_PREFIX)) { // The character at this position indicates the index into the ServiceList // container that we want to save this service to. The rest of this program // assumes that specific sensor types are at specific indexes in this array int Indx = (svcGuid[6] - '0'); sensorIndx = CC2650SensorTag.GetSensorIndex(Indx); } // If the index is legal and a service hasn't already been cached, then // cache this service in our ServiceList if (((sensorIndx >= 0) && (sensorIndx <= (CC2650SensorTag.SensorIndexes)CC2650SensorTag.SENSOR_MAX)) && (CC2650SensorTag.ServiceList[(int)sensorIndx] == null)) { CC2650SensorTag.ServiceList[(int)sensorIndx] = service; await initSensor(sensorIndx); System.Threading.Interlocked.Increment(ref discoveredServices); } else { } } } else //Service is Null: Need to let other services attempt start now { firstServiceStartedManualResetEvent.Set(); } CC2650SensorTag.IncProgressCounter(); } }); } else { firstServiceStartedManualResetEvent.WaitOne(); await Task.Run(async() => //await NainPage2.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, async () => { if (CC2650SensorTag.DeviceAltSensorNames.Contains(deviceInfo.Name)) { CC2650SensorTag.IncProgressCounter(); Debug.WriteLine("OnBLEAdded2() Not on UI thread: " + deviceInfo.Id); GattDeviceService service = null; try { service = await GattDeviceService.FromIdAsync(deviceInfo.Id); } catch (Exception ex) { string msg = ex.Message; Debug.WriteLine("Error: OnBLEAdded2() Not on UI Thread: " + deviceInfo.Id + " " + msg); return; } if (service != null) { CC2650SensorTag.SensorIndexes sensorIndx = CC2650SensorTag.SensorIndexes.NOTFOUND; string svcGuid = service.Uuid.ToString().ToUpper(); Debug.WriteLine("Found Service: " + svcGuid); // Add this service to the list if it conforms to the TI-GUID pattern for most sensors if (svcGuid == CC2650SensorTag.DEVICE_BATTERY_SERVICE) { CC2650SensorTag.SetUpBattery(service); byte[] bytes = await CC2650SensorTag.GetBatteryLevel(); return; } else if (svcGuid == CC2650SensorTag.UUID_PROPERTIES_SERVICE.ToUpper()) { CC2650SensorTag.DevicePropertyService = service; await CC2650SensorTag.GetProperties(false); return; } else if (svcGuid == CC2650SensorTag.IO_SENSOR_GUID_STR) { sensorIndx = CC2650SensorTag.SensorIndexes.IO_SENSOR; } else if (svcGuid == CC2650SensorTag.REGISTERS_GUID_STR) { sensorIndx = CC2650SensorTag.SensorIndexes.REGISTERS; } // otherwise, if this is the GUID for the KEYS, then handle it special else if (svcGuid == CC2650SensorTag.BUTTONS_GUID_STR) { sensorIndx = CC2650SensorTag.SensorIndexes.KEYS; } else if (svcGuid.StartsWith(CC2650SensorTag.SENSOR_GUID_PREFIX)) { // The character at this position indicates the index into the ServiceList // container that we want to save this service to. The rest of this program // assumes that specific sensor types are at specific indexes in this array int Indx = (svcGuid[6] - '0'); sensorIndx = CC2650SensorTag.GetSensorIndex(Indx); } // If the index is legal and a service hasn't already been cached, then // cache this service in our ServiceList if (((sensorIndx >= 0) && (sensorIndx <= (CC2650SensorTag.SensorIndexes)CC2650SensorTag.SENSOR_MAX)) && (CC2650SensorTag.ServiceList[(int)sensorIndx] == null)) { CC2650SensorTag.ServiceList[(int)sensorIndx] = service; await initSensor(sensorIndx); System.Threading.Interlocked.Increment(ref discoveredServices); } else { } } CC2650SensorTag.IncProgressCounter(); } }); } }; OnBLEUpdated = async(watcher, deviceInfoUpdate) => { await Task.Run(() => Debug.WriteLine($"OnBLEUpdated: {deviceInfoUpdate.Id}")); }; OnBLERemoved = async(watcher, deviceInfoUpdate) => { await Task.Run(() => Debug.WriteLine("OnBLERemoved")); }; OnBLEEnumerationCompleted = async(watcher, obj) => { await Task.Run(() => { blewatcher.Stop(); UpdateButtons_WhenSensorsAreReady_CallBack?.Invoke(); Debug.WriteLine("blewatcher Stopped."); System.Threading.Interlocked.Exchange(ref CC2650SensorTag.EventCount, start); EventTimer = new Timer(EventTimerCallback, null, 0, (int)CC2650SensorTag.UpdatePeriod); CC2650SensorTag.IncProgressCounter(); Debug.WriteLine("OnBLEEnumerationCompleted"); }); }; string aqs = ""; if (CC2650SensorTag.ServiceSensors) { for (int ii = 0; ii < CC2650SensorTag.NUM_SENSORS_TO_TEST; ii++) { int i = CC2650SensorTag.FIRST_SENSOR + ii; CC2650SensorTag.SensorIndexes sensorIndx = (CC2650SensorTag.SensorIndexes)i; Guid BLE_GUID; Debug.WriteLine("NUMSENSORS " + sensorIndx.ToString()); if (sensorIndx == CC2650SensorTag.SensorIndexes.IO_SENSOR) { BLE_GUID = CC2650SensorTag.IO_SENSOR_GUID; } else if (sensorIndx == CC2650SensorTag.SensorIndexes.REGISTERS) { BLE_GUID = CC2650SensorTag.REGISTERS_GUID; } else if (sensorIndx != CC2650SensorTag.SensorIndexes.KEYS) { BLE_GUID = new Guid(CC2650SensorTag.UUIDBase[i] + CC2650SensorTag.SENSOR_GUID_SUFFFIX); } else { BLE_GUID = CC2650SensorTag.BUTTONS_GUID; } aqs += "(" + GattDeviceService.GetDeviceSelectorFromUuid(BLE_GUID) + ")"; if (ii < CC2650SensorTag.NUM_SENSORS_TO_TEST - 1) { aqs += " OR "; } } } if (CC2650SensorTag.Use_DEVICE_BATTERY_SERVICE) { if (CC2650SensorTag.ServiceSensors) { aqs += " OR "; } aqs += "(" + GattDeviceService.GetDeviceSelectorFromUuid(new Guid(CC2650SensorTag.DEVICE_BATTERY_SERVICE)) + ")"; } if (CC2650SensorTag.Use_UUID_PROPERTIES_SERVICE) { if ((CC2650SensorTag.ServiceSensors) || (CC2650SensorTag.Use_DEVICE_BATTERY_SERVICE)) { aqs += " OR "; } aqs += "(" + GattDeviceService.GetDeviceSelectorFromUuid(new Guid(CC2650SensorTag.UUID_PROPERTIES_SERVICE)) + ")"; } blewatcher = DeviceInformation.CreateWatcher(aqs); blewatcher.Added += OnBLEAdded; blewatcher.Updated += OnBLEUpdated; blewatcher.Removed += OnBLERemoved; blewatcher.EnumerationCompleted += OnBLEEnumerationCompleted;; blewatcher.Start(); CC2650SensorTag.IncProgressCounter(); }