private void CalcBarometricPressure(DateTimeOffset timestamp, byte[] data)
        {
            // this code implements the algorithm in T5400 data sheet at
            // http://processors.wiki.ti.com/index.php/SensorTag_User_Guide#Barometric_Pressure_Sensor

            if (this.c != null)
            {
                BarometerMeasurement measurement = new BarometerMeasurement();

                //more info about the calculation:
                //http://www.epcos.com/web/generator/Web/Sections/ProductCatalog/Sensors/PressureSensors/T5400-ApplicationNote,property=Data__en.pdf;/T5400_ApplicationNote.pdf

                int tr = BitConverter.ToInt16(data, 0);  // Temperature raw value
                int pr = BitConverter.ToUInt16(data, 2); // Pressure raw value from sensor

                // Temperature actual value in unit centi degrees celsius
                double t_a         = (100 * (c[0] * tr / Math.Pow(2, 8) + c[1] * Math.Pow(2, 6))) / Math.Pow(2, 16);
                double sensitivity = c[2] + c[3] * tr / Math.Pow(2, 17) + ((c[4] * tr / Math.Pow(2, 15)) * tr) / Math.Pow(2, 19);
                double offset      = c[5] * Math.Pow(2, 14) + c[6] * tr / Math.Pow(2, 3) + ((c[7] * tr / Math.Pow(2, 15)) * tr) / Math.Pow(2, 4);

                measurement.Pascals = (sensitivity * pr + offset) / Math.Pow(2, 14);

                OnBarometerMeasurementValueChanged(new BarometerMeasurementEventArgs(measurement, timestamp));
            }
        }
 protected override void OnCharacteristicValueChanged(GattCharacteristic sender, GattValueChangedEventArgs eventArgs)
 {
     if (sender.Uuid == BarometerCharacteristicUuid)
     {
         if (_barometerValueChanged != null)
         {
             uint dataLength = eventArgs.CharacteristicValue.Length;
             using (DataReader reader = DataReader.FromBuffer(eventArgs.CharacteristicValue))
             {
                 if (dataLength == 4)
                 {
                     // version 1
                     var data = new byte[dataLength];
                     reader.ReadBytes(data);
                     CalcBarometricPressure(eventArgs.Timestamp, data);
                 }
                 else if (dataLength == 6)
                 {
                     // version 2
                     uint temp     = ReadBigEndianU24bit(reader);
                     uint pressure = ReadBigEndianU24bit(reader);
                     BarometerMeasurement measurement = new BarometerMeasurement();
                     measurement.Temperature  = (double)temp / 100.0;
                     measurement.HectoPascals = (double)pressure / 100.0;
                     OnBarometerMeasurementValueChanged(new BarometerMeasurementEventArgs(measurement, eventArgs.Timestamp));
                 }
             }
         }
     }
     else if (sender.Uuid == BarometerCharacteristicCalibrationUuid)
     {
         UpdateCalibrationData(eventArgs);
     }
 }
 public BarometerMeasurementEventArgs(BarometerMeasurement measurement, DateTimeOffset timestamp)
 {
     Measurement = measurement;
     Timestamp   = timestamp;
 }