Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of BLE_API by
Revision 1131:692ddf04fc42, committed 2016-04-06
- Comitter:
- vcoubard
- Date:
- Wed Apr 06 19:13:46 2016 +0100
- Parent:
- 1130:ff83f0020480
- Child:
- 1132:6362b7c2fdff
- Commit message:
- Synchronized with git rev 13bf70b6
Author: Rohit Grover
Release 2.1.5
=============
A minor release to separate the concept of minlen and len in
GattCharacteristic. Also contains some improvements to documentation.
Changed in this revision
--- a/DOXYGEN_FRONTPAGE.md Tue Jan 12 19:47:52 2016 +0000
+++ b/DOXYGEN_FRONTPAGE.md Wed Apr 06 19:13:46 2016 +0100
@@ -1,30 +1,31 @@
-# BLE API {#mainpage}
-
-The BLE module within mbed OS offers a high abstraction level for using
-Bluetooth Low Energy on multiple platforms.
-
-This documentation describes the internal structure of the mbed
-[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/).
-
-For mbed OS examples using BLE, check [this
-repository](https://github.com/armmbed/ble-examples). For mbed-classic
-examples, please refer to [code under mbed.org](https://developer.mbed.org/teams/Bluetooth-Low-Energy/code/).
-
-## Supported Services
-
-Currently supported reference services include:
-
-* [Battery](@ref BatteryService)
-* [Device Firmware Update (DFU)](@ref DFUService)
-* [Device Information](@ref DeviceInformationService)
-* [Health Thermometer](@ref HealthThermometerService)
-* [Heart Rate](@ref HeartRateService)
-* [UART](@ref UARTService)
-* [UriBeacon](@ref URIBeaconConfigService)
-* [iBeacon](@ref iBeacon)
-
-The [documentation](https://docs.mbed.com/docs/ble-intros/en/latest/AdvSamples/Overview/)
+# BLE API {#mainpage}
+
+The BLE module within mbed OS offers a high abstraction level for using
+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).
+
+For getting started with BLE on mbed, check our [introduction
+page](https://docs.mbed.com/docs/ble-intros/en/latest/).
+
+For mbed OS examples using BLE, check [this
+repository](https://github.com/armmbed/ble-examples). For mbed-classic
+examples, please refer to [code under mbed.org](https://developer.mbed.org/teams/Bluetooth-Low-Energy/code/).
+
+## Supported Services
+
+Currently supported reference services include:
+
+* [Battery](@ref BatteryService)
+* [Device Firmware Update (DFU)](@ref DFUService)
+* [Device Information](@ref DeviceInformationService)
+* [Health Thermometer](@ref HealthThermometerService)
+* [Heart Rate](@ref HeartRateService)
+* [UART](@ref UARTService)
+* [UriBeacon](@ref URIBeaconConfigService)
+* [iBeacon](@ref iBeacon)
+
+The [documentation](https://docs.mbed.com/docs/ble-intros/en/latest/AdvSamples/Overview/)
contains an overview on how to create new, application-specific services.
\ No newline at end of file
--- a/ble.doxyfile Tue Jan 12 19:47:52 2016 +0000
+++ b/ble.doxyfile Wed Apr 06 19:13:46 2016 +0100
@@ -1,1919 +1,1900 @@
-# Doxyfile 1.8.4
-
-# This file describes the settings to be used by the documentation system
-# doxygen (www.doxygen.org) for a project.
-#
-# All text after a double hash (##) is considered a comment and is placed
-# in front of the TAG it is preceding .
-# All text after a hash (#) is considered a comment and will be ignored.
-# The format is:
-# TAG = value [value, ...]
-# For lists items can also be appended using:
-# TAG += value [value, ...]
-# Values that contain spaces should be placed between quotes (" ").
-
-#---------------------------------------------------------------------------
-# Project related configuration options
-#---------------------------------------------------------------------------
-
-# This tag specifies the encoding used for all characters in the config file
-# that follow. The default is UTF-8 which is also the encoding used for all
-# text before the first occurrence of this tag. Doxygen uses libiconv (or the
-# iconv built into libc) for the transcoding. See
-# http://www.gnu.org/software/libiconv for the list of possible encodings.
-
-DOXYFILE_ENCODING = UTF-8
-
-# The PROJECT_NAME tag is a single word (or sequence of words) that should
-# identify the project. Note that if you do not use Doxywizard you need
-# to put quotes around the project name if it contains spaces.
-
-PROJECT_NAME = "BLE API"
-
-# The PROJECT_NUMBER tag can be used to enter a project or revision number.
-# This could be handy for archiving the generated documentation or
-# if some version control system is used.
-
-PROJECT_NUMBER = v2
-
-# Using the PROJECT_BRIEF tag one can provide an optional one line description
-# for a project that appears at the top of each page and should give viewer
-# a quick idea about the purpose of the project. Keep the description short.
-
-PROJECT_BRIEF = "An abstraction for using Bluetooth Low Energy."
-
-# With the PROJECT_LOGO tag one can specify an logo or icon that is
-# included in the documentation. The maximum height of the logo should not
-# exceed 55 pixels and the maximum width should not exceed 200 pixels.
-# Doxygen will copy the logo to the output directory.
-
-PROJECT_LOGO =
-
-# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
-# base path where the generated documentation will be put.
-# If a relative path is entered, it will be relative to the location
-# where doxygen was started. If left blank the current directory will be used.
-
-OUTPUT_DIRECTORY = apidoc/
-
-# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create
-# 4096 sub-directories (in 2 levels) under the output directory of each output
-# format and will distribute the generated files over these directories.
-# Enabling this option can be useful when feeding doxygen a huge amount of
-# source files, where putting all generated files in the same directory would
-# otherwise cause performance problems for the file system.
-
-CREATE_SUBDIRS = NO
-
-# The OUTPUT_LANGUAGE tag is used to specify the language in which all
-# documentation generated by doxygen is written. Doxygen will use this
-# information to generate all constant output in the proper language.
-# The default language is English, other supported languages are:
-# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional,
-# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German,
-# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English
-# messages), Korean, Korean-en, Latvian, Lithuanian, Norwegian, Macedonian,
-# Persian, Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic,
-# Slovak, Slovene, Spanish, Swedish, Ukrainian, and Vietnamese.
-
-OUTPUT_LANGUAGE = English
-
-# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
-# include brief member descriptions after the members that are listed in
-# the file and class documentation (similar to JavaDoc).
-# Set to NO to disable this.
-
-BRIEF_MEMBER_DESC = YES
-
-# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
-# the brief description of a member or function before the detailed description.
-# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
-# brief descriptions will be completely suppressed.
-
-REPEAT_BRIEF = YES
-
-# This tag implements a quasi-intelligent brief description abbreviator
-# that is used to form the text in various listings. Each string
-# in this list, if found as the leading text of the brief description, will be
-# stripped from the text and the result after processing the whole list, is
-# used as the annotated text. Otherwise, the brief description is used as-is.
-# If left blank, the following values are used ("$name" is automatically
-# replaced with the name of the entity): "The $name class" "The $name widget"
-# "The $name file" "is" "provides" "specifies" "contains"
-# "represents" "a" "an" "the"
-
-ABBREVIATE_BRIEF = "The $name class" \
- "The $name widget" \
- "The $name file" \
- is \
- provides \
- specifies \
- contains \
- represents \
- a \
- an \
- the
-
-# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
-# Doxygen will generate a detailed section even if there is only a brief
-# description.
-
-ALWAYS_DETAILED_SEC = NO
-
-# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
-# inherited members of a class in the documentation of that class as if those
-# members were ordinary class members. Constructors, destructors and assignment
-# operators of the base classes will not be shown.
-
-INLINE_INHERITED_MEMB = NO
-
-# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
-# 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 = 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
-# only done if one of the specified strings matches the left-hand part of
-# the path. The tag can be used to show relative paths in the file list.
-# If left blank the directory from which doxygen is run is used as the
-# path to strip. Note that you specify absolute paths here, but also
-# relative paths, which will be relative from the directory where doxygen is
-# started.
-
-STRIP_FROM_PATH =
-
-# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of
-# the path mentioned in the documentation of a class, which tells
-# the reader which header file to include in order to use a class.
-# If left blank only the name of the header file containing the class
-# definition is used. Otherwise one should specify the include paths that
-# are normally passed to the compiler using the -I flag.
-
-STRIP_FROM_INC_PATH =
-
-# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
-# (but less readable) file names. This can be useful if your file system
-# doesn't support long names like on DOS, Mac, or CD-ROM.
-
-SHORT_NAMES = NO
-
-# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
-# will interpret the first line (until the first dot) of a JavaDoc-style
-# comment as the brief description. If set to NO, the JavaDoc
-# comments will behave just like regular Qt-style comments
-# (thus requiring an explicit @brief command for a brief description.)
-
-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
-# comment as the brief description. If set to NO, the comments
-# will behave just like regular Qt-style comments (thus requiring
-# an explicit \brief command for a brief description.)
-
-QT_AUTOBRIEF = NO
-
-# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen
-# treat a multi-line C++ special comment block (i.e. a block of //! or ///
-# comments) as a brief description. This used to be the default behaviour.
-# The new default is to treat a multi-line C++ comment block as a detailed
-# description. Set this tag to YES if you prefer the old behaviour instead.
-
-MULTILINE_CPP_IS_BRIEF = NO
-
-# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
-# member inherits the documentation from any documented member that it
-# re-implements.
-
-INHERIT_DOCS = YES
-
-# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce
-# a new page for each member. If set to NO, the documentation of a member will
-# be part of the file/class/namespace that contains it.
-
-SEPARATE_MEMBER_PAGES = NO
-
-# The TAB_SIZE tag can be used to set the number of spaces in a tab.
-# Doxygen uses this value to replace tabs by spaces in code fragments.
-
-TAB_SIZE = 4
-
-# This tag can be used to specify a number of aliases that acts
-# as commands in the documentation. An alias has the form "name=value".
-# For example adding "sideeffect=\par Side Effects:\n" will allow you to
-# put the command \sideeffect (or @sideeffect) in the documentation, which
-# will result in a user-defined paragraph with heading "Side Effects:".
-# You can put \n's in the value part of an alias to insert newlines.
-
-ALIASES =
-
-# This tag can be used to specify a number of word-keyword mappings (TCL only).
-# A mapping has the form "name=value". For example adding
-# "class=itcl::class" will allow you to use the command class in the
-# itcl::class meaning.
-
-TCL_SUBST =
-
-# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C
-# sources only. Doxygen will then generate output that is more tailored for C.
-# For instance, some of the names that are used will be different. The list
-# of all members will be omitted, etc.
-
-OPTIMIZE_OUTPUT_FOR_C = NO
-
-# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java
-# sources only. Doxygen will then generate output that is more tailored for
-# Java. For instance, namespaces will be presented as packages, qualified
-# scopes will look different, etc.
-
-OPTIMIZE_OUTPUT_JAVA = NO
-
-# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
-# sources only. Doxygen will then generate output that is more tailored for
-# Fortran.
-
-OPTIMIZE_FOR_FORTRAN = NO
-
-# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
-# sources. Doxygen will then generate output that is tailored for
-# VHDL.
-
-OPTIMIZE_OUTPUT_VHDL = NO
-
-# 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,
-# 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
-# documentation. See http://daringfireball.net/projects/markdown/ for details.
-# The output of markdown processing is further processed by doxygen, so you
-# can mix doxygen, HTML, and XML commands with Markdown formatting.
-# Disable only in case of backward compatibilities issues.
-
-MARKDOWN_SUPPORT = YES
-
-# When enabled doxygen tries to link words that correspond to documented
-# classes, or namespaces to their corresponding documentation. Such a link can
-# be prevented in individual cases by by putting a % sign in front of the word
-# or globally by setting AUTOLINK_SUPPORT to NO.
-
-AUTOLINK_SUPPORT = YES
-
-# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
-# to include (a tag file for) the STL sources as input, then you should
-# set this tag to YES in order to let doxygen match functions declarations and
-# definitions whose arguments contain STL classes (e.g. func(std::string); v.s.
-# func(std::string) {}). This also makes the inheritance and collaboration
-# diagrams that involve STL classes more complete and accurate.
-
-BUILTIN_STL_SUPPORT = NO
-
-# If you use Microsoft's C++/CLI language, you should set this option to YES to
-# enable parsing support.
-
-CPP_CLI_SUPPORT = NO
-
-# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only.
-# Doxygen will parse them like normal C++ but will assume all classes use public
-# instead of private inheritance when no explicit protection keyword is present.
-
-SIP_SUPPORT = NO
-
-# For Microsoft's IDL there are propget and propput attributes to indicate
-# getter and setter methods for a property. Setting this option to YES (the
-# default) will make doxygen replace the get and set methods by a property in
-# the documentation. This will only work if the methods are indeed getting or
-# setting a simple type. If this is not the case, or you want to show the
-# methods anyway, you should set this option to NO.
-
-IDL_PROPERTY_SUPPORT = YES
-
-# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
-# tag is set to YES, then doxygen will reuse the documentation of the first
-# member in the group (if any) for the other members of the group. By default
-# all members of a group must be documented explicitly.
-
-DISTRIBUTE_GROUP_DOC = NO
-
-# Set the SUBGROUPING tag to YES (the default) to allow class member groups of
-# the same type (for instance a group of public functions) to be put as a
-# subgroup of that type (e.g. under the Public Functions section). Set it to
-# NO to prevent subgrouping. Alternatively, this can be done per class using
-# the \nosubgrouping command.
-
-SUBGROUPING = YES
-
-# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and
-# unions are shown inside the group in which they are included (e.g. using
-# @ingroup) instead of on a separate page (for HTML and Man pages) or
-# section (for LaTeX and RTF).
-
-INLINE_GROUPED_CLASSES = NO
-
-# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and
-# unions with only public data fields or simple typedef fields will be shown
-# inline in the documentation of the scope in which they are defined (i.e. file,
-# namespace, or group documentation), provided this scope is documented. If set
-# to NO (the default), structs, classes, and unions are shown on a separate
-# page (for HTML and Man pages) or section (for LaTeX and RTF).
-
-INLINE_SIMPLE_STRUCTS = YES
-
-# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum
-# is documented as struct, union, or enum with the name of the typedef. So
-# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
-# with name TypeT. When disabled the typedef will appear as a member of a file,
-# namespace, or class. And the struct will be named TypeS. This can typically
-# be useful for C code in case the coding convention dictates that all compound
-# types are typedef'ed and only the typedef is referenced, never the tag name.
-
-TYPEDEF_HIDES_STRUCT = NO
-
-# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This
-# cache is used to resolve symbols given their name and scope. Since this can
-# be an expensive process and often the same symbol appear multiple times in
-# the code, doxygen keeps a cache of pre-resolved symbols. If the cache is too
-# small doxygen will become slower. If the cache is too large, memory is wasted.
-# The cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid
-# range is 0..9, the default is 0, corresponding to a cache size of 2^16 = 65536
-# symbols.
-
-LOOKUP_CACHE_SIZE = 0
-
-#---------------------------------------------------------------------------
-# Build related configuration options
-#---------------------------------------------------------------------------
-
-# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
-# documentation are documented, even if no documentation was available.
-# Private class members and static file members will be hidden unless
-# the EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to 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 = NO
-
-# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal
-# scope will be included in the documentation.
-
-EXTRACT_PACKAGE = NO
-
-# If the EXTRACT_STATIC tag is set to YES all static members of a file
-# will be included in the documentation.
-
-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.
-# If set to NO only classes defined in header files are included.
-
-EXTRACT_LOCAL_CLASSES = YES
-
-# This flag is only useful for Objective-C code. When set to YES local
-# methods, which are defined in the implementation section but not in
-# the interface are included in the documentation.
-# If set to NO (the default) only methods in the interface are included.
-
-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
-# 'anonymous_namespace{file}', where file will be replaced with the base
-# name of the file that contains the anonymous namespace. By default
-# anonymous namespaces are hidden.
-
-EXTRACT_ANON_NSPACES = YES
-
-# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
-# undocumented members of documented classes, files or namespaces.
-# If set to NO (the default) these members will be included in the
-# various overviews, but no documentation section is generated.
-# This option has no effect if EXTRACT_ALL is enabled.
-
-HIDE_UNDOC_MEMBERS = NO
-
-# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
-# undocumented classes that are normally visible in the class hierarchy.
-# If set to NO (the default) these classes will be included in the various
-# overviews. This option has no effect if EXTRACT_ALL is enabled.
-
-HIDE_UNDOC_CLASSES = NO
-
-# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all
-# friend (class|struct|union) declarations.
-# If set to NO (the default) these declarations will be included in the
-# documentation.
-
-HIDE_FRIEND_COMPOUNDS = NO
-
-# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any
-# documentation blocks found inside the body of a function.
-# If set to NO (the default) these blocks will be appended to the
-# function's detailed documentation block.
-
-HIDE_IN_BODY_DOCS = NO
-
-# The INTERNAL_DOCS tag determines if documentation
-# that is typed after a \internal command is included. If the tag is set
-# to NO (the default) then the documentation will be excluded.
-# Set it to YES to include the internal documentation.
-
-INTERNAL_DOCS = NO
-
-# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
-# file names in lower-case letters. If set to YES upper-case letters are also
-# allowed. This is useful if you have classes or files whose names only differ
-# in case and if your file system supports case sensitive file names. Windows
-# and Mac users are advised to set this option to NO.
-
-CASE_SENSE_NAMES = NO
-
-# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
-# will show members with their full class and namespace scopes in the
-# documentation. If set to YES the scope will be hidden.
-
-HIDE_SCOPE_NAMES = NO
-
-# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
-# will put a list of the files that are included by a file in the documentation
-# of that file.
-
-SHOW_INCLUDE_FILES = YES
-
-# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen
-# will list include files with double quotes in the documentation
-# rather than with sharp brackets.
-
-FORCE_LOCAL_INCLUDES = NO
-
-# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
-# is inserted in the documentation for inline members.
-
-INLINE_INFO = YES
-
-# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
-# will sort the (detailed) documentation of file and class members
-# alphabetically by member name. If set to NO the members will appear in
-# declaration order.
-
-SORT_MEMBER_DOCS = YES
-
-# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the
-# brief documentation of file, namespace and class members alphabetically
-# by member name. If set to NO (the default) the members will appear in
-# declaration order.
-
-SORT_BRIEF_DOCS = NO
-
-# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen
-# will sort the (brief and detailed) documentation of class members so that
-# constructors and destructors are listed first. If set to NO (the default)
-# the constructors will appear in the respective orders defined by
-# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS.
-# 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 = 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)
-# the group names will appear in their defined order.
-
-SORT_GROUP_NAMES = NO
-
-# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be
-# sorted by fully-qualified names, including namespaces. If set to
-# NO (the default), the class list will be sorted only by class name,
-# not including the namespace part.
-# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
-# Note: This option applies only to the class list, not to the
-# alphabetical list.
-
-SORT_BY_SCOPE_NAME = NO
-
-# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to
-# do proper type resolution of all parameters of a function it will reject a
-# match between the prototype and the implementation of a member function even
-# if there is only one candidate or it is obvious which candidate to choose
-# by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen
-# will still accept a match between prototype and implementation in such cases.
-
-STRICT_PROTO_MATCHING = NO
-
-# The GENERATE_TODOLIST tag can be used to enable (YES) or
-# disable (NO) the todo list. This list is created by putting \todo
-# commands in the documentation.
-
-GENERATE_TODOLIST = YES
-
-# The GENERATE_TESTLIST tag can be used to enable (YES) or
-# disable (NO) the test list. This list is created by putting \test
-# commands in the documentation.
-
-GENERATE_TESTLIST = YES
-
-# The GENERATE_BUGLIST tag can be used to enable (YES) or
-# disable (NO) the bug list. This list is created by putting \bug
-# commands in the documentation.
-
-GENERATE_BUGLIST = YES
-
-# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or
-# disable (NO) the deprecated list. This list is created by putting
-# \deprecated commands in the documentation.
-
-GENERATE_DEPRECATEDLIST= YES
-
-# The ENABLED_SECTIONS tag can be used to enable conditional
-# documentation sections, marked by \if section-label ... \endif
-# and \cond section-label ... \endcond blocks.
-
-ENABLED_SECTIONS =
-
-# The MAX_INITIALIZER_LINES tag determines the maximum number of lines
-# the initial value of a variable or macro consists of for it to appear in
-# the documentation. If the initializer consists of more lines than specified
-# here it will be hidden. Use a value of 0 to hide initializers completely.
-# The appearance of the initializer of individual variables and macros in the
-# documentation can be controlled using \showinitializer or \hideinitializer
-# command in the documentation regardless of this setting.
-
-MAX_INITIALIZER_LINES = 30
-
-# Set the SHOW_USED_FILES tag to NO to disable the list of files generated
-# at the bottom of the documentation of classes and structs. If set to YES the
-# list will mention the files that were used to generate the documentation.
-
-SHOW_USED_FILES = YES
-
-# Set the SHOW_FILES tag to NO to disable the generation of the Files page.
-# This will remove the Files entry from the Quick Index and from the
-# Folder Tree View (if specified). The default is YES.
-
-SHOW_FILES = YES
-
-# Set the SHOW_NAMESPACES tag to NO to disable the generation of the
-# Namespaces page.
-# This will remove the Namespaces entry from the Quick Index
-# and from the Folder Tree View (if specified). The default is YES.
-
-SHOW_NAMESPACES = YES
-
-# The FILE_VERSION_FILTER tag can be used to specify a program or script that
-# doxygen should invoke to get the current version for each file (typically from
-# the version control system). Doxygen will invoke the program by executing (via
-# popen()) the command <command> <input-file>, where <command> is the value of
-# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file
-# provided by doxygen. Whatever the program writes to standard output
-# is used as the file version. See the manual for examples.
-
-FILE_VERSION_FILTER =
-
-# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
-# by doxygen. The layout file controls the global structure of the generated
-# output files in an output format independent way. To create the layout file
-# that represents doxygen's defaults, run doxygen with the -l option.
-# You can optionally specify a file name after the option, if omitted
-# DoxygenLayout.xml will be used as the name of the layout file.
-
-LAYOUT_FILE =
-
-# The CITE_BIB_FILES tag can be used to specify one or more bib files
-# containing the references data. This must be a list of .bib files. The
-# .bib extension is automatically appended if omitted. Using this command
-# requires the bibtex tool to be installed. See also
-# http://en.wikipedia.org/wiki/BibTeX for more info. For LaTeX the style
-# of the bibliography can be controlled using LATEX_BIB_STYLE. To use this
-# feature you need bibtex and perl available in the search path. Do not use
-# file names with spaces, bibtex cannot handle them.
-
-CITE_BIB_FILES =
-
-#---------------------------------------------------------------------------
-# configuration options related to warning and progress messages
-#---------------------------------------------------------------------------
-
-# The QUIET tag can be used to turn on/off the messages that are generated
-# by doxygen. Possible values are YES and NO. If left blank NO is used.
-
-QUIET = NO
-
-# The WARNINGS tag can be used to turn on/off the warning messages that are
-# generated by doxygen. Possible values are YES and NO. If left blank
-# NO is used.
-
-WARNINGS = YES
-
-# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
-# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
-# automatically be disabled.
-
-WARN_IF_UNDOCUMENTED = YES
-
-# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for
-# potential errors in the documentation, such as not documenting some
-# parameters in a documented function, or documenting parameters that
-# don't exist or using markup commands wrongly.
-
-WARN_IF_DOC_ERROR = YES
-
-# The WARN_NO_PARAMDOC option can be enabled to get warnings for
-# functions that are documented, but have no documentation for their parameters
-# or return value. If set to NO (the default) doxygen will only warn about
-# wrong or incomplete parameter documentation, but not about the absence of
-# documentation.
-
-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
-# tags, which will be replaced by the file and line number from which the
-# warning originated and the warning text. Optionally the format may contain
-# $version, which will be replaced by the version of the file (if it could
-# be obtained via FILE_VERSION_FILTER)
-
-WARN_FORMAT = "$file:$line: $text"
-
-# The WARN_LOGFILE tag can be used to specify a file to which warning
-# and error messages should be written. If left blank the output is written
-# to stderr.
-
-WARN_LOGFILE = doxygen_warn.log
-
-#---------------------------------------------------------------------------
-# Configuration options related to the input files
-#---------------------------------------------------------------------------
-
-# The INPUT tag can be used to specify the files and/or directories that contain
-# documented source files. You may enter file names like "myfile.cpp" or
-# directories like "/usr/src/myproject". Separate the files or directories
-# with spaces.
-
-INPUT =
-
-# This tag can be used to specify the character encoding of the source files
-# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is
-# also the default input encoding. Doxygen uses libiconv (or the iconv built
-# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for
-# the list of possible encodings.
-
-INPUT_ENCODING = UTF-8
-
-# If the value of the INPUT tag contains directories, you can use the
-# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
-# and *.h) to filter out the source-files in the directories. If left
-# blank the following patterns are tested:
-# *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh
-# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py
-# *.f90 *.f *.for *.vhd *.vhdl
-
-FILE_PATTERNS = *.h *.cpp *.md
-
-# The RECURSIVE tag can be used to turn specify whether or not subdirectories
-# should be searched for input files as well. Possible values are YES and NO.
-# If left blank NO is used.
-
-RECURSIVE = YES
-
-# The EXCLUDE tag can be used to specify files and/or directories that should be
-# excluded from the INPUT source files. This way you can easily exclude a
-# subdirectory from a directory tree whose root is specified with the INPUT tag.
-# Note that relative paths are relative to the directory from which doxygen is
-# run.
-
-EXCLUDE = configs CONTRIBUTING.md README.md
-
-# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
-# directories that are symbolic links (a Unix file system feature) are excluded
-# from the input.
-
-EXCLUDE_SYMLINKS = NO
-
-# If the value of the INPUT tag contains directories, you can use the
-# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
-# certain files from those directories. Note that the wildcards are matched
-# against the file with absolute path, so to exclude all test directories
-# for example use the pattern */test/*
-
-EXCLUDE_PATTERNS =
-
-# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
-# (namespaces, classes, functions, etc.) that should be excluded from the
-# output. The symbol name can be a fully qualified name, a word, or if the
-# wildcard * is used, a substring. Examples: ANamespace, AClass,
-# AClass::ANamespace, ANamespace::*Test
-
-EXCLUDE_SYMBOLS =
-
-# The EXAMPLE_PATH tag can be used to specify one or more files or
-# directories that contain example code fragments that are included (see
-# the \include command).
-
-EXAMPLE_PATH =
-
-# If the value of the EXAMPLE_PATH tag contains directories, you can use the
-# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
-# and *.h) to filter out the source-files in the directories. If left
-# blank all files are included.
-
-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
-# commands irrespective of the value of the RECURSIVE tag.
-# Possible values are YES and NO. If left blank NO is used.
-
-EXAMPLE_RECURSIVE = NO
-
-# The IMAGE_PATH tag can be used to specify one or more files or
-# directories that contain image that are included in the documentation (see
-# the \image command).
-
-IMAGE_PATH =
-
-# The INPUT_FILTER tag can be used to specify a program that doxygen should
-# invoke to filter for each input file. Doxygen will invoke the filter program
-# by executing (via popen()) the command <filter> <input-file>, where <filter>
-# is the value of the INPUT_FILTER tag, and <input-file> is the name of an
-# input file. Doxygen will then use the output that the filter program writes
-# to standard output.
-# If FILTER_PATTERNS is specified, this tag will be ignored.
-# Note that the filter must not add or remove lines; it is applied before the
-# code is scanned, but not when the output code is generated. If lines are added
-# or removed, the anchors will not be placed correctly.
-
-INPUT_FILTER =
-
-# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
-# basis.
-# Doxygen will compare the file name with each pattern and apply the
-# filter if there is a match.
-# The filters are a list of the form:
-# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further
-# info on how filters are used. If FILTER_PATTERNS is empty or if
-# non of the patterns match the file name, INPUT_FILTER is applied.
-
-FILTER_PATTERNS =
-
-# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
-# INPUT_FILTER) will be used to filter the input files when producing source
-# files to browse (i.e. when SOURCE_BROWSER is set to YES).
-
-FILTER_SOURCE_FILES = NO
-
-# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
-# pattern. A pattern will override the setting for FILTER_PATTERN (if any)
-# and it is also possible to disable source filtering for a specific pattern
-# using *.ext= (so without naming a filter). This option only has effect when
-# FILTER_SOURCE_FILES is enabled.
-
-FILTER_SOURCE_PATTERNS =
-
-# If the USE_MD_FILE_AS_MAINPAGE tag refers to the name of a markdown file that
-# is part of the input, its contents will be placed on the main page
-# (index.html). This can be useful if you have a project on for instance GitHub
-# and want reuse the introduction page also for the doxygen output.
-
-USE_MDFILE_AS_MAINPAGE = DOXYGEN_FRONTPAGE.md
-
-#---------------------------------------------------------------------------
-# configuration options related to source browsing
-#---------------------------------------------------------------------------
-
-# If the SOURCE_BROWSER tag is set to YES then a list of source files will
-# be generated. Documented entities will be cross-referenced with these sources.
-# Note: To get rid of all source code in the generated output, make sure also
-# VERBATIM_HEADERS is set to NO.
-
-SOURCE_BROWSER = YES
-
-# Setting the INLINE_SOURCES tag to YES will include the body
-# of functions and classes directly in the documentation.
-
-INLINE_SOURCES = NO
-
-# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
-# doxygen to hide any special comment blocks from generated source code
-# fragments. Normal C, C++ and Fortran comments will always remain visible.
-
-STRIP_CODE_COMMENTS = YES
-
-# If the REFERENCED_BY_RELATION tag is set to YES
-# then for each documented function all documented
-# functions referencing it will be listed.
-
-REFERENCED_BY_RELATION = YES
-
-# If the REFERENCES_RELATION tag is set to YES
-# then for each documented function all documented entities
-# called/used by that function will be listed.
-
-REFERENCES_RELATION = YES
-
-# If the REFERENCES_LINK_SOURCE tag is set to YES (the default)
-# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from
-# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will
-# link to the source code.
-# Otherwise they will link to the documentation.
-
-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
-# tagging system (see http://www.gnu.org/software/global/global.html). You
-# will need version 4.8.6 or higher.
-
-USE_HTAGS = NO
-
-# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
-# will generate a verbatim copy of the header file for each class for
-# which an include is specified. Set to NO to disable this.
-
-VERBATIM_HEADERS = YES
-
-#---------------------------------------------------------------------------
-# configuration options related to the alphabetical class index
-#---------------------------------------------------------------------------
-
-# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index
-# of all compounds will be generated. Enable this if the project
-# contains a lot of classes, structs, unions or interfaces.
-
-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
-# in which this list will be split (can be a number in the range [1..20])
-
-COLS_IN_ALPHA_INDEX = 5
-
-# In case all classes in a project start with a common prefix, all
-# classes will be put under the same header in the alphabetical index.
-# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
-# should be ignored while generating the index headers.
-
-IGNORE_PREFIX =
-
-#---------------------------------------------------------------------------
-# Configuration options related to the HTML output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
-# generate HTML output.
-
-GENERATE_HTML = YES
-
-# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `html' will be used as the default path.
-
-HTML_OUTPUT = .
-
-# The HTML_FILE_EXTENSION tag can be used to specify the file extension for
-# each generated HTML page (for example: .htm,.php,.asp). If it is left blank
-# doxygen will generate files with .html extension.
-
-HTML_FILE_EXTENSION = .html
-
-# The HTML_HEADER tag can be used to specify a personal HTML header for
-# each generated HTML page. If it is left blank doxygen will generate a
-# standard header. Note that when using a custom header you are responsible
-# for the proper inclusion of any scripts and style sheets that doxygen
-# needs, which is dependent on the configuration options used.
-# It is advised to generate a default header using "doxygen -w html
-# header.html footer.html stylesheet.css YourConfigFile" and then modify
-# that header. Note that the header is subject to change so you typically
-# have to redo this when upgrading to a newer version of doxygen or when
-# changing the value of configuration settings such as GENERATE_TREEVIEW!
-
-HTML_HEADER =
-
-# The HTML_FOOTER tag can be used to specify a personal HTML footer for
-# each generated HTML page. If it is left blank doxygen will generate a
-# standard footer.
-
-HTML_FOOTER =
-
-# The HTML_STYLESHEET tag can be used to specify a user-defined cascading
-# style sheet that is used by each HTML page. It can be used to
-# fine-tune the look of the HTML output. If left blank doxygen will
-# generate a default style sheet. Note that it is recommended to use
-# HTML_EXTRA_STYLESHEET instead of this one, as it is more robust and this
-# tag will in the future become obsolete.
-
-HTML_STYLESHEET =
-
-# The HTML_EXTRA_STYLESHEET tag can be used to specify an additional
-# user-defined cascading style sheet that is included after the standard
-# style sheets created by doxygen. Using this option one can overrule
-# certain style aspects. This is preferred over using HTML_STYLESHEET
-# since it does not replace the standard style sheet and is therefor more
-# robust against future updates. Doxygen will copy the style sheet file to
-# the output directory.
-
-HTML_EXTRA_STYLESHEET =
-
-# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
-# other source files which should be copied to the HTML output directory. Note
-# that these files will be copied to the base HTML output directory. Use the
-# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
-# files. In the HTML_STYLESHEET file, use the file name only. Also note that
-# the files will be copied as-is; there are no commands or markers available.
-
-HTML_EXTRA_FILES =
-
-# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output.
-# Doxygen will adjust the colors in the style sheet and background images
-# according to this color. Hue is specified as an angle on a colorwheel,
-# see http://en.wikipedia.org/wiki/Hue for more information.
-# For instance the value 0 represents red, 60 is yellow, 120 is green,
-# 180 is cyan, 240 is blue, 300 purple, and 360 is red again.
-# The allowed range is 0 to 359.
-
-HTML_COLORSTYLE_HUE = 220
-
-# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of
-# the colors in the HTML output. For a value of 0 the output will use
-# grayscales only. A value of 255 will produce the most vivid colors.
-
-HTML_COLORSTYLE_SAT = 100
-
-# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to
-# the luminance component of the colors in the HTML output. Values below
-# 100 gradually make the output lighter, whereas values above 100 make
-# the output darker. The value divided by 100 is the actual gamma applied,
-# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2,
-# and 100 does not change the gamma.
-
-HTML_COLORSTYLE_GAMMA = 80
-
-# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
-# page will contain the date and time when the page was generated. Setting
-# this to NO can help when comparing the output of multiple runs.
-
-HTML_TIMESTAMP = YES
-
-# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
-# documentation will contain sections that can be hidden and shown after the
-# page has loaded.
-
-HTML_DYNAMIC_SECTIONS = NO
-
-# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of
-# entries shown in the various tree structured indices initially; the user
-# can expand and collapse entries dynamically later on. Doxygen will expand
-# the tree to such a level that at most the specified number of entries are
-# visible (unless a fully collapsed tree already exceeds this amount).
-# So setting the number of entries 1 will produce a full collapsed tree by
-# default. 0 is a special value representing an infinite number of entries
-# and will result in a full expanded tree by default.
-
-HTML_INDEX_NUM_ENTRIES = 100
-
-# If the GENERATE_DOCSET tag is set to YES, additional index files
-# will be generated that can be used as input for Apple's Xcode 3
-# integrated development environment, introduced with OSX 10.5 (Leopard).
-# To create a documentation set, doxygen will generate a Makefile in the
-# HTML output directory. Running make will produce the docset in that
-# directory and running "make install" will install the docset in
-# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find
-# it at startup.
-# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html
-# for more information.
-
-GENERATE_DOCSET = NO
-
-# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the
-# feed. A documentation feed provides an umbrella under which multiple
-# documentation sets from a single provider (such as a company or product suite)
-# can be grouped.
-
-DOCSET_FEEDNAME = "Doxygen generated docs"
-
-# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that
-# should uniquely identify the documentation set bundle. This should be a
-# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen
-# will append .docset to the name.
-
-DOCSET_BUNDLE_ID = org.doxygen.Project
-
-# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely
-# identify the documentation publisher. This should be a reverse domain-name
-# style string, e.g. com.mycompany.MyDocSet.documentation.
-
-DOCSET_PUBLISHER_ID = org.doxygen.Publisher
-
-# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher.
-
-DOCSET_PUBLISHER_NAME = Publisher
-
-# If the GENERATE_HTMLHELP tag is set to YES, additional index files
-# will be generated that can be used as input for tools like the
-# Microsoft HTML help workshop to generate a compiled HTML help file (.chm)
-# of the generated HTML documentation.
-
-GENERATE_HTMLHELP = NO
-
-# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can
-# be used to specify the file name of the resulting .chm file. You
-# can add a path in front of the file if the result should not be
-# written to the html output directory.
-
-CHM_FILE =
-
-# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can
-# be used to specify the location (absolute path including file name) of
-# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run
-# the HTML help compiler on the generated index.hhp.
-
-HHC_LOCATION =
-
-# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag
-# controls if a separate .chi index file is generated (YES) or that
-# it should be included in the master .chm file (NO).
-
-GENERATE_CHI = NO
-
-# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING
-# is used to encode HtmlHelp index (hhk), content (hhc) and project file
-# content.
-
-CHM_INDEX_ENCODING =
-
-# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag
-# controls whether a binary table of contents is generated (YES) or a
-# normal table of contents (NO) in the .chm file.
-
-BINARY_TOC = NO
-
-# The TOC_EXPAND flag can be set to YES to add extra items for group members
-# to the contents of the HTML help documentation and to the tree view.
-
-TOC_EXPAND = NO
-
-# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
-# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated
-# that can be used as input for Qt's qhelpgenerator to generate a
-# Qt Compressed Help (.qch) of the generated HTML documentation.
-
-GENERATE_QHP = NO
-
-# If the QHG_LOCATION tag is specified, the QCH_FILE tag can
-# be used to specify the file name of the resulting .qch file.
-# The path specified is relative to the HTML output folder.
-
-QCH_FILE =
-
-# The QHP_NAMESPACE tag specifies the namespace to use when generating
-# Qt Help Project output. For more information please see
-# http://doc.trolltech.com/qthelpproject.html#namespace
-
-QHP_NAMESPACE = org.doxygen.Project
-
-# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating
-# Qt Help Project output. For more information please see
-# http://doc.trolltech.com/qthelpproject.html#virtual-folders
-
-QHP_VIRTUAL_FOLDER = doc
-
-# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to
-# add. For more information please see
-# http://doc.trolltech.com/qthelpproject.html#custom-filters
-
-QHP_CUST_FILTER_NAME =
-
-# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the
-# custom filter to add. For more information please see
-# <a href="http://doc.trolltech.com/qthelpproject.html#custom-filters">
-# Qt Help Project / Custom Filters</a>.
-
-QHP_CUST_FILTER_ATTRS =
-
-# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
-# project's
-# filter section matches.
-# <a href="http://doc.trolltech.com/qthelpproject.html#filter-attributes">
-# Qt Help Project / Filter Attributes</a>.
-
-QHP_SECT_FILTER_ATTRS =
-
-# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can
-# be used to specify the location of Qt's qhelpgenerator.
-# If non-empty doxygen will try to run qhelpgenerator on the generated
-# .qhp file.
-
-QHG_LOCATION =
-
-# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files
-# will be generated, which together with the HTML files, form an Eclipse help
-# plugin. To install this plugin and make it available under the help contents
-# menu in Eclipse, the contents of the directory containing the HTML and XML
-# files needs to be copied into the plugins directory of eclipse. The name of
-# the directory within the plugins directory should be the same as
-# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before
-# the help appears.
-
-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. 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
-
-# The DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs)
-# at top of each HTML page. The value NO (the default) enables the index and
-# the value YES disables it. Since the tabs have the same information as the
-# navigation tree you can set this option to NO if you already set
-# GENERATE_TREEVIEW to YES.
-
-DISABLE_INDEX = NO
-
-# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
-# structure should be generated to display hierarchical information.
-# If the tag value is set to YES, a side panel will be generated
-# containing a tree-like index structure (just like the one that
-# is generated for HTML Help). For this to work a browser that supports
-# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser).
-# Windows users are probably better off using the HTML help feature.
-# Since the tree basically has the same information as the tab index you
-# could consider to set DISABLE_INDEX to NO when enabling this option.
-
-GENERATE_TREEVIEW = NO
-
-# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values
-# (range [0,1..20]) that doxygen will group on one line in the generated HTML
-# documentation. Note that a value of 0 will completely suppress the enum
-# values from appearing in the overview section.
-
-ENUM_VALUES_PER_LINE = 4
-
-# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
-# used to set the initial width (in pixels) of the frame in which the tree
-# is shown.
-
-TREEVIEW_WIDTH = 250
-
-# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open
-# links to external symbols imported via tag files in a separate window.
-
-EXT_LINKS_IN_WINDOW = NO
-
-# Use this tag to change the font size of Latex formulas included
-# as images in the HTML documentation. The default is 10. Note that
-# when you change the font size after a successful doxygen run you need
-# to manually remove any form_*.png images from the HTML output directory
-# to force them to be regenerated.
-
-FORMULA_FONTSIZE = 10
-
-# Use the FORMULA_TRANPARENT tag to determine whether or not the images
-# generated for formulas are transparent PNGs. Transparent PNGs are
-# not supported properly for IE 6.0, but are supported on all modern browsers.
-# Note that when changing this option you need to delete any form_*.png files
-# in the HTML output before the changes have effect.
-
-FORMULA_TRANSPARENT = YES
-
-# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax
-# (see http://www.mathjax.org) which uses client side Javascript for the
-# rendering instead of using prerendered bitmaps. Use this if you do not
-# have LaTeX installed or if you want to formulas look prettier in the HTML
-# output. When enabled you may also need to install MathJax separately and
-# configure the path to it using the MATHJAX_RELPATH option.
-
-USE_MATHJAX = NO
-
-# When MathJax is enabled you can set the default output format to be used for
-# the MathJax output. Supported types are HTML-CSS, NativeMML (i.e. MathML) and
-# SVG. The default value is HTML-CSS, which is slower, but has the best
-# compatibility.
-
-MATHJAX_FORMAT = HTML-CSS
-
-# When MathJax is enabled you need to specify the location relative to the
-# HTML output directory using the MATHJAX_RELPATH option. The destination
-# directory should contain the MathJax.js script. For instance, if the mathjax
-# directory is located at the same level as the HTML output directory, then
-# MATHJAX_RELPATH should be ../mathjax. The default value points to
-# the MathJax Content Delivery Network so you can quickly see the result without
-# installing MathJax.
-# However, it is strongly recommended to install a local
-# copy of MathJax from http://www.mathjax.org before deployment.
-
-MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest
-
-# The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension
-# names that should be enabled during MathJax rendering.
-
-MATHJAX_EXTENSIONS =
-
-# The MATHJAX_CODEFILE tag can be used to specify a file with javascript
-# pieces of code that will be used on startup of the MathJax code.
-
-MATHJAX_CODEFILE =
-
-# When the SEARCHENGINE tag is enabled doxygen will generate a search box
-# for the HTML output. The underlying search engine uses javascript
-# and DHTML and should work on any modern browser. Note that when using
-# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets
-# (GENERATE_DOCSET) there is already a search function so this one should
-# 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 = 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.
-# There are two flavours of web server based search depending on the
-# EXTERNAL_SEARCH setting. When disabled, doxygen will generate a PHP script for
-# searching and an index file used by the script. When EXTERNAL_SEARCH is
-# enabled the indexing and searching needs to be provided by external tools.
-# See the manual for details.
-
-SERVER_BASED_SEARCH = NO
-
-# When EXTERNAL_SEARCH is enabled doxygen will no longer generate the PHP
-# script for searching. Instead the search results are written to an XML file
-# which needs to be processed by an external indexer. Doxygen will invoke an
-# external search engine pointed to by the SEARCHENGINE_URL option to obtain
-# the search results. Doxygen ships with an example indexer (doxyindexer) and
-# search engine (doxysearch.cgi) which are based on the open source search
-# engine library Xapian. See the manual for configuration details.
-
-EXTERNAL_SEARCH = NO
-
-# The SEARCHENGINE_URL should point to a search engine hosted by a web server
-# which will returned the search results when EXTERNAL_SEARCH is enabled.
-# Doxygen ships with an example search engine (doxysearch) which is based on
-# the open source search engine library Xapian. See the manual for configuration
-# details.
-
-SEARCHENGINE_URL =
-
-# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed
-# search data is written to a file for indexing by an external tool. With the
-# SEARCHDATA_FILE tag the name of this file can be specified.
-
-SEARCHDATA_FILE = searchdata.xml
-
-# 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 =
-
-# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen
-# projects other than the one defined by this configuration file, but that are
-# all added to the same external search index. Each project needs to have a
-# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id
-# of to a relative location where the documentation can be found.
-# The format is: EXTRA_SEARCH_MAPPINGS = id1=loc1 id2=loc2 ...
-
-EXTRA_SEARCH_MAPPINGS =
-
-#---------------------------------------------------------------------------
-# Configuration options related to the LaTeX output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
-# generate Latex output.
-
-GENERATE_LATEX = NO
-
-# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `latex' will be used as the default path.
-
-LATEX_OUTPUT = latex
-
-# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
-# invoked. If left blank `latex' will be used as the default command name.
-# Note that when enabling USE_PDFLATEX this option is only used for
-# generating bitmaps for formulas in the HTML output, but not in the
-# Makefile that is written to the output directory.
-
-LATEX_CMD_NAME = latex
-
-# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to
-# generate index for LaTeX. If left blank `makeindex' will be used as the
-# default command name.
-
-MAKEINDEX_CMD_NAME = makeindex
-
-# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
-# LaTeX documents. This may be useful for small projects and may help to
-# save some trees in general.
-
-COMPACT_LATEX = YES
-
-# The PAPER_TYPE tag can be used to set the paper type that is used
-# by the printer. Possible values are: a4, letter, legal and
-# executive. If left blank a4 will be used.
-
-PAPER_TYPE = a4wide
-
-# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
-# packages that should be included in the LaTeX output.
-
-EXTRA_PACKAGES =
-
-# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
-# the generated latex document. The header should contain everything until
-# the first chapter. If it is left blank doxygen will generate a
-# standard header. Notice: only use this tag if you know what you are doing!
-
-LATEX_HEADER =
-
-# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for
-# the generated latex document. The footer should contain everything after
-# the last chapter. If it is left blank doxygen will generate a
-# standard footer. Notice: only use this tag if you know what you are doing!
-
-LATEX_FOOTER =
-
-# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images
-# or other source files which should be copied to the LaTeX output directory.
-# Note that the files will be copied as-is; there are no commands or markers
-# available.
-
-LATEX_EXTRA_FILES =
-
-# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
-# is prepared for conversion to pdf (using ps2pdf). The pdf file will
-# contain links (just like the HTML output) instead of page references
-# This makes the output suitable for online browsing using a pdf viewer.
-
-PDF_HYPERLINKS = YES
-
-# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
-# plain latex in the generated Makefile. Set this option to YES to get a
-# higher quality PDF documentation.
-
-USE_PDFLATEX = YES
-
-# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
-# command to the generated LaTeX files. This will instruct LaTeX to keep
-# running if errors occur, instead of asking the user for help.
-# This option is also used when generating formulas in HTML.
-
-LATEX_BATCHMODE = NO
-
-# If LATEX_HIDE_INDICES is set to YES then doxygen will not
-# include the index chapters (such as File Index, Compound Index, etc.)
-# in the output.
-
-LATEX_HIDE_INDICES = NO
-
-# If LATEX_SOURCE_CODE is set to YES then doxygen will include
-# source code with syntax highlighting in the LaTeX output.
-# Note that which sources are shown also depends on other settings
-# such as SOURCE_BROWSER.
-
-LATEX_SOURCE_CODE = NO
-
-# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
-# bibliography, e.g. plainnat, or ieeetr. The default style is "plain". See
-# http://en.wikipedia.org/wiki/BibTeX for more info.
-
-LATEX_BIB_STYLE = plain
-
-#---------------------------------------------------------------------------
-# Configuration options related to the RTF output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
-# The RTF output is optimized for Word 97 and may not look very pretty with
-# other RTF readers or editors.
-
-GENERATE_RTF = NO
-
-# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `rtf' will be used as the default path.
-
-RTF_OUTPUT = rtf
-
-# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
-# RTF documents. This may be useful for small projects and may help to
-# save some trees in general.
-
-COMPACT_RTF = NO
-
-# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
-# will contain hyperlink fields. The RTF file will
-# contain links (just like the HTML output) instead of page references.
-# This makes the output suitable for online browsing using WORD or other
-# programs which support those fields.
-# Note: wordpad (write) and others do not support links.
-
-RTF_HYPERLINKS = NO
-
-# Load style sheet definitions from file. Syntax is similar to doxygen's
-# config file, i.e. a series of assignments. You only have to provide
-# replacements, missing definitions are set to their default value.
-
-RTF_STYLESHEET_FILE =
-
-# Set optional variables used in the generation of an rtf document.
-# Syntax is similar to doxygen's config file.
-
-RTF_EXTENSIONS_FILE =
-
-#---------------------------------------------------------------------------
-# configuration options related to the man page output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
-# generate man pages
-
-GENERATE_MAN = NO
-
-# The MAN_OUTPUT tag is used to specify where the man pages will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `man' will be used as the default path.
-
-MAN_OUTPUT = man
-
-# The MAN_EXTENSION tag determines the extension that is added to
-# the generated man pages (default is the subroutine's section .3)
-
-MAN_EXTENSION = .3
-
-# If the MAN_LINKS tag is set to YES and Doxygen generates man output,
-# then it will generate one additional man file for each entity
-# documented in the real man page(s). These additional files
-# only source the real man page, but without them the man command
-# would be unable to find the correct page. The default is NO.
-
-MAN_LINKS = NO
-
-#---------------------------------------------------------------------------
-# configuration options related to the XML output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_XML tag is set to YES Doxygen will
-# generate an XML file that captures the structure of
-# the code including all documentation.
-
-GENERATE_XML = NO
-
-# The XML_OUTPUT tag is used to specify where the XML pages will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `xml' will be used as the default path.
-
-XML_OUTPUT = xml
-
-# The XML_SCHEMA tag can be used to specify an XML schema,
-# which can be used by a validating XML parser to check the
-# syntax of the XML files.
-
-XML_SCHEMA =
-
-# The XML_DTD tag can be used to specify an XML DTD,
-# which can be used by a validating XML parser to check the
-# syntax of the XML files.
-
-XML_DTD =
-
-# If the XML_PROGRAMLISTING tag is set to YES Doxygen will
-# dump the program listings (including syntax highlighting
-# and cross-referencing information) to the XML output. Note that
-# enabling this will significantly increase the size of the XML output.
-
-XML_PROGRAMLISTING = YES
-
-#---------------------------------------------------------------------------
-# configuration options related to the DOCBOOK output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_DOCBOOK tag is set to YES Doxygen will generate DOCBOOK files
-# that can be used to generate PDF.
-
-GENERATE_DOCBOOK = NO
-
-# The DOCBOOK_OUTPUT tag is used to specify where the DOCBOOK pages will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in
-# front of it. If left blank docbook will be used as the default path.
-
-DOCBOOK_OUTPUT = docbook
-
-#---------------------------------------------------------------------------
-# configuration options for the AutoGen Definitions output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will
-# generate an AutoGen Definitions (see autogen.sf.net) file
-# that captures the structure of the code including all
-# documentation. Note that this feature is still experimental
-# and incomplete at the moment.
-
-GENERATE_AUTOGEN_DEF = NO
-
-#---------------------------------------------------------------------------
-# configuration options related to the Perl module output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_PERLMOD tag is set to YES Doxygen will
-# generate a Perl module file that captures the structure of
-# the code including all documentation. Note that this
-# feature is still experimental and incomplete at the
-# moment.
-
-GENERATE_PERLMOD = NO
-
-# If the PERLMOD_LATEX tag is set to YES Doxygen will generate
-# the necessary Makefile rules, Perl scripts and LaTeX code to be able
-# to generate PDF and DVI output from the Perl module output.
-
-PERLMOD_LATEX = NO
-
-# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be
-# nicely formatted so it can be parsed by a human reader.
-# This is useful
-# if you want to understand what is going on.
-# On the other hand, if this
-# tag is set to NO the size of the Perl module output will be much smaller
-# and Perl will parse it just the same.
-
-PERLMOD_PRETTY = YES
-
-# The names of the make variables in the generated doxyrules.make file
-# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.
-# This is useful so different doxyrules.make files included by the same
-# Makefile don't overwrite each other's variables.
-
-PERLMOD_MAKEVAR_PREFIX =
-
-#---------------------------------------------------------------------------
-# Configuration options related to the preprocessor
-#---------------------------------------------------------------------------
-
-# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
-# evaluate all C-preprocessor directives found in the sources and include
-# files.
-
-ENABLE_PREPROCESSING = YES
-
-# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
-# names in the source code. If set to NO (the default) only conditional
-# compilation will be performed. Macro expansion can be done in a controlled
-# way by setting EXPAND_ONLY_PREDEF to YES.
-
-MACRO_EXPANSION = NO
-
-# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
-# then the macro expansion is limited to the macros specified with the
-# PREDEFINED and EXPAND_AS_DEFINED tags.
-
-EXPAND_ONLY_PREDEF = NO
-
-# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
-# pointed to by INCLUDE_PATH will be searched when a #include is found.
-
-SEARCH_INCLUDES = YES
-
-# The INCLUDE_PATH tag can be used to specify one or more directories that
-# contain include files that are not input files but should be processed by
-# the preprocessor.
-
-INCLUDE_PATH =
-
-# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
-# patterns (like *.h and *.hpp) to filter out the header-files in the
-# directories. If left blank, the patterns specified with FILE_PATTERNS will
-# be used.
-
-INCLUDE_FILE_PATTERNS =
-
-# The PREDEFINED tag can be used to specify one or more macro names that
-# are defined before the preprocessor is started (similar to the -D option of
-# gcc). The argument of the tag is a list of macros of the form: name
-# or name=definition (no spaces). If the definition and the = are
-# omitted =1 is assumed. To prevent a macro definition from being
-# undefined via #undef or recursively expanded use the := operator
-# instead of the = operator.
-
-PREDEFINED = TARGET_NRF51822
-
-# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
-# this tag can be used to specify a list of macro names that should be expanded.
-# The macro definition that is found in the sources will be used.
-# Use the PREDEFINED tag if you want to use a different macro definition that
-# overrules the definition found in the source code.
-
-EXPAND_AS_DEFINED =
-
-# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
-# doxygen's preprocessor will remove all references to function-like macros
-# that are alone on a line, have an all uppercase name, and do not end with a
-# semicolon, because these will confuse the parser if not removed.
-
-SKIP_FUNCTION_MACROS = YES
-
-#---------------------------------------------------------------------------
-# Configuration::additions related to external references
-#---------------------------------------------------------------------------
-
-# The TAGFILES option can be used to specify one or more tagfiles. For each
-# tag file the location of the external documentation should be added. The
-# format of a tag file without this location is as follows:
-#
-# TAGFILES = file1 file2 ...
-# Adding location for the tag files is done as follows:
-#
-# TAGFILES = file1=loc1 "file2 = loc2" ...
-# where "loc1" and "loc2" can be relative or absolute paths
-# or URLs. Note that each tag file must have a unique name (where the name does
-# NOT include the path). If a tag file is not located in the directory in which
-# doxygen is run, you must also specify the path to the tagfile here.
-
-TAGFILES =
-
-# When a file name is specified after GENERATE_TAGFILE, doxygen will create
-# a tag file that is based on the input files it reads.
-
-GENERATE_TAGFILE =
-
-# If the ALLEXTERNALS tag is set to YES all external classes will be listed
-# in the class index. If set to NO only the inherited external classes
-# will be listed.
-
-ALLEXTERNALS = NO
-
-# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed
-# in the modules index. If set to NO, only the current project's groups will
-# be listed.
-
-EXTERNAL_GROUPS = YES
-
-# If the EXTERNAL_PAGES tag is set to YES all external pages will be listed
-# in the related pages index. If set to NO, only the current project's
-# pages will be listed.
-
-EXTERNAL_PAGES = YES
-
-# The PERL_PATH should be the absolute path and name of the perl script
-# interpreter (i.e. the result of `which perl').
-
-PERL_PATH = /usr/bin/perl
-
-#---------------------------------------------------------------------------
-# Configuration options related to the dot tool
-#---------------------------------------------------------------------------
-
-# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
-# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base
-# or super classes. Setting the tag to NO turns the diagrams off. Note that
-# 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 = YES
-
-# You can define message sequence charts within doxygen comments using the \msc
-# command. Doxygen will then run the mscgen tool (see
-# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the
-# documentation. The MSCGEN_PATH tag allows you to specify the directory where
-# the mscgen tool resides. If left empty the tool is assumed to be found in the
-# default search path.
-
-MSCGEN_PATH =
-
-# If set to YES, the inheritance and collaboration graphs will hide
-# inheritance and usage relations if the target is undocumented
-# or is not a class.
-
-HIDE_UNDOC_RELATIONS = YES
-
-# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
-# available from the path. This tool is part of Graphviz, a graph visualization
-# toolkit from AT&T and Lucent Bell Labs. The other options in this section
-# have no effect if this option is set to NO (the default)
-
-HAVE_DOT = YES
-
-# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is
-# allowed to run in parallel. When set to 0 (the default) doxygen will
-# base this on the number of processors available in the system. You can set it
-# explicitly to a value larger than 0 to get control over the balance
-# between CPU load and processing speed.
-
-DOT_NUM_THREADS = 0
-
-# By default doxygen will use the Helvetica font for all dot files that
-# doxygen generates. When you want a differently looking font you can specify
-# the font name using DOT_FONTNAME. You need to make sure dot is able to find
-# the font, which can be done by putting it in a standard location or by setting
-# the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the
-# directory containing the font.
-
-DOT_FONTNAME = Helvetica
-
-# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs.
-# The default size is 10pt.
-
-DOT_FONTSIZE = 10
-
-# By default doxygen will tell dot to use the Helvetica font.
-# If you specify a different font using DOT_FONTNAME you can use DOT_FONTPATH to
-# set the path where dot can find it.
-
-DOT_FONTPATH =
-
-# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
-# will generate a graph for each documented class showing the direct and
-# indirect inheritance relations. Setting this tag to YES will force the
-# CLASS_DIAGRAMS tag to NO.
-
-CLASS_GRAPH = YES
-
-# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
-# will generate a graph for each documented class showing the direct and
-# indirect implementation dependencies (inheritance, containment, and
-# class references variables) of the class with other documented classes.
-
-COLLABORATION_GRAPH = YES
-
-# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen
-# will generate a graph for groups, showing the direct groups dependencies
-
-GROUP_GRAPHS = YES
-
-# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
-# collaboration diagrams in a style similar to the OMG's Unified Modeling
-# Language.
-
-UML_LOOK = NO
-
-# If the UML_LOOK tag is enabled, the fields and methods are shown inside
-# the class node. If there are many fields or methods and many nodes the
-# graph may become too big to be useful. The UML_LIMIT_NUM_FIELDS
-# threshold limits the number of items for each type to make the size more
-# manageable. Set this to 0 for no limit. Note that the threshold may be
-# exceeded by 50% before the limit is enforced.
-
-UML_LIMIT_NUM_FIELDS = 10
-
-# If set to YES, the inheritance and collaboration graphs will show the
-# relations between templates and their instances.
-
-TEMPLATE_RELATIONS = NO
-
-# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT
-# tags are set to YES then doxygen will generate a graph for each documented
-# file showing the direct and indirect include dependencies of the file with
-# other documented files.
-
-INCLUDE_GRAPH = YES
-
-# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and
-# HAVE_DOT tags are set to YES then doxygen will generate a graph for each
-# documented header file showing the documented files that directly or
-# indirectly include this file.
-
-INCLUDED_BY_GRAPH = YES
-
-# If the CALL_GRAPH and HAVE_DOT options are set to YES then
-# doxygen will generate a call dependency graph for every global function
-# or class method. Note that enabling this option will significantly increase
-# the time of a run. So in most cases it will be better to enable call graphs
-# for selected functions only using the \callgraph command.
-
-CALL_GRAPH = NO
-
-# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then
-# doxygen will generate a caller dependency graph for every global function
-# or class method. Note that enabling this option will significantly increase
-# the time of a run. So in most cases it will be better to enable caller
-# graphs for selected functions only using the \callergraph command.
-
-CALLER_GRAPH = NO
-
-# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
-# will generate a graphical hierarchy of all classes instead of a textual one.
-
-GRAPHICAL_HIERARCHY = YES
-
-# If the DIRECTORY_GRAPH and HAVE_DOT tags are set to YES
-# then doxygen will show the dependencies a directory has on other directories
-# in a graphical way. The dependency relations are determined by the #include
-# relations between the files in the directories.
-
-DIRECTORY_GRAPH = YES
-
-# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
-# generated by dot. Possible values are svg, png, jpg, or gif.
-# If left blank png will be used. If you choose svg you need to set
-# HTML_FILE_EXTENSION to xhtml in order to make the SVG files
-# visible in IE 9+ (other browsers do not have this requirement).
-
-DOT_IMAGE_FORMAT = png
-
-# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
-# enable generation of interactive SVG images that allow zooming and panning.
-# Note that this requires a modern browser other than Internet Explorer.
-# Tested and working are Firefox, Chrome, Safari, and Opera. For IE 9+ you
-# need to set HTML_FILE_EXTENSION to xhtml in order to make the SVG files
-# visible. Older versions of IE do not have SVG support.
-
-INTERACTIVE_SVG = NO
-
-# The tag DOT_PATH can be used to specify the path where the dot tool can be
-# found. If left blank, it is assumed the dot tool can be found in the path.
-
-DOT_PATH =
-
-# The DOTFILE_DIRS tag can be used to specify one or more directories that
-# contain dot files that are included in the documentation (see the
-# \dotfile command).
-
-DOTFILE_DIRS =
-
-# The MSCFILE_DIRS tag can be used to specify one or more directories that
-# contain msc files that are included in the documentation (see the
-# \mscfile command).
-
-MSCFILE_DIRS =
-
-# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of
-# nodes that will be shown in the graph. If the number of nodes in a graph
-# becomes larger than this value, doxygen will truncate the graph, which is
-# visualized by representing a node as a red box. Note that doxygen if the
-# number of direct children of the root node in a graph is already larger than
-# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note
-# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
-
-DOT_GRAPH_MAX_NODES = 200
-
-# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the
-# graphs generated by dot. A depth value of 3 means that only nodes reachable
-# from the root by following a path via at most 3 edges will be shown. Nodes
-# that lay further from the root node will be omitted. Note that setting this
-# option to 1 or 2 may greatly reduce the computation time needed for large
-# code bases. Also note that the size of a graph can be further restricted by
-# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
-
-MAX_DOT_GRAPH_DEPTH = 1000
-
-# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
-# background. This is disabled by default, because dot on Windows does not
-# seem to support this out of the box. Warning: Depending on the platform used,
-# enabling this option may lead to badly anti-aliased labels on the edges of
-# a graph (i.e. they become hard to read).
-
-DOT_TRANSPARENT = YES
-
-# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
-# files in one run (i.e. multiple -o and -T options on the command line). This
-# makes dot run faster, but since only newer versions of dot (>1.8.10)
-# support this, this feature is disabled by default.
-
-DOT_MULTI_TARGETS = NO
-
-# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
-# generate a legend page explaining the meaning of the various boxes and
-# arrows in the dot generated graphs.
-
-GENERATE_LEGEND = YES
-
-# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will
-# remove the intermediate dot files that are used to generate
-# the various graphs.
-
+# Doxyfile 1.8.4
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project.
+#
+# All text after a double hash (##) is considered a comment and is placed
+# in front of the TAG it is preceding .
+# All text after a hash (#) is considered a comment and will be ignored.
+# The format is:
+# TAG = value [value, ...]
+# For lists items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (" ").
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the config file
+# that follow. The default is UTF-8 which is also the encoding used for all
+# text before the first occurrence of this tag. Doxygen uses libiconv (or the
+# iconv built into libc) for the transcoding. See
+# http://www.gnu.org/software/libiconv for the list of possible encodings.
+
+DOXYFILE_ENCODING = UTF-8
+
+# The PROJECT_NAME tag is a single word (or sequence of words) that should
+# identify the project. Note that if you do not use Doxywizard you need
+# to put quotes around the project name if it contains spaces.
+
+PROJECT_NAME = "BLE API"
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number.
+# This could be handy for archiving the generated documentation or
+# if some version control system is used.
+
+PROJECT_NUMBER = v2
+
+# Using the PROJECT_BRIEF tag one can provide an optional one line description
+# for a project that appears at the top of each page and should give viewer
+# a quick idea about the purpose of the project. Keep the description short.
+
+PROJECT_BRIEF = "An abstraction for using Bluetooth Low Energy."
+
+# With the PROJECT_LOGO tag one can specify an logo or icon that is
+# included in the documentation. The maximum height of the logo should not
+# exceed 55 pixels and the maximum width should not exceed 200 pixels.
+# Doxygen will copy the logo to the output directory.
+
+PROJECT_LOGO =
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
+# base path where the generated documentation will be put.
+# If a relative path is entered, it will be relative to the location
+# where doxygen was started. If left blank the current directory will be used.
+
+OUTPUT_DIRECTORY = apidoc/
+
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create
+# 4096 sub-directories (in 2 levels) under the output directory of each output
+# format and will distribute the generated files over these directories.
+# Enabling this option can be useful when feeding doxygen a huge amount of
+# source files, where putting all generated files in the same directory would
+# otherwise cause performance problems for the file system.
+
+CREATE_SUBDIRS = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# The default language is English, other supported languages are:
+# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional,
+# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German,
+# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English
+# messages), Korean, Korean-en, Latvian, Lithuanian, Norwegian, Macedonian,
+# Persian, Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic,
+# Slovak, Slovene, Spanish, Swedish, Ukrainian, and Vietnamese.
+
+OUTPUT_LANGUAGE = English
+
+# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
+# include brief member descriptions after the members that are listed in
+# the file and class documentation (similar to JavaDoc).
+# Set to NO to disable this.
+
+BRIEF_MEMBER_DESC = YES
+
+# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
+# the brief description of a member or function before the detailed description.
+# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+
+REPEAT_BRIEF = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator
+# that is used to form the text in various listings. Each string
+# in this list, if found as the leading text of the brief description, will be
+# stripped from the text and the result after processing the whole list, is
+# used as the annotated text. Otherwise, the brief description is used as-is.
+# If left blank, the following values are used ("$name" is automatically
+# replaced with the name of the entity): "The $name class" "The $name widget"
+# "The $name file" "is" "provides" "specifies" "contains"
+# "represents" "a" "an" "the"
+
+ABBREVIATE_BRIEF = "The $name class" \
+ "The $name widget" \
+ "The $name file" \
+ is \
+ provides \
+ specifies \
+ contains \
+ represents \
+ a \
+ an \
+ the
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# Doxygen will generate a detailed section even if there is only a brief
+# description.
+
+ALWAYS_DETAILED_SEC = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+
+INLINE_INHERITED_MEMB = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
+# 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
+
+# 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
+# only done if one of the specified strings matches the left-hand part of
+# the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the
+# path to strip. Note that you specify absolute paths here, but also
+# relative paths, which will be relative from the directory where doxygen is
+# started.
+
+STRIP_FROM_PATH =
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of
+# the path mentioned in the documentation of a class, which tells
+# the reader which header file to include in order to use a class.
+# If left blank only the name of the header file containing the class
+# definition is used. Otherwise one should specify the include paths that
+# are normally passed to the compiler using the -I flag.
+
+STRIP_FROM_INC_PATH =
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
+# (but less readable) file names. This can be useful if your file system
+# doesn't support long names like on DOS, Mac, or CD-ROM.
+
+SHORT_NAMES = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
+# will interpret the first line (until the first dot) of a JavaDoc-style
+# comment as the brief description. If set to NO, the JavaDoc
+# comments will behave just like regular Qt-style comments
+# (thus requiring an explicit @brief command for a brief description.)
+
+JAVADOC_AUTOBRIEF = YES
+
+# If the QT_AUTOBRIEF tag is set to YES then Doxygen will
+# interpret the first line (until the first dot) of a Qt-style
+# comment as the brief description. If set to NO, the comments
+# will behave just like regular Qt-style comments (thus requiring
+# an explicit \brief command for a brief description.)
+
+QT_AUTOBRIEF = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen
+# treat a multi-line C++ special comment block (i.e. a block of //! or ///
+# comments) as a brief description. This used to be the default behaviour.
+# The new default is to treat a multi-line C++ comment block as a detailed
+# description. Set this tag to YES if you prefer the old behaviour instead.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
+# member inherits the documentation from any documented member that it
+# re-implements.
+
+INHERIT_DOCS = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce
+# a new page for each member. If set to NO, the documentation of a member will
+# be part of the file/class/namespace that contains it.
+
+SEPARATE_MEMBER_PAGES = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab.
+# Doxygen uses this value to replace tabs by spaces in code fragments.
+
+TAB_SIZE = 4
+
+# This tag can be used to specify a number of aliases that acts
+# as commands in the documentation. An alias has the form "name=value".
+# For example adding "sideeffect=\par Side Effects:\n" will allow you to
+# put the command \sideeffect (or @sideeffect) in the documentation, which
+# will result in a user-defined paragraph with heading "Side Effects:".
+# You can put \n's in the value part of an alias to insert newlines.
+
+ALIASES =
+
+# This tag can be used to specify a number of word-keyword mappings (TCL only).
+# A mapping has the form "name=value". For example adding
+# "class=itcl::class" will allow you to use the command class in the
+# itcl::class meaning.
+
+TCL_SUBST =
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C
+# sources only. Doxygen will then generate output that is more tailored for C.
+# For instance, some of the names that are used will be different. The list
+# of all members will be omitted, etc.
+
+OPTIMIZE_OUTPUT_FOR_C = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java
+# sources only. Doxygen will then generate output that is more tailored for
+# Java. For instance, namespaces will be presented as packages, qualified
+# scopes will look different, etc.
+
+OPTIMIZE_OUTPUT_JAVA = NO
+
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
+# sources only. Doxygen will then generate output that is more tailored for
+# Fortran.
+
+OPTIMIZE_FOR_FORTRAN = NO
+
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
+# sources. Doxygen will then generate output that is tailored for
+# VHDL.
+
+OPTIMIZE_OUTPUT_VHDL = NO
+
+# 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 =
+
+# If MARKDOWN_SUPPORT is enabled (the default) then doxygen pre-processes all
+# comments according to the Markdown format, which allows for more readable
+# documentation. See http://daringfireball.net/projects/markdown/ for details.
+# The output of markdown processing is further processed by doxygen, so you
+# can mix doxygen, HTML, and XML commands with Markdown formatting.
+# Disable only in case of backward compatibilities issues.
+
+MARKDOWN_SUPPORT = YES
+
+# When enabled doxygen tries to link words that correspond to documented
+# classes, or namespaces to their corresponding documentation. Such a link can
+# be prevented in individual cases by by putting a % sign in front of the word
+# or globally by setting AUTOLINK_SUPPORT to NO.
+
+AUTOLINK_SUPPORT = YES
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
+# to include (a tag file for) the STL sources as input, then you should
+# set this tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string); v.s.
+# func(std::string) {}). This also makes the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+
+BUILTIN_STL_SUPPORT = NO
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
+# enable parsing support.
+
+CPP_CLI_SUPPORT = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only.
+# Doxygen will parse them like normal C++ but will assume all classes use public
+# instead of private inheritance when no explicit protection keyword is present.
+
+SIP_SUPPORT = NO
+
+# For Microsoft's IDL there are propget and propput attributes to indicate
+# getter and setter methods for a property. Setting this option to YES (the
+# default) will make doxygen replace the get and set methods by a property in
+# the documentation. This will only work if the methods are indeed getting or
+# setting a simple type. If this is not the case, or you want to show the
+# methods anyway, you should set this option to NO.
+
+IDL_PROPERTY_SUPPORT = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES, then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+
+DISTRIBUTE_GROUP_DOC = NO
+
+# Set the SUBGROUPING tag to YES (the default) to allow class member groups of
+# the same type (for instance a group of public functions) to be put as a
+# subgroup of that type (e.g. under the Public Functions section). Set it to
+# NO to prevent subgrouping. Alternatively, this can be done per class using
+# the \nosubgrouping command.
+
+SUBGROUPING = YES
+
+# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and
+# unions are shown inside the group in which they are included (e.g. using
+# @ingroup) instead of on a separate page (for HTML and Man pages) or
+# section (for LaTeX and RTF).
+
+INLINE_GROUPED_CLASSES = NO
+
+# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and
+# unions with only public data fields or simple typedef fields will be shown
+# inline in the documentation of the scope in which they are defined (i.e. file,
+# namespace, or group documentation), provided this scope is documented. If set
+# to NO (the default), structs, classes, and unions are shown on a separate
+# page (for HTML and Man pages) or section (for LaTeX and RTF).
+
+INLINE_SIMPLE_STRUCTS = YES
+
+# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum
+# is documented as struct, union, or enum with the name of the typedef. So
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
+# with name TypeT. When disabled the typedef will appear as a member of a file,
+# namespace, or class. And the struct will be named TypeS. This can typically
+# be useful for C code in case the coding convention dictates that all compound
+# types are typedef'ed and only the typedef is referenced, never the tag name.
+
+TYPEDEF_HIDES_STRUCT = NO
+
+# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This
+# cache is used to resolve symbols given their name and scope. Since this can
+# be an expensive process and often the same symbol appear multiple times in
+# the code, doxygen keeps a cache of pre-resolved symbols. If the cache is too
+# small doxygen will become slower. If the cache is too large, memory is wasted.
+# The cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid
+# range is 0..9, the default is 0, corresponding to a cache size of 2^16 = 65536
+# symbols.
+
+LOOKUP_CACHE_SIZE = 0
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
+# documentation are documented, even if no documentation was available.
+# 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
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
+# will be included in the documentation.
+
+EXTRACT_PRIVATE = YES
+
+# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal
+# scope will be included in the documentation.
+
+EXTRACT_PACKAGE = NO
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file
+# will be included in the documentation.
+
+EXTRACT_STATIC = YES
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)
+# defined locally in source files will be included in the documentation.
+# If set to NO only classes defined in header files are included.
+
+EXTRACT_LOCAL_CLASSES = YES
+
+# This flag is only useful for Objective-C code. When set to YES local
+# methods, which are defined in the implementation section but not in
+# the interface are included in the documentation.
+# If set to NO (the default) only methods in the interface are included.
+
+EXTRACT_LOCAL_METHODS = YES
+
+# If this flag is set to YES, the members of anonymous namespaces will be
+# extracted and appear in the documentation as a namespace called
+# 'anonymous_namespace{file}', where file will be replaced with the base
+# name of the file that contains the anonymous namespace. By default
+# anonymous namespaces are hidden.
+
+EXTRACT_ANON_NSPACES = YES
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
+# undocumented members of documented classes, files or namespaces.
+# If set to NO (the default) these members will be included in the
+# various overviews, but no documentation section is generated.
+# This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_MEMBERS = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy.
+# If set to NO (the default) these classes will be included in the various
+# overviews. This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_CLASSES = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all
+# friend (class|struct|union) declarations.
+# If set to NO (the default) these declarations will be included in the
+# documentation.
+
+HIDE_FRIEND_COMPOUNDS = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any
+# documentation blocks found inside the body of a function.
+# If set to NO (the default) these blocks will be appended to the
+# function's detailed documentation block.
+
+HIDE_IN_BODY_DOCS = NO
+
+# The INTERNAL_DOCS tag determines if documentation
+# that is typed after a \internal command is included. If the tag is set
+# to NO (the default) then the documentation will be excluded.
+# Set it to YES to include the internal documentation.
+
+INTERNAL_DOCS = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
+# file names in lower-case letters. If set to YES upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# and Mac users are advised to set this option to NO.
+
+CASE_SENSE_NAMES = NO
+
+# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
+# will show members with their full class and namespace scopes in the
+# documentation. If set to YES the scope will be hidden.
+
+HIDE_SCOPE_NAMES = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
+# will put a list of the files that are included by a file in the documentation
+# of that file.
+
+SHOW_INCLUDE_FILES = YES
+
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen
+# will list include files with double quotes in the documentation
+# rather than with sharp brackets.
+
+FORCE_LOCAL_INCLUDES = NO
+
+# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
+# is inserted in the documentation for inline members.
+
+INLINE_INFO = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
+# will sort the (detailed) documentation of file and class members
+# alphabetically by member name. If set to NO the members will appear in
+# declaration order.
+
+SORT_MEMBER_DOCS = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the
+# brief documentation of file, namespace and class members alphabetically
+# by member name. If set to NO (the default) the members will appear in
+# declaration order.
+
+SORT_BRIEF_DOCS = NO
+
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen
+# will sort the (brief and detailed) documentation of class members so that
+# constructors and destructors are listed first. If set to NO (the default)
+# the constructors will appear in the respective orders defined by
+# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS.
+# 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
+
+# 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)
+# the group names will appear in their defined order.
+
+SORT_GROUP_NAMES = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be
+# sorted by fully-qualified names, including namespaces. If set to
+# NO (the default), the class list will be sorted only by class name,
+# not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the
+# alphabetical list.
+
+SORT_BY_SCOPE_NAME = NO
+
+# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to
+# do proper type resolution of all parameters of a function it will reject a
+# match between the prototype and the implementation of a member function even
+# if there is only one candidate or it is obvious which candidate to choose
+# by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen
+# will still accept a match between prototype and implementation in such cases.
+
+STRICT_PROTO_MATCHING = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or
+# disable (NO) the todo list. This list is created by putting \todo
+# commands in the documentation.
+
+GENERATE_TODOLIST = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or
+# disable (NO) the test list. This list is created by putting \test
+# commands in the documentation.
+
+GENERATE_TESTLIST = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or
+# disable (NO) the bug list. This list is created by putting \bug
+# commands in the documentation.
+
+GENERATE_BUGLIST = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or
+# disable (NO) the deprecated list. This list is created by putting
+# \deprecated commands in the documentation.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional
+# documentation sections, marked by \if section-label ... \endif
+# and \cond section-label ... \endcond blocks.
+
+ENABLED_SECTIONS =
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines
+# the initial value of a variable or macro consists of for it to appear in
+# the documentation. If the initializer consists of more lines than specified
+# here it will be hidden. Use a value of 0 to hide initializers completely.
+# The appearance of the initializer of individual variables and macros in the
+# documentation can be controlled using \showinitializer or \hideinitializer
+# command in the documentation regardless of this setting.
+
+MAX_INITIALIZER_LINES = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated
+# at the bottom of the documentation of classes and structs. If set to YES the
+# list will mention the files that were used to generate the documentation.
+
+SHOW_USED_FILES = YES
+
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page.
+# This will remove the Files entry from the Quick Index and from the
+# Folder Tree View (if specified). The default is YES.
+
+SHOW_FILES = YES
+
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the
+# Namespaces page.
+# This will remove the Namespaces entry from the Quick Index
+# and from the Folder Tree View (if specified). The default is YES.
+
+SHOW_NAMESPACES = YES
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from
+# the version control system). Doxygen will invoke the program by executing (via
+# popen()) the command <command> <input-file>, where <command> is the value of
+# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file
+# provided by doxygen. Whatever the program writes to standard output
+# is used as the file version. See the manual for examples.
+
+FILE_VERSION_FILTER =
+
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
+# by doxygen. The layout file controls the global structure of the generated
+# output files in an output format independent way. To create the layout file
+# that represents doxygen's defaults, run doxygen with the -l option.
+# You can optionally specify a file name after the option, if omitted
+# DoxygenLayout.xml will be used as the name of the layout file.
+
+LAYOUT_FILE =
+
+# The CITE_BIB_FILES tag can be used to specify one or more bib files
+# containing the references data. This must be a list of .bib files. The
+# .bib extension is automatically appended if omitted. Using this command
+# requires the bibtex tool to be installed. See also
+# http://en.wikipedia.org/wiki/BibTeX for more info. For LaTeX the style
+# of the bibliography can be controlled using LATEX_BIB_STYLE. To use this
+# feature you need bibtex and perl available in the search path. Do not use
+# file names with spaces, bibtex cannot handle them.
+
+CITE_BIB_FILES =
+
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated
+# by doxygen. Possible values are YES and NO. If left blank NO is used.
+
+QUIET = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated by doxygen. Possible values are YES and NO. If left blank
+# NO is used.
+
+WARNINGS = YES
+
+# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
+# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
+# automatically be disabled.
+
+WARN_IF_UNDOCUMENTED = YES
+
+# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some
+# parameters in a documented function, or documenting parameters that
+# don't exist or using markup commands wrongly.
+
+WARN_IF_DOC_ERROR = YES
+
+# The WARN_NO_PARAMDOC option can be enabled to get warnings for
+# functions that are documented, but have no documentation for their parameters
+# or return value. If set to NO (the default) doxygen will only warn about
+# wrong or incomplete parameter documentation, but not about the absence of
+# documentation.
+
+WARN_NO_PARAMDOC = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that
+# doxygen can produce. The string should contain the $file, $line, and $text
+# tags, which will be replaced by the file and line number from which the
+# warning originated and the warning text. Optionally the format may contain
+# $version, which will be replaced by the version of the file (if it could
+# be obtained via FILE_VERSION_FILTER)
+
+WARN_FORMAT = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning
+# and error messages should be written. If left blank the output is written
+# to stderr.
+
+WARN_LOGFILE =
+
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag can be used to specify the files and/or directories that contain
+# documented source files. You may enter file names like "myfile.cpp" or
+# directories like "/usr/src/myproject". Separate the files or directories
+# with spaces.
+
+INPUT =
+
+# This tag can be used to specify the character encoding of the source files
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is
+# also the default input encoding. Doxygen uses libiconv (or the iconv built
+# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for
+# the list of possible encodings.
+
+INPUT_ENCODING = UTF-8
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank the following patterns are tested:
+# *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh
+# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py
+# *.f90 *.f *.for *.vhd *.vhdl
+
+FILE_PATTERNS = *.h *.cpp *.md
+
+# The RECURSIVE tag can be used to turn specify whether or not subdirectories
+# should be searched for input files as well. Possible values are YES and NO.
+# If left blank NO is used.
+
+RECURSIVE = YES
+
+# The EXCLUDE tag can be used to specify files and/or directories that should be
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+# Note that relative paths are relative to the directory from which doxygen is
+# run.
+
+EXCLUDE = configs CONTRIBUTING.md README.md
+
+# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
+# directories that are symbolic links (a Unix file system feature) are excluded
+# from the input.
+
+EXCLUDE_SYMLINKS = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories. Note that the wildcards are matched
+# against the file with absolute path, so to exclude all test directories
+# for example use the pattern */test/*
+
+EXCLUDE_PATTERNS =
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
+# (namespaces, classes, functions, etc.) that should be excluded from the
+# output. The symbol name can be a fully qualified name, a word, or if the
+# wildcard * is used, a substring. Examples: ANamespace, AClass,
+# AClass::ANamespace, ANamespace::*Test
+
+EXCLUDE_SYMBOLS =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or
+# directories that contain example code fragments that are included (see
+# the \include command).
+
+EXAMPLE_PATH =
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank all files are included.
+
+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
+# commands irrespective of the value of the RECURSIVE tag.
+# Possible values are YES and NO. If left blank NO is used.
+
+EXAMPLE_RECURSIVE = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or
+# directories that contain image that are included in the documentation (see
+# the \image command).
+
+IMAGE_PATH =
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command <filter> <input-file>, where <filter>
+# is the value of the INPUT_FILTER tag, and <input-file> is the name of an
+# input file. Doxygen will then use the output that the filter program writes
+# to standard output.
+# If FILTER_PATTERNS is specified, this tag will be ignored.
+# Note that the filter must not add or remove lines; it is applied before the
+# code is scanned, but not when the output code is generated. If lines are added
+# or removed, the anchors will not be placed correctly.
+
+INPUT_FILTER =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis.
+# Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match.
+# The filters are a list of the form:
+# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further
+# info on how filters are used. If FILTER_PATTERNS is empty or if
+# non of the patterns match the file name, INPUT_FILTER is applied.
+
+FILTER_PATTERNS =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will be used to filter the input files when producing source
+# files to browse (i.e. when SOURCE_BROWSER is set to YES).
+
+FILTER_SOURCE_FILES = NO
+
+# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
+# pattern. A pattern will override the setting for FILTER_PATTERN (if any)
+# and it is also possible to disable source filtering for a specific pattern
+# using *.ext= (so without naming a filter). This option only has effect when
+# FILTER_SOURCE_FILES is enabled.
+
+FILTER_SOURCE_PATTERNS =
+
+# If the USE_MD_FILE_AS_MAINPAGE tag refers to the name of a markdown file that
+# is part of the input, its contents will be placed on the main page
+# (index.html). This can be useful if you have a project on for instance GitHub
+# and want reuse the introduction page also for the doxygen output.
+
+USE_MDFILE_AS_MAINPAGE = DOXYGEN_FRONTPAGE.md
+
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will
+# be generated. Documented entities will be cross-referenced with these sources.
+# Note: To get rid of all source code in the generated output, make sure also
+# VERBATIM_HEADERS is set to NO.
+
+SOURCE_BROWSER = YES
+
+# Setting the INLINE_SOURCES tag to YES will include the body
+# of functions and classes directly in the documentation.
+
+INLINE_SOURCES = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
+# doxygen to hide any special comment blocks from generated source code
+# fragments. Normal C, C++ and Fortran comments will always remain visible.
+
+STRIP_CODE_COMMENTS = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES
+# then for each documented function all documented
+# functions referencing it will be listed.
+
+REFERENCED_BY_RELATION = YES
+
+# If the REFERENCES_RELATION tag is set to YES
+# then for each documented function all documented entities
+# called/used by that function will be listed.
+
+REFERENCES_RELATION = YES
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES (the default)
+# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from
+# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will
+# link to the source code.
+# Otherwise they will link to the documentation.
+
+REFERENCES_LINK_SOURCE = 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
+# tagging system (see http://www.gnu.org/software/global/global.html). You
+# will need version 4.8.6 or higher.
+
+USE_HTAGS = NO
+
+# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
+# will generate a verbatim copy of the header file for each class for
+# which an include is specified. Set to NO to disable this.
+
+VERBATIM_HEADERS = YES
+
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index
+# of all compounds will be generated. Enable this if the project
+# contains a lot of classes, structs, unions or interfaces.
+
+ALPHABETICAL_INDEX = NO
+
+# 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
+# in which this list will be split (can be a number in the range [1..20])
+
+COLS_IN_ALPHA_INDEX = 5
+
+# In case all classes in a project start with a common prefix, all
+# classes will be put under the same header in the alphabetical index.
+# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
+# should be ignored while generating the index headers.
+
+IGNORE_PREFIX =
+
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
+# generate HTML output.
+
+GENERATE_HTML = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `html' will be used as the default path.
+
+HTML_OUTPUT = .
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for
+# each generated HTML page (for example: .htm,.php,.asp). If it is left blank
+# doxygen will generate files with .html extension.
+
+HTML_FILE_EXTENSION = .html
+
+# The HTML_HEADER tag can be used to specify a personal HTML header for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard header. Note that when using a custom header you are responsible
+# for the proper inclusion of any scripts and style sheets that doxygen
+# needs, which is dependent on the configuration options used.
+# It is advised to generate a default header using "doxygen -w html
+# header.html footer.html stylesheet.css YourConfigFile" and then modify
+# that header. Note that the header is subject to change so you typically
+# have to redo this when upgrading to a newer version of doxygen or when
+# changing the value of configuration settings such as GENERATE_TREEVIEW!
+
+HTML_HEADER =
+
+# The HTML_FOOTER tag can be used to specify a personal HTML footer for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard footer.
+
+HTML_FOOTER =
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading
+# style sheet that is used by each HTML page. It can be used to
+# fine-tune the look of the HTML output. If left blank doxygen will
+# generate a default style sheet. Note that it is recommended to use
+# HTML_EXTRA_STYLESHEET instead of this one, as it is more robust and this
+# tag will in the future become obsolete.
+
+HTML_STYLESHEET =
+
+# The HTML_EXTRA_STYLESHEET tag can be used to specify an additional
+# user-defined cascading style sheet that is included after the standard
+# style sheets created by doxygen. Using this option one can overrule
+# certain style aspects. This is preferred over using HTML_STYLESHEET
+# since it does not replace the standard style sheet and is therefor more
+# robust against future updates. Doxygen will copy the style sheet file to
+# the output directory.
+
+HTML_EXTRA_STYLESHEET =
+
+# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the HTML output directory. Note
+# that these files will be copied to the base HTML output directory. Use the
+# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
+# files. In the HTML_STYLESHEET file, use the file name only. Also note that
+# the files will be copied as-is; there are no commands or markers available.
+
+HTML_EXTRA_FILES =
+
+# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output.
+# Doxygen will adjust the colors in the style sheet and background images
+# according to this color. Hue is specified as an angle on a colorwheel,
+# see http://en.wikipedia.org/wiki/Hue for more information.
+# For instance the value 0 represents red, 60 is yellow, 120 is green,
+# 180 is cyan, 240 is blue, 300 purple, and 360 is red again.
+# The allowed range is 0 to 359.
+
+HTML_COLORSTYLE_HUE = 220
+
+# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of
+# the colors in the HTML output. For a value of 0 the output will use
+# grayscales only. A value of 255 will produce the most vivid colors.
+
+HTML_COLORSTYLE_SAT = 100
+
+# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to
+# the luminance component of the colors in the HTML output. Values below
+# 100 gradually make the output lighter, whereas values above 100 make
+# the output darker. The value divided by 100 is the actual gamma applied,
+# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2,
+# and 100 does not change the gamma.
+
+HTML_COLORSTYLE_GAMMA = 80
+
+# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
+# page will contain the date and time when the page was generated. Setting
+# this to NO can help when comparing the output of multiple runs.
+
+HTML_TIMESTAMP = YES
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
+# documentation will contain sections that can be hidden and shown after the
+# page has loaded.
+
+HTML_DYNAMIC_SECTIONS = NO
+
+# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of
+# entries shown in the various tree structured indices initially; the user
+# can expand and collapse entries dynamically later on. Doxygen will expand
+# the tree to such a level that at most the specified number of entries are
+# visible (unless a fully collapsed tree already exceeds this amount).
+# So setting the number of entries 1 will produce a full collapsed tree by
+# default. 0 is a special value representing an infinite number of entries
+# and will result in a full expanded tree by default.
+
+HTML_INDEX_NUM_ENTRIES = 100
+
+# If the GENERATE_DOCSET tag is set to YES, additional index files
+# will be generated that can be used as input for Apple's Xcode 3
+# integrated development environment, introduced with OSX 10.5 (Leopard).
+# To create a documentation set, doxygen will generate a Makefile in the
+# HTML output directory. Running make will produce the docset in that
+# directory and running "make install" will install the docset in
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find
+# it at startup.
+# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html
+# for more information.
+
+GENERATE_DOCSET = NO
+
+# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the
+# feed. A documentation feed provides an umbrella under which multiple
+# documentation sets from a single provider (such as a company or product suite)
+# can be grouped.
+
+DOCSET_FEEDNAME = "Doxygen generated docs"
+
+# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that
+# should uniquely identify the documentation set bundle. This should be a
+# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen
+# will append .docset to the name.
+
+DOCSET_BUNDLE_ID = org.doxygen.Project
+
+# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely
+# identify the documentation publisher. This should be a reverse domain-name
+# style string, e.g. com.mycompany.MyDocSet.documentation.
+
+DOCSET_PUBLISHER_ID = org.doxygen.Publisher
+
+# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher.
+
+DOCSET_PUBLISHER_NAME = Publisher
+
+# If the GENERATE_HTMLHELP tag is set to YES, additional index files
+# will be generated that can be used as input for tools like the
+# Microsoft HTML help workshop to generate a compiled HTML help file (.chm)
+# of the generated HTML documentation.
+
+GENERATE_HTMLHELP = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can
+# be used to specify the file name of the resulting .chm file. You
+# can add a path in front of the file if the result should not be
+# written to the html output directory.
+
+CHM_FILE =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can
+# be used to specify the location (absolute path including file name) of
+# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run
+# the HTML help compiler on the generated index.hhp.
+
+HHC_LOCATION =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag
+# controls if a separate .chi index file is generated (YES) or that
+# it should be included in the master .chm file (NO).
+
+GENERATE_CHI = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING
+# is used to encode HtmlHelp index (hhk), content (hhc) and project file
+# content.
+
+CHM_INDEX_ENCODING =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag
+# controls whether a binary table of contents is generated (YES) or a
+# normal table of contents (NO) in the .chm file.
+
+BINARY_TOC = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members
+# to the contents of the HTML help documentation and to the tree view.
+
+TOC_EXPAND = NO
+
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
+# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated
+# that can be used as input for Qt's qhelpgenerator to generate a
+# Qt Compressed Help (.qch) of the generated HTML documentation.
+
+GENERATE_QHP = NO
+
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can
+# be used to specify the file name of the resulting .qch file.
+# The path specified is relative to the HTML output folder.
+
+QCH_FILE =
+
+# The QHP_NAMESPACE tag specifies the namespace to use when generating
+# Qt Help Project output. For more information please see
+# http://doc.trolltech.com/qthelpproject.html#namespace
+
+QHP_NAMESPACE = org.doxygen.Project
+
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating
+# Qt Help Project output. For more information please see
+# http://doc.trolltech.com/qthelpproject.html#virtual-folders
+
+QHP_VIRTUAL_FOLDER = doc
+
+# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to
+# add. For more information please see
+# http://doc.trolltech.com/qthelpproject.html#custom-filters
+
+QHP_CUST_FILTER_NAME =
+
+# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the
+# custom filter to add. For more information please see
+# <a href="http://doc.trolltech.com/qthelpproject.html#custom-filters">
+# Qt Help Project / Custom Filters</a>.
+
+QHP_CUST_FILTER_ATTRS =
+
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
+# project's
+# filter section matches.
+# <a href="http://doc.trolltech.com/qthelpproject.html#filter-attributes">
+# Qt Help Project / Filter Attributes</a>.
+
+QHP_SECT_FILTER_ATTRS =
+
+# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can
+# be used to specify the location of Qt's qhelpgenerator.
+# If non-empty doxygen will try to run qhelpgenerator on the generated
+# .qhp file.
+
+QHG_LOCATION =
+
+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files
+# will be generated, which together with the HTML files, form an Eclipse help
+# plugin. To install this plugin and make it available under the help contents
+# menu in Eclipse, the contents of the directory containing the HTML and XML
+# files needs to be copied into the plugins directory of eclipse. The name of
+# the directory within the plugins directory should be the same as
+# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before
+# the help appears.
+
+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.
+
+ECLIPSE_DOC_ID = org.doxygen.Project
+
+# The DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs)
+# at top of each HTML page. The value NO (the default) enables the index and
+# the value YES disables it. Since the tabs have the same information as the
+# navigation tree you can set this option to NO if you already set
+# GENERATE_TREEVIEW to YES.
+
+DISABLE_INDEX = NO
+
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
+# structure should be generated to display hierarchical information.
+# If the tag value is set to YES, a side panel will be generated
+# containing a tree-like index structure (just like the one that
+# is generated for HTML Help). For this to work a browser that supports
+# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser).
+# Windows users are probably better off using the HTML help feature.
+# Since the tree basically has the same information as the tab index you
+# could consider to set DISABLE_INDEX to NO when enabling this option.
+
+GENERATE_TREEVIEW = NO
+
+# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values
+# (range [0,1..20]) that doxygen will group on one line in the generated HTML
+# documentation. Note that a value of 0 will completely suppress the enum
+# values from appearing in the overview section.
+
+ENUM_VALUES_PER_LINE = 4
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
+# used to set the initial width (in pixels) of the frame in which the tree
+# is shown.
+
+TREEVIEW_WIDTH = 250
+
+# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open
+# links to external symbols imported via tag files in a separate window.
+
+EXT_LINKS_IN_WINDOW = NO
+
+# Use this tag to change the font size of Latex formulas included
+# as images in the HTML documentation. The default is 10. Note that
+# when you change the font size after a successful doxygen run you need
+# to manually remove any form_*.png images from the HTML output directory
+# to force them to be regenerated.
+
+FORMULA_FONTSIZE = 10
+
+# Use the FORMULA_TRANPARENT tag to determine whether or not the images
+# generated for formulas are transparent PNGs. Transparent PNGs are
+# not supported properly for IE 6.0, but are supported on all modern browsers.
+# Note that when changing this option you need to delete any form_*.png files
+# in the HTML output before the changes have effect.
+
+FORMULA_TRANSPARENT = YES
+
+# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax
+# (see http://www.mathjax.org) which uses client side Javascript for the
+# rendering instead of using prerendered bitmaps. Use this if you do not
+# have LaTeX installed or if you want to formulas look prettier in the HTML
+# output. When enabled you may also need to install MathJax separately and
+# configure the path to it using the MATHJAX_RELPATH option.
+
+USE_MATHJAX = NO
+
+# When MathJax is enabled you can set the default output format to be used for
+# the MathJax output. Supported types are HTML-CSS, NativeMML (i.e. MathML) and
+# SVG. The default value is HTML-CSS, which is slower, but has the best
+# compatibility.
+
+MATHJAX_FORMAT = HTML-CSS
+
+# When MathJax is enabled you need to specify the location relative to the
+# HTML output directory using the MATHJAX_RELPATH option. The destination
+# directory should contain the MathJax.js script. For instance, if the mathjax
+# directory is located at the same level as the HTML output directory, then
+# MATHJAX_RELPATH should be ../mathjax. The default value points to
+# the MathJax Content Delivery Network so you can quickly see the result without
+# installing MathJax.
+# However, it is strongly recommended to install a local
+# copy of MathJax from http://www.mathjax.org before deployment.
+
+MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest
+
+# The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension
+# names that should be enabled during MathJax rendering.
+
+MATHJAX_EXTENSIONS =
+
+# The MATHJAX_CODEFILE tag can be used to specify a file with javascript
+# pieces of code that will be used on startup of the MathJax code.
+
+MATHJAX_CODEFILE =
+
+# When the SEARCHENGINE tag is enabled doxygen will generate a search box
+# for the HTML output. The underlying search engine uses javascript
+# and DHTML and should work on any modern browser. Note that when using
+# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets
+# (GENERATE_DOCSET) there is already a search function so this one should
+# 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
+
+# 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.
+# There are two flavours of web server based search depending on the
+# EXTERNAL_SEARCH setting. When disabled, doxygen will generate a PHP script for
+# searching and an index file used by the script. When EXTERNAL_SEARCH is
+# enabled the indexing and searching needs to be provided by external tools.
+# See the manual for details.
+
+SERVER_BASED_SEARCH = NO
+
+# When EXTERNAL_SEARCH is enabled doxygen will no longer generate the PHP
+# script for searching. Instead the search results are written to an XML file
+# which needs to be processed by an external indexer. Doxygen will invoke an
+# external search engine pointed to by the SEARCHENGINE_URL option to obtain
+# the search results. Doxygen ships with an example indexer (doxyindexer) and
+# search engine (doxysearch.cgi) which are based on the open source search
+# engine library Xapian. See the manual for configuration details.
+
+EXTERNAL_SEARCH = NO
+
+# The SEARCHENGINE_URL should point to a search engine hosted by a web server
+# which will returned the search results when EXTERNAL_SEARCH is enabled.
+# Doxygen ships with an example search engine (doxysearch) which is based on
+# the open source search engine library Xapian. See the manual for configuration
+# details.
+
+SEARCHENGINE_URL =
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed
+# search data is written to a file for indexing by an external tool. With the
+# SEARCHDATA_FILE tag the name of this file can be specified.
+
+SEARCHDATA_FILE = searchdata.xml
+
+# 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.
+
+EXTERNAL_SEARCH_ID =
+
+# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen
+# projects other than the one defined by this configuration file, but that are
+# all added to the same external search index. Each project needs to have a
+# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id
+# of to a relative location where the documentation can be found.
+# The format is: EXTRA_SEARCH_MAPPINGS = id1=loc1 id2=loc2 ...
+
+EXTRA_SEARCH_MAPPINGS =
+
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
+# generate Latex output.
+
+GENERATE_LATEX = NO
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `latex' will be used as the default path.
+
+LATEX_OUTPUT = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked. If left blank `latex' will be used as the default command name.
+# Note that when enabling USE_PDFLATEX this option is only used for
+# generating bitmaps for formulas in the HTML output, but not in the
+# Makefile that is written to the output directory.
+
+LATEX_CMD_NAME = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to
+# generate index for LaTeX. If left blank `makeindex' will be used as the
+# default command name.
+
+MAKEINDEX_CMD_NAME = makeindex
+
+# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
+# LaTeX documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_LATEX = YES
+
+# The PAPER_TYPE tag can be used to set the paper type that is used
+# by the printer. Possible values are: a4, letter, legal and
+# executive. If left blank a4 will be used.
+
+PAPER_TYPE = a4wide
+
+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
+# packages that should be included in the LaTeX output.
+
+EXTRA_PACKAGES =
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
+# the generated latex document. The header should contain everything until
+# the first chapter. If it is left blank doxygen will generate a
+# standard header. Notice: only use this tag if you know what you are doing!
+
+LATEX_HEADER =
+
+# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for
+# the generated latex document. The footer should contain everything after
+# the last chapter. If it is left blank doxygen will generate a
+# standard footer. Notice: only use this tag if you know what you are doing!
+
+LATEX_FOOTER =
+
+# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images
+# or other source files which should be copied to the LaTeX output directory.
+# Note that the files will be copied as-is; there are no commands or markers
+# available.
+
+LATEX_EXTRA_FILES =
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
+# is prepared for conversion to pdf (using ps2pdf). The pdf file will
+# contain links (just like the HTML output) instead of page references
+# This makes the output suitable for online browsing using a pdf viewer.
+
+PDF_HYPERLINKS = YES
+
+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
+# plain latex in the generated Makefile. Set this option to YES to get a
+# higher quality PDF documentation.
+
+USE_PDFLATEX = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
+# command to the generated LaTeX files. This will instruct LaTeX to keep
+# running if errors occur, instead of asking the user for help.
+# This option is also used when generating formulas in HTML.
+
+LATEX_BATCHMODE = NO
+
+# If LATEX_HIDE_INDICES is set to YES then doxygen will not
+# include the index chapters (such as File Index, Compound Index, etc.)
+# in the output.
+
+LATEX_HIDE_INDICES = NO
+
+# If LATEX_SOURCE_CODE is set to YES then doxygen will include
+# source code with syntax highlighting in the LaTeX output.
+# Note that which sources are shown also depends on other settings
+# such as SOURCE_BROWSER.
+
+LATEX_SOURCE_CODE = NO
+
+# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
+# bibliography, e.g. plainnat, or ieeetr. The default style is "plain". See
+# http://en.wikipedia.org/wiki/BibTeX for more info.
+
+LATEX_BIB_STYLE = plain
+
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
+# The RTF output is optimized for Word 97 and may not look very pretty with
+# other RTF readers or editors.
+
+GENERATE_RTF = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `rtf' will be used as the default path.
+
+RTF_OUTPUT = rtf
+
+# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
+# RTF documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_RTF = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
+# will contain hyperlink fields. The RTF file will
+# contain links (just like the HTML output) instead of page references.
+# This makes the output suitable for online browsing using WORD or other
+# programs which support those fields.
+# Note: wordpad (write) and others do not support links.
+
+RTF_HYPERLINKS = NO
+
+# Load style sheet definitions from file. Syntax is similar to doxygen's
+# config file, i.e. a series of assignments. You only have to provide
+# replacements, missing definitions are set to their default value.
+
+RTF_STYLESHEET_FILE =
+
+# Set optional variables used in the generation of an rtf document.
+# Syntax is similar to doxygen's config file.
+
+RTF_EXTENSIONS_FILE =
+
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
+# generate man pages
+
+GENERATE_MAN = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `man' will be used as the default path.
+
+MAN_OUTPUT = man
+
+# The MAN_EXTENSION tag determines the extension that is added to
+# the generated man pages (default is the subroutine's section .3)
+
+MAN_EXTENSION = .3
+
+# If the MAN_LINKS tag is set to YES and Doxygen generates man output,
+# then it will generate one additional man file for each entity
+# documented in the real man page(s). These additional files
+# only source the real man page, but without them the man command
+# would be unable to find the correct page. The default is NO.
+
+MAN_LINKS = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES Doxygen will
+# generate an XML file that captures the structure of
+# the code including all documentation.
+
+GENERATE_XML = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `xml' will be used as the default path.
+
+XML_OUTPUT = xml
+
+# The XML_SCHEMA tag can be used to specify an XML schema,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_SCHEMA =
+
+# The XML_DTD tag can be used to specify an XML DTD,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_DTD =
+
+# If the XML_PROGRAMLISTING tag is set to YES Doxygen will
+# dump the program listings (including syntax highlighting
+# and cross-referencing information) to the XML output. Note that
+# enabling this will significantly increase the size of the XML output.
+
+XML_PROGRAMLISTING = YES
+
+#---------------------------------------------------------------------------
+# configuration options related to the DOCBOOK output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_DOCBOOK tag is set to YES Doxygen will generate DOCBOOK files
+# that can be used to generate PDF.
+
+GENERATE_DOCBOOK = NO
+
+# The DOCBOOK_OUTPUT tag is used to specify where the DOCBOOK pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in
+# front of it. If left blank docbook will be used as the default path.
+
+DOCBOOK_OUTPUT = docbook
+
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will
+# generate an AutoGen Definitions (see autogen.sf.net) file
+# that captures the structure of the code including all
+# documentation. Note that this feature is still experimental
+# and incomplete at the moment.
+
+GENERATE_AUTOGEN_DEF = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES Doxygen will
+# generate a Perl module file that captures the structure of
+# the code including all documentation. Note that this
+# feature is still experimental and incomplete at the
+# moment.
+
+GENERATE_PERLMOD = NO
+
+# If the PERLMOD_LATEX tag is set to YES Doxygen will generate
+# the necessary Makefile rules, Perl scripts and LaTeX code to be able
+# to generate PDF and DVI output from the Perl module output.
+
+PERLMOD_LATEX = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be
+# nicely formatted so it can be parsed by a human reader.
+# This is useful
+# if you want to understand what is going on.
+# On the other hand, if this
+# tag is set to NO the size of the Perl module output will be much smaller
+# and Perl will parse it just the same.
+
+PERLMOD_PRETTY = YES
+
+# The names of the make variables in the generated doxyrules.make file
+# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.
+# This is useful so different doxyrules.make files included by the same
+# Makefile don't overwrite each other's variables.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
+# evaluate all C-preprocessor directives found in the sources and include
+# files.
+
+ENABLE_PREPROCESSING = YES
+
+# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
+# names in the source code. If set to NO (the default) only conditional
+# compilation will be performed. Macro expansion can be done in a controlled
+# way by setting EXPAND_ONLY_PREDEF to YES.
+
+MACRO_EXPANSION = NO
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
+# then the macro expansion is limited to the macros specified with the
+# PREDEFINED and EXPAND_AS_DEFINED tags.
+
+EXPAND_ONLY_PREDEF = NO
+
+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
+# pointed to by INCLUDE_PATH will be searched when a #include is found.
+
+SEARCH_INCLUDES = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by
+# the preprocessor.
+
+INCLUDE_PATH =
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will
+# be used.
+
+INCLUDE_FILE_PATTERNS =
+
+# The PREDEFINED tag can be used to specify one or more macro names that
+# are defined before the preprocessor is started (similar to the -D option of
+# gcc). The argument of the tag is a list of macros of the form: name
+# or name=definition (no spaces). If the definition and the = are
+# omitted =1 is assumed. To prevent a macro definition from being
+# undefined via #undef or recursively expanded use the := operator
+# instead of the = operator.
+
+PREDEFINED = TARGET_NRF51822
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
+# this tag can be used to specify a list of macro names that should be expanded.
+# The macro definition that is found in the sources will be used.
+# Use the PREDEFINED tag if you want to use a different macro definition that
+# overrules the definition found in the source code.
+
+EXPAND_AS_DEFINED =
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
+# doxygen's preprocessor will remove all references to function-like macros
+# that are alone on a line, have an all uppercase name, and do not end with a
+# semicolon, because these will confuse the parser if not removed.
+
+SKIP_FUNCTION_MACROS = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES option can be used to specify one or more tagfiles. For each
+# tag file the location of the external documentation should be added. The
+# format of a tag file without this location is as follows:
+#
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+#
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where "loc1" and "loc2" can be relative or absolute paths
+# or URLs. Note that each tag file must have a unique name (where the name does
+# NOT include the path). If a tag file is not located in the directory in which
+# doxygen is run, you must also specify the path to the tagfile here.
+
+TAGFILES =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create
+# a tag file that is based on the input files it reads.
+
+GENERATE_TAGFILE =
+
+# If the ALLEXTERNALS tag is set to YES all external classes will be listed
+# in the class index. If set to NO only the inherited external classes
+# will be listed.
+
+ALLEXTERNALS = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will
+# be listed.
+
+EXTERNAL_GROUPS = YES
+
+# If the EXTERNAL_PAGES tag is set to YES all external pages will be listed
+# in the related pages index. If set to NO, only the current project's
+# pages will be listed.
+
+EXTERNAL_PAGES = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of `which perl').
+
+PERL_PATH = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
+# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base
+# or super classes. Setting the tag to NO turns the diagrams off. Note that
+# 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
+
+# You can define message sequence charts within doxygen comments using the \msc
+# command. Doxygen will then run the mscgen tool (see
+# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the
+# documentation. The MSCGEN_PATH tag allows you to specify the directory where
+# the mscgen tool resides. If left empty the tool is assumed to be found in the
+# default search path.
+
+MSCGEN_PATH =
+
+# If set to YES, the inheritance and collaboration graphs will hide
+# inheritance and usage relations if the target is undocumented
+# or is not a class.
+
+HIDE_UNDOC_RELATIONS = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz, a graph visualization
+# toolkit from AT&T and Lucent Bell Labs. The other options in this section
+# have no effect if this option is set to NO (the default)
+
+HAVE_DOT = YES
+
+# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is
+# allowed to run in parallel. When set to 0 (the default) doxygen will
+# base this on the number of processors available in the system. You can set it
+# explicitly to a value larger than 0 to get control over the balance
+# between CPU load and processing speed.
+
+DOT_NUM_THREADS = 0
+
+# By default doxygen will use the Helvetica font for all dot files that
+# doxygen generates. When you want a differently looking font you can specify
+# the font name using DOT_FONTNAME. You need to make sure dot is able to find
+# the font, which can be done by putting it in a standard location or by setting
+# the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the
+# directory containing the font.
+
+DOT_FONTNAME = Helvetica
+
+# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs.
+# The default size is 10pt.
+
+DOT_FONTSIZE = 10
+
+# By default doxygen will tell dot to use the Helvetica font.
+# If you specify a different font using DOT_FONTNAME you can use DOT_FONTPATH to
+# set the path where dot can find it.
+
+DOT_FONTPATH =
+
+# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect inheritance relations. Setting this tag to YES will force the
+# CLASS_DIAGRAMS tag to NO.
+
+CLASS_GRAPH = YES
+
+# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect implementation dependencies (inheritance, containment, and
+# class references variables) of the class with other documented classes.
+
+COLLABORATION_GRAPH = YES
+
+# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for groups, showing the direct groups dependencies
+
+GROUP_GRAPHS = YES
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+
+UML_LOOK = NO
+
+# If the UML_LOOK tag is enabled, the fields and methods are shown inside
+# the class node. If there are many fields or methods and many nodes the
+# graph may become too big to be useful. The UML_LIMIT_NUM_FIELDS
+# threshold limits the number of items for each type to make the size more
+# manageable. Set this to 0 for no limit. Note that the threshold may be
+# exceeded by 50% before the limit is enforced.
+
+UML_LIMIT_NUM_FIELDS = 10
+
+# If set to YES, the inheritance and collaboration graphs will show the
+# relations between templates and their instances.
+
+TEMPLATE_RELATIONS = NO
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT
+# tags are set to YES then doxygen will generate a graph for each documented
+# file showing the direct and indirect include dependencies of the file with
+# other documented files.
+
+INCLUDE_GRAPH = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and
+# HAVE_DOT tags are set to YES then doxygen will generate a graph for each
+# documented header file showing the documented files that directly or
+# indirectly include this file.
+
+INCLUDED_BY_GRAPH = YES
+
+# If the CALL_GRAPH and HAVE_DOT options are set to YES then
+# doxygen will generate a call dependency graph for every global function
+# or class method. Note that enabling this option will significantly increase
+# the time of a run. So in most cases it will be better to enable call graphs
+# for selected functions only using the \callgraph command.
+
+CALL_GRAPH = NO
+
+# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then
+# doxygen will generate a caller dependency graph for every global function
+# or class method. Note that enabling this option will significantly increase
+# the time of a run. So in most cases it will be better to enable caller
+# graphs for selected functions only using the \callergraph command.
+
+CALLER_GRAPH = NO
+
+# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
+# will generate a graphical hierarchy of all classes instead of a textual one.
+
+GRAPHICAL_HIERARCHY = YES
+
+# If the DIRECTORY_GRAPH and HAVE_DOT tags are set to YES
+# then doxygen will show the dependencies a directory has on other directories
+# in a graphical way. The dependency relations are determined by the #include
+# relations between the files in the directories.
+
+DIRECTORY_GRAPH = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot. Possible values are svg, png, jpg, or gif.
+# If left blank png will be used. If you choose svg you need to set
+# HTML_FILE_EXTENSION to xhtml in order to make the SVG files
+# visible in IE 9+ (other browsers do not have this requirement).
+
+DOT_IMAGE_FORMAT = png
+
+# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
+# enable generation of interactive SVG images that allow zooming and panning.
+# Note that this requires a modern browser other than Internet Explorer.
+# Tested and working are Firefox, Chrome, Safari, and Opera. For IE 9+ you
+# need to set HTML_FILE_EXTENSION to xhtml in order to make the SVG files
+# visible. Older versions of IE do not have SVG support.
+
+INTERACTIVE_SVG = NO
+
+# The tag DOT_PATH can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found in the path.
+
+DOT_PATH =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the
+# \dotfile command).
+
+DOTFILE_DIRS =
+
+# The MSCFILE_DIRS tag can be used to specify one or more directories that
+# contain msc files that are included in the documentation (see the
+# \mscfile command).
+
+MSCFILE_DIRS =
+
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of
+# nodes that will be shown in the graph. If the number of nodes in a graph
+# becomes larger than this value, doxygen will truncate the graph, which is
+# visualized by representing a node as a red box. Note that doxygen if the
+# number of direct children of the root node in a graph is already larger than
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note
+# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+
+DOT_GRAPH_MAX_NODES = 200
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the
+# graphs generated by dot. A depth value of 3 means that only nodes reachable
+# from the root by following a path via at most 3 edges will be shown. Nodes
+# that lay further from the root node will be omitted. Note that setting this
+# option to 1 or 2 may greatly reduce the computation time needed for large
+# code bases. Also note that the size of a graph can be further restricted by
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+
+MAX_DOT_GRAPH_DEPTH = 1000
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, because dot on Windows does not
+# seem to support this out of the box. Warning: Depending on the platform used,
+# enabling this option may lead to badly anti-aliased labels on the edges of
+# a graph (i.e. they become hard to read).
+
+DOT_TRANSPARENT = YES
+
+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10)
+# support this, this feature is disabled by default.
+
+DOT_MULTI_TARGETS = NO
+
+# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
+# generate a legend page explaining the meaning of the various boxes and
+# arrows in the dot generated graphs.
+
+GENERATE_LEGEND = YES
+
+# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will
+# remove the intermediate dot files that are used to generate
+# the various graphs.
+
DOT_CLEANUP = YES
\ No newline at end of file
--- a/ble/BLE.h Tue Jan 12 19:47:52 2016 +0000
+++ b/ble/BLE.h Wed Apr 06 19:13:46 2016 +0100
@@ -1,1444 +1,1444 @@
-/* mbed Microcontroller Library
- * Copyright (c) 2006-2013 ARM Limited
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __BLE_H__
-#define __BLE_H__
-
-#include "blecommon.h"
-#include "Gap.h"
-#include "GattServer.h"
-#include "GattClient.h"
-
-#include "ble/FunctionPointerWithContext.h"
-
-#ifdef YOTTA_CFG_MBED_OS
-#include "mbed-drivers/mbed_error.h"
-#else
-#include "mbed_error.h"
-#endif
-
-/* Forward declaration for the implementation class */
-class BLEInstanceBase;
-
-/**
- * The base class used to abstract away BLE-capable radio transceivers or SOCs,
- * so that the BLE API can work with any radio transparently.
- */
-class BLE
-{
-public:
- typedef unsigned InstanceID_t; /** The type returned by BLE::getInstanceID(). */
-
- /**
- * The context provided to init-completion-callbacks (see init() below).
- *
- * @param ble
- * A reference to the BLE instance being initialized.
- * @param error
- * Captures the result of initialization. It is set to
- * BLE_ERROR_NONE if initialization completed successfully. Else
- * the error value is implementation specific.
- */
- struct InitializationCompleteCallbackContext {
- BLE& ble; /* Reference to the BLE object that has been initialized */
- ble_error_t error; /* Error status of the initialization. It is set to BLE_ERROR_NONE if initialization completed successfully. */
- };
-
- /**
- * The signature for function-pointer like callbacks for initialization-completion.
- *
- * @note There are two versions of init(). In addition to the simple
- * function-pointer, init() can also take a <Object, member> tuple as its
- * callback target. In case of the latter, the following declaration doesn't apply.
- */
- typedef void (*InitializationCompleteCallback_t)(InitializationCompleteCallbackContext *context);
-
- /**
- * Initialize the BLE controller. This should be called before using
- * anything else in the BLE_API.
- *
- * init() hands control to the underlying BLE module to accomplish
- * initialization. This initialization may tacitly depend on other hardware
- * setup (such as clocks or power-modes) that happens early on during
- * system startup. It may not be safe to call init() from a global static
- * context where ordering is compiler-specific and can't be guaranteed - it
- * is safe to call BLE::init() from within main().
- *
- * @param initCompleteCallback
- * A callback for when initialization completes for a BLE
- * instance. This is an optional parameter; if no callback is
- * set up the application can still determine the status of
- * initialization using BLE::hasInitialized() (see below).
- *
- * @return BLE_ERROR_NONE if the initialization procedure was started
- * successfully.
- *
- * @note If init() returns BLE_ERROR_NONE, the underlying stack must invoke
- * the initialization completion callback at some point.
- *
- * @note In some cases, initialization is instantaneous (or blocking); if
- * so, it is acceptable for the stack-specific implementation of init()
- * to invoke the completion callback directly (within its own
- * context).
- *
- * @note Nearly all BLE APIs would return
- * BLE_ERROR_INITIALIZATION_INCOMPLETE if used on an instance before the
- * corresponding transport is initialized.
- *
- * @note There are two versions of init(). In addition to the simple
- * function-pointer, init() can also take an <Object, member> tuple as its
- * callback target.
- */
- ble_error_t init(InitializationCompleteCallback_t initCompleteCallback = NULL) {
- FunctionPointerWithContext<InitializationCompleteCallbackContext *> callback(initCompleteCallback);
- return initImplementation(callback);
- }
-
- /**
- * An alternate declaration for init(). This one takes an <Object, member> tuple as its
- * callback target.
- */
- template<typename T>
- ble_error_t init(T *object, void (T::*initCompleteCallback)(InitializationCompleteCallbackContext *context)) {
- FunctionPointerWithContext<InitializationCompleteCallbackContext *> callback(object, initCompleteCallback);
- return initImplementation(callback);
- }
-
- /**
- * @return true if initialization has completed for the underlying BLE
- * transport.
- *
- * The application can set up a callback to signal completion of
- * initialization when using init(). Otherwise, this method can be used to
- * poll the state of initialization.
- */
- bool hasInitialized(void) const;
-
- /**
- * Purge the BLE stack of GATT and GAP state. init() must be called
- * afterwards to re-instate services and GAP state. This API offers a way to
- * repopulate the GATT database with new services and characteristics.
- */
- ble_error_t shutdown(void);
-
- /**
- * This call allows the application to get the BLE stack version information.
- *
- * @return A pointer to a const string representing the version.
- * Note: The string is owned by BLE_API.
- */
- const char *getVersion(void);
-
- /*
- * Accessors to GAP. Please refer to Gap.h. All GAP related functionality requires
- * going through this accessor.
- */
- const Gap &gap() const;
- Gap &gap();
-
- /*
- * Accessors to GATT Server. Please refer to GattServer.h. All GATTServer related
- * functionality requires going through this accessor.
- */
- const GattServer& gattServer() const;
- GattServer& gattServer();
-
- /*
- * Accessors to GATT Client. Please refer to GattClient.h. All GATTClient related
- * functionality requires going through this accessor.
- */
- const GattClient& gattClient() const;
- GattClient& gattClient();
-
- /*
- * Accessors to Security Manager. Please refer to SecurityManager.h. All
- * SecurityManager related functionality requires going through this
- * accessor.
- */
- const SecurityManager& securityManager() const;
- SecurityManager& securityManager();
-
- /**
- * Yield control to the BLE stack or to other tasks waiting for events. This
- * is a sleep function that will return when there is an application-specific
- * interrupt, but the MCU might wake up several times before
- * returning (to service the stack). This is not always interchangeable with
- * WFE().
- */
- void waitForEvent(void);
-
-public:
- static const InstanceID_t DEFAULT_INSTANCE = 0;
-#ifndef YOTTA_CFG_BLE_INSTANCES_COUNT
- static const InstanceID_t NUM_INSTANCES = 1;
-#else
- static const InstanceID_t NUM_INSTANCES = YOTTA_CFG_BLE_INSTANCES_COUNT;
-#endif
-
- /**
- * Get a reference to the BLE singleton corresponding to a given interface.
- * There is a static array of BLE singletons.
- *
- * @Note: Calling Instance() is preferred over constructing a BLE object
- * directly, as it returns references to singletons.
- *
- * @param[in] id
- * Instance-ID. This should be less than NUM_INSTANCES
- * for the returned BLE singleton to be useful.
- *
- * @return a reference to a single object.
- */
- static BLE &Instance(InstanceID_t id = DEFAULT_INSTANCE);
-
- /**
- * Constructor for a handle to a BLE instance (the BLE stack). BLE handles
- * are thin wrappers around a transport object (that is, ptr. to
- * BLEInstanceBase).
- *
- * It is better to create BLE objects as singletons accessed through the
- * Instance() method. If multiple BLE handles are constructed for the same
- * interface (using this constructor), they will share the same underlying
- * transport object.
- */
- BLE(InstanceID_t instanceID = DEFAULT_INSTANCE);
-
- /**
- * Fetch the ID of a BLE instance. Typically there would only be the DEFAULT_INSTANCE.
- */
- InstanceID_t getInstanceID(void) const {
- return instanceID;
- }
-
- /*
- * Deprecation alert!
- * All of the following are deprecated and may be dropped in a future
- * release. Documentation should refer to alternative APIs.
- */
-
- /* GAP specific APIs. */
-public:
- /**
- * Set the BTLE MAC address and type.
- * @return BLE_ERROR_NONE on success.
- *
- * @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.setAddress(...) should be replaced with
- * ble.gap().setAddress(...).
- */
- ble_error_t setAddress(BLEProtocol::AddressType_t type, const BLEProtocol::AddressBytes_t address) {
- return gap().setAddress(type, address);
- }
-
- /**
- * Fetch the BTLE MAC address and type.
- * @return BLE_ERROR_NONE on success.
- *
- * @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.getAddress(...) should be replaced with
- * ble.gap().getAddress(...).
- */
- ble_error_t getAddress(BLEProtocol::AddressType_t *typeP, BLEProtocol::AddressBytes_t address) {
- return gap().getAddress(typeP, address);
- }
-
- /**
- * Set the GAP advertising mode to use for this device.
- *
- * @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.setAdvertisingType(...) should be replaced with
- * ble.gap().setAdvertisingType(...).
- */
- void setAdvertisingType(GapAdvertisingParams::AdvertisingType advType) {
- gap().setAdvertisingType(advType);
- }
-
- /**
- * @param[in] interval
- * Advertising interval in units of milliseconds. Advertising
- * is disabled if interval is 0. If interval is smaller than
- * the minimum supported value, then the minimum supported
- * value is used instead. This minimum value can be discovered
- * using getMinAdvertisingInterval().
- *
- * This field must be set to 0 if connectionMode is equal
- * to ADV_CONNECTABLE_DIRECTED.
- *
- * @note: Decreasing this value allows central devices to detect a
- * 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 be replaced with
- * 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
- * no longer required as the new units are milliseconds. Any application
- * code depending on the old semantics needs to be updated accordingly.
- */
- void setAdvertisingInterval(uint16_t interval) {
- gap().setAdvertisingInterval(interval);
- }
-
- /**
- * @return Minimum Advertising interval in milliseconds.
- *
- * @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.getMinAdvertisingInterval(...) should be replaced with
- * ble.gap().getMinAdvertisingInterval(...).
- */
- uint16_t getMinAdvertisingInterval(void) const {
- return gap().getMinAdvertisingInterval();
- }
-
- /**
- * @return Minimum Advertising interval in milliseconds for non-connectible mode.
- *
- * @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.getMinNonConnectableAdvertisingInterval(...) should be replaced with
- * ble.gap().getMinNonConnectableAdvertisingInterval(...).
- */
- uint16_t getMinNonConnectableAdvertisingInterval(void) const {
- return gap().getMinNonConnectableAdvertisingInterval();
- }
-
- /**
- * @return Maximum Advertising interval in milliseconds.
- *
- * @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.getMaxAdvertisingInterval(...) should be replaced with
- * ble.gap().getMaxAdvertisingInterval(...).
- */
- uint16_t getMaxAdvertisingInterval(void) const {
- return gap().getMaxAdvertisingInterval();
- }
-
- /**
- * @param[in] timeout
- * Advertising timeout (in seconds) between 0x1 and 0x3FFF (1
- * and 16383). Use 0 to disable the advertising timeout.
- *
- * @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.setAdvertisingTimeout(...) should be replaced with
- * ble.gap().setAdvertisingTimeout(...).
- */
- void setAdvertisingTimeout(uint16_t timeout) {
- gap().setAdvertisingTimeout(timeout);
- }
-
- /**
- * Set up a particular, user-constructed set of advertisement parameters for
- * the underlying stack. It would be uncommon for this API to be used
- * directly; there are other APIs to tweak advertisement parameters
- * individually (see above).
- *
- * @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.setAdvertisingParams(...) should be replaced with
- * ble.gap().setAdvertisingParams(...).
- */
- void setAdvertisingParams(const GapAdvertisingParams &advParams) {
- gap().setAdvertisingParams(advParams);
- }
-
- /**
- * @return Read back advertising parameters. Useful for storing and
- * restoring parameters rapidly.
- *
- * @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.getAdvertisingParams(...) should be replaced with
- * ble.gap().getAdvertisingParams(...).
- */
- const GapAdvertisingParams &getAdvertisingParams(void) const {
- return gap().getAdvertisingParams();
- }
-
- /**
- * Accumulate an AD structure in the advertising payload. Please note that
- * the payload is limited to 31 bytes. The SCAN_RESPONSE message may be used
- * as an additional 31 bytes if the advertising payload is too
- * small.
- *
- * @param[in] flags
- * The flags to add. Please refer to
- * GapAdvertisingData::Flags for valid flags. Multiple
- * flags may be specified in combination.
- *
- * @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.accumulateAdvertisingPayload(flags) should be replaced with
- * ble.gap().accumulateAdvertisingPayload(flags).
- */
- ble_error_t accumulateAdvertisingPayload(uint8_t flags) {
- return gap().accumulateAdvertisingPayload(flags);
- }
-
- /**
- * Accumulate an AD structure in the advertising payload. Please note that
- * the payload is limited to 31 bytes. The SCAN_RESPONSE message may be used
- * as an additional 31 bytes if the advertising payload is too
- * small.
- *
- * @param[in] app
- * The appearance of the peripheral.
- *
- * @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.accumulateAdvertisingPayload(appearance) should be replaced with
- * ble.gap().accumulateAdvertisingPayload(appearance).
- */
- ble_error_t accumulateAdvertisingPayload(GapAdvertisingData::Appearance app) {
- return gap().accumulateAdvertisingPayload(app);
- }
-
- /**
- * Accumulate an AD structure in the advertising payload. Please note that
- * the payload is limited to 31 bytes. The SCAN_RESPONSE message may be used
- * as an additional 31 bytes if the advertising payload is too
- * small.
- *
- * @param[in] app
- * The max transmit power to be used by the controller. This
- * is only a hint.
- *
- * @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.accumulateAdvertisingPayloadTxPower(txPower) should be replaced with
- * ble.gap().accumulateAdvertisingPayloadTxPower(txPower).
- */
- ble_error_t accumulateAdvertisingPayloadTxPower(int8_t power) {
- return gap().accumulateAdvertisingPayloadTxPower(power);
- }
-
- /**
- * Accumulate a variable length byte-stream as an AD structure in the
- * advertising payload. Please note that the payload is limited to 31 bytes.
- * The SCAN_RESPONSE message may be used as an additional 31 bytes if the
- * advertising payload is too small.
- *
- * @param type The type that describes the variable length data.
- * @param data Data bytes.
- * @param len Data length.
- *
- * @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.accumulateAdvertisingPayload(...) should be replaced with
- * ble.gap().accumulateAdvertisingPayload(...).
- */
- ble_error_t accumulateAdvertisingPayload(GapAdvertisingData::DataType type, const uint8_t *data, uint8_t len) {
- return gap().accumulateAdvertisingPayload(type, data, len);
- }
-
- /**
- * Setup a particular, user-constructed advertisement payload for the
- * underlying stack. It would be uncommon for this API to be used directly;
- * there are other APIs to build an advertisement payload (see above).
- *
- * @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.setAdvertisingData(...) should be replaced with
- * ble.gap().setAdvertisingPayload(...).
- */
- ble_error_t setAdvertisingData(const GapAdvertisingData &advData) {
- return gap().setAdvertisingPayload(advData);
- }
-
- /**
- * @return Read back advertising data. Useful for storing and
- * restoring payload.
- *
- * @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.getAdvertisingData(...) should be replaced with
- * ble.gap().getAdvertisingPayload()(...).
- */
- const GapAdvertisingData &getAdvertisingData(void) const {
- return gap().getAdvertisingPayload();
- }
-
- /**
- * Reset any advertising payload prepared from prior calls to
- * accumulateAdvertisingPayload(). This automatically propagates the re-
- * initialized advertising payload to the underlying stack.
- *
- * @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.clearAdvertisingPayload(...) should be replaced with
- * ble.gap().clearAdvertisingPayload(...).
- */
- void clearAdvertisingPayload(void) {
- gap().clearAdvertisingPayload();
- }
-
- /**
- * This API is *deprecated* and resolves to a no-operation. It is left here
- * to allow older code to compile. Please avoid using this API in new code.
- * This API will be dropped in a future release.
- *
- * Formerly, it would be used to dynamically reset the accumulated advertising
- * payload and scanResponse; to do this, the application would clear and re-
- * accumulate a new advertising payload (and scanResponse) before using this
- * API. Updates to the underlying advertisement payload now happen
- * implicitly.
- */
- ble_error_t setAdvertisingPayload(void) {
- return BLE_ERROR_NONE;
- }
-
- /**
- * Accumulate a variable length byte-stream as an AD structure in the
- * scanResponse payload.
- *
- * @param[in] type The type that describes the variable length data.
- * @param[in] data Data bytes.
- * @param[in] len Data length.
- *
- * @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.accumulateScanResponse(...) should be replaced with
- * ble.gap().accumulateScanResponse(...).
- */
- ble_error_t accumulateScanResponse(GapAdvertisingData::DataType type, const uint8_t *data, uint8_t len) {
- return gap().accumulateScanResponse(type, data, len);
- }
-
- /**
- * Reset any scan response prepared from prior calls to
- * accumulateScanResponse().
- *
- * @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.clearScanResponse(...) should be replaced with
- * ble.gap().clearScanResponse(...).
- */
- void clearScanResponse(void) {
- gap().clearScanResponse();
- }
-
- /**
- * Start advertising.
- *
- * @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.startAdvertising(...) should be replaced with
- * ble.gap().startAdvertising(...).
- */
- ble_error_t startAdvertising(void) {
- return gap().startAdvertising();
- }
-
- /**
- * Stop advertising.
- *
- * @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.stopAdvertising(...) should be replaced with
- * ble.gap().stopAdvertising(...).
- */
- ble_error_t stopAdvertising(void) {
- return gap().stopAdvertising();
- }
-
- /**
- * Set up parameters for GAP scanning (observer mode).
- * @param[in] interval
- * Scan interval (in milliseconds) [valid values lie between 2.5ms and 10.24s].
- * @param[in] window
- * Scan Window (in milliseconds) [valid values lie between 2.5ms and 10.24s].
- * @param[in] timeout
- * Scan timeout (in seconds) between 0x0001 and 0xFFFF; 0x0000 disables timeout.
- * @param[in] activeScanning
- * Set to True if active-scanning is required. This is used to fetch the
- * scan response from a peer if possible.
- *
- * The scanning window divided by the interval determines the duty cycle for
- * scanning. For example, if the interval is 100ms and the window is 10ms,
- * then the controller will scan for 10 percent of the time. It is possible
- * to have the interval and window set to the same value. In this case,
- * scanning is continuous, with a change of scanning frequency once every
- * interval.
- *
- * Once the scanning parameters have been configured, scanning can be
- * enabled by using startScan().
- *
- * @Note: The scan interval and window are recommendations to the BLE stack.
- *
- * @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.setScanParams(...) should be replaced with
- * ble.gap().setScanParams(...).
- */
- ble_error_t setScanParams(uint16_t interval = GapScanningParams::SCAN_INTERVAL_MAX,
- uint16_t window = GapScanningParams::SCAN_WINDOW_MAX,
- uint16_t timeout = 0,
- bool activeScanning = false) {
- return gap().setScanParams(interval, window, timeout, activeScanning);
- }
-
- /**
- * Set up the scanInterval parameter for GAP scanning (observer mode).
- * @param[in] interval
- * Scan interval (in milliseconds) [valid values lie between 2.5ms and 10.24s].
- *
- * The scanning window divided by the interval determines the duty cycle for
- * scanning. For example, if the interval is 100ms and the window is 10ms,
- * then the controller will scan for 10 percent of the time. It is possible
- * to have the interval and window set to the same value. In this case,
- * scanning is continuous, with a change of scanning frequency once every
- * interval.
- *
- * Once the scanning parameters have been configured, scanning can be
- * enabled by using startScan().
- *
- * @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.setScanInterval(interval) should be replaced with
- * ble.gap().setScanInterval(interval).
- */
- ble_error_t setScanInterval(uint16_t interval) {
- return gap().setScanInterval(interval);
- }
-
- /**
- * Set up the scanWindow parameter for GAP scanning (observer mode).
- * @param[in] window
- * Scan Window (in milliseconds) [valid values lie between 2.5ms and 10.24s].
- *
- * The scanning window divided by the interval determines the duty cycle for
- * scanning. For example, if the interval is 100ms and the window is 10ms,
- * then the controller will scan for 10 percent of the time. It is possible
- * to have the interval and window set to the same value. In this case,
- * scanning is continuous, with a change of scanning frequency once every
- * interval.
- *
- * Once the scanning parameters have been configured, scanning can be
- * enabled by using startScan().
- *
- * @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.setScanWindow(window) should be replaced with
- * ble.gap().setScanWindow(window).
- */
- ble_error_t setScanWindow(uint16_t window) {
- return gap().setScanWindow(window);
- }
-
- /**
- * Set up parameters for GAP scanning (observer mode).
- * @param[in] timeout
- * Scan timeout (in seconds) between 0x0001 and 0xFFFF; 0x0000 disables timeout.
- *
- * The scanning window divided by the interval determines the duty cycle for
- * scanning. For example, if the interval is 100ms and the window is 10ms,
- * then the controller will scan for 10 percent of the time. It is possible
- * to have the interval and window set to the same value. In this case,
- * scanning is continuous, with a change of scanning frequency once every
- * interval.
- *
- * Once the scanning parameters have been configured, scanning can be
- * enabled by using startScan().
- *
- * @Note: The scan interval and window are recommendations to the BLE stack.
- *
- * @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.setScanTimeout(...) should be replaced with
- * ble.gap().setScanTimeout(...).
- */
- ble_error_t setScanTimeout(uint16_t timeout) {
- return gap().setScanTimeout(timeout);
- }
-
- /**
- * Set up parameters for GAP scanning (observer mode).
- * @param[in] activeScanning
- * Set to True if active-scanning is required. This is used to fetch the
- * scan response from a peer if possible.
- *
- * Once the scanning parameters have been configured, scanning can be
- * enabled by using startScan().
- *
- * @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.setActiveScan(...) should be replaced with
- * ble.gap().setActiveScanning(...).
- */
- void setActiveScan(bool activeScanning) {
- gap().setActiveScanning(activeScanning);
- }
-
- /**
- * Start scanning (Observer Procedure) based on the parameters currently in
- * effect.
- *
- * @param[in] callback
- * The application-specific callback to be invoked upon
- * receiving every advertisement report. This can be passed in
- * as NULL, in which case scanning may not be enabled at all.
- *
- * @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.startScan(callback) should be replaced with
- * ble.gap().startScan(callback).
- */
- ble_error_t startScan(void (*callback)(const Gap::AdvertisementCallbackParams_t *params)) {
- return gap().startScan(callback);
- }
-
- /**
- * Same as above, but this takes an (object, method) pair for a callback.
- *
- * @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.startScan(callback) should be replaced with
- * ble.gap().startScan(object, callback).
- */
- template<typename T>
- ble_error_t startScan(T *object, void (T::*memberCallback)(const Gap::AdvertisementCallbackParams_t *params));
-
- /**
- * Stop scanning. The current scanning parameters remain in effect.
- *
- * @retval BLE_ERROR_NONE if successfully stopped scanning procedure.
- *
- * @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.stopScan() should be replaced with
- * ble.gap().stopScan().
- */
- ble_error_t stopScan(void) {
- return gap().stopScan();
- }
-
- /**
- * Create a connection (GAP Link Establishment).
- * @param peerAddr
- * 48-bit address, LSB format.
- * @param peerAddrType
- * Address type of the peer.
- * @param connectionParams
- * Connection parameters.
- * @param scanParams
- * Paramters to use while scanning for the peer.
- * @return BLE_ERROR_NONE if connection establishment procedure is started
- * successfully. The onConnection callback (if set) is invoked upon
- * a connection event.
- *
- * @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.connect(...) should be replaced with
- * ble.gap().connect(...).
- */
- ble_error_t connect(const BLEProtocol::AddressBytes_t peerAddr,
- BLEProtocol::AddressType_t peerAddrType = BLEProtocol::AddressType::RANDOM_STATIC,
- const Gap::ConnectionParams_t *connectionParams = NULL,
- const GapScanningParams *scanParams = NULL) {
- return gap().connect(peerAddr, peerAddrType, connectionParams, scanParams);
- }
-
- /**
- * This call initiates the disconnection procedure, and its completion is
- * communicated to the application with an invocation of the
- * onDisconnection callback.
- *
- * @param[in] connectionHandle
- * @param[in] reason
- * The reason for disconnection; sent back to the peer.
- */
- ble_error_t disconnect(Gap::Handle_t connectionHandle, Gap::DisconnectionReason_t reason) {
- return gap().disconnect(connectionHandle, reason);
- }
-
- /**
- * This call initiates the disconnection procedure, and its completion
- * is communicated to the application with an invocation of the
- * onDisconnection callback.
- *
- * @param reason
- * The reason for disconnection; sent back to the peer.
- *
- * @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.disconnect(reason) should be replaced with
- * ble.gap().disconnect(reason).
- *
- * @note: This version of disconnect() doesn't take a connection handle. It
- * works reliably only for stacks that are limited to a single
- * connection. This API should be considered *deprecated* in favour of the
- * alternative, which takes a connection handle. It will be dropped in the future.
- */
- ble_error_t disconnect(Gap::DisconnectionReason_t reason) {
- return gap().disconnect(reason);
- }
-
- /**
- * Returns the current GAP state of the device using a bitmask that
- * describes whether the device is advertising or connected.
- *
- * @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.getGapState() should be replaced with
- * ble.gap().getState().
- */
- Gap::GapState_t getGapState(void) const {
- return gap().getState();
- }
-
- /**
- * Get the GAP peripheral's preferred connection parameters. These are the
- * defaults that the peripheral would like to have in a connection. The
- * choice of the connection parameters is eventually up to the central.
- *
- * @param[out] params
- * The structure where the parameters will be stored. Memory
- * for this is owned by the caller.
- *
- * @return BLE_ERROR_NONE if the parameters were successfully filled into
- * the given structure pointed to by params.
- *
- * @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.getPreferredConnectionParams() should be replaced with
- * ble.gap().getPreferredConnectionParams().
- */
- ble_error_t getPreferredConnectionParams(Gap::ConnectionParams_t *params) {
- return gap().getPreferredConnectionParams(params);
- }
-
- /**
- * Set the GAP peripheral's preferred connection parameters. These are the
- * defaults that the peripheral would like to have in a connection. The
- * choice of the connection parameters is eventually up to the central.
- *
- * @param[in] params
- * The structure containing the desired parameters.
- *
- * @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.setPreferredConnectionParams() should be replaced with
- * ble.gap().setPreferredConnectionParams().
- */
- ble_error_t setPreferredConnectionParams(const Gap::ConnectionParams_t *params) {
- return gap().setPreferredConnectionParams(params);
- }
-
- /**
- * Update connection parameters while in the peripheral role.
- * @details In the peripheral role, this will send the corresponding L2CAP request to the connected peer and wait for
- * the central to perform the procedure.
- * @param[in] handle
- * Connection Handle
- * @param[in] params
- * Pointer to desired connection parameters. If NULL is provided on a peripheral role,
- * the parameters in the PPCP characteristic of the GAP service will be used instead.
- *
- * @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.updateConnectionParams() should be replaced with
- * ble.gap().updateConnectionParams().
- */
- ble_error_t updateConnectionParams(Gap::Handle_t handle, const Gap::ConnectionParams_t *params) {
- return gap().updateConnectionParams(handle, params);
- }
-
- /**
- * Set the device name characteristic in the GAP service.
- * @param[in] deviceName
- * The new value for the device-name. This is a UTF-8 encoded, <b>NULL-terminated</b> string.
- *
- * @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.setDeviceName() should be replaced with
- * ble.gap().setDeviceName().
- */
- ble_error_t setDeviceName(const uint8_t *deviceName) {
- return gap().setDeviceName(deviceName);
- }
-
- /**
- * Get the value of the device name characteristic in the GAP service.
- * @param[out] deviceName
- * Pointer to an empty buffer where the UTF-8 *non NULL-
- * terminated* string will be placed. Set this
- * value to NULL in order to obtain the deviceName-length
- * from the 'length' parameter.
- *
- * @param[in/out] lengthP
- * (on input) Length of the buffer pointed to by deviceName;
- * (on output) the complete device name length (without the
- * null terminator).
- *
- * @note If the device name is longer than the size of the supplied buffer,
- * length will return the complete device name length, and not the
- * number of bytes actually returned in deviceName. The application may
- * use this information to retry with a suitable buffer size.
- *
- * @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.getDeviceName() should be replaced with
- * ble.gap().getDeviceName().
- */
- ble_error_t getDeviceName(uint8_t *deviceName, unsigned *lengthP) {
- return gap().getDeviceName(deviceName, lengthP);
- }
-
- /**
- * Set the appearance characteristic in the GAP service.
- * @param[in] appearance
- * The new value for the device-appearance.
- *
- * @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.setAppearance() should be replaced with
- * ble.gap().setAppearance().
- */
- ble_error_t setAppearance(GapAdvertisingData::Appearance appearance) {
- return gap().setAppearance(appearance);
- }
-
- /**
- * Get the appearance characteristic in the GAP service.
- * @param[out] appearance
- * The new value for the device-appearance.
- *
- * @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.getAppearance() should be replaced with
- * ble.gap().getAppearance().
- */
- ble_error_t getAppearance(GapAdvertisingData::Appearance *appearanceP) {
- return gap().getAppearance(appearanceP);
- }
-
- /**
- * Set the radio's transmit power.
- * @param[in] txPower Radio transmit power in dBm.
- *
- * @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.setTxPower() should be replaced with
- * ble.gap().setTxPower().
- */
- ble_error_t setTxPower(int8_t txPower) {
- return gap().setTxPower(txPower);
- }
-
- /**
- * Query the underlying stack for permitted arguments for setTxPower().
- *
- * @param[out] valueArrayPP
- * Out parameter to receive the immutable array of Tx values.
- * @param[out] countP
- * Out parameter to receive the array's size.
- *
- * @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.getPermittedTxPowerValues() should be replaced with
- * ble.gap().getPermittedTxPowerValues().
- */
- void getPermittedTxPowerValues(const int8_t **valueArrayPP, size_t *countP) {
- gap().getPermittedTxPowerValues(valueArrayPP, countP);
- }
-
- /**
- * Add a service declaration to the local server ATT table. Also add the
- * characteristics contained within.
- *
- * @note: This API is now *deprecated* and will be dropped in the future.
- * You should use the parallel API from GattServer directly. A former call
- * to ble.addService() should be replaced with
- * ble.gattServer().addService().
- */
- ble_error_t addService(GattService &service) {
- return gattServer().addService(service);
- }
-
- /**
- * Read the value of a characteristic from the local GattServer.
- * @param[in] attributeHandle
- * Attribute handle for the value attribute of the characteristic.
- * @param[out] buffer
- * A buffer to hold the value being read.
- * @param[in/out] lengthP
- * Length of the buffer being supplied. If the attribute
- * value is longer than the size of the supplied buffer,
- * this variable will return the total attribute value length
- * (excluding offset). The application may use this
- * information to allocate a suitable buffer size.
- *
- * @return BLE_ERROR_NONE if a value was read successfully into the buffer.
- *
- * @note: This API is now *deprecated* and will be dropped in the future.
- * You should use the parallel API from GattServer directly. A former call
- * to ble.readCharacteristicValue() should be replaced with
- * ble.gattServer().read().
- */
- ble_error_t readCharacteristicValue(GattAttribute::Handle_t attributeHandle, uint8_t *buffer, uint16_t *lengthP) {
- return gattServer().read(attributeHandle, buffer, lengthP);
- }
-
- /**
- * Read the value of a characteristic from the local GattServer.
- * @param[in] connectionHandle
- * Connection Handle.
- * @param[in] attributeHandle
- * Attribute handle for the value attribute of the characteristic.
- * @param[out] buffer
- * A buffer to hold the value being read.
- * @param[in/out] lengthP
- * Length of the buffer being supplied. If the attribute
- * value is longer than the size of the supplied buffer,
- * this variable will return the total attribute value length
- * (excluding offset). The application may use this
- * information to allocate a suitable buffer size.
- *
- * @return BLE_ERROR_NONE if a value was read successfully into the buffer.
- *
- * @note This API is a version of the above, with an additional connection handle
- * parameter to allow fetches for connection-specific multivalued
- * attributes (such as the CCCDs).
- *
- * @note: This API is now *deprecated* and will be dropped in the future.
- * You should use the parallel API from GattServer directly. A former call
- * to ble.readCharacteristicValue() should be replaced with
- * ble.gattServer().read().
- */
- ble_error_t readCharacteristicValue(Gap::Handle_t connectionHandle, GattAttribute::Handle_t attributeHandle, uint8_t *buffer, uint16_t *lengthP) {
- return gattServer().read(connectionHandle, attributeHandle, buffer, lengthP);
- }
-
- /**
- * Update the value of a characteristic on the local GattServer.
- *
- * @param[in] attributeHandle
- * Handle for the value attribute of the characteristic.
- * @param[in] value
- * A pointer to a buffer holding the new value.
- * @param[in] size
- * Size of the new value (in bytes).
- * @param[in] localOnly
- * Should this update be kept on the local
- * GattServer regardless of the state of the
- * notify/indicate flag in the CCCD for this
- * characteristic? If set to true, no notification
- * or indication is generated.
- *
- * @return BLE_ERROR_NONE if we have successfully set the value of the attribute.
- *
- * @note: This API is now *deprecated* and will be dropped in the future.
- * You should use the parallel API from GattServer directly. A former call
- * to ble.updateCharacteristicValue() should be replaced with
- * ble.gattServer().write().
- */
- ble_error_t updateCharacteristicValue(GattAttribute::Handle_t attributeHandle,
- const uint8_t *value,
- uint16_t size,
- bool localOnly = false) {
- return gattServer().write(attributeHandle, value, size, localOnly);
- }
-
- /**
- * Update the value of a characteristic on the local GattServer. A version
- * of the above, with a connection handle parameter to allow updates
- * for connection-specific multivalued attributes (such as the CCCDs).
- *
- * @param[in] connectionHandle
- * Connection Handle.
- * @param[in] attributeHandle
- * Handle for the value attribute of the Characteristic.
- * @param[in] value
- * A pointer to a buffer holding the new value.
- * @param[in] size
- * Size of the new value (in bytes).
- * @param[in] localOnly
- * Should this update be kept on the local
- * GattServer regardless of the state of the
- * notify/indicate flag in the CCCD for this
- * Characteristic? If set to true, no notification
- * or indication is generated.
- *
- * @return BLE_ERROR_NONE if we have successfully set the value of the attribute.
- *
- * @note: This API is now *deprecated* and will be dropped in the future.
- * You should use the parallel API from GattServer directly. A former call
- * to ble.updateCharacteristicValue() should be replaced with
- * ble.gattServer().write().
- */
- ble_error_t updateCharacteristicValue(Gap::Handle_t connectionHandle,
- GattAttribute::Handle_t attributeHandle,
- const uint8_t *value,
- uint16_t size,
- bool localOnly = false) {
- return gattServer().write(connectionHandle, attributeHandle, value, size, localOnly);
- }
-
- /**
- * Enable the BLE stack's Security Manager. The Security Manager implements
- * the cryptographic algorithms and protocol exchanges that allow two
- * devices to securely exchange data and privately detect each other.
- * Calling this API is a prerequisite for encryption and pairing (bonding).
- *
- * @param[in] enableBonding Allow for bonding.
- * @param[in] requireMITM Require protection against man-in-the-middle attacks.
- * @param[in] iocaps To specify the I/O capabilities of this peripheral,
- * such as availability of a display or keyboard, to
- * support out-of-band exchanges of security data.
- * @param[in] passkey To specify a static passkey.
- *
- * @return BLE_ERROR_NONE on success.
- *
- * @note: This API is now *deprecated* and will be dropped in the future.
- * You should use the parallel API from SecurityManager directly. A former
- * call to ble.initializeSecurity(...) should be replaced with
- * ble.securityManager().init(...).
- */
- ble_error_t initializeSecurity(bool enableBonding = true,
- bool requireMITM = true,
- SecurityManager::SecurityIOCapabilities_t iocaps = SecurityManager::IO_CAPS_NONE,
- const SecurityManager::Passkey_t passkey = NULL) {
- return securityManager().init(enableBonding, requireMITM, iocaps, passkey);
- }
-
- /**
- * Get the security status of a connection.
- *
- * @param[in] connectionHandle Handle to identify the connection.
- * @param[out] securityStatusP Security status.
- *
- * @return BLE_SUCCESS or appropriate error code indicating the reason of failure.
- *
- * @note: This API is now *deprecated* and will be dropped in the future.
- * You should use the parallel API from SecurityManager directly. A former
- * call to ble.getLinkSecurity(...) should be replaced with
- * ble.securityManager().getLinkSecurity(...).
- */
- ble_error_t getLinkSecurity(Gap::Handle_t connectionHandle, SecurityManager::LinkSecurityStatus_t *securityStatusP) {
- return securityManager().getLinkSecurity(connectionHandle, securityStatusP);
- }
-
- /**
- * Delete all peer device context and all related bonding information from
- * the database within the security manager.
- *
- * @retval BLE_ERROR_NONE On success; else returns an error code indicating the reason for the failure.
- * @retval BLE_ERROR_INVALID_STATE If the API is called without module initialization or
- * application registration.
- *
- * @note: This API is now *deprecated* and will be dropped in the future.
- * You should use the parallel API from SecurityManager directly. A former
- * call to ble.purgeAllBondingState() should be replaced with
- * ble.securityManager().purgeAllBondingState().
- */
- ble_error_t purgeAllBondingState(void) {
- return securityManager().purgeAllBondingState();
- }
-
- /**
- * Set up a callback for timeout events. Refer to Gap::TimeoutSource_t for
- * possible event types.
- *
- * @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.onTimeout(callback) should be replaced with
- * ble.gap().onTimeout(callback).
- */
- void onTimeout(Gap::TimeoutEventCallback_t timeoutCallback) {
- gap().onTimeout(timeoutCallback);
- }
-
- /**
- * Set up a callback for connection events. Refer to Gap::ConnectionEventCallback_t.
- *
- * @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.onConnection(callback) should be replaced with
- * ble.gap().onConnection(callback).
- */
- void onConnection(Gap::ConnectionEventCallback_t connectionCallback) {
- gap().onConnection(connectionCallback);
- }
-
- /**
- * Append to a chain of callbacks to be invoked upon GAP disconnection.
- *
- * @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.onDisconnection(callback) should be replaced with
- * ble.gap().onDisconnection(callback).
- */
- void onDisconnection(Gap::DisconnectionEventCallback_t disconnectionCallback) {
- gap().onDisconnection(disconnectionCallback);
- }
-
- template<typename T>
- void onDisconnection(T *tptr, void (T::*mptr)(const Gap::DisconnectionCallbackParams_t*)) {
- gap().onDisconnection(tptr, mptr);
- }
-
- /**
- * Radio Notification is a feature that enables ACTIVE and INACTIVE
- * (nACTIVE) signals from the stack. These notify the application when the
- * radio is in use. The signal is sent using software interrupt.
- *
- * The ACTIVE signal is sent before the radio event starts. The nACTIVE
- * signal is sent at the end of the radio event. These signals can be used
- * by the application programmer to synchronize application logic with radio
- * activity. For example, the ACTIVE signal can be used to shut off external
- * devices to manage peak current drawn during periods when the radio is on,
- * or to trigger sensor data collection for transmission in the radio event.
- *
- * @param callback
- * The application handler to be invoked in response to a radio
- * ACTIVE/INACTIVE event.
- *
- * @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.onRadioNotification(...) should be replaced with
- * ble.gap().onRadioNotification(...).
- */
- void onRadioNotification(void (*callback)(bool)) {
- gap().onRadioNotification(callback);
- }
-
- /**
- * Add a callback for the GATT event DATA_SENT (which is triggered when
- * updates are sent out by GATT in the form of notifications).
- *
- * @Note: It is possible to chain together multiple onDataSent callbacks
- * (potentially from different modules of an application) to receive updates
- * to characteristics.
- *
- * @Note: It is also possible to set up a callback into a member function of
- * some object.
- *
- * @note: This API is now *deprecated* and will be dropped in the future.
- * You should use the parallel API from GattServer directly. A former call
- * to ble.onDataSent(...) should be replaced with
- * ble.gattServer().onDataSent(...).
- */
- void onDataSent(void (*callback)(unsigned count)) {
- gattServer().onDataSent(callback);
- }
- template <typename T> void onDataSent(T * objPtr, void (T::*memberPtr)(unsigned count)) {
- gattServer().onDataSent(objPtr, memberPtr);
- }
-
- /**
- * Set up a callback for when an attribute has its value updated by or at the
- * connected peer. For a peripheral, this callback is triggered when the local
- * GATT server has an attribute updated by a write command from the peer.
- * For a Central, this callback is triggered when a response is received for
- * a write request.
- *
- * @Note: It is possible to chain together multiple onDataWritten callbacks
- * (potentially from different modules of an application) to receive updates
- * to characteristics. Many services, such as DFU and UART, add their own
- * onDataWritten callbacks behind the scenes to trap interesting events.
- *
- * @Note: It is also possible to set up a callback into a member function of
- * some object.
- *
- * @note: This API is now *deprecated* and will be dropped in the future.
- * You should use the parallel API from GattServer directly. A former call
- * to ble.onDataWritten(...) should be replaced with
- * ble.gattServer().onDataWritten(...).
- */
- void onDataWritten(void (*callback)(const GattWriteCallbackParams *eventDataP)) {
- gattServer().onDataWritten(callback);
- }
- template <typename T> void onDataWritten(T * objPtr, void (T::*memberPtr)(const GattWriteCallbackParams *context)) {
- gattServer().onDataWritten(objPtr, memberPtr);
- }
-
- /**
- * Set up a callback to be invoked on the peripheral when an attribute is
- * being read by a remote client.
- *
- * @Note: This functionality may not be available on all underlying stacks.
- * You could use GattCharacteristic::setReadAuthorizationCallback() as an
- * alternative.
- *
- * @Note: It is possible to chain together multiple onDataRead callbacks
- * (potentially from different modules of an application) to receive updates
- * to characteristics. Services may add their own onDataRead callbacks
- * behind the scenes to trap interesting events.
- *
- * @Note: It is also possible to set up a callback into a member function of
- * some object.
- *
- * @return BLE_ERROR_NOT_IMPLEMENTED if this functionality isn't available;
- * else BLE_ERROR_NONE.
- *
- * @note: This API is now *deprecated* and will be dropped in the future.
- * You should use the parallel API from GattServer directly. A former call
- * to ble.onDataRead(...) should be replaced with
- * ble.gattServer().onDataRead(...).
- */
- ble_error_t onDataRead(void (*callback)(const GattReadCallbackParams *eventDataP)) {
- return gattServer().onDataRead(callback);
- }
- template <typename T> ble_error_t onDataRead(T * objPtr, void (T::*memberPtr)(const GattReadCallbackParams *context)) {
- return gattServer().onDataRead(objPtr, memberPtr);
- }
-
- /**
- * Set up a callback for when notifications or indications are enabled for a
- * characteristic on the local GattServer.
- *
- * @note: This API is now *deprecated* and will be dropped in the future.
- * You should use the parallel API from GattServer directly. A former call
- * to ble.onUpdatesEnabled(callback) should be replaced with
- * ble.gattServer().onUpdatesEnabled(callback).
- */
- void onUpdatesEnabled(GattServer::EventCallback_t callback) {
- gattServer().onUpdatesEnabled(callback);
- }
-
- /**
- * Set up a callback for when notifications or indications are disabled for a
- * characteristic on the local GattServer.
- *
- * @note: This API is now *deprecated* and will be dropped in the future.
- * You should use the parallel API from GattServer directly. A former call
- * to ble.onUpdatesEnabled(callback) should be replaced with
- * ble.gattServer().onUpdatesEnabled(callback).
- */
- void onUpdatesDisabled(GattServer::EventCallback_t callback) {
- gattServer().onUpdatesDisabled(callback);
- }
-
- /**
- * Set up a callback for when the GATT server receives a response for an
- * indication event sent previously.
- *
- * @note: This API is now *deprecated* and will be dropped in the future.
- * You should use the parallel API from GattServer directly. A former call
- * to ble.onConfirmationReceived(callback) should be replaced with
- * ble.gattServer().onConfirmationReceived(callback).
- */
- void onConfirmationReceived(GattServer::EventCallback_t callback) {
- gattServer().onConfirmationReceived(callback);
- }
-
- /**
- * Set up a callback for when the security setup procedure (key generation
- * and exchange) for a link has started. This will be skipped for bonded
- * devices. The callback is passed in parameters received from the peer's
- * security request: bool allowBonding, bool requireMITM, and
- * SecurityIOCapabilities_t.
- *
- * @note: This API is now *deprecated* and will be dropped in the future.
- * You should use the parallel API from SecurityManager directly. A former
- * call to ble.onSecuritySetupInitiated(callback) should be replaced with
- * ble.securityManager().onSecuritySetupInitiated(callback).
- */
- void onSecuritySetupInitiated(SecurityManager::SecuritySetupInitiatedCallback_t callback) {
- securityManager().onSecuritySetupInitiated(callback);
- }
-
- /**
- * Set up a callback for when the security setup procedure (key generation
- * and exchange) for a link has completed. This will be skipped for bonded
- * devices. The callback is passed in the success/failure status of the
- * security setup procedure.
- *
- * @note: This API is now *deprecated* and will be dropped in the future.
- * You should use the parallel API from SecurityManager directly. A former
- * call to ble.onSecuritySetupCompleted(callback) should be replaced with
- * ble.securityManager().onSecuritySetupCompleted(callback).
- */
- void onSecuritySetupCompleted(SecurityManager::SecuritySetupCompletedCallback_t callback) {
- securityManager().onSecuritySetupCompleted(callback);
- }
-
- /**
- * Set up a callback for when a link with the peer is secured. For bonded
- * devices, subsequent reconnections with a bonded peer will result only in
- * this callback when the link is secured, and setup procedures will not
- * occur unless the bonding information is either lost or deleted on either
- * or both sides. The callback is passed in a SecurityManager::SecurityMode_t according
- * to the level of security in effect for the secured link.
- *
- * @note: This API is now *deprecated* and will be dropped in the future.
- * You should use the parallel API from SecurityManager directly. A former
- * call to ble.onLinkSecured(callback) should be replaced with
- * ble.securityManager().onLinkSecured(callback).
- */
- void onLinkSecured(SecurityManager::LinkSecuredCallback_t callback) {
- securityManager().onLinkSecured(callback);
- }
-
- /**
- * Set up a callback for successful bonding, meaning that link-specific security
- * context is stored persistently for a peer device.
- *
- * @note: This API is now *deprecated* and will be dropped in the future.
- * You should use the parallel API from SecurityManager directly. A former
- * call to ble.onSecurityContextStored(callback) should be replaced with
- * ble.securityManager().onSecurityContextStored(callback).
- */
- void onSecurityContextStored(SecurityManager::HandleSpecificEvent_t callback) {
- securityManager().onSecurityContextStored(callback);
- }
-
- /**
- * Set up a callback for when the passkey needs to be displayed on a
- * peripheral with DISPLAY capability. This happens when security is
- * configured to prevent Man-In-The-Middle attacks, and the peers need to exchange
- * a passkey (or PIN) to authenticate the connection
- * attempt.
- *
- * @note: This API is now *deprecated* and will be dropped in the future.
- * You should use the parallel API from SecurityManager directly. A former
- * call to ble.onPasskeyDisplay(callback) should be replaced with
- * ble.securityManager().onPasskeyDisplay(callback).
- */
- void onPasskeyDisplay(SecurityManager::PasskeyDisplayCallback_t callback) {
- return securityManager().onPasskeyDisplay(callback);
- }
-
-private:
- /**
- * Implementation of init() [internal to BLE_API].
- *
- * The implementation is separated into a private method because it isn't
- * suitable to be included in the header.
- */
- ble_error_t initImplementation(FunctionPointerWithContext<InitializationCompleteCallbackContext *> callback);
-
-private:
- BLE(const BLE&);
- BLE &operator=(const BLE &);
-
-private:
- InstanceID_t instanceID;
- BLEInstanceBase *transport; /* The device-specific backend */
-};
-
-typedef BLE BLEDevice; /* DEPRECATED. This type alias is retained for the sake of compatibility with older
- * code. Will be dropped at some point soon.*/
-
+/* mbed Microcontroller Library
+ * Copyright (c) 2006-2013 ARM Limited
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __BLE_H__
+#define __BLE_H__
+
+#include "blecommon.h"
+#include "Gap.h"
+#include "GattServer.h"
+#include "GattClient.h"
+
+#include "ble/FunctionPointerWithContext.h"
+
+#ifdef YOTTA_CFG_MBED_OS
+#include "mbed-drivers/mbed_error.h"
+#else
+#include "mbed_error.h"
+#endif
+
+/* Forward declaration for the implementation class */
+class BLEInstanceBase;
+
+/**
+ * The base class used to abstract away BLE-capable radio transceivers or SOCs,
+ * so that the BLE API can work with any radio transparently.
+ */
+class BLE
+{
+public:
+ typedef unsigned InstanceID_t; /** The type returned by BLE::getInstanceID(). */
+
+ /**
+ * The context provided to init-completion-callbacks (see init() below).
+ *
+ * @param ble
+ * A reference to the BLE instance being initialized.
+ * @param error
+ * Captures the result of initialization. It is set to
+ * BLE_ERROR_NONE if initialization completed successfully. Else
+ * the error value is implementation specific.
+ */
+ struct InitializationCompleteCallbackContext {
+ BLE& ble; /* Reference to the BLE object that has been initialized */
+ ble_error_t error; /* Error status of the initialization. It is set to BLE_ERROR_NONE if initialization completed successfully. */
+ };
+
+ /**
+ * The signature for function-pointer like callbacks for initialization-completion.
+ *
+ * @note There are two versions of init(). In addition to the simple
+ * function-pointer, init() can also take a <Object, member> tuple as its
+ * callback target. In case of the latter, the following declaration doesn't apply.
+ */
+ typedef void (*InitializationCompleteCallback_t)(InitializationCompleteCallbackContext *context);
+
+ /**
+ * Initialize the BLE controller. This should be called before using
+ * anything else in the BLE_API.
+ *
+ * init() hands control to the underlying BLE module to accomplish
+ * initialization. This initialization may tacitly depend on other hardware
+ * setup (such as clocks or power-modes) that happens early on during
+ * system startup. It may not be safe to call init() from a global static
+ * context where ordering is compiler-specific and can't be guaranteed - it
+ * is safe to call BLE::init() from within main().
+ *
+ * @param initCompleteCallback
+ * A callback for when initialization completes for a BLE
+ * instance. This is an optional parameter; if no callback is
+ * set up the application can still determine the status of
+ * initialization using BLE::hasInitialized() (see below).
+ *
+ * @return BLE_ERROR_NONE if the initialization procedure was started
+ * successfully.
+ *
+ * @note If init() returns BLE_ERROR_NONE, the underlying stack must invoke
+ * the initialization completion callback at some point.
+ *
+ * @note In some cases, initialization is instantaneous (or blocking); if
+ * so, it is acceptable for the stack-specific implementation of init()
+ * to invoke the completion callback directly (within its own
+ * context).
+ *
+ * @note Nearly all BLE APIs would return
+ * BLE_ERROR_INITIALIZATION_INCOMPLETE if used on an instance before the
+ * corresponding transport is initialized.
+ *
+ * @note There are two versions of init(). In addition to the simple
+ * function-pointer, init() can also take an <Object, member> tuple as its
+ * callback target.
+ */
+ ble_error_t init(InitializationCompleteCallback_t initCompleteCallback = NULL) {
+ FunctionPointerWithContext<InitializationCompleteCallbackContext *> callback(initCompleteCallback);
+ return initImplementation(callback);
+ }
+
+ /**
+ * An alternate declaration for init(). This one takes an <Object, member> tuple as its
+ * callback target.
+ */
+ template<typename T>
+ ble_error_t init(T *object, void (T::*initCompleteCallback)(InitializationCompleteCallbackContext *context)) {
+ FunctionPointerWithContext<InitializationCompleteCallbackContext *> callback(object, initCompleteCallback);
+ return initImplementation(callback);
+ }
+
+ /**
+ * @return true if initialization has completed for the underlying BLE
+ * transport.
+ *
+ * The application can set up a callback to signal completion of
+ * initialization when using init(). Otherwise, this method can be used to
+ * poll the state of initialization.
+ */
+ bool hasInitialized(void) const;
+
+ /**
+ * Purge the BLE stack of GATT and GAP state. init() must be called
+ * afterwards to re-instate services and GAP state. This API offers a way to
+ * repopulate the GATT database with new services and characteristics.
+ */
+ ble_error_t shutdown(void);
+
+ /**
+ * This call allows the application to get the BLE stack version information.
+ *
+ * @return A pointer to a const string representing the version.
+ * Note: The string is owned by BLE_API.
+ */
+ const char *getVersion(void);
+
+ /*
+ * Accessors to GAP. Please refer to Gap.h. All GAP related functionality requires
+ * going through this accessor.
+ */
+ const Gap &gap() const;
+ Gap &gap();
+
+ /*
+ * Accessors to GATT Server. Please refer to GattServer.h. All GATTServer related
+ * functionality requires going through this accessor.
+ */
+ const GattServer& gattServer() const;
+ GattServer& gattServer();
+
+ /*
+ * Accessors to GATT Client. Please refer to GattClient.h. All GATTClient related
+ * functionality requires going through this accessor.
+ */
+ const GattClient& gattClient() const;
+ GattClient& gattClient();
+
+ /*
+ * Accessors to Security Manager. Please refer to SecurityManager.h. All
+ * SecurityManager related functionality requires going through this
+ * accessor.
+ */
+ const SecurityManager& securityManager() const;
+ SecurityManager& securityManager();
+
+ /**
+ * Yield control to the BLE stack or to other tasks waiting for events. This
+ * is a sleep function that will return when there is an application-specific
+ * interrupt, but the MCU might wake up several times before
+ * returning (to service the stack). This is not always interchangeable with
+ * WFE().
+ */
+ void waitForEvent(void);
+
+public:
+ static const InstanceID_t DEFAULT_INSTANCE = 0;
+#ifndef YOTTA_CFG_BLE_INSTANCES_COUNT
+ static const InstanceID_t NUM_INSTANCES = 1;
+#else
+ static const InstanceID_t NUM_INSTANCES = YOTTA_CFG_BLE_INSTANCES_COUNT;
+#endif
+
+ /**
+ * Get a reference to the BLE singleton corresponding to a given interface.
+ * There is a static array of BLE singletons.
+ *
+ * @Note: Calling Instance() is preferred over constructing a BLE object
+ * directly, as it returns references to singletons.
+ *
+ * @param[in] id
+ * Instance-ID. This should be less than NUM_INSTANCES
+ * for the returned BLE singleton to be useful.
+ *
+ * @return a reference to a single object.
+ */
+ static BLE &Instance(InstanceID_t id = DEFAULT_INSTANCE);
+
+ /**
+ * Constructor for a handle to a BLE instance (the BLE stack). BLE handles
+ * are thin wrappers around a transport object (that is, ptr. to
+ * BLEInstanceBase).
+ *
+ * It is better to create BLE objects as singletons accessed through the
+ * Instance() method. If multiple BLE handles are constructed for the same
+ * interface (using this constructor), they will share the same underlying
+ * transport object.
+ */
+ BLE(InstanceID_t instanceID = DEFAULT_INSTANCE);
+
+ /**
+ * Fetch the ID of a BLE instance. Typically there would only be the DEFAULT_INSTANCE.
+ */
+ InstanceID_t getInstanceID(void) const {
+ return instanceID;
+ }
+
+ /*
+ * Deprecation alert!
+ * All of the following are deprecated and may be dropped in a future
+ * release. Documentation should refer to alternative APIs.
+ */
+
+ /* GAP specific APIs. */
+public:
+ /**
+ * Set the BTLE MAC address and type.
+ * @return BLE_ERROR_NONE on success.
+ *
+ * @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.setAddress(...) should be replaced with
+ * ble.gap().setAddress(...).
+ */
+ ble_error_t setAddress(Gap::AddressType_t type, const Gap::Address_t address) {
+ return gap().setAddress(type, address);
+ }
+
+ /**
+ * Fetch the BTLE MAC address and type.
+ * @return BLE_ERROR_NONE on success.
+ *
+ * @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.getAddress(...) should be replaced with
+ * ble.gap().getAddress(...).
+ */
+ ble_error_t getAddress(Gap::AddressType_t *typeP, Gap::Address_t address) {
+ return gap().getAddress(typeP, address);
+ }
+
+ /**
+ * Set the GAP advertising mode to use for this device.
+ *
+ * @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.setAdvertisingType(...) should be replaced with
+ * ble.gap().setAdvertisingType(...).
+ */
+ void setAdvertisingType(GapAdvertisingParams::AdvertisingType advType) {
+ gap().setAdvertisingType(advType);
+ }
+
+ /**
+ * @param[in] interval
+ * Advertising interval in units of milliseconds. Advertising
+ * is disabled if interval is 0. If interval is smaller than
+ * the minimum supported value, then the minimum supported
+ * value is used instead. This minimum value can be discovered
+ * using getMinAdvertisingInterval().
+ *
+ * This field must be set to 0 if connectionMode is equal
+ * to ADV_CONNECTABLE_DIRECTED.
+ *
+ * @note: Decreasing this value allows central devices to detect a
+ * 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 be replaced with
+ * 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
+ * no longer required as the new units are milliseconds. Any application
+ * code depending on the old semantics needs to be updated accordingly.
+ */
+ void setAdvertisingInterval(uint16_t interval) {
+ gap().setAdvertisingInterval(interval);
+ }
+
+ /**
+ * @return Minimum Advertising interval in milliseconds.
+ *
+ * @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.getMinAdvertisingInterval(...) should be replaced with
+ * ble.gap().getMinAdvertisingInterval(...).
+ */
+ uint16_t getMinAdvertisingInterval(void) const {
+ return gap().getMinAdvertisingInterval();
+ }
+
+ /**
+ * @return Minimum Advertising interval in milliseconds for non-connectible mode.
+ *
+ * @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.getMinNonConnectableAdvertisingInterval(...) should be replaced with
+ * ble.gap().getMinNonConnectableAdvertisingInterval(...).
+ */
+ uint16_t getMinNonConnectableAdvertisingInterval(void) const {
+ return gap().getMinNonConnectableAdvertisingInterval();
+ }
+
+ /**
+ * @return Maximum Advertising interval in milliseconds.
+ *
+ * @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.getMaxAdvertisingInterval(...) should be replaced with
+ * ble.gap().getMaxAdvertisingInterval(...).
+ */
+ uint16_t getMaxAdvertisingInterval(void) const {
+ return gap().getMaxAdvertisingInterval();
+ }
+
+ /**
+ * @param[in] timeout
+ * Advertising timeout (in seconds) between 0x1 and 0x3FFF (1
+ * and 16383). Use 0 to disable the advertising timeout.
+ *
+ * @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.setAdvertisingTimeout(...) should be replaced with
+ * ble.gap().setAdvertisingTimeout(...).
+ */
+ void setAdvertisingTimeout(uint16_t timeout) {
+ gap().setAdvertisingTimeout(timeout);
+ }
+
+ /**
+ * Set up a particular, user-constructed set of advertisement parameters for
+ * the underlying stack. It would be uncommon for this API to be used
+ * directly; there are other APIs to tweak advertisement parameters
+ * individually (see above).
+ *
+ * @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.setAdvertisingParams(...) should be replaced with
+ * ble.gap().setAdvertisingParams(...).
+ */
+ void setAdvertisingParams(const GapAdvertisingParams &advParams) {
+ gap().setAdvertisingParams(advParams);
+ }
+
+ /**
+ * @return Read back advertising parameters. Useful for storing and
+ * restoring parameters rapidly.
+ *
+ * @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.getAdvertisingParams(...) should be replaced with
+ * ble.gap().getAdvertisingParams(...).
+ */
+ const GapAdvertisingParams &getAdvertisingParams(void) const {
+ return gap().getAdvertisingParams();
+ }
+
+ /**
+ * Accumulate an AD structure in the advertising payload. Please note that
+ * the payload is limited to 31 bytes. The SCAN_RESPONSE message may be used
+ * as an additional 31 bytes if the advertising payload is too
+ * small.
+ *
+ * @param[in] flags
+ * The flags to add. Please refer to
+ * GapAdvertisingData::Flags for valid flags. Multiple
+ * flags may be specified in combination.
+ *
+ * @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.accumulateAdvertisingPayload(flags) should be replaced with
+ * ble.gap().accumulateAdvertisingPayload(flags).
+ */
+ ble_error_t accumulateAdvertisingPayload(uint8_t flags) {
+ return gap().accumulateAdvertisingPayload(flags);
+ }
+
+ /**
+ * Accumulate an AD structure in the advertising payload. Please note that
+ * the payload is limited to 31 bytes. The SCAN_RESPONSE message may be used
+ * as an additional 31 bytes if the advertising payload is too
+ * small.
+ *
+ * @param[in] app
+ * The appearance of the peripheral.
+ *
+ * @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.accumulateAdvertisingPayload(appearance) should be replaced with
+ * ble.gap().accumulateAdvertisingPayload(appearance).
+ */
+ ble_error_t accumulateAdvertisingPayload(GapAdvertisingData::Appearance app) {
+ return gap().accumulateAdvertisingPayload(app);
+ }
+
+ /**
+ * Accumulate an AD structure in the advertising payload. Please note that
+ * the payload is limited to 31 bytes. The SCAN_RESPONSE message may be used
+ * as an additional 31 bytes if the advertising payload is too
+ * small.
+ *
+ * @param[in] app
+ * The max transmit power to be used by the controller. This
+ * is only a hint.
+ *
+ * @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.accumulateAdvertisingPayloadTxPower(txPower) should be replaced with
+ * ble.gap().accumulateAdvertisingPayloadTxPower(txPower).
+ */
+ ble_error_t accumulateAdvertisingPayloadTxPower(int8_t power) {
+ return gap().accumulateAdvertisingPayloadTxPower(power);
+ }
+
+ /**
+ * Accumulate a variable length byte-stream as an AD structure in the
+ * advertising payload. Please note that the payload is limited to 31 bytes.
+ * The SCAN_RESPONSE message may be used as an additional 31 bytes if the
+ * advertising payload is too small.
+ *
+ * @param type The type that describes the variable length data.
+ * @param data Data bytes.
+ * @param len Data length.
+ *
+ * @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.accumulateAdvertisingPayload(...) should be replaced with
+ * ble.gap().accumulateAdvertisingPayload(...).
+ */
+ ble_error_t accumulateAdvertisingPayload(GapAdvertisingData::DataType type, const uint8_t *data, uint8_t len) {
+ return gap().accumulateAdvertisingPayload(type, data, len);
+ }
+
+ /**
+ * Setup a particular, user-constructed advertisement payload for the
+ * underlying stack. It would be uncommon for this API to be used directly;
+ * there are other APIs to build an advertisement payload (see above).
+ *
+ * @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.setAdvertisingData(...) should be replaced with
+ * ble.gap().setAdvertisingPayload(...).
+ */
+ ble_error_t setAdvertisingData(const GapAdvertisingData &advData) {
+ return gap().setAdvertisingPayload(advData);
+ }
+
+ /**
+ * @return Read back advertising data. Useful for storing and
+ * restoring payload.
+ *
+ * @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.getAdvertisingData(...) should be replaced with
+ * ble.gap().getAdvertisingPayload()(...).
+ */
+ const GapAdvertisingData &getAdvertisingData(void) const {
+ return gap().getAdvertisingPayload();
+ }
+
+ /**
+ * Reset any advertising payload prepared from prior calls to
+ * accumulateAdvertisingPayload(). This automatically propagates the re-
+ * initialized advertising payload to the underlying stack.
+ *
+ * @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.clearAdvertisingPayload(...) should be replaced with
+ * ble.gap().clearAdvertisingPayload(...).
+ */
+ void clearAdvertisingPayload(void) {
+ gap().clearAdvertisingPayload();
+ }
+
+ /**
+ * This API is *deprecated* and resolves to a no-operation. It is left here
+ * to allow older code to compile. Please avoid using this API in new code.
+ * This API will be dropped in a future release.
+ *
+ * Formerly, it would be used to dynamically reset the accumulated advertising
+ * payload and scanResponse; to do this, the application would clear and re-
+ * accumulate a new advertising payload (and scanResponse) before using this
+ * API. Updates to the underlying advertisement payload now happen
+ * implicitly.
+ */
+ ble_error_t setAdvertisingPayload(void) {
+ return BLE_ERROR_NONE;
+ }
+
+ /**
+ * Accumulate a variable length byte-stream as an AD structure in the
+ * scanResponse payload.
+ *
+ * @param[in] type The type that describes the variable length data.
+ * @param[in] data Data bytes.
+ * @param[in] len Data length.
+ *
+ * @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.accumulateScanResponse(...) should be replaced with
+ * ble.gap().accumulateScanResponse(...).
+ */
+ ble_error_t accumulateScanResponse(GapAdvertisingData::DataType type, const uint8_t *data, uint8_t len) {
+ return gap().accumulateScanResponse(type, data, len);
+ }
+
+ /**
+ * Reset any scan response prepared from prior calls to
+ * accumulateScanResponse().
+ *
+ * @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.clearScanResponse(...) should be replaced with
+ * ble.gap().clearScanResponse(...).
+ */
+ void clearScanResponse(void) {
+ gap().clearScanResponse();
+ }
+
+ /**
+ * Start advertising.
+ *
+ * @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.startAdvertising(...) should be replaced with
+ * ble.gap().startAdvertising(...).
+ */
+ ble_error_t startAdvertising(void) {
+ return gap().startAdvertising();
+ }
+
+ /**
+ * Stop advertising.
+ *
+ * @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.stopAdvertising(...) should be replaced with
+ * ble.gap().stopAdvertising(...).
+ */
+ ble_error_t stopAdvertising(void) {
+ return gap().stopAdvertising();
+ }
+
+ /**
+ * Set up parameters for GAP scanning (observer mode).
+ * @param[in] interval
+ * Scan interval (in milliseconds) [valid values lie between 2.5ms and 10.24s].
+ * @param[in] window
+ * Scan Window (in milliseconds) [valid values lie between 2.5ms and 10.24s].
+ * @param[in] timeout
+ * Scan timeout (in seconds) between 0x0001 and 0xFFFF; 0x0000 disables timeout.
+ * @param[in] activeScanning
+ * Set to True if active-scanning is required. This is used to fetch the
+ * scan response from a peer if possible.
+ *
+ * The scanning window divided by the interval determines the duty cycle for
+ * scanning. For example, if the interval is 100ms and the window is 10ms,
+ * then the controller will scan for 10 percent of the time. It is possible
+ * to have the interval and window set to the same value. In this case,
+ * scanning is continuous, with a change of scanning frequency once every
+ * interval.
+ *
+ * Once the scanning parameters have been configured, scanning can be
+ * enabled by using startScan().
+ *
+ * @Note: The scan interval and window are recommendations to the BLE stack.
+ *
+ * @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.setScanParams(...) should be replaced with
+ * ble.gap().setScanParams(...).
+ */
+ ble_error_t setScanParams(uint16_t interval = GapScanningParams::SCAN_INTERVAL_MAX,
+ uint16_t window = GapScanningParams::SCAN_WINDOW_MAX,
+ uint16_t timeout = 0,
+ bool activeScanning = false) {
+ return gap().setScanParams(interval, window, timeout, activeScanning);
+ }
+
+ /**
+ * Set up the scanInterval parameter for GAP scanning (observer mode).
+ * @param[in] interval
+ * Scan interval (in milliseconds) [valid values lie between 2.5ms and 10.24s].
+ *
+ * The scanning window divided by the interval determines the duty cycle for
+ * scanning. For example, if the interval is 100ms and the window is 10ms,
+ * then the controller will scan for 10 percent of the time. It is possible
+ * to have the interval and window set to the same value. In this case,
+ * scanning is continuous, with a change of scanning frequency once every
+ * interval.
+ *
+ * Once the scanning parameters have been configured, scanning can be
+ * enabled by using startScan().
+ *
+ * @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.setScanInterval(interval) should be replaced with
+ * ble.gap().setScanInterval(interval).
+ */
+ ble_error_t setScanInterval(uint16_t interval) {
+ return gap().setScanInterval(interval);
+ }
+
+ /**
+ * Set up the scanWindow parameter for GAP scanning (observer mode).
+ * @param[in] window
+ * Scan Window (in milliseconds) [valid values lie between 2.5ms and 10.24s].
+ *
+ * The scanning window divided by the interval determines the duty cycle for
+ * scanning. For example, if the interval is 100ms and the window is 10ms,
+ * then the controller will scan for 10 percent of the time. It is possible
+ * to have the interval and window set to the same value. In this case,
+ * scanning is continuous, with a change of scanning frequency once every
+ * interval.
+ *
+ * Once the scanning parameters have been configured, scanning can be
+ * enabled by using startScan().
+ *
+ * @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.setScanWindow(window) should be replaced with
+ * ble.gap().setScanWindow(window).
+ */
+ ble_error_t setScanWindow(uint16_t window) {
+ return gap().setScanWindow(window);
+ }
+
+ /**
+ * Set up parameters for GAP scanning (observer mode).
+ * @param[in] timeout
+ * Scan timeout (in seconds) between 0x0001 and 0xFFFF; 0x0000 disables timeout.
+ *
+ * The scanning window divided by the interval determines the duty cycle for
+ * scanning. For example, if the interval is 100ms and the window is 10ms,
+ * then the controller will scan for 10 percent of the time. It is possible
+ * to have the interval and window set to the same value. In this case,
+ * scanning is continuous, with a change of scanning frequency once every
+ * interval.
+ *
+ * Once the scanning parameters have been configured, scanning can be
+ * enabled by using startScan().
+ *
+ * @Note: The scan interval and window are recommendations to the BLE stack.
+ *
+ * @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.setScanTimeout(...) should be replaced with
+ * ble.gap().setScanTimeout(...).
+ */
+ ble_error_t setScanTimeout(uint16_t timeout) {
+ return gap().setScanTimeout(timeout);
+ }
+
+ /**
+ * Set up parameters for GAP scanning (observer mode).
+ * @param[in] activeScanning
+ * Set to True if active-scanning is required. This is used to fetch the
+ * scan response from a peer if possible.
+ *
+ * Once the scanning parameters have been configured, scanning can be
+ * enabled by using startScan().
+ *
+ * @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.setActiveScan(...) should be replaced with
+ * ble.gap().setActiveScanning(...).
+ */
+ void setActiveScan(bool activeScanning) {
+ gap().setActiveScanning(activeScanning);
+ }
+
+ /**
+ * Start scanning (Observer Procedure) based on the parameters currently in
+ * effect.
+ *
+ * @param[in] callback
+ * The application-specific callback to be invoked upon
+ * receiving every advertisement report. This can be passed in
+ * as NULL, in which case scanning may not be enabled at all.
+ *
+ * @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.startScan(callback) should be replaced with
+ * ble.gap().startScan(callback).
+ */
+ ble_error_t startScan(void (*callback)(const Gap::AdvertisementCallbackParams_t *params)) {
+ return gap().startScan(callback);
+ }
+
+ /**
+ * Same as above, but this takes an (object, method) pair for a callback.
+ *
+ * @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.startScan(callback) should be replaced with
+ * ble.gap().startScan(object, callback).
+ */
+ template<typename T>
+ ble_error_t startScan(T *object, void (T::*memberCallback)(const Gap::AdvertisementCallbackParams_t *params));
+
+ /**
+ * Stop scanning. The current scanning parameters remain in effect.
+ *
+ * @retval BLE_ERROR_NONE if successfully stopped scanning procedure.
+ *
+ * @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.stopScan() should be replaced with
+ * ble.gap().stopScan().
+ */
+ ble_error_t stopScan(void) {
+ return gap().stopScan();
+ }
+
+ /**
+ * Create a connection (GAP Link Establishment).
+ * @param peerAddr
+ * 48-bit address, LSB format.
+ * @param peerAddrType
+ * Address type of the peer.
+ * @param connectionParams
+ * Connection parameters.
+ * @param scanParams
+ * Paramters to use while scanning for the peer.
+ * @return BLE_ERROR_NONE if connection establishment procedure is started
+ * successfully. The onConnection callback (if set) is invoked upon
+ * a connection event.
+ *
+ * @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.connect(...) should be replaced with
+ * ble.gap().connect(...).
+ */
+ ble_error_t connect(const Gap::Address_t peerAddr,
+ Gap::AddressType_t peerAddrType = Gap::ADDR_TYPE_RANDOM_STATIC,
+ const Gap::ConnectionParams_t *connectionParams = NULL,
+ const GapScanningParams *scanParams = NULL) {
+ return gap().connect(peerAddr, peerAddrType, connectionParams, scanParams);
+ }
+
+ /**
+ * This call initiates the disconnection procedure, and its completion is
+ * communicated to the application with an invocation of the
+ * onDisconnection callback.
+ *
+ * @param[in] connectionHandle
+ * @param[in] reason
+ * The reason for disconnection; sent back to the peer.
+ */
+ ble_error_t disconnect(Gap::Handle_t connectionHandle, Gap::DisconnectionReason_t reason) {
+ return gap().disconnect(connectionHandle, reason);
+ }
+
+ /**
+ * This call initiates the disconnection procedure, and its completion
+ * is communicated to the application with an invocation of the
+ * onDisconnection callback.
+ *
+ * @param reason
+ * The reason for disconnection; sent back to the peer.
+ *
+ * @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.disconnect(reason) should be replaced with
+ * ble.gap().disconnect(reason).
+ *
+ * @note: This version of disconnect() doesn't take a connection handle. It
+ * works reliably only for stacks that are limited to a single
+ * connection. This API should be considered *deprecated* in favour of the
+ * alternative, which takes a connection handle. It will be dropped in the future.
+ */
+ ble_error_t disconnect(Gap::DisconnectionReason_t reason) {
+ return gap().disconnect(reason);
+ }
+
+ /**
+ * Returns the current GAP state of the device using a bitmask that
+ * describes whether the device is advertising or connected.
+ *
+ * @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.getGapState() should be replaced with
+ * ble.gap().getState().
+ */
+ Gap::GapState_t getGapState(void) const {
+ return gap().getState();
+ }
+
+ /**
+ * Get the GAP peripheral's preferred connection parameters. These are the
+ * defaults that the peripheral would like to have in a connection. The
+ * choice of the connection parameters is eventually up to the central.
+ *
+ * @param[out] params
+ * The structure where the parameters will be stored. Memory
+ * for this is owned by the caller.
+ *
+ * @return BLE_ERROR_NONE if the parameters were successfully filled into
+ * the given structure pointed to by params.
+ *
+ * @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.getPreferredConnectionParams() should be replaced with
+ * ble.gap().getPreferredConnectionParams().
+ */
+ ble_error_t getPreferredConnectionParams(Gap::ConnectionParams_t *params) {
+ return gap().getPreferredConnectionParams(params);
+ }
+
+ /**
+ * Set the GAP peripheral's preferred connection parameters. These are the
+ * defaults that the peripheral would like to have in a connection. The
+ * choice of the connection parameters is eventually up to the central.
+ *
+ * @param[in] params
+ * The structure containing the desired parameters.
+ *
+ * @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.setPreferredConnectionParams() should be replaced with
+ * ble.gap().setPreferredConnectionParams().
+ */
+ ble_error_t setPreferredConnectionParams(const Gap::ConnectionParams_t *params) {
+ return gap().setPreferredConnectionParams(params);
+ }
+
+ /**
+ * Update connection parameters while in the peripheral role.
+ * @details In the peripheral role, this will send the corresponding L2CAP request to the connected peer and wait for
+ * the central to perform the procedure.
+ * @param[in] handle
+ * Connection Handle
+ * @param[in] params
+ * Pointer to desired connection parameters. If NULL is provided on a peripheral role,
+ * the parameters in the PPCP characteristic of the GAP service will be used instead.
+ *
+ * @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.updateConnectionParams() should be replaced with
+ * ble.gap().updateConnectionParams().
+ */
+ ble_error_t updateConnectionParams(Gap::Handle_t handle, const Gap::ConnectionParams_t *params) {
+ return gap().updateConnectionParams(handle, params);
+ }
+
+ /**
+ * Set the device name characteristic in the GAP service.
+ * @param[in] deviceName
+ * The new value for the device-name. This is a UTF-8 encoded, <b>NULL-terminated</b> string.
+ *
+ * @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.setDeviceName() should be replaced with
+ * ble.gap().setDeviceName().
+ */
+ ble_error_t setDeviceName(const uint8_t *deviceName) {
+ return gap().setDeviceName(deviceName);
+ }
+
+ /**
+ * Get the value of the device name characteristic in the GAP service.
+ * @param[out] deviceName
+ * Pointer to an empty buffer where the UTF-8 *non NULL-
+ * terminated* string will be placed. Set this
+ * value to NULL in order to obtain the deviceName-length
+ * from the 'length' parameter.
+ *
+ * @param[in/out] lengthP
+ * (on input) Length of the buffer pointed to by deviceName;
+ * (on output) the complete device name length (without the
+ * null terminator).
+ *
+ * @note If the device name is longer than the size of the supplied buffer,
+ * length will return the complete device name length, and not the
+ * number of bytes actually returned in deviceName. The application may
+ * use this information to retry with a suitable buffer size.
+ *
+ * @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.getDeviceName() should be replaced with
+ * ble.gap().getDeviceName().
+ */
+ ble_error_t getDeviceName(uint8_t *deviceName, unsigned *lengthP) {
+ return gap().getDeviceName(deviceName, lengthP);
+ }
+
+ /**
+ * Set the appearance characteristic in the GAP service.
+ * @param[in] appearance
+ * The new value for the device-appearance.
+ *
+ * @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.setAppearance() should be replaced with
+ * ble.gap().setAppearance().
+ */
+ ble_error_t setAppearance(GapAdvertisingData::Appearance appearance) {
+ return gap().setAppearance(appearance);
+ }
+
+ /**
+ * Get the appearance characteristic in the GAP service.
+ * @param[out] appearance
+ * The new value for the device-appearance.
+ *
+ * @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.getAppearance() should be replaced with
+ * ble.gap().getAppearance().
+ */
+ ble_error_t getAppearance(GapAdvertisingData::Appearance *appearanceP) {
+ return gap().getAppearance(appearanceP);
+ }
+
+ /**
+ * Set the radio's transmit power.
+ * @param[in] txPower Radio transmit power in dBm.
+ *
+ * @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.setTxPower() should be replaced with
+ * ble.gap().setTxPower().
+ */
+ ble_error_t setTxPower(int8_t txPower) {
+ return gap().setTxPower(txPower);
+ }
+
+ /**
+ * Query the underlying stack for permitted arguments for setTxPower().
+ *
+ * @param[out] valueArrayPP
+ * Out parameter to receive the immutable array of Tx values.
+ * @param[out] countP
+ * Out parameter to receive the array's size.
+ *
+ * @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.getPermittedTxPowerValues() should be replaced with
+ * ble.gap().getPermittedTxPowerValues().
+ */
+ void getPermittedTxPowerValues(const int8_t **valueArrayPP, size_t *countP) {
+ gap().getPermittedTxPowerValues(valueArrayPP, countP);
+ }
+
+ /**
+ * Add a service declaration to the local server ATT table. Also add the
+ * characteristics contained within.
+ *
+ * @note: This API is now *deprecated* and will be dropped in the future.
+ * You should use the parallel API from GattServer directly. A former call
+ * to ble.addService() should be replaced with
+ * ble.gattServer().addService().
+ */
+ ble_error_t addService(GattService &service) {
+ return gattServer().addService(service);
+ }
+
+ /**
+ * Read the value of a characteristic from the local GattServer.
+ * @param[in] attributeHandle
+ * Attribute handle for the value attribute of the characteristic.
+ * @param[out] buffer
+ * A buffer to hold the value being read.
+ * @param[in/out] lengthP
+ * Length of the buffer being supplied. If the attribute
+ * value is longer than the size of the supplied buffer,
+ * this variable will return the total attribute value length
+ * (excluding offset). The application may use this
+ * information to allocate a suitable buffer size.
+ *
+ * @return BLE_ERROR_NONE if a value was read successfully into the buffer.
+ *
+ * @note: This API is now *deprecated* and will be dropped in the future.
+ * You should use the parallel API from GattServer directly. A former call
+ * to ble.readCharacteristicValue() should be replaced with
+ * ble.gattServer().read().
+ */
+ ble_error_t readCharacteristicValue(GattAttribute::Handle_t attributeHandle, uint8_t *buffer, uint16_t *lengthP) {
+ return gattServer().read(attributeHandle, buffer, lengthP);
+ }
+
+ /**
+ * Read the value of a characteristic from the local GattServer.
+ * @param[in] connectionHandle
+ * Connection Handle.
+ * @param[in] attributeHandle
+ * Attribute handle for the value attribute of the characteristic.
+ * @param[out] buffer
+ * A buffer to hold the value being read.
+ * @param[in/out] lengthP
+ * Length of the buffer being supplied. If the attribute
+ * value is longer than the size of the supplied buffer,
+ * this variable will return the total attribute value length
+ * (excluding offset). The application may use this
+ * information to allocate a suitable buffer size.
+ *
+ * @return BLE_ERROR_NONE if a value was read successfully into the buffer.
+ *
+ * @note This API is a version of the above, with an additional connection handle
+ * parameter to allow fetches for connection-specific multivalued
+ * attributes (such as the CCCDs).
+ *
+ * @note: This API is now *deprecated* and will be dropped in the future.
+ * You should use the parallel API from GattServer directly. A former call
+ * to ble.readCharacteristicValue() should be replaced with
+ * ble.gattServer().read().
+ */
+ ble_error_t readCharacteristicValue(Gap::Handle_t connectionHandle, GattAttribute::Handle_t attributeHandle, uint8_t *buffer, uint16_t *lengthP) {
+ return gattServer().read(connectionHandle, attributeHandle, buffer, lengthP);
+ }
+
+ /**
+ * Update the value of a characteristic on the local GattServer.
+ *
+ * @param[in] attributeHandle
+ * Handle for the value attribute of the characteristic.
+ * @param[in] value
+ * A pointer to a buffer holding the new value.
+ * @param[in] size
+ * Size of the new value (in bytes).
+ * @param[in] localOnly
+ * Should this update be kept on the local
+ * GattServer regardless of the state of the
+ * notify/indicate flag in the CCCD for this
+ * characteristic? If set to true, no notification
+ * or indication is generated.
+ *
+ * @return BLE_ERROR_NONE if we have successfully set the value of the attribute.
+ *
+ * @note: This API is now *deprecated* and will be dropped in the future.
+ * You should use the parallel API from GattServer directly. A former call
+ * to ble.updateCharacteristicValue() should be replaced with
+ * ble.gattServer().write().
+ */
+ ble_error_t updateCharacteristicValue(GattAttribute::Handle_t attributeHandle,
+ const uint8_t *value,
+ uint16_t size,
+ bool localOnly = false) {
+ return gattServer().write(attributeHandle, value, size, localOnly);
+ }
+
+ /**
+ * Update the value of a characteristic on the local GattServer. A version
+ * of the above, with a connection handle parameter to allow updates
+ * for connection-specific multivalued attributes (such as the CCCDs).
+ *
+ * @param[in] connectionHandle
+ * Connection Handle.
+ * @param[in] attributeHandle
+ * Handle for the value attribute of the Characteristic.
+ * @param[in] value
+ * A pointer to a buffer holding the new value.
+ * @param[in] size
+ * Size of the new value (in bytes).
+ * @param[in] localOnly
+ * Should this update be kept on the local
+ * GattServer regardless of the state of the
+ * notify/indicate flag in the CCCD for this
+ * Characteristic? If set to true, no notification
+ * or indication is generated.
+ *
+ * @return BLE_ERROR_NONE if we have successfully set the value of the attribute.
+ *
+ * @note: This API is now *deprecated* and will be dropped in the future.
+ * You should use the parallel API from GattServer directly. A former call
+ * to ble.updateCharacteristicValue() should be replaced with
+ * ble.gattServer().write().
+ */
+ ble_error_t updateCharacteristicValue(Gap::Handle_t connectionHandle,
+ GattAttribute::Handle_t attributeHandle,
+ const uint8_t *value,
+ uint16_t size,
+ bool localOnly = false) {
+ return gattServer().write(connectionHandle, attributeHandle, value, size, localOnly);
+ }
+
+ /**
+ * Enable the BLE stack's Security Manager. The Security Manager implements
+ * the cryptographic algorithms and protocol exchanges that allow two
+ * devices to securely exchange data and privately detect each other.
+ * Calling this API is a prerequisite for encryption and pairing (bonding).
+ *
+ * @param[in] enableBonding Allow for bonding.
+ * @param[in] requireMITM Require protection against man-in-the-middle attacks.
+ * @param[in] iocaps To specify the I/O capabilities of this peripheral,
+ * such as availability of a display or keyboard, to
+ * support out-of-band exchanges of security data.
+ * @param[in] passkey To specify a static passkey.
+ *
+ * @return BLE_ERROR_NONE on success.
+ *
+ * @note: This API is now *deprecated* and will be dropped in the future.
+ * You should use the parallel API from SecurityManager directly. A former
+ * call to ble.initializeSecurity(...) should be replaced with
+ * ble.securityManager().init(...).
+ */
+ ble_error_t initializeSecurity(bool enableBonding = true,
+ bool requireMITM = true,
+ SecurityManager::SecurityIOCapabilities_t iocaps = SecurityManager::IO_CAPS_NONE,
+ const SecurityManager::Passkey_t passkey = NULL) {
+ return securityManager().init(enableBonding, requireMITM, iocaps, passkey);
+ }
+
+ /**
+ * Get the security status of a connection.
+ *
+ * @param[in] connectionHandle Handle to identify the connection.
+ * @param[out] securityStatusP Security status.
+ *
+ * @return BLE_SUCCESS or appropriate error code indicating the reason of failure.
+ *
+ * @note: This API is now *deprecated* and will be dropped in the future.
+ * You should use the parallel API from SecurityManager directly. A former
+ * call to ble.getLinkSecurity(...) should be replaced with
+ * ble.securityManager().getLinkSecurity(...).
+ */
+ ble_error_t getLinkSecurity(Gap::Handle_t connectionHandle, SecurityManager::LinkSecurityStatus_t *securityStatusP) {
+ return securityManager().getLinkSecurity(connectionHandle, securityStatusP);
+ }
+
+ /**
+ * Delete all peer device context and all related bonding information from
+ * the database within the security manager.
+ *
+ * @retval BLE_ERROR_NONE On success; else returns an error code indicating the reason for the failure.
+ * @retval BLE_ERROR_INVALID_STATE If the API is called without module initialization or
+ * application registration.
+ *
+ * @note: This API is now *deprecated* and will be dropped in the future.
+ * You should use the parallel API from SecurityManager directly. A former
+ * call to ble.purgeAllBondingState() should be replaced with
+ * ble.securityManager().purgeAllBondingState().
+ */
+ ble_error_t purgeAllBondingState(void) {
+ return securityManager().purgeAllBondingState();
+ }
+
+ /**
+ * Set up a callback for timeout events. Refer to Gap::TimeoutSource_t for
+ * possible event types.
+ *
+ * @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.onTimeout(callback) should be replaced with
+ * ble.gap().onTimeout(callback).
+ */
+ void onTimeout(Gap::TimeoutEventCallback_t timeoutCallback) {
+ gap().onTimeout(timeoutCallback);
+ }
+
+ /**
+ * Set up a callback for connection events. Refer to Gap::ConnectionEventCallback_t.
+ *
+ * @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.onConnection(callback) should be replaced with
+ * ble.gap().onConnection(callback).
+ */
+ void onConnection(Gap::ConnectionEventCallback_t connectionCallback) {
+ gap().onConnection(connectionCallback);
+ }
+
+ /**
+ * Append to a chain of callbacks to be invoked upon GAP disconnection.
+ *
+ * @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.onDisconnection(callback) should be replaced with
+ * ble.gap().onDisconnection(callback).
+ */
+ void onDisconnection(Gap::DisconnectionEventCallback_t disconnectionCallback) {
+ gap().onDisconnection(disconnectionCallback);
+ }
+
+ template<typename T>
+ void onDisconnection(T *tptr, void (T::*mptr)(const Gap::DisconnectionCallbackParams_t*)) {
+ gap().onDisconnection(tptr, mptr);
+ }
+
+ /**
+ * Radio Notification is a feature that enables ACTIVE and INACTIVE
+ * (nACTIVE) signals from the stack. These notify the application when the
+ * radio is in use. The signal is sent using software interrupt.
+ *
+ * The ACTIVE signal is sent before the radio event starts. The nACTIVE
+ * signal is sent at the end of the radio event. These signals can be used
+ * by the application programmer to synchronize application logic with radio
+ * activity. For example, the ACTIVE signal can be used to shut off external
+ * devices to manage peak current drawn during periods when the radio is on,
+ * or to trigger sensor data collection for transmission in the radio event.
+ *
+ * @param callback
+ * The application handler to be invoked in response to a radio
+ * ACTIVE/INACTIVE event.
+ *
+ * @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.onRadioNotification(...) should be replaced with
+ * ble.gap().onRadioNotification(...).
+ */
+ void onRadioNotification(void (*callback)(bool)) {
+ gap().onRadioNotification(callback);
+ }
+
+ /**
+ * Add a callback for the GATT event DATA_SENT (which is triggered when
+ * updates are sent out by GATT in the form of notifications).
+ *
+ * @Note: It is possible to chain together multiple onDataSent callbacks
+ * (potentially from different modules of an application) to receive updates
+ * to characteristics.
+ *
+ * @Note: It is also possible to set up a callback into a member function of
+ * some object.
+ *
+ * @note: This API is now *deprecated* and will be dropped in the future.
+ * You should use the parallel API from GattServer directly. A former call
+ * to ble.onDataSent(...) should be replaced with
+ * ble.gattServer().onDataSent(...).
+ */
+ void onDataSent(void (*callback)(unsigned count)) {
+ gattServer().onDataSent(callback);
+ }
+ template <typename T> void onDataSent(T * objPtr, void (T::*memberPtr)(unsigned count)) {
+ gattServer().onDataSent(objPtr, memberPtr);
+ }
+
+ /**
+ * Set up a callback for when an attribute has its value updated by or at the
+ * connected peer. For a peripheral, this callback is triggered when the local
+ * GATT server has an attribute updated by a write command from the peer.
+ * For a Central, this callback is triggered when a response is received for
+ * a write request.
+ *
+ * @Note: It is possible to chain together multiple onDataWritten callbacks
+ * (potentially from different modules of an application) to receive updates
+ * to characteristics. Many services, such as DFU and UART, add their own
+ * onDataWritten callbacks behind the scenes to trap interesting events.
+ *
+ * @Note: It is also possible to set up a callback into a member function of
+ * some object.
+ *
+ * @note: This API is now *deprecated* and will be dropped in the future.
+ * You should use the parallel API from GattServer directly. A former call
+ * to ble.onDataWritten(...) should be replaced with
+ * ble.gattServer().onDataWritten(...).
+ */
+ void onDataWritten(void (*callback)(const GattWriteCallbackParams *eventDataP)) {
+ gattServer().onDataWritten(callback);
+ }
+ template <typename T> void onDataWritten(T * objPtr, void (T::*memberPtr)(const GattWriteCallbackParams *context)) {
+ gattServer().onDataWritten(objPtr, memberPtr);
+ }
+
+ /**
+ * Set up a callback to be invoked on the peripheral when an attribute is
+ * being read by a remote client.
+ *
+ * @Note: This functionality may not be available on all underlying stacks.
+ * You could use GattCharacteristic::setReadAuthorizationCallback() as an
+ * alternative.
+ *
+ * @Note: It is possible to chain together multiple onDataRead callbacks
+ * (potentially from different modules of an application) to receive updates
+ * to characteristics. Services may add their own onDataRead callbacks
+ * behind the scenes to trap interesting events.
+ *
+ * @Note: It is also possible to set up a callback into a member function of
+ * some object.
+ *
+ * @return BLE_ERROR_NOT_IMPLEMENTED if this functionality isn't available;
+ * else BLE_ERROR_NONE.
+ *
+ * @note: This API is now *deprecated* and will be dropped in the future.
+ * You should use the parallel API from GattServer directly. A former call
+ * to ble.onDataRead(...) should be replaced with
+ * ble.gattServer().onDataRead(...).
+ */
+ ble_error_t onDataRead(void (*callback)(const GattReadCallbackParams *eventDataP)) {
+ return gattServer().onDataRead(callback);
+ }
+ template <typename T> ble_error_t onDataRead(T * objPtr, void (T::*memberPtr)(const GattReadCallbackParams *context)) {
+ return gattServer().onDataRead(objPtr, memberPtr);
+ }
+
+ /**
+ * Set up a callback for when notifications or indications are enabled for a
+ * characteristic on the local GattServer.
+ *
+ * @note: This API is now *deprecated* and will be dropped in the future.
+ * You should use the parallel API from GattServer directly. A former call
+ * to ble.onUpdatesEnabled(callback) should be replaced with
+ * ble.gattServer().onUpdatesEnabled(callback).
+ */
+ void onUpdatesEnabled(GattServer::EventCallback_t callback) {
+ gattServer().onUpdatesEnabled(callback);
+ }
+
+ /**
+ * Set up a callback for when notifications or indications are disabled for a
+ * characteristic on the local GattServer.
+ *
+ * @note: This API is now *deprecated* and will be dropped in the future.
+ * You should use the parallel API from GattServer directly. A former call
+ * to ble.onUpdatesEnabled(callback) should be replaced with
+ * ble.gattServer().onUpdatesEnabled(callback).
+ */
+ void onUpdatesDisabled(GattServer::EventCallback_t callback) {
+ gattServer().onUpdatesDisabled(callback);
+ }
+
+ /**
+ * Set up a callback for when the GATT server receives a response for an
+ * indication event sent previously.
+ *
+ * @note: This API is now *deprecated* and will be dropped in the future.
+ * You should use the parallel API from GattServer directly. A former call
+ * to ble.onConfirmationReceived(callback) should be replaced with
+ * ble.gattServer().onConfirmationReceived(callback).
+ */
+ void onConfirmationReceived(GattServer::EventCallback_t callback) {
+ gattServer().onConfirmationReceived(callback);
+ }
+
+ /**
+ * Set up a callback for when the security setup procedure (key generation
+ * and exchange) for a link has started. This will be skipped for bonded
+ * devices. The callback is passed in parameters received from the peer's
+ * security request: bool allowBonding, bool requireMITM, and
+ * SecurityIOCapabilities_t.
+ *
+ * @note: This API is now *deprecated* and will be dropped in the future.
+ * You should use the parallel API from SecurityManager directly. A former
+ * call to ble.onSecuritySetupInitiated(callback) should be replaced with
+ * ble.securityManager().onSecuritySetupInitiated(callback).
+ */
+ void onSecuritySetupInitiated(SecurityManager::SecuritySetupInitiatedCallback_t callback) {
+ securityManager().onSecuritySetupInitiated(callback);
+ }
+
+ /**
+ * Set up a callback for when the security setup procedure (key generation
+ * and exchange) for a link has completed. This will be skipped for bonded
+ * devices. The callback is passed in the success/failure status of the
+ * security setup procedure.
+ *
+ * @note: This API is now *deprecated* and will be dropped in the future.
+ * You should use the parallel API from SecurityManager directly. A former
+ * call to ble.onSecuritySetupCompleted(callback) should be replaced with
+ * ble.securityManager().onSecuritySetupCompleted(callback).
+ */
+ void onSecuritySetupCompleted(SecurityManager::SecuritySetupCompletedCallback_t callback) {
+ securityManager().onSecuritySetupCompleted(callback);
+ }
+
+ /**
+ * Set up a callback for when a link with the peer is secured. For bonded
+ * devices, subsequent reconnections with a bonded peer will result only in
+ * this callback when the link is secured, and setup procedures will not
+ * occur unless the bonding information is either lost or deleted on either
+ * or both sides. The callback is passed in a SecurityManager::SecurityMode_t according
+ * to the level of security in effect for the secured link.
+ *
+ * @note: This API is now *deprecated* and will be dropped in the future.
+ * You should use the parallel API from SecurityManager directly. A former
+ * call to ble.onLinkSecured(callback) should be replaced with
+ * ble.securityManager().onLinkSecured(callback).
+ */
+ void onLinkSecured(SecurityManager::LinkSecuredCallback_t callback) {
+ securityManager().onLinkSecured(callback);
+ }
+
+ /**
+ * Set up a callback for successful bonding, meaning that link-specific security
+ * context is stored persistently for a peer device.
+ *
+ * @note: This API is now *deprecated* and will be dropped in the future.
+ * You should use the parallel API from SecurityManager directly. A former
+ * call to ble.onSecurityContextStored(callback) should be replaced with
+ * ble.securityManager().onSecurityContextStored(callback).
+ */
+ void onSecurityContextStored(SecurityManager::HandleSpecificEvent_t callback) {
+ securityManager().onSecurityContextStored(callback);
+ }
+
+ /**
+ * Set up a callback for when the passkey needs to be displayed on a
+ * peripheral with DISPLAY capability. This happens when security is
+ * configured to prevent Man-In-The-Middle attacks, and the peers need to exchange
+ * a passkey (or PIN) to authenticate the connection
+ * attempt.
+ *
+ * @note: This API is now *deprecated* and will be dropped in the future.
+ * You should use the parallel API from SecurityManager directly. A former
+ * call to ble.onPasskeyDisplay(callback) should be replaced with
+ * ble.securityManager().onPasskeyDisplay(callback).
+ */
+ void onPasskeyDisplay(SecurityManager::PasskeyDisplayCallback_t callback) {
+ return securityManager().onPasskeyDisplay(callback);
+ }
+
+private:
+ /**
+ * Implementation of init() [internal to BLE_API].
+ *
+ * The implementation is separated into a private method because it isn't
+ * suitable to be included in the header.
+ */
+ ble_error_t initImplementation(FunctionPointerWithContext<InitializationCompleteCallbackContext *> callback);
+
+private:
+ BLE(const BLE&);
+ BLE &operator=(const BLE &);
+
+private:
+ InstanceID_t instanceID;
+ BLEInstanceBase *transport; /* The device-specific backend */
+};
+
+typedef BLE BLEDevice; /* DEPRECATED. This type alias is retained for the sake of compatibility with older
+ * code. Will be dropped at some point soon.*/
+
#endif // ifndef __BLE_H__
\ No newline at end of file
--- a/ble/BLEProtocol.h Tue Jan 12 19:47:52 2016 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,69 +0,0 @@
-/* mbed Microcontroller Library
- * Copyright (c) 2006-2013 ARM Limited
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __BLE_PROTOCOL_H__
-#define __BLE_PROTOCOL_H__
-
-#include <stddef.h>
-#include <stdint.h>
-#include <algorithm>
-
-/**
- * A common namespace for types and constants used everywhere in BLE API.
- */
-namespace BLEProtocol {
- /**<
- * A simple container for the enumeration of address-types for Protocol addresses.
- *
- * Adding a struct to encapsulate the contained enumeration prevents
- * polluting the BLEProtocol namespace with the enumerated values. It also
- * allows type-aliases for the enumeration while retaining the enumerated
- * values. i.e. doing:
- * typedef AddressType AliasedType;
- *
- * would allow the use of AliasedType::PUBLIC in code.
- */
- struct AddressType {
- /**< Address-types for Protocol addresses. */
- enum Type {
- PUBLIC = 0,
- RANDOM_STATIC,
- RANDOM_PRIVATE_RESOLVABLE,
- RANDOM_PRIVATE_NON_RESOLVABLE
- };
- };
- typedef AddressType::Type AddressType_t; /**< Alias for AddressType::Type */
-
- static const size_t ADDR_LEN = 6; /**< Length (in octets) of the BLE MAC address. */
- typedef uint8_t AddressBytes_t[ADDR_LEN]; /**< 48-bit address, in LSB format. */
-
- /**
- * BLE address. It contains an address-type (@ref AddressType_t) and bytes (@ref AddressBytes_t).
- */
- struct Address_t {
- AddressType_t type; /**< @ref AddressType_t */
- AddressBytes_t address; /**< @ref AddressBytes_t */
-
- Address_t(AddressType_t typeIn, const AddressBytes_t& addressIn) : type(typeIn) {
- std::copy(addressIn, addressIn + ADDR_LEN, address);
- }
-
- Address_t() : type(), address() {
- }
- };
-};
-
-#endif /* __BLE_PROTOCOL_H__ */
\ No newline at end of file
--- a/ble/CharacteristicDescriptorDiscovery.h Tue Jan 12 19:47:52 2016 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,99 +0,0 @@
-/* mbed Microcontroller Library
- * Copyright (c) 2006-2015 ARM Limited
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __CHARACTERISTIC_DESCRIPTOR_DISCOVERY_H__
-#define __CHARACTERISTIC_DESCRIPTOR_DISCOVERY_H__
-
-#include "FunctionPointerWithContext.h"
-
-class DiscoveredCharacteristic; // forward declaration
-class DiscoveredCharacteristicDescriptor; // forward declaration
-
-/**
- * @brief Contain all definitions of callbacks and callbacks parameters types
- * related to characteristic descriptor discovery.
- *
- * @details This class act like a namespace for characteristic descriptor discovery
- * types. It act like ServiceDiscovery by providing callbacks and callbacks
- * parameters types related to the characteristic descriptor discovery process but
- * contrary to ServiceDiscovery class, it does not force the porter to use a
- * specific interface for the characteristic descriptor discovery process.
- */
-class CharacteristicDescriptorDiscovery {
-public:
- /**
- * @brief Parameter type of CharacteristicDescriptorDiscovery::DiscoveryCallback_t.
- * @detail Every time a characteristic descriptor has been discovered, the callback
- * registered for the discovery operation through GattClient::discoverCharacteristicDescriptors
- * or DiscoveredCharacteristic::discoverDescriptors will be called with this parameter.
- *
- */
- struct DiscoveryCallbackParams_t {
- /**
- * The characteristic owning the DiscoveredCharacteristicDescriptor
- */
- const DiscoveredCharacteristic& characteristic;
-
- /**
- * The characteristic descriptor discovered
- */
- const DiscoveredCharacteristicDescriptor& descriptor;
- };
-
- /**
- * @brief Parameter type of CharacteristicDescriptorDiscovery::TerminationCallback_t.
- * @details Once a characteristic descriptor discovery process terminate, the termination
- * callback registered for the discovery operation through
- * GattClient::discoverCharacteristicDescriptors or DiscoveredCharacteristic::discoverDescriptors
- * will be called with this parameter.
- */
- struct TerminationCallbackParams_t {
- /**
- * The characteristic for which the descriptors has been discovered
- */
- const DiscoveredCharacteristic& characteristic;
-
- /**
- * status of the discovery operation
- */
- ble_error_t status;
- };
-
- /**
- * @brief Callback type for when a matching characteristic descriptor is found during
- * characteristic descriptor discovery.
- *
- * @param param A pointer to a DiscoveryCallbackParams_t object which will remain
- * valid for the lifetime of the callback. Memory for this object is owned by
- * the BLE_API eventing framework. The application can safely make a persistent
- * shallow-copy of this object in order to work with the service beyond the
- * callback.
- */
- typedef FunctionPointerWithContext<const DiscoveryCallbackParams_t*> DiscoveryCallback_t;
-
- /**
- * @brief Callback type for when characteristic descriptor discovery terminates.
- *
- * @param param A pointer to a TerminationCallbackParams_t object which will remain
- * valid for the lifetime of the callback. Memory for this object is owned by
- * the BLE_API eventing framework. The application can safely make a persistent
- * shallow-copy of this object in order to work with the service beyond the
- * callback.
- */
- typedef FunctionPointerWithContext<const TerminationCallbackParams_t*> TerminationCallback_t;
-};
-
-#endif // ifndef __CHARACTERISTIC_DESCRIPTOR_DISCOVERY_H__
\ No newline at end of file
--- a/ble/DiscoveredCharacteristic.h Tue Jan 12 19:47:52 2016 +0000
+++ b/ble/DiscoveredCharacteristic.h Wed Apr 06 19:13:46 2016 +0100
@@ -1,329 +1,186 @@
-/* mbed Microcontroller Library
- * Copyright (c) 2006-2013 ARM Limited
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __DISCOVERED_CHARACTERISTIC_H__
-#define __DISCOVERED_CHARACTERISTIC_H__
-
-#include "UUID.h"
-#include "Gap.h"
-#include "GattAttribute.h"
-#include "GattClient.h"
-#include "CharacteristicDescriptorDiscovery.h"
-#include "ble/DiscoveredCharacteristicDescriptor.h"
-
-/**
- * @brief Representation of a characteristic discovered during a GattClient
- * discovery procedure (see GattClient::launchServiceDiscovery ).
- *
- * @detail Provide detailed informations about a discovered characteristic like:
- * - Its UUID (see #getUUID).
- * - The most important handles of the characteristic definition
- * (see #getDeclHandle, #getValueHandle, #getLastHandle )
- * - Its properties (see #getProperties).
- * This class also provide functions to operate on the characteristic:
- * - Read the characteristic value (see #read)
- * - Writing a characteristic value (see #write or #writeWoResponse)
- * - Discover descriptors inside the characteristic definition. These descriptors
- * extends the characteristic. More information about descriptor usage is
- * available in DiscoveredCharacteristicDescriptor class.
- */
-class DiscoveredCharacteristic {
-public:
- struct Properties_t {
- uint8_t _broadcast :1; /**< Broadcasting the value permitted. */
- uint8_t _read :1; /**< Reading the value permitted. */
- uint8_t _writeWoResp :1; /**< Writing the value with Write Command permitted. */
- uint8_t _write :1; /**< Writing the value with Write Request permitted. */
- uint8_t _notify :1; /**< Notifications of the value permitted. */
- uint8_t _indicate :1; /**< Indications of the value permitted. */
- uint8_t _authSignedWrite :1; /**< Writing the value with Signed Write Command permitted. */
-
- public:
- bool broadcast(void) const {return _broadcast; }
- bool read(void) const {return _read; }
- bool writeWoResp(void) const {return _writeWoResp; }
- bool write(void) const {return _write; }
- bool notify(void) const {return _notify; }
- bool indicate(void) const {return _indicate; }
- bool authSignedWrite(void) const {return _authSignedWrite;}
-
- /**
- * @brief "Equal to" operator for DiscoveredCharacteristic::Properties_t
- *
- * @param lhs[in] The left hand side of the equality expression
- * @param rhs[in] The right hand side of the equality expression
- *
- * @return true if operands are equals, false otherwise.
- */
- friend bool operator==(Properties_t lhs, Properties_t rhs) {
- return lhs._broadcast == rhs._broadcast &&
- lhs._read == rhs._read &&
- lhs._writeWoResp == rhs._writeWoResp &&
- lhs._write == rhs._write &&
- lhs._notify == rhs._notify &&
- lhs._indicate == rhs._indicate &&
- lhs._authSignedWrite == rhs._authSignedWrite;
- }
-
- /**
- * @brief "Not equal to" operator for DiscoveredCharacteristic::Properties_t
- *
- * @param lhs The right hand side of the expression
- * @param rhs The left hand side of the expression
- *
- * @return true if operands are not equals, false otherwise.
- */
- friend bool operator!=(Properties_t lhs, Properties_t rhs) {
- return !(lhs == rhs);
- }
-
- private:
- operator uint8_t() const; /* Disallow implicit conversion into an integer. */
- operator unsigned() const; /* Disallow implicit conversion into an integer. */
- };
-
- /**
- * Initiate (or continue) a read for the value attribute, optionally at a
- * given offset. If the characteristic or descriptor to be read is longer
- * than ATT_MTU - 1, this function must be called multiple times with
- * appropriate offset to read the complete value.
- *
- * @param offset[in] The position - in the characteristic value bytes stream - where
- * the read operation begin.
- *
- * @return BLE_ERROR_NONE if a read has been initiated, or
- * BLE_ERROR_INVALID_STATE if some internal state about the connection is invalid, or
- * BLE_STACK_BUSY if some client procedure is already in progress, or
- * BLE_ERROR_OPERATION_NOT_PERMITTED due to the characteristic's properties.
- */
- ble_error_t read(uint16_t offset = 0) const;
-
- /**
- * @brief Same as #read(uint16_t) const but allow the user to register a callback
- * which will be fired once the read is done.
- *
- * @param offset[in] The position - in the characteristic value bytes stream - where
- * the read operation begin.
- * @param onRead[in] Continuation of the read operation
- */
- ble_error_t read(uint16_t offset, const GattClient::ReadCallback_t& onRead) const;
-
- /**
- * Perform a write without response procedure.
- *
- * @param[in] length
- * The amount of data being written.
- * @param[in] value
- * The bytes being written.
- *
- * @note It is important to note that a write without response will generate
- * an onDataSent() callback when the packet has been transmitted. There
- * will be a BLE-stack specific limit to the number of pending
- * writeWoResponse operations; the user may want to use the onDataSent()
- * callback for flow-control.
- *
- * @retval BLE_ERROR_NONE Successfully started the Write procedure, or
- * BLE_ERROR_INVALID_STATE if some internal state about the connection is invalid, or
- * BLE_STACK_BUSY if some client procedure is already in progress, or
- * BLE_ERROR_NO_MEM if there are no available buffers left to process the request, or
- * BLE_ERROR_OPERATION_NOT_PERMITTED due to the characteristic's properties.
- */
- ble_error_t writeWoResponse(uint16_t length, const uint8_t *value) const;
-
- /**
- * Initiate a GATT Characteristic Descriptor Discovery procedure for descriptors within this characteristic.
- *
- * @param[in] onDescriptorDiscovered This callback will be called every time a descriptor is discovered
- * @param[in] onTermination This callback will be called when the discovery process is over.
- *
- * @return BLE_ERROR_NONE if descriptor discovery is launched successfully; else an appropriate error.
- */
- ble_error_t discoverDescriptors(const CharacteristicDescriptorDiscovery::DiscoveryCallback_t& onDescriptorDiscovered,
- const CharacteristicDescriptorDiscovery::TerminationCallback_t& onTermination) const;
-
- /**
- * Perform a write procedure.
- *
- * @param[in] length
- * The amount of data being written.
- * @param[in] value
- * The bytes being written.
- *
- * @note It is important to note that a write will generate
- * an onDataWritten() callback when the peer acknowledges the request.
- *
- * @retval BLE_ERROR_NONE Successfully started the Write procedure, or
- * BLE_ERROR_INVALID_STATE if some internal state about the connection is invalid, or
- * BLE_STACK_BUSY if some client procedure is already in progress, or
- * BLE_ERROR_NO_MEM if there are no available buffers left to process the request, or
- * BLE_ERROR_OPERATION_NOT_PERMITTED due to the characteristic's properties.
- */
- ble_error_t write(uint16_t length, const uint8_t *value) const;
-
- /**
- * Same as #write(uint16_t, const uint8_t *) const but register a callback
- * which will be called once the data has been written.
- *
- * @param[in] length The amount of bytes to write.
- * @param[in] value The bytes to write.
- * @param[in] onRead Continuation callback for the write operation
- */
- ble_error_t write(uint16_t length, const uint8_t *value, const GattClient::WriteCallback_t& onWrite) const;
-
- void setupLongUUID(UUID::LongUUIDBytes_t longUUID, UUID::ByteOrder_t order = UUID::MSB) {
- uuid.setupLong(longUUID, order);
- }
-
-public:
- /**
- * @brief Get the UUID of the discovered characteristic
- * @return the UUID of this characteristic
- */
- const UUID& getUUID(void) const {
- return uuid;
- }
-
- /**
- * @brief Get the properties of this characteristic
- * @return the set of properties of this characteristic
- */
- const Properties_t& getProperties(void) const {
- return props;
- }
-
- /**
- * @brief Get the declaration handle of this characteristic.
- * @detail The declaration handle is the first handle of a characteristic
- * definition. The value accessible at this handle contains the following
- * informations:
- * - The characteristics properties (see Properties_t). This value can
- * be accessed by using #getProperties .
- * - The characteristic value attribute handle. This field can be accessed
- * by using #getValueHandle .
- * - The characteristic UUID, this value can be accessed by using the
- * function #getUUID .
- * @return the declaration handle of this characteristic.
- */
- GattAttribute::Handle_t getDeclHandle(void) const {
- return declHandle;
- }
-
- /**
- * @brief Return the handle used to access the value of this characteristic.
- * @details This handle is the one provided in the characteristic declaration
- * value. Usually, it is equal to #getDeclHandle() + 1. But it is not always
- * the case. Anyway, users are allowed to use #getDeclHandle() + 1 to access
- * the value of a characteristic.
- * @return The handle to access the value of this characteristic.
- */
- GattAttribute::Handle_t getValueHandle(void) const {
- return valueHandle;
- }
-
- /**
- * @brief Return the last handle of the characteristic definition.
- * @details A Characteristic definition can contain a lot of handles:
- * - one for the declaration (see #getDeclHandle)
- * - one for the value (see #getValueHandle)
- * - zero of more for the characteristic descriptors.
- * This handle is the last handle of the characteristic definition.
- * @return The last handle of this characteristic definition.
- */
- GattAttribute::Handle_t getLastHandle(void) const {
- return lastHandle;
- }
-
- /**
- * @brief Return the GattClient which can operate on this characteristic.
- * @return The GattClient which can operate on this characteristic.
- */
- GattClient* getGattClient() {
- return gattc;
- }
-
- /**
- * @brief Return the GattClient which can operate on this characteristic.
- * @return The GattClient which can operate on this characteristic.
- */
- const GattClient* getGattClient() const {
- return gattc;
- }
-
- /**
- * @brief Return the connection handle to the GattServer which contain
- * this characteristic.
- * @return the connection handle to the GattServer which contain
- * this characteristic.
- */
- Gap::Handle_t getConnectionHandle() const {
- return connHandle;
- }
-
- /**
- * @brief "Equal to" operator for DiscoveredCharacteristic
- *
- * @param lhs[in] The left hand side of the equality expression
- * @param rhs[in] The right hand side of the equality expression
- *
- * @return true if operands are equals, false otherwise.
- */
- friend bool operator==(const DiscoveredCharacteristic& lhs, const DiscoveredCharacteristic& rhs) {
- return lhs.gattc == rhs.gattc &&
- lhs.uuid == rhs.uuid &&
- lhs.props == rhs.props &&
- lhs.declHandle == rhs.declHandle &&
- lhs.valueHandle == rhs.valueHandle &&
- lhs.lastHandle == rhs.lastHandle &&
- lhs.connHandle == rhs.connHandle;
- }
-
- /**
- * @brief "Not equal to" operator for DiscoveredCharacteristic
- *
- * @param lhs[in] The right hand side of the expression
- * @param rhs[in] The left hand side of the expression
- *
- * @return true if operands are not equals, false otherwise.
- */
- friend bool operator !=(const DiscoveredCharacteristic& lhs, const DiscoveredCharacteristic& rhs) {
- return !(lhs == rhs);
- }
-
-public:
- DiscoveredCharacteristic() : gattc(NULL),
- uuid(UUID::ShortUUIDBytes_t(0)),
- props(),
- declHandle(GattAttribute::INVALID_HANDLE),
- valueHandle(GattAttribute::INVALID_HANDLE),
- lastHandle(GattAttribute::INVALID_HANDLE),
- connHandle() {
- /* empty */
- }
-
-protected:
- GattClient *gattc;
-
-protected:
- UUID uuid;
- Properties_t props;
- GattAttribute::Handle_t declHandle;
- GattAttribute::Handle_t valueHandle;
- GattAttribute::Handle_t lastHandle;
-
- Gap::Handle_t connHandle;
-};
-
+/* mbed Microcontroller Library
+ * Copyright (c) 2006-2013 ARM Limited
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __DISCOVERED_CHARACTERISTIC_H__
+#define __DISCOVERED_CHARACTERISTIC_H__
+
+#include "UUID.h"
+#include "Gap.h"
+#include "GattAttribute.h"
+#include "GattClient.h"
+
+/**
+ * Structure for holding information about the service and the characteristics
+ * found during the discovery process.
+ */
+class DiscoveredCharacteristic {
+public:
+ struct Properties_t {
+ uint8_t _broadcast :1; /**< Broadcasting the value permitted. */
+ uint8_t _read :1; /**< Reading the value permitted. */
+ uint8_t _writeWoResp :1; /**< Writing the value with Write Command permitted. */
+ uint8_t _write :1; /**< Writing the value with Write Request permitted. */
+ uint8_t _notify :1; /**< Notications of the value permitted. */
+ uint8_t _indicate :1; /**< Indications of the value permitted. */
+ uint8_t _authSignedWrite :1; /**< Writing the value with Signed Write Command permitted. */
+
+ public:
+ bool broadcast(void) const {return _broadcast; }
+ bool read(void) const {return _read; }
+ bool writeWoResp(void) const {return _writeWoResp; }
+ bool write(void) const {return _write; }
+ bool notify(void) const {return _notify; }
+ bool indicate(void) const {return _indicate; }
+ bool authSignedWrite(void) const {return _authSignedWrite;}
+
+ private:
+ operator uint8_t() const; /* Disallow implicit conversion into an integer. */
+ operator unsigned() const; /* Disallow implicit conversion into an integer. */
+ };
+
+ /**
+ * Structure for holding information about the service and the characteristics
+ * found during the discovery process.
+ */
+ struct DiscoveredDescriptor {
+ GattAttribute::Handle_t handle; /**< Descriptor Handle. */
+ UUID uuid; /**< Descriptor UUID. */
+ };
+
+ /**
+ * Callback type for when a characteristic descriptor is found during descriptor-
+ * discovery. The receiving function is passed in a pointer to a
+ * DiscoveredDescriptor object which will remain valid for the lifetime
+ * of the callback. Memory for this object is owned by the BLE_API eventing
+ * framework. The application can safely make a persistent shallow-copy of
+ * this object in order to work with the characteristic beyond the callback.
+ */
+ typedef void (*DescriptorCallback_t)(const DiscoveredDescriptor *);
+
+ /**
+ * Initiate (or continue) a read for the value attribute, optionally at a
+ * given offset. If the characteristic or descriptor to be read is longer
+ * than ATT_MTU - 1, this function must be called multiple times with
+ * appropriate offset to read the complete value.
+ *
+ * @return BLE_ERROR_NONE if a read has been initiated, or
+ * BLE_ERROR_INVALID_STATE if some internal state about the connection is invalid, or
+ * BLE_STACK_BUSY if some client procedure is already in progress, or
+ * BLE_ERROR_OPERATION_NOT_PERMITTED due to the characteristic's properties.
+ */
+ ble_error_t read(uint16_t offset = 0) const;
+
+ ble_error_t read(uint16_t offset, const GattClient::ReadCallback_t& onRead) const;
+
+ /**
+ * Perform a write without response procedure.
+ *
+ * @param length
+ * The amount of data being written.
+ * @param value
+ * The bytes being written.
+ *
+ * @note It is important to note that a write without response will generate
+ * an onDataSent() callback when the packet has been transmitted. There
+ * will be a BLE-stack specific limit to the number of pending
+ * writeWoResponse operations; the user may want to use the onDataSent()
+ * callback for flow-control.
+ *
+ * @retval BLE_ERROR_NONE Successfully started the Write procedure, or
+ * BLE_ERROR_INVALID_STATE if some internal state about the connection is invalid, or
+ * BLE_STACK_BUSY if some client procedure is already in progress, or
+ * BLE_ERROR_NO_MEM if there are no available buffers left to process the request, or
+ * BLE_ERROR_OPERATION_NOT_PERMITTED due to the characteristic's properties.
+ */
+ ble_error_t writeWoResponse(uint16_t length, const uint8_t *value) const;
+
+ /**
+ * Initiate a GATT Characteristic Descriptor Discovery procedure for descriptors within this characteristic.
+ *
+ * @param callback
+ * @param matchingUUID
+ * Filter for descriptors. Defaults to wildcard which will discover all descriptors.
+ *
+ * @return BLE_ERROR_NONE if descriptor discovery is launched successfully; else an appropriate error.
+ */
+ ble_error_t discoverDescriptors(DescriptorCallback_t callback, const UUID &matchingUUID = UUID::ShortUUIDBytes_t(BLE_UUID_UNKNOWN)) const;
+
+ /**
+ * Perform a write procedure.
+ *
+ * @param length
+ * The amount of data being written.
+ * @param value
+ * The bytes being written.
+ *
+ * @note It is important to note that a write will generate
+ * an onDataWritten() callback when the peer acknowledges the request.
+ *
+ * @retval BLE_ERROR_NONE Successfully started the Write procedure, or
+ * BLE_ERROR_INVALID_STATE if some internal state about the connection is invalid, or
+ * BLE_STACK_BUSY if some client procedure is already in progress, or
+ * BLE_ERROR_NO_MEM if there are no available buffers left to process the request, or
+ * BLE_ERROR_OPERATION_NOT_PERMITTED due to the characteristic's properties.
+ */
+ 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);
+ }
+
+public:
+ const UUID& getUUID(void) const {
+ return uuid;
+ }
+
+ const Properties_t& getProperties(void) const {
+ return props;
+ }
+
+ const GattAttribute::Handle_t& getDeclHandle(void) const {
+ return declHandle;
+ }
+ const GattAttribute::Handle_t& getValueHandle(void) const {
+ return valueHandle;
+ }
+
+public:
+ DiscoveredCharacteristic() : gattc(NULL),
+ uuid(UUID::ShortUUIDBytes_t(0)),
+ props(),
+ declHandle(GattAttribute::INVALID_HANDLE),
+ valueHandle(GattAttribute::INVALID_HANDLE) {
+ /* empty */
+ }
+
+protected:
+ GattClient *gattc;
+
+protected:
+ UUID uuid;
+ Properties_t props;
+ GattAttribute::Handle_t declHandle;
+ GattAttribute::Handle_t valueHandle;
+
+ Gap::Handle_t connHandle;
+};
+
#endif /*__DISCOVERED_CHARACTERISTIC_H__*/
\ No newline at end of file
--- a/ble/DiscoveredCharacteristicDescriptor.h Tue Jan 12 19:47:52 2016 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,111 +0,0 @@
-/* mbed Microcontroller Library
- * Copyright (c) 2006-2013 ARM Limited
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __DISCOVERED_CHARACTERISTIC_DESCRIPTOR_H__
-#define __DISCOVERED_CHARACTERISTIC_DESCRIPTOR_H__
-
-#include "UUID.h"
-#include "Gap.h"
-#include "GattAttribute.h"
-#include "GattClient.h"
-#include "CharacteristicDescriptorDiscovery.h"
-
-/**
- * @brief Representation of a descriptor discovered during a GattClient
- * discovery procedure (see GattClient::discoverCharacteristicDescriptors or
- * DiscoveredCharacteristic::discoverDescriptors ).
- *
- * @detail Provide detailed informations about a discovered characteristic descriptor
- * like:
- * - Its UUID (see #getUUID).
- * - Its handle (see #getAttributeHandle)
- * Basic read (see GattClient::read) and write (see GattClient::write) procedure from
- * GattClient can be used access the value of the descriptor.
- *
- * @todo read member function
- * @todo write member function
- * @todo enumeration of standard descriptors
- */
-class DiscoveredCharacteristicDescriptor {
-
-public:
-
- /**
- * @brief construct a new instance of a DiscoveredCharacteristicDescriptor
- *
- * @param client The client from where the descriptor has been discovered
- * @param connectionHandle The connection handle on which the descriptor has
- * been discovered
- * @param attributeHandle The handle of the attribute containing this descriptor
- * @param uuid The UUID of the descriptor
- */
- DiscoveredCharacteristicDescriptor(
- GattClient* client, Gap::Handle_t connectionHandle, GattAttribute::Handle_t attributeHandle, const UUID& uuid) :
- _client(client), _connectionHandle(connectionHandle), _uuid(uuid), _gattHandle(attributeHandle) {
-
- }
-
- /**
- * @brief Return the GattClient which can operate on this descriptor.
- * @return The GattClient which can operate on this descriptor.
- */
- GattClient* getGattClient() {
- return _client;
- }
-
- /**
- * @brief Return the GattClient which can operate on this descriptor.
- * @return The GattClient which can operate on this descriptor.
- */
- const GattClient* getGattClient() const {
- return _client;
- }
-
- /**
- * @brief Return the connection handle to the GattServer which contain
- * this descriptor.
- * @return the connection handle to the GattServer which contain
- * this descriptor.
- */
- Gap::Handle_t getConnectionHandle() const {
- return _connectionHandle;
- }
-
- /**
- * @brief Return the UUID of this descriptor
- * @return the UUID of this descriptor
- */
- const UUID& getUUID(void) const {
- return _uuid;
- }
-
- /**
- * @brief Return the attribute handle to use to access to this descriptor
- * on the gatt server.
- * @return The attribute handle of the descriptor
- */
- GattAttribute::Handle_t getAttributeHandle() const {
- return _gattHandle;
- }
-
-private:
- GattClient *_client;
- Gap::Handle_t _connectionHandle;
- UUID _uuid;
- GattAttribute::Handle_t _gattHandle;
-};
-
-#endif /*__DISCOVERED_CHARACTERISTIC_DESCRIPTOR_H__*/
\ No newline at end of file
--- a/ble/DiscoveredService.h Tue Jan 12 19:47:52 2016 +0000
+++ b/ble/DiscoveredService.h Wed Apr 06 19:13:46 2016 +0100
@@ -1,71 +1,71 @@
-/* mbed Microcontroller Library
- * Copyright (c) 2006-2013 ARM Limited
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __DISCOVERED_SERVICE_H__
-#define __DISCOVERED_SERVICE_H__
-
-#include "UUID.h"
-#include "GattAttribute.h"
-
-/**@brief Type for holding information about the service and the characteristics found during
- * the discovery process.
- */
-class DiscoveredService {
-public:
- void setup(UUID uuidIn, GattAttribute::Handle_t startHandleIn, GattAttribute::Handle_t endHandleIn) {
- uuid = uuidIn;
- startHandle = startHandleIn;
- endHandle = endHandleIn;
- }
-
- void setup(GattAttribute::Handle_t startHandleIn, GattAttribute::Handle_t endHandleIn) {
- startHandle = startHandleIn;
- endHandle = endHandleIn;
- }
-
- void setupLongUUID(UUID::LongUUIDBytes_t longUUID, UUID::ByteOrder_t order = UUID::MSB) {
- uuid.setupLong(longUUID, order);
- }
-
-public:
- const UUID &getUUID(void) const {
- return uuid;
- }
-
- const GattAttribute::Handle_t& getStartHandle(void) const {
- return startHandle;
- }
- const GattAttribute::Handle_t& getEndHandle(void) const {
- return endHandle;
- }
-
-public:
- DiscoveredService() : uuid(UUID::ShortUUIDBytes_t(0)),
- startHandle(GattAttribute::INVALID_HANDLE),
- endHandle(GattAttribute::INVALID_HANDLE) {
- /* empty */
- }
-
-private:
- DiscoveredService(const DiscoveredService &);
-
-private:
- UUID uuid; /**< UUID of the service. */
- GattAttribute::Handle_t startHandle; /**< Service Handle Range. */
- GattAttribute::Handle_t endHandle; /**< Service Handle Range. */
-};
-
+/* mbed Microcontroller Library
+ * Copyright (c) 2006-2013 ARM Limited
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __DISCOVERED_SERVICE_H__
+#define __DISCOVERED_SERVICE_H__
+
+#include "UUID.h"
+#include "GattAttribute.h"
+
+/**@brief Type for holding information about the service and the characteristics found during
+ * the discovery process.
+ */
+class DiscoveredService {
+public:
+ void setup(UUID uuidIn, GattAttribute::Handle_t startHandleIn, GattAttribute::Handle_t endHandleIn) {
+ uuid = uuidIn;
+ startHandle = startHandleIn;
+ endHandle = endHandleIn;
+ }
+
+ void setup(GattAttribute::Handle_t startHandleIn, GattAttribute::Handle_t endHandleIn) {
+ startHandle = startHandleIn;
+ endHandle = endHandleIn;
+ }
+
+ void setupLongUUID(UUID::LongUUIDBytes_t longUUID) {
+ uuid.setupLong(longUUID);
+ }
+
+public:
+ const UUID &getUUID(void) const {
+ return uuid;
+ }
+
+ const GattAttribute::Handle_t& getStartHandle(void) const {
+ return startHandle;
+ }
+ const GattAttribute::Handle_t& getEndHandle(void) const {
+ return endHandle;
+ }
+
+public:
+ DiscoveredService() : uuid(UUID::ShortUUIDBytes_t(0)),
+ startHandle(GattAttribute::INVALID_HANDLE),
+ endHandle(GattAttribute::INVALID_HANDLE) {
+ /* empty */
+ }
+
+private:
+ DiscoveredService(const DiscoveredService &);
+
+private:
+ UUID uuid; /**< UUID of the service. */
+ GattAttribute::Handle_t startHandle; /**< Service Handle Range. */
+ GattAttribute::Handle_t endHandle; /**< Service Handle Range. */
+};
+
#endif /*__DISCOVERED_SERVICE_H__*/
\ No newline at end of file
--- a/ble/Gap.h Tue Jan 12 19:47:52 2016 +0000
+++ b/ble/Gap.h Wed Apr 06 19:13:46 2016 +0100
@@ -1,1400 +1,1070 @@
-/* mbed Microcontroller Library
- * Copyright (c) 2006-2013 ARM Limited
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __GAP_H__
-#define __GAP_H__
-
-#include "ble/BLEProtocol.h"
-#include "GapAdvertisingData.h"
-#include "GapAdvertisingParams.h"
-#include "GapScanningParams.h"
-#include "GapEvents.h"
-#include "CallChainOfFunctionPointersWithContext.h"
-#include "FunctionPointerWithContext.h"
-#include "deprecate.h"
-
-/* Forward declarations for classes that will only be used for pointers or references in the following. */
-class GapAdvertisingParams;
-class GapScanningParams;
-class GapAdvertisingData;
-
-class Gap {
- /*
- * DEPRECATION ALERT: all of the APIs in this `public` block are deprecated.
- * They have been relocated to the class BLEProtocol.
- */
-public:
- /**
- * Address-type for BLEProtocol addresses.
- *
- * @note: deprecated. Use BLEProtocol::AddressType_t instead.
- */
- typedef BLEProtocol::AddressType_t AddressType_t;
-
- /**
- * Address-type for BLEProtocol addresses.
- * @note: deprecated. Use BLEProtocol::AddressType_t instead.
- */
- typedef BLEProtocol::AddressType_t addr_type_t;
-
- /**
- * Address-type for BLEProtocol addresses.
- * \deprecated: Use BLEProtocol::AddressType_t instead.
- *
- * DEPRECATION ALERT: The following constants have been left in their
- * deprecated state to transparenly support existing applications which may
- * have used Gap::ADDR_TYPE_*.
- */
- enum DeprecatedAddressType_t {
- ADDR_TYPE_PUBLIC = BLEProtocol::AddressType::PUBLIC,
- ADDR_TYPE_RANDOM_STATIC = BLEProtocol::AddressType::RANDOM_STATIC,
- ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE = BLEProtocol::AddressType::RANDOM_PRIVATE_RESOLVABLE,
- ADDR_TYPE_RANDOM_PRIVATE_NON_RESOLVABLE = BLEProtocol::AddressType::RANDOM_PRIVATE_NON_RESOLVABLE
- };
-
- static const unsigned ADDR_LEN = BLEProtocol::ADDR_LEN; /**< Length (in octets) of the BLE MAC address. */
- typedef BLEProtocol::AddressBytes_t Address_t; /**< 48-bit address, LSB format. @Note: Deprecated. Use BLEProtocol::AddressBytes_t instead. */
- typedef BLEProtocol::AddressBytes_t address_t; /**< 48-bit address, LSB format. @Note: Deprecated. Use BLEProtocol::AddressBytes_t instead. */
-
-public:
- enum TimeoutSource_t {
- TIMEOUT_SRC_ADVERTISING = 0x00, /**< Advertising timeout. */
- TIMEOUT_SRC_SECURITY_REQUEST = 0x01, /**< Security request timeout. */
- TIMEOUT_SRC_SCAN = 0x02, /**< Scanning timeout. */
- TIMEOUT_SRC_CONN = 0x03, /**< Connection timeout. */
- };
-
- /**
- * Enumeration for disconnection reasons. The values for these reasons are
- * derived from Nordic's implementation, but the reasons are meant to be
- * independent of the transport. If you are returned a reason that is not
- * covered by this enumeration, please refer to the underlying
- * transport library.
- */
- enum DisconnectionReason_t {
- CONNECTION_TIMEOUT = 0x08,
- REMOTE_USER_TERMINATED_CONNECTION = 0x13,
- REMOTE_DEV_TERMINATION_DUE_TO_LOW_RESOURCES = 0x14, /**< Remote device terminated connection due to low resources.*/
- REMOTE_DEV_TERMINATION_DUE_TO_POWER_OFF = 0x15, /**< Remote device terminated connection due to power off. */
- LOCAL_HOST_TERMINATED_CONNECTION = 0x16,
- CONN_INTERVAL_UNACCEPTABLE = 0x3B,
- };
-
- /**
- * Enumeration for whitelist advertising policy filter modes. The possible
- * filter modes were obtained from the Bluetooth Core Specification
- * 4.2 (Vol. 6), Part B, Section 4.3.2.
- *
- * @experimental
- */
- enum AdvertisingPolicyMode_t {
- ADV_POLICY_IGNORE_WHITELIST = 0,
- ADV_POLICY_FILTER_SCAN_REQS = 1,
- ADV_POLICY_FILTER_CONN_REQS = 2,
- ADV_POLICY_FILTER_ALL_REQS = 3,
- };
-
- /**
- * Enumeration for whitelist scanning policy filter modes. The possible
- * filter modes were obtained from the Bluetooth Core Specification
- * 4.2 (Vol. 6), Part B, Section 4.3.3.
- *
- * @experimental
- */
- enum ScanningPolicyMode_t {
- SCAN_POLICY_IGNORE_WHITELIST = 0,
- SCAN_POLICY_FILTER_ALL_ADV = 1,
- };
-
- /**
- * Enumeration for the whitelist initiator policy fiter modes. The possible
- * filter modes were obtained from the Bluetooth Core Specification
- * 4.2 (vol. 6), Part B, Section 4.4.4.
- *
- * @experimental
- */
- enum InitiatorPolicyMode_t {
- INIT_POLICY_IGNORE_WHITELIST = 0,
- INIT_POLICY_FILTER_ALL_ADV = 1,
- };
-
- /**
- * Representation of a Bluetooth Low Enery Whitelist containing addresses.
- *
- * @experimental
- */
- struct Whitelist_t {
- BLEProtocol::Address_t *addresses;
- uint8_t size;
- uint8_t capacity;
- };
-
-
- /* Describes the current state of the device (more than one bit can be set). */
- struct GapState_t {
- unsigned advertising : 1; /**< Peripheral is currently advertising. */
- unsigned connected : 1; /**< Peripheral is connected to a central. */
- };
-
- typedef uint16_t Handle_t; /* Type for connection handle. */
-
- typedef struct {
- uint16_t minConnectionInterval; /**< Minimum Connection Interval in 1.25 ms units, see @ref BLE_GAP_CP_LIMITS.*/
- uint16_t maxConnectionInterval; /**< Maximum Connection Interval in 1.25 ms units, see @ref BLE_GAP_CP_LIMITS.*/
- uint16_t slaveLatency; /**< Slave Latency in number of connection events, see @ref BLE_GAP_CP_LIMITS.*/
- uint16_t connectionSupervisionTimeout; /**< Connection Supervision Timeout in 10 ms units, see @ref BLE_GAP_CP_LIMITS.*/
- } ConnectionParams_t;
-
- enum Role_t {
- PERIPHERAL = 0x1, /**< Peripheral Role. */
- CENTRAL = 0x2, /**< Central Role. */
- };
-
- struct AdvertisementCallbackParams_t {
- BLEProtocol::AddressBytes_t peerAddr;
- int8_t rssi;
- bool isScanResponse;
- GapAdvertisingParams::AdvertisingType_t type;
- uint8_t advertisingDataLen;
- const uint8_t *advertisingData;
- };
- typedef FunctionPointerWithContext<const AdvertisementCallbackParams_t *> AdvertisementReportCallback_t;
-
- struct ConnectionCallbackParams_t {
- Handle_t handle;
- Role_t role;
- BLEProtocol::AddressType_t peerAddrType;
- BLEProtocol::AddressBytes_t peerAddr;
- BLEProtocol::AddressType_t ownAddrType;
- BLEProtocol::AddressBytes_t ownAddr;
- const ConnectionParams_t *connectionParams;
-
- ConnectionCallbackParams_t(Handle_t handleIn,
- Role_t roleIn,
- BLEProtocol::AddressType_t peerAddrTypeIn,
- const uint8_t *peerAddrIn,
- BLEProtocol::AddressType_t ownAddrTypeIn,
- const uint8_t *ownAddrIn,
- const ConnectionParams_t *connectionParamsIn) :
- handle(handleIn),
- role(roleIn),
- peerAddrType(peerAddrTypeIn),
- peerAddr(),
- ownAddrType(ownAddrTypeIn),
- ownAddr(),
- connectionParams(connectionParamsIn) {
- memcpy(peerAddr, peerAddrIn, ADDR_LEN);
- memcpy(ownAddr, ownAddrIn, ADDR_LEN);
- }
- };
-
- struct DisconnectionCallbackParams_t {
- Handle_t handle;
- DisconnectionReason_t reason;
-
- DisconnectionCallbackParams_t(Handle_t handleIn,
- DisconnectionReason_t reasonIn) :
- handle(handleIn),
- reason(reasonIn)
- {}
- };
-
- static const uint16_t UNIT_1_25_MS = 1250; /**< Number of microseconds in 1.25 milliseconds. */
- static uint16_t MSEC_TO_GAP_DURATION_UNITS(uint32_t durationInMillis) {
- return (durationInMillis * 1000) / UNIT_1_25_MS;
- }
-
- typedef FunctionPointerWithContext<TimeoutSource_t> TimeoutEventCallback_t;
- typedef CallChainOfFunctionPointersWithContext<TimeoutSource_t> TimeoutEventCallbackChain_t;
-
- typedef FunctionPointerWithContext<const ConnectionCallbackParams_t *> ConnectionEventCallback_t;
- typedef CallChainOfFunctionPointersWithContext<const ConnectionCallbackParams_t *> ConnectionEventCallbackChain_t;
-
- typedef FunctionPointerWithContext<const DisconnectionCallbackParams_t*> DisconnectionEventCallback_t;
- typedef CallChainOfFunctionPointersWithContext<const DisconnectionCallbackParams_t*> DisconnectionEventCallbackChain_t;
-
- typedef FunctionPointerWithContext<bool> RadioNotificationEventCallback_t;
-
- typedef FunctionPointerWithContext<const Gap *> GapShutdownCallback_t;
- typedef CallChainOfFunctionPointersWithContext<const Gap *> GapShutdownCallbackChain_t;
-
- /*
- * The following functions are meant to be overridden in the platform-specific sub-class.
- */
-public:
- /**
- * Set the BTLE MAC address and type. Please note that the address format is
- * least significant byte first (LSB). Please refer to BLEProtocol::AddressBytes_t.
- *
- * @return BLE_ERROR_NONE on success.
- */
- virtual ble_error_t setAddress(BLEProtocol::AddressType_t type, const BLEProtocol::AddressBytes_t address) {
- /* avoid compiler warnings about unused variables */
- (void)type;
- (void)address;
-
- return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porter(s): override this API if this capability is supported. */
- }
-
- /**
- * Fetch the BTLE MAC address and type.
- *
- * @return BLE_ERROR_NONE on success.
- */
- virtual ble_error_t getAddress(BLEProtocol::AddressType_t *typeP, BLEProtocol::AddressBytes_t address) {
- /* Avoid compiler warnings about unused variables. */
- (void)typeP;
- (void)address;
-
- return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porter(s): override this API if this capability is supported. */
- }
-
- /**
- * @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 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. */
- }
-
- /**
- * @return Maximum Advertising interval in milliseconds.
- */
- virtual uint16_t getMaxAdvertisingInterval(void) const {
- return 0xFFFF; /* Requesting action from porter(s): override this API if this capability is supported. */
- }
-
- virtual ble_error_t stopAdvertising(void) {
- return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porter(s): override this API if this capability is supported. */
- }
-
- /**
- * Stop scanning. The current scanning parameters remain in effect.
- *
- * @retval BLE_ERROR_NONE if successfully stopped scanning procedure.
- */
- virtual ble_error_t stopScan() {
- return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porter(s): override this API if this capability is supported. */
- }
-
- /**
- * Create a connection (GAP Link Establishment).
- *
- * @param peerAddr
- * 48-bit address, LSB format.
- * @param peerAddrType
- * Address type of the peer.
- * @param connectionParams
- * Connection parameters.
- * @param scanParams
- * Paramters to be used while scanning for the peer.
- * @return BLE_ERROR_NONE if connection establishment procedure is started
- * successfully. The connectionCallChain (if set) will be invoked upon
- * a connection event.
- */
- virtual ble_error_t connect(const BLEProtocol::AddressBytes_t peerAddr,
- BLEProtocol::AddressType_t peerAddrType,
- const ConnectionParams_t *connectionParams,
- const GapScanningParams *scanParams) {
- /* Avoid compiler warnings about unused variables. */
- (void)peerAddr;
- (void)peerAddrType;
- (void)connectionParams;
- (void)scanParams;
-
- return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porter(s): override this API if this capability is supported. */
- }
-
- /**
- * Create a connection (GAP Link Establishment).
- *
- * \deprecated: This funtion overloads Gap::connect(const BLEProtocol::Address_t peerAddr,
- BLEProtocol::AddressType_t peerAddrType,
- const ConnectionParams_t *connectionParams,
- const GapScanningParams *scanParams)
- * to maintain backward compatibility for change from Gap::AddressType_t to BLEProtocol::AddressType_t
- */
- ble_error_t connect(const BLEProtocol::AddressBytes_t peerAddr,
- DeprecatedAddressType_t peerAddrType,
- const ConnectionParams_t *connectionParams,
- const GapScanningParams *scanParams)
- __deprecated_message("Gap::DeprecatedAddressType_t is deprecated, use BLEProtocol::AddressType_t instead") {
- return connect(peerAddr, (BLEProtocol::AddressType_t) peerAddrType, connectionParams, scanParams);
- }
-
- /**
- * This call initiates the disconnection procedure, and its completion will
- * be communicated to the application with an invocation of the
- * disconnectionCallback.
- *
- * @param reason
- * The reason for disconnection; to be sent back to the peer.
- */
- virtual ble_error_t disconnect(Handle_t connectionHandle, DisconnectionReason_t reason) {
- /* avoid compiler warnings about unused variables */
- (void)connectionHandle;
- (void)reason;
-
- return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porter(s): override this API if this capability is supported. */
- }
-
- /**
- * This call initiates the disconnection procedure, and its completion will
- * be communicated to the application with an invocation of the
- * disconnectionCallback.
- *
- * @param reason
- * The reason for disconnection; to be sent back to the peer.
- *
- * @note: This version of disconnect() doesn't take a connection handle. It
- * works reliably only for stacks that are limited to a single
- * connection. This API should be considered *deprecated* in favour of the
- * alternative, which takes a connection handle. It will be dropped in the future.
- */
- virtual ble_error_t disconnect(DisconnectionReason_t reason) {
- /* Avoid compiler warnings about unused variables. */
- (void)reason;
-
- return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porter(s): override this API if this capability is supported. */
- }
-
- /**
- * Get the GAP peripheral preferred connection parameters. These are the
- * defaults that the peripheral would like to have in a connection. The
- * choice of the connection parameters is eventually up to the central.
- *
- * @param[out] params
- * The structure where the parameters will be stored. Memory
- * for this is owned by the caller.
- *
- * @return BLE_ERROR_NONE if the parameters were successfully filled into
- * the given structure pointed to by params.
- */
- virtual ble_error_t getPreferredConnectionParams(ConnectionParams_t *params) {
- /* Avoid compiler warnings about unused variables. */
- (void)params;
-
- return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porter(s): override this API if this capability is supported. */
- }
-
- /**
- * Set the GAP peripheral preferred connection parameters. These are the
- * defaults that the peripheral would like to have in a connection. The
- * choice of the connection parameters is eventually up to the central.
- *
- * @param[in] params
- * The structure containing the desired parameters.
- */
- virtual ble_error_t setPreferredConnectionParams(const ConnectionParams_t *params) {
- /* Avoid compiler warnings about unused variables. */
- (void)params;
-
- return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porter(s): override this API if this capability is supported. */
- }
-
- /**
- * Update connection parameters.
- * In the central role this will initiate a Link Layer connection parameter update procedure.
- * In the peripheral role, this will send the corresponding L2CAP request and wait for
- * the central to perform the procedure.
- *
- * @param[in] handle
- * Connection Handle.
- * @param[in] params
- * Pointer to desired connection parameters. If NULL is provided on a peripheral role,
- * the parameters in the PPCP characteristic of the GAP service will be used instead.
- */
- virtual ble_error_t updateConnectionParams(Handle_t handle, const ConnectionParams_t *params) {
- /* avoid compiler warnings about unused variables */
- (void)handle;
- (void)params;
-
- return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porter(s): override this API if this capability is supported. */
- }
-
- /**
- * Set the device name characteristic in the GAP service.
- * @param[in] deviceName
- * The new value for the device-name. This is a UTF-8 encoded, <b>NULL-terminated</b> string.
- */
- virtual ble_error_t setDeviceName(const uint8_t *deviceName) {
- /* Avoid compiler warnings about unused variables. */
- (void)deviceName;
-
- return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porter(s): override this API if this capability is supported. */
- }
-
- /**
- * Get the value of the device name characteristic in the GAP service.
- * @param[out] deviceName
- * Pointer to an empty buffer where the UTF-8 *non NULL-
- * terminated* string will be placed. Set this
- * value to NULL in order to obtain the deviceName-length
- * from the 'length' parameter.
- *
- * @param[in/out] lengthP
- * (on input) Length of the buffer pointed to by deviceName;
- * (on output) the complete device name length (without the
- * null terminator).
- *
- * @note If the device name is longer than the size of the supplied buffer,
- * length will return the complete device name length, and not the
- * number of bytes actually returned in deviceName. The application may
- * use this information to retry with a suitable buffer size.
- */
- virtual ble_error_t getDeviceName(uint8_t *deviceName, unsigned *lengthP) {
- /* avoid compiler warnings about unused variables */
- (void)deviceName;
- (void)lengthP;
-
- return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porter(s): override this API if this capability is supported. */
- }
-
- /**
- * Set the appearance characteristic in the GAP service.
- * @param[in] appearance
- * The new value for the device-appearance.
- */
- virtual ble_error_t setAppearance(GapAdvertisingData::Appearance appearance) {
- /* Avoid compiler warnings about unused variables. */
- (void)appearance;
-
- return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porter(s): override this API if this capability is supported. */
- }
-
- /**
- * Get the appearance characteristic in the GAP service.
- * @param[out] appearance
- * The new value for the device-appearance.
- */
- virtual ble_error_t getAppearance(GapAdvertisingData::Appearance *appearanceP) {
- /* Avoid compiler warnings about unused variables. */
- (void)appearanceP;
-
- return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porter(s): override this API if this capability is supported. */
- }
-
- /**
- * Set the radio's transmit power.
- * @param[in] txPower Radio transmit power in dBm.
- */
- virtual ble_error_t setTxPower(int8_t txPower) {
- /* Avoid compiler warnings about unused variables. */
- (void)txPower;
-
- return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porter(s): override this API if this capability is supported. */
- }
-
- /**
- * Query the underlying stack for permitted arguments for setTxPower().
- *
- * @param[out] valueArrayPP
- * Out parameter to receive the immutable array of Tx values.
- * @param[out] countP
- * Out parameter to receive the array's size.
- */
- virtual void getPermittedTxPowerValues(const int8_t **valueArrayPP, size_t *countP) {
- /* Avoid compiler warnings about unused variables. */
- (void)valueArrayPP;
- (void)countP;
-
- *countP = 0; /* Requesting action from porter(s): override this API if this capability is supported. */
- }
-
- /**
- * @return Maximum size of the whitelist.
- *
- * @experimental
- */
- virtual uint8_t getMaxWhitelistSize(void) const
- {
- return 0;
- }
-
- /**
- * Get the internal whitelist to be used by the Link Layer when scanning,
- * advertising or initiating a connection depending on the filter policies.
- *
- * @param[in/out] whitelist
- * (on input) whitelist.capacity contains the maximum number
- * of addresses to be returned.
- * (on output) The populated whitelist with copies of the
- * addresses in the implementation's whitelist.
- *
- * @return BLE_ERROR_NONE if the implementation's whitelist was successfully
- * copied into the supplied reference.
- *
- * @experimental
- */
- virtual ble_error_t getWhitelist(Whitelist_t &whitelist) const
- {
- (void) whitelist;
- return BLE_ERROR_NOT_IMPLEMENTED;
- }
-
- /**
- * Set the internal whitelist to be used by the Link Layer when scanning,
- * advertising or initiating a connection depending on the filter policies.
- *
- * @param[in] whitelist
- * A reference to a whitelist containing the addresses to
- * be added to the internal whitelist.
- *
- * @return BLE_ERROR_NONE if the implementation's whitelist was successfully
- * populated with the addresses in the given whitelist.
- *
- * @note The whitelist must not contain addresses of type @ref
- * BLEProtocol::AddressType_t::RANDOM_PRIVATE_NON_RESOLVABLE, this
- * this will result in a @ref BLE_ERROR_INVALID_PARAM since the
- * remote peer might change its private address at any time and it
- * is not possible to resolve it.
- * @note If the input whitelist is larger than @ref getMaxWhitelistSize()
- * the @ref BLE_ERROR_PARAM_OUT_OF_RANGE is returned.
- *
- * @experimental
- */
- virtual ble_error_t setWhitelist(const Whitelist_t &whitelist)
- {
- (void) whitelist;
- return BLE_ERROR_NOT_IMPLEMENTED;
- }
-
- /**
- * Set the advertising policy filter mode to be used in the next call
- * to startAdvertising().
- *
- * @param[in] mode
- * The new advertising policy filter mode.
- *
- * @return BLE_ERROR_NONE if the specified policy filter mode was set
- * successfully.
- *
- * @experimental
- */
- virtual ble_error_t setAdvertisingPolicyMode(AdvertisingPolicyMode_t mode)
- {
- (void) mode;
- return BLE_ERROR_NOT_IMPLEMENTED;
- }
-
- /**
- * Set the scan policy filter mode to be used in the next call
- * to startScan().
- *
- * @param[in] mode
- * The new scan policy filter mode.
- *
- * @return BLE_ERROR_NONE if the specified policy filter mode was set
- * successfully.
- *
- * @experimental
- */
- virtual ble_error_t setScanningPolicyMode(ScanningPolicyMode_t mode)
- {
- (void) mode;
- return BLE_ERROR_NOT_IMPLEMENTED;
- }
-
- /**
- * Set the initiator policy filter mode to be used.
- *
- * @param[in] mode
- * The new initiator policy filter mode.
- *
- * @return BLE_ERROR_NONE if the specified policy filter mode was set
- * successfully.
- *
- * @experimental
- */
- virtual ble_error_t setInitiatorPolicyMode(InitiatorPolicyMode_t mode)
- {
- (void) mode;
- return BLE_ERROR_NOT_IMPLEMENTED;
- }
-
- /**
- * Get the advertising policy filter mode that will be used in the next
- * call to startAdvertising().
- *
- * @return The set advertising policy filter mode.
- *
- * @experimental
- */
- virtual AdvertisingPolicyMode_t getAdvertisingPolicyMode(void) const
- {
- return ADV_POLICY_IGNORE_WHITELIST;
- }
-
- /**
- * Get the scan policy filter mode that will be used in the next
- * call to startScan().
- *
- * @return The set scan policy filter mode.
- *
- * @experimental
- */
- virtual ScanningPolicyMode_t getScanningPolicyMode(void) const
- {
- return SCAN_POLICY_IGNORE_WHITELIST;
- }
-
- /**
- * Get the initiator policy filter mode that will be used.
- *
- * @return The set scan policy filter mode.
- *
- * @experimental
- */
- virtual InitiatorPolicyMode_t getInitiatorPolicyMode(void) const
- {
- return INIT_POLICY_IGNORE_WHITELIST;
- }
-
-
-protected:
- /* Override the following in the underlying adaptation layer to provide the functionality of scanning. */
- virtual ble_error_t startRadioScan(const GapScanningParams &scanningParams) {
- (void)scanningParams;
- return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porter(s): override this API if this capability is supported. */
- }
-
- /*
- * APIs with non-virtual implementations.
- */
-public:
- /**
- * Returns the current GAP state of the device using a bitmask that
- * describes whether the device is advertising or connected.
- */
- GapState_t getState(void) const {
- return state;
- }
-
- /**
- * Set the GAP advertising mode to use for this device.
- */
- void setAdvertisingType(GapAdvertisingParams::AdvertisingType_t advType) {
- _advParams.setAdvertisingType(advType);
- }
-
- /**
- * @param[in] interval
- * Advertising interval in units of milliseconds. Advertising
- * is disabled if interval is 0. If interval is smaller than
- * the minimum supported value, then the minimum supported
- * value is used instead. This minimum value can be discovered
- * using getMinAdvertisingInterval().
- *
- * This field must be set to 0 if connectionMode is equal
- * to ADV_CONNECTABLE_DIRECTED.
- *
- * @note: Decreasing this value will allow central devices to detect a
- * peripheral faster, at the expense of more power being used by the radio
- * due to the higher data transmit rate.
- *
- * @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
- * no longer required as the new units are milliseconds. Any application
- * code depending on the old semantics needs to be updated accordingly.
- */
- void setAdvertisingInterval(uint16_t interval) {
- if (interval == 0) {
- stopAdvertising();
- } else if (interval < getMinAdvertisingInterval()) {
- interval = getMinAdvertisingInterval();
- }
- _advParams.setInterval(interval);
- }
-
- /**
- * @param[in] timeout
- * Advertising timeout (in seconds) between 0x1 and 0x3FFF (1
- * and 16383). Use 0 to disable the advertising timeout.
- */
- void setAdvertisingTimeout(uint16_t timeout) {
- _advParams.setTimeout(timeout);
- }
-
- /**
- * Start advertising.
- */
- ble_error_t startAdvertising(void) {
- setAdvertisingData(); /* Update the underlying stack. */
- return startAdvertising(_advParams);
- }
-
- /**
- * Reset any advertising payload prepared from prior calls to
- * accumulateAdvertisingPayload(). This automatically propagates the re-
- * initialized advertising payload to the underlying stack.
- */
- void clearAdvertisingPayload(void) {
- _advPayload.clear();
- setAdvertisingData();
- }
-
- /**
- * Accumulate an AD structure in the advertising payload. Please note that
- * the payload is limited to 31 bytes. The SCAN_RESPONSE message may be used
- * as an additional 31 bytes if the advertising payload is too
- * small.
- *
- * @param[in] flags
- * The flags to be added. Please refer to
- * GapAdvertisingData::Flags for valid flags. Multiple
- * flags may be specified in combination.
- */
- ble_error_t accumulateAdvertisingPayload(uint8_t flags) {
- ble_error_t rc;
- if ((rc = _advPayload.addFlags(flags)) != BLE_ERROR_NONE) {
- return rc;
- }
-
- return setAdvertisingData();
- }
-
- /**
- * Accumulate an AD structure in the advertising payload. Please note that
- * the payload is limited to 31 bytes. The SCAN_RESPONSE message may be used
- * as an additional 31 bytes if the advertising payload is too
- * small.
- *
- * @param app
- * The appearance of the peripheral.
- */
- ble_error_t accumulateAdvertisingPayload(GapAdvertisingData::Appearance app) {
- setAppearance(app);
-
- ble_error_t rc;
- if ((rc = _advPayload.addAppearance(app)) != BLE_ERROR_NONE) {
- return rc;
- }
-
- return setAdvertisingData();
- }
-
- /**
- * Accumulate an AD structure in the advertising payload. Please note that
- * the payload is limited to 31 bytes. The SCAN_RESPONSE message may be used
- * as an additional 31 bytes if the advertising payload is too
- * small.
- *
- * @param power
- * The max transmit power to be used by the controller (in dBm).
- */
- ble_error_t accumulateAdvertisingPayloadTxPower(int8_t power) {
- ble_error_t rc;
- if ((rc = _advPayload.addTxPower(power)) != BLE_ERROR_NONE) {
- return rc;
- }
-
- return setAdvertisingData();
- }
-
- /**
- * Accumulate a variable length byte-stream as an AD structure in the
- * advertising payload. Please note that the payload is limited to 31 bytes.
- * The SCAN_RESPONSE message may be used as an additional 31 bytes if the
- * advertising payload is too small.
- *
- * @param type The type describing the variable length data.
- * @param data Data bytes.
- * @param len Length of data.
- *
- * @return BLE_ERROR_NONE if the advertisement payload was updated based on
- * matching AD type; otherwise, an appropriate error.
- *
- * @note When the specified AD type is INCOMPLETE_LIST_16BIT_SERVICE_IDS,
- * COMPLETE_LIST_16BIT_SERVICE_IDS, INCOMPLETE_LIST_32BIT_SERVICE_IDS,
- * COMPLETE_LIST_32BIT_SERVICE_IDS, INCOMPLETE_LIST_128BIT_SERVICE_IDS,
- * COMPLETE_LIST_128BIT_SERVICE_IDS or LIST_128BIT_SOLICITATION_IDS the
- * supplied value is appended to the values previously added to the
- * payload.
- */
- ble_error_t accumulateAdvertisingPayload(GapAdvertisingData::DataType type, const uint8_t *data, uint8_t len) {
- if (type == GapAdvertisingData::COMPLETE_LOCAL_NAME) {
- setDeviceName(data);
- }
-
- ble_error_t rc;
- if ((rc = _advPayload.addData(type, data, len)) != BLE_ERROR_NONE) {
- return rc;
- }
-
- return setAdvertisingData();
- }
-
- /**
- * Update a particular ADV field in the advertising payload (based on
- * matching type).
- *
- * @param[in] type The ADV type field describing the variable length data.
- * @param[in] data Data bytes.
- * @param[in] len Length of data.
- *
- * @note: If advertisements are enabled, then the update will take effect immediately.
- *
- * @return BLE_ERROR_NONE if the advertisement payload was updated based on
- * matching AD type; otherwise, an appropriate error.
- */
- ble_error_t updateAdvertisingPayload(GapAdvertisingData::DataType type, const uint8_t *data, uint8_t len) {
- if (type == GapAdvertisingData::COMPLETE_LOCAL_NAME) {
- setDeviceName(data);
- }
-
- ble_error_t rc;
- if ((rc = _advPayload.updateData(type, data, len)) != BLE_ERROR_NONE) {
- return rc;
- }
-
- return setAdvertisingData();
- }
-
- /**
- * Set up a particular, user-constructed advertisement payload for the
- * underlying stack. It would be uncommon for this API to be used directly;
- * there are other APIs to build an advertisement payload (see above).
- */
- ble_error_t setAdvertisingPayload(const GapAdvertisingData &payload) {
- _advPayload = payload;
- return setAdvertisingData();
- }
-
- /**
- * @return Read back advertising data. Useful for storing and
- * restoring payload.
- */
- const GapAdvertisingData &getAdvertisingPayload(void) const {
- return _advPayload;
- }
-
- /**
- * Accumulate a variable length byte-stream as an AD structure in the
- * scanResponse payload.
- *
- * @param[in] type The type describing the variable length data.
- * @param[in] data Data bytes.
- * @param[in] len Length of data.
- */
- ble_error_t accumulateScanResponse(GapAdvertisingData::DataType type, const uint8_t *data, uint8_t len) {
- ble_error_t rc;
- if ((rc = _scanResponse.addData(type, data, len)) != BLE_ERROR_NONE) {
- return rc;
- }
-
- return setAdvertisingData();
- }
-
- /**
- * Reset any scan response prepared from prior calls to
- * accumulateScanResponse().
- *
- * Note: This should be followed by a call to setAdvertisingPayload() or
- * startAdvertising() before the update takes effect.
- */
- void clearScanResponse(void) {
- _scanResponse.clear();
- setAdvertisingData();
- }
-
- /**
- * Set up parameters for GAP scanning (observer mode).
- * @param[in] interval
- * Scan interval (in milliseconds) [valid values lie between 2.5ms and 10.24s].
- * @param[in] window
- * Scan Window (in milliseconds) [valid values lie between 2.5ms and 10.24s].
- * @param[in] timeout
- * Scan timeout (in seconds) between 0x0001 and 0xFFFF; 0x0000 disables the timeout.
- * @param[in] activeScanning
- * Set to True if active-scanning is required. This is used to fetch the
- * scan response from a peer if possible.
- *
- * The scanning window divided by the interval determines the duty cycle for
- * scanning. For example, if the interval is 100ms and the window is 10ms,
- * then the controller will scan for 10 percent of the time. It is possible
- * to have the interval and window set to the same value. In this case,
- * scanning is continuous, with a change of scanning frequency once every
- * interval.
- *
- * Once the scanning parameters have been configured, scanning can be
- * enabled by using startScan().
- *
- * @Note: The scan interval and window are recommendations to the BLE stack.
- */
- ble_error_t setScanParams(uint16_t interval = GapScanningParams::SCAN_INTERVAL_MAX,
- uint16_t window = GapScanningParams::SCAN_WINDOW_MAX,
- uint16_t timeout = 0,
- bool activeScanning = false) {
- ble_error_t rc;
- if (((rc = _scanningParams.setInterval(interval)) == BLE_ERROR_NONE) &&
- ((rc = _scanningParams.setWindow(window)) == BLE_ERROR_NONE) &&
- ((rc = _scanningParams.setTimeout(timeout)) == BLE_ERROR_NONE)) {
- _scanningParams.setActiveScanning(activeScanning);
- return BLE_ERROR_NONE;
- }
-
- return rc;
- }
-
- /**
- * Set up the scanInterval parameter for GAP scanning (observer mode).
- * @param[in] interval
- * Scan interval (in milliseconds) [valid values lie between 2.5ms and 10.24s].
- *
- * The scanning window divided by the interval determines the duty cycle for
- * scanning. For example, if the interval is 100ms and the window is 10ms,
- * then the controller will scan for 10 percent of the time. It is possible
- * to have the interval and window set to the same value. In this case,
- * scanning is continuous, with a change of scanning frequency once every
- * interval.
- *
- * Once the scanning parameters have been configured, scanning can be
- * enabled by using startScan().
- */
- ble_error_t setScanInterval(uint16_t interval) {
- return _scanningParams.setInterval(interval);
- }
-
- /**
- * Set up the scanWindow parameter for GAP scanning (observer mode).
- * @param[in] window
- * Scan Window (in milliseconds) [valid values lie between 2.5ms and 10.24s].
- *
- * The scanning window divided by the interval determines the duty cycle for
- * scanning. For example, if the interval is 100ms and the window is 10ms,
- * then the controller will scan for 10 percent of the time. It is possible
- * to have the interval and window set to the same value. In this case,
- * scanning is continuous, with a change of scanning frequency once every
- * interval.
- *
- * Once the scanning parameters have been configured, scanning can be
- * enabled by using startScan().
- *
- * If scanning is already active, the updated value of scanWindow will be
- * propagated to the underlying BLE stack.
- */
- ble_error_t setScanWindow(uint16_t window) {
- ble_error_t rc;
- if ((rc = _scanningParams.setWindow(window)) != BLE_ERROR_NONE) {
- return rc;
- }
-
- /* If scanning is already active, propagate the new setting to the stack. */
- if (scanningActive) {
- return startRadioScan(_scanningParams);
- }
-
- return BLE_ERROR_NONE;
- }
-
- /**
- * Set up parameters for GAP scanning (observer mode).
- * @param[in] timeout
- * Scan timeout (in seconds) between 0x0001 and 0xFFFF; 0x0000 disables the timeout.
- *
- * Once the scanning parameters have been configured, scanning can be
- * enabled by using startScan().
- *
- * If scanning is already active, the updated value of scanTimeout will be
- * propagated to the underlying BLE stack.
- */
- ble_error_t setScanTimeout(uint16_t timeout) {
- ble_error_t rc;
- if ((rc = _scanningParams.setTimeout(timeout)) != BLE_ERROR_NONE) {
- return rc;
- }
-
- /* If scanning is already active, propagate the new settings to the stack. */
- if (scanningActive) {
- return startRadioScan(_scanningParams);
- }
-
- return BLE_ERROR_NONE;
- }
-
- /**
- * Set up parameters for GAP scanning (observer mode).
- * @param[in] activeScanning
- * Set to True if active-scanning is required. This is used to fetch the
- * scan response from a peer if possible.
- *
- * Once the scanning parameters have been configured, scanning can be
- * enabled by using startScan().
- *
- * If scanning is already in progress, then active-scanning will be enabled
- * for the underlying BLE stack.
- */
- ble_error_t setActiveScanning(bool activeScanning) {
- _scanningParams.setActiveScanning(activeScanning);
-
- /* If scanning is already active, propagate the new settings to the stack. */
- if (scanningActive) {
- return startRadioScan(_scanningParams);
- }
-
- return BLE_ERROR_NONE;
- }
-
- /**
- * Start scanning (Observer Procedure) based on the parameters currently in
- * effect.
- *
- * @param[in] callback
- * The application-specific callback to be invoked upon
- * receiving every advertisement report. This can be passed in
- * as NULL, in which case scanning may not be enabled at all.
- */
- ble_error_t startScan(void (*callback)(const AdvertisementCallbackParams_t *params)) {
- ble_error_t err = BLE_ERROR_NONE;
- if (callback) {
- if ((err = startRadioScan(_scanningParams)) == BLE_ERROR_NONE) {
- scanningActive = true;
- onAdvertisementReport.attach(callback);
- }
- }
-
- return err;
- }
-
- /**
- * Same as above, but this takes an (object, method) pair for a callback.
- */
- template<typename T>
- ble_error_t startScan(T *object, void (T::*callbackMember)(const AdvertisementCallbackParams_t *params)) {
- ble_error_t err = BLE_ERROR_NONE;
- if (object && callbackMember) {
- if ((err = startRadioScan(_scanningParams)) == BLE_ERROR_NONE) {
- scanningActive = true;
- onAdvertisementReport.attach(object, callbackMember);
- }
- }
-
- return err;
- }
-
- /**
- * Initialize radio-notification events to be generated from the stack.
- * This API doesn't need to be called directly.
- *
- * Radio Notification is a feature that enables ACTIVE and INACTIVE
- * (nACTIVE) signals from the stack that notify the application when the
- * radio is in use.
- *
- * The ACTIVE signal is sent before the radio event starts. The nACTIVE
- * signal is sent at the end of the radio event. These signals can be used
- * by the application programmer to synchronize application logic with radio
- * activity. For example, the ACTIVE signal can be used to shut off external
- * devices, to manage peak current drawn during periods when the radio is on,
- * or to trigger sensor data collection for transmission in the Radio Event.
- *
- * @return BLE_ERROR_NONE on successful initialization, otherwise an error code.
- */
- virtual ble_error_t initRadioNotification(void) {
- return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porter(s): override this API if this capability is supported. */
- }
-
-private:
- ble_error_t setAdvertisingData(void) {
- return setAdvertisingData(_advPayload, _scanResponse);
- }
-
-private:
- virtual ble_error_t setAdvertisingData(const GapAdvertisingData &advData, const GapAdvertisingData &scanResponse) = 0;
- virtual ble_error_t startAdvertising(const GapAdvertisingParams &) = 0;
-
-public:
- /**
- * Accessors to read back currently active advertising params.
- */
- GapAdvertisingParams &getAdvertisingParams(void) {
- return _advParams;
- }
- const GapAdvertisingParams &getAdvertisingParams(void) const {
- return _advParams;
- }
-
- /**
- * Set up a particular, user-constructed set of advertisement parameters for
- * the underlying stack. It would be uncommon for this API to be used
- * directly; there are other APIs to tweak advertisement parameters
- * individually.
- */
- void setAdvertisingParams(const GapAdvertisingParams &newParams) {
- _advParams = newParams;
- }
-
- /* Event callback handlers. */
-public:
- /**
- * Set up a callback for timeout events. Refer to TimeoutSource_t for
- * possible event types.
- * @note It is possible to unregister callbacks using onTimeout().detach(callback)
- */
- void onTimeout(TimeoutEventCallback_t callback) {
- timeoutCallbackChain.add(callback);
- }
-
- /**
- * @brief provide access to the callchain of timeout event callbacks
- * It is possible to register callbacks using onTimeout().add(callback);
- * It is possible to unregister callbacks using onTimeout().detach(callback)
- * @return The timeout event callbacks chain
- */
- TimeoutEventCallbackChain_t& onTimeout() {
- return timeoutCallbackChain;
- }
-
- /**
- * Append to a chain of callbacks to be invoked upon GAP connection.
- * @note It is possible to unregister callbacks using onConnection().detach(callback)
- */
- void onConnection(ConnectionEventCallback_t callback) {connectionCallChain.add(callback);}
-
- template<typename T>
- void onConnection(T *tptr, void (T::*mptr)(const ConnectionCallbackParams_t*)) {connectionCallChain.add(tptr, mptr);}
-
- /**
- * @brief provide access to the callchain of connection event callbacks
- * It is possible to register callbacks using onConnection().add(callback);
- * It is possible to unregister callbacks using onConnection().detach(callback)
- * @return The connection event callbacks chain
- */
- ConnectionEventCallbackChain_t& onConnection() {
- return connectionCallChain;
- }
-
- /**
- * Append to a chain of callbacks to be invoked upon GAP disconnection.
- * @note It is possible to unregister callbacks using onDisconnection().detach(callback)
- */
- void onDisconnection(DisconnectionEventCallback_t callback) {disconnectionCallChain.add(callback);}
-
- template<typename T>
- void onDisconnection(T *tptr, void (T::*mptr)(const DisconnectionCallbackParams_t*)) {disconnectionCallChain.add(tptr, mptr);}
-
- /**
- * @brief provide access to the callchain of disconnection event callbacks
- * It is possible to register callbacks using onDisconnection().add(callback);
- * It is possible to unregister callbacks using onDisconnection().detach(callback)
- * @return The disconnection event callbacks chain
- */
- DisconnectionEventCallbackChain_t& onDisconnection() {
- return disconnectionCallChain;
- }
-
- /**
- * Set the application callback for radio-notification events.
- *
- * Radio Notification is a feature that enables ACTIVE and INACTIVE
- * (nACTIVE) signals from the stack that notify the application when the
- * radio is in use.
- *
- * The ACTIVE signal is sent before the radio event starts. The nACTIVE
- * signal is sent at the end of the radio event. These signals can be used
- * by the application programmer to synchronize application logic with radio
- * activity. For example, the ACTIVE signal can be used to shut off external
- * devices, to manage peak current drawn during periods when the radio is on,
- * or to trigger sensor data collection for transmission in the Radio Event.
- *
- * @param callback
- * The application handler to be invoked in response to a radio
- * ACTIVE/INACTIVE event.
- *
- * Or in the other version:
- *
- * @param tptr
- * Pointer to the object of a class defining the member callback
- * function (mptr).
- * @param mptr
- * The member callback (within the context of an object) to be
- * invoked in response to a radio ACTIVE/INACTIVE event.
- */
- void onRadioNotification(void (*callback)(bool param)) {
- radioNotificationCallback.attach(callback);
- }
- template <typename T>
- void onRadioNotification(T *tptr, void (T::*mptr)(bool)) {
- radioNotificationCallback.attach(tptr, mptr);
- }
-
- /**
- * Setup a callback to be invoked to notify the user application that the
- * Gap instance is about to shutdown (possibly as a result of a call
- * to BLE::shutdown()).
- *
- * @Note: It is possible to chain together multiple onShutdown callbacks
- * (potentially from different modules of an application) to be notified
- * before the Gap instance is shutdown.
- *
- * @Note: It is also possible to set up a callback into a member function of
- * some object.
- *
- * @Note It is possible to unregister a callback using onShutdown().detach(callback)
- */
- void onShutdown(const GapShutdownCallback_t& callback) {
- shutdownCallChain.add(callback);
- }
- template <typename T>
- void onShutdown(T *objPtr, void (T::*memberPtr)(void)) {
- shutdownCallChain.add(objPtr, memberPtr);
- }
-
- /**
- * @brief provide access to the callchain of shutdown event callbacks
- * It is possible to register callbacks using onShutdown().add(callback);
- * It is possible to unregister callbacks using onShutdown().detach(callback)
- * @return The shutdown event callbacks chain
- */
- GapShutdownCallbackChain_t& onShutdown() {
- return shutdownCallChain;
- }
-
-public:
- /**
- * Notify all registered onShutdown callbacks that the Gap instance is
- * about to be shutdown and clear all Gap state of the
- * associated object.
- *
- * This function is meant to be overridden in the platform-specific
- * sub-class. Nevertheless, the sub-class is only expected to reset its
- * state and not the data held in Gap members. This shall be achieved by a
- * call to Gap::reset() from the sub-class' reset() implementation.
- *
- * @return BLE_ERROR_NONE on success.
- *
- * @note: Currently a call to reset() does not reset the advertising and
- * scan parameters to default values.
- */
- virtual ble_error_t reset(void) {
- /* Notify that the instance is about to shutdown */
- shutdownCallChain.call(this);
- shutdownCallChain.clear();
-
- /* Clear Gap state */
- state.advertising = 0;
- state.connected = 0;
-
- /* Clear scanning state */
- scanningActive = false;
-
- /* Clear advertising and scanning data */
- _advPayload.clear();
- _scanResponse.clear();
-
- /* Clear callbacks */
- timeoutCallbackChain.clear();
- connectionCallChain.clear();
- disconnectionCallChain.clear();
- radioNotificationCallback = NULL;
- onAdvertisementReport = NULL;
-
- return BLE_ERROR_NONE;
- }
-
-protected:
- Gap() :
- _advParams(),
- _advPayload(),
- _scanningParams(),
- _scanResponse(),
- state(),
- scanningActive(false),
- timeoutCallbackChain(),
- radioNotificationCallback(),
- onAdvertisementReport(),
- connectionCallChain(),
- disconnectionCallChain() {
- _advPayload.clear();
- _scanResponse.clear();
- }
-
- /* Entry points for the underlying stack to report events back to the user. */
-public:
- void processConnectionEvent(Handle_t handle,
- Role_t role,
- BLEProtocol::AddressType_t peerAddrType,
- const BLEProtocol::AddressBytes_t peerAddr,
- BLEProtocol::AddressType_t ownAddrType,
- const BLEProtocol::AddressBytes_t ownAddr,
- const ConnectionParams_t *connectionParams) {
- state.connected = 1;
- ConnectionCallbackParams_t callbackParams(handle, role, peerAddrType, peerAddr, ownAddrType, ownAddr, connectionParams);
- connectionCallChain.call(&callbackParams);
- }
-
- void processDisconnectionEvent(Handle_t handle, DisconnectionReason_t reason) {
- state.connected = 0;
- DisconnectionCallbackParams_t callbackParams(handle, reason);
- disconnectionCallChain.call(&callbackParams);
- }
-
- void processAdvertisementReport(const BLEProtocol::AddressBytes_t peerAddr,
- int8_t rssi,
- bool isScanResponse,
- GapAdvertisingParams::AdvertisingType_t type,
- uint8_t advertisingDataLen,
- const uint8_t *advertisingData) {
- AdvertisementCallbackParams_t params;
- memcpy(params.peerAddr, peerAddr, ADDR_LEN);
- params.rssi = rssi;
- params.isScanResponse = isScanResponse;
- params.type = type;
- params.advertisingDataLen = advertisingDataLen;
- params.advertisingData = advertisingData;
- onAdvertisementReport.call(¶ms);
- }
-
- void processTimeoutEvent(TimeoutSource_t source) {
- if (timeoutCallbackChain) {
- timeoutCallbackChain(source);
- }
- }
-
-protected:
- GapAdvertisingParams _advParams;
- GapAdvertisingData _advPayload;
- GapScanningParams _scanningParams;
- GapAdvertisingData _scanResponse;
-
- GapState_t state;
- bool scanningActive;
-
-protected:
- TimeoutEventCallbackChain_t timeoutCallbackChain;
- RadioNotificationEventCallback_t radioNotificationCallback;
- AdvertisementReportCallback_t onAdvertisementReport;
- ConnectionEventCallbackChain_t connectionCallChain;
- DisconnectionEventCallbackChain_t disconnectionCallChain;
-
-private:
- GapShutdownCallbackChain_t shutdownCallChain;
-
-private:
- /* Disallow copy and assignment. */
- Gap(const Gap &);
- Gap& operator=(const Gap &);
-};
-
+/* mbed Microcontroller Library
+ * Copyright (c) 2006-2013 ARM Limited
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __GAP_H__
+#define __GAP_H__
+
+#include "GapAdvertisingData.h"
+#include "GapAdvertisingParams.h"
+#include "GapScanningParams.h"
+#include "GapEvents.h"
+#include "CallChainOfFunctionPointersWithContext.h"
+#include "FunctionPointerWithContext.h"
+
+/* Forward declarations for classes that will only be used for pointers or references in the following. */
+class GapAdvertisingParams;
+class GapScanningParams;
+class GapAdvertisingData;
+
+class Gap {
+public:
+ enum AddressType_t {
+ ADDR_TYPE_PUBLIC = 0,
+ ADDR_TYPE_RANDOM_STATIC,
+ ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE,
+ ADDR_TYPE_RANDOM_PRIVATE_NON_RESOLVABLE
+ };
+ typedef enum AddressType_t addr_type_t; /* @Note: Deprecated. Use AddressType_t instead. */
+
+ static const unsigned ADDR_LEN = 6;
+ typedef uint8_t Address_t[ADDR_LEN]; /* 48-bit address, LSB format. */
+ typedef Address_t address_t; /* @Note: Deprecated. Use Address_t instead. */
+
+ enum TimeoutSource_t {
+ TIMEOUT_SRC_ADVERTISING = 0x00, /**< Advertising timeout. */
+ TIMEOUT_SRC_SECURITY_REQUEST = 0x01, /**< Security request timeout. */
+ TIMEOUT_SRC_SCAN = 0x02, /**< Scanning timeout. */
+ TIMEOUT_SRC_CONN = 0x03, /**< Connection timeout. */
+ };
+
+ /**
+ * Enumeration for disconnection reasons. The values for these reasons are
+ * derived from Nordic's implementation, but the reasons are meant to be
+ * independent of the transport. If you are returned a reason that is not
+ * covered by this enumeration, please refer to the underlying
+ * transport library.
+ */
+ enum DisconnectionReason_t {
+ CONNECTION_TIMEOUT = 0x08,
+ REMOTE_USER_TERMINATED_CONNECTION = 0x13,
+ REMOTE_DEV_TERMINATION_DUE_TO_LOW_RESOURCES = 0x14, /**< Remote device terminated connection due to low resources.*/
+ REMOTE_DEV_TERMINATION_DUE_TO_POWER_OFF = 0x15, /**< Remote device terminated connection due to power off. */
+ LOCAL_HOST_TERMINATED_CONNECTION = 0x16,
+ CONN_INTERVAL_UNACCEPTABLE = 0x3B,
+ };
+
+ /* Describes the current state of the device (more than one bit can be set). */
+ struct GapState_t {
+ unsigned advertising : 1; /**< Peripheral is currently advertising. */
+ unsigned connected : 1; /**< Peripheral is connected to a central. */
+ };
+
+ typedef uint16_t Handle_t; /* Type for connection handle. */
+
+ typedef struct {
+ uint16_t minConnectionInterval; /**< Minimum Connection Interval in 1.25 ms units, see @ref BLE_GAP_CP_LIMITS.*/
+ uint16_t maxConnectionInterval; /**< Maximum Connection Interval in 1.25 ms units, see @ref BLE_GAP_CP_LIMITS.*/
+ uint16_t slaveLatency; /**< Slave Latency in number of connection events, see @ref BLE_GAP_CP_LIMITS.*/
+ uint16_t connectionSupervisionTimeout; /**< Connection Supervision Timeout in 10 ms units, see @ref BLE_GAP_CP_LIMITS.*/
+ } ConnectionParams_t;
+
+ enum Role_t {
+ PERIPHERAL = 0x1, /**< Peripheral Role. */
+ CENTRAL = 0x2, /**< Central Role. */
+ };
+
+ struct AdvertisementCallbackParams_t {
+ Address_t peerAddr;
+ int8_t rssi;
+ bool isScanResponse;
+ GapAdvertisingParams::AdvertisingType_t type;
+ uint8_t advertisingDataLen;
+ const uint8_t *advertisingData;
+ };
+ typedef FunctionPointerWithContext<const AdvertisementCallbackParams_t *> AdvertisementReportCallback_t;
+
+ struct ConnectionCallbackParams_t {
+ Handle_t handle;
+ Role_t role;
+ AddressType_t peerAddrType;
+ Address_t peerAddr;
+ AddressType_t ownAddrType;
+ Address_t ownAddr;
+ const ConnectionParams_t *connectionParams;
+
+ ConnectionCallbackParams_t(Handle_t handleIn,
+ Role_t roleIn,
+ AddressType_t peerAddrTypeIn,
+ const uint8_t *peerAddrIn,
+ AddressType_t ownAddrTypeIn,
+ const uint8_t *ownAddrIn,
+ const ConnectionParams_t *connectionParamsIn) :
+ handle(handleIn),
+ role(roleIn),
+ peerAddrType(peerAddrTypeIn),
+ peerAddr(),
+ ownAddrType(ownAddrTypeIn),
+ ownAddr(),
+ connectionParams(connectionParamsIn) {
+ memcpy(peerAddr, peerAddrIn, ADDR_LEN);
+ memcpy(ownAddr, ownAddrIn, ADDR_LEN);
+ }
+ };
+
+ struct DisconnectionCallbackParams_t {
+ Handle_t handle;
+ DisconnectionReason_t reason;
+
+ DisconnectionCallbackParams_t(Handle_t handleIn,
+ DisconnectionReason_t reasonIn) :
+ handle(handleIn),
+ reason(reasonIn)
+ {}
+ };
+
+ static const uint16_t UNIT_1_25_MS = 1250; /**< Number of microseconds in 1.25 milliseconds. */
+ static uint16_t MSEC_TO_GAP_DURATION_UNITS(uint32_t durationInMillis) {
+ return (durationInMillis * 1000) / UNIT_1_25_MS;
+ }
+
+ typedef FunctionPointerWithContext<TimeoutSource_t> TimeoutEventCallback_t;
+ typedef CallChainOfFunctionPointersWithContext<TimeoutSource_t> TimeoutEventCallbackChain_t;
+
+ typedef FunctionPointerWithContext<const ConnectionCallbackParams_t *> ConnectionEventCallback_t;
+ typedef CallChainOfFunctionPointersWithContext<const ConnectionCallbackParams_t *> ConnectionEventCallbackChain_t;
+
+ typedef FunctionPointerWithContext<const DisconnectionCallbackParams_t*> DisconnectionEventCallback_t;
+ typedef CallChainOfFunctionPointersWithContext<const DisconnectionCallbackParams_t*> DisconnectionEventCallbackChain_t;
+
+ typedef FunctionPointerWithContext<bool> RadioNotificationEventCallback_t;
+
+ /*
+ * The following functions are meant to be overridden in the platform-specific sub-class.
+ */
+public:
+ /**
+ * Set the BTLE MAC address and type. Please note that the address format is
+ * least significant byte first (LSB). Please refer to Address_t.
+ *
+ * @return BLE_ERROR_NONE on success.
+ */
+ virtual ble_error_t setAddress(AddressType_t type, const Address_t address) {
+ /* avoid compiler warnings about unused variables */
+ (void)type;
+ (void)address;
+
+ return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porter(s): override this API if this capability is supported. */
+ }
+
+ /**
+ * Fetch the BTLE MAC address and type.
+ *
+ * @return BLE_ERROR_NONE on success.
+ */
+ virtual ble_error_t getAddress(AddressType_t *typeP, Address_t address) {
+ /* Avoid compiler warnings about unused variables. */
+ (void)typeP;
+ (void)address;
+
+ return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porter(s): override this API if this capability is supported. */
+ }
+
+ /**
+ * @return Minimum Advertising interval in milliseconds.
+ */
+ 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.
+ */
+ virtual uint16_t getMinNonConnectableAdvertisingInterval(void) const {
+ return 0; /* Requesting action from porter(s): override this API if this capability is supported. */
+ }
+
+ /**
+ * @return Maximum Advertising interval in milliseconds.
+ */
+ virtual uint16_t getMaxAdvertisingInterval(void) const {
+ return 0xFFFF; /* Requesting action from porter(s): override this API if this capability is supported. */
+ }
+
+ virtual ble_error_t stopAdvertising(void) {
+ return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porter(s): override this API if this capability is supported. */
+ }
+
+ /**
+ * Stop scanning. The current scanning parameters remain in effect.
+ *
+ * @retval BLE_ERROR_NONE if successfully stopped scanning procedure.
+ */
+ virtual ble_error_t stopScan() {
+ return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porter(s): override this API if this capability is supported. */
+ }
+
+ /**
+ * Create a connection (GAP Link Establishment).
+ *
+ * @param peerAddr
+ * 48-bit address, LSB format.
+ * @param peerAddrType
+ * Address type of the peer.
+ * @param connectionParams
+ * Connection parameters.
+ * @param scanParams
+ * Paramters to be used while scanning for the peer.
+ * @return BLE_ERROR_NONE if connection establishment procedure is started
+ * successfully. The connectionCallChain (if set) will be invoked upon
+ * a connection event.
+ */
+ virtual ble_error_t connect(const Address_t peerAddr,
+ Gap::AddressType_t peerAddrType,
+ const ConnectionParams_t *connectionParams,
+ const GapScanningParams *scanParams) {
+ /* Avoid compiler warnings about unused variables. */
+ (void)peerAddr;
+ (void)peerAddrType;
+ (void)connectionParams;
+ (void)scanParams;
+
+ return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porter(s): override this API if this capability is supported. */
+ }
+
+ /**
+ * This call initiates the disconnection procedure, and its completion will
+ * be communicated to the application with an invocation of the
+ * disconnectionCallback.
+ *
+ * @param reason
+ * The reason for disconnection; to be sent back to the peer.
+ */
+ virtual ble_error_t disconnect(Handle_t connectionHandle, DisconnectionReason_t reason) {
+ /* avoid compiler warnings about unused variables */
+ (void)connectionHandle;
+ (void)reason;
+
+ return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porter(s): override this API if this capability is supported. */
+ }
+
+ /**
+ * This call initiates the disconnection procedure, and its completion will
+ * be communicated to the application with an invocation of the
+ * disconnectionCallback.
+ *
+ * @param reason
+ * The reason for disconnection; to be sent back to the peer.
+ *
+ * @note: This version of disconnect() doesn't take a connection handle. It
+ * works reliably only for stacks that are limited to a single
+ * connection. This API should be considered *deprecated* in favour of the
+ * alternative, which takes a connection handle. It will be dropped in the future.
+ */
+ virtual ble_error_t disconnect(DisconnectionReason_t reason) {
+ /* Avoid compiler warnings about unused variables. */
+ (void)reason;
+
+ return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porter(s): override this API if this capability is supported. */
+ }
+
+ /**
+ * Get the GAP peripheral preferred connection parameters. These are the
+ * defaults that the peripheral would like to have in a connection. The
+ * choice of the connection parameters is eventually up to the central.
+ *
+ * @param[out] params
+ * The structure where the parameters will be stored. Memory
+ * for this is owned by the caller.
+ *
+ * @return BLE_ERROR_NONE if the parameters were successfully filled into
+ * the given structure pointed to by params.
+ */
+ virtual ble_error_t getPreferredConnectionParams(ConnectionParams_t *params) {
+ /* Avoid compiler warnings about unused variables. */
+ (void)params;
+
+ return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porter(s): override this API if this capability is supported. */
+ }
+
+ /**
+ * Set the GAP peripheral preferred connection parameters. These are the
+ * defaults that the peripheral would like to have in a connection. The
+ * choice of the connection parameters is eventually up to the central.
+ *
+ * @param[in] params
+ * The structure containing the desired parameters.
+ */
+ virtual ble_error_t setPreferredConnectionParams(const ConnectionParams_t *params) {
+ /* Avoid compiler warnings about unused variables. */
+ (void)params;
+
+ return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porter(s): override this API if this capability is supported. */
+ }
+
+ /**
+ * Update connection parameters.
+ * In the central role this will initiate a Link Layer connection parameter update procedure.
+ * In the peripheral role, this will send the corresponding L2CAP request and wait for
+ * the central to perform the procedure.
+ *
+ * @param[in] handle
+ * Connection Handle.
+ * @param[in] params
+ * Pointer to desired connection parameters. If NULL is provided on a peripheral role,
+ * the parameters in the PPCP characteristic of the GAP service will be used instead.
+ */
+ virtual ble_error_t updateConnectionParams(Handle_t handle, const ConnectionParams_t *params) {
+ /* avoid compiler warnings about unused variables */
+ (void)handle;
+ (void)params;
+
+ return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porter(s): override this API if this capability is supported. */
+ }
+
+ /**
+ * Set the device name characteristic in the GAP service.
+ * @param[in] deviceName
+ * The new value for the device-name. This is a UTF-8 encoded, <b>NULL-terminated</b> string.
+ */
+ virtual ble_error_t setDeviceName(const uint8_t *deviceName) {
+ /* Avoid compiler warnings about unused variables. */
+ (void)deviceName;
+
+ return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porter(s): override this API if this capability is supported. */
+ }
+
+ /**
+ * Get the value of the device name characteristic in the GAP service.
+ * @param[out] deviceName
+ * Pointer to an empty buffer where the UTF-8 *non NULL-
+ * terminated* string will be placed. Set this
+ * value to NULL in order to obtain the deviceName-length
+ * from the 'length' parameter.
+ *
+ * @param[in/out] lengthP
+ * (on input) Length of the buffer pointed to by deviceName;
+ * (on output) the complete device name length (without the
+ * null terminator).
+ *
+ * @note If the device name is longer than the size of the supplied buffer,
+ * length will return the complete device name length, and not the
+ * number of bytes actually returned in deviceName. The application may
+ * use this information to retry with a suitable buffer size.
+ */
+ virtual ble_error_t getDeviceName(uint8_t *deviceName, unsigned *lengthP) {
+ /* avoid compiler warnings about unused variables */
+ (void)deviceName;
+ (void)lengthP;
+
+ return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porter(s): override this API if this capability is supported. */
+ }
+
+ /**
+ * Set the appearance characteristic in the GAP service.
+ * @param[in] appearance
+ * The new value for the device-appearance.
+ */
+ virtual ble_error_t setAppearance(GapAdvertisingData::Appearance appearance) {
+ /* Avoid compiler warnings about unused variables. */
+ (void)appearance;
+
+ return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porter(s): override this API if this capability is supported. */
+ }
+
+ /**
+ * Get the appearance characteristic in the GAP service.
+ * @param[out] appearance
+ * The new value for the device-appearance.
+ */
+ virtual ble_error_t getAppearance(GapAdvertisingData::Appearance *appearanceP) {
+ /* Avoid compiler warnings about unused variables. */
+ (void)appearanceP;
+
+ return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porter(s): override this API if this capability is supported. */
+ }
+
+ /**
+ * Set the radio's transmit power.
+ * @param[in] txPower Radio transmit power in dBm.
+ */
+ virtual ble_error_t setTxPower(int8_t txPower) {
+ /* Avoid compiler warnings about unused variables. */
+ (void)txPower;
+
+ return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porter(s): override this API if this capability is supported. */
+ }
+
+ /**
+ * Query the underlying stack for permitted arguments for setTxPower().
+ *
+ * @param[out] valueArrayPP
+ * Out parameter to receive the immutable array of Tx values.
+ * @param[out] countP
+ * Out parameter to receive the array's size.
+ */
+ virtual void getPermittedTxPowerValues(const int8_t **valueArrayPP, size_t *countP) {
+ /* Avoid compiler warnings about unused variables. */
+ (void)valueArrayPP;
+ (void)countP;
+
+ *countP = 0; /* Requesting action from porter(s): override this API if this capability is supported. */
+ }
+
+protected:
+ /* Override the following in the underlying adaptation layer to provide the functionality of scanning. */
+ virtual ble_error_t startRadioScan(const GapScanningParams &scanningParams) {
+ (void)scanningParams;
+ return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porter(s): override this API if this capability is supported. */
+ }
+
+ /*
+ * APIs with non-virtual implementations.
+ */
+public:
+ /**
+ * Returns the current GAP state of the device using a bitmask that
+ * describes whether the device is advertising or connected.
+ */
+ GapState_t getState(void) const {
+ return state;
+ }
+
+ /**
+ * Set the GAP advertising mode to use for this device.
+ */
+ void setAdvertisingType(GapAdvertisingParams::AdvertisingType_t advType) {
+ _advParams.setAdvertisingType(advType);
+ }
+
+ /**
+ * @param[in] interval
+ * Advertising interval in units of milliseconds. Advertising
+ * is disabled if interval is 0. If interval is smaller than
+ * the minimum supported value, then the minimum supported
+ * value is used instead. This minimum value can be discovered
+ * using getMinAdvertisingInterval().
+ *
+ * This field must be set to 0 if connectionMode is equal
+ * to ADV_CONNECTABLE_DIRECTED.
+ *
+ * @note: Decreasing this value will allow central devices to detect a
+ * 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
+ * no longer required as the new units are milliseconds. Any application
+ * code depending on the old semantics needs to be updated accordingly.
+ */
+ void setAdvertisingInterval(uint16_t interval) {
+ if (interval == 0) {
+ stopAdvertising();
+ } else if (interval < getMinAdvertisingInterval()) {
+ interval = getMinAdvertisingInterval();
+ }
+ _advParams.setInterval(interval);
+ }
+
+ /**
+ * @param[in] timeout
+ * Advertising timeout (in seconds) between 0x1 and 0x3FFF (1
+ * and 16383). Use 0 to disable the advertising timeout.
+ */
+ void setAdvertisingTimeout(uint16_t timeout) {
+ _advParams.setTimeout(timeout);
+ }
+
+ /**
+ * Start advertising.
+ */
+ ble_error_t startAdvertising(void) {
+ setAdvertisingData(); /* Update the underlying stack. */
+ return startAdvertising(_advParams);
+ }
+
+ /**
+ * Reset any advertising payload prepared from prior calls to
+ * accumulateAdvertisingPayload(). This automatically propagates the re-
+ * initialized advertising payload to the underlying stack.
+ */
+ void clearAdvertisingPayload(void) {
+ _advPayload.clear();
+ setAdvertisingData();
+ }
+
+ /**
+ * Accumulate an AD structure in the advertising payload. Please note that
+ * the payload is limited to 31 bytes. The SCAN_RESPONSE message may be used
+ * as an additional 31 bytes if the advertising payload is too
+ * small.
+ *
+ * @param[in] flags
+ * The flags to be added. Please refer to
+ * GapAdvertisingData::Flags for valid flags. Multiple
+ * flags may be specified in combination.
+ */
+ ble_error_t accumulateAdvertisingPayload(uint8_t flags) {
+ ble_error_t rc;
+ if ((rc = _advPayload.addFlags(flags)) != BLE_ERROR_NONE) {
+ return rc;
+ }
+
+ return setAdvertisingData();
+ }
+
+ /**
+ * Accumulate an AD structure in the advertising payload. Please note that
+ * the payload is limited to 31 bytes. The SCAN_RESPONSE message may be used
+ * as an additional 31 bytes if the advertising payload is too
+ * small.
+ *
+ * @param app
+ * The appearance of the peripheral.
+ */
+ ble_error_t accumulateAdvertisingPayload(GapAdvertisingData::Appearance app) {
+ setAppearance(app);
+
+ ble_error_t rc;
+ if ((rc = _advPayload.addAppearance(app)) != BLE_ERROR_NONE) {
+ return rc;
+ }
+
+ return setAdvertisingData();
+ }
+
+ /**
+ * Accumulate an AD structure in the advertising payload. Please note that
+ * the payload is limited to 31 bytes. The SCAN_RESPONSE message may be used
+ * as an additional 31 bytes if the advertising payload is too
+ * small.
+ *
+ * @param power
+ * The max transmit power to be used by the controller (in dBm).
+ */
+ ble_error_t accumulateAdvertisingPayloadTxPower(int8_t power) {
+ ble_error_t rc;
+ if ((rc = _advPayload.addTxPower(power)) != BLE_ERROR_NONE) {
+ return rc;
+ }
+
+ return setAdvertisingData();
+ }
+
+ /**
+ * Accumulate a variable length byte-stream as an AD structure in the
+ * advertising payload. Please note that the payload is limited to 31 bytes.
+ * The SCAN_RESPONSE message may be used as an additional 31 bytes if the
+ * advertising payload is too small.
+ *
+ * @param type The type describing the variable length data.
+ * @param data Data bytes.
+ * @param len Length of data.
+ */
+ ble_error_t accumulateAdvertisingPayload(GapAdvertisingData::DataType type, const uint8_t *data, uint8_t len) {
+ if (type == GapAdvertisingData::COMPLETE_LOCAL_NAME) {
+ setDeviceName(data);
+ }
+
+ ble_error_t rc;
+ if ((rc = _advPayload.addData(type, data, len)) != BLE_ERROR_NONE) {
+ return rc;
+ }
+
+ return setAdvertisingData();
+ }
+
+ /**
+ * Update a particular ADV field in the advertising payload (based on
+ * matching type and length). Note: the length of the new data must be the
+ * same as the old one.
+ *
+ * @param[in] type The ADV type field describing the variable length data.
+ * @param[in] data Data bytes.
+ * @param[in] len Length of data.
+ *
+ * @note: If advertisements are enabled, then the update will take effect immediately.
+ *
+ * @return BLE_ERROR_NONE if the advertisement payload was updated based on
+ * a <type, len> match; otherwise, an appropriate error.
+ */
+ ble_error_t updateAdvertisingPayload(GapAdvertisingData::DataType type, const uint8_t *data, uint8_t len) {
+ if (type == GapAdvertisingData::COMPLETE_LOCAL_NAME) {
+ setDeviceName(data);
+ }
+
+ ble_error_t rc;
+ if ((rc = _advPayload.updateData(type, data, len)) != BLE_ERROR_NONE) {
+ return rc;
+ }
+
+ return setAdvertisingData();
+ }
+
+ /**
+ * Set up a particular, user-constructed advertisement payload for the
+ * underlying stack. It would be uncommon for this API to be used directly;
+ * there are other APIs to build an advertisement payload (see above).
+ */
+ ble_error_t setAdvertisingPayload(const GapAdvertisingData &payload) {
+ _advPayload = payload;
+ return setAdvertisingData();
+ }
+
+ /**
+ * @return Read back advertising data. Useful for storing and
+ * restoring payload.
+ */
+ const GapAdvertisingData &getAdvertisingPayload(void) const {
+ return _advPayload;
+ }
+
+ /**
+ * Accumulate a variable length byte-stream as an AD structure in the
+ * scanResponse payload.
+ *
+ * @param[in] type The type describing the variable length data.
+ * @param[in] data Data bytes.
+ * @param[in] len Length of data.
+ */
+ ble_error_t accumulateScanResponse(GapAdvertisingData::DataType type, const uint8_t *data, uint8_t len) {
+ ble_error_t rc;
+ if ((rc = _scanResponse.addData(type, data, len)) != BLE_ERROR_NONE) {
+ return rc;
+ }
+
+ return setAdvertisingData();
+ }
+
+ /**
+ * Reset any scan response prepared from prior calls to
+ * accumulateScanResponse().
+ *
+ * Note: This should be followed by a call to setAdvertisingPayload() or
+ * startAdvertising() before the update takes effect.
+ */
+ void clearScanResponse(void) {
+ _scanResponse.clear();
+ setAdvertisingData();
+ }
+
+ /**
+ * Set up parameters for GAP scanning (observer mode).
+ * @param[in] interval
+ * Scan interval (in milliseconds) [valid values lie between 2.5ms and 10.24s].
+ * @param[in] window
+ * Scan Window (in milliseconds) [valid values lie between 2.5ms and 10.24s].
+ * @param[in] timeout
+ * Scan timeout (in seconds) between 0x0001 and 0xFFFF; 0x0000 disables the timeout.
+ * @param[in] activeScanning
+ * Set to True if active-scanning is required. This is used to fetch the
+ * scan response from a peer if possible.
+ *
+ * The scanning window divided by the interval determines the duty cycle for
+ * scanning. For example, if the interval is 100ms and the window is 10ms,
+ * then the controller will scan for 10 percent of the time. It is possible
+ * to have the interval and window set to the same value. In this case,
+ * scanning is continuous, with a change of scanning frequency once every
+ * interval.
+ *
+ * Once the scanning parameters have been configured, scanning can be
+ * enabled by using startScan().
+ *
+ * @Note: The scan interval and window are recommendations to the BLE stack.
+ */
+ ble_error_t setScanParams(uint16_t interval = GapScanningParams::SCAN_INTERVAL_MAX,
+ uint16_t window = GapScanningParams::SCAN_WINDOW_MAX,
+ uint16_t timeout = 0,
+ bool activeScanning = false) {
+ ble_error_t rc;
+ if (((rc = _scanningParams.setInterval(interval)) == BLE_ERROR_NONE) &&
+ ((rc = _scanningParams.setWindow(window)) == BLE_ERROR_NONE) &&
+ ((rc = _scanningParams.setTimeout(timeout)) == BLE_ERROR_NONE)) {
+ _scanningParams.setActiveScanning(activeScanning);
+ return BLE_ERROR_NONE;
+ }
+
+ return rc;
+ }
+
+ /**
+ * Set up the scanInterval parameter for GAP scanning (observer mode).
+ * @param[in] interval
+ * Scan interval (in milliseconds) [valid values lie between 2.5ms and 10.24s].
+ *
+ * The scanning window divided by the interval determines the duty cycle for
+ * scanning. For example, if the interval is 100ms and the window is 10ms,
+ * then the controller will scan for 10 percent of the time. It is possible
+ * to have the interval and window set to the same value. In this case,
+ * scanning is continuous, with a change of scanning frequency once every
+ * interval.
+ *
+ * Once the scanning parameters have been configured, scanning can be
+ * enabled by using startScan().
+ */
+ ble_error_t setScanInterval(uint16_t interval) {
+ return _scanningParams.setInterval(interval);
+ }
+
+ /**
+ * Set up the scanWindow parameter for GAP scanning (observer mode).
+ * @param[in] window
+ * Scan Window (in milliseconds) [valid values lie between 2.5ms and 10.24s].
+ *
+ * The scanning window divided by the interval determines the duty cycle for
+ * scanning. For example, if the interval is 100ms and the window is 10ms,
+ * then the controller will scan for 10 percent of the time. It is possible
+ * to have the interval and window set to the same value. In this case,
+ * scanning is continuous, with a change of scanning frequency once every
+ * interval.
+ *
+ * Once the scanning parameters have been configured, scanning can be
+ * enabled by using startScan().
+ *
+ * If scanning is already active, the updated value of scanWindow will be
+ * propagated to the underlying BLE stack.
+ */
+ ble_error_t setScanWindow(uint16_t window) {
+ ble_error_t rc;
+ if ((rc = _scanningParams.setWindow(window)) != BLE_ERROR_NONE) {
+ return rc;
+ }
+
+ /* If scanning is already active, propagate the new setting to the stack. */
+ if (scanningActive) {
+ return startRadioScan(_scanningParams);
+ }
+
+ return BLE_ERROR_NONE;
+ }
+
+ /**
+ * Set up parameters for GAP scanning (observer mode).
+ * @param[in] timeout
+ * Scan timeout (in seconds) between 0x0001 and 0xFFFF; 0x0000 disables the timeout.
+ *
+ * Once the scanning parameters have been configured, scanning can be
+ * enabled by using startScan().
+ *
+ * If scanning is already active, the updated value of scanTimeout will be
+ * propagated to the underlying BLE stack.
+ */
+ ble_error_t setScanTimeout(uint16_t timeout) {
+ ble_error_t rc;
+ if ((rc = _scanningParams.setTimeout(timeout)) != BLE_ERROR_NONE) {
+ return rc;
+ }
+
+ /* If scanning is already active, propagate the new settings to the stack. */
+ if (scanningActive) {
+ return startRadioScan(_scanningParams);
+ }
+
+ return BLE_ERROR_NONE;
+ }
+
+ /**
+ * Set up parameters for GAP scanning (observer mode).
+ * @param[in] activeScanning
+ * Set to True if active-scanning is required. This is used to fetch the
+ * scan response from a peer if possible.
+ *
+ * Once the scanning parameters have been configured, scanning can be
+ * enabled by using startScan().
+ *
+ * If scanning is already in progress, then active-scanning will be enabled
+ * for the underlying BLE stack.
+ */
+ ble_error_t setActiveScanning(bool activeScanning) {
+ _scanningParams.setActiveScanning(activeScanning);
+
+ /* If scanning is already active, propagate the new settings to the stack. */
+ if (scanningActive) {
+ return startRadioScan(_scanningParams);
+ }
+
+ return BLE_ERROR_NONE;
+ }
+
+ /**
+ * Start scanning (Observer Procedure) based on the parameters currently in
+ * effect.
+ *
+ * @param[in] callback
+ * The application-specific callback to be invoked upon
+ * receiving every advertisement report. This can be passed in
+ * as NULL, in which case scanning may not be enabled at all.
+ */
+ ble_error_t startScan(void (*callback)(const AdvertisementCallbackParams_t *params)) {
+ ble_error_t err = BLE_ERROR_NONE;
+ if (callback) {
+ if ((err = startRadioScan(_scanningParams)) == BLE_ERROR_NONE) {
+ scanningActive = true;
+ onAdvertisementReport.attach(callback);
+ }
+ }
+
+ return err;
+ }
+
+ /**
+ * Same as above, but this takes an (object, method) pair for a callback.
+ */
+ template<typename T>
+ ble_error_t startScan(T *object, void (T::*callbackMember)(const AdvertisementCallbackParams_t *params)) {
+ ble_error_t err = BLE_ERROR_NONE;
+ if (object && callbackMember) {
+ if ((err = startRadioScan(_scanningParams)) == BLE_ERROR_NONE) {
+ scanningActive = true;
+ onAdvertisementReport.attach(object, callbackMember);
+ }
+ }
+
+ return err;
+ }
+
+ /**
+ * Initialize radio-notification events to be generated from the stack.
+ * This API doesn't need to be called directly.
+ *
+ * Radio Notification is a feature that enables ACTIVE and INACTIVE
+ * (nACTIVE) signals from the stack that notify the application when the
+ * radio is in use.
+ *
+ * The ACTIVE signal is sent before the radio event starts. The nACTIVE
+ * signal is sent at the end of the radio event. These signals can be used
+ * by the application programmer to synchronize application logic with radio
+ * activity. For example, the ACTIVE signal can be used to shut off external
+ * devices, to manage peak current drawn during periods when the radio is on,
+ * or to trigger sensor data collection for transmission in the Radio Event.
+ *
+ * @return BLE_ERROR_NONE on successful initialization, otherwise an error code.
+ */
+ virtual ble_error_t initRadioNotification(void) {
+ return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porter(s): override this API if this capability is supported. */
+ }
+
+private:
+ ble_error_t setAdvertisingData(void) {
+ return setAdvertisingData(_advPayload, _scanResponse);
+ }
+
+private:
+ virtual ble_error_t setAdvertisingData(const GapAdvertisingData &advData, const GapAdvertisingData &scanResponse) = 0;
+ virtual ble_error_t startAdvertising(const GapAdvertisingParams &) = 0;
+
+public:
+ /**
+ * Accessors to read back currently active advertising params.
+ */
+ GapAdvertisingParams &getAdvertisingParams(void) {
+ return _advParams;
+ }
+ const GapAdvertisingParams &getAdvertisingParams(void) const {
+ return _advParams;
+ }
+
+ /**
+ * Set up a particular, user-constructed set of advertisement parameters for
+ * the underlying stack. It would be uncommon for this API to be used
+ * directly; there are other APIs to tweak advertisement parameters
+ * individually.
+ */
+ void setAdvertisingParams(const GapAdvertisingParams &newParams) {
+ _advParams = newParams;
+ }
+
+ /* Event callback handlers. */
+public:
+ /**
+ * Set up a callback for timeout events. Refer to TimeoutSource_t for
+ * possible event types.
+ * @note It is possible to unregister callbacks using onTimeout().detach(callback)
+ */
+ void onTimeout(TimeoutEventCallback_t callback) {
+ timeoutCallbackChain.add(callback);
+ }
+
+ /**
+ * @brief provide access to the callchain of timeout event callbacks
+ * It is possible to register callbacks using onTimeout().add(callback);
+ * It is possible to unregister callbacks using onTimeout().detach(callback)
+ * @return The timeout event callbacks chain
+ */
+ TimeoutEventCallbackChain_t& onTimeout() {
+ return timeoutCallbackChain;
+ }
+
+ /**
+ * Append to a chain of callbacks to be invoked upon GAP connection.
+ * @note It is possible to unregister callbacks using onConnection().detach(callback)
+ */
+ void onConnection(ConnectionEventCallback_t callback) {connectionCallChain.add(callback);}
+
+ template<typename T>
+ void onConnection(T *tptr, void (T::*mptr)(const ConnectionCallbackParams_t*)) {connectionCallChain.add(tptr, mptr);}
+
+ /**
+ * @brief provide access to the callchain of connection event callbacks
+ * It is possible to register callbacks using onConnection().add(callback);
+ * It is possible to unregister callbacks using onConnection().detach(callback)
+ * @return The connection event callbacks chain
+ */
+ ConnectionEventCallbackChain_t& onconnection() {
+ return connectionCallChain;
+ }
+
+ /**
+ * Append to a chain of callbacks to be invoked upon GAP disconnection.
+ * @note It is possible to unregister callbacks using onDisconnection().detach(callback)
+ */
+ void onDisconnection(DisconnectionEventCallback_t callback) {disconnectionCallChain.add(callback);}
+
+ template<typename T>
+ void onDisconnection(T *tptr, void (T::*mptr)(const DisconnectionCallbackParams_t*)) {disconnectionCallChain.add(tptr, mptr);}
+
+ /**
+ * @brief provide access to the callchain of disconnection event callbacks
+ * It is possible to register callbacks using onDisconnection().add(callback);
+ * It is possible to unregister callbacks using onDisconnection().detach(callback)
+ * @return The disconnection event callbacks chain
+ */
+ DisconnectionEventCallbackChain_t& onDisconnection() {
+ return disconnectionCallChain;
+ }
+
+ /**
+ * Set the application callback for radio-notification events.
+ *
+ * Radio Notification is a feature that enables ACTIVE and INACTIVE
+ * (nACTIVE) signals from the stack that notify the application when the
+ * radio is in use.
+ *
+ * The ACTIVE signal is sent before the radio event starts. The nACTIVE
+ * signal is sent at the end of the radio event. These signals can be used
+ * by the application programmer to synchronize application logic with radio
+ * activity. For example, the ACTIVE signal can be used to shut off external
+ * devices, to manage peak current drawn during periods when the radio is on,
+ * or to trigger sensor data collection for transmission in the Radio Event.
+ *
+ * @param callback
+ * The application handler to be invoked in response to a radio
+ * ACTIVE/INACTIVE event.
+ *
+ * Or in the other version:
+ *
+ * @param tptr
+ * Pointer to the object of a class defining the member callback
+ * function (mptr).
+ * @param mptr
+ * The member callback (within the context of an object) to be
+ * invoked in response to a radio ACTIVE/INACTIVE event.
+ */
+ void onRadioNotification(void (*callback)(bool param)) {
+ radioNotificationCallback.attach(callback);
+ }
+ template <typename T>
+ void onRadioNotification(T *tptr, void (T::*mptr)(bool)) {
+ radioNotificationCallback.attach(tptr, mptr);
+ }
+
+protected:
+ Gap() :
+ _advParams(),
+ _advPayload(),
+ _scanningParams(),
+ _scanResponse(),
+ state(),
+ scanningActive(false),
+ timeoutCallbackChain(),
+ radioNotificationCallback(),
+ onAdvertisementReport(),
+ connectionCallChain(),
+ disconnectionCallChain() {
+ _advPayload.clear();
+ _scanResponse.clear();
+ }
+
+ /* Entry points for the underlying stack to report events back to the user. */
+public:
+ void processConnectionEvent(Handle_t handle,
+ Role_t role,
+ AddressType_t peerAddrType,
+ const Address_t peerAddr,
+ AddressType_t ownAddrType,
+ const Address_t ownAddr,
+ const ConnectionParams_t *connectionParams) {
+ state.connected = 1;
+ ConnectionCallbackParams_t callbackParams(handle, role, peerAddrType, peerAddr, ownAddrType, ownAddr, connectionParams);
+ connectionCallChain.call(&callbackParams);
+ }
+
+ void processDisconnectionEvent(Handle_t handle, DisconnectionReason_t reason) {
+ state.connected = 0;
+ DisconnectionCallbackParams_t callbackParams(handle, reason);
+ disconnectionCallChain.call(&callbackParams);
+ }
+
+ void processAdvertisementReport(const Address_t peerAddr,
+ int8_t rssi,
+ bool isScanResponse,
+ GapAdvertisingParams::AdvertisingType_t type,
+ uint8_t advertisingDataLen,
+ const uint8_t *advertisingData) {
+ AdvertisementCallbackParams_t params;
+ memcpy(params.peerAddr, peerAddr, ADDR_LEN);
+ params.rssi = rssi;
+ params.isScanResponse = isScanResponse;
+ params.type = type;
+ params.advertisingDataLen = advertisingDataLen;
+ params.advertisingData = advertisingData;
+ onAdvertisementReport.call(¶ms);
+ }
+
+ void processTimeoutEvent(TimeoutSource_t source) {
+ if (timeoutCallbackChain) {
+ timeoutCallbackChain(source);
+ }
+ }
+
+protected:
+ GapAdvertisingParams _advParams;
+ GapAdvertisingData _advPayload;
+ GapScanningParams _scanningParams;
+ GapAdvertisingData _scanResponse;
+
+ GapState_t state;
+ bool scanningActive;
+
+protected:
+ TimeoutEventCallbackChain_t timeoutCallbackChain;
+ RadioNotificationEventCallback_t radioNotificationCallback;
+ AdvertisementReportCallback_t onAdvertisementReport;
+ ConnectionEventCallbackChain_t connectionCallChain;
+ DisconnectionEventCallbackChain_t disconnectionCallChain;
+
+private:
+ /* Disallow copy and assignment. */
+ Gap(const Gap &);
+ Gap& operator=(const Gap &);
+};
+
#endif // ifndef __GAP_H__
\ No newline at end of file
--- a/ble/GapAdvertisingData.h Tue Jan 12 19:47:52 2016 +0000
+++ b/ble/GapAdvertisingData.h Wed Apr 06 19:13:46 2016 +0100
@@ -1,498 +1,482 @@
-/* mbed Microcontroller Library
- * Copyright (c) 2006-2013 ARM Limited
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __GAP_ADVERTISING_DATA_H__
-#define __GAP_ADVERTISING_DATA_H__
-
-#include <stdint.h>
-#include <string.h>
-
-#include "blecommon.h"
-
-#define GAP_ADVERTISING_DATA_MAX_PAYLOAD (31)
-
-/**************************************************************************/
-/*!
- \brief
- This class provides several helper functions to generate properly
- formatted GAP Advertising and Scan Response data payloads.
-
- \note
- See Bluetooth Specification 4.0 (Vol. 3), Part C, Sections 11 and 18
- for further information on Advertising and Scan Response data.
-
- \par Advertising and Scan Response Payloads
- Advertising data and Scan Response data are organized around a set of
- data types called 'AD types' in Bluetooth 4.0 (see the Bluetooth Core
- Specification v4.0, Vol. 3, Part C, Sections 11 and 18).
-
- \par
- Each AD type has its own standardized assigned number, as defined
- by the Bluetooth SIG:
- https://www.bluetooth.org/en-us/specification/assigned-numbers/generic-access-profile
-
- \par
- For convenience, all appropriate AD types are encapsulated
- in GapAdvertisingData::DataType.
-
- \par
- Before the AD Types and their payload (if any) can be inserted into
- the Advertising or Scan Response frames, they need to be formatted as
- follows:
-
- \li \c Record length (1 byte).
- \li \c AD Type (1 byte).
- \li \c AD payload (optional; only present if record length > 1).
-
- \par
- This class takes care of properly formatting the payload, performs
- some basic checks on the payload length, and tries to avoid common
- errors like adding an exclusive AD field twice in the Advertising
- or Scan Response payload.
-
- \par EXAMPLE
-
- \code
-
- // ToDo
-
- \endcode
-*/
-/**************************************************************************/
-class GapAdvertisingData
-{
-public:
- /**********************************************************************/
- /*!
- \brief
- A list of Advertising Data types commonly used by peripherals.
- These AD types are used to describe the capabilities of the
- peripheral, and are inserted inside the advertising or scan
- response payloads.
-
- \par Source
- \li \c Bluetooth Core Specification 4.0 (Vol. 3), Part C, Section 11, 18
- \li \c https://www.bluetooth.org/en-us/specification/assigned-numbers/generic-access-profile
- */
- /**********************************************************************/
- enum DataType_t {
- FLAGS = 0x01, /**< \ref *Flags */
- INCOMPLETE_LIST_16BIT_SERVICE_IDS = 0x02, /**< Incomplete list of 16-bit Service IDs */
- COMPLETE_LIST_16BIT_SERVICE_IDS = 0x03, /**< Complete list of 16-bit Service IDs */
- INCOMPLETE_LIST_32BIT_SERVICE_IDS = 0x04, /**< Incomplete list of 32-bit Service IDs (not relevant for Bluetooth 4.0) */
- COMPLETE_LIST_32BIT_SERVICE_IDS = 0x05, /**< Complete list of 32-bit Service IDs (not relevant for Bluetooth 4.0) */
- INCOMPLETE_LIST_128BIT_SERVICE_IDS = 0x06, /**< Incomplete list of 128-bit Service IDs */
- COMPLETE_LIST_128BIT_SERVICE_IDS = 0x07, /**< Complete list of 128-bit Service IDs */
- SHORTENED_LOCAL_NAME = 0x08, /**< Shortened Local Name */
- COMPLETE_LOCAL_NAME = 0x09, /**< Complete Local Name */
- TX_POWER_LEVEL = 0x0A, /**< TX Power Level (in dBm) */
- DEVICE_ID = 0x10, /**< Device ID */
- SLAVE_CONNECTION_INTERVAL_RANGE = 0x12, /**< Slave Connection Interval Range */
- LIST_128BIT_SOLICITATION_IDS = 0x15, /**< List of 128 bit service UUIDs the device is looking for */
- SERVICE_DATA = 0x16, /**< Service Data */
- APPEARANCE = 0x19, /**< \ref Appearance */
- ADVERTISING_INTERVAL = 0x1A, /**< Advertising Interval */
- MANUFACTURER_SPECIFIC_DATA = 0xFF /**< Manufacturer Specific Data */
- };
- typedef enum DataType_t DataType; /* Deprecated type alias. This may be dropped in a future release. */
-
- /**********************************************************************/
- /*!
- \brief
- A list of values for the FLAGS AD Type.
-
- \note
- You can use more than one value in the FLAGS AD Type (ex.
- LE_GENERAL_DISCOVERABLE and BREDR_NOT_SUPPORTED).
-
- \par Source
- \li \c Bluetooth Core Specification 4.0 (Vol. 3), Part C, Section 18.1
- */
- /**********************************************************************/
- enum Flags_t {
- LE_LIMITED_DISCOVERABLE = 0x01, /**< *Peripheral device is discoverable for a limited period of time. */
- LE_GENERAL_DISCOVERABLE = 0x02, /**< Peripheral device is discoverable at any moment. */
- BREDR_NOT_SUPPORTED = 0x04, /**< Peripheral device is LE only. */
- SIMULTANEOUS_LE_BREDR_C = 0x08, /**< Not relevant - central mode only. */
- SIMULTANEOUS_LE_BREDR_H = 0x10 /**< Not relevant - central mode only. */
- };
- typedef enum Flags_t Flags; /* Deprecated type alias. This may be dropped in a future release. */
-
- /**********************************************************************/
- /*!
- \brief
- A list of values for the APPEARANCE AD Type, which describes the
- physical shape or appearance of the device.
-
- \par Source
- \li \c Bluetooth Core Specification Supplement, Part A, Section 1.12
- \li \c Bluetooth Core Specification 4.0 (Vol. 3), Part C, Section 12.2
- \li \c https://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.gap.appearance.xml
- */
- /**********************************************************************/
- enum Appearance_t {
- UNKNOWN = 0, /**< Unknown or unspecified appearance type. */
- GENERIC_PHONE = 64, /**< Generic Phone. */
- GENERIC_COMPUTER = 128, /**< Generic Computer. */
- GENERIC_WATCH = 192, /**< Generic Watch. */
- WATCH_SPORTS_WATCH = 193, /**< Sports Watch. */
- GENERIC_CLOCK = 256, /**< Generic Clock. */
- GENERIC_DISPLAY = 320, /**< Generic Display. */
- GENERIC_REMOTE_CONTROL = 384, /**< Generic Remote Control. */
- GENERIC_EYE_GLASSES = 448, /**< Generic Eye Glasses. */
- GENERIC_TAG = 512, /**< Generic Tag. */
- GENERIC_KEYRING = 576, /**< Generic Keyring. */
- GENERIC_MEDIA_PLAYER = 640, /**< Generic Media Player. */
- GENERIC_BARCODE_SCANNER = 704, /**< Generic Barcode Scanner. */
- GENERIC_THERMOMETER = 768, /**< Generic Thermometer. */
- THERMOMETER_EAR = 769, /**< Ear Thermometer. */
- GENERIC_HEART_RATE_SENSOR = 832, /**< Generic Heart Rate Sensor. */
- HEART_RATE_SENSOR_HEART_RATE_BELT = 833, /**< Belt Heart Rate Sensor. */
- GENERIC_BLOOD_PRESSURE = 896, /**< Generic Blood Pressure. */
- BLOOD_PRESSURE_ARM = 897, /**< Arm Blood Pressure. */
- BLOOD_PRESSURE_WRIST = 898, /**< Wrist Blood Pressure. */
- HUMAN_INTERFACE_DEVICE_HID = 960, /**< Human Interface Device (HID). */
- KEYBOARD = 961, /**< Keyboard. */
- MOUSE = 962, /**< Mouse. */
- JOYSTICK = 963, /**< Joystick. */
- GAMEPAD = 964, /**< Gamepad. */
- DIGITIZER_TABLET = 965, /**< Digitizer Tablet. */
- CARD_READER = 966, /**< Card Reader. */
- DIGITAL_PEN = 967, /**< Digital Pen. */
- BARCODE_SCANNER = 968, /**< Barcode Scanner. */
- GENERIC_GLUCOSE_METER = 1024, /**< Generic Glucose Meter. */
- GENERIC_RUNNING_WALKING_SENSOR = 1088, /**< Generic Running/Walking Sensor. */
- RUNNING_WALKING_SENSOR_IN_SHOE = 1089, /**< In Shoe Running/Walking Sensor. */
- RUNNING_WALKING_SENSOR_ON_SHOE = 1090, /**< On Shoe Running/Walking Sensor. */
- RUNNING_WALKING_SENSOR_ON_HIP = 1091, /**< On Hip Running/Walking Sensor. */
- GENERIC_CYCLING = 1152, /**< Generic Cycling. */
- CYCLING_CYCLING_COMPUTER = 1153, /**< Cycling Computer. */
- CYCLING_SPEED_SENSOR = 1154, /**< Cycling Speed Sensor. */
- CYCLING_CADENCE_SENSOR = 1155, /**< Cycling Cadence Sensor. */
- CYCLING_POWER_SENSOR = 1156, /**< Cycling Power Sensor. */
- CYCLING_SPEED_AND_CADENCE_SENSOR = 1157, /**< Cycling Speed and Cadence Sensor. */
- PULSE_OXIMETER_GENERIC = 3136, /**< Generic Pulse Oximeter. */
- PULSE_OXIMETER_FINGERTIP = 3137, /**< Fingertip Pulse Oximeter. */
- PULSE_OXIMETER_WRIST_WORN = 3138, /**< Wrist Worn Pulse Oximeter. */
- GENERIC_WEIGHT_SCALE = 3200, /**< Generic Weight Scale. */
- OUTDOOR_GENERIC = 5184, /**< Generic Outdoor. */
- OUTDOOR_LOCATION_DISPLAY_DEVICE = 5185, /**< Outdoor Location Display Device. */
- OUTDOOR_LOCATION_AND_NAVIGATION_DISPLAY_DEVICE = 5186, /**< Outdoor Location and Navigation Display Device. */
- OUTDOOR_LOCATION_POD = 5187, /**< Outdoor Location Pod. */
- OUTDOOR_LOCATION_AND_NAVIGATION_POD = 5188 /**< Outdoor Location and Navigation Pod. */
- };
- typedef enum Appearance_t Appearance; /* Deprecated type alias. This may be dropped in a future release. */
-
- GapAdvertisingData(void) : _payload(), _payloadLen(0), _appearance(GENERIC_TAG) {
- /* empty */
- }
-
- /**
- * Adds advertising data based on the specified AD type (see DataType).
- * If the supplied AD type is already present in the advertising
- * payload, then the value is updated.
- *
- * @param[in] advDataType The Advertising 'DataType' to add.
- * @param[in] payload Pointer to the payload contents.
- * @param[in] len Size of the payload in bytes.
- *
- * @return BLE_ERROR_BUFFER_OVERFLOW if the new value causes the
- * advertising buffer to overflow. BLE_ERROR_NONE is returned
- * on success.
- *
- * @note When the specified AD type is INCOMPLETE_LIST_16BIT_SERVICE_IDS,
- * COMPLETE_LIST_16BIT_SERVICE_IDS, INCOMPLETE_LIST_32BIT_SERVICE_IDS,
- * COMPLETE_LIST_32BIT_SERVICE_IDS, INCOMPLETE_LIST_128BIT_SERVICE_IDS,
- * COMPLETE_LIST_128BIT_SERVICE_IDS or LIST_128BIT_SOLICITATION_IDS the
- * supplied value is appended to the values previously added to the
- * payload.
- */
- ble_error_t addData(DataType_t advDataType, const uint8_t *payload, uint8_t len)
- {
- // find field
- uint8_t* field = findField(advDataType);
-
- if (field) {
- // Field type already exist, either add to field or replace
- return addField(advDataType, payload, len, field);
- } else {
- // field doesn't exists, insert new
- return appendField(advDataType, payload, len);
- }
- }
-
- /**
- * Update a particular ADV field in the advertising payload (based on
- * matching type).
- *
- * @param[in] advDataType The Advertising 'DataType' to add.
- * @param[in] payload Pointer to the payload contents.
- * @param[in] len Size of the payload in bytes.
- *
- * @return BLE_ERROR_UNSPECIFIED if the specified field is not found,
- * BLE_ERROR_BUFFER_OVERFLOW if the new value causes the
- * advertising buffer to overflow. BLE_ERROR_NONE is returned
- * on success.
- */
- ble_error_t updateData(DataType_t advDataType, const uint8_t *payload, uint8_t len)
- {
- // find field
- uint8_t* field = findField(advDataType);
-
- if (field) {
- // Field type already exist, replace field contents
- return updateField(advDataType, payload, len, field);
- } else {
- // field doesn't exists, return an error
- return BLE_ERROR_UNSPECIFIED;
- }
- }
-
- /**
- * Helper function to add APPEARANCE data to the advertising payload.
- *
- * @param appearance
- * The APPEARANCE value to add.
- *
- * @return BLE_ERROR_BUFFER_OVERFLOW if the specified data would cause the
- * advertising buffer to overflow, else BLE_ERROR_NONE.
- */
- ble_error_t addAppearance(Appearance appearance = GENERIC_TAG) {
- _appearance = appearance;
- return addData(GapAdvertisingData::APPEARANCE, (uint8_t *)&appearance, 2);
- }
-
- /**
- * Helper function to add FLAGS data to the advertising payload.
- * @param flags
- * LE_LIMITED_DISCOVERABLE
- * The peripheral is discoverable for a limited period of time.
- * LE_GENERAL_DISCOVERABLE
- * The peripheral is permanently discoverable.
- * BREDR_NOT_SUPPORTED
- * This peripheral is a Bluetooth Low Energy only device (no EDR support).
- *
- * @return BLE_ERROR_BUFFER_OVERFLOW if the specified data would cause the
- * advertising buffer to overflow, else BLE_ERROR_NONE.
- */
- ble_error_t addFlags(uint8_t flags = LE_GENERAL_DISCOVERABLE) {
- return addData(GapAdvertisingData::FLAGS, &flags, 1);
- }
-
- /**
- * Helper function to add TX_POWER_LEVEL data to the advertising payload.
- *
- * @return BLE_ERROR_BUFFER_OVERFLOW if the specified data would cause the
- * advertising buffer to overflow, else BLE_ERROR_NONE.
- */
- ble_error_t addTxPower(int8_t txPower) {
- /* To Do: Basic error checking to make sure txPower is in range. */
- return addData(GapAdvertisingData::TX_POWER_LEVEL, (uint8_t *)&txPower, 1);
- }
-
- /**
- * Clears the payload and resets the payload length counter.
- */
- void clear(void) {
- memset(&_payload, 0, GAP_ADVERTISING_DATA_MAX_PAYLOAD);
- _payloadLen = 0;
- }
-
- /**
- * Returns a pointer to the current payload.
- */
- const uint8_t *getPayload(void) const {
- return _payload;
- }
-
- /**
- * Returns the current payload length (0..31 bytes).
- */
- uint8_t getPayloadLen(void) const {
- return _payloadLen;
- }
-
- /**
- * Returns the 16-bit appearance value for this device.
- */
- uint16_t getAppearance(void) const {
- return (uint16_t)_appearance;
- }
-
- /**
- * Search advertisement data for field.
- * Returns pointer to the first element in the field if found, NULL otherwise.
- * Where the first element is the length of the field.
- */
- const uint8_t* findField(DataType_t type) const {
- return findField(type);
- }
-
-private:
- /**
- * Append advertising data based on the specified AD type (see DataType)
- */
- ble_error_t appendField(DataType advDataType, const uint8_t *payload, uint8_t len)
- {
- /* Make sure we don't exceed the 31 byte payload limit */
- if (_payloadLen + len + 2 > GAP_ADVERTISING_DATA_MAX_PAYLOAD) {
- return BLE_ERROR_BUFFER_OVERFLOW;
- }
-
- /* Field length. */
- memset(&_payload[_payloadLen], len + 1, 1);
- _payloadLen++;
-
- /* Field ID. */
- memset(&_payload[_payloadLen], (uint8_t)advDataType, 1);
- _payloadLen++;
-
- /* Payload. */
- memcpy(&_payload[_payloadLen], payload, len);
- _payloadLen += len;
-
- return BLE_ERROR_NONE;
- }
-
- /**
- * Search advertisement data for field.
- * Returns pointer to the first element in the field if found, NULL otherwise.
- * Where the first element is the length of the field.
- */
- uint8_t* findField(DataType_t type) {
- // scan through advertisement data
- for (uint8_t idx = 0; idx < _payloadLen; ) {
- uint8_t fieldType = _payload[idx + 1];
-
- if (fieldType == type) {
- return &_payload[idx];
- }
-
- // advance to next field
- idx += _payload[idx] + 1;
- }
-
- // field not found
- return NULL;
- }
-
- /**
- * Given the a pointer to a field in the advertising payload it replaces
- * the existing data in the field with the supplied data.
- *
- * When the specified AD type is INCOMPLETE_LIST_16BIT_SERVICE_IDS,
- * COMPLETE_LIST_16BIT_SERVICE_IDS, INCOMPLETE_LIST_32BIT_SERVICE_IDS,
- * COMPLETE_LIST_32BIT_SERVICE_IDS, INCOMPLETE_LIST_128BIT_SERVICE_IDS,
- * COMPLETE_LIST_128BIT_SERVICE_IDS or LIST_128BIT_SOLICITATION_IDS the
- * supplied value is appended to the values previously added to the
- * payload.
- *
- * Returns BLE_ERROR_NONE on success.
- */
- ble_error_t addField(DataType_t advDataType, const uint8_t *payload, uint8_t len, uint8_t* field)
- {
- ble_error_t result = BLE_ERROR_BUFFER_OVERFLOW;
-
- switch(advDataType) {
- // These fields will have the new data appended if there is sufficient space
- case INCOMPLETE_LIST_16BIT_SERVICE_IDS:
- case COMPLETE_LIST_16BIT_SERVICE_IDS:
- case INCOMPLETE_LIST_32BIT_SERVICE_IDS:
- case COMPLETE_LIST_32BIT_SERVICE_IDS:
- case INCOMPLETE_LIST_128BIT_SERVICE_IDS:
- case COMPLETE_LIST_128BIT_SERVICE_IDS:
- case LIST_128BIT_SOLICITATION_IDS: {
- // check if data fits
- if ((_payloadLen + len) <= GAP_ADVERTISING_DATA_MAX_PAYLOAD) {
- // make room for new field by moving the remainder of the
- // advertisement payload "to the right" starting after the
- // TYPE field.
- uint8_t* end = &_payload[_payloadLen];
-
- while (&field[1] < end) {
- end[len] = *end;
- end--;
- }
-
- // insert new data
- for (uint8_t idx = 0; idx < len; idx++) {
- field[2 + idx] = payload[idx];
- }
-
- // increment lengths
- field[0] += len;
- _payloadLen += len;
-
- result = BLE_ERROR_NONE;
- }
-
- break;
- }
- // These fields will be overwritten with the new value
- default: {
- result = updateField(advDataType, payload, len, field);
-
- break;
- }
- }
-
- return result;
- }
-
- /**
- * Given the a pointer to a field in the advertising payload it replaces
- * the existing data in the field with the supplied data.
- * Returns BLE_ERROR_NONE on success.
- */
- ble_error_t updateField(DataType_t advDataType, const uint8_t *payload, uint8_t len, uint8_t* field)
- {
- ble_error_t result = BLE_ERROR_BUFFER_OVERFLOW;
- uint8_t dataLength = field[0] - 1;
-
- // new data has same length, do in-order replacement
- if (len == dataLength) {
- for (uint8_t idx = 0; idx < dataLength; idx++) {
- field[2 + idx] = payload[idx];
- }
-
- result = BLE_ERROR_NONE;
- } else {
- // check if data fits
- if ((_payloadLen - dataLength + len) <= GAP_ADVERTISING_DATA_MAX_PAYLOAD) {
-
- // remove old field
- while ((field + dataLength + 2) < &_payload[_payloadLen]) {
- *field = field[dataLength + 2];
- field++;
- }
-
- // reduce length
- _payloadLen -= dataLength + 2;
-
- // add new field
- result = appendField(advDataType, payload, len);
- }
- }
-
- return result;
- }
-
- uint8_t _payload[GAP_ADVERTISING_DATA_MAX_PAYLOAD];
- uint8_t _payloadLen;
- uint16_t _appearance;
-};
-
+/* mbed Microcontroller Library
+ * Copyright (c) 2006-2013 ARM Limited
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __GAP_ADVERTISING_DATA_H__
+#define __GAP_ADVERTISING_DATA_H__
+
+#include <stdint.h>
+#include <string.h>
+
+#include "blecommon.h"
+
+#define GAP_ADVERTISING_DATA_MAX_PAYLOAD (31)
+
+/**************************************************************************/
+/*!
+ \brief
+ This class provides several helper functions to generate properly
+ formatted GAP Advertising and Scan Response data payloads.
+
+ \note
+ See Bluetooth Specification 4.0 (Vol. 3), Part C, Sections 11 and 18
+ for further information on Advertising and Scan Response data.
+
+ \par Advertising and Scan Response Payloads
+ Advertising data and Scan Response data are organized around a set of
+ data types called 'AD types' in Bluetooth 4.0 (see the Bluetooth Core
+ Specification v4.0, Vol. 3, Part C, Sections 11 and 18).
+
+ \par
+ Each AD type has its own standardized assigned number, as defined
+ by the Bluetooth SIG:
+ https://www.bluetooth.org/en-us/specification/assigned-numbers/generic-access-profile
+
+ \par
+ For convenience, all appropriate AD types are encapsulated
+ in GapAdvertisingData::DataType.
+
+ \par
+ Before the AD Types and their payload (if any) can be inserted into
+ the Advertising or Scan Response frames, they need to be formatted as
+ follows:
+
+ \li \c Record length (1 byte).
+ \li \c AD Type (1 byte).
+ \li \c AD payload (optional; only present if record length > 1).
+
+ \par
+ This class takes care of properly formatting the payload, performs
+ some basic checks on the payload length, and tries to avoid common
+ errors like adding an exclusive AD field twice in the Advertising
+ or Scan Response payload.
+
+ \par EXAMPLE
+
+ \code
+
+ // ToDo
+
+ \endcode
+*/
+/**************************************************************************/
+class GapAdvertisingData
+{
+public:
+ /**********************************************************************/
+ /*!
+ \brief
+ A list of Advertising Data types commonly used by peripherals.
+ These AD types are used to describe the capabilities of the
+ peripheral, and are inserted inside the advertising or scan
+ response payloads.
+
+ \par Source
+ \li \c Bluetooth Core Specification 4.0 (Vol. 3), Part C, Section 11, 18
+ \li \c https://www.bluetooth.org/en-us/specification/assigned-numbers/generic-access-profile
+ */
+ /**********************************************************************/
+ enum DataType_t {
+ FLAGS = 0x01, /**< \ref *Flags */
+ INCOMPLETE_LIST_16BIT_SERVICE_IDS = 0x02, /**< Incomplete list of 16-bit Service IDs */
+ COMPLETE_LIST_16BIT_SERVICE_IDS = 0x03, /**< Complete list of 16-bit Service IDs */
+ INCOMPLETE_LIST_32BIT_SERVICE_IDS = 0x04, /**< Incomplete list of 32-bit Service IDs (not relevant for Bluetooth 4.0) */
+ COMPLETE_LIST_32BIT_SERVICE_IDS = 0x05, /**< Complete list of 32-bit Service IDs (not relevant for Bluetooth 4.0) */
+ INCOMPLETE_LIST_128BIT_SERVICE_IDS = 0x06, /**< Incomplete list of 128-bit Service IDs */
+ COMPLETE_LIST_128BIT_SERVICE_IDS = 0x07, /**< Complete list of 128-bit Service IDs */
+ SHORTENED_LOCAL_NAME = 0x08, /**< Shortened Local Name */
+ COMPLETE_LOCAL_NAME = 0x09, /**< Complete Local Name */
+ TX_POWER_LEVEL = 0x0A, /**< TX Power Level (in dBm) */
+ DEVICE_ID = 0x10, /**< Device ID */
+ SLAVE_CONNECTION_INTERVAL_RANGE = 0x12, /**< Slave Connection Interval Range */
+ LIST_128BIT_SOLICITATION_IDS = 0x15, /**< List of 128 bit service UUIDs the device is looking for */
+ SERVICE_DATA = 0x16, /**< Service Data */
+ APPEARANCE = 0x19, /**< \ref Appearance */
+ ADVERTISING_INTERVAL = 0x1A, /**< Advertising Interval */
+ MANUFACTURER_SPECIFIC_DATA = 0xFF /**< Manufacturer Specific Data */
+ };
+ typedef enum DataType_t DataType; /* Deprecated type alias. This may be dropped in a future release. */
+
+ /**********************************************************************/
+ /*!
+ \brief
+ A list of values for the FLAGS AD Type.
+
+ \note
+ You can use more than one value in the FLAGS AD Type (ex.
+ LE_GENERAL_DISCOVERABLE and BREDR_NOT_SUPPORTED).
+
+ \par Source
+ \li \c Bluetooth Core Specification 4.0 (Vol. 3), Part C, Section 18.1
+ */
+ /**********************************************************************/
+ enum Flags_t {
+ LE_LIMITED_DISCOVERABLE = 0x01, /**< *Peripheral device is discoverable for a limited period of time. */
+ LE_GENERAL_DISCOVERABLE = 0x02, /**< Peripheral device is discoverable at any moment. */
+ BREDR_NOT_SUPPORTED = 0x04, /**< Peripheral device is LE only. */
+ SIMULTANEOUS_LE_BREDR_C = 0x08, /**< Not relevant - central mode only. */
+ SIMULTANEOUS_LE_BREDR_H = 0x10 /**< Not relevant - central mode only. */
+ };
+ typedef enum Flags_t Flags; /* Deprecated type alias. This may be dropped in a future release. */
+
+ /**********************************************************************/
+ /*!
+ \brief
+ A list of values for the APPEARANCE AD Type, which describes the
+ physical shape or appearance of the device.
+
+ \par Source
+ \li \c Bluetooth Core Specification Supplement, Part A, Section 1.12
+ \li \c Bluetooth Core Specification 4.0 (Vol. 3), Part C, Section 12.2
+ \li \c https://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.gap.appearance.xml
+ */
+ /**********************************************************************/
+ enum Appearance_t {
+ UNKNOWN = 0, /**< Unknown or unspecified appearance type. */
+ GENERIC_PHONE = 64, /**< Generic Phone. */
+ GENERIC_COMPUTER = 128, /**< Generic Computer. */
+ GENERIC_WATCH = 192, /**< Generic Watch. */
+ WATCH_SPORTS_WATCH = 193, /**< Sports Watch. */
+ GENERIC_CLOCK = 256, /**< Generic Clock. */
+ GENERIC_DISPLAY = 320, /**< Generic Display. */
+ GENERIC_REMOTE_CONTROL = 384, /**< Generic Remote Control. */
+ GENERIC_EYE_GLASSES = 448, /**< Generic Eye Glasses. */
+ GENERIC_TAG = 512, /**< Generic Tag. */
+ GENERIC_KEYRING = 576, /**< Generic Keyring. */
+ GENERIC_MEDIA_PLAYER = 640, /**< Generic Media Player. */
+ GENERIC_BARCODE_SCANNER = 704, /**< Generic Barcode Scanner. */
+ GENERIC_THERMOMETER = 768, /**< Generic Thermometer. */
+ THERMOMETER_EAR = 769, /**< Ear Thermometer. */
+ GENERIC_HEART_RATE_SENSOR = 832, /**< Generic Heart Rate Sensor. */
+ HEART_RATE_SENSOR_HEART_RATE_BELT = 833, /**< Belt Heart Rate Sensor. */
+ GENERIC_BLOOD_PRESSURE = 896, /**< Generic Blood Pressure. */
+ BLOOD_PRESSURE_ARM = 897, /**< Arm Blood Pressure. */
+ BLOOD_PRESSURE_WRIST = 898, /**< Wrist Blood Pressure. */
+ HUMAN_INTERFACE_DEVICE_HID = 960, /**< Human Interface Device (HID). */
+ KEYBOARD = 961, /**< Keyboard. */
+ MOUSE = 962, /**< Mouse. */
+ JOYSTICK = 963, /**< Joystick. */
+ GAMEPAD = 964, /**< Gamepad. */
+ DIGITIZER_TABLET = 965, /**< Digitizer Tablet. */
+ CARD_READER = 966, /**< Card Reader. */
+ DIGITAL_PEN = 967, /**< Digital Pen. */
+ BARCODE_SCANNER = 968, /**< Barcode Scanner. */
+ GENERIC_GLUCOSE_METER = 1024, /**< Generic Glucose Meter. */
+ GENERIC_RUNNING_WALKING_SENSOR = 1088, /**< Generic Running/Walking Sensor. */
+ RUNNING_WALKING_SENSOR_IN_SHOE = 1089, /**< In Shoe Running/Walking Sensor. */
+ RUNNING_WALKING_SENSOR_ON_SHOE = 1090, /**< On Shoe Running/Walking Sensor. */
+ RUNNING_WALKING_SENSOR_ON_HIP = 1091, /**< On Hip Running/Walking Sensor. */
+ GENERIC_CYCLING = 1152, /**< Generic Cycling. */
+ CYCLING_CYCLING_COMPUTER = 1153, /**< Cycling Computer. */
+ CYCLING_SPEED_SENSOR = 1154, /**< Cycling Speed Sensor. */
+ CYCLING_CADENCE_SENSOR = 1155, /**< Cycling Cadence Sensor. */
+ CYCLING_POWER_SENSOR = 1156, /**< Cycling Power Sensor. */
+ CYCLING_SPEED_AND_CADENCE_SENSOR = 1157, /**< Cycling Speed and Cadence Sensor. */
+ PULSE_OXIMETER_GENERIC = 3136, /**< Generic Pulse Oximeter. */
+ PULSE_OXIMETER_FINGERTIP = 3137, /**< Fingertip Pulse Oximeter. */
+ PULSE_OXIMETER_WRIST_WORN = 3138, /**< Wrist Worn Pulse Oximeter. */
+ OUTDOOR_GENERIC = 5184, /**< Generic Outdoor. */
+ OUTDOOR_LOCATION_DISPLAY_DEVICE = 5185, /**< Outdoor Location Display Device. */
+ OUTDOOR_LOCATION_AND_NAVIGATION_DISPLAY_DEVICE = 5186, /**< Outdoor Location and Navigation Display Device. */
+ OUTDOOR_LOCATION_POD = 5187, /**< Outdoor Location Pod. */
+ OUTDOOR_LOCATION_AND_NAVIGATION_POD = 5188 /**< Outdoor Location and Navigation Pod. */
+ };
+ typedef enum Appearance_t Appearance; /* Deprecated type alias. This may be dropped in a future release. */
+
+ GapAdvertisingData(void) : _payload(), _payloadLen(0), _appearance(GENERIC_TAG) {
+ /* empty */
+ }
+
+ /**
+ * Adds advertising data based on the specified AD type (see DataType).
+ *
+ * @param advDataType The Advertising 'DataType' to add.
+ * @param payload Pointer to the payload contents.
+ * @param len Size of the payload in bytes.
+ *
+ * @return BLE_ERROR_BUFFER_OVERFLOW if the specified data would cause the
+ * advertising buffer to overflow, else BLE_ERROR_NONE.
+ */
+ ble_error_t addData(DataType advDataType, const uint8_t *payload, uint8_t len)
+ {
+ ble_error_t result = BLE_ERROR_BUFFER_OVERFLOW;
+
+ // find field
+ uint8_t* field = findField(advDataType);
+
+ // Field type already exist, either add to field or replace
+ if (field) {
+ switch(advDataType) {
+ // These fields will be overwritten with the new value
+ case FLAGS:
+ case SHORTENED_LOCAL_NAME:
+ case COMPLETE_LOCAL_NAME:
+ case TX_POWER_LEVEL:
+ case DEVICE_ID:
+ case SLAVE_CONNECTION_INTERVAL_RANGE:
+ case SERVICE_DATA:
+ case APPEARANCE:
+ case ADVERTISING_INTERVAL:
+ case MANUFACTURER_SPECIFIC_DATA: {
+ // current field length, with the type subtracted
+ uint8_t dataLength = field[0] - 1;
+
+ // new data has same length, do in-order replacement
+ if (len == dataLength) {
+ for (uint8_t idx = 0; idx < dataLength; idx++) {
+ field[2 + idx] = payload[idx];
+ }
+ } else {
+ // check if data fits
+ if ((_payloadLen - dataLength + len) <= GAP_ADVERTISING_DATA_MAX_PAYLOAD) {
+
+ // remove old field
+ while ((field + dataLength + 2) < &_payload[_payloadLen]) {
+ *field = field[dataLength + 2];
+ field++;
+ }
+
+ // reduce length
+ _payloadLen -= dataLength + 2;
+
+ // add new field
+ result = appendField(advDataType, payload, len);
+ }
+ }
+
+ break;
+ }
+ // These fields will have the new data appended if there is sufficient space
+ case INCOMPLETE_LIST_16BIT_SERVICE_IDS:
+ case COMPLETE_LIST_16BIT_SERVICE_IDS:
+ case INCOMPLETE_LIST_32BIT_SERVICE_IDS:
+ case COMPLETE_LIST_32BIT_SERVICE_IDS:
+ case INCOMPLETE_LIST_128BIT_SERVICE_IDS:
+ case COMPLETE_LIST_128BIT_SERVICE_IDS:
+ case LIST_128BIT_SOLICITATION_IDS: {
+ // check if data fits
+ if ((_payloadLen + len) <= GAP_ADVERTISING_DATA_MAX_PAYLOAD) {
+ // make room for new field by moving the remainder of the
+ // advertisement payload "to the right" starting after the
+ // TYPE field.
+ uint8_t* end = &_payload[_payloadLen];
+
+ while (&field[1] < end) {
+ end[len] = *end;
+ end--;
+ }
+
+ // insert new data
+ for (uint8_t idx = 0; idx < len; idx++) {
+ field[2 + idx] = payload[idx];
+ }
+
+ // increment lengths
+ field[0] += len;
+ _payloadLen += len;
+
+ result = BLE_ERROR_NONE;
+ }
+
+ break;
+ }
+ // Field exists but updating it is not supported. Abort operation.
+ default:
+ result = BLE_ERROR_NOT_IMPLEMENTED;
+ break;
+ }
+ } else {
+ // field doesn't exists, insert new
+ result = appendField(advDataType, payload, len);
+ }
+
+ return result;
+ }
+
+ /**
+ * Update a particular ADV field in the advertising payload (based on
+ * matching type and length). Note: the length of the new data must be the
+ * same as the old one.
+ *
+ * @param[in] advDataType The Advertising 'DataType' to add.
+ * @param[in] payload Pointer to the payload contents.
+ * @param[in] len Size of the payload in bytes.
+ *
+ * @return BLE_ERROR_UNSPECIFIED if the specified field is not found, else
+ * BLE_ERROR_NONE.
+ */
+ ble_error_t updateData(DataType_t advDataType, const uint8_t *payload, uint8_t len)
+ {
+ if ((payload == NULL) || (len == 0)) {
+ return BLE_ERROR_INVALID_PARAM;
+ }
+
+ /* A local struct to describe an ADV field. This definition comes from the Bluetooth Core Spec. (v4.2) Part C, Section 11. */
+ struct ADVField_t {
+ uint8_t len; /* Describes the length (in bytes) of the following type and bytes. */
+ uint8_t type; /* Should have the same representation of DataType_t (above). */
+ uint8_t bytes[0]; /* A placeholder for variable length data. */
+ };
+
+ /* Iterate over the adv fields looking for the first match. */
+ uint8_t byteIndex = 0;
+ while (byteIndex < _payloadLen) {
+ ADVField_t *currentADV = (ADVField_t *)&_payload[byteIndex];
+ if ((currentADV->len == (len + 1)) && /* Incoming len only describes the payload, whereas ADV->len describes [type + payload]. */
+ (currentADV->type == advDataType)) {
+ memcpy(currentADV->bytes, payload, len);
+ return BLE_ERROR_NONE;
+ }
+
+ byteIndex += (currentADV->len + 1); /* Advance by len+1; '+1' is needed to span the len field itself. */
+ }
+
+ return BLE_ERROR_UNSPECIFIED;
+ }
+
+ /**
+ * Helper function to add APPEARANCE data to the advertising payload.
+ *
+ * @param appearance
+ * The APPEARANCE value to add.
+ *
+ * @return BLE_ERROR_BUFFER_OVERFLOW if the specified data would cause the
+ * advertising buffer to overflow, else BLE_ERROR_NONE.
+ */
+ ble_error_t addAppearance(Appearance appearance = GENERIC_TAG) {
+ _appearance = appearance;
+ return addData(GapAdvertisingData::APPEARANCE, (uint8_t *)&appearance, 2);
+ }
+
+ /**
+ * Helper function to add FLAGS data to the advertising payload.
+ * @param flags
+ * LE_LIMITED_DISCOVERABLE
+ * The peripheral is discoverable for a limited period of time.
+ * LE_GENERAL_DISCOVERABLE
+ * The peripheral is permanently discoverable.
+ * BREDR_NOT_SUPPORTED
+ * This peripheral is a Bluetooth Low Energy only device (no EDR support).
+ *
+ * @return BLE_ERROR_BUFFER_OVERFLOW if the specified data would cause the
+ * advertising buffer to overflow, else BLE_ERROR_NONE.
+ */
+ ble_error_t addFlags(uint8_t flags = LE_GENERAL_DISCOVERABLE) {
+ return addData(GapAdvertisingData::FLAGS, &flags, 1);
+ }
+
+ /**
+ * Helper function to add TX_POWER_LEVEL data to the advertising payload.
+ *
+ * @return BLE_ERROR_BUFFER_OVERFLOW if the specified data would cause the
+ * advertising buffer to overflow, else BLE_ERROR_NONE.
+ */
+ ble_error_t addTxPower(int8_t txPower) {
+ /* To Do: Basic error checking to make sure txPower is in range. */
+ return addData(GapAdvertisingData::TX_POWER_LEVEL, (uint8_t *)&txPower, 1);
+ }
+
+ /**
+ * Clears the payload and resets the payload length counter.
+ */
+ void clear(void) {
+ memset(&_payload, 0, GAP_ADVERTISING_DATA_MAX_PAYLOAD);
+ _payloadLen = 0;
+ }
+
+ /**
+ * Returns a pointer to the current payload.
+ */
+ const uint8_t *getPayload(void) const {
+ return _payload;
+ }
+
+ /**
+ * Returns the current payload length (0..31 bytes).
+ */
+ uint8_t getPayloadLen(void) const {
+ return _payloadLen;
+ }
+
+ /**
+ * Returns the 16-bit appearance value for this device.
+ */
+ uint16_t getAppearance(void) const {
+ return (uint16_t)_appearance;
+ }
+
+ /**
+ * Search advertisement data for field.
+ * Returns pointer to the first element in the field if found, NULL otherwise.
+ * Where the first element is the length of the field.
+ */
+ const uint8_t* findField(DataType_t type) const {
+ return findField(type);
+ }
+
+private:
+ /**
+ * Append advertising data based on the specified AD type (see DataType)
+ */
+ ble_error_t appendField(DataType advDataType, const uint8_t *payload, uint8_t len)
+ {
+ /* Make sure we don't exceed the 31 byte payload limit */
+ if (_payloadLen + len + 2 > GAP_ADVERTISING_DATA_MAX_PAYLOAD) {
+ return BLE_ERROR_BUFFER_OVERFLOW;
+ }
+
+ /* Field length. */
+ memset(&_payload[_payloadLen], len + 1, 1);
+ _payloadLen++;
+
+ /* Field ID. */
+ memset(&_payload[_payloadLen], (uint8_t)advDataType, 1);
+ _payloadLen++;
+
+ /* Payload. */
+ memcpy(&_payload[_payloadLen], payload, len);
+ _payloadLen += len;
+
+ return BLE_ERROR_NONE;
+ }
+
+ /**
+ * Search advertisement data for field.
+ * Returns pointer to the first element in the field if found, NULL otherwise.
+ * Where the first element is the length of the field.
+ */
+ uint8_t* findField(DataType_t type) {
+ // scan through advertisement data
+ for (uint8_t idx = 0; idx < _payloadLen; ) {
+ uint8_t fieldType = _payload[idx + 1];
+
+ if (fieldType == type) {
+ return &_payload[idx];
+ }
+
+ // advance to next field
+ idx += _payload[idx] + 1;
+ }
+
+ // field not found
+ return NULL;
+ }
+
+ uint8_t _payload[GAP_ADVERTISING_DATA_MAX_PAYLOAD];
+ uint8_t _payloadLen;
+ uint16_t _appearance;
+};
+
#endif // ifndef __GAP_ADVERTISING_DATA_H__
\ No newline at end of file
--- a/ble/GattAttribute.h Tue Jan 12 19:47:52 2016 +0000
+++ b/ble/GattAttribute.h Wed Apr 06 19:13:46 2016 +0100
@@ -1,81 +1,77 @@
-/* mbed Microcontroller Library
- * Copyright (c) 2006-2013 ARM Limited
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __GATT_ATTRIBUTE_H__
-#define __GATT_ATTRIBUTE_H__
-
-#include "UUID.h"
-
-class GattAttribute {
-public:
- typedef uint16_t Handle_t;
- static const Handle_t INVALID_HANDLE = 0x0000;
-
-public:
- /**
- * @brief Creates a new GattAttribute using the specified
- * UUID, value length, and inital value.
- *
- * @param[in] uuid
- * The UUID to use for this attribute.
- * @param[in] valuePtr
- * The memory holding the initial value.
- * @param[in] len
- * The length in bytes of this attribute's value.
- * @param[in] maxLen
- * The max length in bytes of this attribute's value.
- * @param[in] hasVariableLen
- * Whether the attribute's value length changes overtime.
- *
- * @section EXAMPLE
- *
- * @code
- *
- * // UUID = 0x2A19, Min length 2, Max len = 2
- * GattAttribute attr = GattAttribute(0x2A19, &someValue, 2, 2);
- *
- * @endcode
- */
- GattAttribute(const UUID &uuid, uint8_t *valuePtr = NULL, uint16_t len = 0, uint16_t maxLen = 0, bool hasVariableLen = true) :
- _uuid(uuid), _valuePtr(valuePtr), _lenMax(maxLen), _len(len), _hasVariableLen(hasVariableLen), _handle() {
- /* Empty */
- }
-
-public:
- Handle_t getHandle(void) const {return _handle; }
- const UUID &getUUID(void) const {return _uuid; }
- uint16_t getLength(void) const {return _len; }
- uint16_t getMaxLength(void) const {return _lenMax; }
- uint16_t *getLengthPtr(void) {return &_len; }
- void setHandle(Handle_t id) {_handle = id; }
- uint8_t *getValuePtr(void) {return _valuePtr; }
- bool hasVariableLength(void) const {return _hasVariableLen;}
-
-private:
- UUID _uuid; /* Characteristic UUID. */
- uint8_t *_valuePtr;
- uint16_t _lenMax; /* Maximum length of the value. */
- uint16_t _len; /* Current length of the value. */
- bool _hasVariableLen;
- Handle_t _handle;
-
-private:
- /* Disallow copy and assignment. */
- GattAttribute(const GattAttribute &);
- GattAttribute& operator=(const GattAttribute &);
-};
-
+/* mbed Microcontroller Library
+ * Copyright (c) 2006-2013 ARM Limited
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __GATT_ATTRIBUTE_H__
+#define __GATT_ATTRIBUTE_H__
+
+#include "UUID.h"
+
+class GattAttribute {
+public:
+ typedef uint16_t Handle_t;
+ static const Handle_t INVALID_HANDLE = 0x0000;
+
+public:
+ /**
+ * @brief Creates a new GattAttribute using the specified
+ * UUID, value length, and inital value.
+ *
+ * @param[in] uuid
+ * The UUID to use for this attribute.
+ * @param[in] valuePtr
+ * The memory holding the initial value.
+ * @param[in] len
+ * The length in bytes of this attribute's value.
+ * @param[in] maxLen
+ * The max length in bytes of this attribute's value.
+ *
+ * @section EXAMPLE
+ *
+ * @code
+ *
+ * // UUID = 0x2A19, Min length 2, Max len = 2
+ * GattAttribute attr = GattAttribute(0x2A19, &someValue, 2, 2);
+ *
+ * @endcode
+ */
+ GattAttribute(const UUID &uuid, uint8_t *valuePtr = NULL, uint16_t len = 0, uint16_t maxLen = 0) :
+ _uuid(uuid), _valuePtr(valuePtr), _lenMax(maxLen), _len(len), _handle() {
+ /* Empty */
+ }
+
+public:
+ Handle_t getHandle(void) const {return _handle; }
+ const UUID &getUUID(void) const {return _uuid; }
+ uint16_t getLength(void) const {return _len; }
+ uint16_t getMaxLength(void) const {return _lenMax; }
+ uint16_t *getLengthPtr(void) {return &_len; }
+ void setHandle(Handle_t id) {_handle = id; }
+ uint8_t *getValuePtr(void) {return _valuePtr; }
+
+private:
+ UUID _uuid; /* Characteristic UUID. */
+ uint8_t *_valuePtr;
+ uint16_t _lenMax; /* Maximum length of the value. */
+ uint16_t _len; /* Current length of the value. */
+ Handle_t _handle;
+
+private:
+ /* Disallow copy and assignment. */
+ GattAttribute(const GattAttribute &);
+ GattAttribute& operator=(const GattAttribute &);
+};
+
#endif // ifndef __GATT_ATTRIBUTE_H__
\ No newline at end of file
--- a/ble/GattCharacteristic.h Tue Jan 12 19:47:52 2016 +0000
+++ b/ble/GattCharacteristic.h Wed Apr 06 19:13:46 2016 +0100
@@ -1,547 +1,544 @@
-/* mbed Microcontroller Library
- * Copyright (c) 2006-2013 ARM Limited
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __GATT_CHARACTERISTIC_H__
-#define __GATT_CHARACTERISTIC_H__
-
-#include "Gap.h"
-#include "SecurityManager.h"
-#include "GattAttribute.h"
-#include "GattCallbackParamTypes.h"
-#include "FunctionPointerWithContext.h"
-
-class GattCharacteristic {
-public:
- enum {
- UUID_BATTERY_LEVEL_STATE_CHAR = 0x2A1B,
- UUID_BATTERY_POWER_STATE_CHAR = 0x2A1A,
- UUID_REMOVABLE_CHAR = 0x2A3A,
- UUID_SERVICE_REQUIRED_CHAR = 0x2A3B,
- UUID_ALERT_CATEGORY_ID_CHAR = 0x2A43,
- UUID_ALERT_CATEGORY_ID_BIT_MASK_CHAR = 0x2A42,
- UUID_ALERT_LEVEL_CHAR = 0x2A06,
- UUID_ALERT_NOTIFICATION_CONTROL_POINT_CHAR = 0x2A44,
- UUID_ALERT_STATUS_CHAR = 0x2A3F,
- UUID_BATTERY_LEVEL_CHAR = 0x2A19,
- UUID_BLOOD_PRESSURE_FEATURE_CHAR = 0x2A49,
- UUID_BLOOD_PRESSURE_MEASUREMENT_CHAR = 0x2A35,
- UUID_BODY_SENSOR_LOCATION_CHAR = 0x2A38,
- UUID_BOOT_KEYBOARD_INPUT_REPORT_CHAR = 0x2A22,
- UUID_BOOT_KEYBOARD_OUTPUT_REPORT_CHAR = 0x2A32,
- UUID_BOOT_MOUSE_INPUT_REPORT_CHAR = 0x2A33,
- UUID_CURRENT_TIME_CHAR = 0x2A2B,
- UUID_DATE_TIME_CHAR = 0x2A08,
- UUID_DAY_DATE_TIME_CHAR = 0x2A0A,
- UUID_DAY_OF_WEEK_CHAR = 0x2A09,
- UUID_DST_OFFSET_CHAR = 0x2A0D,
- UUID_EXACT_TIME_256_CHAR = 0x2A0C,
- UUID_FIRMWARE_REVISION_STRING_CHAR = 0x2A26,
- UUID_GLUCOSE_FEATURE_CHAR = 0x2A51,
- UUID_GLUCOSE_MEASUREMENT_CHAR = 0x2A18,
- UUID_GLUCOSE_MEASUREMENT_CONTEXT_CHAR = 0x2A34,
- UUID_HARDWARE_REVISION_STRING_CHAR = 0x2A27,
- UUID_HEART_RATE_CONTROL_POINT_CHAR = 0x2A39,
- UUID_HEART_RATE_MEASUREMENT_CHAR = 0x2A37,
- UUID_HID_CONTROL_POINT_CHAR = 0x2A4C,
- UUID_HID_INFORMATION_CHAR = 0x2A4A,
- UUID_HUMIDITY_CHAR = 0x2A6F,
- UUID_IEEE_REGULATORY_CERTIFICATION_DATA_LIST_CHAR = 0x2A2A,
- UUID_INTERMEDIATE_CUFF_PRESSURE_CHAR = 0x2A36,
- UUID_INTERMEDIATE_TEMPERATURE_CHAR = 0x2A1E,
- UUID_LOCAL_TIME_INFORMATION_CHAR = 0x2A0F,
- UUID_MANUFACTURER_NAME_STRING_CHAR = 0x2A29,
- UUID_MEASUREMENT_INTERVAL_CHAR = 0x2A21,
- UUID_MODEL_NUMBER_STRING_CHAR = 0x2A24,
- UUID_UNREAD_ALERT_CHAR = 0x2A45,
- UUID_NEW_ALERT_CHAR = 0x2A46,
- UUID_PNP_ID_CHAR = 0x2A50,
- UUID_PRESSURE_CHAR = 0x2A6D,
- UUID_PROTOCOL_MODE_CHAR = 0x2A4E,
- UUID_RECORD_ACCESS_CONTROL_POINT_CHAR = 0x2A52,
- UUID_REFERENCE_TIME_INFORMATION_CHAR = 0x2A14,
- UUID_REPORT_CHAR = 0x2A4D,
- UUID_REPORT_MAP_CHAR = 0x2A4B,
- UUID_RINGER_CONTROL_POINT_CHAR = 0x2A40,
- UUID_RINGER_SETTING_CHAR = 0x2A41,
- UUID_SCAN_INTERVAL_WINDOW_CHAR = 0x2A4F,
- UUID_SCAN_REFRESH_CHAR = 0x2A31,
- UUID_SERIAL_NUMBER_STRING_CHAR = 0x2A25,
- UUID_SOFTWARE_REVISION_STRING_CHAR = 0x2A28,
- UUID_SUPPORTED_NEW_ALERT_CATEGORY_CHAR = 0x2A47,
- UUID_SUPPORTED_UNREAD_ALERT_CATEGORY_CHAR = 0x2A48,
- UUID_SYSTEM_ID_CHAR = 0x2A23,
- UUID_TEMPERATURE_CHAR = 0x2A6E,
- UUID_TEMPERATURE_MEASUREMENT_CHAR = 0x2A1C,
- UUID_TEMPERATURE_TYPE_CHAR = 0x2A1D,
- UUID_TIME_ACCURACY_CHAR = 0x2A12,
- UUID_TIME_SOURCE_CHAR = 0x2A13,
- UUID_TIME_UPDATE_CONTROL_POINT_CHAR = 0x2A16,
- UUID_TIME_UPDATE_STATE_CHAR = 0x2A17,
- UUID_TIME_WITH_DST_CHAR = 0x2A11,
- UUID_TIME_ZONE_CHAR = 0x2A0E,
- UUID_TX_POWER_LEVEL_CHAR = 0x2A07,
- UUID_CSC_FEATURE_CHAR = 0x2A5C,
- UUID_CSC_MEASUREMENT_CHAR = 0x2A5B,
- UUID_RSC_FEATURE_CHAR = 0x2A54,
- UUID_RSC_MEASUREMENT_CHAR = 0x2A53
- };
-
- /**************************************************************************/
- /*!
- \brief Standard GATT characteristic presentation format unit types.
- These unit types are used to describe what the raw numeric
- data in a characteristic actually represents.
-
- \note See https://developer.bluetooth.org/gatt/units/Pages/default.aspx
- */
- /**************************************************************************/
- enum {
- BLE_GATT_UNIT_NONE = 0x2700, /**< No specified unit type. */
- BLE_GATT_UNIT_LENGTH_METRE = 0x2701, /**< Length, metre. */
- BLE_GATT_UNIT_MASS_KILOGRAM = 0x2702, /**< Mass, kilogram. */
- BLE_GATT_UNIT_TIME_SECOND = 0x2703, /**< Time, second. */
- BLE_GATT_UNIT_ELECTRIC_CURRENT_AMPERE = 0x2704, /**< Electric current, ampere. */
- BLE_GATT_UNIT_THERMODYNAMIC_TEMPERATURE_KELVIN = 0x2705, /**< Thermodynamic temperature, kelvin. */
- BLE_GATT_UNIT_AMOUNT_OF_SUBSTANCE_MOLE = 0x2706, /**< Amount of substance, mole. */
- BLE_GATT_UNIT_LUMINOUS_INTENSITY_CANDELA = 0x2707, /**< Luminous intensity, candela. */
- BLE_GATT_UNIT_AREA_SQUARE_METRES = 0x2710, /**< Area, square metres. */
- BLE_GATT_UNIT_VOLUME_CUBIC_METRES = 0x2711, /**< Volume, cubic metres. */
- BLE_GATT_UNIT_VELOCITY_METRES_PER_SECOND = 0x2712, /**< Velocity, metres per second. */
- BLE_GATT_UNIT_ACCELERATION_METRES_PER_SECOND_SQUARED = 0x2713, /**< Acceleration, metres per second squared. */
- BLE_GATT_UNIT_WAVENUMBER_RECIPROCAL_METRE = 0x2714, /**< Wave number reciprocal, metre. */
- BLE_GATT_UNIT_DENSITY_KILOGRAM_PER_CUBIC_METRE = 0x2715, /**< Density, kilogram per cubic metre. */
- BLE_GATT_UNIT_SURFACE_DENSITY_KILOGRAM_PER_SQUARE_METRE = 0x2716, /**< */
- BLE_GATT_UNIT_SPECIFIC_VOLUME_CUBIC_METRE_PER_KILOGRAM = 0x2717, /**< */
- BLE_GATT_UNIT_CURRENT_DENSITY_AMPERE_PER_SQUARE_METRE = 0x2718, /**< */
- BLE_GATT_UNIT_MAGNETIC_FIELD_STRENGTH_AMPERE_PER_METRE = 0x2719, /**< Magnetic field strength, ampere per metre. */
- BLE_GATT_UNIT_AMOUNT_CONCENTRATION_MOLE_PER_CUBIC_METRE = 0x271A, /**< */
- BLE_GATT_UNIT_MASS_CONCENTRATION_KILOGRAM_PER_CUBIC_METRE = 0x271B, /**< */
- BLE_GATT_UNIT_LUMINANCE_CANDELA_PER_SQUARE_METRE = 0x271C, /**< */
- BLE_GATT_UNIT_REFRACTIVE_INDEX = 0x271D, /**< */
- BLE_GATT_UNIT_RELATIVE_PERMEABILITY = 0x271E, /**< */
- BLE_GATT_UNIT_PLANE_ANGLE_RADIAN = 0x2720, /**< */
- BLE_GATT_UNIT_SOLID_ANGLE_STERADIAN = 0x2721, /**< */
- BLE_GATT_UNIT_FREQUENCY_HERTZ = 0x2722, /**< Frequency, hertz. */
- BLE_GATT_UNIT_FORCE_NEWTON = 0x2723, /**< Force, newton. */
- BLE_GATT_UNIT_PRESSURE_PASCAL = 0x2724, /**< Pressure, pascal. */
- BLE_GATT_UNIT_ENERGY_JOULE = 0x2725, /**< Energy, joule. */
- BLE_GATT_UNIT_POWER_WATT = 0x2726, /**< Power, watt. */
- BLE_GATT_UNIT_ELECTRIC_CHARGE_COULOMB = 0x2727, /**< Electrical charge, coulomb. */
- BLE_GATT_UNIT_ELECTRIC_POTENTIAL_DIFFERENCE_VOLT = 0x2728, /**< Electrical potential difference, voltage. */
- BLE_GATT_UNIT_CAPACITANCE_FARAD = 0x2729, /**< */
- BLE_GATT_UNIT_ELECTRIC_RESISTANCE_OHM = 0x272A, /**< */
- BLE_GATT_UNIT_ELECTRIC_CONDUCTANCE_SIEMENS = 0x272B, /**< */
- BLE_GATT_UNIT_MAGNETIC_FLEX_WEBER = 0x272C, /**< */
- BLE_GATT_UNIT_MAGNETIC_FLEX_DENSITY_TESLA = 0x272D, /**< */
- BLE_GATT_UNIT_INDUCTANCE_HENRY = 0x272E, /**< */
- BLE_GATT_UNIT_THERMODYNAMIC_TEMPERATURE_DEGREE_CELSIUS = 0x272F, /**< */
- BLE_GATT_UNIT_LUMINOUS_FLUX_LUMEN = 0x2730, /**< */
- BLE_GATT_UNIT_ILLUMINANCE_LUX = 0x2731, /**< */
- BLE_GATT_UNIT_ACTIVITY_REFERRED_TO_A_RADIONUCLIDE_BECQUEREL = 0x2732, /**< */
- BLE_GATT_UNIT_ABSORBED_DOSE_GRAY = 0x2733, /**< */
- BLE_GATT_UNIT_DOSE_EQUIVALENT_SIEVERT = 0x2734, /**< */
- BLE_GATT_UNIT_CATALYTIC_ACTIVITY_KATAL = 0x2735, /**< */
- BLE_GATT_UNIT_DYNAMIC_VISCOSITY_PASCAL_SECOND = 0x2740, /**< */
- BLE_GATT_UNIT_MOMENT_OF_FORCE_NEWTON_METRE = 0x2741, /**< */
- BLE_GATT_UNIT_SURFACE_TENSION_NEWTON_PER_METRE = 0x2742, /**< */
- BLE_GATT_UNIT_ANGULAR_VELOCITY_RADIAN_PER_SECOND = 0x2743, /**< */
- BLE_GATT_UNIT_ANGULAR_ACCELERATION_RADIAN_PER_SECOND_SQUARED = 0x2744, /**< */
- BLE_GATT_UNIT_HEAT_FLUX_DENSITY_WATT_PER_SQUARE_METRE = 0x2745, /**< */
- BLE_GATT_UNIT_HEAT_CAPACITY_JOULE_PER_KELVIN = 0x2746, /**< */
- BLE_GATT_UNIT_SPECIFIC_HEAT_CAPACITY_JOULE_PER_KILOGRAM_KELVIN = 0x2747, /**< */
- BLE_GATT_UNIT_SPECIFIC_ENERGY_JOULE_PER_KILOGRAM = 0x2748, /**< */
- BLE_GATT_UNIT_THERMAL_CONDUCTIVITY_WATT_PER_METRE_KELVIN = 0x2749, /**< */
- BLE_GATT_UNIT_ENERGY_DENSITY_JOULE_PER_CUBIC_METRE = 0x274A, /**< */
- BLE_GATT_UNIT_ELECTRIC_FIELD_STRENGTH_VOLT_PER_METRE = 0x274B, /**< */
- BLE_GATT_UNIT_ELECTRIC_CHARGE_DENSITY_COULOMB_PER_CUBIC_METRE = 0x274C, /**< */
- BLE_GATT_UNIT_SURFACE_CHARGE_DENSITY_COULOMB_PER_SQUARE_METRE = 0x274D, /**< */
- BLE_GATT_UNIT_ELECTRIC_FLUX_DENSITY_COULOMB_PER_SQUARE_METRE = 0x274E, /**< */
- BLE_GATT_UNIT_PERMITTIVITY_FARAD_PER_METRE = 0x274F, /**< */
- BLE_GATT_UNIT_PERMEABILITY_HENRY_PER_METRE = 0x2750, /**< */
- BLE_GATT_UNIT_MOLAR_ENERGY_JOULE_PER_MOLE = 0x2751, /**< */
- BLE_GATT_UNIT_MOLAR_ENTROPY_JOULE_PER_MOLE_KELVIN = 0x2752, /**< */
- BLE_GATT_UNIT_EXPOSURE_COULOMB_PER_KILOGRAM = 0x2753, /**< */
- BLE_GATT_UNIT_ABSORBED_DOSE_RATE_GRAY_PER_SECOND = 0x2754, /**< */
- BLE_GATT_UNIT_RADIANT_INTENSITY_WATT_PER_STERADIAN = 0x2755, /**< */
- BLE_GATT_UNIT_RADIANCE_WATT_PER_SQUARE_METRE_STERADIAN = 0x2756, /**< */
- BLE_GATT_UNIT_CATALYTIC_ACTIVITY_CONCENTRATION_KATAL_PER_CUBIC_METRE = 0x2757, /**< */
- BLE_GATT_UNIT_TIME_MINUTE = 0x2760, /**< Time, minute. */
- BLE_GATT_UNIT_TIME_HOUR = 0x2761, /**< Time, hour. */
- BLE_GATT_UNIT_TIME_DAY = 0x2762, /**< Time, day. */
- BLE_GATT_UNIT_PLANE_ANGLE_DEGREE = 0x2763, /**< */
- BLE_GATT_UNIT_PLANE_ANGLE_MINUTE = 0x2764, /**< */
- BLE_GATT_UNIT_PLANE_ANGLE_SECOND = 0x2765, /**< */
- BLE_GATT_UNIT_AREA_HECTARE = 0x2766, /**< */
- BLE_GATT_UNIT_VOLUME_LITRE = 0x2767, /**< */
- BLE_GATT_UNIT_MASS_TONNE = 0x2768, /**< */
- BLE_GATT_UNIT_PRESSURE_BAR = 0x2780, /**< Pressure, bar. */
- BLE_GATT_UNIT_PRESSURE_MILLIMETRE_OF_MERCURY = 0x2781, /**< Pressure, millimetre of mercury. */
- BLE_GATT_UNIT_LENGTH_ANGSTROM = 0x2782, /**< */
- BLE_GATT_UNIT_LENGTH_NAUTICAL_MILE = 0x2783, /**< */
- BLE_GATT_UNIT_AREA_BARN = 0x2784, /**< */
- BLE_GATT_UNIT_VELOCITY_KNOT = 0x2785, /**< */
- BLE_GATT_UNIT_LOGARITHMIC_RADIO_QUANTITY_NEPER = 0x2786, /**< */
- BLE_GATT_UNIT_LOGARITHMIC_RADIO_QUANTITY_BEL = 0x2787, /**< */
- BLE_GATT_UNIT_LENGTH_YARD = 0x27A0, /**< Length, yard. */
- BLE_GATT_UNIT_LENGTH_PARSEC = 0x27A1, /**< Length, parsec. */
- BLE_GATT_UNIT_LENGTH_INCH = 0x27A2, /**< Length, inch. */
- BLE_GATT_UNIT_LENGTH_FOOT = 0x27A3, /**< Length, foot. */
- BLE_GATT_UNIT_LENGTH_MILE = 0x27A4, /**< Length, mile. */
- BLE_GATT_UNIT_PRESSURE_POUND_FORCE_PER_SQUARE_INCH = 0x27A5, /**< */
- BLE_GATT_UNIT_VELOCITY_KILOMETRE_PER_HOUR = 0x27A6, /**< Velocity, kilometre per hour. */
- BLE_GATT_UNIT_VELOCITY_MILE_PER_HOUR = 0x27A7, /**< Velocity, mile per hour. */
- BLE_GATT_UNIT_ANGULAR_VELOCITY_REVOLUTION_PER_MINUTE = 0x27A8, /**< Angular Velocity, revolution per minute. */
- BLE_GATT_UNIT_ENERGY_GRAM_CALORIE = 0x27A9, /**< Energy, gram calorie. */
- BLE_GATT_UNIT_ENERGY_KILOGRAM_CALORIE = 0x27AA, /**< Energy, kilogram calorie. */
- BLE_GATT_UNIT_ENERGY_KILOWATT_HOUR = 0x27AB, /**< Energy, killowatt hour. */
- BLE_GATT_UNIT_THERMODYNAMIC_TEMPERATURE_DEGREE_FAHRENHEIT = 0x27AC, /**< */
- BLE_GATT_UNIT_PERCENTAGE = 0x27AD, /**< Percentage. */
- BLE_GATT_UNIT_PER_MILLE = 0x27AE, /**< */
- BLE_GATT_UNIT_PERIOD_BEATS_PER_MINUTE = 0x27AF, /**< */
- BLE_GATT_UNIT_ELECTRIC_CHARGE_AMPERE_HOURS = 0x27B0, /**< */
- BLE_GATT_UNIT_MASS_DENSITY_MILLIGRAM_PER_DECILITRE = 0x27B1, /**< */
- BLE_GATT_UNIT_MASS_DENSITY_MILLIMOLE_PER_LITRE = 0x27B2, /**< */
- BLE_GATT_UNIT_TIME_YEAR = 0x27B3, /**< Time, year. */
- BLE_GATT_UNIT_TIME_MONTH = 0x27B4, /**< Time, month. */
- BLE_GATT_UNIT_CONCENTRATION_COUNT_PER_CUBIC_METRE = 0x27B5, /**< */
- BLE_GATT_UNIT_IRRADIANCE_WATT_PER_SQUARE_METRE = 0x27B6 /**< */
- };
-
- /**************************************************************************/
- /*!
- \brief Standard GATT number types.
-
- \note See Bluetooth Specification 4.0 (Vol. 3), Part G, Section 3.3.3.5.2
- \note See http://developer.bluetooth.org/gatt/descriptors/Pages/DescriptorViewer.aspx?u=org.bluetooth.descriptor.gatt.characteristic_presentation_format.xml
- */
- /**************************************************************************/
- enum {
- BLE_GATT_FORMAT_RFU = 0x00, /**< Reserved for future use. */
- BLE_GATT_FORMAT_BOOLEAN = 0x01, /**< Boolean. */
- BLE_GATT_FORMAT_2BIT = 0x02, /**< Unsigned 2-bit integer. */
- BLE_GATT_FORMAT_NIBBLE = 0x03, /**< Unsigned 4-bit integer. */
- BLE_GATT_FORMAT_UINT8 = 0x04, /**< Unsigned 8-bit integer. */
- BLE_GATT_FORMAT_UINT12 = 0x05, /**< Unsigned 12-bit integer. */
- BLE_GATT_FORMAT_UINT16 = 0x06, /**< Unsigned 16-bit integer. */
- BLE_GATT_FORMAT_UINT24 = 0x07, /**< Unsigned 24-bit integer. */
- BLE_GATT_FORMAT_UINT32 = 0x08, /**< Unsigned 32-bit integer. */
- BLE_GATT_FORMAT_UINT48 = 0x09, /**< Unsigned 48-bit integer. */
- BLE_GATT_FORMAT_UINT64 = 0x0A, /**< Unsigned 64-bit integer. */
- BLE_GATT_FORMAT_UINT128 = 0x0B, /**< Unsigned 128-bit integer. */
- BLE_GATT_FORMAT_SINT8 = 0x0C, /**< Signed 2-bit integer. */
- BLE_GATT_FORMAT_SINT12 = 0x0D, /**< Signed 12-bit integer. */
- BLE_GATT_FORMAT_SINT16 = 0x0E, /**< Signed 16-bit integer. */
- BLE_GATT_FORMAT_SINT24 = 0x0F, /**< Signed 24-bit integer. */
- BLE_GATT_FORMAT_SINT32 = 0x10, /**< Signed 32-bit integer. */
- BLE_GATT_FORMAT_SINT48 = 0x11, /**< Signed 48-bit integer. */
- BLE_GATT_FORMAT_SINT64 = 0x12, /**< Signed 64-bit integer. */
- BLE_GATT_FORMAT_SINT128 = 0x13, /**< Signed 128-bit integer. */
- BLE_GATT_FORMAT_FLOAT32 = 0x14, /**< IEEE-754 32-bit floating point. */
- BLE_GATT_FORMAT_FLOAT64 = 0x15, /**< IEEE-754 64-bit floating point. */
- BLE_GATT_FORMAT_SFLOAT = 0x16, /**< IEEE-11073 16-bit SFLOAT. */
- BLE_GATT_FORMAT_FLOAT = 0x17, /**< IEEE-11073 32-bit FLOAT. */
- BLE_GATT_FORMAT_DUINT16 = 0x18, /**< IEEE-20601 format. */
- BLE_GATT_FORMAT_UTF8S = 0x19, /**< UTF-8 string. */
- BLE_GATT_FORMAT_UTF16S = 0x1A, /**< UTF-16 string. */
- BLE_GATT_FORMAT_STRUCT = 0x1B /**< Opaque Structure. */
- };
-
- /**************************************************************************/
- /*!
- \brief Standard GATT characteristic properties.
-
- \note See Bluetooth Specification 4.0 (Vol. 3), Part G, Section 3.3.1.1
- and Section 3.3.3.1 for Extended Properties
- */
- /**************************************************************************/
- enum Properties_t {
- BLE_GATT_CHAR_PROPERTIES_NONE = 0x00,
- BLE_GATT_CHAR_PROPERTIES_BROADCAST = 0x01, /**< Permits broadcasts of the characteristic value using the Server Characteristic Configuration descriptor. */
- BLE_GATT_CHAR_PROPERTIES_READ = 0x02, /**< Permits reads of the characteristic value. */
- BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE = 0x04, /**< Permits writes of the characteristic value without response. */
- BLE_GATT_CHAR_PROPERTIES_WRITE = 0x08, /**< Permits writes of the characteristic value with response. */
- BLE_GATT_CHAR_PROPERTIES_NOTIFY = 0x10, /**< Permits notifications of a characteristic value without acknowledgment. */
- BLE_GATT_CHAR_PROPERTIES_INDICATE = 0x20, /**< Permits indications of a characteristic value with acknowledgment. */
- BLE_GATT_CHAR_PROPERTIES_AUTHENTICATED_SIGNED_WRITES = 0x40, /**< Permits signed writes to the characteristic value. */
- BLE_GATT_CHAR_PROPERTIES_EXTENDED_PROPERTIES = 0x80 /**< Additional characteristic properties are defined in the Characteristic Extended Properties descriptor */
- };
-
- /**************************************************************************/
- /*!
- \brief GATT presentation format wrapper
-
- \note See Bluetooth Specification 4.0 (Vol. 3), Part G, Section 3.3.3.5
- \note See https://developer.bluetooth.org/gatt/descriptors/Pages/DescriptorViewer.aspx?u=org.bluetooth.descriptor.gatt.characteristic_presentation_format.xml
- */
- /**************************************************************************/
- struct PresentationFormat_t {
- uint8_t gatt_format; /**< Format of the value; see @ref ble_gatt_format_t. */
- int8_t exponent; /**< Exponent for integer data types. Example: if Exponent = -3 and the char value is 3892, the actual value is 3.892 */
- uint16_t gatt_unit; /**< UUID from Bluetooth Assigned Numbers; see @ref ble_gatt_unit_t. */
- uint8_t gatt_namespace; /**< Namespace from Bluetooth Assigned Numbers, normally '1'; see @ref BLE_GATT_CPF_NAMESPACES. */
- uint16_t gatt_nsdesc; /**< Namespace description from Bluetooth Assigned Numbers, normally '0'; see @ref BLE_GATT_CPF_NAMESPACES. */
- };
-
- /**
- * @brief Creates a new GattCharacteristic using the specified 16-bit
- * UUID, value length, and properties.
- *
- * @note The UUID value must be unique in the service and is normally >1.
- *
- * @param[in] uuid
- * The UUID to use for this characteristic.
- * @param[in] valuePtr
- * The memory holding the initial value. The value is copied
- * into the stack when the enclosing service is added, and
- * is thereafter maintained internally by the stack.
- * @param[in] len
- * The length in bytes of this characteristic's value.
- * @param[in] maxLen
- * The max length in bytes of this characteristic's value.
- * @param[in] hasVariableLen
- * Whether the attribute's value length changes over time.
- * @param[in] props
- * The 8-bit field containing the characteristic's properties.
- * @param[in] descriptors
- * A pointer to an array of descriptors to be included within
- * this characteristic. The memory for the descriptor array is
- * owned by the caller, and should remain valid at least until
- * the enclosing service is added to the GATT table.
- * @param[in] numDescriptors
- * The number of descriptors in the previous array.
- *
- * @NOTE: If valuePtr == NULL, length == 0, and properties == READ
- * for the value attribute of a characteristic, then that particular
- * characteristic may be considered optional and dropped while
- * instantiating the service with the underlying BLE stack.
- */
- GattCharacteristic(const UUID &uuid,
- uint8_t *valuePtr = NULL,
- uint16_t len = 0,
- uint16_t maxLen = 0,
- uint8_t props = BLE_GATT_CHAR_PROPERTIES_NONE,
- GattAttribute *descriptors[] = NULL,
- unsigned numDescriptors = 0,
- bool hasVariableLen = true) :
- _valueAttribute(uuid, valuePtr, len, maxLen, hasVariableLen),
- _properties(props),
- _requiredSecurity(SecurityManager::SECURITY_MODE_ENCRYPTION_OPEN_LINK),
- _descriptors(descriptors),
- _descriptorCount(numDescriptors),
- enabledReadAuthorization(false),
- enabledWriteAuthorization(false),
- readAuthorizationCallback(),
- writeAuthorizationCallback() {
- /* empty */
- }
-
-public:
- /**
- * Set up the minimum security (mode and level) requirements for access to the characteristic's value attribute.
- *
- * @param securityMode Can be one of encryption or signing, with or without protection for man in the middle attacks (MITM).
- */
- void requireSecurity(SecurityManager::SecurityMode_t securityMode) {
- _requiredSecurity = securityMode;
- }
-
-public:
- /**
- * Authorization.
- */
- void setWriteAuthorizationCallback(void (*callback)(GattWriteAuthCallbackParams *)) {
- writeAuthorizationCallback.attach(callback);
- enabledWriteAuthorization = true;
- }
- template <typename T>
- void setWriteAuthorizationCallback(T *object, void (T::*member)(GattWriteAuthCallbackParams *)) {
- writeAuthorizationCallback.attach(object, member);
- enabledWriteAuthorization = true;
- }
- void setReadAuthorizationCallback(void (*callback)(GattReadAuthCallbackParams *)) {
- readAuthorizationCallback.attach(callback);
- enabledReadAuthorization = true;
- }
- template <typename T>
- void setReadAuthorizationCallback(T *object, void (T::*member)(GattReadAuthCallbackParams *)) {
- readAuthorizationCallback.attach(object, member);
- enabledReadAuthorization = true;
- }
-
- /**
- * Helper function meant to be called from the guts of the BLE stack to
- * determine the authorization reply for a write request.
- * @param params To capture the context of the write-auth request. Also contains an out-parameter for reply.
- * @return true if the write is authorized to proceed.
- */
- GattAuthCallbackReply_t authorizeWrite(GattWriteAuthCallbackParams *params) {
- if (!isWriteAuthorizationEnabled()) {
- return AUTH_CALLBACK_REPLY_SUCCESS;
- }
-
- params->authorizationReply = AUTH_CALLBACK_REPLY_SUCCESS; /* Initialized to no-error by default. */
- writeAuthorizationCallback.call(params);
- return params->authorizationReply;
- }
-
- /**
- * Helper function meant to be called from the guts of the BLE stack to
- * determine the authorization reply for a read request.
- * @param params To capture the context of the read-auth request.
- *
- * @NOTE: To authorize or deny the read the params->authorizationReply field
- * should be set to true (authorize) or false (deny).
- *
- * If the read is approved and params->data is unchanged (NULL),
- * the current characteristic value will be used.
- *
- * If the read is approved, a new value can be provided by setting
- * the params->data pointer and params->len fields.
- *
- * @return true if the read is authorized to proceed.
- */
- GattAuthCallbackReply_t authorizeRead(GattReadAuthCallbackParams *params) {
- if (!isReadAuthorizationEnabled()) {
- return AUTH_CALLBACK_REPLY_SUCCESS;
- }
-
- params->authorizationReply = AUTH_CALLBACK_REPLY_SUCCESS; /* Initialized to no-error by default. */
- readAuthorizationCallback.call(params);
- return params->authorizationReply;
- }
-
- /* accessors */
-public:
- GattAttribute& getValueAttribute() {return _valueAttribute; }
- const GattAttribute& getValueAttribute() const {return _valueAttribute; }
- GattAttribute::Handle_t getValueHandle(void) const {return getValueAttribute().getHandle();}
- uint8_t getProperties(void) const {return _properties; }
- SecurityManager::SecurityMode_t getRequiredSecurity() const {return _requiredSecurity; }
- uint8_t getDescriptorCount(void) const {return _descriptorCount; }
- bool isReadAuthorizationEnabled() const {return enabledReadAuthorization; }
- bool isWriteAuthorizationEnabled() const {return enabledWriteAuthorization; }
-
- GattAttribute *getDescriptor(uint8_t index) {
- if (index >= _descriptorCount) {
- return NULL;
- }
-
- return _descriptors[index];
- }
-
-private:
- GattAttribute _valueAttribute;
- uint8_t _properties;
- SecurityManager::SecurityMode_t _requiredSecurity;
- GattAttribute **_descriptors;
- uint8_t _descriptorCount;
-
- bool enabledReadAuthorization;
- bool enabledWriteAuthorization;
- FunctionPointerWithContext<GattReadAuthCallbackParams *> readAuthorizationCallback;
- FunctionPointerWithContext<GattWriteAuthCallbackParams *> writeAuthorizationCallback;
-
-private:
- /* Disallow copy and assignment. */
- GattCharacteristic(const GattCharacteristic &);
- GattCharacteristic& operator=(const GattCharacteristic &);
-};
-
-template <typename T>
-class ReadOnlyGattCharacteristic : public GattCharacteristic {
-public:
- ReadOnlyGattCharacteristic<T>(const UUID &uuid,
- T *valuePtr,
- uint8_t additionalProperties = BLE_GATT_CHAR_PROPERTIES_NONE,
- GattAttribute *descriptors[] = NULL,
- unsigned numDescriptors = 0) :
- GattCharacteristic(uuid, reinterpret_cast<uint8_t *>(valuePtr), sizeof(T), sizeof(T),
- BLE_GATT_CHAR_PROPERTIES_READ | additionalProperties, descriptors, numDescriptors, false) {
- /* empty */
- }
-};
-
-template <typename T>
-class WriteOnlyGattCharacteristic : public GattCharacteristic {
-public:
- WriteOnlyGattCharacteristic<T>(const UUID &uuid,
- T *valuePtr,
- uint8_t additionalProperties = BLE_GATT_CHAR_PROPERTIES_NONE,
- GattAttribute *descriptors[] = NULL,
- unsigned numDescriptors = 0) :
- GattCharacteristic(uuid, reinterpret_cast<uint8_t *>(valuePtr), sizeof(T), sizeof(T),
- BLE_GATT_CHAR_PROPERTIES_WRITE | additionalProperties, descriptors, numDescriptors) {
- /* empty */
- }
-};
-
-template <typename T>
-class ReadWriteGattCharacteristic : public GattCharacteristic {
-public:
- ReadWriteGattCharacteristic<T>(const UUID &uuid,
- T *valuePtr,
- uint8_t additionalProperties = BLE_GATT_CHAR_PROPERTIES_NONE,
- GattAttribute *descriptors[] = NULL,
- unsigned numDescriptors = 0) :
- GattCharacteristic(uuid, reinterpret_cast<uint8_t *>(valuePtr), sizeof(T), sizeof(T),
- BLE_GATT_CHAR_PROPERTIES_READ | BLE_GATT_CHAR_PROPERTIES_WRITE | additionalProperties, descriptors, numDescriptors) {
- /* empty */
- }
-};
-
-template <typename T, unsigned NUM_ELEMENTS>
-class WriteOnlyArrayGattCharacteristic : public GattCharacteristic {
-public:
- WriteOnlyArrayGattCharacteristic<T, NUM_ELEMENTS>(const UUID &uuid,
- T valuePtr[NUM_ELEMENTS],
- uint8_t additionalProperties = BLE_GATT_CHAR_PROPERTIES_NONE,
- GattAttribute *descriptors[] = NULL,
- unsigned numDescriptors = 0) :
- GattCharacteristic(uuid, reinterpret_cast<uint8_t *>(valuePtr), sizeof(T) * NUM_ELEMENTS, sizeof(T) * NUM_ELEMENTS,
- BLE_GATT_CHAR_PROPERTIES_WRITE | additionalProperties, descriptors, numDescriptors) {
- /* empty */
- }
-};
-
-template <typename T, unsigned NUM_ELEMENTS>
-class ReadOnlyArrayGattCharacteristic : public GattCharacteristic {
-public:
- ReadOnlyArrayGattCharacteristic<T, NUM_ELEMENTS>(const UUID &uuid,
- T valuePtr[NUM_ELEMENTS],
- uint8_t additionalProperties = BLE_GATT_CHAR_PROPERTIES_NONE,
- GattAttribute *descriptors[] = NULL,
- unsigned numDescriptors = 0) :
- GattCharacteristic(uuid, reinterpret_cast<uint8_t *>(valuePtr), sizeof(T) * NUM_ELEMENTS, sizeof(T) * NUM_ELEMENTS,
- BLE_GATT_CHAR_PROPERTIES_READ | additionalProperties, descriptors, numDescriptors, false) {
- /* empty */
- }
-};
-
-template <typename T, unsigned NUM_ELEMENTS>
-class ReadWriteArrayGattCharacteristic : public GattCharacteristic {
-public:
- ReadWriteArrayGattCharacteristic<T, NUM_ELEMENTS>(const UUID &uuid,
- T valuePtr[NUM_ELEMENTS],
- uint8_t additionalProperties = BLE_GATT_CHAR_PROPERTIES_NONE,
- GattAttribute *descriptors[] = NULL,
- unsigned numDescriptors = 0) :
- GattCharacteristic(uuid, reinterpret_cast<uint8_t *>(valuePtr), sizeof(T) * NUM_ELEMENTS, sizeof(T) * NUM_ELEMENTS,
- BLE_GATT_CHAR_PROPERTIES_READ | BLE_GATT_CHAR_PROPERTIES_WRITE | additionalProperties, descriptors, numDescriptors) {
- /* empty */
- }
-};
-
+/* mbed Microcontroller Library
+ * Copyright (c) 2006-2013 ARM Limited
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __GATT_CHARACTERISTIC_H__
+#define __GATT_CHARACTERISTIC_H__
+
+#include "Gap.h"
+#include "SecurityManager.h"
+#include "GattAttribute.h"
+#include "GattCallbackParamTypes.h"
+#include "FunctionPointerWithContext.h"
+
+class GattCharacteristic {
+public:
+ enum {
+ UUID_BATTERY_LEVEL_STATE_CHAR = 0x2A1B,
+ UUID_BATTERY_POWER_STATE_CHAR = 0x2A1A,
+ UUID_REMOVABLE_CHAR = 0x2A3A,
+ UUID_SERVICE_REQUIRED_CHAR = 0x2A3B,
+ UUID_ALERT_CATEGORY_ID_CHAR = 0x2A43,
+ UUID_ALERT_CATEGORY_ID_BIT_MASK_CHAR = 0x2A42,
+ UUID_ALERT_LEVEL_CHAR = 0x2A06,
+ UUID_ALERT_NOTIFICATION_CONTROL_POINT_CHAR = 0x2A44,
+ UUID_ALERT_STATUS_CHAR = 0x2A3F,
+ UUID_BATTERY_LEVEL_CHAR = 0x2A19,
+ UUID_BLOOD_PRESSURE_FEATURE_CHAR = 0x2A49,
+ UUID_BLOOD_PRESSURE_MEASUREMENT_CHAR = 0x2A35,
+ UUID_BODY_SENSOR_LOCATION_CHAR = 0x2A38,
+ UUID_BOOT_KEYBOARD_INPUT_REPORT_CHAR = 0x2A22,
+ UUID_BOOT_KEYBOARD_OUTPUT_REPORT_CHAR = 0x2A32,
+ UUID_BOOT_MOUSE_INPUT_REPORT_CHAR = 0x2A33,
+ UUID_CURRENT_TIME_CHAR = 0x2A2B,
+ UUID_DATE_TIME_CHAR = 0x2A08,
+ UUID_DAY_DATE_TIME_CHAR = 0x2A0A,
+ UUID_DAY_OF_WEEK_CHAR = 0x2A09,
+ UUID_DST_OFFSET_CHAR = 0x2A0D,
+ UUID_EXACT_TIME_256_CHAR = 0x2A0C,
+ UUID_FIRMWARE_REVISION_STRING_CHAR = 0x2A26,
+ UUID_GLUCOSE_FEATURE_CHAR = 0x2A51,
+ UUID_GLUCOSE_MEASUREMENT_CHAR = 0x2A18,
+ UUID_GLUCOSE_MEASUREMENT_CONTEXT_CHAR = 0x2A34,
+ UUID_HARDWARE_REVISION_STRING_CHAR = 0x2A27,
+ UUID_HEART_RATE_CONTROL_POINT_CHAR = 0x2A39,
+ UUID_HEART_RATE_MEASUREMENT_CHAR = 0x2A37,
+ UUID_HID_CONTROL_POINT_CHAR = 0x2A4C,
+ UUID_HID_INFORMATION_CHAR = 0x2A4A,
+ UUID_HUMIDITY_CHAR = 0x2A6F,
+ UUID_IEEE_REGULATORY_CERTIFICATION_DATA_LIST_CHAR = 0x2A2A,
+ UUID_INTERMEDIATE_CUFF_PRESSURE_CHAR = 0x2A36,
+ UUID_INTERMEDIATE_TEMPERATURE_CHAR = 0x2A1E,
+ UUID_LOCAL_TIME_INFORMATION_CHAR = 0x2A0F,
+ UUID_MANUFACTURER_NAME_STRING_CHAR = 0x2A29,
+ UUID_MEASUREMENT_INTERVAL_CHAR = 0x2A21,
+ UUID_MODEL_NUMBER_STRING_CHAR = 0x2A24,
+ UUID_UNREAD_ALERT_CHAR = 0x2A45,
+ UUID_NEW_ALERT_CHAR = 0x2A46,
+ UUID_PNP_ID_CHAR = 0x2A50,
+ UUID_PRESSURE_CHAR = 0x2A6D,
+ UUID_PROTOCOL_MODE_CHAR = 0x2A4E,
+ UUID_RECORD_ACCESS_CONTROL_POINT_CHAR = 0x2A52,
+ UUID_REFERENCE_TIME_INFORMATION_CHAR = 0x2A14,
+ UUID_REPORT_CHAR = 0x2A4D,
+ UUID_REPORT_MAP_CHAR = 0x2A4B,
+ UUID_RINGER_CONTROL_POINT_CHAR = 0x2A40,
+ UUID_RINGER_SETTING_CHAR = 0x2A41,
+ UUID_SCAN_INTERVAL_WINDOW_CHAR = 0x2A4F,
+ UUID_SCAN_REFRESH_CHAR = 0x2A31,
+ UUID_SERIAL_NUMBER_STRING_CHAR = 0x2A25,
+ UUID_SOFTWARE_REVISION_STRING_CHAR = 0x2A28,
+ UUID_SUPPORTED_NEW_ALERT_CATEGORY_CHAR = 0x2A47,
+ UUID_SUPPORTED_UNREAD_ALERT_CATEGORY_CHAR = 0x2A48,
+ UUID_SYSTEM_ID_CHAR = 0x2A23,
+ UUID_TEMPERATURE_CHAR = 0x2A6E,
+ UUID_TEMPERATURE_MEASUREMENT_CHAR = 0x2A1C,
+ UUID_TEMPERATURE_TYPE_CHAR = 0x2A1D,
+ UUID_TIME_ACCURACY_CHAR = 0x2A12,
+ UUID_TIME_SOURCE_CHAR = 0x2A13,
+ UUID_TIME_UPDATE_CONTROL_POINT_CHAR = 0x2A16,
+ UUID_TIME_UPDATE_STATE_CHAR = 0x2A17,
+ UUID_TIME_WITH_DST_CHAR = 0x2A11,
+ UUID_TIME_ZONE_CHAR = 0x2A0E,
+ UUID_TX_POWER_LEVEL_CHAR = 0x2A07,
+ UUID_CSC_FEATURE_CHAR = 0x2A5C,
+ UUID_CSC_MEASUREMENT_CHAR = 0x2A5B,
+ UUID_RSC_FEATURE_CHAR = 0x2A54,
+ UUID_RSC_MEASUREMENT_CHAR = 0x2A53
+ };
+
+ /**************************************************************************/
+ /*!
+ \brief Standard GATT characteristic presentation format unit types.
+ These unit types are used to describe what the raw numeric
+ data in a characteristic actually represents.
+
+ \note See https://developer.bluetooth.org/gatt/units/Pages/default.aspx
+ */
+ /**************************************************************************/
+ enum {
+ BLE_GATT_UNIT_NONE = 0x2700, /**< No specified unit type. */
+ BLE_GATT_UNIT_LENGTH_METRE = 0x2701, /**< Length, metre. */
+ BLE_GATT_UNIT_MASS_KILOGRAM = 0x2702, /**< Mass, kilogram. */
+ BLE_GATT_UNIT_TIME_SECOND = 0x2703, /**< Time, second. */
+ BLE_GATT_UNIT_ELECTRIC_CURRENT_AMPERE = 0x2704, /**< Electric current, ampere. */
+ BLE_GATT_UNIT_THERMODYNAMIC_TEMPERATURE_KELVIN = 0x2705, /**< Thermodynamic temperature, kelvin. */
+ BLE_GATT_UNIT_AMOUNT_OF_SUBSTANCE_MOLE = 0x2706, /**< Amount of substance, mole. */
+ BLE_GATT_UNIT_LUMINOUS_INTENSITY_CANDELA = 0x2707, /**< Luminous intensity, candela. */
+ BLE_GATT_UNIT_AREA_SQUARE_METRES = 0x2710, /**< Area, square metres. */
+ BLE_GATT_UNIT_VOLUME_CUBIC_METRES = 0x2711, /**< Volume, cubic metres. */
+ BLE_GATT_UNIT_VELOCITY_METRES_PER_SECOND = 0x2712, /**< Velocity, metres per second. */
+ BLE_GATT_UNIT_ACCELERATION_METRES_PER_SECOND_SQUARED = 0x2713, /**< Acceleration, metres per second squared. */
+ BLE_GATT_UNIT_WAVENUMBER_RECIPROCAL_METRE = 0x2714, /**< Wave number reciprocal, metre. */
+ BLE_GATT_UNIT_DENSITY_KILOGRAM_PER_CUBIC_METRE = 0x2715, /**< Density, kilogram per cubic metre. */
+ BLE_GATT_UNIT_SURFACE_DENSITY_KILOGRAM_PER_SQUARE_METRE = 0x2716, /**< */
+ BLE_GATT_UNIT_SPECIFIC_VOLUME_CUBIC_METRE_PER_KILOGRAM = 0x2717, /**< */
+ BLE_GATT_UNIT_CURRENT_DENSITY_AMPERE_PER_SQUARE_METRE = 0x2718, /**< */
+ BLE_GATT_UNIT_MAGNETIC_FIELD_STRENGTH_AMPERE_PER_METRE = 0x2719, /**< Magnetic field strength, ampere per metre. */
+ BLE_GATT_UNIT_AMOUNT_CONCENTRATION_MOLE_PER_CUBIC_METRE = 0x271A, /**< */
+ BLE_GATT_UNIT_MASS_CONCENTRATION_KILOGRAM_PER_CUBIC_METRE = 0x271B, /**< */
+ BLE_GATT_UNIT_LUMINANCE_CANDELA_PER_SQUARE_METRE = 0x271C, /**< */
+ BLE_GATT_UNIT_REFRACTIVE_INDEX = 0x271D, /**< */
+ BLE_GATT_UNIT_RELATIVE_PERMEABILITY = 0x271E, /**< */
+ BLE_GATT_UNIT_PLANE_ANGLE_RADIAN = 0x2720, /**< */
+ BLE_GATT_UNIT_SOLID_ANGLE_STERADIAN = 0x2721, /**< */
+ BLE_GATT_UNIT_FREQUENCY_HERTZ = 0x2722, /**< Frequency, hertz. */
+ BLE_GATT_UNIT_FORCE_NEWTON = 0x2723, /**< Force, newton. */
+ BLE_GATT_UNIT_PRESSURE_PASCAL = 0x2724, /**< Pressure, pascal. */
+ BLE_GATT_UNIT_ENERGY_JOULE = 0x2725, /**< Energy, joule. */
+ BLE_GATT_UNIT_POWER_WATT = 0x2726, /**< Power, watt. */
+ BLE_GATT_UNIT_ELECTRIC_CHARGE_COULOMB = 0x2727, /**< Electrical charge, coulomb. */
+ BLE_GATT_UNIT_ELECTRIC_POTENTIAL_DIFFERENCE_VOLT = 0x2728, /**< Electrical potential difference, voltage. */
+ BLE_GATT_UNIT_CAPACITANCE_FARAD = 0x2729, /**< */
+ BLE_GATT_UNIT_ELECTRIC_RESISTANCE_OHM = 0x272A, /**< */
+ BLE_GATT_UNIT_ELECTRIC_CONDUCTANCE_SIEMENS = 0x272B, /**< */
+ BLE_GATT_UNIT_MAGNETIC_FLEX_WEBER = 0x272C, /**< */
+ BLE_GATT_UNIT_MAGNETIC_FLEX_DENSITY_TESLA = 0x272D, /**< */
+ BLE_GATT_UNIT_INDUCTANCE_HENRY = 0x272E, /**< */
+ BLE_GATT_UNIT_THERMODYNAMIC_TEMPERATURE_DEGREE_CELSIUS = 0x272F, /**< */
+ BLE_GATT_UNIT_LUMINOUS_FLUX_LUMEN = 0x2730, /**< */
+ BLE_GATT_UNIT_ILLUMINANCE_LUX = 0x2731, /**< */
+ BLE_GATT_UNIT_ACTIVITY_REFERRED_TO_A_RADIONUCLIDE_BECQUEREL = 0x2732, /**< */
+ BLE_GATT_UNIT_ABSORBED_DOSE_GRAY = 0x2733, /**< */
+ BLE_GATT_UNIT_DOSE_EQUIVALENT_SIEVERT = 0x2734, /**< */
+ BLE_GATT_UNIT_CATALYTIC_ACTIVITY_KATAL = 0x2735, /**< */
+ BLE_GATT_UNIT_DYNAMIC_VISCOSITY_PASCAL_SECOND = 0x2740, /**< */
+ BLE_GATT_UNIT_MOMENT_OF_FORCE_NEWTON_METRE = 0x2741, /**< */
+ BLE_GATT_UNIT_SURFACE_TENSION_NEWTON_PER_METRE = 0x2742, /**< */
+ BLE_GATT_UNIT_ANGULAR_VELOCITY_RADIAN_PER_SECOND = 0x2743, /**< */
+ BLE_GATT_UNIT_ANGULAR_ACCELERATION_RADIAN_PER_SECOND_SQUARED = 0x2744, /**< */
+ BLE_GATT_UNIT_HEAT_FLUX_DENSITY_WATT_PER_SQUARE_METRE = 0x2745, /**< */
+ BLE_GATT_UNIT_HEAT_CAPACITY_JOULE_PER_KELVIN = 0x2746, /**< */
+ BLE_GATT_UNIT_SPECIFIC_HEAT_CAPACITY_JOULE_PER_KILOGRAM_KELVIN = 0x2747, /**< */
+ BLE_GATT_UNIT_SPECIFIC_ENERGY_JOULE_PER_KILOGRAM = 0x2748, /**< */
+ BLE_GATT_UNIT_THERMAL_CONDUCTIVITY_WATT_PER_METRE_KELVIN = 0x2749, /**< */
+ BLE_GATT_UNIT_ENERGY_DENSITY_JOULE_PER_CUBIC_METRE = 0x274A, /**< */
+ BLE_GATT_UNIT_ELECTRIC_FIELD_STRENGTH_VOLT_PER_METRE = 0x274B, /**< */
+ BLE_GATT_UNIT_ELECTRIC_CHARGE_DENSITY_COULOMB_PER_CUBIC_METRE = 0x274C, /**< */
+ BLE_GATT_UNIT_SURFACE_CHARGE_DENSITY_COULOMB_PER_SQUARE_METRE = 0x274D, /**< */
+ BLE_GATT_UNIT_ELECTRIC_FLUX_DENSITY_COULOMB_PER_SQUARE_METRE = 0x274E, /**< */
+ BLE_GATT_UNIT_PERMITTIVITY_FARAD_PER_METRE = 0x274F, /**< */
+ BLE_GATT_UNIT_PERMEABILITY_HENRY_PER_METRE = 0x2750, /**< */
+ BLE_GATT_UNIT_MOLAR_ENERGY_JOULE_PER_MOLE = 0x2751, /**< */
+ BLE_GATT_UNIT_MOLAR_ENTROPY_JOULE_PER_MOLE_KELVIN = 0x2752, /**< */
+ BLE_GATT_UNIT_EXPOSURE_COULOMB_PER_KILOGRAM = 0x2753, /**< */
+ BLE_GATT_UNIT_ABSORBED_DOSE_RATE_GRAY_PER_SECOND = 0x2754, /**< */
+ BLE_GATT_UNIT_RADIANT_INTENSITY_WATT_PER_STERADIAN = 0x2755, /**< */
+ BLE_GATT_UNIT_RADIANCE_WATT_PER_SQUARE_METRE_STERADIAN = 0x2756, /**< */
+ BLE_GATT_UNIT_CATALYTIC_ACTIVITY_CONCENTRATION_KATAL_PER_CUBIC_METRE = 0x2757, /**< */
+ BLE_GATT_UNIT_TIME_MINUTE = 0x2760, /**< Time, minute. */
+ BLE_GATT_UNIT_TIME_HOUR = 0x2761, /**< Time, hour. */
+ BLE_GATT_UNIT_TIME_DAY = 0x2762, /**< Time, day. */
+ BLE_GATT_UNIT_PLANE_ANGLE_DEGREE = 0x2763, /**< */
+ BLE_GATT_UNIT_PLANE_ANGLE_MINUTE = 0x2764, /**< */
+ BLE_GATT_UNIT_PLANE_ANGLE_SECOND = 0x2765, /**< */
+ BLE_GATT_UNIT_AREA_HECTARE = 0x2766, /**< */
+ BLE_GATT_UNIT_VOLUME_LITRE = 0x2767, /**< */
+ BLE_GATT_UNIT_MASS_TONNE = 0x2768, /**< */
+ BLE_GATT_UNIT_PRESSURE_BAR = 0x2780, /**< Pressure, bar. */
+ BLE_GATT_UNIT_PRESSURE_MILLIMETRE_OF_MERCURY = 0x2781, /**< Pressure, millimetre of mercury. */
+ BLE_GATT_UNIT_LENGTH_ANGSTROM = 0x2782, /**< */
+ BLE_GATT_UNIT_LENGTH_NAUTICAL_MILE = 0x2783, /**< */
+ BLE_GATT_UNIT_AREA_BARN = 0x2784, /**< */
+ BLE_GATT_UNIT_VELOCITY_KNOT = 0x2785, /**< */
+ BLE_GATT_UNIT_LOGARITHMIC_RADIO_QUANTITY_NEPER = 0x2786, /**< */
+ BLE_GATT_UNIT_LOGARITHMIC_RADIO_QUANTITY_BEL = 0x2787, /**< */
+ BLE_GATT_UNIT_LENGTH_YARD = 0x27A0, /**< Length, yard. */
+ BLE_GATT_UNIT_LENGTH_PARSEC = 0x27A1, /**< Length, parsec. */
+ BLE_GATT_UNIT_LENGTH_INCH = 0x27A2, /**< Length, inch. */
+ BLE_GATT_UNIT_LENGTH_FOOT = 0x27A3, /**< Length, foot. */
+ BLE_GATT_UNIT_LENGTH_MILE = 0x27A4, /**< Length, mile. */
+ BLE_GATT_UNIT_PRESSURE_POUND_FORCE_PER_SQUARE_INCH = 0x27A5, /**< */
+ BLE_GATT_UNIT_VELOCITY_KILOMETRE_PER_HOUR = 0x27A6, /**< Velocity, kilometre per hour. */
+ BLE_GATT_UNIT_VELOCITY_MILE_PER_HOUR = 0x27A7, /**< Velocity, mile per hour. */
+ BLE_GATT_UNIT_ANGULAR_VELOCITY_REVOLUTION_PER_MINUTE = 0x27A8, /**< Angular Velocity, revolution per minute. */
+ BLE_GATT_UNIT_ENERGY_GRAM_CALORIE = 0x27A9, /**< Energy, gram calorie. */
+ BLE_GATT_UNIT_ENERGY_KILOGRAM_CALORIE = 0x27AA, /**< Energy, kilogram calorie. */
+ BLE_GATT_UNIT_ENERGY_KILOWATT_HOUR = 0x27AB, /**< Energy, killowatt hour. */
+ BLE_GATT_UNIT_THERMODYNAMIC_TEMPERATURE_DEGREE_FAHRENHEIT = 0x27AC, /**< */
+ BLE_GATT_UNIT_PERCENTAGE = 0x27AD, /**< Percentage. */
+ BLE_GATT_UNIT_PER_MILLE = 0x27AE, /**< */
+ BLE_GATT_UNIT_PERIOD_BEATS_PER_MINUTE = 0x27AF, /**< */
+ BLE_GATT_UNIT_ELECTRIC_CHARGE_AMPERE_HOURS = 0x27B0, /**< */
+ BLE_GATT_UNIT_MASS_DENSITY_MILLIGRAM_PER_DECILITRE = 0x27B1, /**< */
+ BLE_GATT_UNIT_MASS_DENSITY_MILLIMOLE_PER_LITRE = 0x27B2, /**< */
+ BLE_GATT_UNIT_TIME_YEAR = 0x27B3, /**< Time, year. */
+ BLE_GATT_UNIT_TIME_MONTH = 0x27B4, /**< Time, month. */
+ BLE_GATT_UNIT_CONCENTRATION_COUNT_PER_CUBIC_METRE = 0x27B5, /**< */
+ BLE_GATT_UNIT_IRRADIANCE_WATT_PER_SQUARE_METRE = 0x27B6 /**< */
+ };
+
+ /**************************************************************************/
+ /*!
+ \brief Standard GATT number types.
+
+ \note See Bluetooth Specification 4.0 (Vol. 3), Part G, Section 3.3.3.5.2
+ \note See http://developer.bluetooth.org/gatt/descriptors/Pages/DescriptorViewer.aspx?u=org.bluetooth.descriptor.gatt.characteristic_presentation_format.xml
+ */
+ /**************************************************************************/
+ enum {
+ BLE_GATT_FORMAT_RFU = 0x00, /**< Reserved for future use. */
+ BLE_GATT_FORMAT_BOOLEAN = 0x01, /**< Boolean. */
+ BLE_GATT_FORMAT_2BIT = 0x02, /**< Unsigned 2-bit integer. */
+ BLE_GATT_FORMAT_NIBBLE = 0x03, /**< Unsigned 4-bit integer. */
+ BLE_GATT_FORMAT_UINT8 = 0x04, /**< Unsigned 8-bit integer. */
+ BLE_GATT_FORMAT_UINT12 = 0x05, /**< Unsigned 12-bit integer. */
+ BLE_GATT_FORMAT_UINT16 = 0x06, /**< Unsigned 16-bit integer. */
+ BLE_GATT_FORMAT_UINT24 = 0x07, /**< Unsigned 24-bit integer. */
+ BLE_GATT_FORMAT_UINT32 = 0x08, /**< Unsigned 32-bit integer. */
+ BLE_GATT_FORMAT_UINT48 = 0x09, /**< Unsigned 48-bit integer. */
+ BLE_GATT_FORMAT_UINT64 = 0x0A, /**< Unsigned 64-bit integer. */
+ BLE_GATT_FORMAT_UINT128 = 0x0B, /**< Unsigned 128-bit integer. */
+ BLE_GATT_FORMAT_SINT8 = 0x0C, /**< Signed 2-bit integer. */
+ BLE_GATT_FORMAT_SINT12 = 0x0D, /**< Signed 12-bit integer. */
+ BLE_GATT_FORMAT_SINT16 = 0x0E, /**< Signed 16-bit integer. */
+ BLE_GATT_FORMAT_SINT24 = 0x0F, /**< Signed 24-bit integer. */
+ BLE_GATT_FORMAT_SINT32 = 0x10, /**< Signed 32-bit integer. */
+ BLE_GATT_FORMAT_SINT48 = 0x11, /**< Signed 48-bit integer. */
+ BLE_GATT_FORMAT_SINT64 = 0x12, /**< Signed 64-bit integer. */
+ BLE_GATT_FORMAT_SINT128 = 0x13, /**< Signed 128-bit integer. */
+ BLE_GATT_FORMAT_FLOAT32 = 0x14, /**< IEEE-754 32-bit floating point. */
+ BLE_GATT_FORMAT_FLOAT64 = 0x15, /**< IEEE-754 64-bit floating point. */
+ BLE_GATT_FORMAT_SFLOAT = 0x16, /**< IEEE-11073 16-bit SFLOAT. */
+ BLE_GATT_FORMAT_FLOAT = 0x17, /**< IEEE-11073 32-bit FLOAT. */
+ BLE_GATT_FORMAT_DUINT16 = 0x18, /**< IEEE-20601 format. */
+ BLE_GATT_FORMAT_UTF8S = 0x19, /**< UTF-8 string. */
+ BLE_GATT_FORMAT_UTF16S = 0x1A, /**< UTF-16 string. */
+ BLE_GATT_FORMAT_STRUCT = 0x1B /**< Opaque Structure. */
+ };
+
+ /**************************************************************************/
+ /*!
+ \brief Standard GATT characteristic properties.
+
+ \note See Bluetooth Specification 4.0 (Vol. 3), Part G, Section 3.3.1.1
+ and Section 3.3.3.1 for Extended Properties
+ */
+ /**************************************************************************/
+ enum Properties_t {
+ BLE_GATT_CHAR_PROPERTIES_NONE = 0x00,
+ BLE_GATT_CHAR_PROPERTIES_BROADCAST = 0x01, /**< Permits broadcasts of the characteristic value using the Server Characteristic Configuration descriptor. */
+ BLE_GATT_CHAR_PROPERTIES_READ = 0x02, /**< Permits reads of the characteristic value. */
+ BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE = 0x04, /**< Permits writes of the characteristic value without response. */
+ BLE_GATT_CHAR_PROPERTIES_WRITE = 0x08, /**< Permits writes of the characteristic value with response. */
+ BLE_GATT_CHAR_PROPERTIES_NOTIFY = 0x10, /**< Permits notifications of a characteristic value without acknowledgment. */
+ BLE_GATT_CHAR_PROPERTIES_INDICATE = 0x20, /**< Permits indications of a characteristic value with acknowledgment. */
+ BLE_GATT_CHAR_PROPERTIES_AUTHENTICATED_SIGNED_WRITES = 0x40, /**< Permits signed writes to the characteristic value. */
+ BLE_GATT_CHAR_PROPERTIES_EXTENDED_PROPERTIES = 0x80 /**< Additional characteristic properties are defined in the Characteristic Extended Properties descriptor */
+ };
+
+ /**************************************************************************/
+ /*!
+ \brief GATT presentation format wrapper
+
+ \note See Bluetooth Specification 4.0 (Vol. 3), Part G, Section 3.3.3.5
+ \note See https://developer.bluetooth.org/gatt/descriptors/Pages/DescriptorViewer.aspx?u=org.bluetooth.descriptor.gatt.characteristic_presentation_format.xml
+ */
+ /**************************************************************************/
+ struct PresentationFormat_t {
+ uint8_t gatt_format; /**< Format of the value; see @ref ble_gatt_format_t. */
+ int8_t exponent; /**< Exponent for integer data types. Example: if Exponent = -3 and the char value is 3892, the actual value is 3.892 */
+ uint16_t gatt_unit; /**< UUID from Bluetooth Assigned Numbers; see @ref ble_gatt_unit_t. */
+ uint8_t gatt_namespace; /**< Namespace from Bluetooth Assigned Numbers, normally '1'; see @ref BLE_GATT_CPF_NAMESPACES. */
+ uint16_t gatt_nsdesc; /**< Namespace description from Bluetooth Assigned Numbers, normally '0'; see @ref BLE_GATT_CPF_NAMESPACES. */
+ };
+
+ /**
+ * @brief Creates a new GattCharacteristic using the specified 16-bit
+ * UUID, value length, and properties.
+ *
+ * @note The UUID value must be unique in the service and is normally >1.
+ *
+ * @param[in] uuid
+ * The UUID to use for this characteristic.
+ * @param[in] valuePtr
+ * The memory holding the initial value. The value is copied
+ * into the stack when the enclosing service is added, and
+ * is thereafter maintained internally by the stack.
+ * @param[in] len
+ * The length in bytes of this characteristic's value.
+ * @param[in] maxLen
+ * The max length in bytes of this characteristic's value.
+ * @param[in] props
+ * The 8-bit field containing the characteristic's properties.
+ * @param[in] descriptors
+ * A pointer to an array of descriptors to be included within
+ * this characteristic. The memory for the descriptor array is
+ * owned by the caller, and should remain valid at least until
+ * the enclosing service is added to the GATT table.
+ * @param[in] numDescriptors
+ * The number of descriptors in the previous array.
+ *
+ * @NOTE: If valuePtr == NULL, length == 0, and properties == READ
+ * for the value attribute of a characteristic, then that particular
+ * characteristic may be considered optional and dropped while
+ * instantiating the service with the underlying BLE stack.
+ */
+ GattCharacteristic(const UUID &uuid,
+ uint8_t *valuePtr = NULL,
+ uint16_t len = 0,
+ uint16_t maxLen = 0,
+ uint8_t props = BLE_GATT_CHAR_PROPERTIES_NONE,
+ GattAttribute *descriptors[] = NULL,
+ unsigned numDescriptors = 0) :
+ _valueAttribute(uuid, valuePtr, len, maxLen),
+ _properties(props),
+ _requiredSecurity(SecurityManager::SECURITY_MODE_ENCRYPTION_OPEN_LINK),
+ _descriptors(descriptors),
+ _descriptorCount(numDescriptors),
+ enabledReadAuthorization(false),
+ enabledWriteAuthorization(false),
+ readAuthorizationCallback(),
+ writeAuthorizationCallback() {
+ /* empty */
+ }
+
+public:
+ /**
+ * Set up the minimum security (mode and level) requirements for access to the characteristic's value attribute.
+ *
+ * @param securityMode Can be one of encryption or signing, with or without protection for man in the middle attacks (MITM).
+ */
+ void requireSecurity(SecurityManager::SecurityMode_t securityMode) {
+ _requiredSecurity = securityMode;
+ }
+
+public:
+ /**
+ * Authorization.
+ */
+ void setWriteAuthorizationCallback(void (*callback)(GattWriteAuthCallbackParams *)) {
+ writeAuthorizationCallback.attach(callback);
+ enabledWriteAuthorization = true;
+ }
+ template <typename T>
+ void setWriteAuthorizationCallback(T *object, void (T::*member)(GattWriteAuthCallbackParams *)) {
+ writeAuthorizationCallback.attach(object, member);
+ enabledWriteAuthorization = true;
+ }
+ void setReadAuthorizationCallback(void (*callback)(GattReadAuthCallbackParams *)) {
+ readAuthorizationCallback.attach(callback);
+ enabledReadAuthorization = true;
+ }
+ template <typename T>
+ void setReadAuthorizationCallback(T *object, void (T::*member)(GattReadAuthCallbackParams *)) {
+ readAuthorizationCallback.attach(object, member);
+ enabledReadAuthorization = true;
+ }
+
+ /**
+ * Helper function meant to be called from the guts of the BLE stack to
+ * determine the authorization reply for a write request.
+ * @param params To capture the context of the write-auth request. Also contains an out-parameter for reply.
+ * @return true if the write is authorized to proceed.
+ */
+ GattAuthCallbackReply_t authorizeWrite(GattWriteAuthCallbackParams *params) {
+ if (!isWriteAuthorizationEnabled()) {
+ return AUTH_CALLBACK_REPLY_SUCCESS;
+ }
+
+ params->authorizationReply = AUTH_CALLBACK_REPLY_SUCCESS; /* Initialized to no-error by default. */
+ writeAuthorizationCallback.call(params);
+ return params->authorizationReply;
+ }
+
+ /**
+ * Helper function meant to be called from the guts of the BLE stack to
+ * determine the authorization reply for a read request.
+ * @param params To capture the context of the read-auth request.
+ *
+ * @NOTE: To authorize or deny the read the params->authorizationReply field
+ * should be set to true (authorize) or false (deny).
+ *
+ * If the read is approved and params->data is unchanged (NULL),
+ * the current characteristic value will be used.
+ *
+ * If the read is approved, a new value can be provided by setting
+ * the params->data pointer and params->len fields.
+ *
+ * @return true if the read is authorized to proceed.
+ */
+ GattAuthCallbackReply_t authorizeRead(GattReadAuthCallbackParams *params) {
+ if (!isReadAuthorizationEnabled()) {
+ return AUTH_CALLBACK_REPLY_SUCCESS;
+ }
+
+ params->authorizationReply = AUTH_CALLBACK_REPLY_SUCCESS; /* Initialized to no-error by default. */
+ readAuthorizationCallback.call(params);
+ return params->authorizationReply;
+ }
+
+ /* accessors */
+public:
+ GattAttribute& getValueAttribute() {return _valueAttribute; }
+ const GattAttribute& getValueAttribute() const {return _valueAttribute; }
+ GattAttribute::Handle_t getValueHandle(void) const {return getValueAttribute().getHandle();}
+ uint8_t getProperties(void) const {return _properties; }
+ SecurityManager::SecurityMode_t getRequiredSecurity() const {return _requiredSecurity; }
+ uint8_t getDescriptorCount(void) const {return _descriptorCount; }
+ bool isReadAuthorizationEnabled() const {return enabledReadAuthorization; }
+ bool isWriteAuthorizationEnabled() const {return enabledWriteAuthorization; }
+
+ GattAttribute *getDescriptor(uint8_t index) {
+ if (index >= _descriptorCount) {
+ return NULL;
+ }
+
+ return _descriptors[index];
+ }
+
+private:
+ GattAttribute _valueAttribute;
+ uint8_t _properties;
+ SecurityManager::SecurityMode_t _requiredSecurity;
+ GattAttribute **_descriptors;
+ uint8_t _descriptorCount;
+
+ bool enabledReadAuthorization;
+ bool enabledWriteAuthorization;
+ FunctionPointerWithContext<GattReadAuthCallbackParams *> readAuthorizationCallback;
+ FunctionPointerWithContext<GattWriteAuthCallbackParams *> writeAuthorizationCallback;
+
+private:
+ /* Disallow copy and assignment. */
+ GattCharacteristic(const GattCharacteristic &);
+ GattCharacteristic& operator=(const GattCharacteristic &);
+};
+
+template <typename T>
+class ReadOnlyGattCharacteristic : public GattCharacteristic {
+public:
+ ReadOnlyGattCharacteristic<T>(const UUID &uuid,
+ T *valuePtr,
+ uint8_t additionalProperties = BLE_GATT_CHAR_PROPERTIES_NONE,
+ GattAttribute *descriptors[] = NULL,
+ unsigned numDescriptors = 0) :
+ GattCharacteristic(uuid, reinterpret_cast<uint8_t *>(valuePtr), sizeof(T), sizeof(T),
+ BLE_GATT_CHAR_PROPERTIES_READ | additionalProperties, descriptors, numDescriptors) {
+ /* empty */
+ }
+};
+
+template <typename T>
+class WriteOnlyGattCharacteristic : public GattCharacteristic {
+public:
+ WriteOnlyGattCharacteristic<T>(const UUID &uuid,
+ T *valuePtr,
+ uint8_t additionalProperties = BLE_GATT_CHAR_PROPERTIES_NONE,
+ GattAttribute *descriptors[] = NULL,
+ unsigned numDescriptors = 0) :
+ GattCharacteristic(uuid, reinterpret_cast<uint8_t *>(valuePtr), sizeof(T), sizeof(T),
+ BLE_GATT_CHAR_PROPERTIES_WRITE | additionalProperties, descriptors, numDescriptors) {
+ /* empty */
+ }
+};
+
+template <typename T>
+class ReadWriteGattCharacteristic : public GattCharacteristic {
+public:
+ ReadWriteGattCharacteristic<T>(const UUID &uuid,
+ T *valuePtr,
+ uint8_t additionalProperties = BLE_GATT_CHAR_PROPERTIES_NONE,
+ GattAttribute *descriptors[] = NULL,
+ unsigned numDescriptors = 0) :
+ GattCharacteristic(uuid, reinterpret_cast<uint8_t *>(valuePtr), sizeof(T), sizeof(T),
+ BLE_GATT_CHAR_PROPERTIES_READ | BLE_GATT_CHAR_PROPERTIES_WRITE | additionalProperties, descriptors, numDescriptors) {
+ /* empty */
+ }
+};
+
+template <typename T, unsigned NUM_ELEMENTS>
+class WriteOnlyArrayGattCharacteristic : public GattCharacteristic {
+public:
+ WriteOnlyArrayGattCharacteristic<T, NUM_ELEMENTS>(const UUID &uuid,
+ T valuePtr[NUM_ELEMENTS],
+ uint8_t additionalProperties = BLE_GATT_CHAR_PROPERTIES_NONE,
+ GattAttribute *descriptors[] = NULL,
+ unsigned numDescriptors = 0) :
+ GattCharacteristic(uuid, reinterpret_cast<uint8_t *>(valuePtr), sizeof(T) * NUM_ELEMENTS, sizeof(T) * NUM_ELEMENTS,
+ BLE_GATT_CHAR_PROPERTIES_WRITE | additionalProperties, descriptors, numDescriptors) {
+ /* empty */
+ }
+};
+
+template <typename T, unsigned NUM_ELEMENTS>
+class ReadOnlyArrayGattCharacteristic : public GattCharacteristic {
+public:
+ ReadOnlyArrayGattCharacteristic<T, NUM_ELEMENTS>(const UUID &uuid,
+ T valuePtr[NUM_ELEMENTS],
+ uint8_t additionalProperties = BLE_GATT_CHAR_PROPERTIES_NONE,
+ GattAttribute *descriptors[] = NULL,
+ unsigned numDescriptors = 0) :
+ GattCharacteristic(uuid, reinterpret_cast<uint8_t *>(valuePtr), sizeof(T) * NUM_ELEMENTS, sizeof(T) * NUM_ELEMENTS,
+ BLE_GATT_CHAR_PROPERTIES_READ | additionalProperties, descriptors, numDescriptors) {
+ /* empty */
+ }
+};
+
+template <typename T, unsigned NUM_ELEMENTS>
+class ReadWriteArrayGattCharacteristic : public GattCharacteristic {
+public:
+ ReadWriteArrayGattCharacteristic<T, NUM_ELEMENTS>(const UUID &uuid,
+ T valuePtr[NUM_ELEMENTS],
+ uint8_t additionalProperties = BLE_GATT_CHAR_PROPERTIES_NONE,
+ GattAttribute *descriptors[] = NULL,
+ unsigned numDescriptors = 0) :
+ GattCharacteristic(uuid, reinterpret_cast<uint8_t *>(valuePtr), sizeof(T) * NUM_ELEMENTS, sizeof(T) * NUM_ELEMENTS,
+ BLE_GATT_CHAR_PROPERTIES_READ | BLE_GATT_CHAR_PROPERTIES_WRITE | additionalProperties, descriptors, numDescriptors) {
+ /* empty */
+ }
+};
+
#endif // ifndef __GATT_CHARACTERISTIC_H__
\ No newline at end of file
--- a/ble/GattClient.h Tue Jan 12 19:47:52 2016 +0000
+++ b/ble/GattClient.h Wed Apr 06 19:13:46 2016 +0100
@@ -1,475 +1,360 @@
-/* mbed Microcontroller Library
- * Copyright (c) 2006-2013 ARM Limited
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __GATT_CLIENT_H__
-#define __GATT_CLIENT_H__
-
-#include "Gap.h"
-#include "GattAttribute.h"
-#include "ServiceDiscovery.h"
-#include "CharacteristicDescriptorDiscovery.h"
-
-#include "GattCallbackParamTypes.h"
-
-#include "CallChainOfFunctionPointersWithContext.h"
-
-class GattClient {
-public:
- typedef FunctionPointerWithContext<const GattReadCallbackParams*> ReadCallback_t;
- typedef CallChainOfFunctionPointersWithContext<const GattReadCallbackParams*> ReadCallbackChain_t;
-
- enum WriteOp_t {
- GATT_OP_WRITE_REQ = 0x01, /**< Write request. */
- GATT_OP_WRITE_CMD = 0x02, /**< Write command. */
- };
-
- typedef FunctionPointerWithContext<const GattWriteCallbackParams*> WriteCallback_t;
- typedef CallChainOfFunctionPointersWithContext<const GattWriteCallbackParams*> WriteCallbackChain_t;
-
- typedef FunctionPointerWithContext<const GattHVXCallbackParams*> HVXCallback_t;
- typedef CallChainOfFunctionPointersWithContext<const GattHVXCallbackParams*> HVXCallbackChain_t;
-
- typedef FunctionPointerWithContext<const GattClient *> GattClientShutdownCallback_t;
- typedef CallChainOfFunctionPointersWithContext<const GattClient *> GattClientShutdownCallbackChain_t;
-
- /*
- * The following functions are meant to be overridden in the platform-specific sub-class.
- */
-public:
- /**
- * Launch service discovery. Once launched, application callbacks will be
- * invoked for matching services or characteristics. isServiceDiscoveryActive()
- * can be used to determine status, and a termination callback (if one was set up)
- * will be invoked at the end. Service discovery can be terminated prematurely,
- * if needed, using terminateServiceDiscovery().
- *
- * @param connectionHandle
- * Handle for the connection with the peer.
- * @param sc
- * This is the application callback for a matching service. Taken as
- * NULL by default. Note: service discovery may still be active
- * when this callback is issued; calling asynchronous BLE-stack
- * APIs from within this application callback might cause the
- * stack to abort service discovery. If this becomes an issue, it
- * may be better to make a local copy of the discoveredService and
- * wait for service discovery to terminate before operating on the
- * service.
- * @param cc
- * This is the application callback for a matching characteristic.
- * Taken as NULL by default. Note: service discovery may still be
- * active when this callback is issued; calling asynchronous
- * BLE-stack APIs from within this application callback might cause
- * the stack to abort service discovery. If this becomes an issue,
- * it may be better to make a local copy of the discoveredCharacteristic
- * and wait for service discovery to terminate before operating on the
- * characteristic.
- * @param matchingServiceUUID
- * UUID-based filter for specifying a service in which the application is
- * interested. By default it is set as the wildcard UUID_UNKNOWN,
- * in which case it matches all services. If characteristic-UUID
- * filter (below) is set to the wildcard value, then a service
- * callback will be invoked for the matching service (or for every
- * service if the service filter is a wildcard).
- * @param matchingCharacteristicUUIDIn
- * UUID-based filter for specifying characteristic in which the application
- * is interested. By default it is set as the wildcard UUID_UKNOWN
- * to match against any characteristic. If both service-UUID
- * filter and characteristic-UUID filter are used with non-wildcard
- * values, then only a single characteristic callback is
- * invoked for the matching characteristic.
- *
- * @note Using wildcard values for both service-UUID and characteristic-
- * UUID will result in complete service discovery: callbacks being
- * called for every service and characteristic.
- *
- * @note Providing NULL for the characteristic callback will result in
- * characteristic discovery being skipped for each matching
- * service. This allows for an inexpensive method to discover only
- * services.
- *
- * @return
- * BLE_ERROR_NONE if service discovery is launched successfully; else an appropriate error.
- */
- virtual ble_error_t launchServiceDiscovery(Gap::Handle_t connectionHandle,
- ServiceDiscovery::ServiceCallback_t sc = NULL,
- ServiceDiscovery::CharacteristicCallback_t cc = NULL,
- const UUID &matchingServiceUUID = UUID::ShortUUIDBytes_t(BLE_UUID_UNKNOWN),
- const UUID &matchingCharacteristicUUIDIn = UUID::ShortUUIDBytes_t(BLE_UUID_UNKNOWN)) {
- /* Avoid compiler warnings about unused variables. */
- (void)connectionHandle;
- (void)sc;
- (void)cc;
- (void)matchingServiceUUID;
- (void)matchingCharacteristicUUIDIn;
-
- return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porters: override this API if this capability is supported. */
- }
-
- /**
- * Launch service discovery for services. Once launched, service discovery will remain
- * active with service-callbacks being issued back into the application for matching
- * services. isServiceDiscoveryActive() can be used to
- * determine status, and a termination callback (if set up) will be invoked
- * at the end. Service discovery can be terminated prematurely, if needed,
- * using terminateServiceDiscovery().
- *
- * @param connectionHandle
- * Handle for the connection with the peer.
- * @param sc
- * This is the application callback for a matching service. Note: service discovery may still be active
- * when this callback is issued; calling asynchronous BLE-stack
- * APIs from within this application callback might cause the
- * stack to abort service discovery. If this becomes an issue, it
- * may be better to make a local copy of the discoveredService and
- * wait for service discovery to terminate before operating on the
- * service.
- * @param matchingServiceUUID
- * UUID-based filter for specifying a service in which the application is
- * interested. By default it is set as the wildcard UUID_UNKNOWN,
- * in which case it matches all services.
- *
- * @return
- * BLE_ERROR_NONE if service discovery is launched successfully; else an appropriate error.
- */
- virtual ble_error_t discoverServices(Gap::Handle_t connectionHandle,
- ServiceDiscovery::ServiceCallback_t callback,
- const UUID &matchingServiceUUID = UUID::ShortUUIDBytes_t(BLE_UUID_UNKNOWN)) {
- return launchServiceDiscovery(connectionHandle, callback, NULL, matchingServiceUUID); /* We take advantage of the property
- * that providing NULL for the characteristic callback will result in
- * characteristic discovery being skipped for each matching
- * service. This allows for an inexpensive method to discover only
- * services. Porters are free to override this. */
- }
-
- /**
- * Launch service discovery for services. Once launched, service discovery will remain
- * active with service-callbacks being issued back into the application for matching
- * services. isServiceDiscoveryActive() can be used to
- * determine status, and a termination callback (if set up) will be invoked
- * at the end. Service discovery can be terminated prematurely, if needed,
- * using terminateServiceDiscovery().
- *
- * @param connectionHandle
- * Handle for the connection with the peer.
- * @param sc
- * This is the application callback for a matching service. Note: service discovery may still be active
- * when this callback is issued; calling asynchronous BLE-stack
- * APIs from within this application callback might cause the
- * stack to abort service discovery. If this becomes an issue, it
- * may be better to make a local copy of the discoveredService and
- * wait for service discovery to terminate before operating on the
- * service.
- * @param startHandle, endHandle
- * Handle range within which to limit the search.
- *
- * @return
- * BLE_ERROR_NONE if service discovery is launched successfully; else an appropriate error.
- */
- virtual ble_error_t discoverServices(Gap::Handle_t connectionHandle,
- ServiceDiscovery::ServiceCallback_t callback,
- GattAttribute::Handle_t startHandle,
- GattAttribute::Handle_t endHandle) {
- /* Avoid compiler warnings about unused variables. */
- (void)connectionHandle;
- (void)callback;
- (void)startHandle;
- (void)endHandle;
-
- return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porters: override this API if this capability is supported. */
- }
-
- /**
- * Is service-discovery currently active?
- */
- virtual bool isServiceDiscoveryActive(void) const {
- return false; /* Requesting action from porters: override this API if this capability is supported. */
- }
-
- /**
- * Terminate an ongoing service discovery. This should result in an
- * invocation of TerminationCallback if service-discovery is active.
- */
- virtual void terminateServiceDiscovery(void) {
- /* Requesting action from porters: override this API if this capability is supported. */
- }
-
- /* Initiate a GATT Client read procedure by attribute-handle. */
- virtual ble_error_t read(Gap::Handle_t connHandle, GattAttribute::Handle_t attributeHandle, uint16_t offset) const {
- /* Avoid compiler warnings about unused variables. */
- (void)connHandle;
- (void)attributeHandle;
- (void)offset;
-
- return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porters: override this API if this capability is supported. */
- }
-
- /**
- * Initiate a GATT Client write procedure.
- *
- * @param[in] cmd
- * Command can be either a write-request (which generates a
- * matching response from the peripheral), or a write-command
- * (which doesn't require the connected peer to respond).
- * @param[in] connHandle
- * Connection handle.
- * @param[in] attributeHandle
- * Handle for the target attribtue on the remote GATT server.
- * @param[in] length
- * Length of the new value.
- * @param[in] value
- * New value being written.
- */
- virtual ble_error_t write(GattClient::WriteOp_t cmd,
- Gap::Handle_t connHandle,
- GattAttribute::Handle_t attributeHandle,
- size_t length,
- const uint8_t *value) const {
- /* Avoid compiler warnings about unused variables. */
- (void)cmd;
- (void)connHandle;
- (void)attributeHandle;
- (void)length;
- (void)value;
-
- return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porters: override this API if this capability is supported. */
- }
-
- /* Event callback handlers. */
-public:
- /**
- * Set up a callback for read response events.
- * It is possible to remove registered callbacks using
- * onDataRead().detach(callbackToRemove)
- */
- void onDataRead(ReadCallback_t callback) {
- onDataReadCallbackChain.add(callback);
- }
-
- /**
- * @brief provide access to the callchain of read callbacks
- * It is possible to register callbacks using onDataRead().add(callback);
- * It is possible to unregister callbacks using onDataRead().detach(callback)
- * @return The read callbacks chain
- */
- ReadCallbackChain_t& onDataRead() {
- return onDataReadCallbackChain;
- }
-
- /**
- * Set up a callback for write response events.
- * It is possible to remove registered callbacks using
- * onDataWritten().detach(callbackToRemove).
- * @Note: Write commands (issued using writeWoResponse) don't generate a response.
- */
- void onDataWritten(WriteCallback_t callback) {
- onDataWriteCallbackChain.add(callback);
- }
-
- /**
- * @brief provide access to the callchain of data written callbacks
- * It is possible to register callbacks using onDataWritten().add(callback);
- * It is possible to unregister callbacks using onDataWritten().detach(callback)
- * @return The data written callbacks chain
- */
- WriteCallbackChain_t& onDataWritten() {
- return onDataWriteCallbackChain;
- }
-
- /**
- * Set up a callback for write response events.
- * @Note: Write commands (issued using writeWoResponse) don't generate a response.
- *
- * @note: This API is now *deprecated* and will be dropped in the future.
- * Please use onDataWritten() instead.
- */
- void onDataWrite(WriteCallback_t callback) {
- onDataWritten(callback);
- }
-
- /**
- * Set up a callback for when serviceDiscovery terminates.
- */
- virtual void onServiceDiscoveryTermination(ServiceDiscovery::TerminationCallback_t callback) {
- (void)callback; /* Avoid compiler warnings about ununsed variables. */
-
- /* Requesting action from porters: override this API if this capability is supported. */
- }
-
- /**
- * @brief launch discovery of descriptors for a given characteristic
- * @details This function will discover all descriptors available for a
- * specific characteristic.
- *
- * @param characteristic[in] The characteristic targeted by this discovery
- * procedure
- * @param discoveryCallback[in] User function called each time a descriptor
- * is found during the procedure.
- * @param terminationCallback[in] User provided function which will be called
- * once the discovery procedure is terminating. This will get called when all
- * the descriptors have been discovered or if an error occur during the discovery
- * procedure.
- *
- * @return
- * BLE_ERROR_NONE if characteristic descriptor discovery is launched
- * successfully; else an appropriate error.
- */
- virtual ble_error_t discoverCharacteristicDescriptors(
- const DiscoveredCharacteristic& characteristic,
- const CharacteristicDescriptorDiscovery::DiscoveryCallback_t& discoveryCallback,
- const CharacteristicDescriptorDiscovery::TerminationCallback_t& terminationCallback) {
- (void) characteristic;
- (void) discoveryCallback;
- (void) terminationCallback;
- /* Requesting action from porter(s): override this API if this capability is supported. */
- return BLE_ERROR_NOT_IMPLEMENTED;
- }
-
- /**
- * @brief Indicate if the discovery of characteristic descriptors is active for a given characteristic
- * or not.
- * @param characteristic[in] The characteristic concerned by the descriptors discovery.
- * @return true if a descriptors discovery is active for the characteristic in input; otherwise false.
- */
- virtual bool isCharacteristicDescriptorDiscoveryActive(const DiscoveredCharacteristic& characteristic) const
- {
- (void) characteristic;
- return false; /* Requesting action from porter(s): override this API if this capability is supported. */
- }
-
- /**
- * @brief Terminate an ongoing characteristic descriptor discovery.
- * @detail This should result in an invocation of the TerminationCallback if
- * the characteristic descriptor discovery is active.
- * @param characteristic[in] The characteristic on which the running descriptors
- * discovery should be stopped.
- */
- virtual void terminateCharacteristicDescriptorDiscovery(const DiscoveredCharacteristic& characteristic) {
- /* Requesting action from porter(s): override this API if this capability is supported. */
- (void) characteristic;
- }
-
- /**
- * Set up a callback for when the GATT client receives an update event
- * corresponding to a change in the value of a characteristic on the remote
- * GATT server.
- * It is possible to remove registered callbacks using onHVX().detach(callbackToRemove).
- */
- void onHVX(HVXCallback_t callback) {
- onHVXCallbackChain.add(callback);
- }
-
- /**
- * Setup a callback to be invoked to notify the user application that the
- * GattClient instance is about to shutdown (possibly as a result of a call
- * to BLE::shutdown()).
- *
- * @Note: It is possible to chain together multiple onShutdown callbacks
- * (potentially from different modules of an application) to be notified
- * before the GattClient is shutdown.
- *
- * @Note: It is also possible to set up a callback into a member function of
- * some object.
- *
- * @Note It is possible to unregister a callback using onShutdown().detach(callback)
- */
- void onShutdown(const GattClientShutdownCallback_t& callback) {
- shutdownCallChain.add(callback);
- }
- template <typename T>
- void onShutdown(T *objPtr, void (T::*memberPtr)(void)) {
- shutdownCallChain.add(objPtr, memberPtr);
- }
-
- /**
- * @brief provide access to the callchain of shutdown event callbacks
- * It is possible to register callbacks using onShutdown().add(callback);
- * It is possible to unregister callbacks using onShutdown().detach(callback)
- * @return The shutdown event callbacks chain
- */
- GattClientShutdownCallbackChain_t& onShutdown() {
- return shutdownCallChain;
- }
-
- /**
- * @brief provide access to the callchain of HVX callbacks
- * It is possible to register callbacks using onHVX().add(callback);
- * It is possible to unregister callbacks using onHVX().detach(callback)
- * @return The HVX callbacks chain
- */
- HVXCallbackChain_t& onHVX() {
- return onHVXCallbackChain;
- }
-
-public:
- /**
- * Notify all registered onShutdown callbacks that the GattClient is
- * about to be shutdown and clear all GattClient state of the
- * associated object.
- *
- * This function is meant to be overridden in the platform-specific
- * sub-class. Nevertheless, the sub-class is only expected to reset its
- * state and not the data held in GattClient members. This shall be achieved
- * by a call to GattClient::reset() from the sub-class' reset()
- * implementation.
- *
- * @return BLE_ERROR_NONE on success.
- */
- virtual ble_error_t reset(void) {
- /* Notify that the instance is about to shutdown */
- shutdownCallChain.call(this);
- shutdownCallChain.clear();
-
- onDataReadCallbackChain.clear();
- onDataWriteCallbackChain.clear();
- onHVXCallbackChain.clear();
-
- return BLE_ERROR_NONE;
- }
-
-protected:
- GattClient() {
- /* Empty */
- }
-
- /* Entry points for the underlying stack to report events back to the user. */
-public:
- void processReadResponse(const GattReadCallbackParams *params) {
- onDataReadCallbackChain(params);
- }
-
- void processWriteResponse(const GattWriteCallbackParams *params) {
- onDataWriteCallbackChain(params);
- }
-
- void processHVXEvent(const GattHVXCallbackParams *params) {
- if (onHVXCallbackChain) {
- onHVXCallbackChain(params);
- }
- }
-
-protected:
- ReadCallbackChain_t onDataReadCallbackChain;
- WriteCallbackChain_t onDataWriteCallbackChain;
- HVXCallbackChain_t onHVXCallbackChain;
- GattClientShutdownCallbackChain_t shutdownCallChain;
-
-private:
- /* Disallow copy and assignment. */
- GattClient(const GattClient &);
- GattClient& operator=(const GattClient &);
-};
-
+/* mbed Microcontroller Library
+ * Copyright (c) 2006-2013 ARM Limited
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __GATT_CLIENT_H__
+#define __GATT_CLIENT_H__
+
+#include "Gap.h"
+#include "GattAttribute.h"
+#include "ServiceDiscovery.h"
+
+#include "GattCallbackParamTypes.h"
+
+#include "CallChainOfFunctionPointersWithContext.h"
+
+class GattClient {
+public:
+ typedef FunctionPointerWithContext<const GattReadCallbackParams*> ReadCallback_t;
+ typedef CallChainOfFunctionPointersWithContext<const GattReadCallbackParams*> ReadCallbackChain_t;
+
+ enum WriteOp_t {
+ GATT_OP_WRITE_REQ = 0x01, /**< Write request. */
+ GATT_OP_WRITE_CMD = 0x02, /**< Write command. */
+ };
+
+ typedef FunctionPointerWithContext<const GattWriteCallbackParams*> WriteCallback_t;
+ typedef CallChainOfFunctionPointersWithContext<const GattWriteCallbackParams*> WriteCallbackChain_t;
+
+ typedef FunctionPointerWithContext<const GattHVXCallbackParams*> HVXCallback_t;
+ typedef CallChainOfFunctionPointersWithContext<const GattHVXCallbackParams*> HVXCallbackChain_t;
+
+ /*
+ * The following functions are meant to be overridden in the platform-specific sub-class.
+ */
+public:
+ /**
+ * Launch service discovery. Once launched, application callbacks will be
+ * invoked for matching services or characteristics. isServiceDiscoveryActive()
+ * can be used to determine status, and a termination callback (if one was set up)
+ * will be invoked at the end. Service discovery can be terminated prematurely,
+ * if needed, using terminateServiceDiscovery().
+ *
+ * @param connectionHandle
+ * Handle for the connection with the peer.
+ * @param sc
+ * This is the application callback for a matching service. Taken as
+ * NULL by default. Note: service discovery may still be active
+ * when this callback is issued; calling asynchronous BLE-stack
+ * APIs from within this application callback might cause the
+ * stack to abort service discovery. If this becomes an issue, it
+ * may be better to make a local copy of the discoveredService and
+ * wait for service discovery to terminate before operating on the
+ * service.
+ * @param cc
+ * This is the application callback for a matching characteristic.
+ * Taken as NULL by default. Note: service discovery may still be
+ * active when this callback is issued; calling asynchronous
+ * BLE-stack APIs from within this application callback might cause
+ * the stack to abort service discovery. If this becomes an issue,
+ * it may be better to make a local copy of the discoveredCharacteristic
+ * and wait for service discovery to terminate before operating on the
+ * characteristic.
+ * @param matchingServiceUUID
+ * UUID-based filter for specifying a service in which the application is
+ * interested. By default it is set as the wildcard UUID_UNKNOWN,
+ * in which case it matches all services. If characteristic-UUID
+ * filter (below) is set to the wildcard value, then a service
+ * callback will be invoked for the matching service (or for every
+ * service if the service filter is a wildcard).
+ * @param matchingCharacteristicUUIDIn
+ * UUID-based filter for specifying characteristic in which the application
+ * is interested. By default it is set as the wildcard UUID_UKNOWN
+ * to match against any characteristic. If both service-UUID
+ * filter and characteristic-UUID filter are used with non-wildcard
+ * values, then only a single characteristic callback is
+ * invoked for the matching characteristic.
+ *
+ * @note Using wildcard values for both service-UUID and characteristic-
+ * UUID will result in complete service discovery: callbacks being
+ * called for every service and characteristic.
+ *
+ * @note Providing NULL for the characteristic callback will result in
+ * characteristic discovery being skipped for each matching
+ * service. This allows for an inexpensive method to discover only
+ * services.
+ *
+ * @return
+ * BLE_ERROR_NONE if service discovery is launched successfully; else an appropriate error.
+ */
+ virtual ble_error_t launchServiceDiscovery(Gap::Handle_t connectionHandle,
+ ServiceDiscovery::ServiceCallback_t sc = NULL,
+ ServiceDiscovery::CharacteristicCallback_t cc = NULL,
+ const UUID &matchingServiceUUID = UUID::ShortUUIDBytes_t(BLE_UUID_UNKNOWN),
+ const UUID &matchingCharacteristicUUIDIn = UUID::ShortUUIDBytes_t(BLE_UUID_UNKNOWN)) {
+ /* Avoid compiler warnings about unused variables. */
+ (void)connectionHandle;
+ (void)sc;
+ (void)cc;
+ (void)matchingServiceUUID;
+ (void)matchingCharacteristicUUIDIn;
+
+ return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porters: override this API if this capability is supported. */
+ }
+
+ /**
+ * Launch service discovery for services. Once launched, service discovery will remain
+ * active with service-callbacks being issued back into the application for matching
+ * services. isServiceDiscoveryActive() can be used to
+ * determine status, and a termination callback (if set up) will be invoked
+ * at the end. Service discovery can be terminated prematurely, if needed,
+ * using terminateServiceDiscovery().
+ *
+ * @param connectionHandle
+ * Handle for the connection with the peer.
+ * @param sc
+ * This is the application callback for a matching service. Note: service discovery may still be active
+ * when this callback is issued; calling asynchronous BLE-stack
+ * APIs from within this application callback might cause the
+ * stack to abort service discovery. If this becomes an issue, it
+ * may be better to make a local copy of the discoveredService and
+ * wait for service discovery to terminate before operating on the
+ * service.
+ * @param matchingServiceUUID
+ * UUID-based filter for specifying a service in which the application is
+ * interested. By default it is set as the wildcard UUID_UNKNOWN,
+ * in which case it matches all services.
+ *
+ * @return
+ * BLE_ERROR_NONE if service discovery is launched successfully; else an appropriate error.
+ */
+ virtual ble_error_t discoverServices(Gap::Handle_t connectionHandle,
+ ServiceDiscovery::ServiceCallback_t callback,
+ const UUID &matchingServiceUUID = UUID::ShortUUIDBytes_t(BLE_UUID_UNKNOWN)) {
+ return launchServiceDiscovery(connectionHandle, callback, NULL, matchingServiceUUID); /* We take advantage of the property
+ * that providing NULL for the characteristic callback will result in
+ * characteristic discovery being skipped for each matching
+ * service. This allows for an inexpensive method to discover only
+ * services. Porters are free to override this. */
+ }
+
+ /**
+ * Launch service discovery for services. Once launched, service discovery will remain
+ * active with service-callbacks being issued back into the application for matching
+ * services. isServiceDiscoveryActive() can be used to
+ * determine status, and a termination callback (if set up) will be invoked
+ * at the end. Service discovery can be terminated prematurely, if needed,
+ * using terminateServiceDiscovery().
+ *
+ * @param connectionHandle
+ * Handle for the connection with the peer.
+ * @param sc
+ * This is the application callback for a matching service. Note: service discovery may still be active
+ * when this callback is issued; calling asynchronous BLE-stack
+ * APIs from within this application callback might cause the
+ * stack to abort service discovery. If this becomes an issue, it
+ * may be better to make a local copy of the discoveredService and
+ * wait for service discovery to terminate before operating on the
+ * service.
+ * @param startHandle, endHandle
+ * Handle range within which to limit the search.
+ *
+ * @return
+ * BLE_ERROR_NONE if service discovery is launched successfully; else an appropriate error.
+ */
+ virtual ble_error_t discoverServices(Gap::Handle_t connectionHandle,
+ ServiceDiscovery::ServiceCallback_t callback,
+ GattAttribute::Handle_t startHandle,
+ GattAttribute::Handle_t endHandle) {
+ /* Avoid compiler warnings about unused variables. */
+ (void)connectionHandle;
+ (void)callback;
+ (void)startHandle;
+ (void)endHandle;
+
+ return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porters: override this API if this capability is supported. */
+ }
+
+ /**
+ * Is service-discovery currently active?
+ */
+ virtual bool isServiceDiscoveryActive(void) const {
+ return false; /* Requesting action from porters: override this API if this capability is supported. */
+ }
+
+ /**
+ * Terminate an ongoing service discovery. This should result in an
+ * invocation of TerminationCallback if service-discovery is active.
+ */
+ virtual void terminateServiceDiscovery(void) {
+ /* Requesting action from porters: override this API if this capability is supported. */
+ }
+
+ /* Initiate a GATT Client read procedure by attribute-handle. */
+ virtual ble_error_t read(Gap::Handle_t connHandle, GattAttribute::Handle_t attributeHandle, uint16_t offset) const {
+ /* Avoid compiler warnings about unused variables. */
+ (void)connHandle;
+ (void)attributeHandle;
+ (void)offset;
+
+ return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porters: override this API if this capability is supported. */
+ }
+
+ /**
+ * Initiate a GATT Client write procedure.
+ *
+ * @param[in] cmd
+ * Command can be either a write-request (which generates a
+ * matching response from the peripheral), or a write-command
+ * (which doesn't require the connected peer to respond).
+ * @param[in] connHandle
+ * Connection handle.
+ * @param[in] attributeHandle
+ * Handle for the target attribtue on the remote GATT server.
+ * @param[in] length
+ * Length of the new value.
+ * @param[in] value
+ * New value being written.
+ */
+ virtual ble_error_t write(GattClient::WriteOp_t cmd,
+ Gap::Handle_t connHandle,
+ GattAttribute::Handle_t attributeHandle,
+ size_t length,
+ const uint8_t *value) const {
+ /* Avoid compiler warnings about unused variables. */
+ (void)cmd;
+ (void)connHandle;
+ (void)attributeHandle;
+ (void)length;
+ (void)value;
+
+ return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porters: override this API if this capability is supported. */
+ }
+
+ /* Event callback handlers. */
+public:
+ /**
+ * Set up a callback for read response events.
+ * It is possible to remove registered callbacks using
+ * onDataRead().detach(callbackToRemove)
+ */
+ void onDataRead(ReadCallback_t callback) {
+ onDataReadCallbackChain.add(callback);
+ }
+
+ /**
+ * @brief provide access to the callchain of read callbacks
+ * It is possible to register callbacks using onDataRead().add(callback);
+ * It is possible to unregister callbacks using onDataRead().detach(callback)
+ * @return The read callbacks chain
+ */
+ ReadCallbackChain_t& onDataRead() {
+ return onDataReadCallbackChain;
+ }
+
+ /**
+ * Set up a callback for write response events.
+ * It is possible to remove registered callbacks using
+ * onDataWritten().detach(callbackToRemove).
+ * @Note: Write commands (issued using writeWoResponse) don't generate a response.
+ */
+ void onDataWritten(WriteCallback_t callback) {
+ onDataWriteCallbackChain.add(callback);
+ }
+
+ /**
+ * @brief provide access to the callchain of data written callbacks
+ * It is possible to register callbacks using onDataWritten().add(callback);
+ * It is possible to unregister callbacks using onDataWritten().detach(callback)
+ * @return The data written callbacks chain
+ */
+ WriteCallbackChain_t& onDataWritten() {
+ return onDataWriteCallbackChain;
+ }
+
+ /**
+ * Set up a callback for write response events.
+ * @Note: Write commands (issued using writeWoResponse) don't generate a response.
+ *
+ * @note: This API is now *deprecated* and will be dropped in the future.
+ * Please use onDataWritten() instead.
+ */
+ void onDataWrite(WriteCallback_t callback) {
+ onDataWritten(callback);
+ }
+
+ /**
+ * Set up a callback for when serviceDiscovery terminates.
+ */
+ virtual void onServiceDiscoveryTermination(ServiceDiscovery::TerminationCallback_t callback) {
+ (void)callback; /* Avoid compiler warnings about ununsed variables. */
+
+ /* Requesting action from porters: override this API if this capability is supported. */
+ }
+
+ /**
+ * Set up a callback for when the GATT client receives an update event
+ * corresponding to a change in the value of a characteristic on the remote
+ * GATT server.
+ * It is possible to remove registered callbacks using onHVX().detach(callbackToRemove).
+ */
+ void onHVX(HVXCallback_t callback) {
+ onHVXCallbackChain.add(callback);
+ }
+
+
+ /**
+ * @brief provide access to the callchain of HVX callbacks
+ * It is possible to register callbacks using onHVX().add(callback);
+ * It is possible to unregister callbacks using onHVX().detach(callback)
+ * @return The HVX callbacks chain
+ */
+ HVXCallbackChain_t& onHVX() {
+ return onHVXCallbackChain;
+ }
+
+protected:
+ GattClient() {
+ /* Empty */
+ }
+
+ /* Entry points for the underlying stack to report events back to the user. */
+public:
+ void processReadResponse(const GattReadCallbackParams *params) {
+ onDataReadCallbackChain(params);
+ }
+
+ void processWriteResponse(const GattWriteCallbackParams *params) {
+ onDataWriteCallbackChain(params);
+ }
+
+ void processHVXEvent(const GattHVXCallbackParams *params) {
+ if (onHVXCallbackChain) {
+ onHVXCallbackChain(params);
+ }
+ }
+
+protected:
+ ReadCallbackChain_t onDataReadCallbackChain;
+ WriteCallbackChain_t onDataWriteCallbackChain;
+ HVXCallbackChain_t onHVXCallbackChain;
+
+private:
+ /* Disallow copy and assignment. */
+ GattClient(const GattClient &);
+ GattClient& operator=(const GattClient &);
+};
+
#endif // ifndef __GATT_CLIENT_H__
\ No newline at end of file
--- a/ble/GattServer.h Tue Jan 12 19:47:52 2016 +0000
+++ b/ble/GattServer.h Wed Apr 06 19:13:46 2016 +0100
@@ -1,484 +1,417 @@
-/* mbed Microcontroller Library
- * Copyright (c) 2006-2013 ARM Limited
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __GATT_SERVER_H__
-#define __GATT_SERVER_H__
-
-#include "Gap.h"
-#include "GattService.h"
-#include "GattAttribute.h"
-#include "GattServerEvents.h"
-#include "GattCallbackParamTypes.h"
-#include "CallChainOfFunctionPointersWithContext.h"
-
-class GattServer {
-public:
- /* Event callback handlers. */
- typedef FunctionPointerWithContext<unsigned> DataSentCallback_t;
- typedef CallChainOfFunctionPointersWithContext<unsigned> DataSentCallbackChain_t;
-
- typedef FunctionPointerWithContext<const GattWriteCallbackParams*> DataWrittenCallback_t;
- typedef CallChainOfFunctionPointersWithContext<const GattWriteCallbackParams*> DataWrittenCallbackChain_t;
-
- typedef FunctionPointerWithContext<const GattReadCallbackParams*> DataReadCallback_t;
- typedef CallChainOfFunctionPointersWithContext<const GattReadCallbackParams *> DataReadCallbackChain_t;
-
- typedef FunctionPointerWithContext<const GattServer *> GattServerShutdownCallback_t;
- typedef CallChainOfFunctionPointersWithContext<const GattServer *> GattServerShutdownCallbackChain_t;
-
- typedef FunctionPointerWithContext<GattAttribute::Handle_t> EventCallback_t;
-
-protected:
- GattServer() :
- serviceCount(0),
- characteristicCount(0),
- dataSentCallChain(),
- dataWrittenCallChain(),
- dataReadCallChain(),
- updatesEnabledCallback(NULL),
- updatesDisabledCallback(NULL),
- confirmationReceivedCallback(NULL) {
- /* empty */
- }
-
- /*
- * The following functions are meant to be overridden in the platform-specific sub-class.
- */
-public:
-
- /**
- * Add a service declaration to the local server ATT table. Also add the
- * characteristics contained within.
- */
- virtual ble_error_t addService(GattService &service) {
- /* Avoid compiler warnings about unused variables. */
- (void)service;
-
- return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porters: override this API if this capability is supported. */
- }
-
- /**
- * Read the value of a characteristic from the local GATT server.
- * @param[in] attributeHandle
- * Attribute handle for the value attribute of the characteristic.
- * @param[out] buffer
- * A buffer to hold the value being read.
- * @param[in/out] lengthP
- * Length of the buffer being supplied. If the attribute
- * value is longer than the size of the supplied buffer,
- * this variable will hold upon return the total attribute value length
- * (excluding offset). The application may use this
- * information to allocate a suitable buffer size.
- *
- * @return BLE_ERROR_NONE if a value was read successfully into the buffer.
- */
- virtual ble_error_t read(GattAttribute::Handle_t attributeHandle, uint8_t buffer[], uint16_t *lengthP) {
- /* Avoid compiler warnings about unused variables. */
- (void)attributeHandle;
- (void)buffer;
- (void)lengthP;
-
- return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porters: override this API if this capability is supported. */
- }
-
- /**
- * Read the value of a characteristic from the local GATT server.
- * @param[in] connectionHandle
- * Connection handle.
- * @param[in] attributeHandle
- * Attribute handle for the value attribute of the characteristic.
- * @param[out] buffer
- * A buffer to hold the value being read.
- * @param[in/out] lengthP
- * Length of the buffer being supplied. If the attribute
- * value is longer than the size of the supplied buffer,
- * this variable will hold upon return the total attribute value length
- * (excluding offset). The application may use this
- * information to allocate a suitable buffer size.
- *
- * @return BLE_ERROR_NONE if a value was read successfully into the buffer.
- *
- * @note This API is a version of the above, with an additional connection handle
- * parameter to allow fetches for connection-specific multivalued
- * attributes (such as the CCCDs).
- */
- virtual ble_error_t read(Gap::Handle_t connectionHandle, GattAttribute::Handle_t attributeHandle, uint8_t *buffer, uint16_t *lengthP) {
- /* Avoid compiler warnings about unused variables. */
- (void)connectionHandle;
- (void)attributeHandle;
- (void)buffer;
- (void)lengthP;
-
- return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porters: override this API if this capability is supported. */
- }
-
- /**
- * Update the value of a characteristic on the local GATT server.
- *
- * @param[in] attributeHandle
- * Handle for the value attribute of the characteristic.
- * @param[in] value
- * A pointer to a buffer holding the new value.
- * @param[in] size
- * Size of the new value (in bytes).
- * @param[in] localOnly
- * Should this update be kept on the local
- * GATT server regardless of the state of the
- * notify/indicate flag in the CCCD for this
- * Characteristic? If set to true, no notification
- * or indication is generated.
- *
- * @return BLE_ERROR_NONE if we have successfully set the value of the attribute.
- */
- virtual ble_error_t write(GattAttribute::Handle_t attributeHandle, const uint8_t *value, uint16_t size, bool localOnly = false) {
- /* Avoid compiler warnings about unused variables. */
- (void)attributeHandle;
- (void)value;
- (void)size;
- (void)localOnly;
-
- return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porters: override this API if this capability is supported. */
- }
-
- /**
- * Update the value of a characteristic on the local GATT server. A version
- * of the same as the above, with a connection handle parameter to allow updates
- * for connection-specific multivalued attributes (such as the CCCDs).
- *
- * @param[in] connectionHandle
- * Connection handle.
- * @param[in] attributeHandle
- * Handle for the value attribute of the characteristic.
- * @param[in] value
- * A pointer to a buffer holding the new value.
- * @param[in] size
- * Size of the new value (in bytes).
- * @param[in] localOnly
- * Should this update be kept on the local
- * GattServer regardless of the state of the
- * notify/indicate flag in the CCCD for this
- * Characteristic? If set to true, no notification
- * or indication is generated.
- *
- * @return BLE_ERROR_NONE if we have successfully set the value of the attribute.
- */
- virtual ble_error_t write(Gap::Handle_t connectionHandle, GattAttribute::Handle_t attributeHandle, const uint8_t *value, uint16_t size, bool localOnly = false) {
- /* Avoid compiler warnings about unused variables. */
- (void)connectionHandle;
- (void)attributeHandle;
- (void)value;
- (void)size;
- (void)localOnly;
-
- return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porters: override this API if this capability is supported. */
- }
-
- /**
- * Determine the updates-enabled status (notification or indication) for the current connection from a characteristic's CCCD.
- *
- * @param characteristic
- * The characteristic.
- * @param[out] enabledP
- * Upon return, *enabledP is true if updates are enabled, else false.
- *
- * @return BLE_ERROR_NONE if the connection and handle are found. False otherwise.
- */
- virtual ble_error_t areUpdatesEnabled(const GattCharacteristic &characteristic, bool *enabledP) {
- /* Avoid compiler warnings about unused variables. */
- (void)characteristic;
- (void)enabledP;
-
- return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porters: override this API if this capability is supported. */
- }
-
- /**
- * Determine the connection-specific updates-enabled status (notification or indication) from a characteristic's CCCD.
- *
- * @param connectionHandle
- * The connection handle.
- * @param[out] enabledP
- * Upon return, *enabledP is true if updates are enabled, else false.
- *
- * @param characteristic
- * The characteristic.
- *
- * @return BLE_ERROR_NONE if the connection and handle are found. False otherwise.
- */
- virtual ble_error_t areUpdatesEnabled(Gap::Handle_t connectionHandle, const GattCharacteristic &characteristic, bool *enabledP) {
- /* Avoid compiler warnings about unused variables. */
- (void)connectionHandle;
- (void)characteristic;
- (void)enabledP;
-
- return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porters: override this API if this capability is supported. */
- }
-
- /**
- * A virtual function to allow underlying stacks to indicate if they support
- * onDataRead(). It should be overridden to return true as applicable.
- */
- virtual bool isOnDataReadAvailable() const {
- return false; /* Requesting action from porters: override this API if this capability is supported. */
- }
-
- /*
- * APIs with non-virtual implementations.
- */
-public:
- /**
- * Add a callback for the GATT event DATA_SENT (which is triggered when
- * updates are sent out by GATT in the form of notifications).
- *
- * @Note: It is possible to chain together multiple onDataSent callbacks
- * (potentially from different modules of an application) to receive updates
- * to characteristics.
- *
- * @Note: It is also possible to set up a callback into a member function of
- * some object.
- */
- void onDataSent(const DataSentCallback_t& callback) {dataSentCallChain.add(callback);}
- template <typename T>
- void onDataSent(T *objPtr, void (T::*memberPtr)(unsigned count)) {
- dataSentCallChain.add(objPtr, memberPtr);
- }
-
- /**
- * @brief get the callback chain called when the event DATA_EVENT is triggered.
- */
- DataSentCallbackChain_t& onDataSent() {
- return dataSentCallChain;
- }
-
- /**
- * Set up a callback for when an attribute has its value updated by or at the
- * connected peer. For a peripheral, this callback is triggered when the local
- * GATT server has an attribute updated by a write command from the peer.
- * For a central, this callback is triggered when a response is received for
- * a write request.
- *
- * @Note: It is possible to chain together multiple onDataWritten callbacks
- * (potentially from different modules of an application) to receive updates
- * to characteristics. Many services, such as DFU and UART, add their own
- * onDataWritten callbacks behind the scenes to trap interesting events.
- *
- * @Note: It is also possible to set up a callback into a member function of
- * some object.
- *
- * @Note It is possible to unregister a callback using onDataWritten().detach(callback)
- */
- void onDataWritten(const DataWrittenCallback_t& callback) {dataWrittenCallChain.add(callback);}
- template <typename T>
- void onDataWritten(T *objPtr, void (T::*memberPtr)(const GattWriteCallbackParams *context)) {
- dataWrittenCallChain.add(objPtr, memberPtr);
- }
-
- /**
- * @brief provide access to the callchain of data written event callbacks
- * It is possible to register callbacks using onDataWritten().add(callback);
- * It is possible to unregister callbacks using onDataWritten().detach(callback)
- * @return The data written event callbacks chain
- */
- DataWrittenCallbackChain_t& onDataWritten() {
- return dataWrittenCallChain;
- }
-
- /**
- * Setup a callback to be invoked on the peripheral when an attribute is
- * being read by a remote client.
- *
- * @Note: This functionality may not be available on all underlying stacks.
- * You could use GattCharacteristic::setReadAuthorizationCallback() as an
- * alternative. Refer to isOnDataReadAvailable().
- *
- * @Note: It is possible to chain together multiple onDataRead callbacks
- * (potentially from different modules of an application) to receive updates
- * to characteristics. Services may add their own onDataRead callbacks
- * behind the scenes to trap interesting events.
- *
- * @Note: It is also possible to set up a callback into a member function of
- * some object.
- *
- * @Note It is possible to unregister a callback using onDataRead().detach(callback)
- *
- * @return BLE_ERROR_NOT_IMPLEMENTED if this functionality isn't available;
- * else BLE_ERROR_NONE.
- */
- ble_error_t onDataRead(const DataReadCallback_t& callback) {
- if (!isOnDataReadAvailable()) {
- return BLE_ERROR_NOT_IMPLEMENTED;
- }
-
- dataReadCallChain.add(callback);
- return BLE_ERROR_NONE;
- }
- template <typename T>
- ble_error_t onDataRead(T *objPtr, void (T::*memberPtr)(const GattReadCallbackParams *context)) {
- if (!isOnDataReadAvailable()) {
- return BLE_ERROR_NOT_IMPLEMENTED;
- }
-
- dataReadCallChain.add(objPtr, memberPtr);
- return BLE_ERROR_NONE;
- }
-
- /**
- * @brief provide access to the callchain of data read event callbacks
- * It is possible to register callbacks using onDataRead().add(callback);
- * It is possible to unregister callbacks using onDataRead().detach(callback)
- * @return The data read event callbacks chain
- */
- DataReadCallbackChain_t& onDataRead() {
- return dataReadCallChain;
- }
-
- /**
- * Setup a callback to be invoked to notify the user application that the
- * GattServer instance is about to shutdown (possibly as a result of a call
- * to BLE::shutdown()).
- *
- * @Note: It is possible to chain together multiple onShutdown callbacks
- * (potentially from different modules of an application) to be notified
- * before the GattServer is shutdown.
- *
- * @Note: It is also possible to set up a callback into a member function of
- * some object.
- *
- * @Note It is possible to unregister a callback using onShutdown().detach(callback)
- */
- void onShutdown(const GattServerShutdownCallback_t& callback) {
- shutdownCallChain.add(callback);
- }
- template <typename T>
- void onShutdown(T *objPtr, void (T::*memberPtr)(void)) {
- shutdownCallChain.add(objPtr, memberPtr);
- }
-
- /**
- * @brief provide access to the callchain of shutdown event callbacks
- * It is possible to register callbacks using onShutdown().add(callback);
- * It is possible to unregister callbacks using onShutdown().detach(callback)
- * @return The shutdown event callbacks chain
- */
- GattServerShutdownCallbackChain_t& onShutdown() {
- return shutdownCallChain;
- }
-
- /**
- * Set up a callback for when notifications or indications are enabled for a
- * characteristic on the local GATT server.
- */
- void onUpdatesEnabled(EventCallback_t callback) {updatesEnabledCallback = callback;}
-
- /**
- * Set up a callback for when notifications or indications are disabled for a
- * characteristic on the local GATT server.
- */
- void onUpdatesDisabled(EventCallback_t callback) {updatesDisabledCallback = callback;}
-
- /**
- * Set up a callback for when the GATT server receives a response for an
- * indication event sent previously.
- */
- void onConfirmationReceived(EventCallback_t callback) {confirmationReceivedCallback = callback;}
-
- /* Entry points for the underlying stack to report events back to the user. */
-protected:
- void handleDataWrittenEvent(const GattWriteCallbackParams *params) {
- dataWrittenCallChain.call(params);
- }
-
- void handleDataReadEvent(const GattReadCallbackParams *params) {
- dataReadCallChain.call(params);
- }
-
- void handleEvent(GattServerEvents::gattEvent_e type, GattAttribute::Handle_t attributeHandle) {
- switch (type) {
- case GattServerEvents::GATT_EVENT_UPDATES_ENABLED:
- if (updatesEnabledCallback) {
- updatesEnabledCallback(attributeHandle);
- }
- break;
- case GattServerEvents::GATT_EVENT_UPDATES_DISABLED:
- if (updatesDisabledCallback) {
- updatesDisabledCallback(attributeHandle);
- }
- break;
- case GattServerEvents::GATT_EVENT_CONFIRMATION_RECEIVED:
- if (confirmationReceivedCallback) {
- confirmationReceivedCallback(attributeHandle);
- }
- break;
- default:
- break;
- }
- }
-
- void handleDataSentEvent(unsigned count) {
- dataSentCallChain.call(count);
- }
-
-public:
- /**
- * Notify all registered onShutdown callbacks that the GattServer is
- * about to be shutdown and clear all GattServer state of the
- * associated object.
- *
- * This function is meant to be overridden in the platform-specific
- * sub-class. Nevertheless, the sub-class is only expected to reset its
- * state and not the data held in GattServer members. This shall be achieved
- * by a call to GattServer::reset() from the sub-class' reset()
- * implementation.
- *
- * @return BLE_ERROR_NONE on success.
- */
- virtual ble_error_t reset(void) {
- /* Notify that the instance is about to shutdown */
- shutdownCallChain.call(this);
- shutdownCallChain.clear();
-
- serviceCount = 0;
- characteristicCount = 0;
-
- dataSentCallChain.clear();
- dataWrittenCallChain.clear();
- dataReadCallChain.clear();
- updatesEnabledCallback = NULL;
- updatesDisabledCallback = NULL;
- confirmationReceivedCallback = NULL;
-
- return BLE_ERROR_NONE;
- }
-
-protected:
- uint8_t serviceCount;
- uint8_t characteristicCount;
-
-private:
- DataSentCallbackChain_t dataSentCallChain;
- DataWrittenCallbackChain_t dataWrittenCallChain;
- DataReadCallbackChain_t dataReadCallChain;
- GattServerShutdownCallbackChain_t shutdownCallChain;
- EventCallback_t updatesEnabledCallback;
- EventCallback_t updatesDisabledCallback;
- EventCallback_t confirmationReceivedCallback;
-
-private:
- /* Disallow copy and assignment. */
- GattServer(const GattServer &);
- GattServer& operator=(const GattServer &);
-};
-
+/* mbed Microcontroller Library
+ * Copyright (c) 2006-2013 ARM Limited
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __GATT_SERVER_H__
+#define __GATT_SERVER_H__
+
+#include "Gap.h"
+#include "GattService.h"
+#include "GattAttribute.h"
+#include "GattServerEvents.h"
+#include "GattCallbackParamTypes.h"
+#include "CallChainOfFunctionPointersWithContext.h"
+
+class GattServer {
+public:
+
+ /* Event callback handlers. */
+ typedef FunctionPointerWithContext<unsigned> DataSentCallback_t;
+ typedef CallChainOfFunctionPointersWithContext<unsigned> DataSentCallbackChain_t;
+
+ typedef FunctionPointerWithContext<const GattWriteCallbackParams*> DataWrittenCallback_t;
+ typedef CallChainOfFunctionPointersWithContext<const GattWriteCallbackParams*> DataWrittenCallbackChain_t;
+
+ typedef FunctionPointerWithContext<const GattReadCallbackParams*> DataReadCallback_t;
+ typedef CallChainOfFunctionPointersWithContext<const GattReadCallbackParams *> DataReadCallbackChain_t;
+
+ typedef FunctionPointerWithContext<GattAttribute::Handle_t> EventCallback_t;
+
+protected:
+ GattServer() :
+ serviceCount(0),
+ characteristicCount(0),
+ dataSentCallChain(),
+ dataWrittenCallChain(),
+ dataReadCallChain(),
+ updatesEnabledCallback(NULL),
+ updatesDisabledCallback(NULL),
+ confirmationReceivedCallback(NULL) {
+ /* empty */
+ }
+
+ /*
+ * The following functions are meant to be overridden in the platform-specific sub-class.
+ */
+public:
+
+ /**
+ * Add a service declaration to the local server ATT table. Also add the
+ * characteristics contained within.
+ */
+ virtual ble_error_t addService(GattService &service) {
+ /* Avoid compiler warnings about unused variables. */
+ (void)service;
+
+ return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porters: override this API if this capability is supported. */
+ }
+
+ /**
+ * Read the value of a characteristic from the local GATT server.
+ * @param[in] attributeHandle
+ * Attribute handle for the value attribute of the characteristic.
+ * @param[out] buffer
+ * A buffer to hold the value being read.
+ * @param[in/out] lengthP
+ * Length of the buffer being supplied. If the attribute
+ * value is longer than the size of the supplied buffer,
+ * this variable will hold upon return the total attribute value length
+ * (excluding offset). The application may use this
+ * information to allocate a suitable buffer size.
+ *
+ * @return BLE_ERROR_NONE if a value was read successfully into the buffer.
+ */
+ virtual ble_error_t read(GattAttribute::Handle_t attributeHandle, uint8_t buffer[], uint16_t *lengthP) {
+ /* Avoid compiler warnings about unused variables. */
+ (void)attributeHandle;
+ (void)buffer;
+ (void)lengthP;
+
+ return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porters: override this API if this capability is supported. */
+ }
+
+ /**
+ * Read the value of a characteristic from the local GATT server.
+ * @param[in] connectionHandle
+ * Connection handle.
+ * @param[in] attributeHandle
+ * Attribute handle for the value attribute of the characteristic.
+ * @param[out] buffer
+ * A buffer to hold the value being read.
+ * @param[in/out] lengthP
+ * Length of the buffer being supplied. If the attribute
+ * value is longer than the size of the supplied buffer,
+ * this variable will hold upon return the total attribute value length
+ * (excluding offset). The application may use this
+ * information to allocate a suitable buffer size.
+ *
+ * @return BLE_ERROR_NONE if a value was read successfully into the buffer.
+ *
+ * @note This API is a version of the above, with an additional connection handle
+ * parameter to allow fetches for connection-specific multivalued
+ * attributes (such as the CCCDs).
+ */
+ virtual ble_error_t read(Gap::Handle_t connectionHandle, GattAttribute::Handle_t attributeHandle, uint8_t *buffer, uint16_t *lengthP) {
+ /* Avoid compiler warnings about unused variables. */
+ (void)connectionHandle;
+ (void)attributeHandle;
+ (void)buffer;
+ (void)lengthP;
+
+ return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porters: override this API if this capability is supported. */
+ }
+
+ /**
+ * Update the value of a characteristic on the local GATT server.
+ *
+ * @param[in] attributeHandle
+ * Handle for the value attribute of the characteristic.
+ * @param[in] value
+ * A pointer to a buffer holding the new value.
+ * @param[in] size
+ * Size of the new value (in bytes).
+ * @param[in] localOnly
+ * Should this update be kept on the local
+ * GATT server regardless of the state of the
+ * notify/indicate flag in the CCCD for this
+ * Characteristic? If set to true, no notification
+ * or indication is generated.
+ *
+ * @return BLE_ERROR_NONE if we have successfully set the value of the attribute.
+ */
+ virtual ble_error_t write(GattAttribute::Handle_t attributeHandle, const uint8_t *value, uint16_t size, bool localOnly = false) {
+ /* Avoid compiler warnings about unused variables. */
+ (void)attributeHandle;
+ (void)value;
+ (void)size;
+ (void)localOnly;
+
+ return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porters: override this API if this capability is supported. */
+ }
+
+ /**
+ * Update the value of a characteristic on the local GATT server. A version
+ * of the same as the above, with a connection handle parameter to allow updates
+ * for connection-specific multivalued attributes (such as the CCCDs).
+ *
+ * @param[in] connectionHandle
+ * Connection handle.
+ * @param[in] attributeHandle
+ * Handle for the value attribute of the characteristic.
+ * @param[in] value
+ * A pointer to a buffer holding the new value.
+ * @param[in] size
+ * Size of the new value (in bytes).
+ * @param[in] localOnly
+ * Should this update be kept on the local
+ * GattServer regardless of the state of the
+ * notify/indicate flag in the CCCD for this
+ * Characteristic? If set to true, no notification
+ * or indication is generated.
+ *
+ * @return BLE_ERROR_NONE if we have successfully set the value of the attribute.
+ */
+ virtual ble_error_t write(Gap::Handle_t connectionHandle, GattAttribute::Handle_t attributeHandle, const uint8_t *value, uint16_t size, bool localOnly = false) {
+ /* Avoid compiler warnings about unused variables. */
+ (void)connectionHandle;
+ (void)attributeHandle;
+ (void)value;
+ (void)size;
+ (void)localOnly;
+
+ return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porters: override this API if this capability is supported. */
+ }
+
+ /**
+ * Determine the updates-enabled status (notification or indication) for the current connection from a characteristic's CCCD.
+ *
+ * @param characteristic
+ * The characteristic.
+ * @param[out] enabledP
+ * Upon return, *enabledP is true if updates are enabled, else false.
+ *
+ * @return BLE_ERROR_NONE if the connection and handle are found. False otherwise.
+ */
+ virtual ble_error_t areUpdatesEnabled(const GattCharacteristic &characteristic, bool *enabledP) {
+ /* Avoid compiler warnings about unused variables. */
+ (void)characteristic;
+ (void)enabledP;
+
+ return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porters: override this API if this capability is supported. */
+ }
+
+ /**
+ * Determine the connection-specific updates-enabled status (notification or indication) from a characteristic's CCCD.
+ *
+ * @param connectionHandle
+ * The connection handle.
+ * @param[out] enabledP
+ * Upon return, *enabledP is true if updates are enabled, else false.
+ *
+ * @param characteristic
+ * The characteristic.
+ *
+ * @return BLE_ERROR_NONE if the connection and handle are found. False otherwise.
+ */
+ virtual ble_error_t areUpdatesEnabled(Gap::Handle_t connectionHandle, const GattCharacteristic &characteristic, bool *enabledP) {
+ /* Avoid compiler warnings about unused variables. */
+ (void)connectionHandle;
+ (void)characteristic;
+ (void)enabledP;
+
+ return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porters: override this API if this capability is supported. */
+ }
+
+ /**
+ * A virtual function to allow underlying stacks to indicate if they support
+ * onDataRead(). It should be overridden to return true as applicable.
+ */
+ virtual bool isOnDataReadAvailable() const {
+ return false; /* Requesting action from porters: override this API if this capability is supported. */
+ }
+
+ /*
+ * APIs with non-virtual implementations.
+ */
+public:
+ /**
+ * Add a callback for the GATT event DATA_SENT (which is triggered when
+ * updates are sent out by GATT in the form of notifications).
+ *
+ * @Note: It is possible to chain together multiple onDataSent callbacks
+ * (potentially from different modules of an application) to receive updates
+ * to characteristics.
+ *
+ * @Note: It is also possible to set up a callback into a member function of
+ * some object.
+ */
+ void onDataSent(const DataSentCallback_t& callback) {dataSentCallChain.add(callback);}
+ template <typename T>
+ void onDataSent(T *objPtr, void (T::*memberPtr)(unsigned count)) {
+ dataSentCallChain.add(objPtr, memberPtr);
+ }
+
+ /**
+ * @brief get the callback chain called when the event DATA_EVENT is triggered.
+ */
+ DataSentCallbackChain_t& onDataSent() {
+ return dataSentCallChain;
+ }
+
+ /**
+ * Set up a callback for when an attribute has its value updated by or at the
+ * connected peer. For a peripheral, this callback is triggered when the local
+ * GATT server has an attribute updated by a write command from the peer.
+ * For a central, this callback is triggered when a response is received for
+ * a write request.
+ *
+ * @Note: It is possible to chain together multiple onDataWritten callbacks
+ * (potentially from different modules of an application) to receive updates
+ * to characteristics. Many services, such as DFU and UART, add their own
+ * onDataWritten callbacks behind the scenes to trap interesting events.
+ *
+ * @Note: It is also possible to set up a callback into a member function of
+ * some object.
+ *
+ * @Note It is possible to unregister a callback using onDataWritten().detach(callback)
+ */
+ void onDataWritten(const DataWrittenCallback_t& callback) {dataWrittenCallChain.add(callback);}
+ template <typename T>
+ void onDataWritten(T *objPtr, void (T::*memberPtr)(const GattWriteCallbackParams *context)) {
+ dataWrittenCallChain.add(objPtr, memberPtr);
+ }
+
+ /**
+ * @brief provide access to the callchain of data written event callbacks
+ * It is possible to register callbacks using onDataWritten().add(callback);
+ * It is possible to unregister callbacks using onDataWritten().detach(callback)
+ * @return The data written event callbacks chain
+ */
+ DataWrittenCallbackChain_t& onDataWritten() {
+ return dataWrittenCallChain;
+ }
+
+ /**
+ * Setup a callback to be invoked on the peripheral when an attribute is
+ * being read by a remote client.
+ *
+ * @Note: This functionality may not be available on all underlying stacks.
+ * You could use GattCharacteristic::setReadAuthorizationCallback() as an
+ * alternative. Refer to isOnDataReadAvailable().
+ *
+ * @Note: It is possible to chain together multiple onDataRead callbacks
+ * (potentially from different modules of an application) to receive updates
+ * to characteristics. Services may add their own onDataRead callbacks
+ * behind the scenes to trap interesting events.
+ *
+ * @Note: It is also possible to set up a callback into a member function of
+ * some object.
+ *
+ * @Note It is possible to unregister a callback using onDataRead().detach(callback)
+ *
+ * @return BLE_ERROR_NOT_IMPLEMENTED if this functionality isn't available;
+ * else BLE_ERROR_NONE.
+ */
+ ble_error_t onDataRead(const DataReadCallback_t& callback) {
+ if (!isOnDataReadAvailable()) {
+ return BLE_ERROR_NOT_IMPLEMENTED;
+ }
+
+ dataReadCallChain.add(callback);
+ return BLE_ERROR_NONE;
+ }
+ template <typename T>
+ ble_error_t onDataRead(T *objPtr, void (T::*memberPtr)(const GattReadCallbackParams *context)) {
+ if (!isOnDataReadAvailable()) {
+ return BLE_ERROR_NOT_IMPLEMENTED;
+ }
+
+ dataReadCallChain.add(objPtr, memberPtr);
+ return BLE_ERROR_NONE;
+ }
+
+ /**
+ * @brief provide access to the callchain of data read event callbacks
+ * It is possible to register callbacks using onDataRead().add(callback);
+ * It is possible to unregister callbacks using onDataRead().detach(callback)
+ * @return The data read event callbacks chain
+ */
+ DataReadCallbackChain_t& onDataRead() {
+ return dataReadCallChain;
+ }
+
+ /**
+ * Set up a callback for when notifications or indications are enabled for a
+ * characteristic on the local GATT server.
+ */
+ void onUpdatesEnabled(EventCallback_t callback) {updatesEnabledCallback = callback;}
+
+ /**
+ * Set up a callback for when notifications or indications are disabled for a
+ * characteristic on the local GATT server.
+ */
+ void onUpdatesDisabled(EventCallback_t callback) {updatesDisabledCallback = callback;}
+
+ /**
+ * Set up a callback for when the GATT server receives a response for an
+ * indication event sent previously.
+ */
+ void onConfirmationReceived(EventCallback_t callback) {confirmationReceivedCallback = callback;}
+
+ /* Entry points for the underlying stack to report events back to the user. */
+protected:
+ void handleDataWrittenEvent(const GattWriteCallbackParams *params) {
+ dataWrittenCallChain.call(params);
+ }
+
+ void handleDataReadEvent(const GattReadCallbackParams *params) {
+ dataReadCallChain.call(params);
+ }
+
+ void handleEvent(GattServerEvents::gattEvent_e type, GattAttribute::Handle_t attributeHandle) {
+ switch (type) {
+ case GattServerEvents::GATT_EVENT_UPDATES_ENABLED:
+ if (updatesEnabledCallback) {
+ updatesEnabledCallback(attributeHandle);
+ }
+ break;
+ case GattServerEvents::GATT_EVENT_UPDATES_DISABLED:
+ if (updatesDisabledCallback) {
+ updatesDisabledCallback(attributeHandle);
+ }
+ break;
+ case GattServerEvents::GATT_EVENT_CONFIRMATION_RECEIVED:
+ if (confirmationReceivedCallback) {
+ confirmationReceivedCallback(attributeHandle);
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+ void handleDataSentEvent(unsigned count) {
+ dataSentCallChain.call(count);
+ }
+
+protected:
+ uint8_t serviceCount;
+ uint8_t characteristicCount;
+
+private:
+ DataSentCallbackChain_t dataSentCallChain;
+ DataWrittenCallbackChain_t dataWrittenCallChain;
+ DataReadCallbackChain_t dataReadCallChain;
+ EventCallback_t updatesEnabledCallback;
+ EventCallback_t updatesDisabledCallback;
+ EventCallback_t confirmationReceivedCallback;
+
+private:
+ /* Disallow copy and assignment. */
+ GattServer(const GattServer &);
+ GattServer& operator=(const GattServer &);
+};
+
#endif // ifndef __GATT_SERVER_H__
\ No newline at end of file
--- a/ble/SecurityManager.h Tue Jan 12 19:47:52 2016 +0000
+++ b/ble/SecurityManager.h Wed Apr 06 19:13:46 2016 +0100
@@ -20,7 +20,6 @@
#include <stdint.h>
#include "Gap.h"
-#include "CallChainOfFunctionPointersWithContext.h"
class SecurityManager {
public:
@@ -83,9 +82,6 @@
typedef void (*LinkSecuredCallback_t)(Gap::Handle_t handle, SecurityMode_t securityMode);
typedef void (*PasskeyDisplayCallback_t)(Gap::Handle_t handle, const Passkey_t passkey);
- typedef FunctionPointerWithContext<const SecurityManager *> SecurityManagerShutdownCallback_t;
- typedef CallChainOfFunctionPointersWithContext<const SecurityManager *> SecurityManagerShutdownCallbackChain_t;
-
/*
* The following functions are meant to be overridden in the platform-specific sub-class.
*/
@@ -124,7 +120,7 @@
* @param[in] connectionHandle Handle to identify the connection.
* @param[out] securityStatusP Security status.
*
- * @return BLE_ERROR_NONE or appropriate error code indicating the failure reason.
+ * @return BLE_SUCCESS or appropriate error code indicating the failure reason.
*/
virtual ble_error_t getLinkSecurity(Gap::Handle_t connectionHandle, LinkSecurityStatus_t *securityStatusP) {
/* Avoid compiler warnings about unused variables. */
@@ -135,23 +131,6 @@
}
/**
- * Set the security mode on a connection. Useful for elevating the security mode
- * once certain conditions are met, e.g., a particular service is found.
- *
- * @param[in] connectionHandle Handle to identify the connection.
- * @param[in] securityMode Requested security mode.
- *
- * @return BLE_ERROR_NONE or appropriate error code indicating the failure reason.
- */
- virtual ble_error_t setLinkSecurity(Gap::Handle_t connectionHandle, SecurityMode_t securityMode) {
- /* Avoid compiler warnings about unused variables. */
- (void)connectionHandle;
- (void)securityMode;
-
- return BLE_ERROR_NOT_IMPLEMENTED;
- }
-
- /**
* Delete all peer device context and all related bonding information from
* the database within the security manager.
*
@@ -163,63 +142,9 @@
return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porters: override this API if security is supported. */
}
- /**
- * Get a list of addresses from all peers in the bond table.
- *
- * @param[in/out] addresses
- * (on input) addresses.capacity contains the maximum
- * number of addresses to be returned.
- * (on output) The populated table with copies of the
- * addresses in the implementation's whitelist.
- *
- * @retval BLE_ERROR_NONE On success, else an error code indicating reason for failure.
- * @retval BLE_ERROR_INVALID_STATE If the API is called without module initialization or
- * application registration.
- *
- * @experimental
- */
- virtual ble_error_t getAddressesFromBondTable(Gap::Whitelist_t &addresses) const {
- /* Avoid compiler warnings about unused variables */
- (void) addresses;
-
- return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porters: override this API if security is supported. */
- }
-
/* Event callback handlers. */
public:
/**
- * Setup a callback to be invoked to notify the user application that the
- * SecurityManager instance is about to shutdown (possibly as a result of a call
- * to BLE::shutdown()).
- *
- * @Note: It is possible to chain together multiple onShutdown callbacks
- * (potentially from different modules of an application) to be notified
- * before the SecurityManager is shutdown.
- *
- * @Note: It is also possible to set up a callback into a member function of
- * some object.
- *
- * @Note It is possible to unregister a callback using onShutdown().detach(callback)
- */
- void onShutdown(const SecurityManagerShutdownCallback_t& callback) {
- shutdownCallChain.add(callback);
- }
- template <typename T>
- void onShutdown(T *objPtr, void (T::*memberPtr)(void)) {
- shutdownCallChain.add(objPtr, memberPtr);
- }
-
- /**
- * @brief provide access to the callchain of shutdown event callbacks
- * It is possible to register callbacks using onShutdown().add(callback);
- * It is possible to unregister callbacks using onShutdown().detach(callback)
- * @return The shutdown event callbacks chain
- */
- SecurityManagerShutdownCallbackChain_t& onShutdown() {
- return shutdownCallChain;
- }
-
- /**
* To indicate that a security procedure for the link has started.
*/
virtual void onSecuritySetupInitiated(SecuritySetupInitiatedCallback_t callback) {securitySetupInitiatedCallback = callback;}
@@ -289,43 +214,12 @@
/* empty */
}
-public:
- /**
- * Notify all registered onShutdown callbacks that the SecurityManager is
- * about to be shutdown and clear all SecurityManager state of the
- * associated object.
- *
- * This function is meant to be overridden in the platform-specific
- * sub-class. Nevertheless, the sub-class is only expected to reset its
- * state and not the data held in SecurityManager members. This shall be
- * achieved by a call to SecurityManager::reset() from the sub-class'
- * reset() implementation.
- *
- * @return BLE_ERROR_NONE on success.
- */
- virtual ble_error_t reset(void) {
- /* Notify that the instance is about to shutdown */
- shutdownCallChain.call(this);
- shutdownCallChain.clear();
-
- securitySetupInitiatedCallback = NULL;
- securitySetupCompletedCallback = NULL;
- linkSecuredCallback = NULL;
- securityContextStoredCallback = NULL;
- passkeyDisplayCallback = NULL;
-
- return BLE_ERROR_NONE;
- }
-
protected:
SecuritySetupInitiatedCallback_t securitySetupInitiatedCallback;
SecuritySetupCompletedCallback_t securitySetupCompletedCallback;
LinkSecuredCallback_t linkSecuredCallback;
HandleSpecificEvent_t securityContextStoredCallback;
PasskeyDisplayCallback_t passkeyDisplayCallback;
-
-private:
- SecurityManagerShutdownCallbackChain_t shutdownCallChain;
};
#endif /*__SECURITY_MANAGER_H__*/
\ No newline at end of file
--- a/ble/ServiceDiscovery.h Tue Jan 12 19:47:52 2016 +0000
+++ b/ble/ServiceDiscovery.h Wed Apr 06 19:13:46 2016 +0100
@@ -1,164 +1,143 @@
-/* mbed Microcontroller Library
- * Copyright (c) 2006-2013 ARM Limited
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __SERVICE_DISOVERY_H__
-#define __SERVICE_DISOVERY_H__
-
-#include "UUID.h"
-#include "Gap.h"
-#include "GattAttribute.h"
-
-class DiscoveredService;
-class DiscoveredCharacteristic;
-
-class ServiceDiscovery {
-public:
- /*
- * Exposed application callback types.
- */
-
- /**
- * Callback type for when a matching service is found during service-
- * discovery. The receiving function is passed in a pointer to a
- * DiscoveredService object, which will remain valid for the lifetime of the
- * callback. Memory for this object is owned by the BLE_API eventing
- * framework. The application can safely make a persistent shallow-copy of
- * this object to work with the service beyond the callback.
- */
- typedef FunctionPointerWithContext<const DiscoveredService *> ServiceCallback_t;
-
- /**
- * Callback type for when a matching characteristic is found during service-
- * discovery. The receiving function is passed in a pointer to a
- * DiscoveredCharacteristic object, which will remain valid for the lifetime
- * of the callback. Memory for this object is owned by the BLE_API eventing
- * framework. The application can safely make a persistent shallow-copy of
- * this object to work with the characteristic beyond the callback.
- */
- typedef FunctionPointerWithContext<const DiscoveredCharacteristic *> CharacteristicCallback_t;
-
- /**
- * Callback type for when serviceDiscovery terminates.
- */
- typedef FunctionPointerWithContext<Gap::Handle_t> TerminationCallback_t;
-
-public:
- /**
- * Launch service discovery. Once launched, service discovery will remain
- * active with callbacks being issued back into the application for matching
- * services or characteristics. isActive() can be used to determine status, and
- * a termination callback (if set up) will be invoked at the end. Service
- * discovery can be terminated prematurely, if needed, using terminate().
- *
- * @param connectionHandle
- * Handle for the connection with the peer.
- * @param sc
- * This is the application callback for a matching service. Taken as
- * NULL by default. Note: service discovery may still be active
- * when this callback is issued; calling asynchronous BLE-stack
- * APIs from within this application callback might cause the
- * stack to abort service discovery. If this becomes an issue, it
- * may be better to make a local copy of the discoveredService and
- * wait for service discovery to terminate before operating on the
- * service.
- * @param cc
- * This is the application callback for a matching characteristic.
- * Taken as NULL by default. Note: service discovery may still be
- * active when this callback is issued; calling asynchronous
- * BLE-stack APIs from within this application callback might cause
- * the stack to abort service discovery. If this becomes an issue,
- * it may be better to make a local copy of the discoveredCharacteristic
- * and wait for service discovery to terminate before operating on the
- * characteristic.
- * @param matchingServiceUUID
- * UUID-based filter for specifying a service in which the application is
- * interested. By default it is set as the wildcard UUID_UNKNOWN,
- * in which case it matches all services. If characteristic-UUID
- * filter (below) is set to the wildcard value, then a service
- * callback will be invoked for the matching service (or for every
- * service if the service filter is a wildcard).
- * @param matchingCharacteristicUUIDIn
- * UUID-based filter for specifying a characteristic in which the application
- * is interested. By default it is set as the wildcard UUID_UKNOWN
- * to match against any characteristic. If both service-UUID
- * filter and characteristic-UUID filter are used with non-wildcard
- * values, then only a single characteristic callback is
- * invoked for the matching characteristic.
- *
- * @note Using wildcard values for both service-UUID and characteristic-
- * UUID will result in complete service discovery: callbacks being
- * called for every service and characteristic.
- *
- * @note Providing NULL for the characteristic callback will result in
- * characteristic discovery being skipped for each matching
- * service. This allows for an inexpensive method to discover only
- * services.
- *
- * @return
- * BLE_ERROR_NONE if service discovery is launched successfully; else an appropriate error.
- */
- virtual ble_error_t launch(Gap::Handle_t connectionHandle,
- ServiceCallback_t sc = NULL,
- CharacteristicCallback_t cc = NULL,
- const UUID &matchingServiceUUID = UUID::ShortUUIDBytes_t(BLE_UUID_UNKNOWN),
- const UUID &matchingCharacteristicUUIDIn = UUID::ShortUUIDBytes_t(BLE_UUID_UNKNOWN)) = 0;
-
- /**
- * Is service-discovery currently active?
- */
- virtual bool isActive(void) const = 0;
-
- /**
- * Terminate an ongoing service discovery. This should result in an
- * invocation of the TerminationCallback if service discovery is active.
- */
- virtual void terminate(void) = 0;
-
- /**
- * Set up a callback to be invoked when service discovery is terminated.
- */
- virtual void onTermination(TerminationCallback_t callback) = 0;
-
- /**
- * Clear all ServiceDiscovery state of the associated object.
- *
- * This function is meant to be overridden in the platform-specific
- * sub-class. Nevertheless, the sub-class is only expected to reset its
- * state and not the data held in ServiceDiscovery members. This shall be
- * achieved by a call to ServiceDiscovery::reset() from the sub-class'
- * reset() implementation.
- *
- * @return BLE_ERROR_NONE on success.
- */
- virtual ble_error_t reset(void) {
- connHandle = 0;
- matchingServiceUUID = UUID::ShortUUIDBytes_t(BLE_UUID_UNKNOWN);
- serviceCallback = NULL;
- matchingCharacteristicUUID = UUID::ShortUUIDBytes_t(BLE_UUID_UNKNOWN);
- characteristicCallback = NULL;
-
- return BLE_ERROR_NONE;
- }
-
-protected:
- Gap::Handle_t connHandle; /**< Connection handle as provided by the SoftDevice. */
- UUID matchingServiceUUID;
- ServiceCallback_t serviceCallback;
- UUID matchingCharacteristicUUID;
- CharacteristicCallback_t characteristicCallback;
-};
-
+/* mbed Microcontroller Library
+ * Copyright (c) 2006-2013 ARM Limited
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __SERVICE_DISOVERY_H__
+#define __SERVICE_DISOVERY_H__
+
+#include "UUID.h"
+#include "Gap.h"
+#include "GattAttribute.h"
+
+class DiscoveredService;
+class DiscoveredCharacteristic;
+
+class ServiceDiscovery {
+public:
+ /*
+ * Exposed application callback types.
+ */
+
+ /**
+ * Callback type for when a matching service is found during service-
+ * discovery. The receiving function is passed in a pointer to a
+ * DiscoveredService object, which will remain valid for the lifetime of the
+ * callback. Memory for this object is owned by the BLE_API eventing
+ * framework. The application can safely make a persistent shallow-copy of
+ * this object to work with the service beyond the callback.
+ */
+ typedef FunctionPointerWithContext<const DiscoveredService *> ServiceCallback_t;
+
+ /**
+ * Callback type for when a matching characteristic is found during service-
+ * discovery. The receiving function is passed in a pointer to a
+ * DiscoveredCharacteristic object, which will remain valid for the lifetime
+ * of the callback. Memory for this object is owned by the BLE_API eventing
+ * framework. The application can safely make a persistent shallow-copy of
+ * this object to work with the characteristic beyond the callback.
+ */
+ typedef FunctionPointerWithContext<const DiscoveredCharacteristic *> CharacteristicCallback_t;
+
+ /**
+ * Callback type for when serviceDiscovery terminates.
+ */
+ typedef FunctionPointerWithContext<Gap::Handle_t> TerminationCallback_t;
+
+public:
+ /**
+ * Launch service discovery. Once launched, service discovery will remain
+ * active with callbacks being issued back into the application for matching
+ * services or characteristics. isActive() can be used to determine status, and
+ * a termination callback (if set up) will be invoked at the end. Service
+ * discovery can be terminated prematurely, if needed, using terminate().
+ *
+ * @param connectionHandle
+ * Handle for the connection with the peer.
+ * @param sc
+ * This is the application callback for a matching service. Taken as
+ * NULL by default. Note: service discovery may still be active
+ * when this callback is issued; calling asynchronous BLE-stack
+ * APIs from within this application callback might cause the
+ * stack to abort service discovery. If this becomes an issue, it
+ * may be better to make a local copy of the discoveredService and
+ * wait for service discovery to terminate before operating on the
+ * service.
+ * @param cc
+ * This is the application callback for a matching characteristic.
+ * Taken as NULL by default. Note: service discovery may still be
+ * active when this callback is issued; calling asynchronous
+ * BLE-stack APIs from within this application callback might cause
+ * the stack to abort service discovery. If this becomes an issue,
+ * it may be better to make a local copy of the discoveredCharacteristic
+ * and wait for service discovery to terminate before operating on the
+ * characteristic.
+ * @param matchingServiceUUID
+ * UUID-based filter for specifying a service in which the application is
+ * interested. By default it is set as the wildcard UUID_UNKNOWN,
+ * in which case it matches all services. If characteristic-UUID
+ * filter (below) is set to the wildcard value, then a service
+ * callback will be invoked for the matching service (or for every
+ * service if the service filter is a wildcard).
+ * @param matchingCharacteristicUUIDIn
+ * UUID-based filter for specifying a characteristic in which the application
+ * is interested. By default it is set as the wildcard UUID_UKNOWN
+ * to match against any characteristic. If both service-UUID
+ * filter and characteristic-UUID filter are used with non-wildcard
+ * values, then only a single characteristic callback is
+ * invoked for the matching characteristic.
+ *
+ * @note Using wildcard values for both service-UUID and characteristic-
+ * UUID will result in complete service discovery: callbacks being
+ * called for every service and characteristic.
+ *
+ * @note Providing NULL for the characteristic callback will result in
+ * characteristic discovery being skipped for each matching
+ * service. This allows for an inexpensive method to discover only
+ * services.
+ *
+ * @return
+ * BLE_ERROR_NONE if service discovery is launched successfully; else an appropriate error.
+ */
+ virtual ble_error_t launch(Gap::Handle_t connectionHandle,
+ ServiceCallback_t sc = NULL,
+ CharacteristicCallback_t cc = NULL,
+ const UUID &matchingServiceUUID = UUID::ShortUUIDBytes_t(BLE_UUID_UNKNOWN),
+ const UUID &matchingCharacteristicUUIDIn = UUID::ShortUUIDBytes_t(BLE_UUID_UNKNOWN)) = 0;
+
+ /**
+ * Is service-discovery currently active?
+ */
+ virtual bool isActive(void) const = 0;
+
+ /**
+ * Terminate an ongoing service discovery. This should result in an
+ * invocation of the TerminationCallback if service discovery is active.
+ */
+ virtual void terminate(void) = 0;
+
+ /**
+ * Set up a callback to be invoked when service discovery is terminated.
+ */
+ virtual void onTermination(TerminationCallback_t callback) = 0;
+
+protected:
+ Gap::Handle_t connHandle; /**< Connection handle as provided by the SoftDevice. */
+ UUID matchingServiceUUID;
+ ServiceCallback_t serviceCallback;
+ UUID matchingCharacteristicUUID;
+ CharacteristicCallback_t characteristicCallback;
+};
+
#endif // ifndef __SERVICE_DISOVERY_H__
\ No newline at end of file
--- a/ble/UUID.h Tue Jan 12 19:47:52 2016 +0000
+++ b/ble/UUID.h Wed Apr 06 19:13:46 2016 +0100
@@ -1,227 +1,143 @@
-/* mbed Microcontroller Library
- * Copyright (c) 2006-2013 ARM Limited
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __UUID_H__
-#define __UUID_H__
-
-#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 {
- UUID_TYPE_SHORT = 0, // Short BLE UUID.
- 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.
- *
- * @note The UUID is a unique 128-bit (16 byte) ID used to identify
- * different service or characteristics on the BLE device.
- *
- * @param longUUID
- * The 128-bit (16-byte) UUID value.
- * @param order
- * The bit order of the UUID, MSB by default.
- */
- UUID(const LongUUIDBytes_t longUUID, ByteOrder_t order = UUID::MSB) : type(UUID_TYPE_LONG), baseUUID(), shortUUID(0) {
- setupLong(longUUID, order);
- }
-
- /**
- * Creates a new 16-bit UUID.
- *
- * @note The UUID is a unique 16-bit (2 byte) ID used to identify
- * different service or characteristics on the BLE device.
- *
- * For efficiency, and because 16 bytes would take a large chunk of the
- * 27-byte data payload length of the Link Layer, the BLE specification adds
- * two additional UUID formats: 16-bit and 32-bit UUIDs. These shortened
- * formats can be used only with UUIDs that are defined in the Bluetooth
- * specification (listed by the Bluetooth SIG as standard
- * Bluetooth UUIDs).
- *
- * To reconstruct the full 128-bit UUID from the shortened version, insert
- * the 16-bit short value (indicated by xxxx, including leading zeros) into
- * the Bluetooth Base UUID:
- *
- * 0000xxxx-0000-1000-8000-00805F9B34FB
- *
- * @note Shortening is not available for UUIDs that are not derived from the
- * Bluetooth Base UUID. Such non-standard UUIDs are commonly called
- * vendor-specific UUIDs. In these cases, you’ll need to use the full
- * 128-bit UUID value at all times.
- *
- * @note We don't yet support 32-bit shortened UUIDs.
- */
- UUID(ShortUUIDBytes_t _shortUUID) : type(UUID_TYPE_SHORT), baseUUID(), shortUUID(_shortUUID) {
- /* Empty */
- }
-
- UUID(const UUID &source) {
- type = source.type;
- shortUUID = source.shortUUID;
- memcpy(baseUUID, source.baseUUID, LENGTH_OF_LONG_UUID);
- }
-
- UUID(void) : type(UUID_TYPE_SHORT), shortUUID(BLE_UUID_UNKNOWN) {
- /* empty */
- }
-
- /**
- * 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, ByteOrder_t order = UUID::MSB) {
- type = UUID_TYPE_LONG;
- 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:
- UUID_Type_t shortOrLong(void) const {return type; }
- const uint8_t *getBaseUUID(void) const {
- if (type == UUID_TYPE_SHORT) {
- return (const uint8_t*)&shortUUID;
- } else {
- return baseUUID;
- }
- }
-
- ShortUUIDBytes_t getShortUUID(void) const {return shortUUID;}
- uint8_t getLen(void) const {
- return ((type == UUID_TYPE_SHORT) ? sizeof(ShortUUIDBytes_t) : LENGTH_OF_LONG_UUID);
- }
-
- bool operator== (const UUID &other) const {
- if ((this->type == UUID_TYPE_SHORT) && (other.type == UUID_TYPE_SHORT) &&
- (this->shortUUID == other.shortUUID)) {
- return true;
- }
-
- if ((this->type == UUID_TYPE_LONG) && (other.type == UUID_TYPE_LONG) &&
- (memcmp(this->baseUUID, other.baseUUID, LENGTH_OF_LONG_UUID) == 0)) {
- return true;
- }
-
- return false;
- }
-
- bool operator!= (const UUID &other) const {
- return !(*this == other);
- }
-
-private:
- UUID_Type_t type; // UUID_TYPE_SHORT or UUID_TYPE_LONG
- LongUUIDBytes_t baseUUID; // The long UUID
- ShortUUIDBytes_t shortUUID; // 16 bit UUID
-};
-
+/* mbed Microcontroller Library
+ * Copyright (c) 2006-2013 ARM Limited
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __UUID_H__
+#define __UUID_H__
+
+#include <stdint.h>
+#include <string.h>
+
+#include "blecommon.h"
+
+class UUID {
+public:
+ enum UUID_Type_t {
+ UUID_TYPE_SHORT = 0, // Short BLE UUID.
+ UUID_TYPE_LONG = 1 // Full 128-bit UUID.
+ };
+
+ typedef uint16_t ShortUUIDBytes_t;
+
+ static const unsigned LENGTH_OF_LONG_UUID = 16;
+ typedef uint8_t LongUUIDBytes_t[LENGTH_OF_LONG_UUID];
+
+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 longUUID
+ * The 128-bit (16-byte) UUID value, MSB first (big-endian).
+ */
+ UUID(const LongUUIDBytes_t longUUID) : type(UUID_TYPE_LONG), baseUUID(), shortUUID(0) {
+ setupLong(longUUID);
+ }
+
+ /**
+ * Creates a new 16-bit UUID.
+ *
+ * @note The UUID is a unique 16-bit (2 byte) ID used to identify
+ * different service or characteristics on the BLE device.
+ *
+ * For efficiency, and because 16 bytes would take a large chunk of the
+ * 27-byte data payload length of the Link Layer, the BLE specification adds
+ * two additional UUID formats: 16-bit and 32-bit UUIDs. These shortened
+ * formats can be used only with UUIDs that are defined in the Bluetooth
+ * specification (listed by the Bluetooth SIG as standard
+ * Bluetooth UUIDs).
+ *
+ * To reconstruct the full 128-bit UUID from the shortened version, insert
+ * the 16-bit short value (indicated by xxxx, including leading zeros) into
+ * the Bluetooth Base UUID:
+ *
+ * 0000xxxx-0000-1000-8000-00805F9B34FB
+ *
+ * @note Shortening is not available for UUIDs that are not derived from the
+ * Bluetooth Base UUID. Such non-standard UUIDs are commonly called
+ * vendor-specific UUIDs. In these cases, you’ll need to use the full
+ * 128-bit UUID value at all times.
+ *
+ * @note We don't yet support 32-bit shortened UUIDs.
+ */
+ UUID(ShortUUIDBytes_t _shortUUID) : type(UUID_TYPE_SHORT), baseUUID(), shortUUID(_shortUUID) {
+ /* Empty */
+ }
+
+ UUID(const UUID &source) {
+ type = source.type;
+ shortUUID = source.shortUUID;
+ memcpy(baseUUID, source.baseUUID, LENGTH_OF_LONG_UUID);
+ }
+
+ UUID(void) : type(UUID_TYPE_SHORT), shortUUID(BLE_UUID_UNKNOWN) {
+ /* empty */
+ }
+
+ /**
+ * 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) {
+ type = UUID_TYPE_LONG;
+ memcpy(baseUUID, longUUID, LENGTH_OF_LONG_UUID);
+ shortUUID = (uint16_t)((longUUID[2] << 8) | (longUUID[3]));
+ }
+
+public:
+ UUID_Type_t shortOrLong(void) const {return type; }
+ const uint8_t *getBaseUUID(void) const {
+ if (type == UUID_TYPE_SHORT) {
+ return (const uint8_t*)&shortUUID;
+ } else {
+ return baseUUID;
+ }
+ }
+
+ ShortUUIDBytes_t getShortUUID(void) const {return shortUUID;}
+ uint8_t getLen(void) const {
+ return ((type == UUID_TYPE_SHORT) ? sizeof(ShortUUIDBytes_t) : LENGTH_OF_LONG_UUID);
+ }
+
+ bool operator== (const UUID &other) const {
+ if ((this->type == UUID_TYPE_SHORT) && (other.type == UUID_TYPE_SHORT) &&
+ (this->shortUUID == other.shortUUID)) {
+ return true;
+ }
+
+ if ((this->type == UUID_TYPE_LONG) && (other.type == UUID_TYPE_LONG) &&
+ (memcmp(this->baseUUID, other.baseUUID, LENGTH_OF_LONG_UUID) == 0)) {
+ return true;
+ }
+
+ return false;
+ }
+
+ bool operator!= (const UUID &other) const {
+ return !(*this == other);
+ }
+
+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).
+};
+
#endif // ifndef __UUID_H__
\ No newline at end of file
--- a/ble/blecommon.h Tue Jan 12 19:47:52 2016 +0000
+++ b/ble/blecommon.h Wed Apr 06 19:13:46 2016 +0100
@@ -1,81 +1,136 @@
-/* mbed Microcontroller Library
- * Copyright (c) 2006-2013 ARM Limited
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __BLE_COMMON_H__
-#define __BLE_COMMON_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-
-/*! @brief Assigned values for BLE UUIDs. */
-enum {
- BLE_UUID_UNKNOWN = 0x0000, /**< Reserved UUID. */
- BLE_UUID_SERVICE_PRIMARY = 0x2800, /**< Primary Service. */
- BLE_UUID_SERVICE_SECONDARY = 0x2801, /**< Secondary Service. */
- BLE_UUID_SERVICE_INCLUDE = 0x2802, /**< Include. */
- BLE_UUID_CHARACTERISTIC = 0x2803, /**< Characteristic. */
- BLE_UUID_DESCRIPTOR_CHAR_EXT_PROP = 0x2900, /**< Characteristic Extended Properties Descriptor. */
- BLE_UUID_DESCRIPTOR_CHAR_USER_DESC = 0x2901, /**< Characteristic User Description Descriptor. */
- BLE_UUID_DESCRIPTOR_CLIENT_CHAR_CONFIG = 0x2902, /**< Client Characteristic Configuration Descriptor. */
- BLE_UUID_DESCRIPTOR_SERVER_CHAR_CONFIG = 0x2903, /**< Server Characteristic Configuration Descriptor. */
- BLE_UUID_DESCRIPTOR_CHAR_PRESENTATION_FORMAT = 0x2904, /**< Characteristic Presentation Format Descriptor. */
- BLE_UUID_DESCRIPTOR_CHAR_AGGREGATE_FORMAT = 0x2905, /**< Characteristic Aggregate Format Descriptor. */
-
-/* GATT specific UUIDs */
- BLE_UUID_GATT = 0x1801, /**< Generic Attribute Profile. */
- BLE_UUID_GATT_CHARACTERISTIC_SERVICE_CHANGED = 0x2A05, /**< Service Changed Characteristic. */
-
-/* GAP specific UUIDs */
- BLE_UUID_GAP = 0x1800, /**< Generic Access Profile. */
- BLE_UUID_GAP_CHARACTERISTIC_DEVICE_NAME = 0x2A00, /**< Device Name Characteristic. */
- BLE_UUID_GAP_CHARACTERISTIC_APPEARANCE = 0x2A01, /**< Appearance Characteristic. */
- BLE_UUID_GAP_CHARACTERISTIC_PPF = 0x2A02, /**< Peripheral Privacy Flag Characteristic. */
- BLE_UUID_GAP_CHARACTERISTIC_RECONN_ADDR = 0x2A03, /**< Reconnection Address Characteristic. */
- BLE_UUID_GAP_CHARACTERISTIC_PPCP = 0x2A04, /**< Peripheral Preferred Connection Parameters Characteristic. */
-};
-
-/*! @brief Error codes for the BLE API. */
-enum ble_error_t {
- BLE_ERROR_NONE = 0, /**< No error. */
- BLE_ERROR_BUFFER_OVERFLOW = 1, /**< The requested action would cause a buffer overflow and has been aborted. */
- BLE_ERROR_NOT_IMPLEMENTED = 2, /**< Requested a feature that isn't yet implemented or isn't supported by the target HW. */
- BLE_ERROR_PARAM_OUT_OF_RANGE = 3, /**< One of the supplied parameters is outside the valid range. */
- BLE_ERROR_INVALID_PARAM = 4, /**< One of the supplied parameters is invalid. */
- BLE_STACK_BUSY = 5, /**< The stack is busy. */
- BLE_ERROR_INVALID_STATE = 6, /**< Invalid state. */
- BLE_ERROR_NO_MEM = 7, /**< Out of memory */
- BLE_ERROR_OPERATION_NOT_PERMITTED = 8,
- BLE_ERROR_INITIALIZATION_INCOMPLETE = 9,
- BLE_ERROR_ALREADY_INITIALIZED = 10,
- BLE_ERROR_UNSPECIFIED = 11, /**< Unknown error. */
- BLE_ERROR_INTERNAL_STACK_FAILURE = 12, /**< The platform-specific stack failed */
-};
-
-/** @brief Default MTU size. */
-static const unsigned BLE_GATT_MTU_SIZE_DEFAULT = 23;
-
-enum HVXType_t {
- BLE_HVX_NOTIFICATION = 0x01, /**< Handle Value Notification. */
- BLE_HVX_INDICATION = 0x02, /**< Handle Value Indication. */
-};
-
-#ifdef __cplusplus
-}
-#endif
-
+/* mbed Microcontroller Library
+ * Copyright (c) 2006-2013 ARM Limited
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __BLE_COMMON_H__
+#define __BLE_COMMON_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*! @brief Assigned values for BLE UUIDs. */
+enum {
+ BLE_UUID_UNKNOWN = 0x0000, /**< Reserved UUID. */
+ BLE_UUID_SERVICE_PRIMARY = 0x2800, /**< Primary Service. */
+ BLE_UUID_SERVICE_SECONDARY = 0x2801, /**< Secondary Service. */
+ BLE_UUID_SERVICE_INCLUDE = 0x2802, /**< Include. */
+ BLE_UUID_CHARACTERISTIC = 0x2803, /**< Characteristic. */
+ BLE_UUID_DESCRIPTOR_CHAR_EXT_PROP = 0x2900, /**< Characteristic Extended Properties Descriptor. */
+ BLE_UUID_DESCRIPTOR_CHAR_USER_DESC = 0x2901, /**< Characteristic User Description Descriptor. */
+ BLE_UUID_DESCRIPTOR_CLIENT_CHAR_CONFIG = 0x2902, /**< Client Characteristic Configuration Descriptor. */
+ BLE_UUID_DESCRIPTOR_SERVER_CHAR_CONFIG = 0x2903, /**< Server Characteristic Configuration Descriptor. */
+ BLE_UUID_DESCRIPTOR_CHAR_PRESENTATION_FORMAT = 0x2904, /**< Characteristic Presentation Format Descriptor. */
+ BLE_UUID_DESCRIPTOR_CHAR_AGGREGATE_FORMAT = 0x2905, /**< Characteristic Aggregate Format Descriptor. */
+
+/* GATT specific UUIDs */
+ BLE_UUID_GATT = 0x1801, /**< Generic Attribute Profile. */
+ BLE_UUID_GATT_CHARACTERISTIC_SERVICE_CHANGED = 0x2A05, /**< Service Changed Characteristic. */
+
+/* GAP specific UUIDs */
+ BLE_UUID_GAP = 0x1800, /**< Generic Access Profile. */
+ BLE_UUID_GAP_CHARACTERISTIC_DEVICE_NAME = 0x2A00, /**< Device Name Characteristic. */
+ BLE_UUID_GAP_CHARACTERISTIC_APPEARANCE = 0x2A01, /**< Appearance Characteristic. */
+ BLE_UUID_GAP_CHARACTERISTIC_PPF = 0x2A02, /**< Peripheral Privacy Flag Characteristic. */
+ BLE_UUID_GAP_CHARACTERISTIC_RECONN_ADDR = 0x2A03, /**< Reconnection Address Characteristic. */
+ BLE_UUID_GAP_CHARACTERISTIC_PPCP = 0x2A04, /**< Peripheral Preferred Connection Parameters Characteristic. */
+};
+
+/*! Bluetooth appearance values.
+ * @note Retrieved from http://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.gap.appearance.xml
+ */
+enum {
+ BLE_APPEARANCE_UNKNOWN = 0, /**< Unknown. */
+ BLE_APPEARANCE_GENERIC_PHONE = 64, /**< Generic Phone. */
+ BLE_APPEARANCE_GENERIC_COMPUTER = 128, /**< Generic Computer. */
+ BLE_APPEARANCE_GENERIC_WATCH = 192, /**< Generic Watch. */
+ BLE_APPEARANCE_WATCH_SPORTS_WATCH = 193, /**< Watch: Sports Watch. */
+ BLE_APPEARANCE_GENERIC_CLOCK = 256, /**< Generic Clock. */
+ BLE_APPEARANCE_GENERIC_DISPLAY = 320, /**< Generic Display. */
+ BLE_APPEARANCE_GENERIC_REMOTE_CONTROL = 384, /**< Generic Remote Control. */
+ BLE_APPEARANCE_GENERIC_EYE_GLASSES = 448, /**< Generic Eye-glasses. */
+ BLE_APPEARANCE_GENERIC_TAG = 512, /**< Generic Tag. */
+ BLE_APPEARANCE_GENERIC_KEYRING = 576, /**< Generic Keyring. */
+ BLE_APPEARANCE_GENERIC_MEDIA_PLAYER = 640, /**< Generic Media Player. */
+ BLE_APPEARANCE_GENERIC_BARCODE_SCANNER = 704, /**< Generic Barcode Scanner. */
+ BLE_APPEARANCE_GENERIC_THERMOMETER = 768, /**< Generic Thermometer. */
+ BLE_APPEARANCE_THERMOMETER_EAR = 769, /**< Thermometer: Ear. */
+ BLE_APPEARANCE_GENERIC_HEART_RATE_SENSOR = 832, /**< Generic Heart Rate Sensor. */
+ BLE_APPEARANCE_HEART_RATE_SENSOR_HEART_RATE_BELT = 833, /**< Heart Rate Sensor: Heart Rate Belt. */
+ BLE_APPEARANCE_GENERIC_BLOOD_PRESSURE = 896, /**< Generic Blood Pressure. */
+ BLE_APPEARANCE_BLOOD_PRESSURE_ARM = 897, /**< Blood Pressure: Arm. */
+ BLE_APPEARANCE_BLOOD_PRESSURE_WRIST = 898, /**< Blood Pressure: Wrist. */
+ BLE_APPEARANCE_GENERIC_HID = 960, /**< Human Interface Device (HID). */
+ BLE_APPEARANCE_HID_KEYBOARD = 961, /**< Keyboard (HID subtype). */
+ BLE_APPEARANCE_HID_MOUSE = 962, /**< Mouse (HID subtype). */
+ BLE_APPEARANCE_HID_JOYSTICK = 963, /**< Joystick (HID subtype). */
+ BLE_APPEARANCE_HID_GAMEPAD = 964, /**< Gamepad (HID subtype). */
+ BLE_APPEARANCE_HID_DIGITIZERSUBTYPE = 965, /**< Digitizer Tablet (HID subtype). */
+ BLE_APPEARANCE_HID_CARD_READER = 966, /**< Card Reader (HID subtype). */
+ BLE_APPEARANCE_HID_DIGITAL_PEN = 967, /**< Digital Pen (HID subtype). */
+ BLE_APPEARANCE_HID_BARCODE = 968, /**< Barcode Scanner (HID subtype). */
+ BLE_APPEARANCE_GENERIC_GLUCOSE_METER = 1024, /**< Generic Glucose Meter. */
+ BLE_APPEARANCE_GENERIC_RUNNING_WALKING_SENSOR = 1088, /**< Generic Running Walking Sensor. */
+ BLE_APPEARANCE_RUNNING_WALKING_SENSOR_IN_SHOE = 1089, /**< Running Walking Sensor: In-Shoe. */
+ BLE_APPEARANCE_RUNNING_WALKING_SENSOR_ON_SHOE = 1090, /**< Running Walking Sensor: On-Shoe. */
+ BLE_APPEARANCE_RUNNING_WALKING_SENSOR_ON_HIP = 1091, /**< Running Walking Sensor: On-Hip. */
+ BLE_APPEARANCE_GENERIC_CYCLING = 1152, /**< Generic Cycling. */
+ BLE_APPEARANCE_CYCLING_CYCLING_COMPUTER = 1153, /**< Cycling: Cycling Computer. */
+ BLE_APPEARANCE_CYCLING_SPEED_SENSOR = 1154, /**< Cycling: Speed Sensor. */
+ BLE_APPEARANCE_CYCLING_CADENCE_SENSOR = 1155, /**< Cycling: Cadence Sensor. */
+ BLE_APPEARANCE_CYCLING_POWER_SENSOR = 1156, /**< Cycling: Power Sensor. */
+ BLE_APPEARANCE_CYCLING_SPEED_CADENCE_SENSOR = 1157, /**< Cycling: Speed and Cadence Sensor. */
+ BLE_APPEARANCE_GENERIC_PULSE_OXIMETER = 3136, /**< Generic Pulse Oximeter. */
+ BLE_APPEARANCE_PULSE_OXIMETER_FINGERTIP = 3137, /**< Fingertip (Pulse Oximeter subtype). */
+ BLE_APPEARANCE_PULSE_OXIMETER_WRIST_WORN = 3138, /**< Wrist Worn (Pulse Oximeter subtype). */
+ BLE_APPEARANCE_GENERIC_WEIGHT_SCALE = 3200, /**< Generic Weight Scale. */
+ BLE_APPEARANCE_GENERIC_OUTDOOR_SPORTS_ACT = 5184, /**< Generic Outdoor Sports Activity. */
+ BLE_APPEARANCE_OUTDOOR_SPORTS_ACT_LOC_DISP = 5185, /**< Location Display Device (Outdoor Sports Activity subtype). */
+ BLE_APPEARANCE_OUTDOOR_SPORTS_ACT_LOC_AND_NAV_DISP = 5186, /**< Location and Navigation Display Device (Outdoor Sports Activity subtype). */
+ BLE_APPEARANCE_OUTDOOR_SPORTS_ACT_LOC_POD = 5187, /**< Location Pod (Outdoor Sports Activity subtype). */
+ BLE_APPEARANCE_OUTDOOR_SPORTS_ACT_LOC_AND_NAV_POD = 5188, /**< Location and Navigation Pod (Outdoor Sports Activity subtype). */
+};
+
+
+/*! @brief Error codes for the BLE API. */
+enum ble_error_t {
+ BLE_ERROR_NONE = 0, /**< No error. */
+ BLE_ERROR_BUFFER_OVERFLOW = 1, /**< The requested action would cause a buffer overflow and has been aborted. */
+ BLE_ERROR_NOT_IMPLEMENTED = 2, /**< Requested a feature that isn't yet implemented or isn't supported by the target HW. */
+ BLE_ERROR_PARAM_OUT_OF_RANGE = 3, /**< One of the supplied parameters is outside the valid range. */
+ BLE_ERROR_INVALID_PARAM = 4, /**< One of the supplied parameters is invalid. */
+ BLE_STACK_BUSY = 5, /**< The stack is busy. */
+ BLE_ERROR_INVALID_STATE = 6, /**< Invalid state. */
+ BLE_ERROR_NO_MEM = 7, /**< Out of memory */
+ BLE_ERROR_OPERATION_NOT_PERMITTED = 8,
+ BLE_ERROR_INITIALIZATION_INCOMPLETE = 9,
+ BLE_ERROR_ALREADY_INITIALIZED = 10,
+ BLE_ERROR_UNSPECIFIED = 11, /**< Unknown error. */
+};
+
+/** @brief Default MTU size. */
+static const unsigned BLE_GATT_MTU_SIZE_DEFAULT = 23;
+
+enum HVXType_t {
+ BLE_HVX_NOTIFICATION = 0x01, /**< Handle Value Notification. */
+ BLE_HVX_INDICATION = 0x02, /**< Handle Value Indication. */
+};
+
+#ifdef __cplusplus
+}
+#endif
+
#endif // ifndef __BLE_COMMON_H__
\ No newline at end of file
--- a/ble/deprecate.h Tue Jan 12 19:47:52 2016 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,26 +0,0 @@ -/* mbed Microcontroller Library - * Copyright (c) 2006-2013 ARM Limited - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __DEPRECATE_H__ -#define __DEPRECATE_H__ - -#ifdef YOTTA_CFG_MBED_OS - #include "compiler-polyfill/attributes.h" -#else - #define __deprecated_message(msg) -#endif - -#endif \ No newline at end of file
--- a/ble/services/EnvironmentalService.h Tue Jan 12 19:47:52 2016 +0000
+++ b/ble/services/EnvironmentalService.h Wed Apr 06 19:13:46 2016 +0100
@@ -1,106 +1,106 @@
-/* mbed Microcontroller Library
- * Copyright (c) 2006-2013 ARM Limited
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __BLE_ENVIRONMENTAL_SERVICE_H__
-#define __BLE_ENVIRONMENTAL_SERVICE_H__
-
-#include "ble/BLE.h"
-
-/**
-* @class EnvironmentalService
-* @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 {
-public:
- typedef int16_t TemperatureType_t;
- typedef uint16_t HumidityType_t;
- typedef uint32_t PressureType_t;
-
- /**
- * @brief EnvironmentalService constructor.
- * @param ble Reference to BLE device.
- * @param temperature_en Enable this characteristic.
- * @param humidity_en Enable this characteristic.
- * @param pressure_en Enable this characteristic.
- */
- EnvironmentalService(BLE& _ble) :
- ble(_ble),
- temperatureCharacteristic(GattCharacteristic::UUID_TEMPERATURE_CHAR, &temperature),
- humidityCharacteristic(GattCharacteristic::UUID_HUMIDITY_CHAR, &humidity),
- pressureCharacteristic(GattCharacteristic::UUID_PRESSURE_CHAR, &pressure)
- {
- static bool serviceAdded = false; /* We should only ever need to add the information service once. */
- if (serviceAdded) {
- return;
- }
-
- GattCharacteristic *charTable[] = { &humidityCharacteristic,
- &pressureCharacteristic,
- &temperatureCharacteristic };
-
- GattService environmentalService(GattService::UUID_ENVIRONMENTAL_SERVICE, charTable, sizeof(charTable) / sizeof(GattCharacteristic *));
-
- ble.gattServer().addService(environmentalService);
- serviceAdded = true;
- }
-
- /**
- * @brief Update humidity characteristic.
- * @param newHumidityVal New humidity measurement.
- */
- void updateHumidity(HumidityType_t newHumidityVal)
- {
- humidity = (HumidityType_t) (newHumidityVal * 100);
- ble.gattServer().write(humidityCharacteristic.getValueHandle(), (uint8_t *) &humidity, sizeof(HumidityType_t));
- }
-
- /**
- * @brief Update pressure characteristic.
- * @param newPressureVal New pressure measurement.
- */
- void updatePressure(PressureType_t newPressureVal)
- {
- pressure = (PressureType_t) (newPressureVal * 10);
- ble.gattServer().write(pressureCharacteristic.getValueHandle(), (uint8_t *) &pressure, sizeof(PressureType_t));
- }
-
- /**
- * @brief Update temperature characteristic.
- * @param newTemperatureVal New temperature measurement.
- */
- void updateTemperature(float newTemperatureVal)
- {
- temperature = (TemperatureType_t) (newTemperatureVal * 100);
- ble.gattServer().write(temperatureCharacteristic.getValueHandle(), (uint8_t *) &temperature, sizeof(TemperatureType_t));
- }
-
-private:
- BLE& ble;
-
- TemperatureType_t temperature;
- HumidityType_t humidity;
- PressureType_t pressure;
-
- ReadOnlyGattCharacteristic<TemperatureType_t> temperatureCharacteristic;
- ReadOnlyGattCharacteristic<HumidityType_t> humidityCharacteristic;
- ReadOnlyGattCharacteristic<PressureType_t> pressureCharacteristic;
-};
-
+/* mbed Microcontroller Library
+ * Copyright (c) 2006-2013 ARM Limited
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __BLE_ENVIRONMENTAL_SERVICE_H__
+#define __BLE_ENVIRONMENTAL_SERVICE_H__
+
+#include "ble/BLE.h"
+
+/**
+* @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>
+* Pressure: https://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.pressure.xml
+*/
+class EnvironmentalService {
+public:
+ typedef int16_t TemperatureType_t;
+ typedef uint16_t HumidityType_t;
+ typedef uint32_t PressureType_t;
+
+ /**
+ * @brief EnvironmentalService constructor.
+ * @param ble Reference to BLE device.
+ * @param temperature_en Enable this characteristic.
+ * @param humidity_en Enable this characteristic.
+ * @param pressure_en Enable this characteristic.
+ */
+ EnvironmentalService(BLE& _ble) :
+ ble(_ble),
+ temperatureCharacteristic(GattCharacteristic::UUID_TEMPERATURE_CHAR, &temperature),
+ humidityCharacteristic(GattCharacteristic::UUID_HUMIDITY_CHAR, &humidity),
+ pressureCharacteristic(GattCharacteristic::UUID_PRESSURE_CHAR, &pressure)
+ {
+ static bool serviceAdded = false; /* We should only ever need to add the information service once. */
+ if (serviceAdded) {
+ return;
+ }
+
+ GattCharacteristic *charTable[] = { &humidityCharacteristic,
+ &pressureCharacteristic,
+ &temperatureCharacteristic };
+
+ GattService environmentalService(GattService::UUID_ENVIRONMENTAL_SERVICE, charTable, sizeof(charTable) / sizeof(GattCharacteristic *));
+
+ ble.gattServer().addService(environmentalService);
+ serviceAdded = true;
+ }
+
+ /**
+ * @brief Update humidity characteristic.
+ * @param newHumidityVal New humidity measurement.
+ */
+ void updateHumidity(HumidityType_t newHumidityVal)
+ {
+ humidity = (HumidityType_t) (newHumidityVal * 100);
+ ble.gattServer().write(humidityCharacteristic.getValueHandle(), (uint8_t *) &humidity, sizeof(HumidityType_t));
+ }
+
+ /**
+ * @brief Update pressure characteristic.
+ * @param newPressureVal New pressure measurement.
+ */
+ void updatePressure(PressureType_t newPressureVal)
+ {
+ pressure = (PressureType_t) (newPressureVal * 10);
+ ble.gattServer().write(pressureCharacteristic.getValueHandle(), (uint8_t *) &pressure, sizeof(PressureType_t));
+ }
+
+ /**
+ * @brief Update temperature characteristic.
+ * @param newTemperatureVal New temperature measurement.
+ */
+ void updateTemperature(float newTemperatureVal)
+ {
+ temperature = (TemperatureType_t) (newTemperatureVal * 100);
+ ble.gattServer().write(temperatureCharacteristic.getValueHandle(), (uint8_t *) &temperature, sizeof(TemperatureType_t));
+ }
+
+private:
+ BLE& ble;
+
+ TemperatureType_t temperature;
+ HumidityType_t humidity;
+ PressureType_t pressure;
+
+ ReadOnlyGattCharacteristic<TemperatureType_t> temperatureCharacteristic;
+ ReadOnlyGattCharacteristic<HumidityType_t> humidityCharacteristic;
+ ReadOnlyGattCharacteristic<PressureType_t> pressureCharacteristic;
+};
+
#endif /* #ifndef __BLE_ENVIRONMENTAL_SERVICE_H__*/
\ No newline at end of file
--- a/ble/services/HealthThermometerService.h Tue Jan 12 19:47:52 2016 +0000
+++ b/ble/services/HealthThermometerService.h Wed Apr 06 19:13:46 2016 +0100
@@ -1,150 +1,150 @@
-/* mbed Microcontroller Library
- * Copyright (c) 2006-2013 ARM Limited
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __BLE_HEALTH_THERMOMETER_SERVICE_H__
-#define __BLE_HEALTH_THERMOMETER_SERVICE_H__
-
-#include "ble/BLE.h"
-
-/**
-* @class HealthThermometerService
-* @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 SensorLocation_t {
- 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, /*!< 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.
- * @param[in] _location
- */
- HealthThermometerService(BLE &_ble, float initialTemp, uint8_t _location) :
- ble(_ble),
- valueBytes(initialTemp),
- tempMeasurement(GattCharacteristic::UUID_TEMPERATURE_MEASUREMENT_CHAR, (TemperatureValueBytes *)valueBytes.getPointer(), GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY),
- tempLocation(GattCharacteristic::UUID_TEMPERATURE_TYPE_CHAR, &_location) {
-
- GattCharacteristic *hrmChars[] = {&tempMeasurement, &tempLocation, };
- GattService hrmService(GattService::UUID_HEALTH_THERMOMETER_SERVICE, hrmChars, sizeof(hrmChars) / sizeof(GattCharacteristic *));
-
- ble.addService(hrmService);
- }
-
- /**
- * @brief Update the temperature being broadcast.
- *
- * @param[in] temperature
- * Floating point value of the temperature.
- *
- */
- void updateTemperature(float temperature) {
- if (ble.getGapState().connected) {
- valueBytes.updateTemperature(temperature);
- ble.gattServer().write(tempMeasurement.getValueHandle(), valueBytes.getPointer(), sizeof(TemperatureValueBytes));
- }
- }
-
- /**
- * @brief Update the location.
- * @param loc
- * 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 temperature characteristic. */
- struct TemperatureValueBytes {
- static const unsigned OFFSET_OF_FLAGS = 0;
- static const unsigned OFFSET_OF_VALUE = OFFSET_OF_FLAGS + sizeof(uint8_t);
- static const unsigned SIZEOF_VALUE_BYTES = sizeof(uint8_t) + sizeof(float);
-
- static const unsigned TEMPERATURE_UNITS_FLAG_POS = 0;
- static const unsigned TIMESTAMP_FLAG_POS = 1;
- static const unsigned TEMPERATURE_TYPE_FLAG_POS = 2;
-
- static const uint8_t TEMPERATURE_UNITS_CELSIUS = 0;
- static const uint8_t TEMPERATURE_UNITS_FAHRENHEIT = 1;
-
- TemperatureValueBytes(float initialTemperature) : bytes() {
- /* 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);
- updateTemperature(initialTemperature);
- }
-
- void updateTemperature(float temp) {
- uint32_t temp_ieee11073 = quick_ieee11073_from_float(temp);
- memcpy(&bytes[OFFSET_OF_VALUE], &temp_ieee11073, sizeof(float));
- }
-
- uint8_t *getPointer(void) {
- return bytes;
- }
-
- const uint8_t *getPointer(void) const {
- return bytes;
- }
-
-private:
- /**
- * @brief A very quick conversion between a float temperature and 11073-20601 FLOAT-Type.
- * @param temperature The temperature as a float.
- * @return The temperature in 11073-20601 FLOAT-Type format.
- */
- uint32_t quick_ieee11073_from_float(float temperature) {
- 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 */
- uint8_t bytes[SIZEOF_VALUE_BYTES];
- };
-
-protected:
- BLE &ble;
- TemperatureValueBytes valueBytes;
- ReadOnlyGattCharacteristic<TemperatureValueBytes> tempMeasurement;
- ReadOnlyGattCharacteristic<uint8_t> tempLocation;
-};
-
+/* mbed Microcontroller Library
+ * Copyright (c) 2006-2013 ARM Limited
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __BLE_HEALTH_THERMOMETER_SERVICE_H__
+#define __BLE_HEALTH_THERMOMETER_SERVICE_H__
+
+#include "ble/BLE.h"
+
+/**
+* @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>
+* 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 SensorLocation_t {
+ 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 */
+ };
+
+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
+ * @param[in] _location
+ */
+ HealthThermometerService(BLE &_ble, float initialTemp, uint8_t _location) :
+ ble(_ble),
+ valueBytes(initialTemp),
+ tempMeasurement(GattCharacteristic::UUID_TEMPERATURE_MEASUREMENT_CHAR, (TemperatureValueBytes *)valueBytes.getPointer(), GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY),
+ tempLocation(GattCharacteristic::UUID_TEMPERATURE_TYPE_CHAR, &_location) {
+
+ GattCharacteristic *hrmChars[] = {&tempMeasurement, &tempLocation, };
+ GattService hrmService(GattService::UUID_HEALTH_THERMOMETER_SERVICE, hrmChars, sizeof(hrmChars) / sizeof(GattCharacteristic *));
+
+ ble.addService(hrmService);
+ }
+
+ /**
+ * @brief Update the temperature being broadcast
+ *
+ * @param[in] temperature
+ * Floating point value of the temperature
+ *
+ */
+ void updateTemperature(float temperature) {
+ if (ble.getGapState().connected) {
+ valueBytes.updateTemperature(temperature);
+ ble.gattServer().write(tempMeasurement.getValueHandle(), valueBytes.getPointer(), sizeof(TemperatureValueBytes));
+ }
+ }
+
+ /**
+ * @brief Update the location.
+ * @param loc
+ * 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. */
+ struct TemperatureValueBytes {
+ static const unsigned OFFSET_OF_FLAGS = 0;
+ static const unsigned OFFSET_OF_VALUE = OFFSET_OF_FLAGS + sizeof(uint8_t);
+ static const unsigned SIZEOF_VALUE_BYTES = sizeof(uint8_t) + sizeof(float);
+
+ static const unsigned TEMPERATURE_UNITS_FLAG_POS = 0;
+ static const unsigned TIMESTAMP_FLAG_POS = 1;
+ static const unsigned TEMPERATURE_TYPE_FLAG_POS = 2;
+
+ static const uint8_t TEMPERATURE_UNITS_CELSIUS = 0;
+ static const uint8_t TEMPERATURE_UNITS_FAHRENHEIT = 1;
+
+ TemperatureValueBytes(float initialTemperature) : bytes() {
+ /* 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);
+ updateTemperature(initialTemperature);
+ }
+
+ void updateTemperature(float temp) {
+ uint32_t temp_ieee11073 = quick_ieee11073_from_float(temp);
+ memcpy(&bytes[OFFSET_OF_VALUE], &temp_ieee11073, sizeof(float));
+ }
+
+ uint8_t *getPointer(void) {
+ return bytes;
+ }
+
+ const uint8_t *getPointer(void) const {
+ return bytes;
+ }
+
+private:
+ /**
+ * @brief A very quick conversion between a float temperature and 11073-20601 FLOAT-Type.
+ * @param temperature The temperature as a float.
+ * @return The temperature in 11073-20601 FLOAT-Type format.
+ */
+ uint32_t quick_ieee11073_from_float(float temperature) {
+ 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 */
+ uint8_t bytes[SIZEOF_VALUE_BYTES];
+ };
+
+protected:
+ BLE &ble;
+ TemperatureValueBytes valueBytes;
+ ReadOnlyGattCharacteristic<TemperatureValueBytes> tempMeasurement;
+ ReadOnlyGattCharacteristic<uint8_t> tempLocation;
+};
+
#endif /* #ifndef __BLE_HEALTH_THERMOMETER_SERVICE_H__*/
\ No newline at end of file
--- a/ble/services/HeartRateService.h Tue Jan 12 19:47:52 2016 +0000
+++ b/ble/services/HeartRateService.h Wed Apr 06 19:13:46 2016 +0100
@@ -1,194 +1,194 @@
-/* mbed Microcontroller Library
- * Copyright (c) 2006-2013 ARM Limited
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __BLE_HEART_RATE_SERVICE_H__
-#define __BLE_HEART_RATE_SERVICE_H__
-
-#include "ble/BLE.h"
-
-/**
-* @class HeartRateService
-* @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 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. */
- };
-
-public:
- /**
- * @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.
- * @param[in] location
- * Sensor's location.
- */
- HeartRateService(BLE &_ble, uint8_t hrmCounter, uint8_t location) :
- ble(_ble),
- valueBytes(hrmCounter),
- hrmRate(GattCharacteristic::UUID_HEART_RATE_MEASUREMENT_CHAR, valueBytes.getPointer(),
- valueBytes.getNumValueBytes(), HeartRateValueBytes::MAX_VALUE_BYTES,
- GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY),
- hrmLocation(GattCharacteristic::UUID_BODY_SENSOR_LOCATION_CHAR, &location),
- controlPoint(GattCharacteristic::UUID_HEART_RATE_CONTROL_POINT_CHAR, &controlPointValue) {
- setupService();
- }
-
- /**
- * @brief Constructor with a 16-bit HRM Counter value.
- *
- * @param[in] _ble
- * Reference to the underlying BLE.
- * @param[in] hrmCounter (8-bit)
- * Initial value for the HRM counter.
- * @param[in] location
- * Sensor's location.
- */
- HeartRateService(BLE &_ble, uint16_t hrmCounter, uint8_t location) :
- ble(_ble),
- valueBytes(hrmCounter),
- hrmRate(GattCharacteristic::UUID_HEART_RATE_MEASUREMENT_CHAR, valueBytes.getPointer(),
- valueBytes.getNumValueBytes(), HeartRateValueBytes::MAX_VALUE_BYTES,
- GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY),
- hrmLocation(GattCharacteristic::UUID_BODY_SENSOR_LOCATION_CHAR, &location),
- controlPoint(GattCharacteristic::UUID_HEART_RATE_CONTROL_POINT_CHAR, &controlPointValue) {
- setupService();
- }
-
- /**
- * @brief Set a new 8-bit value for the heart rate.
- *
- * @param[in] hrmCounter
- * Heart rate in BPM.
- */
- void updateHeartRate(uint8_t hrmCounter) {
- valueBytes.updateHeartRate(hrmCounter);
- ble.gattServer().write(hrmRate.getValueHandle(), valueBytes.getPointer(), valueBytes.getNumValueBytes());
- }
-
- /**
- * Set a new 16-bit value for the heart rate.
- *
- * @param[in] hrmCounter
- * Heart rate in BPM.
- */
- void updateHeartRate(uint16_t hrmCounter) {
- valueBytes.updateHeartRate(hrmCounter);
- ble.gattServer().write(hrmRate.getValueHandle(), valueBytes.getPointer(), valueBytes.getNumValueBytes());
- }
-
- /**
- * This callback allows the heart rate service to receive updates to the
- * controlPoint characteristic.
- *
- * @param[in] params
- * Information about the characterisitc being updated.
- */
- virtual void onDataWritten(const GattWriteCallbackParams *params) {
- 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
- * ble.onDataWritten(this, &ExtendedHRService::onDataWritten); in
- * your constructor.
- */
- }
- }
-
-protected:
- void setupService(void) {
- GattCharacteristic *charTable[] = {&hrmRate, &hrmLocation, &controlPoint};
- GattService hrmService(GattService::UUID_HEART_RATE_SERVICE, charTable, sizeof(charTable) / sizeof(GattCharacteristic *));
-
- ble.addService(hrmService);
- ble.onDataWritten(this, &HeartRateService::onDataWritten);
- }
-
-protected:
- /* 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, and up to two bytes for heart rate. */
- static const unsigned FLAGS_BYTE_INDEX = 0;
-
- static const unsigned VALUE_FORMAT_BITNUM = 0;
- static const uint8_t VALUE_FORMAT_FLAG = (1 << VALUE_FORMAT_BITNUM);
-
- HeartRateValueBytes(uint8_t hrmCounter) : valueBytes() {
- updateHeartRate(hrmCounter);
- }
-
- HeartRateValueBytes(uint16_t hrmCounter) : valueBytes() {
- updateHeartRate(hrmCounter);
- }
-
- void updateHeartRate(uint8_t hrmCounter) {
- valueBytes[FLAGS_BYTE_INDEX] &= ~VALUE_FORMAT_FLAG;
- valueBytes[FLAGS_BYTE_INDEX + 1] = hrmCounter;
- }
-
- void updateHeartRate(uint16_t hrmCounter) {
- valueBytes[FLAGS_BYTE_INDEX] |= VALUE_FORMAT_FLAG;
- valueBytes[FLAGS_BYTE_INDEX + 1] = (uint8_t)(hrmCounter & 0xFF);
- valueBytes[FLAGS_BYTE_INDEX + 2] = (uint8_t)(hrmCounter >> 8);
- }
-
- uint8_t *getPointer(void) {
- return valueBytes;
- }
-
- const uint8_t *getPointer(void) const {
- return valueBytes;
- }
-
- unsigned getNumValueBytes(void) const {
- return 1 + ((valueBytes[FLAGS_BYTE_INDEX] & VALUE_FORMAT_FLAG) ? sizeof(uint16_t) : sizeof(uint8_t));
- }
-
- 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 */
- uint8_t valueBytes[MAX_VALUE_BYTES];
- };
-
-protected:
- BLE &ble;
-
- HeartRateValueBytes valueBytes;
- uint8_t controlPointValue;
-
- GattCharacteristic hrmRate;
- ReadOnlyGattCharacteristic<uint8_t> hrmLocation;
- WriteOnlyGattCharacteristic<uint8_t> controlPoint;
-};
-
+/* mbed Microcontroller Library
+ * Copyright (c) 2006-2013 ARM Limited
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __BLE_HEART_RATE_SERVICE_H__
+#define __BLE_HEART_RATE_SERVICE_H__
+
+#include "ble/BLE.h"
+
+/**
+* @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>
+* 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.
+ */
+ 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 */
+ };
+
+public:
+ /**
+ * @brief Constructor with 8bit HRM Counter value.
+ *
+ * @param[ref] _ble
+ * Reference to the underlying BLE.
+ * @param[in] hrmCounter (8-bit)
+ * initial value for the hrm counter.
+ * @param[in] location
+ * Sensor's location.
+ */
+ HeartRateService(BLE &_ble, uint8_t hrmCounter, uint8_t location) :
+ ble(_ble),
+ valueBytes(hrmCounter),
+ hrmRate(GattCharacteristic::UUID_HEART_RATE_MEASUREMENT_CHAR, valueBytes.getPointer(),
+ valueBytes.getNumValueBytes(), HeartRateValueBytes::MAX_VALUE_BYTES,
+ GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY),
+ hrmLocation(GattCharacteristic::UUID_BODY_SENSOR_LOCATION_CHAR, &location),
+ controlPoint(GattCharacteristic::UUID_HEART_RATE_CONTROL_POINT_CHAR, &controlPointValue) {
+ setupService();
+ }
+
+ /**
+ * @brief Constructor with a 16-bit HRM Counter value.
+ *
+ * @param[in] _ble
+ * Reference to the underlying BLE.
+ * @param[in] hrmCounter (8-bit)
+ * initial value for the hrm counter.
+ * @param[in] location
+ * Sensor's location.
+ */
+ HeartRateService(BLE &_ble, uint16_t hrmCounter, uint8_t location) :
+ ble(_ble),
+ valueBytes(hrmCounter),
+ hrmRate(GattCharacteristic::UUID_HEART_RATE_MEASUREMENT_CHAR, valueBytes.getPointer(),
+ valueBytes.getNumValueBytes(), HeartRateValueBytes::MAX_VALUE_BYTES,
+ GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY),
+ hrmLocation(GattCharacteristic::UUID_BODY_SENSOR_LOCATION_CHAR, &location),
+ controlPoint(GattCharacteristic::UUID_HEART_RATE_CONTROL_POINT_CHAR, &controlPointValue) {
+ setupService();
+ }
+
+ /**
+ * @brief Set a new 8-bit value for heart rate.
+ *
+ * @param[in] hrmCounter
+ * HeartRate in bpm.
+ */
+ void updateHeartRate(uint8_t hrmCounter) {
+ valueBytes.updateHeartRate(hrmCounter);
+ ble.gattServer().write(hrmRate.getValueHandle(), valueBytes.getPointer(), valueBytes.getNumValueBytes());
+ }
+
+ /**
+ * Set a new 16-bit value for heart rate.
+ *
+ * @param[in] hrmCounter
+ * HeartRate in bpm.
+ */
+ void updateHeartRate(uint16_t hrmCounter) {
+ valueBytes.updateHeartRate(hrmCounter);
+ ble.gattServer().write(hrmRate.getValueHandle(), valueBytes.getPointer(), valueBytes.getNumValueBytes());
+ }
+
+ /**
+ * This callback allows the HeartRateService to receive updates to the
+ * controlPoint Characteristic.
+ *
+ * @param[in] params
+ * Information about the characterisitc being updated.
+ */
+ virtual void onDataWritten(const GattWriteCallbackParams *params) {
+ 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
+ * ble.onDataWritten(this, &ExtendedHRService::onDataWritten); in
+ * your constructor.
+ */
+ }
+ }
+
+protected:
+ void setupService(void) {
+ GattCharacteristic *charTable[] = {&hrmRate, &hrmLocation, &controlPoint};
+ GattService hrmService(GattService::UUID_HEART_RATE_SERVICE, charTable, sizeof(charTable) / sizeof(GattCharacteristic *));
+
+ ble.addService(hrmService);
+ ble.onDataWritten(this, &HeartRateService::onDataWritten);
+ }
+
+protected:
+ /* Private internal representation for the bytes used to work with the vaulue 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 FLAGS_BYTE_INDEX = 0;
+
+ static const unsigned VALUE_FORMAT_BITNUM = 0;
+ static const uint8_t VALUE_FORMAT_FLAG = (1 << VALUE_FORMAT_BITNUM);
+
+ HeartRateValueBytes(uint8_t hrmCounter) : valueBytes() {
+ updateHeartRate(hrmCounter);
+ }
+
+ HeartRateValueBytes(uint16_t hrmCounter) : valueBytes() {
+ updateHeartRate(hrmCounter);
+ }
+
+ void updateHeartRate(uint8_t hrmCounter) {
+ valueBytes[FLAGS_BYTE_INDEX] &= ~VALUE_FORMAT_FLAG;
+ valueBytes[FLAGS_BYTE_INDEX + 1] = hrmCounter;
+ }
+
+ void updateHeartRate(uint16_t hrmCounter) {
+ valueBytes[FLAGS_BYTE_INDEX] |= VALUE_FORMAT_FLAG;
+ valueBytes[FLAGS_BYTE_INDEX + 1] = (uint8_t)(hrmCounter & 0xFF);
+ valueBytes[FLAGS_BYTE_INDEX + 2] = (uint8_t)(hrmCounter >> 8);
+ }
+
+ uint8_t *getPointer(void) {
+ return valueBytes;
+ }
+
+ const uint8_t *getPointer(void) const {
+ return valueBytes;
+ }
+
+ unsigned getNumValueBytes(void) const {
+ return 1 + ((valueBytes[FLAGS_BYTE_INDEX] & VALUE_FORMAT_FLAG) ? sizeof(uint16_t) : sizeof(uint8_t));
+ }
+
+ 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 */
+ uint8_t valueBytes[MAX_VALUE_BYTES];
+ };
+
+protected:
+ BLE &ble;
+
+ HeartRateValueBytes valueBytes;
+ uint8_t controlPointValue;
+
+ GattCharacteristic hrmRate;
+ ReadOnlyGattCharacteristic<uint8_t> hrmLocation;
+ WriteOnlyGattCharacteristic<uint8_t> controlPoint;
+};
+
#endif /* #ifndef __BLE_HEART_RATE_SERVICE_H__*/
\ No newline at end of file
--- a/module.json Tue Jan 12 19:47:52 2016 +0000
+++ b/module.json Wed Apr 06 19:13:46 2016 +0100
@@ -1,6 +1,6 @@
{
"name": "ble",
- "version": "2.5.0",
+ "version": "2.1.5",
"description": "The BLE module offers a high level abstraction for using Bluetooth Low Energy on multiple platforms.",
"keywords": [
"Bluetooth",
@@ -23,10 +23,10 @@
"dependencies": {},
"targetDependencies": {
"st-ble-shield": {
- "x-nucleo-idb0xa1": "^2.0.0"
+ "x-nucleo-idb0xa1": "ARMmbed/ble-x-nucleo-idb0xa1"
},
"nrf51822": {
- "ble-nrf51822": "^2.2.8"
+ "ble-nrf51822": "^2.1.1"
},
"cordio": {
"ble-wicentric": "~0.0.4"
@@ -35,8 +35,7 @@
"mbed-classic": "~0.0.1"
},
"mbed-os": {
- "mbed-drivers": "*",
- "compiler-polyfill": "^1.2.1"
+ "mbed-drivers": "*"
}
}
}
\ No newline at end of file
--- a/source/BLE.cpp Tue Jan 12 19:47:52 2016 +0000
+++ b/source/BLE.cpp Wed Apr 06 19:13:46 2016 +0100
@@ -1,229 +1,230 @@
-/* mbed Microcontroller Library
- * Copyright (c) 2006-2013 ARM Limited
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "ble/BLE.h"
-#include "ble/BLEInstanceBase.h"
-
-#if defined(TARGET_OTA_ENABLED)
-#include "ble/services/DFUService.h"
-#endif
-
-ble_error_t
-BLE::initImplementation(FunctionPointerWithContext<InitializationCompleteCallbackContext *> callback)
-{
- ble_error_t err = transport->init(instanceID, callback);
- if (err != BLE_ERROR_NONE) {
- return err;
- }
-
- /* Platforms enabled for DFU should introduce the DFU Service into
- * applications automatically. */
-#if defined(TARGET_OTA_ENABLED)
- static DFUService dfu(*this); // defined static so that the object remains alive
-#endif // TARGET_OTA_ENABLED
-
- return BLE_ERROR_NONE;
-}
-
-/**
- * BLE::Instance() and BLE constructor rely upon a static array of initializers
- * to create actual BLE transport instances. A description of these instances
- * and initializers is supposed to be put in some .json file contributing to
- * yotta's configuration (typically in the target definition described by
- * target.json). Here's a sample:
- *
- * "config": {
- * ...
- * "ble_instances": {
- * "count": 1,
- * "0" : {
- * "initializer" : "createBLEInstance"
- * }
- * }
- * ...
- * }
- *
- * The following macros result in translating the above config into a static
- * array: instanceConstructors.
- */
-#ifdef YOTTA_CFG_BLE_INSTANCES_COUNT
-#define CONCATENATE(A, B) A ## B
-#define EXPAND(X) X /* this adds a level of indirection needed to allow macro-expansion following a token-paste operation (see use of CONCATENATE() below). */
-
-#define INITIALIZER_LIST_FOR_INSTANCE_CONSTRUCTORS_1 YOTTA_CFG_BLE_INSTANCES_0_INITIALIZER
-#define INITIALIZER_LIST_FOR_INSTANCE_CONSTRUCTORS_2 INITIALIZER_LIST_FOR_INSTANCE_CONSTRUCTORS_1, YOTTA_CFG_BLE_INSTANCES_1_INITIALIZER
-#define INITIALIZER_LIST_FOR_INSTANCE_CONSTRUCTORS_3 INITIALIZER_LIST_FOR_INSTANCE_CONSTRUCTORS_2, YOTTA_CFG_BLE_INSTANCES_2_INITIALIZER
-#define INITIALIZER_LIST_FOR_INSTANCE_CONSTRUCTORS_4 INITIALIZER_LIST_FOR_INSTANCE_CONSTRUCTORS_3, YOTTA_CFG_BLE_INSTANCES_3_INITIALIZER
-#define INITIALIZER_LIST_FOR_INSTANCE_CONSTRUCTORS_5 INITIALIZER_LIST_FOR_INSTANCE_CONSTRUCTORS_4, YOTTA_CFG_BLE_INSTANCES_4_INITIALIZER
-/* ... add more of the above if ever needed */
-
-#define INITIALIZER_LIST_FOR_INSTANCE_CONSTRUCTORS(N) EXPAND(CONCATENATE(INITIALIZER_LIST_FOR_INSTANCE_CONSTRUCTORS_, N))
-#elif !defined(INITIALIZER_LIST_FOR_INSTANCE_CONSTRUCTORS)
-/*
- * The following applies when building without yotta. By default BLE_API provides
- * a trivial initializer list containing a single constructor: createBLEInstance.
- * This may be overridden.
- */
-#define INITIALIZER_LIST_FOR_INSTANCE_CONSTRUCTORS createBLEInstance
-#endif /* YOTTA_CFG_BLE_INSTANCES_COUNT */
-
-typedef BLEInstanceBase *(*InstanceConstructor_t)(void);
-static const InstanceConstructor_t instanceConstructors[BLE::NUM_INSTANCES] = {
-#ifndef YOTTA_CFG_BLE_INSTANCES_COUNT
- INITIALIZER_LIST_FOR_INSTANCE_CONSTRUCTORS
-#else
- INITIALIZER_LIST_FOR_INSTANCE_CONSTRUCTORS(YOTTA_CFG_BLE_INSTANCES_COUNT)
-#endif
-};
-
-BLE &
-BLE::Instance(InstanceID_t id)
-{
- static BLE *singletons[NUM_INSTANCES];
- if (id < NUM_INSTANCES) {
- if (singletons[id] == NULL) {
- singletons[id] = new BLE(id); /* This object will never be freed. */
- }
-
- return *singletons[id];
- }
-
- /* we come here only in the case of a bad interfaceID. */
- static BLE badSingleton(NUM_INSTANCES /* this is a bad index; and will result in a NULL transport. */);
- return badSingleton;
-}
-
-BLE::BLE(InstanceID_t instanceIDIn) : instanceID(instanceIDIn), transport()
-{
- static BLEInstanceBase *transportInstances[NUM_INSTANCES];
-
- if (instanceID < NUM_INSTANCES) {
- if (!transportInstances[instanceID]) {
- transportInstances[instanceID] = instanceConstructors[instanceID](); /* Call the stack's initializer for the transport object. */
- }
- transport = transportInstances[instanceID];
- } else {
- transport = NULL;
- }
-}
-
-bool BLE::hasInitialized(void) const
-{
- if (!transport) {
- error("bad handle to underlying transport");
- }
-
- return transport->hasInitialized();
-}
-
-ble_error_t BLE::shutdown(void)
-{
- if (!transport) {
- error("bad handle to underlying transport");
- }
-
- return transport->shutdown();
-}
-
-const char *BLE::getVersion(void)
-{
- if (!transport) {
- error("bad handle to underlying transport");
- }
-
- return transport->getVersion();
-}
-
-const Gap &BLE::gap() const
-{
- if (!transport) {
- error("bad handle to underlying transport");
- }
-
- return transport->getGap();
-}
-
-Gap &BLE::gap()
-{
- if (!transport) {
- error("bad handle to underlying transport");
- }
-
- return transport->getGap();
-}
-
-const GattServer& BLE::gattServer() const
-{
- if (!transport) {
- error("bad handle to underlying transport");
- }
-
- return transport->getGattServer();
-}
-
-GattServer& BLE::gattServer()
-{
- if (!transport) {
- error("bad handle to underlying transport");
- }
-
- return transport->getGattServer();
-}
-
-const GattClient& BLE::gattClient() const
-{
- if (!transport) {
- error("bad handle to underlying transport");
- }
-
- return transport->getGattClient();
-}
-
-GattClient& BLE::gattClient()
-{
- if (!transport) {
- error("bad handle to underlying transport");
- }
-
- return transport->getGattClient();
-}
-
-const SecurityManager& BLE::securityManager() const
-{
- if (!transport) {
- error("bad handle to underlying transport");
- }
-
- return transport->getSecurityManager();
-}
-
-SecurityManager& BLE::securityManager()
-{
- if (!transport) {
- error("bad handle to underlying transport");
- }
-
- return transport->getSecurityManager();
-}
-
-void BLE::waitForEvent(void)
-{
- if (!transport) {
- error("bad handle to underlying transport");
- }
-
- transport->waitForEvent();
+/* mbed Microcontroller Library
+ * Copyright (c) 2006-2013 ARM Limited
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "ble/BLE.h"
+#include "ble/BLEInstanceBase.h"
+
+#if defined(TARGET_OTA_ENABLED)
+#include "ble/services/DFUService.h"
+#endif
+
+ble_error_t
+BLE::initImplementation(FunctionPointerWithContext<InitializationCompleteCallbackContext *> callback)
+{
+ ble_error_t err = transport->init(instanceID, callback);
+ if (err != BLE_ERROR_NONE) {
+ return err;
+ }
+
+ /* Platforms enabled for DFU should introduce the DFU Service into
+ * applications automatically. */
+#if defined(TARGET_OTA_ENABLED)
+ static DFUService dfu(*this); // defined static so that the object remains alive
+#endif // TARGET_OTA_ENABLED
+
+ return BLE_ERROR_NONE;
+}
+
+/**
+ * BLE::Instance() and BLE constructor rely upon a static array of initializers
+ * to create actual BLE transport instances. A description of these instances
+ * and initializers is supposed to be put in some .json file contributing to
+ * yotta's configuration (typically in the target definition described by
+ * target.json). Here's a sample:
+ *
+ * "config": {
+ * ...
+ * "ble_instances": {
+ * "count": 1,
+ * "0" : {
+ * "initializer" : "createBLEInstance"
+ * }
+ * }
+ * ...
+ * }
+ *
+ * The following macros result in translating the above config into a static
+ * array: instanceConstructors.
+ */
+#ifdef YOTTA_CFG_BLE_INSTANCES_COUNT
+#define CONCATENATE(A, B) A ## B
+#define EXPAND(X) X /* this adds a level of indirection needed to allow macro-expansion following a token-paste operation (see use of CONCATENATE() below). */
+
+#define INITIALIZER_LIST_FOR_INSTANCE_CONSTRUCTORS_1 YOTTA_CFG_BLE_INSTANCES_0_INITIALIZER
+#define INITIALIZER_LIST_FOR_INSTANCE_CONSTRUCTORS_2 INITIALIZER_LIST_FOR_INSTANCE_CONSTRUCTORS_1, YOTTA_CFG_BLE_INSTANCES_1_INITIALIZER
+#define INITIALIZER_LIST_FOR_INSTANCE_CONSTRUCTORS_3 INITIALIZER_LIST_FOR_INSTANCE_CONSTRUCTORS_2, YOTTA_CFG_BLE_INSTANCES_2_INITIALIZER
+#define INITIALIZER_LIST_FOR_INSTANCE_CONSTRUCTORS_4 INITIALIZER_LIST_FOR_INSTANCE_CONSTRUCTORS_3, YOTTA_CFG_BLE_INSTANCES_3_INITIALIZER
+#define INITIALIZER_LIST_FOR_INSTANCE_CONSTRUCTORS_5 INITIALIZER_LIST_FOR_INSTANCE_CONSTRUCTORS_4, YOTTA_CFG_BLE_INSTANCES_4_INITIALIZER
+/* ... add more of the above if ever needed */
+
+#define INITIALIZER_LIST_FOR_INSTANCE_CONSTRUCTORS(N) EXPAND(CONCATENATE(INITIALIZER_LIST_FOR_INSTANCE_CONSTRUCTORS_, N))
+#elif !defined(INITIALIZER_LIST_FOR_INSTANCE_CONSTRUCTORS)
+/*
+ * The following applies when building without yotta. By default BLE_API provides
+ * a trivial initializer list containing a single constructor: createBLEInstance.
+ * This may be overridden.
+ */
+#define INITIALIZER_LIST_FOR_INSTANCE_CONSTRUCTORS createBLEInstance
+#endif /* YOTTA_CFG_BLE_INSTANCES_COUNT */
+
+typedef BLEInstanceBase *(*InstanceConstructor_t)(void);
+static const InstanceConstructor_t instanceConstructors[BLE::NUM_INSTANCES] = {
+#ifndef YOTTA_CFG_BLE_INSTANCES_COUNT
+ INITIALIZER_LIST_FOR_INSTANCE_CONSTRUCTORS
+#else
+ INITIALIZER_LIST_FOR_INSTANCE_CONSTRUCTORS(YOTTA_CFG_BLE_INSTANCES_COUNT)
+#endif
+};
+
+BLE &
+BLE::Instance(InstanceID_t id)
+{
+ static BLE *singletons[NUM_INSTANCES];
+ if (id < NUM_INSTANCES) {
+ if (singletons[id] == NULL) {
+ singletons[id] = new BLE(id); /* This object will never be freed. */
+ }
+
+ return *singletons[id];
+ }
+
+ /* we come here only in the case of a bad interfaceID. */
+ static BLE badSingleton(NUM_INSTANCES /* this is a bad index; and will result in a NULL transport. */);
+ return badSingleton;
+}
+
+BLE::BLE(InstanceID_t instanceIDIn) : instanceID(instanceIDIn), transport()
+{
+ static BLEInstanceBase *transportInstances[NUM_INSTANCES];
+
+ if (instanceID < NUM_INSTANCES) {
+ if (!transportInstances[instanceID]) {
+ transportInstances[instanceID] = instanceConstructors[instanceID](); /* Call the stack's initializer for the transport object. */
+ }
+ transport = transportInstances[instanceID];
+ } else {
+ transport = NULL;
+ }
+}
+
+bool BLE::hasInitialized(void) const
+{
+ if (!transport) {
+ error("bad handle to underlying transport");
+ }
+
+ return transport->hasInitialized();
+}
+
+ble_error_t BLE::shutdown(void)
+{
+ clearAdvertisingPayload();
+ if (!transport) {
+ error("bad handle to underlying transport");
+ }
+
+ return transport->shutdown();
+}
+
+const char *BLE::getVersion(void)
+{
+ if (!transport) {
+ error("bad handle to underlying transport");
+ }
+
+ return transport->getVersion();
+}
+
+const Gap &BLE::gap() const
+{
+ if (!transport) {
+ error("bad handle to underlying transport");
+ }
+
+ return transport->getGap();
+}
+
+Gap &BLE::gap()
+{
+ if (!transport) {
+ error("bad handle to underlying transport");
+ }
+
+ return transport->getGap();
+}
+
+const GattServer& BLE::gattServer() const
+{
+ if (!transport) {
+ error("bad handle to underlying transport");
+ }
+
+ return transport->getGattServer();
+}
+
+GattServer& BLE::gattServer()
+{
+ if (!transport) {
+ error("bad handle to underlying transport");
+ }
+
+ return transport->getGattServer();
+}
+
+const GattClient& BLE::gattClient() const
+{
+ if (!transport) {
+ error("bad handle to underlying transport");
+ }
+
+ return transport->getGattClient();
+}
+
+GattClient& BLE::gattClient()
+{
+ if (!transport) {
+ error("bad handle to underlying transport");
+ }
+
+ return transport->getGattClient();
+}
+
+const SecurityManager& BLE::securityManager() const
+{
+ if (!transport) {
+ error("bad handle to underlying transport");
+ }
+
+ return transport->getSecurityManager();
+}
+
+SecurityManager& BLE::securityManager()
+{
+ if (!transport) {
+ error("bad handle to underlying transport");
+ }
+
+ return transport->getSecurityManager();
+}
+
+void BLE::waitForEvent(void)
+{
+ if (!transport) {
+ error("bad handle to underlying transport");
+ }
+
+ transport->waitForEvent();
}
\ No newline at end of file
--- a/source/DiscoveredCharacteristic.cpp Tue Jan 12 19:47:52 2016 +0000
+++ b/source/DiscoveredCharacteristic.cpp Wed Apr 06 19:13:46 2016 +0100
@@ -1,167 +1,158 @@
-/* mbed Microcontroller Library
- * Copyright (c) 2006-2013 ARM Limited
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "ble/DiscoveredCharacteristic.h"
-#include "ble/GattClient.h"
-
-ble_error_t
-DiscoveredCharacteristic::read(uint16_t offset) const
-{
- if (!props.read()) {
- return BLE_ERROR_OPERATION_NOT_PERMITTED;
- }
-
- if (!gattc) {
- return BLE_ERROR_INVALID_STATE;
- }
-
- return gattc->read(connHandle, valueHandle, offset);
-}
-
-struct OneShotReadCallback {
- static void launch(GattClient* client, Gap::Handle_t connHandle,
- GattAttribute::Handle_t handle, const GattClient::ReadCallback_t& cb) {
- OneShotReadCallback* oneShot = new OneShotReadCallback(client, connHandle, handle, cb);
- oneShot->attach();
- // delete will be made when this callback is called
- }
-
-private:
- OneShotReadCallback(GattClient* client, Gap::Handle_t connHandle,
- GattAttribute::Handle_t handle, const GattClient::ReadCallback_t& cb) :
- _client(client),
- _connHandle(connHandle),
- _handle(handle),
- _callback(cb) { }
-
- void attach() {
- _client->onDataRead(makeFunctionPointer(this, &OneShotReadCallback::call));
- }
-
- void call(const GattReadCallbackParams* params) {
- // verifiy that it is the right characteristic on the right connection
- if (params->connHandle == _connHandle && params->handle == _handle) {
- _callback(params);
- _client->onDataRead().detach(makeFunctionPointer(this, &OneShotReadCallback::call));
- delete this;
- }
- }
-
- GattClient* _client;
- Gap::Handle_t _connHandle;
- GattAttribute::Handle_t _handle;
- GattClient::ReadCallback_t _callback;
-};
-
-ble_error_t DiscoveredCharacteristic::read(uint16_t offset, const GattClient::ReadCallback_t& onRead) const {
- ble_error_t error = read(offset);
- if (error) {
- return error;
- }
-
- OneShotReadCallback::launch(gattc, connHandle, valueHandle, onRead);
-
- return error;
-}
-
-ble_error_t
-DiscoveredCharacteristic::write(uint16_t length, const uint8_t *value) const
-{
- if (!props.write()) {
- return BLE_ERROR_OPERATION_NOT_PERMITTED;
- }
-
- if (!gattc) {
- return BLE_ERROR_INVALID_STATE;
- }
-
- return gattc->write(GattClient::GATT_OP_WRITE_REQ, connHandle, valueHandle, length, value);
-}
-
-ble_error_t
-DiscoveredCharacteristic::writeWoResponse(uint16_t length, const uint8_t *value) const
-{
- if (!props.writeWoResp()) {
- return BLE_ERROR_OPERATION_NOT_PERMITTED;
- }
-
- if (!gattc) {
- return BLE_ERROR_INVALID_STATE;
- }
-
- return gattc->write(GattClient::GATT_OP_WRITE_CMD, connHandle, valueHandle, length, value);
-}
-
-struct OneShotWriteCallback {
- static void launch(GattClient* client, Gap::Handle_t connHandle,
- GattAttribute::Handle_t handle, const GattClient::WriteCallback_t& cb) {
- OneShotWriteCallback* oneShot = new OneShotWriteCallback(client, connHandle, handle, cb);
- oneShot->attach();
- // delete will be made when this callback is called
- }
-
-private:
- OneShotWriteCallback(GattClient* client, Gap::Handle_t connHandle,
- GattAttribute::Handle_t handle, const GattClient::WriteCallback_t& cb) :
- _client(client),
- _connHandle(connHandle),
- _handle(handle),
- _callback(cb) { }
-
- void attach() {
- _client->onDataWritten(makeFunctionPointer(this, &OneShotWriteCallback::call));
- }
-
- void call(const GattWriteCallbackParams* params) {
- // verifiy that it is the right characteristic on the right connection
- if (params->connHandle == _connHandle && params->handle == _handle) {
- _callback(params);
- _client->onDataWritten().detach(makeFunctionPointer(this, &OneShotWriteCallback::call));
- delete this;
- }
- }
-
- GattClient* _client;
- Gap::Handle_t _connHandle;
- GattAttribute::Handle_t _handle;
- GattClient::WriteCallback_t _callback;
-};
-
-ble_error_t DiscoveredCharacteristic::write(uint16_t length, const uint8_t *value, const GattClient::WriteCallback_t& onRead) const {
- ble_error_t error = write(length, value);
- if (error) {
- return error;
- }
-
- OneShotWriteCallback::launch(gattc, connHandle, valueHandle, onRead);
-
- return error;
-}
-
-ble_error_t DiscoveredCharacteristic::discoverDescriptors(
- const CharacteristicDescriptorDiscovery::DiscoveryCallback_t& onCharacteristicDiscovered,
- const CharacteristicDescriptorDiscovery::TerminationCallback_t& onTermination) const {
-
- if(!gattc) {
- return BLE_ERROR_INVALID_STATE;
- }
-
- ble_error_t err = gattc->discoverCharacteristicDescriptors(
- *this, onCharacteristicDiscovered, onTermination
- );
-
- return err;
+/* mbed Microcontroller Library
+ * Copyright (c) 2006-2013 ARM Limited
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "ble/DiscoveredCharacteristic.h"
+#include "ble/GattClient.h"
+
+ble_error_t
+DiscoveredCharacteristic::read(uint16_t offset) const
+{
+ if (!props.read()) {
+ return BLE_ERROR_OPERATION_NOT_PERMITTED;
+ }
+
+ if (!gattc) {
+ return BLE_ERROR_INVALID_STATE;
+ }
+
+ return gattc->read(connHandle, valueHandle, offset);
+}
+
+struct OneShotReadCallback {
+ static void launch(GattClient* client, Gap::Handle_t connHandle,
+ GattAttribute::Handle_t handle, const GattClient::ReadCallback_t& cb) {
+ OneShotReadCallback* oneShot = new OneShotReadCallback(client, connHandle, handle, cb);
+ oneShot->attach();
+ // delete will be made when this callback is called
+ }
+
+private:
+ OneShotReadCallback(GattClient* client, Gap::Handle_t connHandle,
+ GattAttribute::Handle_t handle, const GattClient::ReadCallback_t& cb) :
+ _client(client),
+ _connHandle(connHandle),
+ _handle(handle),
+ _callback(cb) { }
+
+ void attach() {
+ _client->onDataRead(makeFunctionPointer(this, &OneShotReadCallback::call));
+ }
+
+ void call(const GattReadCallbackParams* params) {
+ // verifiy that it is the right characteristic on the right connection
+ if (params->connHandle == _connHandle && params->handle == _handle) {
+ _callback(params);
+ _client->onDataRead().detach(makeFunctionPointer(this, &OneShotReadCallback::call));
+ delete this;
+ }
+ }
+
+ GattClient* _client;
+ Gap::Handle_t _connHandle;
+ GattAttribute::Handle_t _handle;
+ GattClient::ReadCallback_t _callback;
+};
+
+ble_error_t DiscoveredCharacteristic::read(uint16_t offset, const GattClient::ReadCallback_t& onRead) const {
+ ble_error_t error = read(offset);
+ if (error) {
+ return error;
+ }
+
+ OneShotReadCallback::launch(gattc, connHandle, valueHandle, onRead);
+
+ return error;
+}
+
+ble_error_t
+DiscoveredCharacteristic::write(uint16_t length, const uint8_t *value) const
+{
+ if (!props.write()) {
+ return BLE_ERROR_OPERATION_NOT_PERMITTED;
+ }
+
+ if (!gattc) {
+ return BLE_ERROR_INVALID_STATE;
+ }
+
+ return gattc->write(GattClient::GATT_OP_WRITE_REQ, connHandle, valueHandle, length, value);
+}
+
+ble_error_t
+DiscoveredCharacteristic::writeWoResponse(uint16_t length, const uint8_t *value) const
+{
+ if (!props.writeWoResp()) {
+ return BLE_ERROR_OPERATION_NOT_PERMITTED;
+ }
+
+ if (!gattc) {
+ return BLE_ERROR_INVALID_STATE;
+ }
+
+ return gattc->write(GattClient::GATT_OP_WRITE_CMD, connHandle, valueHandle, length, value);
+}
+
+struct OneShotWriteCallback {
+ static void launch(GattClient* client, Gap::Handle_t connHandle,
+ GattAttribute::Handle_t handle, const GattClient::WriteCallback_t& cb) {
+ OneShotWriteCallback* oneShot = new OneShotWriteCallback(client, connHandle, handle, cb);
+ oneShot->attach();
+ // delete will be made when this callback is called
+ }
+
+private:
+ OneShotWriteCallback(GattClient* client, Gap::Handle_t connHandle,
+ GattAttribute::Handle_t handle, const GattClient::WriteCallback_t& cb) :
+ _client(client),
+ _connHandle(connHandle),
+ _handle(handle),
+ _callback(cb) { }
+
+ void attach() {
+ _client->onDataWritten(makeFunctionPointer(this, &OneShotWriteCallback::call));
+ }
+
+ void call(const GattWriteCallbackParams* params) {
+ // verifiy that it is the right characteristic on the right connection
+ if (params->connHandle == _connHandle && params->handle == _handle) {
+ _callback(params);
+ _client->onDataWritten().detach(makeFunctionPointer(this, &OneShotWriteCallback::call));
+ delete this;
+ }
+ }
+
+ GattClient* _client;
+ Gap::Handle_t _connHandle;
+ GattAttribute::Handle_t _handle;
+ GattClient::WriteCallback_t _callback;
+};
+
+ble_error_t DiscoveredCharacteristic::write(uint16_t length, const uint8_t *value, const GattClient::WriteCallback_t& onRead) const {
+ ble_error_t error = write(length, value);
+ if (error) {
+ return error;
+ }
+
+ OneShotWriteCallback::launch(gattc, connHandle, valueHandle, onRead);
+
+ return error;
+}
+
+ble_error_t
+DiscoveredCharacteristic::discoverDescriptors(DescriptorCallback_t callback, const UUID &matchingUUID) const
+{
+ return BLE_ERROR_NOT_IMPLEMENTED; /* TODO: this needs to be filled in. */
}
\ No newline at end of file
