예제 #1
0
 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;
     }
 }
예제 #2
0
        //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());
        }
예제 #3
0
        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());
        }
예제 #4
0
        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();
        }
예제 #5
0
        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);
        }
예제 #6
0
        //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();
        }