ON Semiconductor / mbed-os

Dependents:   mbed-TFT-example-NCS36510 mbed-Accelerometer-example-NCS36510 mbed-Accelerometer-example-NCS36510

Committer:
jacobjohnson
Date:
Mon Feb 27 17:45:05 2017 +0000
Revision:
1:f30bdcd2b33b
Parent:
0:098463de4c5d
changed the inputscale from 1 to 7 in analogin_api.c.  This will need to be changed later, and accessed from the main level, but for now this allows the  adc to read a value from 0 to 3.7V, instead of just up to 1V.;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
group-onsemi 0:098463de4c5d 1 /* mbed Microcontroller Library
group-onsemi 0:098463de4c5d 2 * Copyright (c) 2006-2013 ARM Limited
group-onsemi 0:098463de4c5d 3 *
group-onsemi 0:098463de4c5d 4 * Licensed under the Apache License, Version 2.0 (the "License");
group-onsemi 0:098463de4c5d 5 * you may not use this file except in compliance with the License.
group-onsemi 0:098463de4c5d 6 * You may obtain a copy of the License at
group-onsemi 0:098463de4c5d 7 *
group-onsemi 0:098463de4c5d 8 * http://www.apache.org/licenses/LICENSE-2.0
group-onsemi 0:098463de4c5d 9 *
group-onsemi 0:098463de4c5d 10 * Unless required by applicable law or agreed to in writing, software
group-onsemi 0:098463de4c5d 11 * distributed under the License is distributed on an "AS IS" BASIS,
group-onsemi 0:098463de4c5d 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
group-onsemi 0:098463de4c5d 13 * See the License for the specific language governing permissions and
group-onsemi 0:098463de4c5d 14 * limitations under the License.
group-onsemi 0:098463de4c5d 15 */
group-onsemi 0:098463de4c5d 16 #ifndef MBED_CALLCHAIN_OF_FUNCTION_POINTERS_WITH_CONTEXT_H
group-onsemi 0:098463de4c5d 17 #define MBED_CALLCHAIN_OF_FUNCTION_POINTERS_WITH_CONTEXT_H
group-onsemi 0:098463de4c5d 18
group-onsemi 0:098463de4c5d 19 #include <string.h>
group-onsemi 0:098463de4c5d 20 #include "FunctionPointerWithContext.h"
group-onsemi 0:098463de4c5d 21 #include "SafeBool.h"
group-onsemi 0:098463de4c5d 22
group-onsemi 0:098463de4c5d 23
group-onsemi 0:098463de4c5d 24 /** Group one or more functions in an instance of a CallChainOfFunctionPointersWithContext, then call them in
group-onsemi 0:098463de4c5d 25 * sequence using CallChainOfFunctionPointersWithContext::call(). Used mostly by the interrupt chaining code,
group-onsemi 0:098463de4c5d 26 * but can be used for other purposes.
group-onsemi 0:098463de4c5d 27 *
group-onsemi 0:098463de4c5d 28 * Example:
group-onsemi 0:098463de4c5d 29 * @code
group-onsemi 0:098463de4c5d 30 *
group-onsemi 0:098463de4c5d 31 * CallChainOfFunctionPointersWithContext<void *> chain;
group-onsemi 0:098463de4c5d 32 *
group-onsemi 0:098463de4c5d 33 * void first(void *context) {
group-onsemi 0:098463de4c5d 34 * printf("'first' function.\n");
group-onsemi 0:098463de4c5d 35 * }
group-onsemi 0:098463de4c5d 36 *
group-onsemi 0:098463de4c5d 37 * void second(void *context) {
group-onsemi 0:098463de4c5d 38 * printf("'second' function.\n");
group-onsemi 0:098463de4c5d 39 * }
group-onsemi 0:098463de4c5d 40 *
group-onsemi 0:098463de4c5d 41 * class Test {
group-onsemi 0:098463de4c5d 42 * public:
group-onsemi 0:098463de4c5d 43 * void f(void *context) {
group-onsemi 0:098463de4c5d 44 * printf("A::f (class member).\n");
group-onsemi 0:098463de4c5d 45 * }
group-onsemi 0:098463de4c5d 46 * };
group-onsemi 0:098463de4c5d 47 *
group-onsemi 0:098463de4c5d 48 * int main() {
group-onsemi 0:098463de4c5d 49 * Test test;
group-onsemi 0:098463de4c5d 50 *
group-onsemi 0:098463de4c5d 51 * chain.add(second);
group-onsemi 0:098463de4c5d 52 * chain.add_front(first);
group-onsemi 0:098463de4c5d 53 * chain.add(&test, &Test::f);
group-onsemi 0:098463de4c5d 54 * chain.call();
group-onsemi 0:098463de4c5d 55 * }
group-onsemi 0:098463de4c5d 56 * @endcode
group-onsemi 0:098463de4c5d 57 */
group-onsemi 0:098463de4c5d 58 template <typename ContextType>
group-onsemi 0:098463de4c5d 59 class CallChainOfFunctionPointersWithContext : public SafeBool<CallChainOfFunctionPointersWithContext<ContextType> > {
group-onsemi 0:098463de4c5d 60 public:
group-onsemi 0:098463de4c5d 61 /**
group-onsemi 0:098463de4c5d 62 * The type of each callback in the callchain.
group-onsemi 0:098463de4c5d 63 */
group-onsemi 0:098463de4c5d 64 typedef FunctionPointerWithContext<ContextType> *pFunctionPointerWithContext_t;
group-onsemi 0:098463de4c5d 65
group-onsemi 0:098463de4c5d 66 public:
group-onsemi 0:098463de4c5d 67 /**
group-onsemi 0:098463de4c5d 68 * Create an empty chain.
group-onsemi 0:098463de4c5d 69 */
group-onsemi 0:098463de4c5d 70 CallChainOfFunctionPointersWithContext() : chainHead(NULL) {
group-onsemi 0:098463de4c5d 71 /* empty */
group-onsemi 0:098463de4c5d 72 }
group-onsemi 0:098463de4c5d 73
group-onsemi 0:098463de4c5d 74 virtual ~CallChainOfFunctionPointersWithContext() {
group-onsemi 0:098463de4c5d 75 clear();
group-onsemi 0:098463de4c5d 76 }
group-onsemi 0:098463de4c5d 77
group-onsemi 0:098463de4c5d 78 /**
group-onsemi 0:098463de4c5d 79 * Add a function at the front of the chain.
group-onsemi 0:098463de4c5d 80 *
group-onsemi 0:098463de4c5d 81 * @param[in] function
group-onsemi 0:098463de4c5d 82 * A pointer to a void function.
group-onsemi 0:098463de4c5d 83 *
group-onsemi 0:098463de4c5d 84 * @return The function object created for @p function.
group-onsemi 0:098463de4c5d 85 */
group-onsemi 0:098463de4c5d 86 pFunctionPointerWithContext_t add(void (*function)(ContextType context)) {
group-onsemi 0:098463de4c5d 87 return common_add(new FunctionPointerWithContext<ContextType>(function));
group-onsemi 0:098463de4c5d 88 }
group-onsemi 0:098463de4c5d 89
group-onsemi 0:098463de4c5d 90 /**
group-onsemi 0:098463de4c5d 91 * Add a function at the front of the chain.
group-onsemi 0:098463de4c5d 92 *
group-onsemi 0:098463de4c5d 93 * @param[in] tptr
group-onsemi 0:098463de4c5d 94 * Pointer to the object to call the member function on.
group-onsemi 0:098463de4c5d 95 * @param[in] mptr
group-onsemi 0:098463de4c5d 96 * Pointer to the member function to be called.
group-onsemi 0:098463de4c5d 97 *
group-onsemi 0:098463de4c5d 98 * @return The function object created for @p tptr and @p mptr.
group-onsemi 0:098463de4c5d 99 */
group-onsemi 0:098463de4c5d 100 template<typename T>
group-onsemi 0:098463de4c5d 101 pFunctionPointerWithContext_t add(T *tptr, void (T::*mptr)(ContextType context)) {
group-onsemi 0:098463de4c5d 102 return common_add(new FunctionPointerWithContext<ContextType>(tptr, mptr));
group-onsemi 0:098463de4c5d 103 }
group-onsemi 0:098463de4c5d 104
group-onsemi 0:098463de4c5d 105 /**
group-onsemi 0:098463de4c5d 106 * Add a function at the front of the chain.
group-onsemi 0:098463de4c5d 107 *
group-onsemi 0:098463de4c5d 108 * @param[in] func
group-onsemi 0:098463de4c5d 109 * The FunctionPointerWithContext to add.
group-onsemi 0:098463de4c5d 110 *
group-onsemi 0:098463de4c5d 111 * @return The function object created for @p func.
group-onsemi 0:098463de4c5d 112 */
group-onsemi 0:098463de4c5d 113 pFunctionPointerWithContext_t add(const FunctionPointerWithContext<ContextType>& func) {
group-onsemi 0:098463de4c5d 114 return common_add(new FunctionPointerWithContext<ContextType>(func));
group-onsemi 0:098463de4c5d 115 }
group-onsemi 0:098463de4c5d 116
group-onsemi 0:098463de4c5d 117 /**
group-onsemi 0:098463de4c5d 118 * Detach a function pointer from a callchain.
group-onsemi 0:098463de4c5d 119 *
group-onsemi 0:098463de4c5d 120 * @param[in] toDetach
group-onsemi 0:098463de4c5d 121 * FunctionPointerWithContext to detach from this callchain.
group-onsemi 0:098463de4c5d 122 *
group-onsemi 0:098463de4c5d 123 * @return true if a function pointer has been detached and false otherwise.
group-onsemi 0:098463de4c5d 124 *
group-onsemi 0:098463de4c5d 125 * @note It is safe to remove a function pointer while the chain is
group-onsemi 0:098463de4c5d 126 * traversed by call(ContextType).
group-onsemi 0:098463de4c5d 127 */
group-onsemi 0:098463de4c5d 128 bool detach(const FunctionPointerWithContext<ContextType>& toDetach) {
group-onsemi 0:098463de4c5d 129 pFunctionPointerWithContext_t current = chainHead;
group-onsemi 0:098463de4c5d 130 pFunctionPointerWithContext_t previous = NULL;
group-onsemi 0:098463de4c5d 131
group-onsemi 0:098463de4c5d 132 while (current) {
group-onsemi 0:098463de4c5d 133 if(*current == toDetach) {
group-onsemi 0:098463de4c5d 134 if(previous == NULL) {
group-onsemi 0:098463de4c5d 135 if(currentCalled == current) {
group-onsemi 0:098463de4c5d 136 currentCalled = NULL;
group-onsemi 0:098463de4c5d 137 }
group-onsemi 0:098463de4c5d 138 chainHead = current->getNext();
group-onsemi 0:098463de4c5d 139 } else {
group-onsemi 0:098463de4c5d 140 if(currentCalled == current) {
group-onsemi 0:098463de4c5d 141 currentCalled = previous;
group-onsemi 0:098463de4c5d 142 }
group-onsemi 0:098463de4c5d 143 previous->chainAsNext(current->getNext());
group-onsemi 0:098463de4c5d 144 }
group-onsemi 0:098463de4c5d 145 delete current;
group-onsemi 0:098463de4c5d 146 return true;
group-onsemi 0:098463de4c5d 147 }
group-onsemi 0:098463de4c5d 148
group-onsemi 0:098463de4c5d 149 previous = current;
group-onsemi 0:098463de4c5d 150 current = current->getNext();
group-onsemi 0:098463de4c5d 151 }
group-onsemi 0:098463de4c5d 152
group-onsemi 0:098463de4c5d 153 return false;
group-onsemi 0:098463de4c5d 154 }
group-onsemi 0:098463de4c5d 155
group-onsemi 0:098463de4c5d 156 /**
group-onsemi 0:098463de4c5d 157 * Clear the call chain (remove all functions in the chain).
group-onsemi 0:098463de4c5d 158 */
group-onsemi 0:098463de4c5d 159 void clear(void) {
group-onsemi 0:098463de4c5d 160 pFunctionPointerWithContext_t fptr = chainHead;
group-onsemi 0:098463de4c5d 161 while (fptr) {
group-onsemi 0:098463de4c5d 162 pFunctionPointerWithContext_t deadPtr = fptr;
group-onsemi 0:098463de4c5d 163 fptr = deadPtr->getNext();
group-onsemi 0:098463de4c5d 164 delete deadPtr;
group-onsemi 0:098463de4c5d 165 }
group-onsemi 0:098463de4c5d 166
group-onsemi 0:098463de4c5d 167 chainHead = NULL;
group-onsemi 0:098463de4c5d 168 }
group-onsemi 0:098463de4c5d 169
group-onsemi 0:098463de4c5d 170 /**
group-onsemi 0:098463de4c5d 171 * Check whether the callchain contains any callbacks.
group-onsemi 0:098463de4c5d 172 *
group-onsemi 0:098463de4c5d 173 * @return true if the callchain is not empty and false otherwise.
group-onsemi 0:098463de4c5d 174 */
group-onsemi 0:098463de4c5d 175 bool hasCallbacksAttached(void) const {
group-onsemi 0:098463de4c5d 176 return (chainHead != NULL);
group-onsemi 0:098463de4c5d 177 }
group-onsemi 0:098463de4c5d 178
group-onsemi 0:098463de4c5d 179 /**
group-onsemi 0:098463de4c5d 180 * Call all the functions in the chain in sequence.
group-onsemi 0:098463de4c5d 181 */
group-onsemi 0:098463de4c5d 182 void call(ContextType context) {
group-onsemi 0:098463de4c5d 183 ((const CallChainOfFunctionPointersWithContext*) this)->call(context);
group-onsemi 0:098463de4c5d 184 }
group-onsemi 0:098463de4c5d 185
group-onsemi 0:098463de4c5d 186 /**
group-onsemi 0:098463de4c5d 187 * Same as call() above, but const.
group-onsemi 0:098463de4c5d 188 */
group-onsemi 0:098463de4c5d 189 void call(ContextType context) const {
group-onsemi 0:098463de4c5d 190 currentCalled = chainHead;
group-onsemi 0:098463de4c5d 191
group-onsemi 0:098463de4c5d 192 while(currentCalled) {
group-onsemi 0:098463de4c5d 193 currentCalled->call(context);
group-onsemi 0:098463de4c5d 194 // if this was the head and the call removed the head
group-onsemi 0:098463de4c5d 195 if(currentCalled == NULL) {
group-onsemi 0:098463de4c5d 196 currentCalled = chainHead;
group-onsemi 0:098463de4c5d 197 } else {
group-onsemi 0:098463de4c5d 198 currentCalled = currentCalled->getNext();
group-onsemi 0:098463de4c5d 199 }
group-onsemi 0:098463de4c5d 200 }
group-onsemi 0:098463de4c5d 201 }
group-onsemi 0:098463de4c5d 202
group-onsemi 0:098463de4c5d 203 /**
group-onsemi 0:098463de4c5d 204 * Same as call(), but with function call operator.
group-onsemi 0:098463de4c5d 205 * @code
group-onsemi 0:098463de4c5d 206 *
group-onsemi 0:098463de4c5d 207 * void first(bool);
group-onsemi 0:098463de4c5d 208 * void second(bool);
group-onsemi 0:098463de4c5d 209 *
group-onsemi 0:098463de4c5d 210 * CallChainOfFunctionPointerWithContext<bool> foo;
group-onsemi 0:098463de4c5d 211 *
group-onsemi 0:098463de4c5d 212 * foo.attach(first);
group-onsemi 0:098463de4c5d 213 * foo.attach(second);
group-onsemi 0:098463de4c5d 214 *
group-onsemi 0:098463de4c5d 215 * // call the callchain like a function
group-onsemi 0:098463de4c5d 216 * foo(true);
group-onsemi 0:098463de4c5d 217 *
group-onsemi 0:098463de4c5d 218 * @endcode
group-onsemi 0:098463de4c5d 219 */
group-onsemi 0:098463de4c5d 220 void operator()(ContextType context) const {
group-onsemi 0:098463de4c5d 221 call(context);
group-onsemi 0:098463de4c5d 222 }
group-onsemi 0:098463de4c5d 223
group-onsemi 0:098463de4c5d 224 /**
group-onsemi 0:098463de4c5d 225 * Bool conversion operation.
group-onsemi 0:098463de4c5d 226 *
group-onsemi 0:098463de4c5d 227 * @return true if the callchain is not empty and false otherwise.
group-onsemi 0:098463de4c5d 228 */
group-onsemi 0:098463de4c5d 229 bool toBool() const {
group-onsemi 0:098463de4c5d 230 return chainHead != NULL;
group-onsemi 0:098463de4c5d 231 }
group-onsemi 0:098463de4c5d 232
group-onsemi 0:098463de4c5d 233 private:
group-onsemi 0:098463de4c5d 234 /**
group-onsemi 0:098463de4c5d 235 * Add a callback to the head of the callchain.
group-onsemi 0:098463de4c5d 236 *
group-onsemi 0:098463de4c5d 237 * @return A pointer to the head of the callchain.
group-onsemi 0:098463de4c5d 238 */
group-onsemi 0:098463de4c5d 239 pFunctionPointerWithContext_t common_add(pFunctionPointerWithContext_t pf) {
group-onsemi 0:098463de4c5d 240 if (chainHead == NULL) {
group-onsemi 0:098463de4c5d 241 chainHead = pf;
group-onsemi 0:098463de4c5d 242 } else {
group-onsemi 0:098463de4c5d 243 pf->chainAsNext(chainHead);
group-onsemi 0:098463de4c5d 244 chainHead = pf;
group-onsemi 0:098463de4c5d 245 }
group-onsemi 0:098463de4c5d 246
group-onsemi 0:098463de4c5d 247 return chainHead;
group-onsemi 0:098463de4c5d 248 }
group-onsemi 0:098463de4c5d 249
group-onsemi 0:098463de4c5d 250 private:
group-onsemi 0:098463de4c5d 251 /**
group-onsemi 0:098463de4c5d 252 * A pointer to the first callback in the callchain or NULL if the callchain is empty.
group-onsemi 0:098463de4c5d 253 */
group-onsemi 0:098463de4c5d 254 pFunctionPointerWithContext_t chainHead;
group-onsemi 0:098463de4c5d 255
group-onsemi 0:098463de4c5d 256 /**
group-onsemi 0:098463de4c5d 257 * Iterator during a function call, this has to be mutable because the call function is const.
group-onsemi 0:098463de4c5d 258 *
group-onsemi 0:098463de4c5d 259 * @note Mutable is the correct behaviour here, the iterator never leaks outside the object.
group-onsemi 0:098463de4c5d 260 * so the object can still be seen as logically const even if it is modified.
group-onsemi 0:098463de4c5d 261 */
group-onsemi 0:098463de4c5d 262 mutable pFunctionPointerWithContext_t currentCalled;
group-onsemi 0:098463de4c5d 263
group-onsemi 0:098463de4c5d 264
group-onsemi 0:098463de4c5d 265 /* Disallow copy constructor and assignment operators. */
group-onsemi 0:098463de4c5d 266 private:
group-onsemi 0:098463de4c5d 267 CallChainOfFunctionPointersWithContext(const CallChainOfFunctionPointersWithContext &);
group-onsemi 0:098463de4c5d 268 CallChainOfFunctionPointersWithContext & operator = (const CallChainOfFunctionPointersWithContext &);
group-onsemi 0:098463de4c5d 269 };
group-onsemi 0:098463de4c5d 270
group-onsemi 0:098463de4c5d 271 #endif