test public

Dependencies:   HttpServer_snapshot_mbed-os

Committer:
anhtran
Date:
Fri Oct 18 03:09:43 2019 +0000
Revision:
0:e9fd5575b10e
abc

Who changed what in which revision?

UserRevisionLine numberNew contents of line
anhtran 0:e9fd5575b10e 1 /* mbed Microcontroller Library
anhtran 0:e9fd5575b10e 2 * Copyright (c) 2006-2013 ARM Limited
anhtran 0:e9fd5575b10e 3 *
anhtran 0:e9fd5575b10e 4 * Licensed under the Apache License, Version 2.0 (the "License");
anhtran 0:e9fd5575b10e 5 * you may not use this file except in compliance with the License.
anhtran 0:e9fd5575b10e 6 * You may obtain a copy of the License at
anhtran 0:e9fd5575b10e 7 *
anhtran 0:e9fd5575b10e 8 * http://www.apache.org/licenses/LICENSE-2.0
anhtran 0:e9fd5575b10e 9 *
anhtran 0:e9fd5575b10e 10 * Unless required by applicable law or agreed to in writing, software
anhtran 0:e9fd5575b10e 11 * distributed under the License is distributed on an "AS IS" BASIS,
anhtran 0:e9fd5575b10e 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
anhtran 0:e9fd5575b10e 13 * See the License for the specific language governing permissions and
anhtran 0:e9fd5575b10e 14 * limitations under the License.
anhtran 0:e9fd5575b10e 15 */
anhtran 0:e9fd5575b10e 16 #ifndef RPC_H
anhtran 0:e9fd5575b10e 17 #define RPC_H
anhtran 0:e9fd5575b10e 18
anhtran 0:e9fd5575b10e 19 #include "mbed.h"
anhtran 0:e9fd5575b10e 20 #include "Arguments.h"
anhtran 0:e9fd5575b10e 21
anhtran 0:e9fd5575b10e 22 namespace mbed {
anhtran 0:e9fd5575b10e 23
anhtran 0:e9fd5575b10e 24 #define RPC_MAX_STRING 128
anhtran 0:e9fd5575b10e 25
anhtran 0:e9fd5575b10e 26 struct rpc_function {
anhtran 0:e9fd5575b10e 27 const char *name;
anhtran 0:e9fd5575b10e 28 void (*function_caller)(Arguments*, Reply*);
anhtran 0:e9fd5575b10e 29 };
anhtran 0:e9fd5575b10e 30
anhtran 0:e9fd5575b10e 31 struct rpc_class {
anhtran 0:e9fd5575b10e 32 const char *name;
anhtran 0:e9fd5575b10e 33 const rpc_function *static_functions;
anhtran 0:e9fd5575b10e 34 struct rpc_class *next;
anhtran 0:e9fd5575b10e 35 };
anhtran 0:e9fd5575b10e 36
anhtran 0:e9fd5575b10e 37 /* Class RPC
anhtran 0:e9fd5575b10e 38 * The RPC class for most things
anhtran 0:e9fd5575b10e 39 */
anhtran 0:e9fd5575b10e 40 class RPC {
anhtran 0:e9fd5575b10e 41
anhtran 0:e9fd5575b10e 42 public:
anhtran 0:e9fd5575b10e 43
anhtran 0:e9fd5575b10e 44 RPC(const char *name = NULL);
anhtran 0:e9fd5575b10e 45
anhtran 0:e9fd5575b10e 46 virtual ~RPC();
anhtran 0:e9fd5575b10e 47
anhtran 0:e9fd5575b10e 48 /* Function get_rpc_methods
anhtran 0:e9fd5575b10e 49 * Returns a pointer to an array describing the rpc methods
anhtran 0:e9fd5575b10e 50 * supported by this object, terminated by either
anhtran 0:e9fd5575b10e 51 * RPC_METHOD_END or RPC_METHOD_SUPER(Superclass).
anhtran 0:e9fd5575b10e 52 *
anhtran 0:e9fd5575b10e 53 * Example
anhtran 0:e9fd5575b10e 54 * > class Example : public RPC {
anhtran 0:e9fd5575b10e 55 * > int foo(int a, int b) { return a + b; }
anhtran 0:e9fd5575b10e 56 * > virtual const struct rpc_method *get_rpc_methods() {
anhtran 0:e9fd5575b10e 57 * > static const rpc_method rpc_methods[] = {
anhtran 0:e9fd5575b10e 58 * > { "foo", generic_caller<int, Example, int, int, &Example::foo> },
anhtran 0:e9fd5575b10e 59 * > RPC_METHOD_SUPER(RPC)
anhtran 0:e9fd5575b10e 60 * > };
anhtran 0:e9fd5575b10e 61 * > return rpc_methods;
anhtran 0:e9fd5575b10e 62 * > }
anhtran 0:e9fd5575b10e 63 * > };
anhtran 0:e9fd5575b10e 64 */
anhtran 0:e9fd5575b10e 65 virtual const struct rpc_method *get_rpc_methods();
anhtran 0:e9fd5575b10e 66
anhtran 0:e9fd5575b10e 67 static bool call(const char *buf, char *result);
anhtran 0:e9fd5575b10e 68
anhtran 0:e9fd5575b10e 69 /* Function lookup
anhtran 0:e9fd5575b10e 70 * Lookup and return the object that has the given name.
anhtran 0:e9fd5575b10e 71 *
anhtran 0:e9fd5575b10e 72 * Variables
anhtran 0:e9fd5575b10e 73 * name - the name to lookup.
anhtran 0:e9fd5575b10e 74 */
anhtran 0:e9fd5575b10e 75 static RPC *lookup(const char *name);
anhtran 0:e9fd5575b10e 76
anhtran 0:e9fd5575b10e 77 protected:
anhtran 0:e9fd5575b10e 78 static RPC *_head;
anhtran 0:e9fd5575b10e 79 RPC *_next;
anhtran 0:e9fd5575b10e 80 char *_name;
anhtran 0:e9fd5575b10e 81 bool _from_construct;
anhtran 0:e9fd5575b10e 82
anhtran 0:e9fd5575b10e 83 private:
anhtran 0:e9fd5575b10e 84 static rpc_class *_classes;
anhtran 0:e9fd5575b10e 85
anhtran 0:e9fd5575b10e 86 static const rpc_function _RPC_funcs[];
anhtran 0:e9fd5575b10e 87 static rpc_class _RPC_class;
anhtran 0:e9fd5575b10e 88
anhtran 0:e9fd5575b10e 89 void delete_self();
anhtran 0:e9fd5575b10e 90 static void list_objs(Arguments *args, Reply *result);
anhtran 0:e9fd5575b10e 91 static void clear(Arguments *args, Reply *result);
anhtran 0:e9fd5575b10e 92
anhtran 0:e9fd5575b10e 93 public:
anhtran 0:e9fd5575b10e 94 /* Function add_rpc_class
anhtran 0:e9fd5575b10e 95 * Add the class to the list of classes which can have static
anhtran 0:e9fd5575b10e 96 * methods called via rpc (the static methods which can be called
anhtran 0:e9fd5575b10e 97 * are defined by that class' get_rpc_class() static method).
anhtran 0:e9fd5575b10e 98 */
anhtran 0:e9fd5575b10e 99 template<class C>
anhtran 0:e9fd5575b10e 100 static void add_rpc_class() {
anhtran 0:e9fd5575b10e 101 rpc_class *c = C::get_rpc_class();
anhtran 0:e9fd5575b10e 102 c->next = _classes;
anhtran 0:e9fd5575b10e 103 _classes = c;
anhtran 0:e9fd5575b10e 104 }
anhtran 0:e9fd5575b10e 105
anhtran 0:e9fd5575b10e 106 template<class C>
anhtran 0:e9fd5575b10e 107 static const char *construct() {
anhtran 0:e9fd5575b10e 108 RPC *p = new C();
anhtran 0:e9fd5575b10e 109 p->_from_construct = true;
anhtran 0:e9fd5575b10e 110 return p->_name;
anhtran 0:e9fd5575b10e 111 }
anhtran 0:e9fd5575b10e 112
anhtran 0:e9fd5575b10e 113 template<class C, typename A1>
anhtran 0:e9fd5575b10e 114 static const char *construct(A1 arg1) {
anhtran 0:e9fd5575b10e 115 RPC *p = new C(arg1);
anhtran 0:e9fd5575b10e 116 p->_from_construct = true;
anhtran 0:e9fd5575b10e 117 return p->_name;
anhtran 0:e9fd5575b10e 118 }
anhtran 0:e9fd5575b10e 119
anhtran 0:e9fd5575b10e 120 template<class C, typename A1, typename A2>
anhtran 0:e9fd5575b10e 121 static const char *construct(A1 arg1, A2 arg2) {
anhtran 0:e9fd5575b10e 122 RPC *p = new C(arg1, arg2);
anhtran 0:e9fd5575b10e 123 p->_from_construct = true;
anhtran 0:e9fd5575b10e 124 return p->_name;
anhtran 0:e9fd5575b10e 125 }
anhtran 0:e9fd5575b10e 126
anhtran 0:e9fd5575b10e 127 template<class C, typename A1, typename A2, typename A3>
anhtran 0:e9fd5575b10e 128 static const char *construct(A1 arg1, A2 arg2, A3 arg3) {
anhtran 0:e9fd5575b10e 129 RPC *p = new C(arg1, arg2, arg3);
anhtran 0:e9fd5575b10e 130 p->_from_construct = true;
anhtran 0:e9fd5575b10e 131 return p->_name;
anhtran 0:e9fd5575b10e 132 }
anhtran 0:e9fd5575b10e 133
anhtran 0:e9fd5575b10e 134 template<class C, typename A1, typename A2, typename A3, typename A4>
anhtran 0:e9fd5575b10e 135 static const char *construct(A1 arg1, A2 arg2, A3 arg3, A4 arg4) {
anhtran 0:e9fd5575b10e 136 RPC *p = new C(arg1, arg2, arg3, arg4);
anhtran 0:e9fd5575b10e 137 p->_from_construct = true;
anhtran 0:e9fd5575b10e 138 return p->_name;
anhtran 0:e9fd5575b10e 139 }
anhtran 0:e9fd5575b10e 140 };
anhtran 0:e9fd5575b10e 141
anhtran 0:e9fd5575b10e 142 /* Macro MBED_OBJECT_NAME_MAX
anhtran 0:e9fd5575b10e 143 * The maximum size of object name (including terminating null byte)
anhtran 0:e9fd5575b10e 144 * that will be recognised when using fopen to open a FileLike
anhtran 0:e9fd5575b10e 145 * object, or when using the rpc function.
anhtran 0:e9fd5575b10e 146 */
anhtran 0:e9fd5575b10e 147 #define MBED_OBJECT_NAME_MAX 32
anhtran 0:e9fd5575b10e 148
anhtran 0:e9fd5575b10e 149 /* Macro MBED_METHOD_NAME_MAX
anhtran 0:e9fd5575b10e 150 * The maximum size of rpc method name (including terminating null
anhtran 0:e9fd5575b10e 151 * byte) that will be recognised by the rpc function (in rpc.h).
anhtran 0:e9fd5575b10e 152 */
anhtran 0:e9fd5575b10e 153 #define MBED_METHOD_NAME_MAX 32
anhtran 0:e9fd5575b10e 154
anhtran 0:e9fd5575b10e 155 /* Function rpc_method_caller
anhtran 0:e9fd5575b10e 156 */
anhtran 0:e9fd5575b10e 157 template<class T, void(T::*member)(const char *, char *)>
anhtran 0:e9fd5575b10e 158 void rpc_method_caller(RPC *this_ptr, Arguments *arguments, Reply *result) {
anhtran 0:e9fd5575b10e 159 (static_cast<T*>(this_ptr)->*member)(arguments, result);
anhtran 0:e9fd5575b10e 160 }
anhtran 0:e9fd5575b10e 161
anhtran 0:e9fd5575b10e 162 /* Function rpc_method_caller
anhtran 0:e9fd5575b10e 163 */
anhtran 0:e9fd5575b10e 164 template<class T, void(T::*member)()>
anhtran 0:e9fd5575b10e 165 void rpc_method_caller(RPC *this_ptr, Arguments *arguments, Reply *result) {
anhtran 0:e9fd5575b10e 166 (static_cast<T*>(this_ptr)->*member)();
anhtran 0:e9fd5575b10e 167 }
anhtran 0:e9fd5575b10e 168
anhtran 0:e9fd5575b10e 169 /* Function rpc_method_caller
anhtran 0:e9fd5575b10e 170 */
anhtran 0:e9fd5575b10e 171 template<class T, typename A1, void(T::*member)(A1)>
anhtran 0:e9fd5575b10e 172 void rpc_method_caller(RPC *this_ptr, Arguments *arguments, Reply *result) {
anhtran 0:e9fd5575b10e 173 A1 arg1 = arguments->getArg<A1>();
anhtran 0:e9fd5575b10e 174
anhtran 0:e9fd5575b10e 175 (static_cast<T*>(this_ptr)->*member)(arg1);
anhtran 0:e9fd5575b10e 176 }
anhtran 0:e9fd5575b10e 177
anhtran 0:e9fd5575b10e 178 /* Function rpc_method_caller
anhtran 0:e9fd5575b10e 179 */
anhtran 0:e9fd5575b10e 180 template<class T, typename A1, typename A2, void(T::*member)(A1, A2)>
anhtran 0:e9fd5575b10e 181 void rpc_method_caller(RPC *this_ptr, Arguments *arguments, Reply *result) {
anhtran 0:e9fd5575b10e 182 A1 arg1 = arguments->getArg<A1>();
anhtran 0:e9fd5575b10e 183 A2 arg2 = arguments->getArg<A2>();
anhtran 0:e9fd5575b10e 184
anhtran 0:e9fd5575b10e 185 (static_cast<T*>(this_ptr)->*member)(arg1, arg2);
anhtran 0:e9fd5575b10e 186 }
anhtran 0:e9fd5575b10e 187
anhtran 0:e9fd5575b10e 188 /* Function rpc_method_caller
anhtran 0:e9fd5575b10e 189 */
anhtran 0:e9fd5575b10e 190 template<class T, typename A1, typename A2, typename A3, void(T::*member)(A1, A2, A3)>
anhtran 0:e9fd5575b10e 191 void rpc_method_caller(RPC *this_ptr, Arguments *arguments, Reply *result) {
anhtran 0:e9fd5575b10e 192 A1 arg1 = arguments->getArg<A1>();
anhtran 0:e9fd5575b10e 193 A2 arg2 = arguments->getArg<A2>();
anhtran 0:e9fd5575b10e 194 A3 arg3 = arguments->getArg<A3>();
anhtran 0:e9fd5575b10e 195
anhtran 0:e9fd5575b10e 196 (static_cast<T*>(this_ptr)->*member)(arg1, arg2, arg3);
anhtran 0:e9fd5575b10e 197 }
anhtran 0:e9fd5575b10e 198
anhtran 0:e9fd5575b10e 199 /* Function rpc_method_caller
anhtran 0:e9fd5575b10e 200 */
anhtran 0:e9fd5575b10e 201 template<typename R, class T, R(T::*member)()>
anhtran 0:e9fd5575b10e 202 void rpc_method_caller(RPC *this_ptr, Arguments *arguments, Reply *result) {
anhtran 0:e9fd5575b10e 203 R res = (static_cast<T*>(this_ptr)->*member)();
anhtran 0:e9fd5575b10e 204 result->putData<R>(res);
anhtran 0:e9fd5575b10e 205 }
anhtran 0:e9fd5575b10e 206
anhtran 0:e9fd5575b10e 207 /* Function rpc_method_caller
anhtran 0:e9fd5575b10e 208 */
anhtran 0:e9fd5575b10e 209 template<typename R, class T, typename A1, R(T::*member)(A1)>
anhtran 0:e9fd5575b10e 210 void rpc_method_caller(RPC *this_ptr, Arguments *arguments, Reply *result) {
anhtran 0:e9fd5575b10e 211 A1 arg1 = arguments->getArg<A1>();
anhtran 0:e9fd5575b10e 212
anhtran 0:e9fd5575b10e 213 R res = (static_cast<T*>(this_ptr)->*member)(arg1);
anhtran 0:e9fd5575b10e 214 result->putData<R>(res);
anhtran 0:e9fd5575b10e 215 }
anhtran 0:e9fd5575b10e 216
anhtran 0:e9fd5575b10e 217 /* Function rpc_method_caller
anhtran 0:e9fd5575b10e 218 */
anhtran 0:e9fd5575b10e 219 template<typename R, class T, typename A1, typename A2, R(T::*member)(A1, A2)>
anhtran 0:e9fd5575b10e 220 void rpc_method_caller(RPC *this_ptr, Arguments *arguments, Reply *result) {
anhtran 0:e9fd5575b10e 221 A1 arg1 = arguments->getArg<A1>();
anhtran 0:e9fd5575b10e 222 A2 arg2 = arguments->getArg<A2>();
anhtran 0:e9fd5575b10e 223
anhtran 0:e9fd5575b10e 224 R res = (static_cast<T*>(this_ptr)->*member)(arg1, arg2);
anhtran 0:e9fd5575b10e 225 result->putData<R>(res);
anhtran 0:e9fd5575b10e 226 }
anhtran 0:e9fd5575b10e 227
anhtran 0:e9fd5575b10e 228 /* Function rpc_method_caller
anhtran 0:e9fd5575b10e 229 */
anhtran 0:e9fd5575b10e 230 template<typename R, class T, typename A1, typename A2, typename A3, R(T::*member)(A1, A2, A3)>
anhtran 0:e9fd5575b10e 231 void rpc_method_caller(RPC *this_ptr, Arguments *arguments, Reply *result) {
anhtran 0:e9fd5575b10e 232 A1 arg1 = arguments->getArg<A1>();
anhtran 0:e9fd5575b10e 233 A2 arg2 = arguments->getArg<A2>();
anhtran 0:e9fd5575b10e 234 A3 arg3 = arguments->getArg<A3>();
anhtran 0:e9fd5575b10e 235
anhtran 0:e9fd5575b10e 236 R res = (static_cast<T*>(this_ptr)->*member)(arg1, arg2, arg3);
anhtran 0:e9fd5575b10e 237 result->putData<R>(res);
anhtran 0:e9fd5575b10e 238 }
anhtran 0:e9fd5575b10e 239
anhtran 0:e9fd5575b10e 240 /* Function rpc_function caller
anhtran 0:e9fd5575b10e 241 */
anhtran 0:e9fd5575b10e 242 template<typename R, R(*func)()>
anhtran 0:e9fd5575b10e 243 void rpc_function_caller(Arguments *arguments, Reply *result) {
anhtran 0:e9fd5575b10e 244 R res = (*func)();
anhtran 0:e9fd5575b10e 245 result->putData<R>(res);
anhtran 0:e9fd5575b10e 246 }
anhtran 0:e9fd5575b10e 247
anhtran 0:e9fd5575b10e 248 /* Function rpc_function caller
anhtran 0:e9fd5575b10e 249 */
anhtran 0:e9fd5575b10e 250 template<typename R, typename A1, R(*func)(A1)>
anhtran 0:e9fd5575b10e 251 void rpc_function_caller(Arguments *arguments, Reply *result) {
anhtran 0:e9fd5575b10e 252 A1 arg1 = arguments->getArg<A1>();
anhtran 0:e9fd5575b10e 253 R res = (*func)(arg1);
anhtran 0:e9fd5575b10e 254 result->putData<R>(res);
anhtran 0:e9fd5575b10e 255 }
anhtran 0:e9fd5575b10e 256
anhtran 0:e9fd5575b10e 257 /* Function rpc_function caller
anhtran 0:e9fd5575b10e 258 */
anhtran 0:e9fd5575b10e 259 template<typename R, typename A1, typename A2, R(*func)(A1, A2)>
anhtran 0:e9fd5575b10e 260 void rpc_function_caller(Arguments *arguments, Reply *result) {
anhtran 0:e9fd5575b10e 261 A1 arg1 = arguments->getArg<A1>();
anhtran 0:e9fd5575b10e 262 A2 arg2 = arguments->getArg<A2>();
anhtran 0:e9fd5575b10e 263
anhtran 0:e9fd5575b10e 264 R res = (*func)(arg1, arg2);
anhtran 0:e9fd5575b10e 265 result->putData<R>(res);
anhtran 0:e9fd5575b10e 266 }
anhtran 0:e9fd5575b10e 267
anhtran 0:e9fd5575b10e 268 /* Function rpc_function caller
anhtran 0:e9fd5575b10e 269 */
anhtran 0:e9fd5575b10e 270 template<typename R, typename A1, typename A2, typename A3, R(*func)(A1, A2, A3)>
anhtran 0:e9fd5575b10e 271 void rpc_function_caller(Arguments *arguments, Reply *result) {
anhtran 0:e9fd5575b10e 272 A1 arg1 = arguments->getArg<A1>();
anhtran 0:e9fd5575b10e 273 A2 arg2 = arguments->getArg<A2>();
anhtran 0:e9fd5575b10e 274 A3 arg3 = arguments->getArg<A3>();
anhtran 0:e9fd5575b10e 275
anhtran 0:e9fd5575b10e 276 R res = (*func)(arg1, arg2, arg3);
anhtran 0:e9fd5575b10e 277 result->putData<R>(res);
anhtran 0:e9fd5575b10e 278 }
anhtran 0:e9fd5575b10e 279
anhtran 0:e9fd5575b10e 280 /* Function rpc_function caller
anhtran 0:e9fd5575b10e 281 */
anhtran 0:e9fd5575b10e 282 template<typename R, typename A1, typename A2, typename A3, typename A4, R(*func)(A1, A2, A3, A4)>
anhtran 0:e9fd5575b10e 283 void rpc_function_caller(Arguments *arguments, Reply *result) {
anhtran 0:e9fd5575b10e 284 A1 arg1 = arguments->getArg<A1>();
anhtran 0:e9fd5575b10e 285 A2 arg2 = arguments->getArg<A2>();
anhtran 0:e9fd5575b10e 286 A3 arg3 = arguments->getArg<A3>();
anhtran 0:e9fd5575b10e 287 A4 arg4 = arguments->getArg<A4>();
anhtran 0:e9fd5575b10e 288
anhtran 0:e9fd5575b10e 289 R res = (*func)(arg1, arg2, arg3, arg4);
anhtran 0:e9fd5575b10e 290 result->putData<R>(res);
anhtran 0:e9fd5575b10e 291 }
anhtran 0:e9fd5575b10e 292
anhtran 0:e9fd5575b10e 293 struct rpc_method {
anhtran 0:e9fd5575b10e 294 const char *name;
anhtran 0:e9fd5575b10e 295 typedef void (*method_caller_t)(RPC*, Arguments*, Reply*);
anhtran 0:e9fd5575b10e 296 typedef const struct rpc_method *(*super_t)(RPC*);
anhtran 0:e9fd5575b10e 297 union {
anhtran 0:e9fd5575b10e 298 method_caller_t method_caller;
anhtran 0:e9fd5575b10e 299 super_t super;
anhtran 0:e9fd5575b10e 300 };
anhtran 0:e9fd5575b10e 301 };
anhtran 0:e9fd5575b10e 302
anhtran 0:e9fd5575b10e 303 template<class C>
anhtran 0:e9fd5575b10e 304 const struct rpc_method *rpc_super(RPC *this_ptr) {
anhtran 0:e9fd5575b10e 305 return static_cast<C*>(this_ptr)->C::get_rpc_methods();
anhtran 0:e9fd5575b10e 306 }
anhtran 0:e9fd5575b10e 307
anhtran 0:e9fd5575b10e 308 #define RPC_METHOD_END { NULL, NULL }
anhtran 0:e9fd5575b10e 309 #define RPC_METHOD_SUPER(C) { NULL, (rpc_method::method_caller_t)rpc_super<C> }
anhtran 0:e9fd5575b10e 310
anhtran 0:e9fd5575b10e 311 } // namespace mbed
anhtran 0:e9fd5575b10e 312
anhtran 0:e9fd5575b10e 313 #endif
anhtran 0:e9fd5575b10e 314