Fork of Smoothie to port to mbed non-LPC targets.

Dependencies:   mbed

Fork of Smoothie by Stéphane Cachat

Committer:
Bigcheese
Date:
Sun Mar 02 06:33:08 2014 +0000
Revision:
3:f151d08d335c
Parent:
2:1df0b61d3b5a
Bunch of stuff. Need to locally merge in updated USB changes.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Michael J. Spencer 2:1df0b61d3b5a 1 /*
Michael J. Spencer 2:1df0b61d3b5a 2 Copyright (c) 2011 Andy Kirkham
Michael J. Spencer 2:1df0b61d3b5a 3 Permission is hereby granted, free of charge, to any person obtaining a copy
Michael J. Spencer 2:1df0b61d3b5a 4 of this software and associated documentation files (the "Software"), to deal
Michael J. Spencer 2:1df0b61d3b5a 5 in the Software without restriction, including without limitation the rights
Michael J. Spencer 2:1df0b61d3b5a 6 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
Michael J. Spencer 2:1df0b61d3b5a 7 copies of the Software, and to permit persons to whom the Software is
Michael J. Spencer 2:1df0b61d3b5a 8 furnished to do so, subject to the following conditions:
Michael J. Spencer 2:1df0b61d3b5a 9 The above copyright notice and this permission notice shall be included in
Michael J. Spencer 2:1df0b61d3b5a 10 all copies or substantial portions of the Software.
Michael J. Spencer 2:1df0b61d3b5a 11 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
Michael J. Spencer 2:1df0b61d3b5a 12 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
Michael J. Spencer 2:1df0b61d3b5a 13 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
Michael J. Spencer 2:1df0b61d3b5a 14 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
Michael J. Spencer 2:1df0b61d3b5a 15 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
Michael J. Spencer 2:1df0b61d3b5a 16 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
Michael J. Spencer 2:1df0b61d3b5a 17 THE SOFTWARE.
Michael J. Spencer 2:1df0b61d3b5a 18 */
Michael J. Spencer 2:1df0b61d3b5a 19
Michael J. Spencer 2:1df0b61d3b5a 20 #ifndef AJK_FPOINTER_H
Michael J. Spencer 2:1df0b61d3b5a 21 #define AJK_FPOINTER_H
Michael J. Spencer 2:1df0b61d3b5a 22
Michael J. Spencer 2:1df0b61d3b5a 23 #ifndef NULL
Michael J. Spencer 2:1df0b61d3b5a 24 #define NULL 0
Michael J. Spencer 2:1df0b61d3b5a 25 #endif
Michael J. Spencer 2:1df0b61d3b5a 26
Michael J. Spencer 2:1df0b61d3b5a 27 #include <cstdint>
Michael J. Spencer 2:1df0b61d3b5a 28
Michael J. Spencer 2:1df0b61d3b5a 29 namespace AjK {
Michael J. Spencer 2:1df0b61d3b5a 30
Michael J. Spencer 2:1df0b61d3b5a 31 class FPointerDummy;
Michael J. Spencer 2:1df0b61d3b5a 32
Michael J. Spencer 2:1df0b61d3b5a 33 /** FPointer - Adds callbacks that take and return a 32bit uint32_t data type.
Michael J. Spencer 2:1df0b61d3b5a 34 *
Michael J. Spencer 2:1df0b61d3b5a 35 * The Mbed library supplies a callback using the FunctionPointer object as
Michael J. Spencer 2:1df0b61d3b5a 36 * defined in FunctionPointer.h However, this callback system does not allow
Michael J. Spencer 2:1df0b61d3b5a 37 * the caller to pass a value to the callback. Likewise, the callback itself
Michael J. Spencer 2:1df0b61d3b5a 38 * cannot return a value.
Michael J. Spencer 2:1df0b61d3b5a 39 *
Michael J. Spencer 2:1df0b61d3b5a 40 * FPointer operates in the same way but allows the callback function to be
Michael J. Spencer 2:1df0b61d3b5a 41 * passed one arg, a uint32_t value. Additionally, the callback can return
Michael J. Spencer 2:1df0b61d3b5a 42 * a single uint32_t value. The reason for using uint32_t is that the Mbed
Michael J. Spencer 2:1df0b61d3b5a 43 * and the microcontroller (LPC1768) have a natural data size of 32bits and
Michael J. Spencer 2:1df0b61d3b5a 44 * this means we can use the uint32_t as a pointer. See example1.h for more
Michael J. Spencer 2:1df0b61d3b5a 45 * information. This example passes an "int" by passing a pointer to that
Michael J. Spencer 2:1df0b61d3b5a 46 * int as a 32bit value. Using this technique you can pass any value you like.
Michael J. Spencer 2:1df0b61d3b5a 47 * All you have to do is pass a pointer to your value cast to (uint32_t). Your
Michael J. Spencer 2:1df0b61d3b5a 48 * callback can the deference it to get the original value.
Michael J. Spencer 2:1df0b61d3b5a 49 *
Michael J. Spencer 2:1df0b61d3b5a 50 * example2.h shows how to do the same thing but demostrates how to specify
Michael J. Spencer 2:1df0b61d3b5a 51 * the callback into a class object/method.
Michael J. Spencer 2:1df0b61d3b5a 52 *
Michael J. Spencer 2:1df0b61d3b5a 53 * Finally, example3.h shows how to pass multiple values. In this example we
Michael J. Spencer 2:1df0b61d3b5a 54 * define a data structure and in the callback we pass a pointer to that
Michael J. Spencer 2:1df0b61d3b5a 55 * data structure thus allowing the callback to again get the values.
Michael J. Spencer 2:1df0b61d3b5a 56 *
Michael J. Spencer 2:1df0b61d3b5a 57 * Note, when passing pointers to variables to the callback, if the callback
Michael J. Spencer 2:1df0b61d3b5a 58 * function/method changes that variable's value then it will also change the
Michael J. Spencer 2:1df0b61d3b5a 59 * value the caller sees. If C pointers are new to you, you are strongly
Michael J. Spencer 2:1df0b61d3b5a 60 * advised to read up on the subject. It's pointers that often get beginners
Michael J. Spencer 2:1df0b61d3b5a 61 * into trouble when mis-used.
Michael J. Spencer 2:1df0b61d3b5a 62 *
Michael J. Spencer 2:1df0b61d3b5a 63 * @see example1.h
Michael J. Spencer 2:1df0b61d3b5a 64 * @see example2.h
Michael J. Spencer 2:1df0b61d3b5a 65 * @see example3.h
Michael J. Spencer 2:1df0b61d3b5a 66 * @see http://mbed.org/handbook/C-Data-Types
Michael J. Spencer 2:1df0b61d3b5a 67 * @see http://mbed.org/projects/libraries/svn/mbed/trunk/FunctionPointer.h
Michael J. Spencer 2:1df0b61d3b5a 68 */
Michael J. Spencer 2:1df0b61d3b5a 69 class FPointer {
Michael J. Spencer 2:1df0b61d3b5a 70
Michael J. Spencer 2:1df0b61d3b5a 71 protected:
Michael J. Spencer 2:1df0b61d3b5a 72
Michael J. Spencer 2:1df0b61d3b5a 73 //! C callback function pointer.
Michael J. Spencer 2:1df0b61d3b5a 74 uint32_t (*c_callback)(uint32_t);
Michael J. Spencer 2:1df0b61d3b5a 75
Michael J. Spencer 2:1df0b61d3b5a 76 //! C++ callback object/method pointer (the object part).
Michael J. Spencer 2:1df0b61d3b5a 77 FPointerDummy *obj_callback;
Michael J. Spencer 2:1df0b61d3b5a 78
Michael J. Spencer 2:1df0b61d3b5a 79 //! C++ callback object/method pointer (the method part).
Michael J. Spencer 2:1df0b61d3b5a 80 uint32_t (FPointerDummy::*method_callback)(uint32_t);
Michael J. Spencer 2:1df0b61d3b5a 81
Michael J. Spencer 2:1df0b61d3b5a 82 public:
Michael J. Spencer 2:1df0b61d3b5a 83
Michael J. Spencer 2:1df0b61d3b5a 84 /** Constructor
Michael J. Spencer 2:1df0b61d3b5a 85 */
Michael J. Spencer 2:1df0b61d3b5a 86 FPointer() {
Michael J. Spencer 2:1df0b61d3b5a 87 c_callback = NULL;
Michael J. Spencer 2:1df0b61d3b5a 88 obj_callback = NULL;
Michael J. Spencer 2:1df0b61d3b5a 89 method_callback = NULL;
Michael J. Spencer 2:1df0b61d3b5a 90 }
Michael J. Spencer 2:1df0b61d3b5a 91
Michael J. Spencer 2:1df0b61d3b5a 92 /** attach - Overloaded attachment function.
Michael J. Spencer 2:1df0b61d3b5a 93 *
Michael J. Spencer 2:1df0b61d3b5a 94 * Attach a C type function pointer as the callback.
Michael J. Spencer 2:1df0b61d3b5a 95 *
Michael J. Spencer 2:1df0b61d3b5a 96 * Note, the callback function prototype must be:-
Michael J. Spencer 2:1df0b61d3b5a 97 * @code
Michael J. Spencer 2:1df0b61d3b5a 98 * uint32_t myCallbackFunction(uint32_t);
Michael J. Spencer 2:1df0b61d3b5a 99 * @endcode
Michael J. Spencer 2:1df0b61d3b5a 100 * @param A C function pointer to call.
Michael J. Spencer 2:1df0b61d3b5a 101 */
Michael J. Spencer 2:1df0b61d3b5a 102 void attach(uint32_t (*function)(uint32_t) = 0) { c_callback = function; }
Michael J. Spencer 2:1df0b61d3b5a 103
Michael J. Spencer 2:1df0b61d3b5a 104 /** attach - Overloaded attachment function.
Michael J. Spencer 2:1df0b61d3b5a 105 *
Michael J. Spencer 2:1df0b61d3b5a 106 * Attach a C++ type object/method pointer as the callback.
Michael J. Spencer 2:1df0b61d3b5a 107 *
Michael J. Spencer 2:1df0b61d3b5a 108 * Note, the callback method prototype must be:-
Michael J. Spencer 2:1df0b61d3b5a 109 * @code
Michael J. Spencer 2:1df0b61d3b5a 110 * public:
Michael J. Spencer 2:1df0b61d3b5a 111 * uint32_t myCallbackFunction(uint32_t);
Michael J. Spencer 2:1df0b61d3b5a 112 * @endcode
Michael J. Spencer 2:1df0b61d3b5a 113 * @param A C++ object pointer.
Michael J. Spencer 2:1df0b61d3b5a 114 * @param A C++ method within the object to call.
Michael J. Spencer 2:1df0b61d3b5a 115 */
Michael J. Spencer 2:1df0b61d3b5a 116 template<class T>
Michael J. Spencer 2:1df0b61d3b5a 117 void attach(T* item, uint32_t (T::*method)(uint32_t)) {
Michael J. Spencer 2:1df0b61d3b5a 118 obj_callback = (FPointerDummy *)item;
Michael J. Spencer 2:1df0b61d3b5a 119 method_callback = (uint32_t (FPointerDummy::*)(uint32_t))method;
Michael J. Spencer 2:1df0b61d3b5a 120 }
Michael J. Spencer 2:1df0b61d3b5a 121
Michael J. Spencer 2:1df0b61d3b5a 122 /** call - Overloaded callback initiator.
Michael J. Spencer 2:1df0b61d3b5a 123 *
Michael J. Spencer 2:1df0b61d3b5a 124 * call the callback function.
Michael J. Spencer 2:1df0b61d3b5a 125 *
Michael J. Spencer 2:1df0b61d3b5a 126 * @param uint32_t The value to pass to the callback.
Michael J. Spencer 2:1df0b61d3b5a 127 * @return uint32_t The value the callback returns.
Michael J. Spencer 2:1df0b61d3b5a 128 */
Michael J. Spencer 2:1df0b61d3b5a 129 uint32_t call(uint32_t arg) {
Michael J. Spencer 2:1df0b61d3b5a 130 if (c_callback != NULL) {
Michael J. Spencer 2:1df0b61d3b5a 131 return (*c_callback)(arg);
Michael J. Spencer 2:1df0b61d3b5a 132 }
Michael J. Spencer 2:1df0b61d3b5a 133 else {
Michael J. Spencer 2:1df0b61d3b5a 134 if (obj_callback != NULL && method_callback != NULL) {
Michael J. Spencer 2:1df0b61d3b5a 135 return (obj_callback->*method_callback)(arg);
Michael J. Spencer 2:1df0b61d3b5a 136 }
Michael J. Spencer 2:1df0b61d3b5a 137 }
Michael J. Spencer 2:1df0b61d3b5a 138 return (uint32_t)NULL;
Michael J. Spencer 2:1df0b61d3b5a 139 }
Michael J. Spencer 2:1df0b61d3b5a 140
Michael J. Spencer 2:1df0b61d3b5a 141 /** call - Overloaded callback initiator.
Michael J. Spencer 2:1df0b61d3b5a 142 *
Michael J. Spencer 2:1df0b61d3b5a 143 * Call the callback function without passing an argument.
Michael J. Spencer 2:1df0b61d3b5a 144 * The callback itself is passed NULL. Note, the callback
Michael J. Spencer 2:1df0b61d3b5a 145 * prototype should still be <b>uint32_t callback(uint32_t)</b>.
Michael J. Spencer 2:1df0b61d3b5a 146 *
Michael J. Spencer 2:1df0b61d3b5a 147 * @return uint32_t The value the callback returns.
Michael J. Spencer 2:1df0b61d3b5a 148 */
Michael J. Spencer 2:1df0b61d3b5a 149 uint32_t call(void) {
Michael J. Spencer 2:1df0b61d3b5a 150 if (c_callback != NULL) {
Michael J. Spencer 2:1df0b61d3b5a 151 return (*c_callback)((uint32_t)NULL);
Michael J. Spencer 2:1df0b61d3b5a 152 }
Michael J. Spencer 2:1df0b61d3b5a 153 else {
Michael J. Spencer 2:1df0b61d3b5a 154 if (obj_callback != NULL && method_callback != NULL) {
Michael J. Spencer 2:1df0b61d3b5a 155 return (obj_callback->*method_callback)((uint32_t)NULL);
Michael J. Spencer 2:1df0b61d3b5a 156 }
Michael J. Spencer 2:1df0b61d3b5a 157 }
Michael J. Spencer 2:1df0b61d3b5a 158 return (uint32_t)NULL;
Michael J. Spencer 2:1df0b61d3b5a 159 }
Michael J. Spencer 2:1df0b61d3b5a 160 };
Michael J. Spencer 2:1df0b61d3b5a 161
Michael J. Spencer 2:1df0b61d3b5a 162 }; // namespace AjK ends
Michael J. Spencer 2:1df0b61d3b5a 163
Michael J. Spencer 2:1df0b61d3b5a 164 using namespace AjK;
Michael J. Spencer 2:1df0b61d3b5a 165
Michael J. Spencer 2:1df0b61d3b5a 166 #endif