R1 code for micro:bit based train controller code, requires second micro:bit running tx code to operate - see https://meanderingpi.wordpress.com/ for more information

Fork of mbed-dev-bin by Lancaster University

Committer:
DavidMS
Date:
Tue May 23 10:42:56 2017 +0000
Revision:
4:1a27ae39e33f
Parent:
0:e1a608bb55e8
First working micro:bit motor control rx code, need be run with matching tx code

Who changed what in which revision?

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