support to unsigned short and variable-length argument

Fork of mbed-rpc by mbed official

Committer:
va009039
Date:
Fri Feb 15 13:35:22 2013 +0000
Revision:
1:96ac4b2bbd64
Parent:
0:efe8172b4113
support to unsigned short and variable-length argument

Who changed what in which revision?

UserRevisionLine numberNew contents of line
va009039 1:96ac4b2bbd64 1 /* mbed Microcontroller Library
va009039 1:96ac4b2bbd64 2 * Copyright (c) 2006-2012 ARM Limited
va009039 1:96ac4b2bbd64 3 *
va009039 1:96ac4b2bbd64 4 * Permission is hereby granted, free of charge, to any person obtaining a copy
va009039 1:96ac4b2bbd64 5 * of this software and associated documentation files (the "Software"), to deal
va009039 1:96ac4b2bbd64 6 * in the Software without restriction, including without limitation the rights
va009039 1:96ac4b2bbd64 7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
va009039 1:96ac4b2bbd64 8 * copies of the Software, and to permit persons to whom the Software is
va009039 1:96ac4b2bbd64 9 * furnished to do so, subject to the following conditions:
va009039 1:96ac4b2bbd64 10 *
va009039 1:96ac4b2bbd64 11 * The above copyright notice and this permission notice shall be included in
va009039 1:96ac4b2bbd64 12 * all copies or substantial portions of the Software.
va009039 1:96ac4b2bbd64 13 *
va009039 1:96ac4b2bbd64 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
va009039 1:96ac4b2bbd64 15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
va009039 1:96ac4b2bbd64 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
va009039 1:96ac4b2bbd64 17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
va009039 1:96ac4b2bbd64 18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
va009039 1:96ac4b2bbd64 19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
va009039 1:96ac4b2bbd64 20 * SOFTWARE.
va009039 1:96ac4b2bbd64 21 */
va009039 1:96ac4b2bbd64 22 #ifndef RPC_H
va009039 1:96ac4b2bbd64 23 #define RPC_H
va009039 1:96ac4b2bbd64 24
va009039 1:96ac4b2bbd64 25 #include "mbed.h"
va009039 1:96ac4b2bbd64 26 #include "Arguments.h"
va009039 1:96ac4b2bbd64 27
va009039 1:96ac4b2bbd64 28 namespace mbed {
va009039 1:96ac4b2bbd64 29
va009039 1:96ac4b2bbd64 30 #define RPC_MAX_STRING 128
va009039 1:96ac4b2bbd64 31
va009039 1:96ac4b2bbd64 32 struct rpc_function {
va009039 1:96ac4b2bbd64 33 const char *name;
va009039 1:96ac4b2bbd64 34 void (*function_caller)(Arguments*, Reply*);
va009039 1:96ac4b2bbd64 35 };
va009039 1:96ac4b2bbd64 36
va009039 1:96ac4b2bbd64 37 struct rpc_class {
va009039 1:96ac4b2bbd64 38 const char *name;
va009039 1:96ac4b2bbd64 39 const rpc_function *static_functions;
va009039 1:96ac4b2bbd64 40 struct rpc_class *next;
va009039 1:96ac4b2bbd64 41 };
va009039 1:96ac4b2bbd64 42
va009039 1:96ac4b2bbd64 43 /* Class RPC
va009039 1:96ac4b2bbd64 44 * The RPC class for most things
va009039 1:96ac4b2bbd64 45 */
va009039 1:96ac4b2bbd64 46 class RPC {
va009039 1:96ac4b2bbd64 47
va009039 1:96ac4b2bbd64 48 public:
va009039 1:96ac4b2bbd64 49
va009039 1:96ac4b2bbd64 50 RPC(const char *name = NULL);
va009039 1:96ac4b2bbd64 51
va009039 1:96ac4b2bbd64 52 virtual ~RPC();
va009039 1:96ac4b2bbd64 53
va009039 1:96ac4b2bbd64 54 /* Function get_rpc_methods
va009039 1:96ac4b2bbd64 55 * Returns a pointer to an array describing the rpc methods
va009039 1:96ac4b2bbd64 56 * supported by this object, terminated by either
va009039 1:96ac4b2bbd64 57 * RPC_METHOD_END or RPC_METHOD_SUPER(Superclass).
va009039 1:96ac4b2bbd64 58 *
va009039 1:96ac4b2bbd64 59 * Example
va009039 1:96ac4b2bbd64 60 * > class Example : public RPC {
va009039 1:96ac4b2bbd64 61 * > int foo(int a, int b) { return a + b; }
va009039 1:96ac4b2bbd64 62 * > virtual const struct rpc_method *get_rpc_methods() {
va009039 1:96ac4b2bbd64 63 * > static const rpc_method rpc_methods[] = {
va009039 1:96ac4b2bbd64 64 * > { "foo", generic_caller<int, Example, int, int, &Example::foo> },
va009039 1:96ac4b2bbd64 65 * > RPC_METHOD_SUPER(RPC)
va009039 1:96ac4b2bbd64 66 * > };
va009039 1:96ac4b2bbd64 67 * > return rpc_methods;
va009039 1:96ac4b2bbd64 68 * > }
va009039 1:96ac4b2bbd64 69 * > };
va009039 1:96ac4b2bbd64 70 */
va009039 1:96ac4b2bbd64 71 virtual const struct rpc_method *get_rpc_methods();
va009039 1:96ac4b2bbd64 72
va009039 1:96ac4b2bbd64 73 static bool call(const char *buf, char *result);
va009039 1:96ac4b2bbd64 74
va009039 1:96ac4b2bbd64 75 /* Function lookup
va009039 1:96ac4b2bbd64 76 * Lookup and return the object that has the given name.
va009039 1:96ac4b2bbd64 77 *
va009039 1:96ac4b2bbd64 78 * Variables
va009039 1:96ac4b2bbd64 79 * name - the name to lookup.
va009039 1:96ac4b2bbd64 80 */
va009039 1:96ac4b2bbd64 81 static RPC *lookup(const char *name);
va009039 1:96ac4b2bbd64 82
va009039 1:96ac4b2bbd64 83 protected:
va009039 1:96ac4b2bbd64 84 static RPC *_head;
va009039 1:96ac4b2bbd64 85 RPC *_next;
va009039 1:96ac4b2bbd64 86 char *_name;
va009039 1:96ac4b2bbd64 87 bool _from_construct;
va009039 1:96ac4b2bbd64 88
va009039 1:96ac4b2bbd64 89 private:
va009039 1:96ac4b2bbd64 90 static rpc_class *_classes;
va009039 1:96ac4b2bbd64 91
va009039 1:96ac4b2bbd64 92 static const rpc_function _RPC_funcs[];
va009039 1:96ac4b2bbd64 93 static rpc_class _RPC_class;
va009039 1:96ac4b2bbd64 94
va009039 1:96ac4b2bbd64 95 void delete_self();
va009039 1:96ac4b2bbd64 96 static void list_objs(Arguments *args, Reply *result);
va009039 1:96ac4b2bbd64 97 static void clear(Arguments *args, Reply *result);
va009039 1:96ac4b2bbd64 98
va009039 1:96ac4b2bbd64 99 public:
va009039 1:96ac4b2bbd64 100 /* Function add_rpc_class
va009039 1:96ac4b2bbd64 101 * Add the class to the list of classes which can have static
va009039 1:96ac4b2bbd64 102 * methods called via rpc (the static methods which can be called
va009039 1:96ac4b2bbd64 103 * are defined by that class' get_rpc_class() static method).
va009039 1:96ac4b2bbd64 104 */
va009039 1:96ac4b2bbd64 105 template<class C>
va009039 1:96ac4b2bbd64 106 static void add_rpc_class() {
va009039 1:96ac4b2bbd64 107 rpc_class *c = C::get_rpc_class();
va009039 1:96ac4b2bbd64 108 c->next = _classes;
va009039 1:96ac4b2bbd64 109 _classes = c;
va009039 1:96ac4b2bbd64 110 }
va009039 1:96ac4b2bbd64 111
va009039 1:96ac4b2bbd64 112 template<class C>
va009039 1:96ac4b2bbd64 113 static const char *construct() {
va009039 1:96ac4b2bbd64 114 RPC *p = new C();
va009039 1:96ac4b2bbd64 115 p->_from_construct = true;
va009039 1:96ac4b2bbd64 116 return p->_name;
va009039 1:96ac4b2bbd64 117 }
va009039 1:96ac4b2bbd64 118
va009039 1:96ac4b2bbd64 119 template<class C, typename A1>
va009039 1:96ac4b2bbd64 120 static const char *construct(A1 arg1) {
va009039 1:96ac4b2bbd64 121 RPC *p = new C(arg1);
va009039 1:96ac4b2bbd64 122 p->_from_construct = true;
va009039 1:96ac4b2bbd64 123 return p->_name;
va009039 1:96ac4b2bbd64 124 }
va009039 1:96ac4b2bbd64 125
va009039 1:96ac4b2bbd64 126 template<class C, typename A1, typename A2>
va009039 1:96ac4b2bbd64 127 static const char *construct(A1 arg1, A2 arg2) {
va009039 1:96ac4b2bbd64 128 RPC *p = new C(arg1, arg2);
va009039 1:96ac4b2bbd64 129 p->_from_construct = true;
va009039 1:96ac4b2bbd64 130 return p->_name;
va009039 1:96ac4b2bbd64 131 }
va009039 1:96ac4b2bbd64 132
va009039 1:96ac4b2bbd64 133 template<class C, typename A1, typename A2, typename A3>
va009039 1:96ac4b2bbd64 134 static const char *construct(A1 arg1, A2 arg2, A3 arg3) {
va009039 1:96ac4b2bbd64 135 RPC *p = new C(arg1, arg2, arg3);
va009039 1:96ac4b2bbd64 136 p->_from_construct = true;
va009039 1:96ac4b2bbd64 137 return p->_name;
va009039 1:96ac4b2bbd64 138 }
va009039 1:96ac4b2bbd64 139
va009039 1:96ac4b2bbd64 140 template<class C, typename A1, typename A2, typename A3, typename A4>
va009039 1:96ac4b2bbd64 141 static const char *construct(A1 arg1, A2 arg2, A3 arg3, A4 arg4) {
va009039 1:96ac4b2bbd64 142 RPC *p = new C(arg1, arg2, arg3, arg4);
va009039 1:96ac4b2bbd64 143 p->_from_construct = true;
va009039 1:96ac4b2bbd64 144 return p->_name;
va009039 1:96ac4b2bbd64 145 }
va009039 1:96ac4b2bbd64 146 };
va009039 1:96ac4b2bbd64 147
va009039 1:96ac4b2bbd64 148 /* Macro MBED_OBJECT_NAME_MAX
va009039 1:96ac4b2bbd64 149 * The maximum size of object name (including terminating null byte)
va009039 1:96ac4b2bbd64 150 * that will be recognised when using fopen to open a FileLike
va009039 1:96ac4b2bbd64 151 * object, or when using the rpc function.
va009039 1:96ac4b2bbd64 152 */
va009039 1:96ac4b2bbd64 153 #define MBED_OBJECT_NAME_MAX 32
va009039 1:96ac4b2bbd64 154
va009039 1:96ac4b2bbd64 155 /* Macro MBED_METHOD_NAME_MAX
va009039 1:96ac4b2bbd64 156 * The maximum size of rpc method name (including terminating null
va009039 1:96ac4b2bbd64 157 * byte) that will be recognised by the rpc function (in rpc.h).
va009039 1:96ac4b2bbd64 158 */
va009039 1:96ac4b2bbd64 159 #define MBED_METHOD_NAME_MAX 32
va009039 1:96ac4b2bbd64 160
va009039 1:96ac4b2bbd64 161 /* Function rpc_method_caller
va009039 1:96ac4b2bbd64 162 */
va009039 1:96ac4b2bbd64 163 template<class T, void(T::*member)(Arguments*, Reply*)>
va009039 1:96ac4b2bbd64 164 void rpc_method_caller(RPC *this_ptr, Arguments *arguments, Reply *result) {
va009039 1:96ac4b2bbd64 165 (static_cast<T*>(this_ptr)->*member)(arguments, result);
va009039 1:96ac4b2bbd64 166 }
va009039 1:96ac4b2bbd64 167
va009039 1:96ac4b2bbd64 168 /* Function rpc_method_caller
va009039 1:96ac4b2bbd64 169 */
va009039 1:96ac4b2bbd64 170 template<class T, void(T::*member)()>
va009039 1:96ac4b2bbd64 171 void rpc_method_caller(RPC *this_ptr, Arguments *arguments, Reply *result) {
va009039 1:96ac4b2bbd64 172 (static_cast<T*>(this_ptr)->*member)();
va009039 1:96ac4b2bbd64 173 }
va009039 1:96ac4b2bbd64 174
va009039 1:96ac4b2bbd64 175 /* Function rpc_method_caller
va009039 1:96ac4b2bbd64 176 */
va009039 1:96ac4b2bbd64 177 template<class T, typename A1, void(T::*member)(A1)>
va009039 1:96ac4b2bbd64 178 void rpc_method_caller(RPC *this_ptr, Arguments *arguments, Reply *result) {
va009039 1:96ac4b2bbd64 179 A1 arg1 = arguments->getArg<A1>();
va009039 1:96ac4b2bbd64 180
va009039 1:96ac4b2bbd64 181 (static_cast<T*>(this_ptr)->*member)(arg1);
va009039 1:96ac4b2bbd64 182 }
va009039 1:96ac4b2bbd64 183
va009039 1:96ac4b2bbd64 184 /* Function rpc_method_caller
va009039 1:96ac4b2bbd64 185 */
va009039 1:96ac4b2bbd64 186 template<class T, typename A1, typename A2, void(T::*member)(A1, A2)>
va009039 1:96ac4b2bbd64 187 void rpc_method_caller(RPC *this_ptr, Arguments *arguments, Reply *result) {
va009039 1:96ac4b2bbd64 188 A1 arg1 = arguments->getArg<A1>();
va009039 1:96ac4b2bbd64 189 A2 arg2 = arguments->getArg<A2>();
va009039 1:96ac4b2bbd64 190
va009039 1:96ac4b2bbd64 191 (static_cast<T*>(this_ptr)->*member)(arg1, arg2);
va009039 1:96ac4b2bbd64 192 }
va009039 1:96ac4b2bbd64 193
va009039 1:96ac4b2bbd64 194 /* Function rpc_method_caller
va009039 1:96ac4b2bbd64 195 */
va009039 1:96ac4b2bbd64 196 template<class T, typename A1, typename A2, typename A3, void(T::*member)(A1, A2, A3)>
va009039 1:96ac4b2bbd64 197 void rpc_method_caller(RPC *this_ptr, Arguments *arguments, Reply *result) {
va009039 1:96ac4b2bbd64 198 A1 arg1 = arguments->getArg<A1>();
va009039 1:96ac4b2bbd64 199 A2 arg2 = arguments->getArg<A2>();
va009039 1:96ac4b2bbd64 200 A3 arg3 = arguments->getArg<A3>();
va009039 1:96ac4b2bbd64 201
va009039 1:96ac4b2bbd64 202 (static_cast<T*>(this_ptr)->*member)(arg1, arg2, arg3);
va009039 1:96ac4b2bbd64 203 }
va009039 1:96ac4b2bbd64 204
va009039 1:96ac4b2bbd64 205 /* Function rpc_method_caller
va009039 1:96ac4b2bbd64 206 */
va009039 1:96ac4b2bbd64 207 template<typename R, class T, R(T::*member)()>
va009039 1:96ac4b2bbd64 208 void rpc_method_caller(RPC *this_ptr, Arguments *arguments, Reply *result) {
va009039 1:96ac4b2bbd64 209 R res = (static_cast<T*>(this_ptr)->*member)();
va009039 1:96ac4b2bbd64 210 result->putData<R>(res);
va009039 1:96ac4b2bbd64 211 }
va009039 1:96ac4b2bbd64 212
va009039 1:96ac4b2bbd64 213 /* Function rpc_method_caller
va009039 1:96ac4b2bbd64 214 */
va009039 1:96ac4b2bbd64 215 template<typename R, class T, typename A1, R(T::*member)(A1)>
va009039 1:96ac4b2bbd64 216 void rpc_method_caller(RPC *this_ptr, Arguments *arguments, Reply *result) {
va009039 1:96ac4b2bbd64 217 A1 arg1 = arguments->getArg<A1>();
va009039 1:96ac4b2bbd64 218
va009039 1:96ac4b2bbd64 219 R res = (static_cast<T*>(this_ptr)->*member)(arg1);
va009039 1:96ac4b2bbd64 220 result->putData<R>(res);
va009039 1:96ac4b2bbd64 221 }
va009039 1:96ac4b2bbd64 222
va009039 1:96ac4b2bbd64 223 /* Function rpc_method_caller
va009039 1:96ac4b2bbd64 224 */
va009039 1:96ac4b2bbd64 225 template<typename R, class T, typename A1, typename A2, R(T::*member)(A1, A2)>
va009039 1:96ac4b2bbd64 226 void rpc_method_caller(RPC *this_ptr, Arguments *arguments, Reply *result) {
va009039 1:96ac4b2bbd64 227 A1 arg1 = arguments->getArg<A1>();
va009039 1:96ac4b2bbd64 228 A2 arg2 = arguments->getArg<A2>();
va009039 1:96ac4b2bbd64 229
va009039 1:96ac4b2bbd64 230 R res = (static_cast<T*>(this_ptr)->*member)(arg1, arg2);
va009039 1:96ac4b2bbd64 231 result->putData<R>(res);
va009039 1:96ac4b2bbd64 232 }
va009039 1:96ac4b2bbd64 233
va009039 1:96ac4b2bbd64 234 /* Function rpc_method_caller
va009039 1:96ac4b2bbd64 235 */
va009039 1:96ac4b2bbd64 236 template<typename R, class T, typename A1, typename A2, typename A3, R(T::*member)(A1, A2, A3)>
va009039 1:96ac4b2bbd64 237 void rpc_method_caller(RPC *this_ptr, Arguments *arguments, Reply *result) {
va009039 1:96ac4b2bbd64 238 A1 arg1 = arguments->getArg<A1>();
va009039 1:96ac4b2bbd64 239 A2 arg2 = arguments->getArg<A2>();
va009039 1:96ac4b2bbd64 240 A3 arg3 = arguments->getArg<A3>();
va009039 1:96ac4b2bbd64 241
va009039 1:96ac4b2bbd64 242 R res = (static_cast<T*>(this_ptr)->*member)(arg1, arg2, arg3);
va009039 1:96ac4b2bbd64 243 result->putData<R>(res);
va009039 1:96ac4b2bbd64 244 }
va009039 1:96ac4b2bbd64 245
va009039 1:96ac4b2bbd64 246 /* Function rpc_function caller
va009039 1:96ac4b2bbd64 247 */
va009039 1:96ac4b2bbd64 248 template<typename R, R(*func)()>
va009039 1:96ac4b2bbd64 249 void rpc_function_caller(Arguments *arguments, Reply *result) {
va009039 1:96ac4b2bbd64 250 R res = (*func)();
va009039 1:96ac4b2bbd64 251 result->putData<R>(res);
va009039 1:96ac4b2bbd64 252 }
va009039 1:96ac4b2bbd64 253
va009039 1:96ac4b2bbd64 254 /* Function rpc_function caller
va009039 1:96ac4b2bbd64 255 */
va009039 1:96ac4b2bbd64 256 template<typename R, typename A1, R(*func)(A1)>
va009039 1:96ac4b2bbd64 257 void rpc_function_caller(Arguments *arguments, Reply *result) {
va009039 1:96ac4b2bbd64 258 A1 arg1 = arguments->getArg<A1>();
va009039 1:96ac4b2bbd64 259 R res = (*func)(arg1);
va009039 1:96ac4b2bbd64 260 result->putData<R>(res);
va009039 1:96ac4b2bbd64 261 }
va009039 1:96ac4b2bbd64 262
va009039 1:96ac4b2bbd64 263 /* Function rpc_function caller
va009039 1:96ac4b2bbd64 264 */
va009039 1:96ac4b2bbd64 265 template<typename R, typename A1, typename A2, R(*func)(A1, A2)>
va009039 1:96ac4b2bbd64 266 void rpc_function_caller(Arguments *arguments, Reply *result) {
va009039 1:96ac4b2bbd64 267 A1 arg1 = arguments->getArg<A1>();
va009039 1:96ac4b2bbd64 268 A2 arg2 = arguments->getArg<A2>();
va009039 1:96ac4b2bbd64 269
va009039 1:96ac4b2bbd64 270 R res = (*func)(arg1, arg2);
va009039 1:96ac4b2bbd64 271 result->putData<R>(res);
va009039 1:96ac4b2bbd64 272 }
va009039 1:96ac4b2bbd64 273
va009039 1:96ac4b2bbd64 274 /* Function rpc_function caller
va009039 1:96ac4b2bbd64 275 */
va009039 1:96ac4b2bbd64 276 template<typename R, typename A1, typename A2, typename A3, R(*func)(A1, A2, A3)>
va009039 1:96ac4b2bbd64 277 void rpc_function_caller(Arguments *arguments, Reply *result) {
va009039 1:96ac4b2bbd64 278 A1 arg1 = arguments->getArg<A1>();
va009039 1:96ac4b2bbd64 279 A2 arg2 = arguments->getArg<A2>();
va009039 1:96ac4b2bbd64 280 A3 arg3 = arguments->getArg<A3>();
va009039 1:96ac4b2bbd64 281
va009039 1:96ac4b2bbd64 282 R res = (*func)(arg1, arg2, arg3);
va009039 1:96ac4b2bbd64 283 result->putData<R>(res);
va009039 1:96ac4b2bbd64 284 }
va009039 1:96ac4b2bbd64 285
va009039 1:96ac4b2bbd64 286 /* Function rpc_function caller
va009039 1:96ac4b2bbd64 287 */
va009039 1:96ac4b2bbd64 288 template<typename R, typename A1, typename A2, typename A3, typename A4, R(*func)(A1, A2, A3, A4)>
va009039 1:96ac4b2bbd64 289 void rpc_function_caller(Arguments *arguments, Reply *result) {
va009039 1:96ac4b2bbd64 290 A1 arg1 = arguments->getArg<A1>();
va009039 1:96ac4b2bbd64 291 A2 arg2 = arguments->getArg<A2>();
va009039 1:96ac4b2bbd64 292 A3 arg3 = arguments->getArg<A3>();
va009039 1:96ac4b2bbd64 293 A4 arg4 = arguments->getArg<A4>();
va009039 1:96ac4b2bbd64 294
va009039 1:96ac4b2bbd64 295 R res = (*func)(arg1, arg2, arg3, arg4);
va009039 1:96ac4b2bbd64 296 result->putData<R>(res);
va009039 1:96ac4b2bbd64 297 }
va009039 1:96ac4b2bbd64 298
va009039 1:96ac4b2bbd64 299 struct rpc_method {
va009039 1:96ac4b2bbd64 300 const char *name;
va009039 1:96ac4b2bbd64 301 typedef void (*method_caller_t)(RPC*, Arguments*, Reply*);
va009039 1:96ac4b2bbd64 302 typedef const struct rpc_method *(*super_t)(RPC*);
va009039 1:96ac4b2bbd64 303 union {
va009039 1:96ac4b2bbd64 304 method_caller_t method_caller;
va009039 1:96ac4b2bbd64 305 super_t super;
va009039 1:96ac4b2bbd64 306 };
va009039 1:96ac4b2bbd64 307 };
va009039 1:96ac4b2bbd64 308
va009039 1:96ac4b2bbd64 309 template<class C>
va009039 1:96ac4b2bbd64 310 const struct rpc_method *rpc_super(RPC *this_ptr) {
va009039 1:96ac4b2bbd64 311 return static_cast<C*>(this_ptr)->C::get_rpc_methods();
va009039 1:96ac4b2bbd64 312 }
va009039 1:96ac4b2bbd64 313
va009039 1:96ac4b2bbd64 314 #define RPC_METHOD_END { NULL, NULL }
va009039 1:96ac4b2bbd64 315 #define RPC_METHOD_SUPER(C) { NULL, (rpc_method::method_caller_t)rpc_super<C> }
va009039 1:96ac4b2bbd64 316
va009039 1:96ac4b2bbd64 317 } // namespace mbed
va009039 1:96ac4b2bbd64 318
va009039 1:96ac4b2bbd64 319 #endif