Updated

Fork of BLE_API by Bluetooth Low Energy

Committer:
vcoubard
Date:
Wed Apr 06 19:15:30 2016 +0100
Revision:
1179:4ab722f8dca0
Parent:
1156:e1ea38b576c6
Child:
1183:1589830dbdb7
Synchronized with git rev ca632aaf
Author: Andres Amaya Garcia
Update Gap state after advertising times out

The BLE API was not updating the Gap internal state when the advertising stops
because of a user timeout. This commit fixes the issue by updating the internal
state structure in Gap just before the registered callbacks are notified of the
advertising timeout.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
vcoubard 1148:0340d5bbbeba 1 /* mbed Microcontroller Library
vcoubard 1148:0340d5bbbeba 2 * Copyright (c) 2006-2013 ARM Limited
vcoubard 1148:0340d5bbbeba 3 *
vcoubard 1148:0340d5bbbeba 4 * Licensed under the Apache License, Version 2.0 (the "License");
vcoubard 1148:0340d5bbbeba 5 * you may not use this file except in compliance with the License.
vcoubard 1148:0340d5bbbeba 6 * You may obtain a copy of the License at
vcoubard 1148:0340d5bbbeba 7 *
vcoubard 1148:0340d5bbbeba 8 * http://www.apache.org/licenses/LICENSE-2.0
vcoubard 1148:0340d5bbbeba 9 *
vcoubard 1148:0340d5bbbeba 10 * Unless required by applicable law or agreed to in writing, software
vcoubard 1148:0340d5bbbeba 11 * distributed under the License is distributed on an "AS IS" BASIS,
vcoubard 1148:0340d5bbbeba 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
vcoubard 1148:0340d5bbbeba 13 * See the License for the specific language governing permissions and
vcoubard 1148:0340d5bbbeba 14 * limitations under the License.
vcoubard 1148:0340d5bbbeba 15 */
vcoubard 1148:0340d5bbbeba 16
vcoubard 1148:0340d5bbbeba 17 #ifndef BLE_API_SAFE_BOOL_H_
vcoubard 1148:0340d5bbbeba 18 #define BLE_API_SAFE_BOOL_H_
vcoubard 1148:0340d5bbbeba 19
vcoubard 1179:4ab722f8dca0 20 //safe bool idiom, see : http://www.artima.com/cppsource/safebool.html
vcoubard 1148:0340d5bbbeba 21
vcoubard 1148:0340d5bbbeba 22 namespace SafeBool_ {
vcoubard 1148:0340d5bbbeba 23 /**
vcoubard 1179:4ab722f8dca0 24 * @brief Base class for all intances of SafeBool,
vcoubard 1179:4ab722f8dca0 25 * This base class reduce instantiation of trueTag function
vcoubard 1148:0340d5bbbeba 26 */
vcoubard 1148:0340d5bbbeba 27 class base {
vcoubard 1148:0340d5bbbeba 28 template<typename>
vcoubard 1148:0340d5bbbeba 29 friend class SafeBool;
vcoubard 1148:0340d5bbbeba 30
vcoubard 1148:0340d5bbbeba 31 protected:
vcoubard 1179:4ab722f8dca0 32 //the bool type is a pointer to method which can be used in boolean context
vcoubard 1179:4ab722f8dca0 33 typedef void (base::*BoolType_t)() const;
vcoubard 1148:0340d5bbbeba 34
vcoubard 1179:4ab722f8dca0 35 // non implemented call, use to disallow conversion between unrelated types
vcoubard 1179:4ab722f8dca0 36 void invalidTag() const;
vcoubard 1148:0340d5bbbeba 37
vcoubard 1179:4ab722f8dca0 38 // member function which indicate true value
vcoubard 1179:4ab722f8dca0 39 void trueTag() const {}
vcoubard 1148:0340d5bbbeba 40 };
vcoubard 1148:0340d5bbbeba 41
vcoubard 1148:0340d5bbbeba 42
vcoubard 1148:0340d5bbbeba 43 }
vcoubard 1148:0340d5bbbeba 44
vcoubard 1148:0340d5bbbeba 45 /**
vcoubard 1148:0340d5bbbeba 46 * @brief template class SafeBool use CRTP to made boolean conversion easy and correct.
vcoubard 1179:4ab722f8dca0 47 * Derived class should implement the function bool toBool() const to make this work. Inheritance
vcoubard 1148:0340d5bbbeba 48 * should be public.
vcoubard 1148:0340d5bbbeba 49 *
vcoubard 1148:0340d5bbbeba 50 * @tparam T Type of the derived class
vcoubard 1179:4ab722f8dca0 51 *
vcoubard 1179:4ab722f8dca0 52 * \code
vcoubard 1179:4ab722f8dca0 53 *
vcoubard 1179:4ab722f8dca0 54 * class A : public SafeBool<A> {
vcoubard 1148:0340d5bbbeba 55 * public:
vcoubard 1179:4ab722f8dca0 56 *
vcoubard 1148:0340d5bbbeba 57 * // boolean conversion
vcoubard 1179:4ab722f8dca0 58 * bool toBool() {
vcoubard 1179:4ab722f8dca0 59 *
vcoubard 1179:4ab722f8dca0 60 * }
vcoubard 1148:0340d5bbbeba 61 * };
vcoubard 1179:4ab722f8dca0 62 *
vcoubard 1179:4ab722f8dca0 63 * class B : public SafeBool<B> {
vcoubard 1148:0340d5bbbeba 64 * public:
vcoubard 1179:4ab722f8dca0 65 *
vcoubard 1148:0340d5bbbeba 66 * // boolean conversion
vcoubard 1179:4ab722f8dca0 67 * bool toBool() const {
vcoubard 1179:4ab722f8dca0 68 *
vcoubard 1179:4ab722f8dca0 69 * }
vcoubard 1148:0340d5bbbeba 70 * };
vcoubard 1179:4ab722f8dca0 71 *
vcoubard 1148:0340d5bbbeba 72 * A a;
vcoubard 1148:0340d5bbbeba 73 * B b;
vcoubard 1179:4ab722f8dca0 74 *
vcoubard 1179:4ab722f8dca0 75 * // will compile
vcoubard 1179:4ab722f8dca0 76 * if(a) {
vcoubard 1179:4ab722f8dca0 77 *
vcoubard 1148:0340d5bbbeba 78 * }
vcoubard 1179:4ab722f8dca0 79 *
vcoubard 1179:4ab722f8dca0 80 * // compilation error
vcoubard 1179:4ab722f8dca0 81 * if(a == b) {
vcoubard 1179:4ab722f8dca0 82 *
vcoubard 1148:0340d5bbbeba 83 * }
vcoubard 1179:4ab722f8dca0 84 *
vcoubard 1179:4ab722f8dca0 85 *
vcoubard 1179:4ab722f8dca0 86 * \endcode
vcoubard 1148:0340d5bbbeba 87 */
vcoubard 1179:4ab722f8dca0 88 template <typename T>
vcoubard 1148:0340d5bbbeba 89 class SafeBool : public SafeBool_::base {
vcoubard 1148:0340d5bbbeba 90 public:
vcoubard 1179:4ab722f8dca0 91 /**
vcoubard 1179:4ab722f8dca0 92 * bool operator implementation, derived class has to provide bool toBool() const function.
vcoubard 1179:4ab722f8dca0 93 */
vcoubard 1179:4ab722f8dca0 94 operator BoolType_t() const {
vcoubard 1179:4ab722f8dca0 95 return (static_cast<const T*>(this))->toBool()
vcoubard 1179:4ab722f8dca0 96 ? &SafeBool<T>::trueTag : 0;
vcoubard 1179:4ab722f8dca0 97 }
vcoubard 1148:0340d5bbbeba 98 };
vcoubard 1148:0340d5bbbeba 99
vcoubard 1179:4ab722f8dca0 100 //Avoid conversion to bool between different classes
vcoubard 1148:0340d5bbbeba 101 template <typename T, typename U>
vcoubard 1148:0340d5bbbeba 102 void operator==(const SafeBool<T>& lhs,const SafeBool<U>& rhs) {
vcoubard 1148:0340d5bbbeba 103 lhs.invalidTag();
vcoubard 1179:4ab722f8dca0 104 // return false;
vcoubard 1148:0340d5bbbeba 105 }
vcoubard 1148:0340d5bbbeba 106
vcoubard 1179:4ab722f8dca0 107 //Avoid conversion to bool between different classes
vcoubard 1148:0340d5bbbeba 108 template <typename T,typename U>
vcoubard 1148:0340d5bbbeba 109 void operator!=(const SafeBool<T>& lhs,const SafeBool<U>& rhs) {
vcoubard 1179:4ab722f8dca0 110 lhs.invalidTag();
vcoubard 1179:4ab722f8dca0 111 // return false;
vcoubard 1148:0340d5bbbeba 112 }
vcoubard 1148:0340d5bbbeba 113
rgrover1 948:1bb402105289 114 #endif /* BLE_API_SAFE_BOOL_H_ */