config AX12

Fork of configure_ax12_test_bras_module by CRAC Team

Committer:
clementlignie
Date:
Wed Feb 01 13:42:30 2017 +0000
Revision:
2:91b6646ea994
Parent:
0:c03cffe402df
config AX12

Who changed what in which revision?

UserRevisionLine numberNew contents of line
slowness 0:c03cffe402df 1 /* mbed Microcontroller Library - RPC
slowness 0:c03cffe402df 2 * Copyright (c) 2008-2009 ARM Limited. All rights reserved.
slowness 0:c03cffe402df 3 */
slowness 0:c03cffe402df 4
slowness 0:c03cffe402df 5 #ifndef MBED_RPC_H
slowness 0:c03cffe402df 6 #define MBED_RPC_H
slowness 0:c03cffe402df 7
slowness 0:c03cffe402df 8 /* Section rpc
slowness 0:c03cffe402df 9 * Helpers for rpc handling.
slowness 0:c03cffe402df 10 */
slowness 0:c03cffe402df 11
slowness 0:c03cffe402df 12 #include <stdlib.h>
slowness 0:c03cffe402df 13 #include <stdio.h>
slowness 0:c03cffe402df 14 #include <string.h>
slowness 0:c03cffe402df 15 #include <ctype.h>
slowness 0:c03cffe402df 16 #include "Base.h"
slowness 0:c03cffe402df 17
slowness 0:c03cffe402df 18 #include "PinNames.h"
slowness 0:c03cffe402df 19 #include <stdint.h>
slowness 0:c03cffe402df 20
slowness 0:c03cffe402df 21 namespace mbed {
slowness 0:c03cffe402df 22
slowness 0:c03cffe402df 23 /* Function parse_arg
slowness 0:c03cffe402df 24 * Parses and returns a value from a string.
slowness 0:c03cffe402df 25 *
slowness 0:c03cffe402df 26 * Variable
slowness 0:c03cffe402df 27 * arg - The string to pase
slowness 0:c03cffe402df 28 * next - If not NULL a pointer to after the last
slowness 0:c03cffe402df 29 * character parsed is written here
slowness 0:c03cffe402df 30 */
slowness 0:c03cffe402df 31 template<typename T> T parse_arg(const char *arg, const char **next);
slowness 0:c03cffe402df 32
slowness 0:c03cffe402df 33 inline char parse_char(const char *arg, const char **next) {
slowness 0:c03cffe402df 34 char c = *arg++;
slowness 0:c03cffe402df 35 if(c == '\\') {
slowness 0:c03cffe402df 36 c = *arg++;
slowness 0:c03cffe402df 37 switch(c) {
slowness 0:c03cffe402df 38 case 'a': c = '\a'; break;
slowness 0:c03cffe402df 39 case 'b': c = '\b'; break;
slowness 0:c03cffe402df 40 case 't': c = '\t'; break;
slowness 0:c03cffe402df 41 case 'n': c = '\n'; break;
slowness 0:c03cffe402df 42 case 'v': c = '\v'; break;
slowness 0:c03cffe402df 43 case 'f': c = '\f'; break;
slowness 0:c03cffe402df 44 case 'r': c = '\r'; break;
slowness 0:c03cffe402df 45 case 'x':
slowness 0:c03cffe402df 46 {
slowness 0:c03cffe402df 47 /* two-character hexadecimal */
slowness 0:c03cffe402df 48 char buf[3];
slowness 0:c03cffe402df 49 buf[0] = *arg++;
slowness 0:c03cffe402df 50 buf[1] = *arg++;
slowness 0:c03cffe402df 51 buf[2] = 0;
slowness 0:c03cffe402df 52 c = strtol(buf, NULL, 16);
slowness 0:c03cffe402df 53 }
slowness 0:c03cffe402df 54 break;
slowness 0:c03cffe402df 55 default:
slowness 0:c03cffe402df 56 if(isdigit(c)) {
slowness 0:c03cffe402df 57 /* three-character octal */
slowness 0:c03cffe402df 58 char buf[4];
slowness 0:c03cffe402df 59 buf[0] = c;
slowness 0:c03cffe402df 60 buf[1] = *arg++;
slowness 0:c03cffe402df 61 buf[2] = *arg++;
slowness 0:c03cffe402df 62 buf[3] = 0;
slowness 0:c03cffe402df 63 c = strtol(buf, NULL, 8);
slowness 0:c03cffe402df 64 }
slowness 0:c03cffe402df 65 break;
slowness 0:c03cffe402df 66 }
slowness 0:c03cffe402df 67 }
slowness 0:c03cffe402df 68 *next = arg;
slowness 0:c03cffe402df 69 return c;
slowness 0:c03cffe402df 70 }
slowness 0:c03cffe402df 71
slowness 0:c03cffe402df 72 /* signed integer types */
slowness 0:c03cffe402df 73
slowness 0:c03cffe402df 74 template<> inline int parse_arg<int>(const char *arg, const char **next) {
slowness 0:c03cffe402df 75 if(arg[0] == '\'') {
slowness 0:c03cffe402df 76 char c = parse_char(arg+1, &arg);
slowness 0:c03cffe402df 77 if(next != NULL) *next = arg+1;
slowness 0:c03cffe402df 78 return c;
slowness 0:c03cffe402df 79 } else {
slowness 0:c03cffe402df 80 return strtol(arg, const_cast<char**>(next), 0);
slowness 0:c03cffe402df 81 }
slowness 0:c03cffe402df 82 }
slowness 0:c03cffe402df 83
slowness 0:c03cffe402df 84 template<> inline char parse_arg<char>(const char *arg, const char **next) {
slowness 0:c03cffe402df 85 return parse_arg<int>(arg,next);
slowness 0:c03cffe402df 86 }
slowness 0:c03cffe402df 87
slowness 0:c03cffe402df 88 template<> inline short int parse_arg<short int>(const char *arg, const char **next) {
slowness 0:c03cffe402df 89 return parse_arg<int>(arg,next);
slowness 0:c03cffe402df 90 }
slowness 0:c03cffe402df 91
slowness 0:c03cffe402df 92 template<> inline long int parse_arg<long int>(const char *arg, const char **next) {
slowness 0:c03cffe402df 93 return parse_arg<int>(arg,next);
slowness 0:c03cffe402df 94 }
slowness 0:c03cffe402df 95
slowness 0:c03cffe402df 96 template<> inline long long parse_arg<long long>(const char *arg, const char **next) {
slowness 0:c03cffe402df 97 return strtoll(arg, const_cast<char**>(next), 0);
slowness 0:c03cffe402df 98 }
slowness 0:c03cffe402df 99
slowness 0:c03cffe402df 100 /* unsigned integer types */
slowness 0:c03cffe402df 101
slowness 0:c03cffe402df 102 template<> inline unsigned int parse_arg<unsigned int>(const char *arg, const char **next) {
slowness 0:c03cffe402df 103 if(arg[0] == '\'') {
slowness 0:c03cffe402df 104 char c = parse_char(arg+1, &arg);
slowness 0:c03cffe402df 105 if(next != NULL) *next = arg+1;
slowness 0:c03cffe402df 106 return c;
slowness 0:c03cffe402df 107 } else {
slowness 0:c03cffe402df 108 return strtoul(arg, const_cast<char**>(next), 0);
slowness 0:c03cffe402df 109 }
slowness 0:c03cffe402df 110 }
slowness 0:c03cffe402df 111
slowness 0:c03cffe402df 112 template<> inline unsigned char parse_arg<unsigned char>(const char *arg, const char **next) {
slowness 0:c03cffe402df 113 return parse_arg<unsigned int>(arg,next);
slowness 0:c03cffe402df 114 }
slowness 0:c03cffe402df 115
slowness 0:c03cffe402df 116 template<> inline unsigned short int parse_arg<unsigned short int>(const char *arg, const char **next) {
slowness 0:c03cffe402df 117 return parse_arg<unsigned int>(arg,next);
slowness 0:c03cffe402df 118 }
slowness 0:c03cffe402df 119
slowness 0:c03cffe402df 120 template<> inline unsigned long int parse_arg<unsigned long int>(const char *arg, const char **next) {
slowness 0:c03cffe402df 121 return parse_arg<unsigned int>(arg,next);
slowness 0:c03cffe402df 122 }
slowness 0:c03cffe402df 123
slowness 0:c03cffe402df 124 template<> inline unsigned long long parse_arg<unsigned long long>(const char *arg, const char **next) {
slowness 0:c03cffe402df 125 return strtoull(arg, const_cast<char**>(next), 0);
slowness 0:c03cffe402df 126 }
slowness 0:c03cffe402df 127
slowness 0:c03cffe402df 128 /* floating types */
slowness 0:c03cffe402df 129
slowness 0:c03cffe402df 130 template<> inline float parse_arg<float>(const char *arg, const char **next) {
slowness 0:c03cffe402df 131 #if !defined(__ARMCC_VERSION) || __ARMCC_VERSION >= 410000
slowness 0:c03cffe402df 132 return strtof(arg,const_cast<char**>(next));
slowness 0:c03cffe402df 133 #elif __ARMCC_VERSION >= 310000
slowness 0:c03cffe402df 134 /* bug in header means no using declaration for strtof */
slowness 0:c03cffe402df 135 return std::strtof(arg,const_cast<char**>(next));
slowness 0:c03cffe402df 136 #else
slowness 0:c03cffe402df 137 /* strtof not supported */
slowness 0:c03cffe402df 138 return strtod(arg,const_cast<char**>(next));
slowness 0:c03cffe402df 139 #endif
slowness 0:c03cffe402df 140 }
slowness 0:c03cffe402df 141
slowness 0:c03cffe402df 142 template<> inline double parse_arg<double>(const char *arg, const char **next) {
slowness 0:c03cffe402df 143 return strtod(arg,const_cast<char**>(next));
slowness 0:c03cffe402df 144 }
slowness 0:c03cffe402df 145
slowness 0:c03cffe402df 146 template<> inline long double parse_arg<long double>(const char *arg, const char **next) {
slowness 0:c03cffe402df 147 return strtod(arg,const_cast<char**>(next));
slowness 0:c03cffe402df 148 }
slowness 0:c03cffe402df 149
slowness 0:c03cffe402df 150 /* string */
slowness 0:c03cffe402df 151
slowness 0:c03cffe402df 152 template<> inline char *parse_arg<char*>(const char *arg, const char **next) {
slowness 0:c03cffe402df 153 const char *ptr = arg;
slowness 0:c03cffe402df 154 char *res = NULL;
slowness 0:c03cffe402df 155 if(*arg == '"') {
slowness 0:c03cffe402df 156 /* quoted string */
slowness 0:c03cffe402df 157 ptr = ++arg;
slowness 0:c03cffe402df 158 int len = 0;
slowness 0:c03cffe402df 159 /* find the end (and length) of the quoted string */
slowness 0:c03cffe402df 160 for(char c = *ptr; c != 0 && c != '"'; c = *++ptr) {
slowness 0:c03cffe402df 161 len++;
slowness 0:c03cffe402df 162 if(c == '\\') {
slowness 0:c03cffe402df 163 ptr++;
slowness 0:c03cffe402df 164 }
slowness 0:c03cffe402df 165 }
slowness 0:c03cffe402df 166 /* copy the quoted string, and unescape characters */
slowness 0:c03cffe402df 167 if(len != 0) {
slowness 0:c03cffe402df 168 res = new char[len+1];
slowness 0:c03cffe402df 169 char *resptr = res;
slowness 0:c03cffe402df 170 while(arg != ptr) {
slowness 0:c03cffe402df 171 *resptr++ = parse_char(arg, &arg);
slowness 0:c03cffe402df 172 }
slowness 0:c03cffe402df 173 *resptr = 0;
slowness 0:c03cffe402df 174 }
slowness 0:c03cffe402df 175 } else {
slowness 0:c03cffe402df 176 /* unquoted string */
slowness 0:c03cffe402df 177 while(isalnum(*ptr) || *ptr=='_') {
slowness 0:c03cffe402df 178 ptr++;
slowness 0:c03cffe402df 179 }
slowness 0:c03cffe402df 180 int len = ptr-arg;
slowness 0:c03cffe402df 181 if(len!=0) {
slowness 0:c03cffe402df 182 res = new char[len+1];
slowness 0:c03cffe402df 183 memcpy(res, arg, len);
slowness 0:c03cffe402df 184 res[len] = 0;
slowness 0:c03cffe402df 185 }
slowness 0:c03cffe402df 186 }
slowness 0:c03cffe402df 187
slowness 0:c03cffe402df 188 if(next != NULL) {
slowness 0:c03cffe402df 189 *next = ptr;
slowness 0:c03cffe402df 190 }
slowness 0:c03cffe402df 191 return res;
slowness 0:c03cffe402df 192 }
slowness 0:c03cffe402df 193
slowness 0:c03cffe402df 194 template<> inline const char *parse_arg<const char*>(const char *arg, const char **next) {
slowness 0:c03cffe402df 195 return parse_arg<char*>(arg,next);
slowness 0:c03cffe402df 196 }
slowness 0:c03cffe402df 197
slowness 0:c03cffe402df 198 /* Pins */
slowness 0:c03cffe402df 199
slowness 0:c03cffe402df 200
slowness 0:c03cffe402df 201 inline PinName parse_pins(const char *str) {
slowness 0:c03cffe402df 202 const PinName pin_names[] = {p5, p6, p7, p8, p9, p10, p11, p12, p13, p14
slowness 0:c03cffe402df 203 , p15, p16, p17, p18, p19, p20, p21, p22, p23
slowness 0:c03cffe402df 204 , p24, p25, p26, p27, p28, p29, p30};
slowness 0:c03cffe402df 205
slowness 0:c03cffe402df 206 if(str[0] == 'P') { // Pn_n
slowness 0:c03cffe402df 207 uint32_t port = str[1] - '0';
slowness 0:c03cffe402df 208 uint32_t pin = str[3] - '0'; // Pn_n
slowness 0:c03cffe402df 209 uint32_t pin2 = str[4] - '0'; // Pn_nn
slowness 0:c03cffe402df 210 if(pin2 <= 9) {
slowness 0:c03cffe402df 211 pin = pin * 10 + pin2;
slowness 0:c03cffe402df 212 }
slowness 0:c03cffe402df 213 #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368)
slowness 0:c03cffe402df 214 return (PinName)(LPC_GPIO0_BASE + port * 32 + pin);
slowness 0:c03cffe402df 215 #elif defined(TARGET_LPC11U24)
slowness 0:c03cffe402df 216 return (PinName)(port * 32 + pin);
slowness 0:c03cffe402df 217 #endif
slowness 0:c03cffe402df 218 } else if(str[0] == 'p') { // pn
slowness 0:c03cffe402df 219 uint32_t pin = str[1] - '0'; // pn
slowness 0:c03cffe402df 220 uint32_t pin2 = str[2] - '0'; // pnn
slowness 0:c03cffe402df 221 if(pin2 <= 9) {
slowness 0:c03cffe402df 222 pin = pin * 10 + pin2;
slowness 0:c03cffe402df 223 }
slowness 0:c03cffe402df 224 if(pin < 5 || pin > 30) {
slowness 0:c03cffe402df 225 return NC;
slowness 0:c03cffe402df 226 }
slowness 0:c03cffe402df 227 return pin_names[pin - 5];
slowness 0:c03cffe402df 228 } else if(str[0] == 'L') { // LEDn
slowness 0:c03cffe402df 229 switch(str[3]) {
slowness 0:c03cffe402df 230 case '1' : return LED1;
slowness 0:c03cffe402df 231 case '2' : return LED2;
slowness 0:c03cffe402df 232 case '3' : return LED3;
slowness 0:c03cffe402df 233 case '4' : return LED4;
slowness 0:c03cffe402df 234 }
slowness 0:c03cffe402df 235 } else if(str[0] == 'U') { // USB?X
slowness 0:c03cffe402df 236 switch(str[3]) {
slowness 0:c03cffe402df 237 case 'T' : return USBTX;
slowness 0:c03cffe402df 238 case 'R' : return USBRX;
slowness 0:c03cffe402df 239 }
slowness 0:c03cffe402df 240 }
slowness 0:c03cffe402df 241 return NC;
slowness 0:c03cffe402df 242 }
slowness 0:c03cffe402df 243
slowness 0:c03cffe402df 244 template<> inline PinName parse_arg<PinName>(const char *arg, const char **next) {
slowness 0:c03cffe402df 245 const char *ptr = arg;
slowness 0:c03cffe402df 246 PinName pinname = NC;
slowness 0:c03cffe402df 247 while(isalnum(*ptr) || *ptr=='_') {
slowness 0:c03cffe402df 248 ptr++;
slowness 0:c03cffe402df 249 }
slowness 0:c03cffe402df 250 int len = ptr-arg;
slowness 0:c03cffe402df 251 if(len!=0) {
slowness 0:c03cffe402df 252 pinname = parse_pins(arg);
slowness 0:c03cffe402df 253
slowness 0:c03cffe402df 254 }
slowness 0:c03cffe402df 255 if(next != NULL) {
slowness 0:c03cffe402df 256 *next = ptr;
slowness 0:c03cffe402df 257 }
slowness 0:c03cffe402df 258 return pinname;
slowness 0:c03cffe402df 259 }
slowness 0:c03cffe402df 260
slowness 0:c03cffe402df 261
slowness 0:c03cffe402df 262 /* Function write_result
slowness 0:c03cffe402df 263 * Writes a value in to a result string in an appropriate manner
slowness 0:c03cffe402df 264 *
slowness 0:c03cffe402df 265 * Variable
slowness 0:c03cffe402df 266 * val - The value to write
slowness 0:c03cffe402df 267 * result - A pointer to the array to write the value into
slowness 0:c03cffe402df 268 */
slowness 0:c03cffe402df 269 template<typename T> void write_result(T val, char *result);
slowness 0:c03cffe402df 270
slowness 0:c03cffe402df 271 /* signed integer types */
slowness 0:c03cffe402df 272
slowness 0:c03cffe402df 273 template<> inline void write_result<char>(char val, char *result) {
slowness 0:c03cffe402df 274 result[0] = val;
slowness 0:c03cffe402df 275 result[1] = '\0';
slowness 0:c03cffe402df 276 }
slowness 0:c03cffe402df 277
slowness 0:c03cffe402df 278 template<> inline void write_result<short int>(short int val, char *result) {
slowness 0:c03cffe402df 279 sprintf(result, "%hi", val);
slowness 0:c03cffe402df 280 }
slowness 0:c03cffe402df 281
slowness 0:c03cffe402df 282 template<> inline void write_result<int>(int val, char *result) {
slowness 0:c03cffe402df 283 sprintf(result, "%i", val);
slowness 0:c03cffe402df 284 }
slowness 0:c03cffe402df 285
slowness 0:c03cffe402df 286 template<> inline void write_result<long int>(long int val, char *result) {
slowness 0:c03cffe402df 287 sprintf(result, "%li", val);
slowness 0:c03cffe402df 288 }
slowness 0:c03cffe402df 289
slowness 0:c03cffe402df 290 template<> inline void write_result<long long int>(long long int val, char *result) {
slowness 0:c03cffe402df 291 sprintf(result, "%lli", val);
slowness 0:c03cffe402df 292 }
slowness 0:c03cffe402df 293
slowness 0:c03cffe402df 294 /* unsigned integer types */
slowness 0:c03cffe402df 295
slowness 0:c03cffe402df 296 template<> inline void write_result<unsigned char>(unsigned char val, char *result) {
slowness 0:c03cffe402df 297 result[0] = val;
slowness 0:c03cffe402df 298 result[1] = '\0';
slowness 0:c03cffe402df 299 }
slowness 0:c03cffe402df 300
slowness 0:c03cffe402df 301 template<> inline void write_result<unsigned short int>(unsigned short int val, char *result) {
slowness 0:c03cffe402df 302 sprintf(result, "%hu", val);
slowness 0:c03cffe402df 303 }
slowness 0:c03cffe402df 304
slowness 0:c03cffe402df 305 template<> inline void write_result<unsigned int>(unsigned int val, char *result) {
slowness 0:c03cffe402df 306 sprintf(result, "%u", val);
slowness 0:c03cffe402df 307 }
slowness 0:c03cffe402df 308
slowness 0:c03cffe402df 309 template<> inline void write_result<unsigned long int>(unsigned long int val, char *result) {
slowness 0:c03cffe402df 310 sprintf(result, "%lu", val);
slowness 0:c03cffe402df 311 }
slowness 0:c03cffe402df 312
slowness 0:c03cffe402df 313 template<> inline void write_result<unsigned long long int>(unsigned long long int val, char *result) {
slowness 0:c03cffe402df 314 sprintf(result, "%llu", val);
slowness 0:c03cffe402df 315 }
slowness 0:c03cffe402df 316
slowness 0:c03cffe402df 317 /* floating types */
slowness 0:c03cffe402df 318
slowness 0:c03cffe402df 319 template<> inline void write_result<float>(float val, char *result) {
slowness 0:c03cffe402df 320 sprintf(result, "%.17g", val);
slowness 0:c03cffe402df 321 }
slowness 0:c03cffe402df 322
slowness 0:c03cffe402df 323 template<> inline void write_result<double>(double val, char *result) {
slowness 0:c03cffe402df 324 sprintf(result, "%.17g", val);
slowness 0:c03cffe402df 325 }
slowness 0:c03cffe402df 326
slowness 0:c03cffe402df 327 template<> inline void write_result<long double>(long double val, char *result) {
slowness 0:c03cffe402df 328 sprintf(result, "%.17Lg", val);
slowness 0:c03cffe402df 329 }
slowness 0:c03cffe402df 330
slowness 0:c03cffe402df 331
slowness 0:c03cffe402df 332 /* string */
slowness 0:c03cffe402df 333
slowness 0:c03cffe402df 334 template<> inline void write_result<char*>(char *val, char *result) {
slowness 0:c03cffe402df 335 if(val==NULL) {
slowness 0:c03cffe402df 336 result[0] = 0;
slowness 0:c03cffe402df 337 } else {
slowness 0:c03cffe402df 338 strcpy(result, val);
slowness 0:c03cffe402df 339 }
slowness 0:c03cffe402df 340 }
slowness 0:c03cffe402df 341
slowness 0:c03cffe402df 342 template<> inline void write_result<const char*>(const char *val, char *result) {
slowness 0:c03cffe402df 343 if(val==NULL) {
slowness 0:c03cffe402df 344 result[0] = 0;
slowness 0:c03cffe402df 345 } else {
slowness 0:c03cffe402df 346 strcpy(result, val);
slowness 0:c03cffe402df 347 }
slowness 0:c03cffe402df 348 }
slowness 0:c03cffe402df 349
slowness 0:c03cffe402df 350
slowness 0:c03cffe402df 351 inline const char *next_arg(const char* next) {
slowness 0:c03cffe402df 352 while(*next == ' ') next++;
slowness 0:c03cffe402df 353 if(*next == ',' || *next == '?') next++;
slowness 0:c03cffe402df 354 while(*next == ' ') next++;
slowness 0:c03cffe402df 355 return next;
slowness 0:c03cffe402df 356 }
slowness 0:c03cffe402df 357
slowness 0:c03cffe402df 358
slowness 0:c03cffe402df 359 /* Function rpc_method_caller
slowness 0:c03cffe402df 360 */
slowness 0:c03cffe402df 361 template<class T, void (T::*member)(const char *,char *)>
slowness 0:c03cffe402df 362 void rpc_method_caller(Base *this_ptr, const char *arguments, char *result) {
slowness 0:c03cffe402df 363 (static_cast<T*>(this_ptr)->*member)(arguments,result);
slowness 0:c03cffe402df 364 }
slowness 0:c03cffe402df 365
slowness 0:c03cffe402df 366
slowness 0:c03cffe402df 367 /* Function rpc_method_caller
slowness 0:c03cffe402df 368 */
slowness 0:c03cffe402df 369 template<class T, void (T::*member)()>
slowness 0:c03cffe402df 370 void rpc_method_caller(Base *this_ptr, const char *arguments, char *result) {
slowness 0:c03cffe402df 371 (static_cast<T*>(this_ptr)->*member)();
slowness 0:c03cffe402df 372 if(result != NULL) {
slowness 0:c03cffe402df 373 result[0] = '\0';
slowness 0:c03cffe402df 374 }
slowness 0:c03cffe402df 375 }
slowness 0:c03cffe402df 376
slowness 0:c03cffe402df 377
slowness 0:c03cffe402df 378 /* Function rpc_method_caller
slowness 0:c03cffe402df 379 */
slowness 0:c03cffe402df 380 template<class T, typename A1, void (T::*member)(A1)>
slowness 0:c03cffe402df 381 void rpc_method_caller(Base *this_ptr, const char *arguments, char *result) {
slowness 0:c03cffe402df 382
slowness 0:c03cffe402df 383 const char *next = arguments;
slowness 0:c03cffe402df 384 A1 arg1 = parse_arg<A1>(next_arg(next),NULL);
slowness 0:c03cffe402df 385
slowness 0:c03cffe402df 386 (static_cast<T*>(this_ptr)->*member)(arg1);
slowness 0:c03cffe402df 387 if(result != NULL) {
slowness 0:c03cffe402df 388 result[0] = '\0';
slowness 0:c03cffe402df 389 }
slowness 0:c03cffe402df 390 }
slowness 0:c03cffe402df 391
slowness 0:c03cffe402df 392
slowness 0:c03cffe402df 393 /* Function rpc_method_caller
slowness 0:c03cffe402df 394 */
slowness 0:c03cffe402df 395 template<class T, typename A1, typename A2, void (T::*member)(A1,A2)>
slowness 0:c03cffe402df 396 void rpc_method_caller(Base *this_ptr, const char *arguments, char *result) {
slowness 0:c03cffe402df 397
slowness 0:c03cffe402df 398 const char *next = arguments;
slowness 0:c03cffe402df 399 A1 arg1 = parse_arg<A1>(next_arg(next),&next);
slowness 0:c03cffe402df 400 A2 arg2 = parse_arg<A2>(next_arg(next),NULL);
slowness 0:c03cffe402df 401
slowness 0:c03cffe402df 402 (static_cast<T*>(this_ptr)->*member)(arg1,arg2);
slowness 0:c03cffe402df 403 if(result != NULL) {
slowness 0:c03cffe402df 404 result[0] = '\0';
slowness 0:c03cffe402df 405 }
slowness 0:c03cffe402df 406 }
slowness 0:c03cffe402df 407
slowness 0:c03cffe402df 408
slowness 0:c03cffe402df 409 /* Function rpc_method_caller
slowness 0:c03cffe402df 410 */
slowness 0:c03cffe402df 411 template<class T, typename A1, typename A2, typename A3, void (T::*member)(A1,A2,A3)>
slowness 0:c03cffe402df 412 void rpc_method_caller(Base *this_ptr, const char *arguments, char *result) {
slowness 0:c03cffe402df 413
slowness 0:c03cffe402df 414 const char *next = arguments;
slowness 0:c03cffe402df 415 A1 arg1 = parse_arg<A1>(next_arg(next),&next);
slowness 0:c03cffe402df 416 A2 arg2 = parse_arg<A2>(next_arg(next),&next);
slowness 0:c03cffe402df 417 A3 arg3 = parse_arg<A3>(next_arg(next),NULL);
slowness 0:c03cffe402df 418
slowness 0:c03cffe402df 419 (static_cast<T*>(this_ptr)->*member)(arg1,arg2,arg3);
slowness 0:c03cffe402df 420 if(result != NULL) {
slowness 0:c03cffe402df 421 result[0] = '\0';
slowness 0:c03cffe402df 422 }
slowness 0:c03cffe402df 423 }
slowness 0:c03cffe402df 424
slowness 0:c03cffe402df 425
slowness 0:c03cffe402df 426 /* Function rpc_method_caller
slowness 0:c03cffe402df 427 */
slowness 0:c03cffe402df 428 template<typename R, class T, R (T::*member)()>
slowness 0:c03cffe402df 429 void rpc_method_caller(Base *this_ptr, const char *arguments, char *result) {
slowness 0:c03cffe402df 430 R res = (static_cast<T*>(this_ptr)->*member)();
slowness 0:c03cffe402df 431 if(result != NULL) {
slowness 0:c03cffe402df 432 write_result<R>(res, result);
slowness 0:c03cffe402df 433 }
slowness 0:c03cffe402df 434 }
slowness 0:c03cffe402df 435
slowness 0:c03cffe402df 436
slowness 0:c03cffe402df 437 /* Function rpc_method_caller
slowness 0:c03cffe402df 438 */
slowness 0:c03cffe402df 439 template<typename R, class T, typename A1, R (T::*member)(A1)>
slowness 0:c03cffe402df 440 void rpc_method_caller(Base *this_ptr, const char *arguments, char *result) {
slowness 0:c03cffe402df 441
slowness 0:c03cffe402df 442 const char *next = arguments;
slowness 0:c03cffe402df 443 A1 arg1 = parse_arg<A1>(next_arg(next),NULL);
slowness 0:c03cffe402df 444
slowness 0:c03cffe402df 445 R res = (static_cast<T*>(this_ptr)->*member)(arg1);
slowness 0:c03cffe402df 446 if(result != NULL) {
slowness 0:c03cffe402df 447 write_result<R>(res, result);
slowness 0:c03cffe402df 448 }
slowness 0:c03cffe402df 449 }
slowness 0:c03cffe402df 450
slowness 0:c03cffe402df 451
slowness 0:c03cffe402df 452 /* Function rpc_method_caller
slowness 0:c03cffe402df 453 */
slowness 0:c03cffe402df 454 template<typename R, class T, typename A1, typename A2, R (T::*member)(A1,A2)>
slowness 0:c03cffe402df 455 void rpc_method_caller(Base *this_ptr, const char *arguments, char *result) {
slowness 0:c03cffe402df 456
slowness 0:c03cffe402df 457 const char *next = arguments;
slowness 0:c03cffe402df 458 A1 arg1 = parse_arg<A1>(next_arg(next),&next);
slowness 0:c03cffe402df 459 A2 arg2 = parse_arg<A2>(next_arg(next),NULL);
slowness 0:c03cffe402df 460
slowness 0:c03cffe402df 461 R res = (static_cast<T*>(this_ptr)->*member)(arg1,arg2);
slowness 0:c03cffe402df 462 if(result != NULL) {
slowness 0:c03cffe402df 463 write_result<R>(res, result);
slowness 0:c03cffe402df 464 }
slowness 0:c03cffe402df 465 }
slowness 0:c03cffe402df 466
slowness 0:c03cffe402df 467
slowness 0:c03cffe402df 468 /* Function rpc_method_caller
slowness 0:c03cffe402df 469 */
slowness 0:c03cffe402df 470 template<typename R, class T, typename A1, typename A2, typename A3, R (T::*member)(A1,A2,A3)>
slowness 0:c03cffe402df 471 void rpc_method_caller(Base *this_ptr, const char *arguments, char *result) {
slowness 0:c03cffe402df 472
slowness 0:c03cffe402df 473 const char *next = arguments;
slowness 0:c03cffe402df 474 A1 arg1 = parse_arg<A1>(next_arg(next),&next);
slowness 0:c03cffe402df 475 A2 arg2 = parse_arg<A2>(next_arg(next),&next);
slowness 0:c03cffe402df 476 A3 arg3 = parse_arg<A3>(next_arg(next),NULL);
slowness 0:c03cffe402df 477
slowness 0:c03cffe402df 478 R res = (static_cast<T*>(this_ptr)->*member)(arg1,arg2,arg3);
slowness 0:c03cffe402df 479 if(result != NULL) {
slowness 0:c03cffe402df 480 write_result<R>(res, result);
slowness 0:c03cffe402df 481 }
slowness 0:c03cffe402df 482 }
slowness 0:c03cffe402df 483
slowness 0:c03cffe402df 484
slowness 0:c03cffe402df 485 /* Function rpc_function caller
slowness 0:c03cffe402df 486 */
slowness 0:c03cffe402df 487 template<typename R, R (*func)()>
slowness 0:c03cffe402df 488 void rpc_function_caller(const char *arguments, char *result) {
slowness 0:c03cffe402df 489 R res = (*func)();
slowness 0:c03cffe402df 490 if(result != NULL) {
slowness 0:c03cffe402df 491 write_result<R>(res, result);
slowness 0:c03cffe402df 492 }
slowness 0:c03cffe402df 493 }
slowness 0:c03cffe402df 494
slowness 0:c03cffe402df 495
slowness 0:c03cffe402df 496 /* Function rpc_function caller
slowness 0:c03cffe402df 497 */
slowness 0:c03cffe402df 498 template<typename R, typename A1, R (*func)(A1)>
slowness 0:c03cffe402df 499 void rpc_function_caller(const char *arguments, char *result) {
slowness 0:c03cffe402df 500 A1 arg1 = parse_arg<A1>(next_arg(arguments),NULL);
slowness 0:c03cffe402df 501 R res = (*func)(arg1);
slowness 0:c03cffe402df 502 if(result != NULL) {
slowness 0:c03cffe402df 503 write_result<R>(res, result);
slowness 0:c03cffe402df 504 }
slowness 0:c03cffe402df 505 }
slowness 0:c03cffe402df 506
slowness 0:c03cffe402df 507
slowness 0:c03cffe402df 508 /* Function rpc_function caller
slowness 0:c03cffe402df 509 */
slowness 0:c03cffe402df 510 template<typename R, typename A1, typename A2, R (*func)(A1,A2)>
slowness 0:c03cffe402df 511 void rpc_function_caller(const char *arguments, char *result) {
slowness 0:c03cffe402df 512
slowness 0:c03cffe402df 513 const char *next = arguments;
slowness 0:c03cffe402df 514 A1 arg1 = parse_arg<A1>(next_arg(next),&next);
slowness 0:c03cffe402df 515 A2 arg2 = parse_arg<A2>(next_arg(next),NULL);
slowness 0:c03cffe402df 516
slowness 0:c03cffe402df 517 R res = (*func)(arg1,arg2);
slowness 0:c03cffe402df 518 if(result != NULL) {
slowness 0:c03cffe402df 519 write_result<R>(res, result);
slowness 0:c03cffe402df 520 }
slowness 0:c03cffe402df 521 }
slowness 0:c03cffe402df 522
slowness 0:c03cffe402df 523
slowness 0:c03cffe402df 524 /* Function rpc_function caller
slowness 0:c03cffe402df 525 */
slowness 0:c03cffe402df 526 template<typename R, typename A1, typename A2, typename A3, R (*func)(A1,A2,A3)>
slowness 0:c03cffe402df 527 void rpc_function_caller(const char *arguments, char *result) {
slowness 0:c03cffe402df 528
slowness 0:c03cffe402df 529 const char *next = arguments;
slowness 0:c03cffe402df 530 A1 arg1 = parse_arg<A1>(next_arg(next),&next);
slowness 0:c03cffe402df 531 A2 arg2 = parse_arg<A2>(next_arg(next),&next);
slowness 0:c03cffe402df 532 A3 arg3 = parse_arg<A3>(next_arg(next),NULL);
slowness 0:c03cffe402df 533
slowness 0:c03cffe402df 534 R res = (*func)(arg1,arg2,arg3);
slowness 0:c03cffe402df 535 if(result != NULL) {
slowness 0:c03cffe402df 536 write_result<R>(res, result);
slowness 0:c03cffe402df 537 }
slowness 0:c03cffe402df 538 }
slowness 0:c03cffe402df 539
slowness 0:c03cffe402df 540
slowness 0:c03cffe402df 541 /* Function rpc_function caller
slowness 0:c03cffe402df 542 */
slowness 0:c03cffe402df 543 template<typename R, typename A1, typename A2, typename A3, typename A4, R (*func)(A1,A2,A3,A4)>
slowness 0:c03cffe402df 544 void rpc_function_caller(const char *arguments, char *result) {
slowness 0:c03cffe402df 545
slowness 0:c03cffe402df 546 const char *next = arguments;
slowness 0:c03cffe402df 547 A1 arg1 = parse_arg<A1>(next_arg(next),&next);
slowness 0:c03cffe402df 548 A2 arg2 = parse_arg<A2>(next_arg(next),&next);
slowness 0:c03cffe402df 549 A3 arg3 = parse_arg<A3>(next_arg(next),&next);
slowness 0:c03cffe402df 550 A4 arg4 = parse_arg<A4>(next_arg(next),NULL);
slowness 0:c03cffe402df 551
slowness 0:c03cffe402df 552 R res = (*func)(arg1,arg2,arg3,arg4);
slowness 0:c03cffe402df 553 if(result != NULL) {
slowness 0:c03cffe402df 554 write_result<R>(res, result);
slowness 0:c03cffe402df 555 }
slowness 0:c03cffe402df 556 }
slowness 0:c03cffe402df 557
slowness 0:c03cffe402df 558
slowness 0:c03cffe402df 559 struct rpc_method {
slowness 0:c03cffe402df 560 const char *name;
slowness 0:c03cffe402df 561 typedef void (*caller_t)(Base*, const char*, char*);
slowness 0:c03cffe402df 562 typedef const struct rpc_method *(*super_t)(Base*);
slowness 0:c03cffe402df 563 union {
slowness 0:c03cffe402df 564 caller_t caller;
slowness 0:c03cffe402df 565 super_t super;
slowness 0:c03cffe402df 566 };
slowness 0:c03cffe402df 567 };
slowness 0:c03cffe402df 568
slowness 0:c03cffe402df 569 template<class C>
slowness 0:c03cffe402df 570 const struct rpc_method *rpc_super(Base *this_ptr) {
slowness 0:c03cffe402df 571 return static_cast<C*>(this_ptr)->C::get_rpc_methods();
slowness 0:c03cffe402df 572 }
slowness 0:c03cffe402df 573
slowness 0:c03cffe402df 574 #define RPC_METHOD_END { NULL, NULL }
slowness 0:c03cffe402df 575 #define RPC_METHOD_SUPER(C) { NULL, (rpc_method::caller_t)(rpc_method::super_t)rpc_super<C> }
slowness 0:c03cffe402df 576
slowness 0:c03cffe402df 577 /* Function rpc
slowness 0:c03cffe402df 578 * Parse a string describing a call and then do it
slowness 0:c03cffe402df 579 *
slowness 0:c03cffe402df 580 * Variables
slowness 0:c03cffe402df 581 * call - A pointer to a string describing the call, which has
slowness 0:c03cffe402df 582 * the form /object/method arg ... argn. Arguments are
slowness 0:c03cffe402df 583 * delimited by space characters, and the string is terminated
slowness 0:c03cffe402df 584 * by a null character.
slowness 0:c03cffe402df 585 * result - A pointer to an array to write the result into.
slowness 0:c03cffe402df 586 */
slowness 0:c03cffe402df 587 bool rpc(const char *buf, char *result = 0);
slowness 0:c03cffe402df 588
slowness 0:c03cffe402df 589
slowness 0:c03cffe402df 590 } // namespace mbed
slowness 0:c03cffe402df 591
slowness 0:c03cffe402df 592 #endif