strat des robots

Fork of CRAC-Strat_2017 by CRAC Team

Committer:
ClementBreteau
Date:
Fri May 19 17:14:07 2017 +0000
Revision:
17:d1594579eec6
Parent:
0:ad97421fb1fb
strat du robot, 19-05-2017, 19h

Who changed what in which revision?

UserRevisionLine numberNew contents of line
antbig 0:ad97421fb1fb 1 /* mbed Microcontroller Library - Base
antbig 0:ad97421fb1fb 2 * Copyright (c) 2006-2008 ARM Limited. All rights reserved.
antbig 0:ad97421fb1fb 3 */
antbig 0:ad97421fb1fb 4
antbig 0:ad97421fb1fb 5 #ifndef MBED_BASE_H
antbig 0:ad97421fb1fb 6 #define MBED_BASE_H
antbig 0:ad97421fb1fb 7
antbig 0:ad97421fb1fb 8 #include "platform.h"
antbig 0:ad97421fb1fb 9 #include "PinNames.h"
antbig 0:ad97421fb1fb 10 #include "PeripheralNames.h"
antbig 0:ad97421fb1fb 11 #include <cstdlib>
antbig 0:ad97421fb1fb 12 #include "DirHandle.h"
antbig 0:ad97421fb1fb 13
antbig 0:ad97421fb1fb 14 namespace mbed {
antbig 0:ad97421fb1fb 15
antbig 0:ad97421fb1fb 16 #ifdef MBED_RPC
antbig 0:ad97421fb1fb 17 struct rpc_function {
antbig 0:ad97421fb1fb 18 const char *name;
antbig 0:ad97421fb1fb 19 void (*caller)(const char*, char*);
antbig 0:ad97421fb1fb 20 };
antbig 0:ad97421fb1fb 21
antbig 0:ad97421fb1fb 22 struct rpc_class {
antbig 0:ad97421fb1fb 23 const char *name;
antbig 0:ad97421fb1fb 24 const rpc_function *static_functions;
antbig 0:ad97421fb1fb 25 struct rpc_class *next;
antbig 0:ad97421fb1fb 26 };
antbig 0:ad97421fb1fb 27 #endif
antbig 0:ad97421fb1fb 28
antbig 0:ad97421fb1fb 29 /* Class Base
antbig 0:ad97421fb1fb 30 * The base class for most things
antbig 0:ad97421fb1fb 31 */
antbig 0:ad97421fb1fb 32 class Base {
antbig 0:ad97421fb1fb 33
antbig 0:ad97421fb1fb 34 public:
antbig 0:ad97421fb1fb 35
antbig 0:ad97421fb1fb 36 Base(const char *name = NULL);
antbig 0:ad97421fb1fb 37
antbig 0:ad97421fb1fb 38 virtual ~Base();
antbig 0:ad97421fb1fb 39
antbig 0:ad97421fb1fb 40 /* Function register_object
antbig 0:ad97421fb1fb 41 * Registers this object with the given name, so that it can be
antbig 0:ad97421fb1fb 42 * looked up with lookup. If this object has already been
antbig 0:ad97421fb1fb 43 * registered, then this just changes the name.
antbig 0:ad97421fb1fb 44 *
antbig 0:ad97421fb1fb 45 * Variables
antbig 0:ad97421fb1fb 46 * name - The name to give the object. If NULL we do nothing.
antbig 0:ad97421fb1fb 47 */
antbig 0:ad97421fb1fb 48 void register_object(const char *name);
antbig 0:ad97421fb1fb 49
antbig 0:ad97421fb1fb 50 /* Function name
antbig 0:ad97421fb1fb 51 * Returns the name of the object, or NULL if it has no name.
antbig 0:ad97421fb1fb 52 */
antbig 0:ad97421fb1fb 53 const char *name();
antbig 0:ad97421fb1fb 54
antbig 0:ad97421fb1fb 55 #ifdef MBED_RPC
antbig 0:ad97421fb1fb 56
antbig 0:ad97421fb1fb 57 /* Function rpc
antbig 0:ad97421fb1fb 58 * Call the given method with the given arguments, and write the
antbig 0:ad97421fb1fb 59 * result into the string pointed to by result. The default
antbig 0:ad97421fb1fb 60 * implementation calls rpc_methods to determine the supported
antbig 0:ad97421fb1fb 61 * methods.
antbig 0:ad97421fb1fb 62 *
antbig 0:ad97421fb1fb 63 * Variables
antbig 0:ad97421fb1fb 64 * method - The name of the method to call.
antbig 0:ad97421fb1fb 65 * arguments - A list of arguments separated by spaces.
antbig 0:ad97421fb1fb 66 * result - A pointer to a string to write the result into. May
antbig 0:ad97421fb1fb 67 * be NULL, in which case nothing is written.
antbig 0:ad97421fb1fb 68 *
antbig 0:ad97421fb1fb 69 * Returns
antbig 0:ad97421fb1fb 70 * true if method corresponds to a valid rpc method, or
antbig 0:ad97421fb1fb 71 * false otherwise.
antbig 0:ad97421fb1fb 72 */
antbig 0:ad97421fb1fb 73 virtual bool rpc(const char *method, const char *arguments, char *result);
antbig 0:ad97421fb1fb 74
antbig 0:ad97421fb1fb 75 /* Function get_rpc_methods
antbig 0:ad97421fb1fb 76 * Returns a pointer to an array describing the rpc methods
antbig 0:ad97421fb1fb 77 * supported by this object, terminated by either
antbig 0:ad97421fb1fb 78 * RPC_METHOD_END or RPC_METHOD_SUPER(Superclass).
antbig 0:ad97421fb1fb 79 *
antbig 0:ad97421fb1fb 80 * Example
antbig 0:ad97421fb1fb 81 * > class Example : public Base {
antbig 0:ad97421fb1fb 82 * > int foo(int a, int b) { return a + b; }
antbig 0:ad97421fb1fb 83 * > virtual const struct rpc_method *get_rpc_methods() {
antbig 0:ad97421fb1fb 84 * > static const rpc_method rpc_methods[] = {
antbig 0:ad97421fb1fb 85 * > { "foo", generic_caller<int, Example, int, int, &Example::foo> },
antbig 0:ad97421fb1fb 86 * > RPC_METHOD_SUPER(Base)
antbig 0:ad97421fb1fb 87 * > };
antbig 0:ad97421fb1fb 88 * > return rpc_methods;
antbig 0:ad97421fb1fb 89 * > }
antbig 0:ad97421fb1fb 90 * > };
antbig 0:ad97421fb1fb 91 */
antbig 0:ad97421fb1fb 92 virtual const struct rpc_method *get_rpc_methods();
antbig 0:ad97421fb1fb 93
antbig 0:ad97421fb1fb 94 /* Function rpc
antbig 0:ad97421fb1fb 95 * Use the lookup function to lookup an object and, if
antbig 0:ad97421fb1fb 96 * successful, call its rpc method
antbig 0:ad97421fb1fb 97 *
antbig 0:ad97421fb1fb 98 * Variables
antbig 0:ad97421fb1fb 99 * returns - false if name does not correspond to an object,
antbig 0:ad97421fb1fb 100 * otherwise the return value of the call to the object's rpc
antbig 0:ad97421fb1fb 101 * method.
antbig 0:ad97421fb1fb 102 */
antbig 0:ad97421fb1fb 103 static bool rpc(const char *name, const char *method, const char *arguments, char *result);
antbig 0:ad97421fb1fb 104
antbig 0:ad97421fb1fb 105 #endif
antbig 0:ad97421fb1fb 106
antbig 0:ad97421fb1fb 107 /* Function lookup
antbig 0:ad97421fb1fb 108 * Lookup and return the object that has the given name.
antbig 0:ad97421fb1fb 109 *
antbig 0:ad97421fb1fb 110 * Variables
antbig 0:ad97421fb1fb 111 * name - the name to lookup.
antbig 0:ad97421fb1fb 112 * len - the length of name.
antbig 0:ad97421fb1fb 113 */
antbig 0:ad97421fb1fb 114 static Base *lookup(const char *name, unsigned int len);
antbig 0:ad97421fb1fb 115
antbig 0:ad97421fb1fb 116 static DirHandle *opendir();
antbig 0:ad97421fb1fb 117 friend class BaseDirHandle;
antbig 0:ad97421fb1fb 118
antbig 0:ad97421fb1fb 119 protected:
antbig 0:ad97421fb1fb 120
antbig 0:ad97421fb1fb 121 static Base *_head;
antbig 0:ad97421fb1fb 122 Base *_next;
antbig 0:ad97421fb1fb 123 const char *_name;
antbig 0:ad97421fb1fb 124 bool _from_construct;
antbig 0:ad97421fb1fb 125
antbig 0:ad97421fb1fb 126 private:
antbig 0:ad97421fb1fb 127
antbig 0:ad97421fb1fb 128 #ifdef MBED_RPC
antbig 0:ad97421fb1fb 129 static rpc_class *_classes;
antbig 0:ad97421fb1fb 130
antbig 0:ad97421fb1fb 131 static const rpc_function _base_funcs[];
antbig 0:ad97421fb1fb 132 static rpc_class _base_class;
antbig 0:ad97421fb1fb 133 #endif
antbig 0:ad97421fb1fb 134
antbig 0:ad97421fb1fb 135 void delete_self();
antbig 0:ad97421fb1fb 136 static void list_objs(const char *arguments, char *result);
antbig 0:ad97421fb1fb 137 static void clear(const char*,char*);
antbig 0:ad97421fb1fb 138
antbig 0:ad97421fb1fb 139 static char *new_name(Base *p);
antbig 0:ad97421fb1fb 140
antbig 0:ad97421fb1fb 141 public:
antbig 0:ad97421fb1fb 142
antbig 0:ad97421fb1fb 143 #ifdef MBED_RPC
antbig 0:ad97421fb1fb 144 /* Function add_rpc_class
antbig 0:ad97421fb1fb 145 * Add the class to the list of classes which can have static
antbig 0:ad97421fb1fb 146 * methods called via rpc (the static methods which can be called
antbig 0:ad97421fb1fb 147 * are defined by that class' get_rpc_class() static method).
antbig 0:ad97421fb1fb 148 */
antbig 0:ad97421fb1fb 149 template<class C>
antbig 0:ad97421fb1fb 150 static void add_rpc_class() {
antbig 0:ad97421fb1fb 151 rpc_class *c = C::get_rpc_class();
antbig 0:ad97421fb1fb 152 c->next = _classes;
antbig 0:ad97421fb1fb 153 _classes = c;
antbig 0:ad97421fb1fb 154 }
antbig 0:ad97421fb1fb 155
antbig 0:ad97421fb1fb 156 template<class C>
antbig 0:ad97421fb1fb 157 static const char *construct() {
antbig 0:ad97421fb1fb 158 Base *p = new C();
antbig 0:ad97421fb1fb 159 p->_from_construct = true;
antbig 0:ad97421fb1fb 160 if(p->_name==NULL) {
antbig 0:ad97421fb1fb 161 p->register_object(new_name(p));
antbig 0:ad97421fb1fb 162 }
antbig 0:ad97421fb1fb 163 return p->_name;
antbig 0:ad97421fb1fb 164 }
antbig 0:ad97421fb1fb 165
antbig 0:ad97421fb1fb 166 template<class C, typename A1>
antbig 0:ad97421fb1fb 167 static const char *construct(A1 arg1) {
antbig 0:ad97421fb1fb 168 Base *p = new C(arg1);
antbig 0:ad97421fb1fb 169 p->_from_construct = true;
antbig 0:ad97421fb1fb 170 if(p->_name==NULL) {
antbig 0:ad97421fb1fb 171 p->register_object(new_name(p));
antbig 0:ad97421fb1fb 172 }
antbig 0:ad97421fb1fb 173 return p->_name;
antbig 0:ad97421fb1fb 174 }
antbig 0:ad97421fb1fb 175
antbig 0:ad97421fb1fb 176 template<class C, typename A1, typename A2>
antbig 0:ad97421fb1fb 177 static const char *construct(A1 arg1, A2 arg2) {
antbig 0:ad97421fb1fb 178 Base *p = new C(arg1,arg2);
antbig 0:ad97421fb1fb 179 p->_from_construct = true;
antbig 0:ad97421fb1fb 180 if(p->_name==NULL) {
antbig 0:ad97421fb1fb 181 p->register_object(new_name(p));
antbig 0:ad97421fb1fb 182 }
antbig 0:ad97421fb1fb 183 return p->_name;
antbig 0:ad97421fb1fb 184 }
antbig 0:ad97421fb1fb 185
antbig 0:ad97421fb1fb 186 template<class C, typename A1, typename A2, typename A3>
antbig 0:ad97421fb1fb 187 static const char *construct(A1 arg1, A2 arg2, A3 arg3) {
antbig 0:ad97421fb1fb 188 Base *p = new C(arg1,arg2,arg3);
antbig 0:ad97421fb1fb 189 p->_from_construct = true;
antbig 0:ad97421fb1fb 190 if(p->_name==NULL) {
antbig 0:ad97421fb1fb 191 p->register_object(new_name(p));
antbig 0:ad97421fb1fb 192 }
antbig 0:ad97421fb1fb 193 return p->_name;
antbig 0:ad97421fb1fb 194 }
antbig 0:ad97421fb1fb 195
antbig 0:ad97421fb1fb 196 template<class C, typename A1, typename A2, typename A3, typename A4>
antbig 0:ad97421fb1fb 197 static const char *construct(A1 arg1, A2 arg2, A3 arg3, A4 arg4) {
antbig 0:ad97421fb1fb 198 Base *p = new C(arg1,arg2,arg3,arg4);
antbig 0:ad97421fb1fb 199 p->_from_construct = true;
antbig 0:ad97421fb1fb 200 if(p->_name==NULL) {
antbig 0:ad97421fb1fb 201 p->register_object(new_name(p));
antbig 0:ad97421fb1fb 202 }
antbig 0:ad97421fb1fb 203 return p->_name;
antbig 0:ad97421fb1fb 204 }
antbig 0:ad97421fb1fb 205 #endif
antbig 0:ad97421fb1fb 206
antbig 0:ad97421fb1fb 207 };
antbig 0:ad97421fb1fb 208
antbig 0:ad97421fb1fb 209 /* Macro MBED_OBJECT_NAME_MAX
antbig 0:ad97421fb1fb 210 * The maximum size of object name (including terminating null byte)
antbig 0:ad97421fb1fb 211 * that will be recognised when using fopen to open a FileLike
antbig 0:ad97421fb1fb 212 * object, or when using the rpc function.
antbig 0:ad97421fb1fb 213 */
antbig 0:ad97421fb1fb 214 #define MBED_OBJECT_NAME_MAX 32
antbig 0:ad97421fb1fb 215
antbig 0:ad97421fb1fb 216 /* Macro MBED_METHOD_NAME_MAX
antbig 0:ad97421fb1fb 217 * The maximum size of rpc method name (including terminating null
antbig 0:ad97421fb1fb 218 * byte) that will be recognised by the rpc function (in rpc.h).
antbig 0:ad97421fb1fb 219 */
antbig 0:ad97421fb1fb 220 #define MBED_METHOD_NAME_MAX 32
antbig 0:ad97421fb1fb 221
antbig 0:ad97421fb1fb 222 } // namespace mbed
antbig 0:ad97421fb1fb 223
antbig 0:ad97421fb1fb 224 #endif
antbig 0:ad97421fb1fb 225