The code from https://github.com/vpcola/Nucleo

Committer:
sinrab
Date:
Wed Oct 08 11:00:24 2014 +0000
Revision:
0:5464d5e415e5
The code from https://github.com/vpcola/Nucleo

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sinrab 0:5464d5e415e5 1 /* mbed Microcontroller Library
sinrab 0:5464d5e415e5 2 * Copyright (c) 2006-2013 ARM Limited
sinrab 0:5464d5e415e5 3 *
sinrab 0:5464d5e415e5 4 * Licensed under the Apache License, Version 2.0 (the "License");
sinrab 0:5464d5e415e5 5 * you may not use this file except in compliance with the License.
sinrab 0:5464d5e415e5 6 * You may obtain a copy of the License at
sinrab 0:5464d5e415e5 7 *
sinrab 0:5464d5e415e5 8 * http://www.apache.org/licenses/LICENSE-2.0
sinrab 0:5464d5e415e5 9 *
sinrab 0:5464d5e415e5 10 * Unless required by applicable law or agreed to in writing, software
sinrab 0:5464d5e415e5 11 * distributed under the License is distributed on an "AS IS" BASIS,
sinrab 0:5464d5e415e5 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
sinrab 0:5464d5e415e5 13 * See the License for the specific language governing permissions and
sinrab 0:5464d5e415e5 14 * limitations under the License.
sinrab 0:5464d5e415e5 15 */
sinrab 0:5464d5e415e5 16 #ifndef MBED_CALLCHAIN_H
sinrab 0:5464d5e415e5 17 #define MBED_CALLCHAIN_H
sinrab 0:5464d5e415e5 18
sinrab 0:5464d5e415e5 19 #include "FunctionPointer.h"
sinrab 0:5464d5e415e5 20 #include <string.h>
sinrab 0:5464d5e415e5 21
sinrab 0:5464d5e415e5 22 namespace mbed {
sinrab 0:5464d5e415e5 23
sinrab 0:5464d5e415e5 24 /** Group one or more functions in an instance of a CallChain, then call them in
sinrab 0:5464d5e415e5 25 * sequence using CallChain::call(). Used mostly by the interrupt chaining code,
sinrab 0:5464d5e415e5 26 * but can be used for other purposes.
sinrab 0:5464d5e415e5 27 *
sinrab 0:5464d5e415e5 28 * Example:
sinrab 0:5464d5e415e5 29 * @code
sinrab 0:5464d5e415e5 30 * #include "mbed.h"
sinrab 0:5464d5e415e5 31 *
sinrab 0:5464d5e415e5 32 * CallChain chain;
sinrab 0:5464d5e415e5 33 *
sinrab 0:5464d5e415e5 34 * void first(void) {
sinrab 0:5464d5e415e5 35 * printf("'first' function.\n");
sinrab 0:5464d5e415e5 36 * }
sinrab 0:5464d5e415e5 37 *
sinrab 0:5464d5e415e5 38 * void second(void) {
sinrab 0:5464d5e415e5 39 * printf("'second' function.\n");
sinrab 0:5464d5e415e5 40 * }
sinrab 0:5464d5e415e5 41 *
sinrab 0:5464d5e415e5 42 * class Test {
sinrab 0:5464d5e415e5 43 * public:
sinrab 0:5464d5e415e5 44 * void f(void) {
sinrab 0:5464d5e415e5 45 * printf("A::f (class member).\n");
sinrab 0:5464d5e415e5 46 * }
sinrab 0:5464d5e415e5 47 * };
sinrab 0:5464d5e415e5 48 *
sinrab 0:5464d5e415e5 49 * int main() {
sinrab 0:5464d5e415e5 50 * Test test;
sinrab 0:5464d5e415e5 51 *
sinrab 0:5464d5e415e5 52 * chain.add(second);
sinrab 0:5464d5e415e5 53 * chain.add_front(first);
sinrab 0:5464d5e415e5 54 * chain.add(&test, &Test::f);
sinrab 0:5464d5e415e5 55 * chain.call();
sinrab 0:5464d5e415e5 56 * }
sinrab 0:5464d5e415e5 57 * @endcode
sinrab 0:5464d5e415e5 58 */
sinrab 0:5464d5e415e5 59
sinrab 0:5464d5e415e5 60 typedef FunctionPointer* pFunctionPointer_t;
sinrab 0:5464d5e415e5 61
sinrab 0:5464d5e415e5 62 class CallChain {
sinrab 0:5464d5e415e5 63 public:
sinrab 0:5464d5e415e5 64 /** Create an empty chain
sinrab 0:5464d5e415e5 65 *
sinrab 0:5464d5e415e5 66 * @param size (optional) Initial size of the chain
sinrab 0:5464d5e415e5 67 */
sinrab 0:5464d5e415e5 68 CallChain(int size = 4);
sinrab 0:5464d5e415e5 69 virtual ~CallChain();
sinrab 0:5464d5e415e5 70
sinrab 0:5464d5e415e5 71 /** Add a function at the end of the chain
sinrab 0:5464d5e415e5 72 *
sinrab 0:5464d5e415e5 73 * @param function A pointer to a void function
sinrab 0:5464d5e415e5 74 *
sinrab 0:5464d5e415e5 75 * @returns
sinrab 0:5464d5e415e5 76 * The function object created for 'function'
sinrab 0:5464d5e415e5 77 */
sinrab 0:5464d5e415e5 78 pFunctionPointer_t add(void (*function)(void));
sinrab 0:5464d5e415e5 79
sinrab 0:5464d5e415e5 80 /** Add a function at the end of the chain
sinrab 0:5464d5e415e5 81 *
sinrab 0:5464d5e415e5 82 * @param tptr pointer to the object to call the member function on
sinrab 0:5464d5e415e5 83 * @param mptr pointer to the member function to be called
sinrab 0:5464d5e415e5 84 *
sinrab 0:5464d5e415e5 85 * @returns
sinrab 0:5464d5e415e5 86 * The function object created for 'tptr' and 'mptr'
sinrab 0:5464d5e415e5 87 */
sinrab 0:5464d5e415e5 88 template<typename T>
sinrab 0:5464d5e415e5 89 pFunctionPointer_t add(T *tptr, void (T::*mptr)(void)) {
sinrab 0:5464d5e415e5 90 return common_add(new FunctionPointer(tptr, mptr));
sinrab 0:5464d5e415e5 91 }
sinrab 0:5464d5e415e5 92
sinrab 0:5464d5e415e5 93 /** Add a function at the beginning of the chain
sinrab 0:5464d5e415e5 94 *
sinrab 0:5464d5e415e5 95 * @param function A pointer to a void function
sinrab 0:5464d5e415e5 96 *
sinrab 0:5464d5e415e5 97 * @returns
sinrab 0:5464d5e415e5 98 * The function object created for 'function'
sinrab 0:5464d5e415e5 99 */
sinrab 0:5464d5e415e5 100 pFunctionPointer_t add_front(void (*function)(void));
sinrab 0:5464d5e415e5 101
sinrab 0:5464d5e415e5 102 /** Add a function at the beginning of the chain
sinrab 0:5464d5e415e5 103 *
sinrab 0:5464d5e415e5 104 * @param tptr pointer to the object to call the member function on
sinrab 0:5464d5e415e5 105 * @param mptr pointer to the member function to be called
sinrab 0:5464d5e415e5 106 *
sinrab 0:5464d5e415e5 107 * @returns
sinrab 0:5464d5e415e5 108 * The function object created for 'tptr' and 'mptr'
sinrab 0:5464d5e415e5 109 */
sinrab 0:5464d5e415e5 110 template<typename T>
sinrab 0:5464d5e415e5 111 pFunctionPointer_t add_front(T *tptr, void (T::*mptr)(void)) {
sinrab 0:5464d5e415e5 112 return common_add_front(new FunctionPointer(tptr, mptr));
sinrab 0:5464d5e415e5 113 }
sinrab 0:5464d5e415e5 114
sinrab 0:5464d5e415e5 115 /** Get the number of functions in the chain
sinrab 0:5464d5e415e5 116 */
sinrab 0:5464d5e415e5 117 int size() const;
sinrab 0:5464d5e415e5 118
sinrab 0:5464d5e415e5 119 /** Get a function object from the chain
sinrab 0:5464d5e415e5 120 *
sinrab 0:5464d5e415e5 121 * @param i function object index
sinrab 0:5464d5e415e5 122 *
sinrab 0:5464d5e415e5 123 * @returns
sinrab 0:5464d5e415e5 124 * The function object at position 'i' in the chain
sinrab 0:5464d5e415e5 125 */
sinrab 0:5464d5e415e5 126 pFunctionPointer_t get(int i) const;
sinrab 0:5464d5e415e5 127
sinrab 0:5464d5e415e5 128 /** Look for a function object in the call chain
sinrab 0:5464d5e415e5 129 *
sinrab 0:5464d5e415e5 130 * @param f the function object to search
sinrab 0:5464d5e415e5 131 *
sinrab 0:5464d5e415e5 132 * @returns
sinrab 0:5464d5e415e5 133 * The index of the function object if found, -1 otherwise.
sinrab 0:5464d5e415e5 134 */
sinrab 0:5464d5e415e5 135 int find(pFunctionPointer_t f) const;
sinrab 0:5464d5e415e5 136
sinrab 0:5464d5e415e5 137 /** Clear the call chain (remove all functions in the chain).
sinrab 0:5464d5e415e5 138 */
sinrab 0:5464d5e415e5 139 void clear();
sinrab 0:5464d5e415e5 140
sinrab 0:5464d5e415e5 141 /** Remove a function object from the chain
sinrab 0:5464d5e415e5 142 *
sinrab 0:5464d5e415e5 143 * @arg f the function object to remove
sinrab 0:5464d5e415e5 144 *
sinrab 0:5464d5e415e5 145 * @returns
sinrab 0:5464d5e415e5 146 * true if the function object was found and removed, false otherwise.
sinrab 0:5464d5e415e5 147 */
sinrab 0:5464d5e415e5 148 bool remove(pFunctionPointer_t f);
sinrab 0:5464d5e415e5 149
sinrab 0:5464d5e415e5 150 /** Call all the functions in the chain in sequence
sinrab 0:5464d5e415e5 151 */
sinrab 0:5464d5e415e5 152 void call();
sinrab 0:5464d5e415e5 153
sinrab 0:5464d5e415e5 154 #ifdef MBED_OPERATORS
sinrab 0:5464d5e415e5 155 void operator ()(void) {
sinrab 0:5464d5e415e5 156 call();
sinrab 0:5464d5e415e5 157 }
sinrab 0:5464d5e415e5 158 pFunctionPointer_t operator [](int i) const {
sinrab 0:5464d5e415e5 159 return get(i);
sinrab 0:5464d5e415e5 160 }
sinrab 0:5464d5e415e5 161 #endif
sinrab 0:5464d5e415e5 162
sinrab 0:5464d5e415e5 163 private:
sinrab 0:5464d5e415e5 164 void _check_size();
sinrab 0:5464d5e415e5 165 pFunctionPointer_t common_add(pFunctionPointer_t pf);
sinrab 0:5464d5e415e5 166 pFunctionPointer_t common_add_front(pFunctionPointer_t pf);
sinrab 0:5464d5e415e5 167
sinrab 0:5464d5e415e5 168 pFunctionPointer_t* _chain;
sinrab 0:5464d5e415e5 169 int _size;
sinrab 0:5464d5e415e5 170 int _elements;
sinrab 0:5464d5e415e5 171
sinrab 0:5464d5e415e5 172 /* disallow copy constructor and assignment operators */
sinrab 0:5464d5e415e5 173 private:
sinrab 0:5464d5e415e5 174 CallChain(const CallChain&);
sinrab 0:5464d5e415e5 175 CallChain & operator = (const CallChain&);
sinrab 0:5464d5e415e5 176 };
sinrab 0:5464d5e415e5 177
sinrab 0:5464d5e415e5 178 } // namespace mbed
sinrab 0:5464d5e415e5 179
sinrab 0:5464d5e415e5 180 #endif
sinrab 0:5464d5e415e5 181
sinrab 0:5464d5e415e5 182