Programme d'utilisation servomotors MX12 V1

Committer:
R66Y
Date:
Fri May 19 14:32:14 2017 +0000
Revision:
0:80df663dd15e
programme pour utiliser les servomoteurs MX12.

Who changed what in which revision?

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