Fork of the official mbed C/C++ SDK provides the software platform and libraries to build your applications. The fork has the documentation converted to Doxygen format

Dependents:   NervousPuppySprintOne NervousPuppySprint2602 Robot WarehouseBot1 ... more

Fork of mbed by mbed official

Committer:
screamer
Date:
Wed Oct 24 10:44:49 2012 +0000
Revision:
43:aff670d0d510
Parent:
28:667d61c9177b
Conversion of the classes documentation to Doxygen format

Who changed what in which revision?

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