mouvement AX12 petit robot version 2

Fork of command_AX12_petit_robot_v2 by CRAC Team

Committer:
ClementBreteau
Date:
Fri May 12 14:35:09 2017 +0000
Revision:
7:ad4a19e26b84
Parent:
2:99b1cb0d9f5e
position ax12

Who changed what in which revision?

UserRevisionLine numberNew contents of line
SquirrelGod 2:99b1cb0d9f5e 1 /* mbed Microcontroller Library - FunctionPointer
SquirrelGod 2:99b1cb0d9f5e 2 * Copyright (c) 2007-2009 ARM Limited. All rights reserved.
SquirrelGod 2:99b1cb0d9f5e 3 */
SquirrelGod 2:99b1cb0d9f5e 4
SquirrelGod 2:99b1cb0d9f5e 5 #ifndef MBED_FUNCTIONPOINTER_H
SquirrelGod 2:99b1cb0d9f5e 6 #define MBED_FUNCTIONPOINTER_H
SquirrelGod 2:99b1cb0d9f5e 7
SquirrelGod 2:99b1cb0d9f5e 8 #include <string.h>
SquirrelGod 2:99b1cb0d9f5e 9
SquirrelGod 2:99b1cb0d9f5e 10 namespace mbed {
SquirrelGod 2:99b1cb0d9f5e 11
SquirrelGod 2:99b1cb0d9f5e 12 /* Class FunctionPointer
SquirrelGod 2:99b1cb0d9f5e 13 * A class for storing and calling a pointer to a static or member void function
SquirrelGod 2:99b1cb0d9f5e 14 */
SquirrelGod 2:99b1cb0d9f5e 15 class FunctionPointer {
SquirrelGod 2:99b1cb0d9f5e 16
SquirrelGod 2:99b1cb0d9f5e 17 public:
SquirrelGod 2:99b1cb0d9f5e 18
SquirrelGod 2:99b1cb0d9f5e 19 /* Constructor FunctionPointer
SquirrelGod 2:99b1cb0d9f5e 20 * Create a FunctionPointer, attaching a static function
SquirrelGod 2:99b1cb0d9f5e 21 *
SquirrelGod 2:99b1cb0d9f5e 22 * Variables
SquirrelGod 2:99b1cb0d9f5e 23 * function - The void static function to attach (default is none)
SquirrelGod 2:99b1cb0d9f5e 24 */
SquirrelGod 2:99b1cb0d9f5e 25 FunctionPointer(void (*function)(void) = 0);
SquirrelGod 2:99b1cb0d9f5e 26
SquirrelGod 2:99b1cb0d9f5e 27 /* Constructor FunctionPointer
SquirrelGod 2:99b1cb0d9f5e 28 * Create a FunctionPointer, attaching a member function
SquirrelGod 2:99b1cb0d9f5e 29 *
SquirrelGod 2:99b1cb0d9f5e 30 * Variables
SquirrelGod 2:99b1cb0d9f5e 31 * object - The object pointer to invoke the member function on (i.e. the this pointer)
SquirrelGod 2:99b1cb0d9f5e 32 * function - The address of the void member function to attach
SquirrelGod 2:99b1cb0d9f5e 33 */
SquirrelGod 2:99b1cb0d9f5e 34 template<typename T>
SquirrelGod 2:99b1cb0d9f5e 35 FunctionPointer(T *object, void (T::*member)(void)) {
SquirrelGod 2:99b1cb0d9f5e 36 attach(object, member);
SquirrelGod 2:99b1cb0d9f5e 37 }
SquirrelGod 2:99b1cb0d9f5e 38
SquirrelGod 2:99b1cb0d9f5e 39 /* Function attach
SquirrelGod 2:99b1cb0d9f5e 40 * Attach a static function
SquirrelGod 2:99b1cb0d9f5e 41 *
SquirrelGod 2:99b1cb0d9f5e 42 * Variables
SquirrelGod 2:99b1cb0d9f5e 43 * function - The void static function to attach (default is none)
SquirrelGod 2:99b1cb0d9f5e 44 */
SquirrelGod 2:99b1cb0d9f5e 45 void attach(void (*function)(void) = 0);
SquirrelGod 2:99b1cb0d9f5e 46
SquirrelGod 2:99b1cb0d9f5e 47 /* Function attach
SquirrelGod 2:99b1cb0d9f5e 48 * Attach a member function
SquirrelGod 2:99b1cb0d9f5e 49 *
SquirrelGod 2:99b1cb0d9f5e 50 * Variables
SquirrelGod 2:99b1cb0d9f5e 51 * object - The object pointer to invoke the member function on (i.e. the this pointer)
SquirrelGod 2:99b1cb0d9f5e 52 * function - The address of the void member function to attach
SquirrelGod 2:99b1cb0d9f5e 53 */
SquirrelGod 2:99b1cb0d9f5e 54 template<typename T>
SquirrelGod 2:99b1cb0d9f5e 55 void attach(T *object, void (T::*member)(void)) {
SquirrelGod 2:99b1cb0d9f5e 56 _object = static_cast<void*>(object);
SquirrelGod 2:99b1cb0d9f5e 57 memcpy(_member, (char*)&member, sizeof(member));
SquirrelGod 2:99b1cb0d9f5e 58 _membercaller = &FunctionPointer::membercaller<T>;
SquirrelGod 2:99b1cb0d9f5e 59 _function = 0;
SquirrelGod 2:99b1cb0d9f5e 60 }
SquirrelGod 2:99b1cb0d9f5e 61
SquirrelGod 2:99b1cb0d9f5e 62 /* Function call
SquirrelGod 2:99b1cb0d9f5e 63 * Call the attached static or member function
SquirrelGod 2:99b1cb0d9f5e 64 */
SquirrelGod 2:99b1cb0d9f5e 65 void call();
SquirrelGod 2:99b1cb0d9f5e 66
SquirrelGod 2:99b1cb0d9f5e 67 private:
SquirrelGod 2:99b1cb0d9f5e 68
SquirrelGod 2:99b1cb0d9f5e 69 template<typename T>
SquirrelGod 2:99b1cb0d9f5e 70 static void membercaller(void *object, char *member) {
SquirrelGod 2:99b1cb0d9f5e 71 T* o = static_cast<T*>(object);
SquirrelGod 2:99b1cb0d9f5e 72 void (T::*m)(void);
SquirrelGod 2:99b1cb0d9f5e 73 memcpy((char*)&m, member, sizeof(m));
SquirrelGod 2:99b1cb0d9f5e 74 (o->*m)();
SquirrelGod 2:99b1cb0d9f5e 75 }
SquirrelGod 2:99b1cb0d9f5e 76
SquirrelGod 2:99b1cb0d9f5e 77 void (*_function)(void); // static function pointer - 0 if none attached
SquirrelGod 2:99b1cb0d9f5e 78 void *_object; // object this pointer - 0 if none attached
SquirrelGod 2:99b1cb0d9f5e 79 char _member[16]; // raw member function pointer storage - converted back by registered _membercaller
SquirrelGod 2:99b1cb0d9f5e 80 void (*_membercaller)(void*, char*); // registered membercaller function to convert back and call _member on _object
SquirrelGod 2:99b1cb0d9f5e 81
SquirrelGod 2:99b1cb0d9f5e 82 };
SquirrelGod 2:99b1cb0d9f5e 83
SquirrelGod 2:99b1cb0d9f5e 84 } // namespace mbed
SquirrelGod 2:99b1cb0d9f5e 85
SquirrelGod 2:99b1cb0d9f5e 86 #endif