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:
emilmont
Date:
Tue Nov 29 14:59:27 2011 +0000
Revision:
27:7110ebee3484
Parent:
11:1c1ebd0324fa
Child:
28:667d61c9177b
New Libraries 11.11

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