Lancaster University's fork of the mbed BLE API. Lives on github, https://github.com/lancaster-university/BLE_API
Dependents: microbit-dal microbit-dal microbit-ble-open microbit-dal ... more
Fork of BLE_API by
Revision 1134:faa0160c87ff, committed 2016-04-06
- Comitter:
- LancasterUniversity
- Date:
- Wed Apr 06 18:40:30 2016 +0100
- Parent:
- 1133:c788020d4781
- Child:
- 1135:0f5db03e0325
- Commit message:
- Synchronized with git rev d363d7ee
Author: Rohit Grover
Merge branch 'develop'
Changed in this revision
--- a/DOXYGEN_FRONTPAGE.md Wed Apr 06 18:40:28 2016 +0100 +++ b/DOXYGEN_FRONTPAGE.md Wed Apr 06 18:40:30 2016 +0100 @@ -4,8 +4,7 @@ Bluetooth Low Energy on multiple platforms. This documentation describes the internal structure of the mbed -[BLE API](https://github.com/armmbed/ble). It was automatically generated from -specially formatted comment blocks in BLE API's source code using Doxygen (see http://www.stack.nl/~dimitri/doxygen/ for more information on Doxygen). +[BLE API](https://github.com/armmbed/ble). For getting started with BLE on mbed, check our [introduction page](https://docs.mbed.com/docs/ble-intros/en/latest/).
--- a/ble.doxyfile Wed Apr 06 18:40:28 2016 +0100 +++ b/ble.doxyfile Wed Apr 06 18:40:30 2016 +0100 @@ -131,7 +131,7 @@ # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. -FULL_PATH_NAMES = NO +FULL_PATH_NAMES = YES # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is @@ -165,7 +165,7 @@ # comments will behave just like regular Qt-style comments # (thus requiring an explicit @brief command for a brief description.) -JAVADOC_AUTOBRIEF = YES +JAVADOC_AUTOBRIEF = NO # If the QT_AUTOBRIEF tag is set to YES then Doxygen will # interpret the first line (until the first dot) of a Qt-style @@ -245,15 +245,21 @@ # Doxygen selects the parser to use depending on the extension of the files it # parses. With this tag you can assign which parser to use for a given # extension. Doxygen has a built-in mapping, but you can override or extend it -# using this tag. The format is ext=language, where ext is a file extension, -# and language is one of the parsers supported by doxygen: IDL, Java, -# Javascript, CSharp, C, C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, -# C++. For instance to make doxygen treat .inc files as Fortran files (default -# is PHP), and .f files as C (default is Fortran), use: inc=Fortran f=C. Note -# that for custom extensions you also need to set FILE_PATTERNS otherwise the -# files are not read by doxygen. - -EXTENSION_MAPPING = +# using this tag. The format is ext=language, where ext is a file extension, and +# language is one of the parsers supported by doxygen: IDL, Java, Javascript, +# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran: +# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran: +# Fortran. In the later case the parser tries to guess whether the code is fixed +# or free formatted code, this is the default for Fortran type files), VHDL. For +# instance to make doxygen treat .inc files as Fortran files (default is PHP), +# and .f files as C (default is Fortran), use: inc=Fortran f=C. +# +# Note: For files without extension you can use no_extension as a placeholder. +# +# Note that for custom extensions you also need to set FILE_PATTERNS otherwise +# the files are not read by doxygen. + +EXTENSION_MAPPING = h=C++ # If MARKDOWN_SUPPORT is enabled (the default) then doxygen pre-processes all # comments according to the Markdown format, which allows for more readable @@ -361,12 +367,12 @@ # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES -EXTRACT_ALL = YES +EXTRACT_ALL = NO # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. -EXTRACT_PRIVATE = YES +EXTRACT_PRIVATE = NO # If the EXTRACT_PACKAGE tag is set to YES all members with package or internal # scope will be included in the documentation. @@ -376,7 +382,7 @@ # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. -EXTRACT_STATIC = YES +EXTRACT_STATIC = NO # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. @@ -389,7 +395,7 @@ # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. -EXTRACT_LOCAL_METHODS = YES +EXTRACT_LOCAL_METHODS = NO # If this flag is set to YES, the members of anonymous namespaces will be # extracted and appear in the documentation as a namespace called @@ -488,7 +494,7 @@ # This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO # and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. -SORT_MEMBERS_CTORS_1ST = NO +SORT_MEMBERS_CTORS_1ST = YES # If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the # hierarchy of group names into alphabetical order. If set to NO (the default) @@ -638,7 +644,7 @@ # wrong or incomplete parameter documentation, but not about the absence of # documentation. -WARN_NO_PARAMDOC = NO +WARN_NO_PARAMDOC = YES # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text @@ -653,10 +659,10 @@ # and error messages should be written. If left blank the output is written # to stderr. -WARN_LOGFILE = +WARN_LOGFILE = doxygen_warn.log #--------------------------------------------------------------------------- -# configuration options related to the input files +# Configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain @@ -731,7 +737,7 @@ # and *.h) to filter out the source-files in the directories. If left # blank all files are included. -EXAMPLE_PATTERNS = * +EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude @@ -833,6 +839,16 @@ REFERENCES_LINK_SOURCE = YES +# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the +# source code will show a tooltip with additional information such as prototype, +# brief description and links to the definition and documentation. Since this +# will make the HTML file larger and loading of large files a bit slower, you +# can opt to disable this feature. +# The default value is: YES. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +SOURCE_TOOLTIPS = YES + # If the USE_HTAGS tag is set to YES then the references to source code # will point to the HTML generated by the htags(1) tool instead of doxygen # built-in source browser. The htags tool is part of GNU's global source @@ -855,7 +871,7 @@ # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. -ALPHABETICAL_INDEX = NO +ALPHABETICAL_INDEX = YES # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns @@ -871,7 +887,7 @@ IGNORE_PREFIX = #--------------------------------------------------------------------------- -# configuration options related to the HTML output +# Configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will @@ -1131,9 +1147,11 @@ GENERATE_ECLIPSEHELP = NO -# A unique identifier for the eclipse help plugin. When installing the plugin -# the directory name containing the HTML and XML files should also have -# this name. +# A unique identifier for the Eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have this +# name. Each documentation set should have its own identifier. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. ECLIPSE_DOC_ID = org.doxygen.Project @@ -1237,7 +1255,7 @@ # typically be disabled. For large projects the javascript based search engine # can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. -SEARCHENGINE = NO +SEARCHENGINE = YES # When the SERVER_BASED_SEARCH tag is enabled the search engine will be # implemented using a web server instead of a web client using Javascript. @@ -1273,10 +1291,11 @@ SEARCHDATA_FILE = searchdata.xml -# When SERVER_BASED_SEARCH AND EXTERNAL_SEARCH are both enabled the +# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the # EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is # useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple # projects and redirect the results back to the right project. +# This tag requires that the tag SEARCHENGINE is set to YES. EXTERNAL_SEARCH_ID = @@ -1290,7 +1309,7 @@ EXTRA_SEARCH_MAPPINGS = #--------------------------------------------------------------------------- -# configuration options related to the LaTeX output +# Configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will @@ -1396,7 +1415,7 @@ LATEX_BIB_STYLE = plain #--------------------------------------------------------------------------- -# configuration options related to the RTF output +# Configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output @@ -1685,7 +1704,7 @@ # this option also works with HAVE_DOT disabled, but it is recommended to # install and use dot, since it yields more powerful graphs. -CLASS_DIAGRAMS = NO +CLASS_DIAGRAMS = YES # You can define message sequence charts within doxygen comments using the \msc # command. Doxygen will then run the mscgen tool (see
--- a/ble/DiscoveredCharacteristic.h Wed Apr 06 18:40:28 2016 +0100 +++ b/ble/DiscoveredCharacteristic.h Wed Apr 06 18:40:30 2016 +0100 @@ -137,13 +137,13 @@ */ ble_error_t write(uint16_t length, const uint8_t *value) const; - /** + /** * Same as above but register the callback wich will be called once the data has been written */ ble_error_t write(uint16_t length, const uint8_t *value, const GattClient::WriteCallback_t& onRead) const; - void setupLongUUID(UUID::LongUUIDBytes_t longUUID) { - uuid.setupLong(longUUID); + void setupLongUUID(UUID::LongUUIDBytes_t longUUID, UUID::ByteOrder_t order = UUID::MSB) { + uuid.setupLong(longUUID, order); } public:
--- a/ble/DiscoveredService.h Wed Apr 06 18:40:28 2016 +0100 +++ b/ble/DiscoveredService.h Wed Apr 06 18:40:30 2016 +0100 @@ -36,8 +36,8 @@ endHandle = endHandleIn; } - void setupLongUUID(UUID::LongUUIDBytes_t longUUID) { - uuid.setupLong(longUUID); + void setupLongUUID(UUID::LongUUIDBytes_t longUUID, UUID::ByteOrder_t order = UUID::MSB) { + uuid.setupLong(longUUID, order); } public:
--- a/ble/Gap.h Wed Apr 06 18:40:28 2016 +0100 +++ b/ble/Gap.h Wed Apr 06 18:40:30 2016 +0100 @@ -183,14 +183,16 @@ } /** - * @return Minimum Advertising interval in milliseconds. + * @return Minimum Advertising interval in milliseconds for connectable + * undirected and connectable directed event types. */ virtual uint16_t getMinAdvertisingInterval(void) const { return 0; /* Requesting action from porter(s): override this API if this capability is supported. */ } /** - * @return Minimum Advertising interval in milliseconds for non-connectible mode. + * @return Minimum Advertising interval in milliseconds for scannable + * undirected and non-connectable undirected event types. */ virtual uint16_t getMinNonConnectableAdvertisingInterval(void) const { return 0; /* Requesting action from porter(s): override this API if this capability is supported. */ @@ -464,11 +466,6 @@ * peripheral faster, at the expense of more power being used by the radio * due to the higher data transmit rate. * - * @note: This API is now *deprecated* and will be dropped in the future. - * You should use the parallel API from Gap directly. A former call to - * ble.setAdvertisingInterval(...) should now be achieved using - * ble.gap().setAdvertisingInterval(...). - * * @Note: [WARNING] This API previously used 0.625ms as the unit for its * 'interval' argument. That required an explicit conversion from * milliseconds using Gap::MSEC_TO_GAP_DURATION_UNITS(). This conversion is
--- a/ble/UUID.h Wed Apr 06 18:40:28 2016 +0100 +++ b/ble/UUID.h Wed Apr 06 18:40:30 2016 +0100 @@ -19,9 +19,27 @@ #include <stdint.h> #include <string.h> +#include <algorithm> #include "blecommon.h" +/** + * A trivial converter for single hexadecimal character to unsigned-int. + * @param c hexadecimal character. + * @return the corresponding value as unsigned int. + */ +static uint8_t char2int(char c) { + if ((c >= '0') && (c <= '9')) { + return c - '0'; + } else if ((c >= 'a') && (c <= 'f')) { + return c - 'a' + 10; + } else if ((c >= 'A') && (c <= 'F')) { + return c - 'A' + 10; + } else { + return 0; + } +} + class UUID { public: enum UUID_Type_t { @@ -29,12 +47,75 @@ UUID_TYPE_LONG = 1 // Full 128-bit UUID. }; + /** + * An enumeration to specify byte ordering of the long version of the UUID. + */ + typedef enum { + MSB, /*!< Most-significant byte first (at the smallest address) */ + LSB /*!< least-significant byte first (at the smallest address) */ + } ByteOrder_t; + typedef uint16_t ShortUUIDBytes_t; static const unsigned LENGTH_OF_LONG_UUID = 16; typedef uint8_t LongUUIDBytes_t[LENGTH_OF_LONG_UUID]; + static const unsigned MAX_UUID_STRING_LENGTH = LENGTH_OF_LONG_UUID * 2 + 4; + public: + + /** + * Creates a new 128-bit UUID. + * + * @note The UUID is a unique 128-bit (16 byte) ID used to identify + * different service or characteristics on the BLE device. + * + * @param stringUUID + * The 128-bit (16-byte) UUID as a human readable const-string. + * Format: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX + * Upper and lower case supported. Hyphens are optional, but only + * upto four of them. The UUID is stored internally as a 16 byte + * array, LSB (little endian), which is opposite from the string. + */ + UUID(const char* stringUUID) : type(UUID_TYPE_LONG), baseUUID(), shortUUID(0) { + bool nibble = false; + uint8_t byte = 0; + size_t baseIndex = 0; + uint8_t tempUUID[LENGTH_OF_LONG_UUID]; + + // Iterate through string, abort if NULL is encountered prematurely. + // Ignore upto four hyphens. + for (size_t index = 0; (index < MAX_UUID_STRING_LENGTH) && (baseIndex < LENGTH_OF_LONG_UUID); index++) { + if (stringUUID[index] == '\0') { + // error abort + break; + } else if (stringUUID[index] == '-') { + // ignore hyphen + continue; + } else if (nibble) { + // got second nibble + byte |= char2int(stringUUID[index]); + nibble = false; + + // store copy + tempUUID[baseIndex++] = byte; + } else { + // got first nibble + byte = char2int(stringUUID[index]) << 4; + nibble = true; + } + } + + // populate internal variables if string was successfully parsed + if (baseIndex == LENGTH_OF_LONG_UUID) { + setupLong(tempUUID, UUID::MSB); + } else { + const uint8_t sig[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, + 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB }; + setupLong(sig, UUID::MSB); + } + } + /** * Creates a new 128-bit UUID. * @@ -42,10 +123,12 @@ * different service or characteristics on the BLE device. * * @param longUUID - * The 128-bit (16-byte) UUID value, MSB first (big-endian). + * The 128-bit (16-byte) UUID value. + * @param order + * The bit order of the UUID, MSB by default. */ - UUID(const LongUUIDBytes_t longUUID) : type(UUID_TYPE_LONG), baseUUID(), shortUUID(0) { - setupLong(longUUID); + UUID(const LongUUIDBytes_t longUUID, ByteOrder_t order = UUID::MSB) : type(UUID_TYPE_LONG), baseUUID(), shortUUID(0) { + setupLong(longUUID, order); } /** @@ -91,10 +174,15 @@ /** * Fill in a 128-bit UUID; this is useful when the UUID isn't known at the time of the object construction. */ - void setupLong(const LongUUIDBytes_t longUUID) { + void setupLong(const LongUUIDBytes_t longUUID, ByteOrder_t order = UUID::MSB) { type = UUID_TYPE_LONG; - memcpy(baseUUID, longUUID, LENGTH_OF_LONG_UUID); - shortUUID = (uint16_t)((longUUID[2] << 8) | (longUUID[3])); + if (order == UUID::MSB) { + // Switch endian. Input is big-endian, internal representation is little endian. + std::reverse_copy(longUUID, longUUID + LENGTH_OF_LONG_UUID, baseUUID); + } else { + std::copy(longUUID, longUUID + LENGTH_OF_LONG_UUID, baseUUID); + } + shortUUID = (uint16_t)((baseUUID[13] << 8) | (baseUUID[12])); } public: @@ -132,12 +220,8 @@ private: UUID_Type_t type; // UUID_TYPE_SHORT or UUID_TYPE_LONG - LongUUIDBytes_t baseUUID; /* The base of the long UUID (if - * used). Note: bytes 12 and 13 (counting from LSB) - * are zeroed out to allow comparison with other long - * UUIDs, which differ only in the 16-bit relative - * part.*/ - ShortUUIDBytes_t shortUUID; // 16 bit UUID (byte 2-3 using with base). + LongUUIDBytes_t baseUUID; // The long UUID + ShortUUIDBytes_t shortUUID; // 16 bit UUID }; #endif // ifndef __UUID_H__ \ No newline at end of file
--- a/ble/services/EnvironmentalService.h Wed Apr 06 18:40:28 2016 +0100 +++ b/ble/services/EnvironmentalService.h Wed Apr 06 18:40:30 2016 +0100 @@ -21,10 +21,10 @@ /** * @class EnvironmentalService -* @brief BLE Environmental Service. This service provides the location of the thermometer and the temperature. <br> -* Service: https://developer.bluetooth.org/gatt/services/Pages/ServiceViewer.aspx?u=org.bluetooth.service.environmental_sensing.xml <br> -* Temperature: https://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.temperature.xml <br> -* Humidity: https://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.humidity.xml <br> +* @brief BLE Environmental Service. This service provides temperature, humidity and pressure measurement. +* Service: https://developer.bluetooth.org/gatt/services/Pages/ServiceViewer.aspx?u=org.bluetooth.service.environmental_sensing.xml +* Temperature: https://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.temperature.xml +* Humidity: https://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.humidity.xml * Pressure: https://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.pressure.xml */ class EnvironmentalService {
--- a/ble/services/HealthThermometerService.h Wed Apr 06 18:40:28 2016 +0100 +++ b/ble/services/HealthThermometerService.h Wed Apr 06 18:40:30 2016 +0100 @@ -21,34 +21,34 @@ /** * @class HealthThermometerService -* @brief BLE Health Thermometer Service. This service provides the location of the thermometer and the temperature. <br> -* Service: https://developer.bluetooth.org/gatt/profiles/Pages/ProfileViewer.aspx?u=org.bluetooth.profile.health_thermometer.xml <br> -* Temperature Measurement: https://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.temperature_measurement.xml <br> +* @brief BLE Health Thermometer Service. This service provides the location of the thermometer and the temperature. +* Service: https://developer.bluetooth.org/gatt/profiles/Pages/ProfileViewer.aspx?u=org.bluetooth.profile.health_thermometer.xml +* Temperature Measurement: https://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.temperature_measurement.xml * Temperature Type: https://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.temperature_type.xml */ class HealthThermometerService { public: /** - * @enum Sensor Location - * @brief Location of sensor on the body + * @enum Sensor Location. + * @brief Location of sensor on the body. */ enum SensorLocation_t { - LOCATION_ARMPIT = 1, /*!< armpit */ - LOCATION_BODY, /*!< body */ - LOCATION_EAR, /*!< ear */ - LOCATION_FINGER, /*!< finger */ + LOCATION_ARMPIT = 1, /*!< Armpit. */ + LOCATION_BODY, /*!< Body. */ + LOCATION_EAR, /*!< Ear. */ + LOCATION_FINGER, /*!< Finger. */ LOCATION_GI_TRACT, /*!< GI tract */ - LOCATION_MOUTH, /*!< mouth */ - LOCATION_RECTUM, /*!< rectum */ - LOCATION_TOE, /*!< toe */ - LOCATION_EAR_DRUM, /*!< ear drum */ + LOCATION_MOUTH, /*!< Mouth. */ + LOCATION_RECTUM, /*!< Rectum. */ + LOCATION_TOE, /*!< Toe. */ + LOCATION_EAR_DRUM, /*!< Eardrum. */ }; public: /** - * @brief Add the Health Thermometer Service to an existing ble object, initialize with temperature and location. - * @param[ref] _ble reference to the BLE device - * @param[in] initialTemp initial value in celsius + * @brief Add the Health Thermometer Service to an existing BLE object, initialize with temperature and location. + * @param[ref] _ble Reference to the BLE device. + * @param[in] initialTemp Initial value in celsius. * @param[in] _location */ HealthThermometerService(BLE &_ble, float initialTemp, uint8_t _location) : @@ -64,10 +64,10 @@ } /** - * @brief Update the temperature being broadcast + * @brief Update the temperature being broadcast. * * @param[in] temperature - * Floating point value of the temperature + * Floating point value of the temperature. * */ void updateTemperature(float temperature) { @@ -80,14 +80,14 @@ /** * @brief Update the location. * @param loc - * new location value. + * New location value. */ void updateLocation(SensorLocation_t loc) { ble.gattServer().write(tempLocation.getValueHandle(), reinterpret_cast<uint8_t *>(&loc), sizeof(uint8_t)); } private: - /* Private internal representation for the bytes used to work with the vaulue of the heart-rate characteristic. */ + /* Private internal representation for the bytes used to work with the vaulue of the temperature characteristic. */ struct TemperatureValueBytes { static const unsigned OFFSET_OF_FLAGS = 0; static const unsigned OFFSET_OF_VALUE = OFFSET_OF_FLAGS + sizeof(uint8_t); @@ -101,7 +101,7 @@ static const uint8_t TEMPERATURE_UNITS_FAHRENHEIT = 1; TemperatureValueBytes(float initialTemperature) : bytes() { - /* assumption: temperature values are expressed in Celsius */ + /* Assumption: temperature values are expressed in celsius */ bytes[OFFSET_OF_FLAGS] = (TEMPERATURE_UNITS_CELSIUS << TEMPERATURE_UNITS_FLAG_POS) | (false << TIMESTAMP_FLAG_POS) | (false << TEMPERATURE_TYPE_FLAG_POS); @@ -128,15 +128,15 @@ * @return The temperature in 11073-20601 FLOAT-Type format. */ uint32_t quick_ieee11073_from_float(float temperature) { - uint8_t exponent = 0xFE; //exponent is -2 + uint8_t exponent = 0xFE; //Exponent is -2 uint32_t mantissa = (uint32_t)(temperature * 100); return (((uint32_t)exponent) << 24) | mantissa; } private: - /* First byte = 8-bit flags, Second field is a float holding the temperature value. */ - /* See --> https://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.temperature_measurement.xml */ + /* First byte: 8-bit flags. Second field is a float holding the temperature value. */ + /* See https://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.temperature_measurement.xml */ uint8_t bytes[SIZEOF_VALUE_BYTES]; };
--- a/ble/services/HeartRateService.h Wed Apr 06 18:40:28 2016 +0100 +++ b/ble/services/HeartRateService.h Wed Apr 06 18:40:30 2016 +0100 @@ -21,35 +21,35 @@ /** * @class HeartRateService -* @brief BLE Service for HeartRate. This BLE Service contains the location of the sensor, the heartrate in beats per minute. <br> -* Service: https://developer.bluetooth.org/gatt/services/Pages/ServiceViewer.aspx?u=org.bluetooth.service.heart_rate.xml <br> -* HRM Char: https://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.heart_rate_measurement.xml <br> +* @brief BLE Service for HeartRate. This BLE Service contains the location of the sensor and the heart rate in beats per minute. +* Service: https://developer.bluetooth.org/gatt/services/Pages/ServiceViewer.aspx?u=org.bluetooth.service.heart_rate.xml +* HRM Char: https://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.heart_rate_measurement.xml * Location: https://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.body_sensor_location.xml */ class HeartRateService { public: /** * @enum SensorLocation - * @brief Location of HeartRate sensor on body. + * @brief Location of the heart rate sensor on body. */ enum { - LOCATION_OTHER = 0, /*!< Other Location */ - LOCATION_CHEST, /*!< Chest */ - LOCATION_WRIST, /*!< Wrist */ - LOCATION_FINGER, /*!< Finger */ - LOCATION_HAND, /*!< Hand */ - LOCATION_EAR_LOBE, /*!< Earlobe */ - LOCATION_FOOT, /*!< Foot */ + LOCATION_OTHER = 0, /*!< Other location. */ + LOCATION_CHEST, /*!< Chest. */ + LOCATION_WRIST, /*!< Wrist. */ + LOCATION_FINGER, /*!< Finger. */ + LOCATION_HAND, /*!< Hand. */ + LOCATION_EAR_LOBE, /*!< Earlobe. */ + LOCATION_FOOT, /*!< Foot. */ }; public: /** - * @brief Constructor with 8bit HRM Counter value. + * @brief Constructor with 8-bit HRM Counter value. * * @param[ref] _ble * Reference to the underlying BLE. * @param[in] hrmCounter (8-bit) - * initial value for the hrm counter. + * Initial value for the HRM counter. * @param[in] location * Sensor's location. */ @@ -70,7 +70,7 @@ * @param[in] _ble * Reference to the underlying BLE. * @param[in] hrmCounter (8-bit) - * initial value for the hrm counter. + * Initial value for the HRM counter. * @param[in] location * Sensor's location. */ @@ -86,10 +86,10 @@ } /** - * @brief Set a new 8-bit value for heart rate. + * @brief Set a new 8-bit value for the heart rate. * * @param[in] hrmCounter - * HeartRate in bpm. + * Heart rate in BPM. */ void updateHeartRate(uint8_t hrmCounter) { valueBytes.updateHeartRate(hrmCounter); @@ -97,10 +97,10 @@ } /** - * Set a new 16-bit value for heart rate. + * Set a new 16-bit value for the heart rate. * * @param[in] hrmCounter - * HeartRate in bpm. + * Heart rate in BPM. */ void updateHeartRate(uint16_t hrmCounter) { valueBytes.updateHeartRate(hrmCounter); @@ -108,8 +108,8 @@ } /** - * This callback allows the HeartRateService to receive updates to the - * controlPoint Characteristic. + * This callback allows the heart rate service to receive updates to the + * controlPoint characteristic. * * @param[in] params * Information about the characterisitc being updated. @@ -118,7 +118,7 @@ if (params->handle == controlPoint.getValueAttribute().getHandle()) { /* Do something here if the new value is 1; else you can override this method by * extending this class. - * @NOTE: if you are extending this class, be sure to also call + * @NOTE: If you are extending this class, be sure to also call * ble.onDataWritten(this, &ExtendedHRService::onDataWritten); in * your constructor. */ @@ -135,9 +135,9 @@ } protected: - /* Private internal representation for the bytes used to work with the vaulue of the heart-rate characteristic. */ + /* Private internal representation for the bytes used to work with the value of the heart rate characteristic. */ struct HeartRateValueBytes { - static const unsigned MAX_VALUE_BYTES = 3; /* FLAGS + up to two bytes for heart-rate */ + static const unsigned MAX_VALUE_BYTES = 3; /* Flags, and up to two bytes for heart rate. */ static const unsigned FLAGS_BYTE_INDEX = 0; static const unsigned VALUE_FORMAT_BITNUM = 0; @@ -175,8 +175,8 @@ } private: - /* First byte = 8-bit values, no extra info, Second byte = uint8_t HRM value */ - /* See --> https://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.heart_rate_measurement.xml */ + /* First byte: 8-bit values, no extra info. Second byte: uint8_t HRM value */ + /* See https://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.heart_rate_measurement.xml */ uint8_t valueBytes[MAX_VALUE_BYTES]; };
--- a/module.json Wed Apr 06 18:40:28 2016 +0100 +++ b/module.json Wed Apr 06 18:40:30 2016 +0100 @@ -1,6 +1,6 @@ { "name": "ble", - "version": "2.1.7", + "version": "2.1.11", "description": "The BLE module offers a high level abstraction for using Bluetooth Low Energy on multiple platforms.", "keywords": [ "Bluetooth",