Joshua Slater / BLE_API_Changed

Fork of BLE_API by Bluetooth Low Energy

Committer:
rgrover1
Date:
Fri Jun 19 15:53:28 2015 +0100
Revision:
711:ea0c4bf9ec99
Parent:
710:b2e1a2660ec2
Synchronized with git rev 69726547
Author: Rohit Grover
Release 0.3.9
=============

A minor patch to fix a build error introduced by the previous
release. This has to do with certain declarations being made members
of class UUID.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Rohit Grover 118:620d28e7a1ba 1 /* mbed Microcontroller Library
Rohit Grover 118:620d28e7a1ba 2 * Copyright (c) 2006-2013 ARM Limited
Rohit Grover 118:620d28e7a1ba 3 *
Rohit Grover 118:620d28e7a1ba 4 * Licensed under the Apache License, Version 2.0 (the "License");
Rohit Grover 118:620d28e7a1ba 5 * you may not use this file except in compliance with the License.
Rohit Grover 118:620d28e7a1ba 6 * You may obtain a copy of the License at
Rohit Grover 118:620d28e7a1ba 7 *
Rohit Grover 118:620d28e7a1ba 8 * http://www.apache.org/licenses/LICENSE-2.0
Rohit Grover 118:620d28e7a1ba 9 *
Rohit Grover 118:620d28e7a1ba 10 * Unless required by applicable law or agreed to in writing, software
Rohit Grover 118:620d28e7a1ba 11 * distributed under the License is distributed on an "AS IS" BASIS,
Rohit Grover 118:620d28e7a1ba 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Rohit Grover 118:620d28e7a1ba 13 * See the License for the specific language governing permissions and
Rohit Grover 118:620d28e7a1ba 14 * limitations under the License.
Rohit Grover 118:620d28e7a1ba 15 */
Rohit Grover 118:620d28e7a1ba 16
Rohit Grover 118:620d28e7a1ba 17 #ifndef __BLE_HEALTH_THERMOMETER_SERVICE_H__
Rohit Grover 118:620d28e7a1ba 18 #define __BLE_HEALTH_THERMOMETER_SERVICE_H__
Rohit Grover 118:620d28e7a1ba 19
rgrover1 710:b2e1a2660ec2 20 #include "BLEDevice.h"
Rohit Grover 118:620d28e7a1ba 21
rgrover1 242:0e9201b67e2f 22 /**
mbedAustin 235:448f29f4ae7f 23 * @class HealthThermometerService
rgrover1 242:0e9201b67e2f 24 * @brief BLE Health Thermometer Service. This service provides the location of the thermometer and the temperature. <br>
mbedAustin 235:448f29f4ae7f 25 * Service: https://developer.bluetooth.org/gatt/profiles/Pages/ProfileViewer.aspx?u=org.bluetooth.profile.health_thermometer.xml <br>
mbedAustin 235:448f29f4ae7f 26 * Temperature Measurement: https://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.temperature_measurement.xml <br>
rgrover1 242:0e9201b67e2f 27 * Temperature Type: https://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.temperature_type.xml
mbedAustin 235:448f29f4ae7f 28 */
Rohit Grover 118:620d28e7a1ba 29 class HealthThermometerService {
Rohit Grover 118:620d28e7a1ba 30 public:
mbedAustin 235:448f29f4ae7f 31 /**
mbedAustin 235:448f29f4ae7f 32 * @enum Sensor Location
rgrover1 242:0e9201b67e2f 33 * @brief Location of sensor on the body
mbedAustin 235:448f29f4ae7f 34 */
rgrover1 243:98f930d14515 35 enum SensorLocation_t {
mbedAustin 235:448f29f4ae7f 36 LOCATION_ARMPIT = 1, /*!< armpit */
mbedAustin 235:448f29f4ae7f 37 LOCATION_BODY, /*!< body */
mbedAustin 235:448f29f4ae7f 38 LOCATION_EAR, /*!< ear */
mbedAustin 235:448f29f4ae7f 39 LOCATION_FINGER, /*!< finger */
mbedAustin 235:448f29f4ae7f 40 LOCATION_GI_TRACT, /*!< GI tract */
mbedAustin 235:448f29f4ae7f 41 LOCATION_MOUTH, /*!< mouth */
mbedAustin 235:448f29f4ae7f 42 LOCATION_RECTUM, /*!< rectum */
mbedAustin 235:448f29f4ae7f 43 LOCATION_TOE, /*!< toe */
mbedAustin 235:448f29f4ae7f 44 LOCATION_EAR_DRUM, /*!< ear drum */
Rohit Grover 118:620d28e7a1ba 45 };
Rohit Grover 118:620d28e7a1ba 46
Rohit Grover 118:620d28e7a1ba 47 public:
Rohit Grover 118:620d28e7a1ba 48 /**
rgrover1 242:0e9201b67e2f 49 * @brief Add the Health Thermometer Service to an existing ble object, initialize with temperature and location.
mbedAustin 235:448f29f4ae7f 50 * @param[ref] _ble reference to the BLE device
Rohit Grover 118:620d28e7a1ba 51 * @param[in] initialTemp initial value in celsius
Rohit Grover 118:620d28e7a1ba 52 * @param[in] _location
Rohit Grover 118:620d28e7a1ba 53 */
rgrover1 710:b2e1a2660ec2 54 HealthThermometerService(BLEDevice &_ble, float initialTemp, uint8_t _location) :
Rohit Grover 118:620d28e7a1ba 55 ble(_ble),
Rohit Grover 118:620d28e7a1ba 56 valueBytes(initialTemp),
rgrover1 277:1407d2f1ce3c 57 tempMeasurement(GattCharacteristic::UUID_TEMPERATURE_MEASUREMENT_CHAR, (TemperatureValueBytes *)valueBytes.getPointer(), GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY),
rgrover1 277:1407d2f1ce3c 58 tempLocation(GattCharacteristic::UUID_TEMPERATURE_TYPE_CHAR, &_location) {
Rohit Grover 118:620d28e7a1ba 59
Rohit Grover 118:620d28e7a1ba 60 GattCharacteristic *hrmChars[] = {&tempMeasurement, &tempLocation, };
Rohit Grover 118:620d28e7a1ba 61 GattService hrmService(GattService::UUID_HEALTH_THERMOMETER_SERVICE, hrmChars, sizeof(hrmChars) / sizeof(GattCharacteristic *));
Rohit Grover 118:620d28e7a1ba 62
Rohit Grover 118:620d28e7a1ba 63 ble.addService(hrmService);
Rohit Grover 118:620d28e7a1ba 64 }
Rohit Grover 118:620d28e7a1ba 65
mbedAustin 235:448f29f4ae7f 66 /**
rgrover1 242:0e9201b67e2f 67 * @brief Update the temperature being broadcast
mbedAustin 235:448f29f4ae7f 68 *
mbedAustin 235:448f29f4ae7f 69 * @param[in] temperature
mbedAustin 235:448f29f4ae7f 70 * Floating point value of the temperature
rgrover1 242:0e9201b67e2f 71 *
mbedAustin 235:448f29f4ae7f 72 */
Rohit Grover 118:620d28e7a1ba 73 void updateTemperature(float temperature) {
Rohit Grover 118:620d28e7a1ba 74 if (ble.getGapState().connected) {
Rohit Grover 118:620d28e7a1ba 75 valueBytes.updateTemperature(temperature);
Rohit Grover 118:620d28e7a1ba 76 ble.updateCharacteristicValue(tempMeasurement.getValueAttribute().getHandle(), valueBytes.getPointer(), sizeof(TemperatureValueBytes));
Rohit Grover 118:620d28e7a1ba 77 }
Rohit Grover 118:620d28e7a1ba 78 }
Rohit Grover 118:620d28e7a1ba 79
rgrover1 243:98f930d14515 80 /**
rgrover1 243:98f930d14515 81 * @brief Update the location.
rgrover1 243:98f930d14515 82 * @param loc
rgrover1 243:98f930d14515 83 * new location value.
rgrover1 243:98f930d14515 84 */
rgrover1 243:98f930d14515 85 void updateLocation(SensorLocation_t loc) {
rgrover1 243:98f930d14515 86 ble.updateCharacteristicValue(tempLocation.getValueHandle(), reinterpret_cast<uint8_t *>(&loc), sizeof(uint8_t));
rgrover1 243:98f930d14515 87 }
rgrover1 243:98f930d14515 88
Rohit Grover 118:620d28e7a1ba 89 private:
Rohit Grover 118:620d28e7a1ba 90 /* Private internal representation for the bytes used to work with the vaulue of the heart-rate characteristic. */
Rohit Grover 118:620d28e7a1ba 91 struct TemperatureValueBytes {
Rohit Grover 118:620d28e7a1ba 92 static const unsigned OFFSET_OF_FLAGS = 0;
Rohit Grover 118:620d28e7a1ba 93 static const unsigned OFFSET_OF_VALUE = OFFSET_OF_FLAGS + sizeof(uint8_t);
Rohit Grover 118:620d28e7a1ba 94 static const unsigned SIZEOF_VALUE_BYTES = sizeof(uint8_t) + sizeof(float);
Rohit Grover 118:620d28e7a1ba 95
Rohit Grover 118:620d28e7a1ba 96 static const unsigned TEMPERATURE_UNITS_FLAG_POS = 0;
Rohit Grover 118:620d28e7a1ba 97 static const unsigned TIMESTAMP_FLAG_POS = 1;
Rohit Grover 118:620d28e7a1ba 98 static const unsigned TEMPERATURE_TYPE_FLAG_POS = 2;
Rohit Grover 118:620d28e7a1ba 99
rgrover1 242:0e9201b67e2f 100 static const uint8_t TEMPERATURE_UNITS_CELSIUS = 0;
rgrover1 242:0e9201b67e2f 101 static const uint8_t TEMPERATURE_UNITS_FAHRENHEIT = 1;
Rohit Grover 118:620d28e7a1ba 102
Rohit Grover 118:620d28e7a1ba 103 TemperatureValueBytes(float initialTemperature) : bytes() {
Rohit Grover 118:620d28e7a1ba 104 /* assumption: temperature values are expressed in Celsius */
Rohit Grover 118:620d28e7a1ba 105 bytes[OFFSET_OF_FLAGS] = (TEMPERATURE_UNITS_CELSIUS << TEMPERATURE_UNITS_FLAG_POS) |
Rohit Grover 118:620d28e7a1ba 106 (false << TIMESTAMP_FLAG_POS) |
Rohit Grover 118:620d28e7a1ba 107 (false << TEMPERATURE_TYPE_FLAG_POS);
Rohit Grover 118:620d28e7a1ba 108 updateTemperature(initialTemperature);
Rohit Grover 118:620d28e7a1ba 109 }
Rohit Grover 118:620d28e7a1ba 110
Rohit Grover 118:620d28e7a1ba 111 void updateTemperature(float temp) {
Rohit Grover 118:620d28e7a1ba 112 uint32_t temp_ieee11073 = quick_ieee11073_from_float(temp);
Rohit Grover 118:620d28e7a1ba 113 memcpy(&bytes[OFFSET_OF_VALUE], &temp_ieee11073, sizeof(float));
Rohit Grover 118:620d28e7a1ba 114 }
Rohit Grover 118:620d28e7a1ba 115
rgrover1 242:0e9201b67e2f 116 uint8_t *getPointer(void) {
Rohit Grover 118:620d28e7a1ba 117 return bytes;
Rohit Grover 118:620d28e7a1ba 118 }
Rohit Grover 118:620d28e7a1ba 119
Rohit Grover 118:620d28e7a1ba 120 const uint8_t *getPointer(void) const {
Rohit Grover 118:620d28e7a1ba 121 return bytes;
Rohit Grover 118:620d28e7a1ba 122 }
Rohit Grover 118:620d28e7a1ba 123
rgrover1 242:0e9201b67e2f 124 private:
Rohit Grover 118:620d28e7a1ba 125 /**
Rohit Grover 118:620d28e7a1ba 126 * @brief A very quick conversion between a float temperature and 11073-20601 FLOAT-Type.
Rohit Grover 118:620d28e7a1ba 127 * @param temperature The temperature as a float.
Rohit Grover 118:620d28e7a1ba 128 * @return The temperature in 11073-20601 FLOAT-Type format.
Rohit Grover 118:620d28e7a1ba 129 */
Rohit Grover 118:620d28e7a1ba 130 uint32_t quick_ieee11073_from_float(float temperature) {
Rohit Grover 118:620d28e7a1ba 131 uint8_t exponent = 0xFE; //exponent is -2
Rohit Grover 118:620d28e7a1ba 132 uint32_t mantissa = (uint32_t)(temperature * 100);
Rohit Grover 118:620d28e7a1ba 133
Rohit Grover 118:620d28e7a1ba 134 return (((uint32_t)exponent) << 24) | mantissa;
Rohit Grover 118:620d28e7a1ba 135 }
Rohit Grover 118:620d28e7a1ba 136
rgrover1 242:0e9201b67e2f 137 private:
Rohit Grover 118:620d28e7a1ba 138 /* First byte = 8-bit flags, Second field is a float holding the temperature value. */
Rohit Grover 118:620d28e7a1ba 139 /* See --> https://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.temperature_measurement.xml */
Rohit Grover 118:620d28e7a1ba 140 uint8_t bytes[SIZEOF_VALUE_BYTES];
Rohit Grover 118:620d28e7a1ba 141 };
Rohit Grover 118:620d28e7a1ba 142
Rohit Grover 118:620d28e7a1ba 143 private:
rgrover1 710:b2e1a2660ec2 144 BLEDevice &ble;
rgrover1 277:1407d2f1ce3c 145 TemperatureValueBytes valueBytes;
rgrover1 277:1407d2f1ce3c 146 ReadOnlyGattCharacteristic<TemperatureValueBytes> tempMeasurement;
rgrover1 277:1407d2f1ce3c 147 ReadOnlyGattCharacteristic<uint8_t> tempLocation;
Rohit Grover 118:620d28e7a1ba 148 };
Rohit Grover 118:620d28e7a1ba 149
rgrover1 242:0e9201b67e2f 150 #endif /* #ifndef __BLE_HEALTH_THERMOMETER_SERVICE_H__*/